Search in sources :

Example 96 with Network

use of com.cloud.legacymodel.network.Network in project cosmic by MissionCriticalCloud.

the class NetworkOrchestrator method createGuestNetwork.

@Override
@DB
public Network createGuestNetwork(final long networkOfferingId, final String name, final String displayText, final String gateway, final String cidr, String vlanId, String networkDomain, final Account owner, final Long domainId, final PhysicalNetwork pNtwk, final long zoneId, final ACLType aclType, Boolean subdomainAccess, final Long vpcId, final String ip6Gateway, final String ip6Cidr, final Boolean isDisplayNetworkEnabled, final String isolatedPvlan, final String dns1, final String dns2, final String ipExclusionList, final String dhcpTftpServer, final String dhcpBootfileName) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException {
    final NetworkOfferingVO ntwkOff = _networkOfferingDao.findById(networkOfferingId);
    // this method supports only guest network creation
    if (ntwkOff.getTrafficType() != TrafficType.Guest) {
        s_logger.warn("Only guest networks can be created using this method");
        return null;
    }
    final boolean updateResourceCount = resourceCountNeedsUpdate(ntwkOff, aclType);
    // check resource limits
    if (updateResourceCount) {
        _resourceLimitMgr.checkResourceLimit(owner, ResourceType.network, isDisplayNetworkEnabled);
    }
    // Validate network offering
    if (ntwkOff.getState() != NetworkOffering.State.Enabled) {
        // see NetworkOfferingVO
        final InvalidParameterValueException ex = new InvalidParameterValueException("Can't use specified network offering id as its stat is not " + NetworkOffering.State.Enabled);
        ex.addProxyObject(ntwkOff.getUuid(), "networkOfferingId");
        throw ex;
    }
    // Validate physical network
    if (pNtwk.getState() != PhysicalNetwork.State.Enabled) {
        // see PhysicalNetworkVO.java
        final InvalidParameterValueException ex = new InvalidParameterValueException("Specified physical network id is" + " in incorrect state:" + pNtwk.getState());
        ex.addProxyObject(pNtwk.getUuid(), "physicalNetworkId");
        throw ex;
    }
    boolean ipv6 = false;
    if (ip6Gateway != null && ip6Cidr != null) {
        ipv6 = true;
    }
    // Validate zone
    final Zone zone = _zoneRepository.findById(zoneId).orElse(null);
    if (zone.getNetworkType() == com.cloud.model.enumeration.NetworkType.Basic) {
        if (ipv6) {
            throw new InvalidParameterValueException("IPv6 is not supported in Basic zone");
        }
        // In Basic zone the network should have aclType=Domain, domainId=1, subdomainAccess=true
        if (aclType == null || aclType != ACLType.Domain) {
            throw new InvalidParameterValueException("Only AclType=Domain can be specified for network creation in Basic zone");
        }
        // Only one guest network is supported in Basic zone
        final List<NetworkVO> guestNetworks = _networksDao.listByZoneAndTrafficType(zone.getId(), TrafficType.Guest);
        if (!guestNetworks.isEmpty()) {
            throw new InvalidParameterValueException("Can't have more than one Guest network in zone with network type " + NetworkType.Basic);
        }
        // if zone is basic, only Shared network offerings w/o source nat service are allowed
        if (!(ntwkOff.getGuestType() == GuestType.Shared && !_networkModel.areServicesSupportedByNetworkOffering(ntwkOff.getId(), Service.SourceNat))) {
            throw new InvalidParameterValueException("For zone of type " + NetworkType.Basic + " only offerings of " + "guestType " + GuestType.Shared + " with disabled " + Service.SourceNat.getName() + " service are allowed");
        }
        if (domainId == null || domainId != Domain.ROOT_DOMAIN) {
            throw new InvalidParameterValueException("Guest network in Basic zone should be dedicated to ROOT domain");
        }
        if (subdomainAccess == null) {
            subdomainAccess = true;
        } else if (!subdomainAccess) {
            throw new InvalidParameterValueException("Subdomain access should be set to true for the" + " guest network in the Basic zone");
        }
        if (vlanId == null) {
            vlanId = Vlan.UNTAGGED;
        } else {
            if (!vlanId.equalsIgnoreCase(Vlan.UNTAGGED)) {
                throw new InvalidParameterValueException("Only vlan " + Vlan.UNTAGGED + " can be created in " + "the zone of type " + NetworkType.Basic);
            }
        }
    } else if (zone.getNetworkType() == com.cloud.model.enumeration.NetworkType.Advanced) {
        // don't allow eip/elb networks in Advance zone
        if (ntwkOff.getElasticIp() || ntwkOff.getElasticLb()) {
            throw new InvalidParameterValueException("Elastic IP and Elastic LB services are supported in zone of type " + NetworkType.Basic);
        }
    }
    // TODO(VXLAN): Support VNI specified
    // VlanId can be specified only when network offering supports it
    final boolean vlanSpecified = vlanId != null;
    if (vlanSpecified != ntwkOff.getSpecifyVlan()) {
        if (vlanSpecified) {
            throw new InvalidParameterValueException("Can't specify vlan; corresponding offering says specifyVlan=false");
        } else {
            throw new InvalidParameterValueException("Vlan has to be specified; corresponding offering says specifyVlan=true");
        }
    }
    if (vlanSpecified) {
        // don't allow to specify vlan tag used by physical network for dynamic vlan allocation
        if (_dcVnetDao.findVnet(zoneId, pNtwk.getId(), vlanId).size() > 0) {
            throw new InvalidParameterValueException("The VLAN tag " + vlanId + " is already being used for dynamic vlan allocation for the guest network in zone " + zone.getName());
        }
        final String uri = BroadcastDomainType.fromString(vlanId).toString();
        // For Isolated networks, don't allow to create network with vlan that already exists in the zone
        if (ntwkOff.getGuestType() == GuestType.Isolated) {
            if (_networksDao.countByZoneAndUri(zoneId, uri) > 0) {
                throw new InvalidParameterValueException("Network with vlan " + vlanId + " already exists in zone " + zoneId);
            } else {
                final List<DataCenterVnetVO> dcVnets = _datacenterVnetDao.findVnet(zoneId, vlanId);
                // the vnet is not coming from the data center vnet table, so the list can be empty
                if (!dcVnets.isEmpty()) {
                    final DataCenterVnetVO dcVnet = dcVnets.get(0);
                    // Fail network creation if specified vlan is dedicated to a different account
                    if (dcVnet.getAccountGuestVlanMapId() != null) {
                        final Long accountGuestVlanMapId = dcVnet.getAccountGuestVlanMapId();
                        final AccountGuestVlanMapVO map = _accountGuestVlanMapDao.findById(accountGuestVlanMapId);
                        if (map.getAccountId() != owner.getAccountId()) {
                            throw new InvalidParameterValueException("Vlan " + vlanId + " is dedicated to a different account");
                        }
                    // Fail network creation if owner has a dedicated range of vlans but the specified vlan belongs to the system pool
                    } else {
                        final List<AccountGuestVlanMapVO> maps = _accountGuestVlanMapDao.listAccountGuestVlanMapsByAccount(owner.getAccountId());
                        if (maps != null && !maps.isEmpty()) {
                            final int vnetsAllocatedToAccount = _datacenterVnetDao.countVnetsAllocatedToAccount(zoneId, owner.getAccountId());
                            final int vnetsDedicatedToAccount = _datacenterVnetDao.countVnetsDedicatedToAccount(zoneId, owner.getAccountId());
                            if (vnetsAllocatedToAccount < vnetsDedicatedToAccount) {
                                throw new InvalidParameterValueException("Specified vlan " + vlanId + " doesn't belong" + " to the vlan range dedicated to the owner " + owner.getAccountName());
                            }
                        }
                    }
                }
            }
        } else {
            // shared network with same Vlan ID in the zone
            if (_networksDao.countByZoneUriAndGuestType(zoneId, uri, GuestType.Isolated) > 0) {
                throw new InvalidParameterValueException("There is a isolated/shared network with vlan id: " + vlanId + " already exists " + "in zone " + zoneId);
            }
        }
    }
    // If networkDomain is not specified, take it from the global configuration
    if (_networkModel.areServicesSupportedByNetworkOffering(networkOfferingId, Service.Dns)) {
        final Map<Network.Capability, String> dnsCapabilities = _networkModel.getNetworkOfferingServiceCapabilities(_entityMgr.findById(NetworkOffering.class, networkOfferingId), Service.Dns);
        final String isUpdateDnsSupported = dnsCapabilities.get(Capability.AllowDnsSuffixModification);
        if (isUpdateDnsSupported == null || !Boolean.valueOf(isUpdateDnsSupported)) {
            if (networkDomain != null) {
                // TBD: NetworkOfferingId and zoneId. Send uuids instead.
                throw new InvalidParameterValueException("Domain name change is not supported by network offering id=" + networkOfferingId + " in zone id=" + zoneId);
            }
        } else {
            if (networkDomain == null) {
                // 1) Get networkDomain from the corresponding account/domain/zone
                if (aclType == ACLType.Domain) {
                    networkDomain = _networkModel.getDomainNetworkDomain(domainId, zoneId);
                } else if (aclType == ACLType.Account) {
                    networkDomain = _networkModel.getAccountNetworkDomain(owner.getId(), zoneId);
                }
                // 2) If null, generate networkDomain using domain suffix from the global config variables
                if (networkDomain == null) {
                    networkDomain = "cs" + Long.toHexString(owner.getId()) + GuestDomainSuffix.valueIn(zoneId);
                }
            } else {
                // validate network domain
                if (!NetUtils.verifyDomainName(networkDomain)) {
                    throw new InvalidParameterValueException("Invalid network domain. Total length shouldn't exceed 190 chars. Each domain " + "label must be between 1 and 63 characters long, can contain ASCII letters 'a' through 'z', the digits '0' through '9', " + "and the hyphen ('-'); can't start or end with \"-\"");
                }
            }
        }
    }
    // In Advance zone Cidr for Shared networks and Isolated networks w/o source nat service can't be NULL - 2.2.x
    // limitation, remove after we introduce support for multiple ip ranges
    // with different Cidrs for the same Shared network
    final boolean cidrRequired = zone.getNetworkType() == com.cloud.model.enumeration.NetworkType.Advanced && ntwkOff.getTrafficType() == TrafficType.Guest && (ntwkOff.getGuestType() == GuestType.Shared || (ntwkOff.getGuestType() == GuestType.Isolated && !_networkModel.areServicesSupportedByNetworkOffering(ntwkOff.getId(), Service.SourceNat)));
    if (cidr == null && ip6Cidr == null && cidrRequired) {
        throw new InvalidParameterValueException("StartIp/endIp/gateway/netmask are required when create network of" + " type " + GuestType.Shared + " and network of type " + GuestType.Isolated + " with service " + Service.SourceNat.getName() + " disabled");
    }
    // No cidr can be specified in Basic zone
    if (zone.getNetworkType() == com.cloud.model.enumeration.NetworkType.Basic && cidr != null) {
        throw new InvalidParameterValueException("StartIp/endIp/gateway/netmask can't be specified for zone of type " + NetworkType.Basic);
    }
    // Check if cidr is RFC1918 compliant if the network is Guest Isolated for IPv4
    if (cidr != null && ntwkOff.getGuestType() != GuestType.Shared && ntwkOff.getTrafficType() == TrafficType.Guest) {
        if (!NetUtils.validateGuestCidr(cidr)) {
            throw new InvalidParameterValueException("Virtual Guest Cidr " + cidr + " is not RFC1918 compliant");
        }
    }
    final String networkDomainFinal = networkDomain;
    final String vlanIdFinal = vlanId;
    final Boolean subdomainAccessFinal = subdomainAccess;
    final Network network = Transaction.execute(new TransactionCallback<Network>() {

        @Override
        public Network doInTransaction(final TransactionStatus status) {
            Long physicalNetworkId = null;
            if (pNtwk != null) {
                physicalNetworkId = pNtwk.getId();
            }
            final DataCenterDeployment plan = new DataCenterDeployment(zoneId, null, null, null, null, physicalNetworkId);
            final NetworkVO userNetwork = new NetworkVO();
            userNetwork.setNetworkDomain(networkDomainFinal);
            userNetwork.setCidr(cidr);
            userNetwork.setGateway(gateway);
            if (dns1 != null) {
                userNetwork.setDns1(dns1);
            }
            if (dns2 != null) {
                userNetwork.setDns2(dns2);
            }
            if (ipExclusionList != null) {
                userNetwork.setIpExclusionList(ipExclusionList);
            }
            if (dhcpTftpServer != null) {
                userNetwork.setDhcpTftpServer(dhcpTftpServer);
            }
            if (dhcpBootfileName != null) {
                userNetwork.setDhcpBootfileName(dhcpBootfileName);
            }
            if (ip6Cidr != null && ip6Gateway != null) {
                userNetwork.setIp6Cidr(ip6Cidr);
                userNetwork.setIp6Gateway(ip6Gateway);
            }
            if (vlanIdFinal != null) {
                if (isolatedPvlan == null) {
                    final URI uri = BroadcastDomainType.fromString(vlanIdFinal);
                    userNetwork.setBroadcastUri(uri);
                    if (!vlanIdFinal.equalsIgnoreCase(Vlan.UNTAGGED)) {
                        userNetwork.setBroadcastDomainType(BroadcastDomainType.Vlan);
                    } else {
                        userNetwork.setBroadcastDomainType(BroadcastDomainType.Native);
                    }
                } else {
                    if (vlanIdFinal.equalsIgnoreCase(Vlan.UNTAGGED)) {
                        throw new InvalidParameterValueException("Cannot support pvlan with untagged primary vlan!");
                    }
                    userNetwork.setBroadcastUri(NetUtils.generateUriForPvlan(vlanIdFinal, isolatedPvlan));
                    userNetwork.setBroadcastDomainType(BroadcastDomainType.Pvlan);
                }
            }
            final List<? extends Network> networks = setupNetwork(owner, ntwkOff, userNetwork, plan, name, displayText, true, domainId, aclType, subdomainAccessFinal, vpcId, null, isDisplayNetworkEnabled, dns1, dns2, ipExclusionList, dhcpTftpServer, dhcpBootfileName);
            Network network = null;
            if (networks == null || networks.isEmpty()) {
                throw new CloudRuntimeException("Fail to create a network");
            } else {
                if (networks.size() > 0 && networks.get(0).getGuestType() == GuestType.Isolated && networks.get(0).getTrafficType() == TrafficType.Guest) {
                    Network defaultGuestNetwork = networks.get(0);
                    for (final Network nw : networks) {
                        if (nw.getCidr() != null && nw.getCidr().equals(zone.getGuestNetworkCidr())) {
                            defaultGuestNetwork = nw;
                        }
                    }
                    network = defaultGuestNetwork;
                } else {
                    // For shared network
                    network = networks.get(0);
                }
            }
            if (updateResourceCount) {
                _resourceLimitMgr.incrementResourceCount(owner.getId(), ResourceType.network, isDisplayNetworkEnabled);
            }
            return network;
        }
    });
    CallContext.current().setEventDetails("Network Id: " + network.getId());
    CallContext.current().putContextParameter(Network.class, network.getUuid());
    return network;
}
Also used : AccountGuestVlanMapVO(com.cloud.network.dao.AccountGuestVlanMapVO) TransactionStatus(com.cloud.utils.db.TransactionStatus) URI(java.net.URI) DataCenterVnetVO(com.cloud.dc.DataCenterVnetVO) InvalidParameterValueException(com.cloud.legacymodel.exceptions.InvalidParameterValueException) CloudRuntimeException(com.cloud.legacymodel.exceptions.CloudRuntimeException) PhysicalNetwork(com.cloud.network.PhysicalNetwork) Network(com.cloud.legacymodel.network.Network) ArrayList(java.util.ArrayList) List(java.util.List) PhysicalNetworkVO(com.cloud.network.dao.PhysicalNetworkVO) NetworkVO(com.cloud.network.dao.NetworkVO) DataCenterDeployment(com.cloud.deploy.DataCenterDeployment) Capability(com.cloud.legacymodel.network.Network.Capability) NetworkOffering(com.cloud.offering.NetworkOffering) Zone(com.cloud.db.model.Zone) NetworkOfferingVO(com.cloud.offerings.NetworkOfferingVO) DB(com.cloud.utils.db.DB)

