Search in sources :

Example 1 with Bridge

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);
}
Also used : BridgePort(org.midonet.client.resource.BridgePort) RouterPort(org.midonet.client.resource.RouterPort) BridgePort(org.midonet.client.resource.BridgePort) Port(org.midonet.client.resource.Port) Router(org.midonet.client.resource.Router) AccountDao(com.cloud.user.dao.AccountDao) AccountVO(com.cloud.user.AccountVO) ConcurrentOperationException(com.cloud.exception.ConcurrentOperationException) MidonetApi(org.midonet.client.MidonetApi) Network(com.cloud.network.Network) ResourceUnavailableException(com.cloud.exception.ResourceUnavailableException) UUID(java.util.UUID) InsufficientCapacityException(com.cloud.exception.InsufficientCapacityException) RouterPort(org.midonet.client.resource.RouterPort) Bridge(org.midonet.client.resource.Bridge) ResourceCollection(org.midonet.client.resource.ResourceCollection)

Example 2 with Bridge

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;
}
Also used : Bridge(org.midonet.client.resource.Bridge) HttpInternalServerError(org.midonet.client.exception.HttpInternalServerError)

Example 3 with Bridge

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;
}
Also used : DhcpSubnet(org.midonet.client.resource.DhcpSubnet) ArrayList(java.util.ArrayList) DhcpHost(org.midonet.client.resource.DhcpHost) Bridge(org.midonet.client.resource.Bridge) ResourceCollection(org.midonet.client.resource.ResourceCollection)

Example 4 with Bridge

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();
    }
}
Also used : DhcpSubnet(org.midonet.client.resource.DhcpSubnet) Bridge(org.midonet.client.resource.Bridge)

Example 5 with Bridge

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;
}
Also used : BridgePort(org.midonet.client.resource.BridgePort) Router(org.midonet.client.resource.Router) MultivaluedMapImpl(com.sun.jersey.core.util.MultivaluedMapImpl) UUID(java.util.UUID) Bridge(org.midonet.client.resource.Bridge) Route(org.midonet.client.resource.Route)

Aggregations

Bridge (org.midonet.client.resource.Bridge)10 Router (org.midonet.client.resource.Router)5 MultivaluedMapImpl (com.sun.jersey.core.util.MultivaluedMapImpl)4 UUID (java.util.UUID)4 BridgePort (org.midonet.client.resource.BridgePort)4 MidonetApi (org.midonet.client.MidonetApi)3 DhcpSubnet (org.midonet.client.resource.DhcpSubnet)3 ResourceCollection (org.midonet.client.resource.ResourceCollection)3 ConcurrentOperationException (com.cloud.exception.ConcurrentOperationException)2 InsufficientCapacityException (com.cloud.exception.InsufficientCapacityException)2 ResourceUnavailableException (com.cloud.exception.ResourceUnavailableException)2 Network (com.cloud.network.Network)2 AccountVO (com.cloud.user.AccountVO)2 AccountDao (com.cloud.user.dao.AccountDao)2 MultivaluedMap (javax.ws.rs.core.MultivaluedMap)2 DhcpHost (org.midonet.client.resource.DhcpHost)2 Port (org.midonet.client.resource.Port)2 Route (org.midonet.client.resource.Route)2 RouterPort (org.midonet.client.resource.RouterPort)2 InternalErrorException (com.cloud.exception.InternalErrorException)1