Search in sources :

Example 16 with InsufficientVirtualNetworkCapacityException

use of com.cloud.exception.InsufficientVirtualNetworkCapacityException in project cloudstack by apache.

the class NuageVspGuestNetworkGuru method reserve.

@Override
public void reserve(NicProfile nic, Network network, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) throws InsufficientVirtualNetworkCapacityException, InsufficientAddressCapacityException {
    boolean lockedNetwork = lockNetworkForUserVm(network, vm);
    if (lockedNetwork && s_logger.isDebugEnabled()) {
        s_logger.debug("Locked network " + network.getId() + " for creation of user VM " + vm.getInstanceName());
    }
    try {
        //We don't support a shared network with UserData and multiple IP ranges at the same time.
        checkMultipleSubnetsCombinedWithUseData(network);
        if (s_logger.isDebugEnabled()) {
            s_logger.debug("Handling reserve() call back to with Create a new VM or add an interface to existing VM in network " + network.getName());
        }
        DataCenter dc = _dcDao.findById(network.getDataCenterId());
        AccountVO neworkAccountDetails = _accountDao.findById(network.getAccountId());
        if (neworkAccountDetails.getType() == Account.ACCOUNT_TYPE_PROJECT) {
            throw new InsufficientVirtualNetworkCapacityException("CS project support is not yet implemented in NuageVsp", DataCenter.class, dc.getId());
        }
        if (Strings.isNullOrEmpty(network.getBroadcastUri().getPath()) || !network.getBroadcastUri().getPath().startsWith("/")) {
            throw new IllegalStateException("The broadcast URI path " + network.getBroadcastUri() + " is empty or in an incorrect format.");
        }
        HostVO nuageVspHost = _nuageVspManager.getNuageVspHost(network.getPhysicalNetworkId());
        VspNetwork vspNetwork = _nuageVspEntityBuilder.buildVspNetwork(vm.getVirtualMachine().getDomainId(), network);
        if (vspNetwork.isShared()) {
            vspNetwork = _nuageVspEntityBuilder.updateVspNetworkByPublicIp(vspNetwork, network, nic.getIPv4Address());
            if (VirtualMachine.Type.DomainRouter.equals(vm.getType()) && !nic.getIPv4Address().equals(vspNetwork.getVirtualRouterIp())) {
                if (s_logger.isDebugEnabled()) {
                    s_logger.debug("VR got spawned with a different IP, releasing the previously allocated public IP " + nic.getIPv4Address());
                }
                IPAddressVO oldIpAddress = _ipAddressDao.findByIpAndSourceNetworkId(network.getId(), nic.getIPv4Address());
                _ipAddressDao.unassignIpAddress(oldIpAddress.getId());
                _ipAddressDao.mark(network.getDataCenterId(), new Ip(vspNetwork.getVirtualRouterIp()));
            } else if (VirtualMachine.Type.User.equals(vm.getType()) && nic.getIPv4Address().equals(vspNetwork.getVirtualRouterIp())) {
                s_logger.error("Deploying a user VM with the same IP as the VR is not allowed.");
                throw new InsufficientVirtualNetworkCapacityException("Deploying a user VM with the same IP " + nic.getIPv4Address() + " as the VR is not allowed.", Network.class, network.getId());
            }
            // Make sure the shared network is present
            NetworkOffering offering = _ntwkOfferingDao.findById(network.getNetworkOfferingId());
            if (!implement(network.getPhysicalNetworkId(), vspNetwork, _nuageVspEntityBuilder.buildNetworkDhcpOption(network, offering))) {
                s_logger.error("Failed to implement shared network " + network.getUuid() + " under domain " + context.getDomain().getUuid());
                throw new InsufficientVirtualNetworkCapacityException("Failed to implement shared network " + network.getUuid() + " under domain " + context.getDomain().getUuid(), Network.class, network.getId());
            }
        }
        // Set flags for dhcp options
        boolean networkHasDns = networkHasDns(network);
        Map<Long, Boolean> networkHasDnsCache = Maps.newHashMap();
        networkHasDnsCache.put(network.getId(), networkHasDns);
        // Determine if dhcp options of the other nics in the network need to be updated
        if (vm.getType() == VirtualMachine.Type.DomainRouter && network.getState() != State.Implementing) {
            updateDhcpOptionsForExistingVms(network, nuageVspHost, vspNetwork, networkHasDns, networkHasDnsCache);
        }
        nic.setBroadcastUri(network.getBroadcastUri());
        nic.setIsolationUri(network.getBroadcastUri());
        //NicProfile does not contain the NIC UUID. We need this information to set it in the VMInterface and VPort
        //that we create in VSP
        NicVO nicFromDb = _nicDao.findById(nic.getId());
        IPAddressVO staticNatIp = _ipAddressDao.findByVmIdAndNetworkId(network.getId(), vm.getId());
        VspVm vspVm = _nuageVspEntityBuilder.buildVspVm(vm.getVirtualMachine(), network);
        VspNic vspNic = _nuageVspEntityBuilder.buildVspNic(nicFromDb.getUuid(), nic);
        VspStaticNat vspStaticNat = null;
        if (staticNatIp != null) {
            VlanVO staticNatVlan = _vlanDao.findById(staticNatIp.getVlanId());
            vspStaticNat = _nuageVspEntityBuilder.buildVspStaticNat(null, staticNatIp, staticNatVlan, null);
        }
        boolean defaultHasDns = getDefaultHasDns(networkHasDnsCache, nicFromDb);
        VspDhcpVMOption dhcpOption = _nuageVspEntityBuilder.buildVmDhcpOption(nicFromDb, defaultHasDns, networkHasDns);
        ReserveVmInterfaceVspCommand cmd = new ReserveVmInterfaceVspCommand(vspNetwork, vspVm, vspNic, vspStaticNat, dhcpOption);
        Answer answer = _agentMgr.easySend(nuageVspHost.getId(), cmd);
        if (answer == null || !answer.getResult()) {
            s_logger.error("ReserveVmInterfaceNuageVspCommand failed for NIC " + nic.getId() + " attached to VM " + vm.getId() + " in network " + network.getId());
            if ((null != answer) && (null != answer.getDetails())) {
                s_logger.error(answer.getDetails());
            }
            throw new InsufficientVirtualNetworkCapacityException("Failed to reserve VM in Nuage VSP.", Network.class, network.getId());
        }
        if (vspVm.getDomainRouter() == Boolean.TRUE) {
            nic.setIPv4Address(vspVm.getDomainRouterIp());
        }
    } finally {
        if (network != null && lockedNetwork) {
            _networkDao.releaseFromLockTable(network.getId());
            if (s_logger.isDebugEnabled()) {
                s_logger.debug("Unlocked network " + network.getId() + " for creation of user VM " + vm.getInstanceName());
            }
        }
    }
}
Also used : NetworkOffering(com.cloud.offering.NetworkOffering) Ip(com.cloud.utils.net.Ip) VspStaticNat(net.nuage.vsp.acs.client.api.model.VspStaticNat) ReserveVmInterfaceVspCommand(com.cloud.agent.api.guru.ReserveVmInterfaceVspCommand) AccountVO(com.cloud.user.AccountVO) HostVO(com.cloud.host.HostVO) Answer(com.cloud.agent.api.Answer) DataCenter(com.cloud.dc.DataCenter) InsufficientVirtualNetworkCapacityException(com.cloud.exception.InsufficientVirtualNetworkCapacityException) Network(com.cloud.network.Network) VspNetwork(net.nuage.vsp.acs.client.api.model.VspNetwork) PhysicalNetwork(com.cloud.network.PhysicalNetwork) IPAddressVO(com.cloud.network.dao.IPAddressVO) VspVm(net.nuage.vsp.acs.client.api.model.VspVm) VspNetwork(net.nuage.vsp.acs.client.api.model.VspNetwork) VspNic(net.nuage.vsp.acs.client.api.model.VspNic) VlanVO(com.cloud.dc.VlanVO) NicVO(com.cloud.vm.NicVO) VspDhcpVMOption(net.nuage.vsp.acs.client.api.model.VspDhcpVMOption)

