Return-Path: X-Original-To: apmail-cloudstack-commits-archive@www.apache.org Delivered-To: apmail-cloudstack-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id A45EC109E6 for ; Tue, 29 Oct 2013 16:41:02 +0000 (UTC) Received: (qmail 679 invoked by uid 500); 29 Oct 2013 16:36:37 -0000 Delivered-To: apmail-cloudstack-commits-archive@cloudstack.apache.org Received: (qmail 619 invoked by uid 500); 29 Oct 2013 16:36:33 -0000 Mailing-List: contact commits-help@cloudstack.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cloudstack.apache.org Delivered-To: mailing list commits@cloudstack.apache.org Received: (qmail 418 invoked by uid 99); 29 Oct 2013 16:36:24 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 29 Oct 2013 16:36:23 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id 16BF488B10D; Tue, 29 Oct 2013 16:36:23 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: hugo@apache.org To: commits@cloudstack.apache.org Date: Tue, 29 Oct 2013 16:36:23 -0000 Message-Id: X-Mailer: ASF-Git Admin Mailer Subject: [1/3] git commit: updated refs/heads/network-guru-orchestration to 7c2077f Updated Branches: refs/heads/network-guru-orchestration [created] 7c2077ff9 Move orchestration logic to the NetworkOrchestrator. This puts the decision whicks gurus will create the network in the hands of the orchestrator instead of with each individual guru. This would also make it easier for new network providers to add themselves to the system. No elaborate canHandle checks, but just a capabilities list. Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/9f2d9401 Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/9f2d9401 Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/9f2d9401 Branch: refs/heads/network-guru-orchestration Commit: 9f2d940174d1c0427426b6bbac5399af162572c2 Parents: cc4b612 Author: Hugo Trippaers Authored: Tue Oct 29 17:32:38 2013 +0100 Committer: Hugo Trippaers Committed: Tue Oct 29 17:32:38 2013 +0100 ---------------------------------------------------------------------- api/src/com/cloud/network/PhysicalNetwork.java | 4 +- api/src/com/cloud/network/guru/NetworkGuru.java | 38 ++ .../orchestration/NetworkOrchestrator.java | 388 +++++++++++-------- 3 files changed, 274 insertions(+), 156 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9f2d9401/api/src/com/cloud/network/PhysicalNetwork.java ---------------------------------------------------------------------- diff --git a/api/src/com/cloud/network/PhysicalNetwork.java b/api/src/com/cloud/network/PhysicalNetwork.java index 55b18e6..dd90f8e 100644 --- a/api/src/com/cloud/network/PhysicalNetwork.java +++ b/api/src/com/cloud/network/PhysicalNetwork.java @@ -18,10 +18,11 @@ package com.cloud.network; import java.util.List; -import com.cloud.utils.Pair; import org.apache.cloudstack.api.Identity; import org.apache.cloudstack.api.InternalIdentity; +import com.cloud.utils.Pair; + /** * */ @@ -33,6 +34,7 @@ public interface PhysicalNetwork extends Identity, InternalIdentity { } public enum IsolationMethod { + NONE, VLAN, L3, GRE, http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9f2d9401/api/src/com/cloud/network/guru/NetworkGuru.java ---------------------------------------------------------------------- diff --git a/api/src/com/cloud/network/guru/NetworkGuru.java b/api/src/com/cloud/network/guru/NetworkGuru.java index 57ffef8..039142e 100755 --- a/api/src/com/cloud/network/guru/NetworkGuru.java +++ b/api/src/com/cloud/network/guru/NetworkGuru.java @@ -16,14 +16,19 @@ // under the License. package com.cloud.network.guru; +import java.util.List; + +import com.cloud.dc.DataCenter.NetworkType; import com.cloud.deploy.DeployDestination; import com.cloud.deploy.DeploymentPlan; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientAddressCapacityException; import com.cloud.exception.InsufficientVirtualNetworkCapcityException; import com.cloud.network.Network; +import com.cloud.network.Network.GuestType; import com.cloud.network.NetworkProfile; import com.cloud.network.Networks.TrafficType; +import com.cloud.network.PhysicalNetwork.IsolationMethod; import com.cloud.offering.NetworkOffering; import com.cloud.user.Account; import com.cloud.utils.component.Adapter; @@ -201,8 +206,41 @@ public interface NetworkGuru extends Adapter { void updateNetworkProfile(NetworkProfile networkProfile); + @Deprecated TrafficType[] getSupportedTrafficType(); + @Deprecated boolean isMyTrafficType(TrafficType type); + /** + * The guru needs to supply the information about what networking types are supported to + * the network orchestrator. + * @return list of supported NetworkTypes + */ + List getSupportedNetworkTypes(); + + /** + * The guru needs to supply the information about what traffic types are + * supported to the network orchestrator. + * + * @return list of supported TrafficTypes + */ + List getSupportedTrafficTypes(); + + /** + * The guru needs to supply the information about what guest networking + * types are supported to the network orchestrator. + * + * @return list of supported GuestTypes + */ + List getSupportedGuestTypes(); + + /** + * The guru needs to supply the information about what networking types are + * supported to the network orchestrator. + * + * @return list of supported IsolationMethods + */ + List getSupportedIsolationMethods(); + } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9f2d9401/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java ---------------------------------------------------------------------- diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java index 5636e07..b447a4d 100755 --- a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java @@ -36,7 +36,9 @@ import javax.ejb.Local; import javax.inject.Inject; import javax.naming.ConfigurationException; +import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; + import org.apache.cloudstack.acl.ControlledEntity.ACLType; import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; @@ -106,6 +108,7 @@ import com.cloud.network.NetworkStateListener; import com.cloud.network.Networks.BroadcastDomainType; import com.cloud.network.Networks.TrafficType; import com.cloud.network.PhysicalNetwork; +import com.cloud.network.PhysicalNetwork.IsolationMethod; import com.cloud.network.PhysicalNetworkSetupInfo; import com.cloud.network.RemoteAccessVpn; import com.cloud.network.addr.PublicIp; @@ -167,14 +170,14 @@ import com.cloud.utils.concurrency.NamedThreadFactory; import com.cloud.utils.db.DB; import com.cloud.utils.db.EntityManager; import com.cloud.utils.db.GlobalLock; -import com.cloud.utils.db.TransactionCallback; -import com.cloud.utils.db.TransactionCallbackNoReturn; -import com.cloud.utils.db.TransactionCallbackWithExceptionNoReturn; -import com.cloud.utils.db.TransactionStatus; import com.cloud.utils.db.JoinBuilder.JoinType; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria.Op; import com.cloud.utils.db.Transaction; +import com.cloud.utils.db.TransactionCallback; +import com.cloud.utils.db.TransactionCallbackNoReturn; +import com.cloud.utils.db.TransactionCallbackWithExceptionNoReturn; +import com.cloud.utils.db.TransactionStatus; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.fsm.NoTransitionException; import com.cloud.utils.fsm.StateMachine2; @@ -412,76 +415,76 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra //#1 - quick cloud network offering if (_networkOfferingDao.findByUniqueName(NetworkOffering.QuickCloudNoServices) == null) { offering = _configMgr.createNetworkOffering(NetworkOffering.QuickCloudNoServices, "Offering for QuickCloud with no services", TrafficType.Guest, null, true, - Availability.Optional, null, new HashMap>(), true, Network.GuestType.Shared, false, null, true, null, true, false, null, - false, null, true); + Availability.Optional, null, new HashMap>(), true, Network.GuestType.Shared, false, null, true, null, true, false, null, + false, null, true); offering.setState(NetworkOffering.State.Enabled); _networkOfferingDao.update(offering.getId(), offering); } - + //#2 - SG enabled network offering if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultSharedNetworkOfferingWithSGService) == null) { offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultSharedNetworkOfferingWithSGService, "Offering for Shared Security group enabled networks", - TrafficType.Guest, null, true, Availability.Optional, null, defaultSharedNetworkOfferingProviders, true, Network.GuestType.Shared, false, null, true, null, true, - false, null, false, null, true); + TrafficType.Guest, null, true, Availability.Optional, null, defaultSharedNetworkOfferingProviders, true, Network.GuestType.Shared, false, null, true, null, true, + false, null, false, null, true); offering.setState(NetworkOffering.State.Enabled); _networkOfferingDao.update(offering.getId(), offering); } - + //#3 - shared network offering with no SG service if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultSharedNetworkOffering) == null) { offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultSharedNetworkOffering, "Offering for Shared networks", TrafficType.Guest, null, true, - Availability.Optional, null, defaultSharedNetworkOfferingProviders, true, Network.GuestType.Shared, false, null, true, null, true, false, null, false, null, true); + Availability.Optional, null, defaultSharedNetworkOfferingProviders, true, Network.GuestType.Shared, false, null, true, null, true, false, null, false, null, true); offering.setState(NetworkOffering.State.Enabled); _networkOfferingDao.update(offering.getId(), offering); } - + //#4 - default isolated offering with Source nat service if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOfferingWithSourceNatService) == null) { offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingWithSourceNatService, - "Offering for Isolated networks with Source Nat service enabled", TrafficType.Guest, null, false, Availability.Required, null, - defaultIsolatedSourceNatEnabledNetworkOfferingProviders, true, Network.GuestType.Isolated, false, null, true, null, false, false, null, false, null, true); - + "Offering for Isolated networks with Source Nat service enabled", TrafficType.Guest, null, false, Availability.Required, null, + defaultIsolatedSourceNatEnabledNetworkOfferingProviders, true, Network.GuestType.Isolated, false, null, true, null, false, false, null, false, null, true); + offering.setState(NetworkOffering.State.Enabled); _networkOfferingDao.update(offering.getId(), offering); } - + //#5 - default vpc offering with LB service if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworks) == null) { offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworks, - "Offering for Isolated VPC networks with Source Nat service enabled", TrafficType.Guest, null, false, Availability.Optional, null, defaultVPCOffProviders, true, - Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true); + "Offering for Isolated VPC networks with Source Nat service enabled", TrafficType.Guest, null, false, Availability.Optional, null, defaultVPCOffProviders, true, + Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true); offering.setState(NetworkOffering.State.Enabled); _networkOfferingDao.update(offering.getId(), offering); } - + //#6 - default vpc offering with no LB service if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksNoLB) == null) { //remove LB service defaultVPCOffProviders.remove(Service.Lb); offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksNoLB, - "Offering for Isolated VPC networks with Source Nat service enabled and LB service disabled", TrafficType.Guest, null, false, Availability.Optional, null, - defaultVPCOffProviders, true, Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true); + "Offering for Isolated VPC networks with Source Nat service enabled and LB service disabled", TrafficType.Guest, null, false, Availability.Optional, null, + defaultVPCOffProviders, true, Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true); offering.setState(NetworkOffering.State.Enabled); _networkOfferingDao.update(offering.getId(), offering); } - + //#7 - isolated offering with source nat disabled if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOffering) == null) { offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOffering, "Offering for Isolated networks with no Source Nat service", - TrafficType.Guest, null, true, Availability.Optional, null, defaultIsolatedNetworkOfferingProviders, true, Network.GuestType.Isolated, false, null, true, null, - true, false, null, false, null, true); + TrafficType.Guest, null, true, Availability.Optional, null, defaultIsolatedNetworkOfferingProviders, true, Network.GuestType.Isolated, false, null, true, null, + true, false, null, false, null, true); offering.setState(NetworkOffering.State.Enabled); _networkOfferingDao.update(offering.getId(), offering); } - + //#8 - network offering with internal lb service Map> internalLbOffProviders = new HashMap>(); Set defaultVpcProvider = new HashSet(); defaultVpcProvider.add(Network.Provider.VPCVirtualRouter); - + Set defaultInternalLbProvider = new HashSet(); defaultInternalLbProvider.add(Network.Provider.InternalLbVm); - + internalLbOffProviders.put(Service.Dhcp, defaultVpcProvider); internalLbOffProviders.put(Service.Dns, defaultVpcProvider); internalLbOffProviders.put(Service.UserData, defaultVpcProvider); @@ -489,17 +492,17 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra internalLbOffProviders.put(Service.Gateway, defaultVpcProvider); internalLbOffProviders.put(Service.Lb, defaultInternalLbProvider); internalLbOffProviders.put(Service.SourceNat, defaultVpcProvider); - + if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksWithInternalLB) == null) { offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksWithInternalLB, - "Offering for Isolated VPC networks with Internal Lb support", TrafficType.Guest, null, false, Availability.Optional, null, internalLbOffProviders, true, - Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true); + "Offering for Isolated VPC networks with Internal Lb support", TrafficType.Guest, null, false, Availability.Optional, null, internalLbOffProviders, true, + Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true); offering.setState(NetworkOffering.State.Enabled); offering.setInternalLb(true); offering.setPublicLb(false); _networkOfferingDao.update(offering.getId(), offering); } - + Map> netscalerServiceProviders = new HashMap>(); Set vrProvider = new HashSet(); vrProvider.add(Provider.VirtualRouter); @@ -513,7 +516,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra netscalerServiceProviders.put(Service.SecurityGroup, sgProvider); netscalerServiceProviders.put(Service.StaticNat, nsProvider); netscalerServiceProviders.put(Service.Lb, nsProvider); - + Map> serviceCapabilityMap = new HashMap>(); Map elb = new HashMap(); elb.put(Capability.ElasticLb, "true"); @@ -521,11 +524,11 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra eip.put(Capability.ElasticIp, "true"); serviceCapabilityMap.put(Service.Lb, elb); serviceCapabilityMap.put(Service.StaticNat, eip); - + if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultSharedEIPandELBNetworkOffering) == null) { offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultSharedEIPandELBNetworkOffering, - "Offering for Shared networks with Elastic IP and Elastic LB capabilities", TrafficType.Guest, null, true, Availability.Optional, null, netscalerServiceProviders, - true, Network.GuestType.Shared, false, null, true, serviceCapabilityMap, true, false, null, false, null, true); + "Offering for Shared networks with Elastic IP and Elastic LB capabilities", TrafficType.Guest, null, true, Availability.Optional, null, netscalerServiceProviders, + true, Network.GuestType.Shared, false, null, true, serviceCapabilityMap, true, false, null, false, null, true); offering.setState(NetworkOffering.State.Enabled); offering.setDedicatedLB(false); _networkOfferingDao.update(offering.getId(), offering); @@ -555,10 +558,10 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra SearchBuilder podVlanMapSB = _podVlanMapDao.createSearchBuilder(); podVlanMapSB.and("podId", podVlanMapSB.entity().getPodId(), Op.EQ); AssignIpAddressFromPodVlanSearch.join("podVlanMapSB", podVlanMapSB, podVlanMapSB.entity().getVlanDbId(), AssignIpAddressFromPodVlanSearch.entity().getVlanId(), - JoinType.INNER); + JoinType.INNER); AssignIpAddressFromPodVlanSearch.join("vlan", podVlanSearch, podVlanSearch.entity().getId(), AssignIpAddressFromPodVlanSearch.entity().getVlanId(), JoinType.INNER); - - + + AssignIpAddressFromPodVlanSearch.done(); _executor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("Network-Scavenger")); @@ -589,14 +592,14 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra @Override public List setupNetwork(Account owner, NetworkOffering offering, DeploymentPlan plan, String name, String displayText, boolean isDefault) - throws ConcurrentOperationException { + throws ConcurrentOperationException { return setupNetwork(owner, offering, null, plan, name, displayText, false, null, null, null, null, true); } @Override @DB public List setupNetwork(final Account owner, final NetworkOffering offering, final Network predefined, final DeploymentPlan plan, final String name, final String displayText, - boolean errorIfAlreadySetup, final Long domainId, final ACLType aclType, final Boolean subdomainAccess, final Long vpcId, final Boolean isDisplayNetworkEnabled) throws ConcurrentOperationException { + boolean errorIfAlreadySetup, final Long domainId, final ACLType aclType, final Boolean subdomainAccess, final Long vpcId, final Boolean isDisplayNetworkEnabled) throws ConcurrentOperationException { Account locked = _accountDao.acquireInLockTable(owner.getId()); if (locked == null) { @@ -605,10 +608,10 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra 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) - )) { + !(predefined.getBroadcastDomainType() == BroadcastDomainType.Vlan || + predefined.getBroadcastDomainType() == BroadcastDomainType.Lswitch || + predefined.getBroadcastDomainType() == BroadcastDomainType.Vxlan) + )) { List configs = _networksDao.listBy(owner.getId(), offering.getId(), plan.getDataCenterId()); if (configs.size() > 0) { if (s_logger.isDebugEnabled()) { @@ -617,7 +620,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra if (errorIfAlreadySetup) { InvalidParameterValueException ex = new InvalidParameterValueException( - "Found existing network configuration (with specified id) for offering (with specified id)"); + "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; @@ -631,7 +634,43 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra long related = -1; - for (final NetworkGuru guru : _networkGurus) { + /* + * Determine all the important factors for deciding which guru can handle this network. + */ + + DataCenter dc = _dcDao.findById(plan.getDataCenterId()); + NetworkType networkType = dc.getNetworkType(); + TrafficType trafficType = offering.getTrafficType(); + GuestType guestType = offering.getGuestType(); + List isolationMethods = new ArrayList(); + + PhysicalNetworkVO physnet = _physicalNetworkDao.findById(plan.getPhysicalNetworkId()); + if (physnet != null) { + List physIsolationMethods = physnet.getIsolationMethods(); + if (physIsolationMethods.isEmpty()) { + s_logger.warn("Empty isolation method on physical network " + physnet.getName() + " setting to NONE"); + isolationMethods.add(IsolationMethod.NONE); + } + for (String isolationMethodName : physIsolationMethods) { + isolationMethods.add(IsolationMethod.valueOf(isolationMethodName)); + } + } else { + isolationMethods.add(IsolationMethod.NONE); + } + + List gurus = getSupportedNetworkGurus(networkType, trafficType, guestType, isolationMethods); + if (gurus.isEmpty()) { + CloudRuntimeException ex = new CloudRuntimeException("No gurus support the requested networking types."); + ex.addProxyObject(offering.getUuid(), "offeringId"); + } + + if (gurus.size() > 1) { + s_logger.warn("Multiple gurus indicate a willingness to handle the network design for offering" + offering.getName()); + } + + for (final NetworkGuru guru : gurus) { + s_logger.debug("Asking " + guru.getName() + " to design a network of offering " + offering.getName()); + final Network network = guru.design(offering, plan, predefined, owner); if (network == null) { continue; @@ -656,11 +695,11 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra @Override public void doInTransactionWithoutResult(TransactionStatus status) { NetworkVO vo = new NetworkVO(id, network, offering.getId(), guru.getName(), owner.getDomainId(), owner.getId(), relatedFile, name, displayText, - predefined.getNetworkDomain(), offering.getGuestType(), plan.getDataCenterId(), plan.getPhysicalNetworkId(), aclType, offering.getSpecifyIpRanges(), vpcId); + predefined.getNetworkDomain(), offering.getGuestType(), plan.getDataCenterId(), plan.getPhysicalNetworkId(), aclType, offering.getSpecifyIpRanges(), vpcId); vo.setDisplayNetwork(isDisplayNetworkEnabled == null ? true : isDisplayNetworkEnabled); networks.add(_networksDao.persist(vo, vo.getGuestType() == Network.GuestType.Isolated, - finalizeServicesAndProvidersForNetwork(offering, plan.getPhysicalNetworkId()))); - + finalizeServicesAndProvidersForNetwork(offering, plan.getPhysicalNetworkId()))); + if (domainId != null && aclType == ACLType.Domain) { _networksDao.addDomainToNetwork(id, domainId, subdomainAccess == null ? true : subdomainAccess); } @@ -685,41 +724,41 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra @Override @DB public void allocate(final VirtualMachineProfile vm, final LinkedHashMap networks) throws InsufficientCapacityException, - ConcurrentOperationException { + ConcurrentOperationException { Transaction.execute(new TransactionCallbackWithExceptionNoReturn() { @Override public void doInTransactionWithoutResult(TransactionStatus status) throws InsufficientCapacityException { int deviceId = 0; - + boolean[] deviceIds = new boolean[networks.size()]; Arrays.fill(deviceIds, false); - + List nics = new ArrayList(networks.size()); NicProfile defaultNic = null; - + for (Map.Entry network : networks.entrySet()) { Network config = network.getKey(); NicProfile requested = network.getValue(); - + Boolean isDefaultNic = false; if (vm != null && (requested != null && requested.isDefaultNic())) { isDefaultNic = true; } - + while (deviceIds[deviceId] && deviceId < deviceIds.length) { deviceId++; } - + Pair vmNicPair = allocateNic(requested, config, isDefaultNic, deviceId, vm); - + NicProfile vmNic = vmNicPair.first(); if (vmNic == null) { continue; } - + deviceId = vmNicPair.second(); - + int devId = vmNic.getDeviceId(); if (devId > deviceIds.length) { throw new IllegalArgumentException("Device id for nic is too large: " + vmNic); @@ -727,26 +766,26 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra if (deviceIds[devId]) { throw new IllegalArgumentException("Conflicting device id for two different nics: " + vmNic); } - + deviceIds[devId] = true; - + if (vmNic.isDefaultNic()) { if (defaultNic != null) { throw new IllegalArgumentException("You cannot specify two nics as default nics: nic 1 = " + defaultNic + "; nic 2 = " + vmNic); } defaultNic = vmNic; } - + nics.add(vmNic); vm.addNic(vmNic); - + } - + if (nics.size() != networks.size()) { s_logger.warn("Number of nics " + nics.size() + " doesn't match number of requested networks " + networks.size()); throw new CloudRuntimeException("Number of nics " + nics.size() + " doesn't match number of requested networks " + networks.size()); } - + if (nics.size() == 1) { nics.get(0).setDefaultNic(true); } @@ -757,7 +796,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra @DB @Override public Pair allocateNic(NicProfile requested, Network network, Boolean isDefaultNic, int deviceId, VirtualMachineProfile vm) - throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException, ConcurrentOperationException { + throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException, ConcurrentOperationException { NetworkVO ntwkVO = _networksDao.findById(network.getId()); s_logger.debug("Allocating nic for vm " + vm.getVirtualMachine() + " in network " + network + " with requested profile " + requested); @@ -789,7 +828,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra Integer networkRate = _networkModel.getNetworkRate(network.getId(), vm.getId()); NicProfile vmNic = new NicProfile(vo, network, vo.getBroadcastUri(), vo.getIsolationUri(), networkRate, _networkModel.isSecurityGroupSupportedInNetwork(network), - _networkModel.getNetworkTag(vm.getHypervisorType(), network)); + _networkModel.getNetworkTag(vm.getHypervisorType(), network)); return new Pair(vmNic, Integer.valueOf(deviceId)); } @@ -903,7 +942,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra @Override @DB public Pair implementNetwork(long networkId, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, - ResourceUnavailableException, InsufficientCapacityException { + ResourceUnavailableException, InsufficientCapacityException { Pair implemented = new Pair(null, null); NetworkVO network = _networksDao.findById(networkId); @@ -1002,7 +1041,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra @Override public void implementNetworkElementsAndResources(DeployDestination dest, ReservationContext context, Network network, NetworkOffering offering) - throws ConcurrentOperationException, InsufficientAddressCapacityException, ResourceUnavailableException, InsufficientCapacityException { + throws ConcurrentOperationException, InsufficientAddressCapacityException, ResourceUnavailableException, InsufficientCapacityException { // Associate a source NAT IP (if one isn't already associated with the network) if this is a // 1) 'Isolated' or 'Shared' guest virtual network in the advance zone @@ -1013,7 +1052,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra DataCenter zone = _dcDao.findById(network.getDataCenterId()); if (!sharedSourceNat && _networkModel.areServicesSupportedInNetwork(network.getId(), Service.SourceNat) && - (network.getGuestType() == Network.GuestType.Isolated || (network.getGuestType() == Network.GuestType.Shared && zone.getNetworkType() == NetworkType.Advanced))) { + (network.getGuestType() == Network.GuestType.Isolated || (network.getGuestType() == Network.GuestType.Shared && zone.getNetworkType() == NetworkType.Advanced))) { List ips = null; if (network.getVpcId() != null) { @@ -1042,7 +1081,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra // network id instead of the physical network id. // So just throw this exception as is. We may need to TBD by changing the serializer. throw new CloudRuntimeException("Service provider " + element.getProvider().getName() + " either doesn't exist or is not enabled in physical network id: " + - network.getPhysicalNetworkId()); + network.getPhysicalNetworkId()); } if (s_logger.isDebugEnabled()) { @@ -1063,7 +1102,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra s_logger.warn("Failed to re-program the network as a part of network " + network + " implement"); // see DataCenterVO.java ResourceUnavailableException ex = new ResourceUnavailableException("Unable to apply network rules as a part of network " + network + " implement", DataCenter.class, - network.getDataCenterId()); + network.getDataCenterId()); ex.addProxyObject(_entityMgr.findById(DataCenter.class, network.getDataCenterId()).getUuid()); throw ex; } @@ -1097,7 +1136,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra //there are no egress rules then apply the default egress rule DataCenter zone = _dcDao.findById(network.getDataCenterId()); if (offering.getEgressDefaultPolicy() && _networkModel.areServicesSupportedInNetwork(network.getId(), Service.Firewall) && - (network.getGuestType() == Network.GuestType.Isolated || (network.getGuestType() == Network.GuestType.Shared && zone.getNetworkType() == NetworkType.Advanced))) { + (network.getGuestType() == Network.GuestType.Isolated || (network.getGuestType() == Network.GuestType.Shared && zone.getNetworkType() == NetworkType.Advanced))) { // add default egress rule to accept the traffic _firewallMgr.applyDefaultEgressFirewallRule(network.getId(), true); } @@ -1154,11 +1193,11 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra } protected boolean prepareElement(NetworkElement element, Network network, NicProfile profile, VirtualMachineProfile vmProfile, DeployDestination dest, - ReservationContext context) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException { + ReservationContext context) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException { element.prepare(network, profile, vmProfile, dest, context); if (vmProfile.getType() == Type.User && element.getProvider() != null) { if (_networkModel.areServicesSupportedInNetwork(network.getId(), Service.Dhcp) && - _networkModel.isProviderSupportServiceInNetwork(network.getId(), Service.Dhcp, element.getProvider()) && element instanceof DhcpServiceProvider) { + _networkModel.isProviderSupportServiceInNetwork(network.getId(), Service.Dhcp, element.getProvider()) && element instanceof DhcpServiceProvider) { DhcpServiceProvider sp = (DhcpServiceProvider)element; Map dhcpCapabilities = element.getCapabilities().get(Service.Dhcp); String supportsMultipleSubnets = dhcpCapabilities.get(Capability.DhcpAccrossMultipleSubnets); @@ -1170,7 +1209,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra sp.addDhcpEntry(network, profile, vmProfile, dest, context); } if (_networkModel.areServicesSupportedInNetwork(network.getId(), Service.UserData) && - _networkModel.isProviderSupportServiceInNetwork(network.getId(), Service.UserData, element.getProvider()) && element instanceof UserDataServiceProvider) { + _networkModel.isProviderSupportServiceInNetwork(network.getId(), Service.UserData, element.getProvider()) && element instanceof UserDataServiceProvider) { UserDataServiceProvider sp = (UserDataServiceProvider)element; sp.addPasswordAndUserdata(network, profile, vmProfile, dest, context); } @@ -1184,14 +1223,14 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra @Override public void doInTransactionWithoutResult(TransactionStatus status) { _nicDao.update(nic.getId(), nic); - + if (nic.getVmType() == VirtualMachine.Type.User) { s_logger.debug("Changing active number of nics for network id=" + networkId + " on " + count); _networksDao.changeActiveNicsBy(networkId, count); } - + if (nic.getVmType() == VirtualMachine.Type.User || - (nic.getVmType() == VirtualMachine.Type.DomainRouter && _networksDao.findById(networkId).getTrafficType() == TrafficType.Guest)) { + (nic.getVmType() == VirtualMachine.Type.DomainRouter && _networksDao.findById(networkId).getTrafficType() == TrafficType.Guest)) { _networksDao.setCheckForGc(networkId); } } @@ -1200,7 +1239,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra @Override public void prepare(VirtualMachineProfile vmProfile, DeployDestination dest, ReservationContext context) throws InsufficientCapacityException, ConcurrentOperationException, - ResourceUnavailableException { + ResourceUnavailableException { List nics = _nicDao.listByVmId(vmProfile.getId()); // we have to implement default nics first - to ensure that default network elements start up first in multiple @@ -1232,8 +1271,8 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra @Override public NicProfile prepareNic(VirtualMachineProfile vmProfile, DeployDestination dest, ReservationContext context, long nicId, Network network) - throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException, ConcurrentOperationException, InsufficientCapacityException, - ResourceUnavailableException { + throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException, ConcurrentOperationException, InsufficientCapacityException, + ResourceUnavailableException { Integer networkRate = _networkModel.getNetworkRate(network.getId(), vmProfile.getId()); NetworkGuru guru = AdapterBase.getAdapterByName(_networkGurus, network.getGuruName()); @@ -1253,7 +1292,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra profile = new NicProfile(nic, network, broadcastUri, isolationUri, - networkRate, _networkModel.isSecurityGroupSupportedInNetwork(network), _networkModel.getNetworkTag(vmProfile.getHypervisorType(), network)); + networkRate, _networkModel.isSecurityGroupSupportedInNetwork(network), _networkModel.getNetworkTag(vmProfile.getHypervisorType(), network)); guru.reserve(profile, network, vmProfile, dest, context); nic.setIp4Address(profile.getIp4Address()); nic.setAddressFormat(profile.getFormat()); @@ -1273,7 +1312,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra updateNic(nic, network.getId(), 1); } else { profile = new NicProfile(nic, network, nic.getBroadcastUri(), nic.getIsolationUri(), networkRate, _networkModel.isSecurityGroupSupportedInNetwork(network), - _networkModel.getNetworkTag(vmProfile.getHypervisorType(), network)); + _networkModel.getNetworkTag(vmProfile.getHypervisorType(), network)); guru.updateNicProfile(profile, network); nic.setState(Nic.State.Reserved); updateNic(nic, network.getId(), 1); @@ -1284,7 +1323,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra if (providersToImplement.contains(element.getProvider())) { if (!_networkModel.isProviderEnabledInPhysicalNetwork(_networkModel.getPhysicalNetworkId(network), element.getProvider().getName())) { throw new CloudRuntimeException("Service provider " + element.getProvider().getName() + " either doesn't exist or is not enabled in physical network id: " + - network.getPhysicalNetworkId()); + network.getPhysicalNetworkId()); } if (s_logger.isDebugEnabled()) { s_logger.debug("Asking " + element.getName() + " to prepare for " + nic); @@ -1310,7 +1349,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra NetworkGuru guru = AdapterBase.getAdapterByName(_networkGurus, network.getGuruName()); NicProfile profile = new NicProfile(nic, network, nic.getBroadcastUri(), nic.getIsolationUri(), networkRate, _networkModel.isSecurityGroupSupportedInNetwork(network), - _networkModel.getNetworkTag(vm.getHypervisorType(), network)); + _networkModel.getNetworkTag(vm.getHypervisorType(), network)); if (guru instanceof NetworkMigrationResponder) { if (!((NetworkMigrationResponder)guru).prepareMigration(profile, network, vm, dest, context)) { s_logger.error("NetworkGuru " + guru + " prepareForMigration failed."); // XXX: Transaction error @@ -1321,7 +1360,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra if (providersToImplement.contains(element.getProvider())) { if (!_networkModel.isProviderEnabledInPhysicalNetwork(_networkModel.getPhysicalNetworkId(network), element.getProvider().getName())) { throw new CloudRuntimeException("Service provider " + element.getProvider().getName() + " either doesn't exist or is not enabled in physical network id: " + - network.getPhysicalNetworkId()); + network.getPhysicalNetworkId()); } if (element instanceof NetworkMigrationResponder) { if (!((NetworkMigrationResponder)element).prepareMigration(profile, network, vm, dest, context)) { @@ -1361,7 +1400,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra if (providersToImplement.contains(element.getProvider())) { if (!_networkModel.isProviderEnabledInPhysicalNetwork(_networkModel.getPhysicalNetworkId(network), element.getProvider().getName())) { throw new CloudRuntimeException("Service provider " + element.getProvider().getName() + " either doesn't exist or is not enabled in physical network id: " + - network.getPhysicalNetworkId()); + network.getPhysicalNetworkId()); } if (element instanceof NetworkMigrationResponder) { ((NetworkMigrationResponder)element).commitMigration(nicSrc, network, src, src_context, dst_context); @@ -1392,7 +1431,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra if (providersToImplement.contains(element.getProvider())) { if (!_networkModel.isProviderEnabledInPhysicalNetwork(_networkModel.getPhysicalNetworkId(network), element.getProvider().getName())) { throw new CloudRuntimeException("Service provider " + element.getProvider().getName() + " either doesn't exist or is not enabled in physical network id: " + - network.getPhysicalNetworkId()); + network.getPhysicalNetworkId()); } if (element instanceof NetworkMigrationResponder) { ((NetworkMigrationResponder)element).rollbackMigration(nicDst, network, dst, src_context, dst_context); @@ -1436,7 +1475,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra nic.setState(Nic.State.Releasing); _nicDao.update(nic.getId(), nic); NicProfile profile = new NicProfile(nic, network, nic.getBroadcastUri(), nic.getIsolationUri(), null, _networkModel.isSecurityGroupSupportedInNetwork(network), - _networkModel.getNetworkTag(vmProfile.getHypervisorType(), network)); + _networkModel.getNetworkTag(vmProfile.getHypervisorType(), network)); if (guru.release(profile, vmProfile, nic.getReservationId())) { applyProfileToNicForRelease(nic, profile); nic.setState(Nic.State.Allocated); @@ -1466,7 +1505,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra if (providersToImplement.contains(element.getProvider())) { if (!_networkModel.isProviderEnabledInPhysicalNetwork(_networkModel.getPhysicalNetworkId(network), element.getProvider().getName())) { throw new CloudRuntimeException("Service provider " + element.getProvider().getName() + - " either doesn't exist or is not enabled in physical network id: " + network.getPhysicalNetworkId()); + " either doesn't exist or is not enabled in physical network id: " + network.getPhysicalNetworkId()); } if (s_logger.isDebugEnabled()) { s_logger.debug("Asking " + element.getName() + " to release " + profile); @@ -1501,7 +1540,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra _nicDao.update(nic.getId(), nic); NetworkVO network = _networksDao.findById(nic.getNetworkId()); NicProfile profile = new NicProfile(nic, network, null, null, null, _networkModel.isSecurityGroupSupportedInNetwork(network), _networkModel.getNetworkTag( - vm.getHypervisorType(), network)); + vm.getHypervisorType(), network)); /* * We need to release the nics with a Create ReservationStrategy here @@ -1513,7 +1552,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra if (providersToImplement.contains(element.getProvider())) { if (!_networkModel.isProviderEnabledInPhysicalNetwork(_networkModel.getPhysicalNetworkId(network), element.getProvider().getName())) { throw new CloudRuntimeException("Service provider " + element.getProvider().getName() + " either doesn't exist or is not enabled in physical network id: " + - network.getPhysicalNetworkId()); + network.getPhysicalNetworkId()); } if (s_logger.isDebugEnabled()) { s_logger.debug("Asking " + element.getName() + " to release " + nic); @@ -1531,7 +1570,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra // remove the dhcpservice ip if this is the last nic in subnet. if (vm.getType() == Type.User && isDhcpAccrossMultipleSubnetsSupported(network) && isLastNicInSubnet(nic) && network.getTrafficType() == TrafficType.Guest && - network.getGuestType() == GuestType.Shared) { + network.getGuestType() == GuestType.Shared) { removeDhcpServiceInSubnet(nic); } NetworkGuru guru = AdapterBase.getAdapterByName(_networkGurus, network.getGuruName()); @@ -1546,9 +1585,9 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra public boolean isDhcpAccrossMultipleSubnetsSupported(Network network) { if (!_networkModel.areServicesSupportedInNetwork(network.getId(), Service.Dhcp)) { - return false; + return false; } - + DhcpServiceProvider dhcpServiceProvider = getDhcpServiceProvider(network); Map capabilities = dhcpServiceProvider.getCapabilities().get(Network.Service.Dhcp); String supportsMultipleSubnets = capabilities.get(Network.Capability.DhcpAccrossMultipleSubnets); @@ -1577,9 +1616,9 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra Transaction.execute(new TransactionCallbackNoReturn() { @Override public void doInTransactionWithoutResult(TransactionStatus status) { - _nicIpAliasDao.update(ipAlias.getId(), ipAlias); - IPAddressVO aliasIpaddressVo = _publicIpAddressDao.findByIpAndSourceNetworkId(ipAlias.getNetworkId(), ipAlias.getIp4Address()); - _publicIpAddressDao.unassignIpAddress(aliasIpaddressVo.getId()); + _nicIpAliasDao.update(ipAlias.getId(), ipAlias); + IPAddressVO aliasIpaddressVo = _publicIpAddressDao.findByIpAndSourceNetworkId(ipAlias.getNetworkId(), ipAlias.getIp4Address()); + _publicIpAddressDao.unassignIpAddress(aliasIpaddressVo.getId()); } }); if (!dhcpServiceProvider.removeDhcpSupportForSubnet(network)) { @@ -1604,8 +1643,8 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra @Override @DB public Network createGuestNetwork(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) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException { + 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) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException { final NetworkOfferingVO ntwkOff = _networkOfferingDao.findById(networkOfferingId); // this method supports only guest network creation @@ -1662,7 +1701,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra // 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"); + Service.SourceNat.getName() + " service are allowed"); } if (domainId == null || domainId != Domain.ROOT_DOMAIN) { @@ -1725,7 +1764,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra //don't allow to specify vlan tag used by physical network for dynamic vlan allocation if (_dcDao.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()); + zone.getName()); } String uri = BroadcastDomainType.fromString(vlanId).toString(); // For Isolated networks, don't allow to create network with vlan that already exists in the zone @@ -1753,7 +1792,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra 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()); + owner.getAccountName()); } } } @@ -1772,7 +1811,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra // If networkDomain is not specified, take it from the global configuration if (_networkModel.areServicesSupportedByNetworkOffering(networkOfferingId, Service.Dns)) { Map dnsCapabilities = _networkModel.getNetworkOfferingServiceCapabilities(_entityMgr.findById(NetworkOffering.class, networkOfferingId), - Service.Dns); + Service.Dns); String isUpdateDnsSupported = dnsCapabilities.get(Capability.AllowDnsSuffixModification); if (isUpdateDnsSupported == null || !Boolean.valueOf(isUpdateDnsSupported)) { if (networkDomain != null) { @@ -1797,9 +1836,9 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra // 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 \"-\""); + "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 \"-\""); } } } @@ -1809,12 +1848,12 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra // limitation, remove after we introduce support for multiple ip ranges // with different Cidrs for the same Shared network boolean cidrRequired = zone.getNetworkType() == NetworkType.Advanced && - ntwkOff.getTrafficType() == TrafficType.Guest && - (ntwkOff.getGuestType() == GuestType.Shared || (ntwkOff.getGuestType() == GuestType.Isolated && !_networkModel.areServicesSupportedByNetworkOffering( - ntwkOff.getId(), Service.SourceNat))); + 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 " + Network.GuestType.Shared + - " and network of type " + GuestType.Isolated + " with service " + Service.SourceNat.getName() + " disabled"); + " and network of type " + GuestType.Isolated + " with service " + Service.SourceNat.getName() + " disabled"); } // No cidr can be specified in Basic zone @@ -1842,38 +1881,38 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra DataCenterDeployment plan = new DataCenterDeployment(zoneId, null, null, null, null, physicalNetworkId); NetworkVO userNetwork = new NetworkVO(); userNetwork.setNetworkDomain(networkDomainFinal); - + if (cidr != null && gateway != null) { userNetwork.setCidr(cidr); userNetwork.setGateway(gateway); } - + if (ip6Cidr != null && ip6Gateway != null) { userNetwork.setIp6Cidr(ip6Cidr); userNetwork.setIp6Gateway(ip6Gateway); } - + if (vlanIdFinal != null) { - if (isolatedPvlan == null) { + if (isolatedPvlan == null) { 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); - } - } - + 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); + } + } + List networks = setupNetwork(owner, ntwkOff, userNetwork, plan, name, displayText, true, domainId, aclType, subdomainAccessFinal, vpcId, - isDisplayNetworkEnabled); - + isDisplayNetworkEnabled); + Network network = null; if (networks == null || networks.isEmpty()) { throw new CloudRuntimeException("Fail to create a network"); @@ -1891,11 +1930,11 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra network = networks.get(0); } } - + if (updateResourceCount) { _resourceLimitMgr.incrementResourceCount(owner.getId(), ResourceType.network); } - + return network; } }); @@ -1966,7 +2005,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra NetworkGuru guru = AdapterBase.getAdapterByName(_networkGurus, networkFinal.getGuruName()); NetworkProfile profile = convertNetworkToNetworkProfile(networkFinal.getId()); guru.shutdown(profile, _networkOfferingDao.findById(networkFinal.getNetworkOfferingId())); - + applyProfileToNetwork(networkFinal, profile); DataCenterVO zone = _dcDao.findById(networkFinal.getDataCenterId()); if (isSharedNetworkOfferingWithServices(networkFinal.getNetworkOfferingId()) && (zone.getNetworkType() == NetworkType.Advanced)) { @@ -2032,7 +2071,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra try { if (!_networkModel.isProviderEnabledInPhysicalNetwork(_networkModel.getPhysicalNetworkId(network), element.getProvider().getName())) { s_logger.warn("Unable to complete shutdown of the network elements due to element: " + element.getName() + - " either doesn't exist or not enabled in the physical network " + _networkModel.getPhysicalNetworkId(network)); + " either doesn't exist or not enabled in the physical network " + _networkModel.getPhysicalNetworkId(network)); success = false; } if (s_logger.isDebugEnabled()) { @@ -2120,7 +2159,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra try { if (!_networkModel.isProviderEnabledInPhysicalNetwork(_networkModel.getPhysicalNetworkId(network), element.getProvider().getName())) { s_logger.warn("Unable to complete destroy of the network elements due to element: " + element.getName() + - " either doesn't exist or not enabled in the physical network " + _networkModel.getPhysicalNetworkId(network)); + " either doesn't exist or not enabled in the physical network " + _networkModel.getPhysicalNetworkId(network)); success = false; } @@ -2156,9 +2195,9 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra @Override public void doInTransactionWithoutResult(TransactionStatus status) { NetworkGuru guru = AdapterBase.getAdapterByName(_networkGurus, networkFinal.getGuruName()); - + guru.trash(networkFinal, _networkOfferingDao.findById(networkFinal.getNetworkOfferingId())); - + if (!deleteVlansInNetwork(networkFinal.getId(), context.getCaller().getId(), callerAccount)) { s_logger.warn("Failed to delete network " + networkFinal + "; was unable to cleanup corresponding ip ranges"); throw new CloudRuntimeException("Failed to delete network " + networkFinal + "; was unable to cleanup corresponding ip ranges"); @@ -2173,12 +2212,12 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra NetworkDomainVO networkDomain = _networkDomainDao.getDomainNetworkMapByNetworkId(networkFinal.getId()); if (networkDomain != null) _networkDomainDao.remove(networkDomain.getId()); - + NetworkAccountVO networkAccount = _networkAccountDao.getAccountNetworkMapByNetworkId(networkFinal.getId()); if (networkAccount != null) _networkAccountDao.remove(networkAccount.getId()); } - + NetworkOffering ntwkOff = _entityMgr.findById(NetworkOffering.class, networkFinal.getNetworkOfferingId()); boolean updateResourceCount = resourceCountNeedsUpdate(ntwkOff, networkFinal.getAclType()); if (updateResourceCount) { @@ -2305,7 +2344,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra @Override public boolean startNetwork(long networkId, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException, - InsufficientCapacityException { + InsufficientCapacityException { // Check if network exists NetworkVO network = _networksDao.findById(networkId); @@ -2328,7 +2367,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra @Override public boolean restartNetwork(Long networkId, Account callerAccount, User callerUser, boolean cleanup) throws ConcurrentOperationException, ResourceUnavailableException, - InsufficientCapacityException { + InsufficientCapacityException { NetworkVO network = _networksDao.findById(networkId); @@ -2427,7 +2466,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra assert (network != null); DataCenter zone = _entityMgr.findById(DataCenter.class, network.getDataCenterId()); if (network.getGuestType() == Network.GuestType.Shared && zone.getNetworkType() == NetworkType.Advanced && - isSharedNetworkOfferingWithServices(network.getNetworkOfferingId())) { + isSharedNetworkOfferingWithServices(network.getNetworkOfferingId())) { return true; } return false; @@ -2436,11 +2475,11 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra protected boolean isSharedNetworkOfferingWithServices(long networkOfferingId) { NetworkOfferingVO networkOffering = _networkOfferingDao.findById(networkOfferingId); if ((networkOffering.getGuestType() == Network.GuestType.Shared) && - (_networkModel.areServicesSupportedByNetworkOffering(networkOfferingId, Service.SourceNat) || - _networkModel.areServicesSupportedByNetworkOffering(networkOfferingId, Service.StaticNat) || - _networkModel.areServicesSupportedByNetworkOffering(networkOfferingId, Service.Firewall) || - _networkModel.areServicesSupportedByNetworkOffering(networkOfferingId, Service.PortForwarding) || _networkModel.areServicesSupportedByNetworkOffering( - networkOfferingId, Service.Lb))) { + (_networkModel.areServicesSupportedByNetworkOffering(networkOfferingId, Service.SourceNat) || + _networkModel.areServicesSupportedByNetworkOffering(networkOfferingId, Service.StaticNat) || + _networkModel.areServicesSupportedByNetworkOffering(networkOfferingId, Service.Firewall) || + _networkModel.areServicesSupportedByNetworkOffering(networkOfferingId, Service.PortForwarding) || _networkModel.areServicesSupportedByNetworkOffering( + networkOfferingId, Service.Lb))) { return true; } return false; @@ -2872,7 +2911,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra if (checkPhysicalNetwork) { if (!_pNSPDao.isServiceProviderEnabled(physicalNetworkId, provider, service)) { throw new UnsupportedServiceException("Provider " + provider + " is either not enabled or doesn't " + "support service " + service + - " in physical network id=" + physicalNetworkId); + " in physical network id=" + physicalNetworkId); } } @@ -2928,8 +2967,8 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra @Override public NicProfile createNicForVm(Network network, NicProfile requested, ReservationContext context, VirtualMachineProfile vmProfile, boolean prepare) - throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException, ConcurrentOperationException, InsufficientCapacityException, - ResourceUnavailableException { + throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException, ConcurrentOperationException, InsufficientCapacityException, + ResourceUnavailableException { VirtualMachine vm = vmProfile.getVirtualMachine(); DataCenter dc = _entityMgr.findById(DataCenter.class, network.getDataCenterId()); @@ -2973,7 +3012,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra NetworkGuru guru = AdapterBase.getAdapterByName(_networkGurus, network.getGuruName()); NicProfile profile = new NicProfile(nic, network, nic.getBroadcastUri(), nic.getIsolationUri(), networkRate, - _networkModel.isSecurityGroupSupportedInNetwork(network), _networkModel.getNetworkTag(vm.getHypervisorType(), network)); + _networkModel.isSecurityGroupSupportedInNetwork(network), _networkModel.getNetworkTag(vm.getHypervisorType(), network)); guru.updateNicProfile(profile, network); profiles.add(profile); } @@ -3115,12 +3154,51 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra } public static final ConfigKey NetworkGcWait = new ConfigKey(Integer.class, "network.gc.wait", "Advanced", "600", - "Time (in seconds) to wait before shutting down a network that's not in used", false); + "Time (in seconds) to wait before shutting down a network that's not in used", false); public static final ConfigKey NetworkGcInterval = new ConfigKey(Integer.class, "network.gc.interval", "Advanced", "600", - "Seconds to wait before checking for networks to shutdown", true); + "Seconds to wait before checking for networks to shutdown", true); @Override public ConfigKey[] getConfigKeys() { return new ConfigKey[] {NetworkGcWait, NetworkGcInterval, NetworkLockTimeout, GuestDomainSuffix, NetworkThrottlingRate}; } + + /* + * Returns a list of network gurus that report being able to support a certain combination of networking types. + */ + private List getSupportedNetworkGurus(NetworkType networkType, TrafficType trafficType, GuestType guestType, + List isolationMethods) { + List gurus = new ArrayList(); + + for (NetworkGuru guru : _networkGurus ) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Considering " + guru.getName() + " for networkType " + networkType.toString() + ", trafficType " + + trafficType.toString() + ", guestType " + ((guestType != null) ? guestType.toString() : "none") + + ", isolationTypes " + + StringUtils.join(isolationMethods.toArray())); + } + if (s_logger.isDebugEnabled()) { + s_logger.debug(" -- networkType " + networkType.toString() + ":" + guru.getSupportedNetworkTypes().contains(networkType)); + s_logger.debug(" -- trafficType " + trafficType.toString() + ":" + guru.getSupportedTrafficTypes().contains(trafficType)); + s_logger.debug(" -- isolationMethod " + StringUtils.join(isolationMethods.toArray()) + ":" + + guru.getSupportedTrafficTypes().contains(trafficType)); + } + if (guru.getSupportedNetworkTypes().contains(networkType) && guru.getSupportedTrafficTypes().contains(trafficType) + && !Collections.disjoint(guru.getSupportedIsolationMethods(), isolationMethods)) { + /* + * If it is guest traffic type, we need to check the guest type + * as well + */ + if (trafficType == TrafficType.Guest) { + if (guru.getSupportedGuestTypes().contains(guestType)) { + gurus.add(guru); + } + } else { + gurus.add(guru); + } + } + } + + return gurus; + } }