Search in sources :

Example 11 with InsufficientAddressCapacityException

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

the class StorageNetworkGuru method reserve.

@Override
public void reserve(NicProfile nic, Network network, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) throws InsufficientVirtualNetworkCapacityException, InsufficientAddressCapacityException {
    if (!_sNwMgr.isStorageIpRangeAvailable(dest.getDataCenter().getId())) {
        super.reserve(nic, network, vm, dest, context);
        return;
    }
    Pod pod = dest.getPod();
    Integer vlan = null;
    StorageNetworkIpAddressVO ip = _sNwMgr.acquireIpAddress(pod.getId());
    if (ip == null) {
        throw new InsufficientAddressCapacityException("Unable to get a storage network ip address", Pod.class, pod.getId());
    }
    vlan = ip.getVlan();
    nic.setIPv4Address(ip.getIpAddress());
    nic.setMacAddress(NetUtils.long2Mac(NetUtils.createSequenceBasedMacAddress(ip.getMac(), NetworkModel.MACIdentifier.value())));
    nic.setFormat(AddressFormat.Ip4);
    nic.setIPv4Netmask(ip.getNetmask());
    nic.setBroadcastType(BroadcastDomainType.Storage);
    nic.setIPv4Gateway(ip.getGateway());
    if (vlan != null) {
        nic.setBroadcastUri(BroadcastDomainType.Storage.toUri(vlan));
    } else {
        nic.setBroadcastUri(null);
    }
    nic.setIsolationUri(null);
    s_logger.debug("Allocated a storage nic " + nic + " for " + vm);
}
Also used : Pod(com.cloud.dc.Pod) StorageNetworkIpAddressVO(com.cloud.dc.StorageNetworkIpAddressVO) InsufficientAddressCapacityException(com.cloud.exception.InsufficientAddressCapacityException)

Example 12 with InsufficientAddressCapacityException

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

the class KubernetesClusterStartWorker method setupKubernetesClusterNetworkRules.

/**
 * Setup network rules for Kubernetes cluster
 * Open up firewall port CLUSTER_API_PORT, secure port on which Kubernetes
 * API server is running. Also create load balancing rule to forward public
 * IP traffic to control VMs' private IP.
 * Open up  firewall ports NODES_DEFAULT_START_SSH_PORT to NODES_DEFAULT_START_SSH_PORT+n
 * for SSH access. Also create port-forwarding rule to forward public IP traffic to all
 * @param network
 * @param clusterVMs
 * @throws ManagementServerException
 */
private void setupKubernetesClusterNetworkRules(Network network, List<UserVm> clusterVMs) throws ManagementServerException {
    if (!Network.GuestType.Isolated.equals(network.getGuestType())) {
        if (LOGGER.isDebugEnabled()) {
            LOGGER.debug(String.format("Network : %s for Kubernetes cluster : %s is not an isolated network, therefore, no need for network rules", network.getName(), kubernetesCluster.getName()));
        }
        return;
    }
    List<Long> clusterVMIds = new ArrayList<>();
    for (UserVm vm : clusterVMs) {
        clusterVMIds.add(vm.getId());
    }
    IpAddress publicIp = getSourceNatIp(network);
    if (publicIp == null) {
        throw new ManagementServerException(String.format("No source NAT IP addresses found for network : %s, Kubernetes cluster : %s", network.getName(), kubernetesCluster.getName()));
    }
    createFirewallRules(publicIp, clusterVMIds);
    // Load balancer rule fo API access for control node VMs
    try {
        provisionLoadBalancerRule(publicIp, network, owner, clusterVMIds, CLUSTER_API_PORT);
    } catch (NetworkRuleConflictException | InsufficientAddressCapacityException e) {
        throw new ManagementServerException(String.format("Failed to provision load balancer rule for API access for the Kubernetes cluster : %s", kubernetesCluster.getName()), e);
    }
    // Port forwarding rule fo SSH access on each node VM
    try {
        provisionSshPortForwardingRules(publicIp, network, owner, clusterVMIds, CLUSTER_NODES_DEFAULT_START_SSH_PORT);
    } catch (ResourceUnavailableException | NetworkRuleConflictException e) {
        throw new ManagementServerException(String.format("Failed to activate SSH port forwarding rules for the Kubernetes cluster : %s", kubernetesCluster.getName()), e);
    }
}
Also used : UserVm(com.cloud.uservm.UserVm) ManagementServerException(com.cloud.exception.ManagementServerException) InsufficientAddressCapacityException(com.cloud.exception.InsufficientAddressCapacityException) ArrayList(java.util.ArrayList) ResourceUnavailableException(com.cloud.exception.ResourceUnavailableException) IpAddress(com.cloud.network.IpAddress) NetworkRuleConflictException(com.cloud.exception.NetworkRuleConflictException)