Example 97 with Network

use of com.cloud.legacymodel.network.Network in project cosmic by MissionCriticalCloud.

the class NetworkOrchestrator method setupNetwork.

@Override
@DB
public List<? extends Network> setupNetwork(final Account owner, final NetworkOffering offering, final Network predefined, final DeploymentPlan plan, final String name, final String displayText, final boolean errorIfAlreadySetup, final Long domainId, final ACLType aclType, final Boolean subdomainAccess, final Long vpcId, final Long relatedNetworkId, final Boolean isDisplayNetworkEnabled, final String dns1, final String dns2, final String ipExclusionList, final String dhcpTftpServer, final String dhcpBootfileName) throws ConcurrentOperationException {
    final Account locked = _accountDao.acquireInLockTable(owner.getId());
    if (locked == null) {
        throw new ConcurrentOperationException("Unable to acquire lock on " + owner);
    }
    try {
        if (predefined == null || offering.getTrafficType() != TrafficType.Guest && predefined.getCidr() == null && predefined.getBroadcastUri() == null && !(predefined.getBroadcastDomainType() == BroadcastDomainType.Vlan || predefined.getBroadcastDomainType() == BroadcastDomainType.Lswitch || predefined.getBroadcastDomainType() == BroadcastDomainType.Vxlan)) {
            final List<NetworkVO> configs;
            if (vpcId != null && GuestType.Sync.equals(offering.getGuestType())) {
                configs = _networksDao.listSyncNetworksByVpc(vpcId);
            } else if (relatedNetworkId != null && GuestType.Sync.equals(offering.getGuestType())) {
                configs = _networksDao.listSyncNetworksByRelatedNetwork(relatedNetworkId);
            } else {
                configs = _networksDao.listBy(owner.getId(), offering.getId(), plan.getDataCenterId());
            }
            if (configs.size() > 0) {
                if (s_logger.isDebugEnabled()) {
                    s_logger.debug("Found existing network configuration for offering " + offering + ": " + configs.get(0));
                }
                if (errorIfAlreadySetup) {
                    final InvalidParameterValueException ex = new InvalidParameterValueException("Found existing network configuration (with specified id) for offering (with specified id)");
                    ex.addProxyObject(offering.getUuid(), "offeringId");
                    ex.addProxyObject(configs.get(0).getUuid(), "networkConfigId");
                    throw ex;
                } else {
                    return configs;
                }
            }
        }
        final List<NetworkVO> networks = new ArrayList<>();
        long related = relatedNetworkId != null ? relatedNetworkId : -1;
        for (final NetworkGuru guru : networkGurus) {
            final Network network = guru.design(offering, plan, predefined, owner);
            if (network == null) {
                continue;
            }
            if (network.getId() != -1) {
                if (network instanceof NetworkVO) {
                    networks.add((NetworkVO) network);
                } else {
                    networks.add(_networksDao.findById(network.getId()));
                }
                continue;
            }
            final long id = _networksDao.getNextInSequence(Long.class, "id");
            if (related == -1) {
                related = id;
            }
            final long relatedFinal = related;
            Transaction.execute(new TransactionCallbackNoReturn() {

                @Override
                public void doInTransactionWithoutResult(final TransactionStatus status) {
                    final NetworkVO vo = new NetworkVO(id, network, offering.getId(), guru.getName(), owner.getDomainId(), owner.getId(), relatedFinal, name, displayText, predefined != null ? predefined.getNetworkDomain() : null, offering.getGuestType(), plan.getDataCenterId(), plan.getPhysicalNetworkId(), aclType, offering.getSpecifyIpRanges(), vpcId, offering.getRedundantRouter(), dns1, dns2, ipExclusionList, dhcpTftpServer, dhcpBootfileName);
                    vo.setDisplayNetwork(isDisplayNetworkEnabled == null ? true : isDisplayNetworkEnabled);
                    vo.setStrechedL2Network(offering.getSupportsStrechedL2());
                    networks.add(_networksDao.persist(vo, vo.getGuestType() == GuestType.Isolated, finalizeServicesAndProvidersForNetwork(offering, plan.getPhysicalNetworkId())));
                    if (domainId != null && aclType == ACLType.Domain) {
                        _networksDao.addDomainToNetwork(id, domainId, subdomainAccess == null ? true : subdomainAccess);
                    }
                }
            });
            if (!networks.isEmpty()) {
                return networks;
            }
        }
        if (networks.size() < 1) {
            // see networkOfferingVO.java
            final CloudRuntimeException ex = new CloudRuntimeException("Unable to convert network offering with specified id to network profile");
            ex.addProxyObject(offering.getUuid(), "offeringId");
            throw ex;
        }
        return networks;
    } finally {
        s_logger.debug("Releasing lock for " + locked);
        _accountDao.releaseFromLockTable(locked.getId());
    }
}
Also used : Account(com.cloud.legacymodel.user.Account) PhysicalNetworkVO(com.cloud.network.dao.PhysicalNetworkVO) NetworkVO(com.cloud.network.dao.NetworkVO) NetworkGuru(com.cloud.network.guru.NetworkGuru) ArrayList(java.util.ArrayList) TransactionStatus(com.cloud.utils.db.TransactionStatus) TransactionCallbackNoReturn(com.cloud.utils.db.TransactionCallbackNoReturn) ConcurrentOperationException(com.cloud.legacymodel.exceptions.ConcurrentOperationException) InvalidParameterValueException(com.cloud.legacymodel.exceptions.InvalidParameterValueException) CloudRuntimeException(com.cloud.legacymodel.exceptions.CloudRuntimeException) PhysicalNetwork(com.cloud.network.PhysicalNetwork) Network(com.cloud.legacymodel.network.Network) DB(com.cloud.utils.db.DB)