Example 17 with InsufficientVirtualNetworkCapacityException

use of com.cloud.exception.InsufficientVirtualNetworkCapacityException in project cloudstack by apache.

the class NuageVspGuestNetworkGuru method implement.

@Override
public Network implement(Network network, NetworkOffering offering, DeployDestination dest, ReservationContext context) throws InsufficientVirtualNetworkCapacityException {
    long networkId = network.getId();
    network = _networkDao.acquireInLockTable(network.getId(), 1200);
    if (network == null) {
        throw new ConcurrentOperationException("Unable to acquire lock on network " + networkId);
    }
    NetworkVO implemented = null;
    try {
        if (offering.getGuestType() == GuestType.Isolated && network.getState() != State.Implementing) {
            throw new IllegalStateException("Network " + networkId + " is not in expected state Implementing, but is in state " + network.getState());
        }
        //Get the Account details and find the type
        AccountVO networksAccount = _accountDao.findById(network.getAccountId());
        if (networksAccount.getType() == Account.ACCOUNT_TYPE_PROJECT) {
            String errorMessage = "Networks created by account " + networksAccount.getAccountName() + " of type Project (" + Account.ACCOUNT_TYPE_PROJECT + ") " + "are not yet supported by NuageVsp provider";
            s_logger.error(errorMessage);
            throw new InsufficientVirtualNetworkCapacityException(errorMessage, Account.class, network.getAccountId());
        }
        //We don't support a shared network with UserData and multiple IP ranges at the same time.
        checkMultipleSubnetsCombinedWithUseData(network);
        long dcId = dest.getDataCenter().getId();
        //Get physical network id
        Long physicalNetworkId = network.getPhysicalNetworkId();
        //Physical network id can be null in Guest Network in Basic zone, so locate the physical network
        if (physicalNetworkId == null) {
            physicalNetworkId = _networkModel.findPhysicalNetworkId(dcId, offering.getTags(), offering.getTrafficType());
        }
        implemented = new NetworkVO(network.getId(), network, network.getNetworkOfferingId(), network.getGuruName(), network.getDomainId(), network.getAccountId(), network.getRelated(), network.getName(), network.getDisplayText(), network.getNetworkDomain(), network.getGuestType(), network.getDataCenterId(), physicalNetworkId, network.getAclType(), network.getSpecifyIpRanges(), network.getVpcId(), offering.getRedundantRouter());
        implemented.setUuid(network.getUuid());
        implemented.setState(State.Allocated);
        if (network.getGateway() != null) {
            implemented.setGateway(network.getGateway());
        }
        if (network.getCidr() != null) {
            implemented.setCidr(network.getCidr());
        }
        VspNetwork vspNetwork = _nuageVspEntityBuilder.buildVspNetwork(implemented);
        String tenantId = context.getDomain().getName() + "-" + context.getAccount().getAccountId();
        String broadcastUriStr = implemented.getUuid() + "/" + vspNetwork.getVirtualRouterIp();
        implemented.setBroadcastUri(Networks.BroadcastDomainType.Vsp.toUri(broadcastUriStr));
        implemented.setBroadcastDomainType(Networks.BroadcastDomainType.Vsp);
        if (!implement(physicalNetworkId, vspNetwork, _nuageVspEntityBuilder.buildNetworkDhcpOption(network, offering))) {
            return null;
        }
        if (StringUtils.isNotBlank(vspNetwork.getDomainTemplateName())) {
            if (network.getVpcId() != null) {
                VpcDetailVO vpcDetail = new VpcDetailVO(network.getVpcId(), NuageVspManager.nuageDomainTemplateDetailName, vspNetwork.getDomainTemplateName(), false);
                _vpcDetailsDao.persist(vpcDetail);
            } else {
                NetworkDetailVO networkDetail = new NetworkDetailVO(implemented.getId(), NuageVspManager.nuageDomainTemplateDetailName, vspNetwork.getDomainTemplateName(), false);
                _networkDetailsDao.persist(networkDetail);
            }
        }
        s_logger.info("Implemented OK, network " + implemented.getUuid() + " in tenant " + tenantId + " linked to " + implemented.getBroadcastUri());
    } finally {
        _networkDao.releaseFromLockTable(network.getId());
    }
    return implemented;
}
Also used : PhysicalNetworkVO(com.cloud.network.dao.PhysicalNetworkVO) NetworkVO(com.cloud.network.dao.NetworkVO) InsufficientVirtualNetworkCapacityException(com.cloud.exception.InsufficientVirtualNetworkCapacityException) VspNetwork(net.nuage.vsp.acs.client.api.model.VspNetwork) ConcurrentOperationException(com.cloud.exception.ConcurrentOperationException) AccountVO(com.cloud.user.AccountVO) NetworkDetailVO(com.cloud.network.dao.NetworkDetailVO) VpcDetailVO(org.apache.cloudstack.resourcedetail.VpcDetailVO)