Example 13 with InsufficientAddressCapacityException

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

the class ConsoleProxyManagerImpl method finalizeStart.

@Override
public boolean finalizeStart(VirtualMachineProfile profile, long hostId, Commands cmds, ReservationContext context) {
    CheckSshAnswer answer = (CheckSshAnswer) cmds.getAnswer("checkSsh");
    if (answer == null || !answer.getResult()) {
        s_logger.warn(String.format("Unable to use SSH on the VM [%s] due to [%s].", profile.toString(), answer == null ? "null answer" : answer.getDetails()));
        return false;
    }
    try {
        rulesManager.getSystemIpAndEnableStaticNatForVm(profile.getVirtualMachine(), false);
        IPAddressVO ipaddr = ipAddressDao.findByAssociatedVmId(profile.getVirtualMachine().getId());
        if (ipaddr != null && ipaddr.getSystem()) {
            ConsoleProxyVO consoleVm = consoleProxyDao.findById(profile.getId());
            consoleVm.setPublicIpAddress(ipaddr.getAddress().addr());
            consoleProxyDao.update(consoleVm.getId(), consoleVm);
        }
    } catch (InsufficientAddressCapacityException ex) {
        s_logger.warn(String.format("Unable to retrieve system IP and enable static NAT for the VM [%s] due to [%s].", profile.toString(), ex.getMessage()), ex);
        return false;
    }
    return true;
}
Also used : CheckSshAnswer(com.cloud.agent.api.check.CheckSshAnswer) InsufficientAddressCapacityException(com.cloud.exception.InsufficientAddressCapacityException) IPAddressVO(com.cloud.network.dao.IPAddressVO) ConsoleProxyVO(com.cloud.vm.ConsoleProxyVO)

Example 14 with InsufficientAddressCapacityException

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

the class HypervGuru method implement.