Example 98 with Network

use of com.cloud.legacymodel.network.Network in project cosmic by MissionCriticalCloud.

the class NetworkOrchestrator method releaseNic.

@DB
protected void releaseNic(final VirtualMachineProfile vmProfile, final long nicId) throws ConcurrentOperationException, ResourceUnavailableException {
    final Pair<Network, NicProfile> networkToRelease = Transaction.execute(new TransactionCallback<Pair<Network, NicProfile>>() {

        @Override
        public Pair<Network, NicProfile> doInTransaction(final TransactionStatus status) {
            final NicVO nic = _nicDao.lockRow(nicId, true);
            if (nic == null) {
                throw new ConcurrentOperationException("Unable to acquire lock on nic " + nic);
            }
            final Nic.State originalState = nic.getState();
            final NetworkVO network = _networksDao.findById(nic.getNetworkId());
            if (originalState == Nic.State.Reserved || originalState == Nic.State.Reserving) {
                if (nic.getReservationStrategy() == Nic.ReservationStrategy.Start) {
                    final NetworkGuru guru = AdapterBase.getAdapterByName(networkGurus, network.getGuruName());
                    nic.setState(Nic.State.Releasing);
                    _nicDao.update(nic.getId(), nic);
                    final NicProfile profile = new NicProfile(nic, network, nic.getBroadcastUri(), nic.getIsolationUri(), null, _networkModel.getNetworkTag(vmProfile.getHypervisorType(), network));
                    if (guru.release(profile, vmProfile, nic.getReservationId())) {
                        applyProfileToNicForRelease(nic, profile);
                        nic.setState(Nic.State.Allocated);
                        if (originalState == Nic.State.Reserved) {
                            updateNic(nic, network.getId(), -1);
                        } else {
                            _nicDao.update(nic.getId(), nic);
                        }
                    }
                    // Perform release on network elements
                    return new Pair<>(network, profile);
                } else {
                    nic.setState(Nic.State.Allocated);
                    updateNic(nic, network.getId(), -1);
                }
            }
            return null;
        }
    });
    // cleanup the entry in vm_network_map
    if (vmProfile.getType().equals(VirtualMachineType.User)) {
        final NicVO nic = _nicDao.findById(nicId);
        if (nic != null) {
            final NetworkVO vmNetwork = _networksDao.findById(nic.getNetworkId());
            final VMNetworkMapVO vno = _vmNetworkMapDao.findByVmAndNetworkId(vmProfile.getVirtualMachine().getId(), vmNetwork.getId());
            if (vno != null) {
                _vmNetworkMapDao.remove(vno.getId());
            }
        }
    }
    if (networkToRelease != null) {
        final Network network = networkToRelease.first();
        final NicProfile profile = networkToRelease.second();
        final List<Provider> providersToImplement = getNetworkProviders(network.getId());
        for (final NetworkElement element : networkElements) {
            if (providersToImplement.contains(element.getProvider())) {
                if (s_logger.isDebugEnabled()) {
                    s_logger.debug("Asking " + element.getName() + " to release " + profile);
                }
                // NOTE: Context appear to never be used in release method
                // implementations. Consider removing it from interface Element
                element.release(network, profile, vmProfile, null);
            }
        }
    }
}
Also used : PhysicalNetworkVO(com.cloud.network.dao.PhysicalNetworkVO) NetworkVO(com.cloud.network.dao.NetworkVO) NetworkGuru(com.cloud.network.guru.NetworkGuru) TransactionStatus(com.cloud.utils.db.TransactionStatus) NicProfile(com.cloud.vm.NicProfile) ConcurrentOperationException(com.cloud.legacymodel.exceptions.ConcurrentOperationException) UserDataServiceProvider(com.cloud.network.element.UserDataServiceProvider) LoadBalancingServiceProvider(com.cloud.network.element.LoadBalancingServiceProvider) StaticNatServiceProvider(com.cloud.network.element.StaticNatServiceProvider) Provider(com.cloud.legacymodel.network.Network.Provider) DhcpServiceProvider(com.cloud.network.element.DhcpServiceProvider) NetworkElement(com.cloud.network.element.NetworkElement) RedundantState(com.cloud.legacymodel.network.VirtualRouter.RedundantState) PhysicalNetwork(com.cloud.network.PhysicalNetwork) Network(com.cloud.legacymodel.network.Network) VMNetworkMapVO(com.cloud.engine.cloud.entity.api.db.VMNetworkMapVO) NicVO(com.cloud.vm.NicVO) Pair(com.cloud.legacymodel.utils.Pair) DB(com.cloud.utils.db.DB)