Aggregations

InsufficientVirtualNetworkCapacityException (com.cloud.exception.InsufficientVirtualNetworkCapacityException)17 InsufficientAddressCapacityException (com.cloud.exception.InsufficientAddressCapacityException)7 VspNetwork (net.nuage.vsp.acs.client.api.model.VspNetwork)6 DataCenter (com.cloud.dc.DataCenter)5 ConcurrentOperationException (com.cloud.exception.ConcurrentOperationException)5 CloudRuntimeException (com.cloud.utils.exception.CloudRuntimeException)5 HostVO (com.cloud.host.HostVO)4 VlanVO (com.cloud.dc.VlanVO)3 NetworkVO (com.cloud.network.dao.NetworkVO)3 PhysicalNetworkVO (com.cloud.network.dao.PhysicalNetworkVO)3 AccountVO (com.cloud.user.AccountVO)3 NicVO (com.cloud.vm.NicVO)3 IOException (java.io.IOException)3 Answer (com.cloud.agent.api.Answer)2 Network (com.cloud.network.Network)2 IPAddressVO (com.cloud.network.dao.IPAddressVO)2 Vpc (com.cloud.network.vpc.Vpc)2 NicProfile (com.cloud.vm.NicProfile)2 VMInstanceVO (com.cloud.vm.VMInstanceVO)2 URI (java.net.URI)2