@Override
public final VirtualMachineTO implement(VirtualMachineProfile vm) {
    VirtualMachineTO to = toVirtualMachineTO(vm);
    List<NicProfile> nicProfiles = vm.getNics();
    if (vm.getVirtualMachine().getType() == VirtualMachine.Type.DomainRouter) {
        NicProfile publicNicProfile = null;
        NicProfile controlNicProfile = null;
        NicProfile profile = null;
        for (NicProfile nicProfile : nicProfiles) {
            if (nicProfile.getTrafficType() == TrafficType.Public) {
                publicNicProfile = nicProfile;
                break;
            } else if (nicProfile.getTrafficType() == TrafficType.Control) {
                controlNicProfile = nicProfile;
            }
        }
        if (publicNicProfile != null || controlNicProfile != null) {
            NicTO[] nics = to.getNics();
            // reserve extra NICs
            NicTO[] expandedNics = new NicTO[MaxNicSupported];
            int i = 0;
            int deviceId = -1;
            for (i = 0; i < nics.length; i++) {
                expandedNics[i] = nics[i];
                if (nics[i].getDeviceId() > deviceId)
                    deviceId = nics[i].getDeviceId();
            }
            deviceId++;
            long networkId = 0;
            if (publicNicProfile != null) {
                networkId = publicNicProfile.getNetworkId();
                profile = publicNicProfile;
            } else {
                networkId = controlNicProfile.getNetworkId();
                profile = controlNicProfile;
            }
            NetworkVO network = _networkDao.findById(networkId);
            // creating the VR with extra nics (actual nics(3) + extra nics) will be 8
            for (; i < MaxNicSupported; i++) {
                NicTO nicTo = new NicTO();
                nicTo.setDeviceId(deviceId++);
                nicTo.setBroadcastType(BroadcastDomainType.Vlan);
                nicTo.setType(TrafficType.Public);
                nicTo.setIp("0.0.0.0");
                nicTo.setNetmask("255.255.255.255");
                nicTo.setName(profile.getName());
                try {
                    String mac = _networkMgr.getNextAvailableMacAddressInNetwork(networkId);
                    nicTo.setMac(mac);
                } catch (InsufficientAddressCapacityException e) {
                    throw new CloudRuntimeException("unable to allocate mac address on network: " + networkId);
                }
                nicTo.setDns1(profile.getIPv4Dns1());
                nicTo.setDns2(profile.getIPv4Dns2());
                if (publicNicProfile != null && publicNicProfile.getIPv4Gateway() != null) {
                    nicTo.setGateway(publicNicProfile.getIPv4Gateway());
                } else {
                    nicTo.setGateway(network.getGateway());
                }
                nicTo.setDefaultNic(false);
                nicTo.setBroadcastUri(profile.getBroadCastUri());
                nicTo.setIsolationuri(profile.getIsolationUri());
                Integer networkRate = _networkMgr.getNetworkRate(network.getId(), null);
                nicTo.setNetworkRateMbps(networkRate);
                expandedNics[i] = nicTo;
            }
            to.setNics(expandedNics);
        }
        StringBuffer sbMacSequence = new StringBuffer();
        for (NicTO nicTo : sortNicsByDeviceId(to.getNics())) {
            sbMacSequence.append(nicTo.getMac()).append("|");
        }
        if (!sbMacSequence.toString().isEmpty()) {
            sbMacSequence.deleteCharAt(sbMacSequence.length() - 1);
            String bootArgs = to.getBootArgs();
            to.setBootArgs(bootArgs + " nic_macs=" + sbMacSequence.toString());
        }
    }
    // Determine the VM's OS description
    GuestOSVO guestOS = _guestOsDao.findById(vm.getVirtualMachine().getGuestOSId());
    to.setOs(guestOS.getDisplayName());
    return to;
}
Also used : NetworkVO(com.cloud.network.dao.NetworkVO) InsufficientAddressCapacityException(com.cloud.exception.InsufficientAddressCapacityException) GuestOSVO(com.cloud.storage.GuestOSVO) NicProfile(com.cloud.vm.NicProfile) VirtualMachineTO(com.cloud.agent.api.to.VirtualMachineTO) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) NicTO(com.cloud.agent.api.to.NicTO)

Example 15 with InsufficientAddressCapacityException

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

the class IpAddressManagerImpl method allocatePortableIp.

