use of org.midonet.client.resource.Bridge in project cloudstack by apache.
the class MidoNetElementTest method testImplement.
/*
* Test the standard case of implement with no errors.
*/
public void testImplement() {
//mock
MidonetApi api = mock(MidonetApi.class, RETURNS_DEEP_STUBS);
//mockAccountDao
AccountDao mockAccountDao = mock(AccountDao.class);
AccountVO mockAccountVO = mock(AccountVO.class);
when(mockAccountDao.findById(anyLong())).thenReturn(mockAccountVO);
when(mockAccountVO.getUuid()).thenReturn("1");
MidoNetElement elem = new MidoNetElement();
elem.setMidonetApi(api);
elem.setAccountDao(mockAccountDao);
//mockRPort
RouterPort mockRPort = mock(RouterPort.class);
when(mockRPort.getId()).thenReturn(UUID.fromString("550e8400-e29b-41d4-a716-446655440000"));
//mockBPort
BridgePort mockBPort = mock(BridgePort.class);
when(mockBPort.link(any(UUID.class))).thenReturn(mockBPort);
//mockPort
Port mockPort = mock(Port.class);
ResourceCollection<Port> peerPorts = new ResourceCollection<Port>(new ArrayList<Port>());
peerPorts.add(mockPort);
//mockBridge
Bridge mockBridge = mock(Bridge.class, RETURNS_DEEP_STUBS);
when(api.addBridge().tenantId(anyString()).name(anyString()).create()).thenReturn(mockBridge);
when(mockBridge.addInteriorPort().create()).thenReturn(mockBPort);
when(mockBridge.getPeerPorts()).thenReturn(peerPorts);
//mockRouter
Router mockRouter = mock(Router.class, RETURNS_DEEP_STUBS);
when(api.addRouter().tenantId(anyString()).name(anyString()).create()).thenReturn(mockRouter);
when(mockRouter.addInteriorRouterPort().create()).thenReturn(mockRPort);
//mockNetwork
Network mockNetwork = mock(Network.class);
when(mockNetwork.getAccountId()).thenReturn((long) 1);
when(mockNetwork.getGateway()).thenReturn("1.2.3.4");
when(mockNetwork.getCidr()).thenReturn("1.2.3.0/24");
when(mockNetwork.getId()).thenReturn((long) 2);
when(mockNetwork.getBroadcastDomainType()).thenReturn(Networks.BroadcastDomainType.Mido);
when(mockNetwork.getTrafficType()).thenReturn(Networks.TrafficType.Public);
boolean result = false;
try {
result = elem.implement(mockNetwork, null, null, null);
} catch (ConcurrentOperationException e) {
fail(e.getMessage());
} catch (InsufficientCapacityException e) {
fail(e.getMessage());
} catch (ResourceUnavailableException e) {
fail(e.getMessage());
}
assertEquals(result, true);
}
use of org.midonet.client.resource.Bridge in project cloudstack by apache.
the class MidoNetElement method getOrCreateNetworkBridge.
private Bridge getOrCreateNetworkBridge(long networkID, String accountUuid) {
Bridge netBridge = getNetworkBridge(networkID, accountUuid);
if (netBridge == null) {
String networkUUIDStr = String.valueOf(networkID);
s_logger.debug("Attempting to create guest network bridge");
try {
netBridge = api.addBridge().tenantId(accountUuid).name(networkUUIDStr).create();
} catch (HttpInternalServerError ex) {
s_logger.warn("Bridge creation failed, retrying bridge get in case it now exists.", ex);
netBridge = getNetworkBridge(networkID, accountUuid);
}
}
return netBridge;
}
use of org.midonet.client.resource.Bridge in project cloudstack by apache.
the class MidoNetElement method addDhcpEntry.
/**
* From interface DHCPServiceProvider
*/
@Override
public boolean addDhcpEntry(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException {
s_logger.debug("addDhcpEntry called with network: " + network.toString() + " nic: " + nic.toString() + " vm: " + vm.toString());
if (!this.midoInNetwork(network)) {
return false;
}
if (vm.getType() != VirtualMachine.Type.User) {
return false;
}
// Get MidoNet bridge
Bridge netBridge = getOrCreateNetworkBridge(network);
// On bridge, get DHCP subnet (ensure it exists)
ResourceCollection res = netBridge.getDhcpSubnets();
DhcpSubnet sub = null;
if (!res.isEmpty()) {
sub = (DhcpSubnet) res.get(0);
} else {
Pair<String, Integer> cidrInfo = NetUtils.getCidr(network.getCidr());
sub = netBridge.addDhcpSubnet();
sub.subnetLength(cidrInfo.second());
sub.subnetPrefix(cidrInfo.first());
sub.defaultGateway(network.getGateway());
List<String> dcs = new ArrayList<String>();
dcs.add(dest.getDataCenter().getDns1());
sub.dnsServerAddrs(dcs);
sub.create();
}
// On DHCP subnet, add host using host details
if (sub == null) {
s_logger.error("Failed to create DHCP subnet on Midonet bridge");
return false;
} else {
// Check if the host already exists - we may just be restarting an existing VM
boolean isNewDhcpHost = true;
for (DhcpHost dhcpHost : sub.getDhcpHosts()) {
if (dhcpHost.getIpAddr().equals(nic.getIPv4Address())) {
isNewDhcpHost = false;
break;
}
}
if (isNewDhcpHost) {
DhcpHost host = sub.addDhcpHost();
host.ipAddr(nic.getIPv4Address());
host.macAddr(nic.getMacAddress());
// This only sets the cloudstack internal name
host.name(vm.getHostName());
host.create();
}
}
return true;
}
use of org.midonet.client.resource.Bridge in project cloudstack by apache.
the class MidoNetElement method deleteNetworkBridges.
private void deleteNetworkBridges(Network network) {
String accountUuid = getAccountUuid(network);
long networkID = network.getId();
Bridge netBridge = getNetworkBridge(networkID, accountUuid);
if (netBridge != null) {
cleanBridge(netBridge);
// Delete DHCP subnets
for (Object dhcpSubnet : netBridge.getDhcpSubnets()) {
DhcpSubnet sub = (DhcpSubnet) dhcpSubnet;
sub.delete();
}
netBridge.delete();
}
}
use of org.midonet.client.resource.Bridge in project cloudstack by apache.
the class MidoNetElement method release.
@Override
public boolean release(Network network, NicProfile nic, VirtualMachineProfile vm, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException {
s_logger.debug("release called with network: " + network.toString() + " nic: " + nic.toString() + " vm: " + vm.toString());
if (!midoInNetwork(network)) {
return false;
}
UUID nicUUID = getNicUUID(nic);
if (nic.getTrafficType() == Networks.TrafficType.Guest || (nic.getTrafficType() == Networks.TrafficType.Public && nic.getBroadcastType() == Networks.BroadcastDomainType.Mido)) {
// Seems like a good place to remove the port in midonet
Bridge netBridge = getOrCreateNetworkBridge(network);
Router providerRouter = api.getRouter(_providerRouterId);
//remove the routes associated with this IP address
for (Route route : providerRouter.getRoutes(new MultivaluedMapImpl())) {
String routeDstAddr = route.getDstNetworkAddr();
if (routeDstAddr != null && routeDstAddr.equals(nic.getIPv4Address())) {
route.delete();
}
}
for (BridgePort p : netBridge.getPorts()) {
UUID vifID = p.getVifId();
if (vifID != null && vifID.equals(nicUUID)) {
// This is the MidoNet port which corresponds to the NIC we are releasing
// Set VIF ID to null
p.vifId(null).update();
// Delete port
p.delete();
}
}
}
return true;
}
Aggregations