Example 99 with Network

use of com.cloud.legacymodel.network.Network in project cosmic by MissionCriticalCloud.

the class NetworkOrchestrator method implementNetwork.

@Override
@DB
public Pair<NetworkGuru, NetworkVO> implementNetwork(final long networkId, final DeployDestination dest, final ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException {
    final Pair<NetworkGuru, NetworkVO> implemented = new Pair<>(null, null);
    NetworkVO network = _networksDao.findById(networkId);
    final NetworkGuru guru = AdapterBase.getAdapterByName(networkGurus, network.getGuruName());
    if (isNetworkImplemented(network)) {
        s_logger.debug("Network id=" + networkId + " is already implemented");
        implemented.set(guru, network);
        return implemented;
    }
    // Acquire lock only when network needs to be implemented
    network = _networksDao.acquireInLockTable(networkId, NetworkLockTimeout.value());
    if (network == null) {
        // see NetworkVO.java
        final ConcurrentOperationException ex = new ConcurrentOperationException("Unable to acquire network configuration");
        ex.addProxyObject(_entityMgr.findById(Network.class, networkId).getUuid());
        throw ex;
    }
    if (s_logger.isDebugEnabled()) {
        s_logger.debug("Lock is acquired for network id " + networkId + " as a part of network implement");
    }
    try {
        if (isNetworkImplemented(network)) {
            s_logger.debug("Network id=" + networkId + " is already implemented");
            implemented.set(guru, network);
            return implemented;
        }
        if (s_logger.isDebugEnabled()) {
            s_logger.debug("Asking " + guru.getName() + " to implement " + network);
        }
        final NetworkOfferingVO offering = _networkOfferingDao.findById(network.getNetworkOfferingId());
        network.setReservationId(context.getReservationId());
        if (isSharedNetworkWithServices(network)) {
            network.setState(Network.State.Implementing);
        } else {
            stateTransitTo(network, Event.ImplementNetwork);
        }
        final Network result = guru.implement(network, offering, dest, context);
        network.setCidr(result.getCidr());
        network.setBroadcastUri(result.getBroadcastUri());
        network.setGateway(result.getGateway());
        network.setMode(result.getMode());
        network.setPhysicalNetworkId(result.getPhysicalNetworkId());
        _networksDao.update(networkId, network);
        // implement network elements and re-apply all the network rules
        implementNetworkElementsAndResources(dest, context, network, offering);
        if (isSharedNetworkWithServices(network)) {
            network.setState(Network.State.Implemented);
        } else {
            stateTransitTo(network, Event.OperationSucceeded);
        }
        network.setRestartRequired(false);
        _networksDao.update(network.getId(), network);
        implemented.set(guru, network);
        return implemented;
    } catch (final NoTransitionException e) {
        s_logger.error(e.getMessage());
        return null;
    } finally {
        if (implemented.first() == null) {
            s_logger.debug("Cleaning up because we're unable to implement the network " + network);
            try {
                if (isSharedNetworkWithServices(network)) {
                    network.setState(Network.State.Shutdown);
                    _networksDao.update(networkId, network);
                } else {
                    stateTransitTo(network, Event.OperationFailed);
                }
            } catch (final NoTransitionException e) {
                s_logger.error(e.getMessage());
            }
            try {
                shutdownNetwork(networkId, context, false);
            } catch (final Exception e) {
                // Don't throw this exception as it would hide the original thrown exception, just log
                s_logger.error("Exception caught while shutting down a network as part of a failed implementation", e);
            }
        }
        _networksDao.releaseFromLockTable(networkId);
        if (s_logger.isDebugEnabled()) {
            s_logger.debug("Lock is released for network id " + networkId + " as a part of network implement");
        }
    }
}
Also used : PhysicalNetworkVO(com.cloud.network.dao.PhysicalNetworkVO) NetworkVO(com.cloud.network.dao.NetworkVO) NetworkGuru(com.cloud.network.guru.NetworkGuru) PhysicalNetwork(com.cloud.network.PhysicalNetwork) Network(com.cloud.legacymodel.network.Network) NoTransitionException(com.cloud.legacymodel.exceptions.NoTransitionException) NetworkOfferingVO(com.cloud.offerings.NetworkOfferingVO) ConcurrentOperationException(com.cloud.legacymodel.exceptions.ConcurrentOperationException) ConnectionException(com.cloud.legacymodel.exceptions.ConnectionException) InvalidParameterValueException(com.cloud.legacymodel.exceptions.InvalidParameterValueException) ResourceAllocationException(com.cloud.legacymodel.exceptions.ResourceAllocationException) ConcurrentOperationException(com.cloud.legacymodel.exceptions.ConcurrentOperationException) InsufficientVirtualNetworkCapacityException(com.cloud.legacymodel.exceptions.InsufficientVirtualNetworkCapacityException) NoTransitionException(com.cloud.legacymodel.exceptions.NoTransitionException) InsufficientAddressCapacityException(com.cloud.legacymodel.exceptions.InsufficientAddressCapacityException) InsufficientCapacityException(com.cloud.legacymodel.exceptions.InsufficientCapacityException) IllegalVirtualMachineException(com.cloud.legacymodel.exceptions.IllegalVirtualMachineException) UnsupportedServiceException(com.cloud.legacymodel.exceptions.UnsupportedServiceException) ConfigurationException(javax.naming.ConfigurationException) ResourceUnavailableException(com.cloud.legacymodel.exceptions.ResourceUnavailableException) CloudRuntimeException(com.cloud.legacymodel.exceptions.CloudRuntimeException) Pair(com.cloud.legacymodel.utils.Pair) DB(com.cloud.utils.db.DB)

Example 100 with Network

use of com.cloud.legacymodel.network.Network in project cosmic by MissionCriticalCloud.

the class NetworkOrchestrator method cleanupNetworkResources.

private boolean cleanupNetworkResources(final long networkId, final Account caller, final long callerUserId) {
    boolean success = true;
    final Network network = _networksDao.findById(networkId);
    // remove all PF/Static Nat rules for the network
    try {
        if (_rulesMgr.revokeAllPFStaticNatRulesForNetwork(networkId, callerUserId, caller)) {
            s_logger.debug("Successfully cleaned up portForwarding/staticNat rules for network id=" + networkId);
        } else {
            success = false;
            s_logger.warn("Failed to release portForwarding/StaticNat rules as a part of network id=" + networkId + " cleanup");
        }
    } catch (final ResourceUnavailableException ex) {
        success = false;
        // shouldn't even come here as network is being cleaned up after all network elements are shutdown
        s_logger.warn("Failed to release portForwarding/StaticNat rules as a part of network id=" + networkId + " cleanup due to resourceUnavailable ", ex);
    }
    // remove all LB rules for the network
    if (_lbMgr.removeAllLoadBalanacersForNetwork(networkId, caller, callerUserId)) {
        s_logger.debug("Successfully cleaned up load balancing rules for network id=" + networkId);
    } else {
        // shouldn't even come here as network is being cleaned up after all network elements are shutdown
        success = false;
        s_logger.warn("Failed to cleanup LB rules as a part of network id=" + networkId + " cleanup");
    }
    // revoke all firewall rules for the network
    try {
        if (_firewallMgr.revokeAllFirewallRulesForNetwork(networkId, callerUserId, caller)) {
            s_logger.debug("Successfully cleaned up firewallRules rules for network id=" + networkId);
        } else {
            success = false;
            s_logger.warn("Failed to cleanup Firewall rules as a part of network id=" + networkId + " cleanup");
        }
    } catch (final ResourceUnavailableException ex) {
        success = false;
        // shouldn't even come here as network is being cleaned up after all network elements are shutdown
        s_logger.warn("Failed to cleanup Firewall rules as a part of network id=" + networkId + " cleanup due to resourceUnavailable ", ex);
    }
    // revoke all network ACLs for network
    try {
        if (_networkACLMgr.revokeACLItemsForNetwork(networkId)) {
            s_logger.debug("Successfully cleaned up NetworkACLs for network id=" + networkId);
        } else {
            success = false;
            s_logger.warn("Failed to cleanup NetworkACLs as a part of network id=" + networkId + " cleanup");
        }
    } catch (final ResourceUnavailableException ex) {
        success = false;
        s_logger.warn("Failed to cleanup Network ACLs as a part of network id=" + networkId + " cleanup due to resourceUnavailable ", ex);
    }
    // release all ip addresses
    final List<IPAddressVO> ipsToRelease = _ipAddressDao.listByAssociatedNetwork(networkId, null);
    for (final IPAddressVO ipToRelease : ipsToRelease) {
        if (ipToRelease.getVpcId() == null) {
            final IPAddressVO ip = _ipAddrMgr.markIpAsUnavailable(ipToRelease.getId());
            assert ip != null : "Unable to mark the ip address id=" + ipToRelease.getId() + " as unavailable.";
        } else {
            _vpcMgr.unassignIPFromVpcNetwork(ipToRelease.getId(), network.getId());
        }
    }
    try {
        if (!_ipAddrMgr.applyIpAssociations(network, true)) {
            s_logger.warn("Unable to apply ip address associations for " + network);
            success = false;
        }
    } catch (final ResourceUnavailableException e) {
        throw new CloudRuntimeException("We should never get to here because we used true when applyIpAssociations", e);
    }
    return success;
}
Also used : CloudRuntimeException(com.cloud.legacymodel.exceptions.CloudRuntimeException) PhysicalNetwork(com.cloud.network.PhysicalNetwork) Network(com.cloud.legacymodel.network.Network) ResourceUnavailableException(com.cloud.legacymodel.exceptions.ResourceUnavailableException) IPAddressVO(com.cloud.network.dao.IPAddressVO)

Aggregations

Network (com.cloud.legacymodel.network.Network)160 ArrayList (java.util.ArrayList)57 InvalidParameterValueException (com.cloud.legacymodel.exceptions.InvalidParameterValueException)56 Account (com.cloud.legacymodel.user.Account)46 CloudRuntimeException (com.cloud.legacymodel.exceptions.CloudRuntimeException)42 NetworkOffering (com.cloud.offering.NetworkOffering)36 PhysicalNetwork (com.cloud.network.PhysicalNetwork)34 IPAddressVO (com.cloud.network.dao.IPAddressVO)32 ResourceUnavailableException (com.cloud.legacymodel.exceptions.ResourceUnavailableException)30 NetworkVO (com.cloud.network.dao.NetworkVO)28 List (java.util.List)28 Zone (com.cloud.db.model.Zone)27 DB (com.cloud.utils.db.DB)27 NicProfile (com.cloud.vm.NicProfile)26 Nic (com.cloud.legacymodel.network.Nic)21 DataCenter (com.cloud.legacymodel.dc.DataCenter)20 ConcurrentOperationException (com.cloud.legacymodel.exceptions.ConcurrentOperationException)20 PhysicalNetworkVO (com.cloud.network.dao.PhysicalNetworkVO)19 DomainRouterVO (com.cloud.vm.DomainRouterVO)18 ActionEvent (com.cloud.event.ActionEvent)17