@Override
@DB
public IpAddress allocatePortableIp(final Account ipOwner, Account caller, final long dcId, final Long networkId, final Long vpcID) throws ConcurrentOperationException, ResourceAllocationException, InsufficientAddressCapacityException {
    GlobalLock portableIpLock = GlobalLock.getInternLock("PortablePublicIpRange");
    IPAddressVO ipaddr;
    try {
        portableIpLock.lock(5);
        ipaddr = Transaction.execute(new TransactionCallbackWithException<IPAddressVO, InsufficientAddressCapacityException>() {

            @Override
            public IPAddressVO doInTransaction(TransactionStatus status) throws InsufficientAddressCapacityException {
                PortableIpVO allocatedPortableIp;
                List<PortableIpVO> portableIpVOs = _portableIpDao.listByRegionIdAndState(1, PortableIp.State.Free);
                if (portableIpVOs == null || portableIpVOs.isEmpty()) {
                    InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Unable to find available portable IP addresses", Region.class, new Long(1));
                    throw ex;
                }
                // allocate first portable IP to the user
                allocatedPortableIp = portableIpVOs.get(0);
                allocatedPortableIp.setAllocatedTime(new Date());
                allocatedPortableIp.setAllocatedToAccountId(ipOwner.getAccountId());
                allocatedPortableIp.setAllocatedInDomainId(ipOwner.getDomainId());
                allocatedPortableIp.setState(PortableIp.State.Allocated);
                _portableIpDao.update(allocatedPortableIp.getId(), allocatedPortableIp);
                // To make portable IP available as a zone level resource we need to emulate portable IP's (which are
                // provisioned at region level) as public IP provisioned in a zone. user_ip_address and vlan combo give the
                // identity of a public IP in zone. Create entry for portable ip in these tables.
                // provision portable IP range VLAN into the zone
                long physicalNetworkId = _networkModel.getDefaultPhysicalNetworkByZoneAndTrafficType(dcId, TrafficType.Public).getId();
                Network network = _networkModel.getSystemNetworkByZoneAndTrafficType(dcId, TrafficType.Public);
                String range = allocatedPortableIp.getAddress() + "-" + allocatedPortableIp.getAddress();
                VlanVO vlan = new VlanVO(VlanType.VirtualNetwork, allocatedPortableIp.getVlan(), allocatedPortableIp.getGateway(), allocatedPortableIp.getNetmask(), dcId, range, network.getId(), physicalNetworkId, null, null, null);
                vlan = _vlanDao.persist(vlan);
                // provision the portable IP in to user_ip_address table
                IPAddressVO ipaddr = new IPAddressVO(new Ip(allocatedPortableIp.getAddress()), dcId, networkId, vpcID, physicalNetworkId, network.getId(), vlan.getId(), true);
                ipaddr.setState(State.Allocated);
                ipaddr.setAllocatedTime(new Date());
                ipaddr.setAllocatedInDomainId(ipOwner.getDomainId());
                ipaddr.setAllocatedToAccountId(ipOwner.getId());
                ipaddr = _ipAddressDao.persist(ipaddr);
                final boolean usageHidden = isUsageHidden(ipaddr);
                UsageEventUtils.publishUsageEvent(EventTypes.EVENT_PORTABLE_IP_ASSIGN, ipaddr.getId(), ipaddr.getDataCenterId(), ipaddr.getId(), ipaddr.getAddress().toString(), ipaddr.isSourceNat(), null, ipaddr.getSystem(), usageHidden, ipaddr.getClass().getName(), ipaddr.getUuid());
                return ipaddr;
            }
        });
    } finally {
        portableIpLock.unlock();
    }
    return ipaddr;
}
Also used : TransactionCallbackWithException(com.cloud.utils.db.TransactionCallbackWithException) InsufficientAddressCapacityException(com.cloud.exception.InsufficientAddressCapacityException) PortableIp(org.apache.cloudstack.region.PortableIp) Ip(com.cloud.utils.net.Ip) PublicIp(com.cloud.network.addr.PublicIp) TransactionStatus(com.cloud.utils.db.TransactionStatus) PortableIpVO(org.apache.cloudstack.region.PortableIpVO) Date(java.util.Date) GlobalLock(com.cloud.utils.db.GlobalLock) IPAddressVO(com.cloud.network.dao.IPAddressVO) VlanVO(com.cloud.dc.VlanVO) DB(com.cloud.utils.db.DB)

Aggregations

InsufficientAddressCapacityException (com.cloud.exception.InsufficientAddressCapacityException)60 CloudRuntimeException (com.cloud.utils.exception.CloudRuntimeException)22 IPAddressVO (com.cloud.network.dao.IPAddressVO)16 TransactionStatus (com.cloud.utils.db.TransactionStatus)15 Account (com.cloud.user.Account)14 DataCenter (com.cloud.dc.DataCenter)13 ConcurrentOperationException (com.cloud.exception.ConcurrentOperationException)12 InvalidParameterValueException (com.cloud.exception.InvalidParameterValueException)12 NicProfile (com.cloud.vm.NicProfile)12 InsufficientVirtualNetworkCapacityException (com.cloud.exception.InsufficientVirtualNetworkCapacityException)11 DB (com.cloud.utils.db.DB)11 VlanVO (com.cloud.dc.VlanVO)9 TransactionCallbackWithException (com.cloud.utils.db.TransactionCallbackWithException)9 PermissionDeniedException (com.cloud.exception.PermissionDeniedException)8 PublicIp (com.cloud.network.addr.PublicIp)8 InvalidParameterValueException (com.cloud.utils.exception.InvalidParameterValueException)8 NicVO (com.cloud.vm.NicVO)8 ArrayList (java.util.ArrayList)8 InsufficientCapacityException (com.cloud.exception.InsufficientCapacityException)7 NetworkRuleConflictException (com.cloud.exception.NetworkRuleConflictException)7