adds check to ensure 'Connectivity' service provider supports 'StretchedL2Subnet' and 'RegionLevelVpc' capabilities when specified in createNetworkOffering and createVpcOffering respectivley
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/dd380bbf Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/dd380bbf Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/dd380bbf Branch: refs/heads/regionvpc Commit: dd380bbf65622e47b00f8ddca0e56036b0b4797c Parents: 09fb3d4 Author: Murali Reddy <[email protected]> Authored: Fri Jan 24 17:56:04 2014 +0530 Committer: Murali Reddy <[email protected]> Committed: Tue Mar 11 19:44:43 2014 +0530 ---------------------------------------------------------------------- .../configuration/ConfigurationManagerImpl.java | 19 +++++++- .../com/cloud/network/vpc/VpcManagerImpl.java | 51 ++++++++++++++++++++ 2 files changed, 68 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dd380bbf/server/src/com/cloud/configuration/ConfigurationManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index 2757382..5e167be 100755 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -16,6 +16,7 @@ // under the License. package com.cloud.configuration; +import com.cloud.network.element.NetworkElement; import java.net.URI; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -3817,7 +3818,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati throw new InvalidParameterValueException("Capabilities for 'Connectivity' service can be specified " + "only when Connectivity service is enabled for network offering."); } - validateConnectivityServiceCapablities(connectivityServiceCapabilityMap); + validateConnectivityServiceCapablities(serviceProviderMap.get(Service.Connectivity), connectivityServiceCapabilityMap); Map<Service, Map<Capability, String>> serviceCapabilityMap = new HashMap<Service, Map<Capability, String>>(); serviceCapabilityMap.put(Service.Lb, lbServiceCapabilityMap); @@ -3958,7 +3959,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati } } - void validateConnectivityServiceCapablities(Map<Capability, String> connectivityServiceCapabilityMap) { + void validateConnectivityServiceCapablities(Set<Provider> providers, Map<Capability, String> connectivityServiceCapabilityMap) { if (connectivityServiceCapabilityMap != null && !connectivityServiceCapabilityMap.isEmpty()) { for (Capability capability: connectivityServiceCapabilityMap.keySet()) { if (capability == Capability.StretchedL2Subnet) { @@ -3973,6 +3974,20 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati } } } + + if (providers != null && !providers.isEmpty()) { + for (Provider provider: providers) { + NetworkElement element = _networkModel.getElementImplementingProvider(provider.getName()); + Map<Service, Map<Capability, String>> capabilities = element.getCapabilities(); + if (capabilities != null && !capabilities.isEmpty()) { + Map<Capability, String> connectivityCapabilities = capabilities.get(Service.Connectivity); + if (connectivityCapabilities == null || (connectivityCapabilities != null && !connectivityCapabilities.keySet().contains(Capability.StretchedL2Subnet))) { + throw new InvalidParameterValueException("Provider: " + provider.getName() + " does not support " + + Capability.StretchedL2Subnet.getName()); + } + } + } + } } @Override @DB http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dd380bbf/server/src/com/cloud/network/vpc/VpcManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/com/cloud/network/vpc/VpcManagerImpl.java index b8d6478..881a876 100644 --- a/server/src/com/cloud/network/vpc/VpcManagerImpl.java +++ b/server/src/com/cloud/network/vpc/VpcManagerImpl.java @@ -17,6 +17,7 @@ package com.cloud.network.vpc; +import com.cloud.network.element.NetworkElement; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -379,6 +380,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis } } + validateConnectivtyServiceCapablitlies(svcProviderMap.get(Service.Connectivity), serviceCapabilitystList); boolean offersRegionLevelVPC = isVpcOfferingForRegionLevelVpc(serviceCapabilitystList); VpcOffering offering = createVpcOffering(name, displayText, svcProviderMap, false, null, serviceOfferingId, offersRegionLevelVPC); @@ -422,6 +424,55 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis }); } + private void validateConnectivtyServiceCapablitlies(Set<Provider> providers, Map serviceCapabilitystList) { + + if (serviceCapabilitystList != null && !serviceCapabilitystList.isEmpty()) { + Collection serviceCapabilityCollection = serviceCapabilitystList.values(); + Iterator iter = serviceCapabilityCollection.iterator(); + Map<Network.Capability, String> capabilityMap = null; + + while (iter.hasNext()) { + HashMap<String, String> svcCapabilityMap = (HashMap<String, String>)iter.next(); + Network.Capability capability = null; + String svc = svcCapabilityMap.get("service"); + String capabilityName = svcCapabilityMap.get("capabilitytype"); + String capabilityValue = svcCapabilityMap.get("capabilityvalue"); + if (capabilityName != null) { + capability = Network.Capability.getCapability(capabilityName); + } + + if ((capability == null) || (capabilityName == null) || (capabilityValue == null)) { + throw new InvalidParameterValueException("Invalid capability:" + capabilityName + " capability value:" + capabilityValue); + } + + if (!svc.equalsIgnoreCase(Service.Connectivity.getName())) { + throw new InvalidParameterValueException("Invalid Service:" + svc + " specified. Only for 'Connectivity' service capabilities can be specified"); + } + + if (!capabilityName.equalsIgnoreCase("RegionLevelVpc")) { + throw new InvalidParameterValueException("Invalid Capability:" + capabilityName + " specified. Only 'RegionLevelVpc' capability can be specified."); + } + + if (!capabilityValue.equalsIgnoreCase("true") && capabilityValue.equalsIgnoreCase("false")) { + throw new InvalidParameterValueException("Invalid Capability value:" + capabilityValue + " specified."); + } + } + } + + if (providers != null && !providers.isEmpty()) { + for (Provider provider: providers) { + NetworkElement element = _ntwkModel.getElementImplementingProvider(provider.getName()); + Map<Service, Map<Network.Capability, String>> capabilities = element.getCapabilities(); + if (capabilities != null && !capabilities.isEmpty()) { + Map<Network.Capability, String> connectivityCapabilities = capabilities.get(Service.Connectivity); + if (connectivityCapabilities == null || (connectivityCapabilities != null && !connectivityCapabilities.keySet().contains(Network.Capability.RegionLevelVpc))) { + throw new InvalidParameterValueException("Provider: " + provider.getName() + " does not support " + + Network.Capability.RegionLevelVpc.getName()); + } + } + } + } + } private boolean isVpcOfferingForRegionLevelVpc(Map serviceCapabilitystList) { boolean offersRegionLevelVPC = false; if (serviceCapabilitystList != null && !serviceCapabilitystList.isEmpty()) {
