-add check to ensure 'Connectivity' service provider specified in createVpcOffering actually supports 'DistributedRouter' capability
- enable OVS to support 'DistributedRouter' capability Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/e3ec12e5 Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/e3ec12e5 Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/e3ec12e5 Branch: refs/heads/resize-root Commit: e3ec12e5d051d7faa6ea12c1bc6f1d1d1d2daf3e Parents: 7c4443e Author: Murali Reddy <[email protected]> Authored: Tue Mar 4 17:17:18 2014 +0530 Committer: Murali Reddy <[email protected]> Committed: Fri Mar 14 16:56:35 2014 +0530 ---------------------------------------------------------------------- .../com/cloud/network/element/OvsElement.java | 5 +- .../com/cloud/network/vpc/VpcManagerImpl.java | 52 ++++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e3ec12e5/plugins/network-elements/ovs/src/com/cloud/network/element/OvsElement.java ---------------------------------------------------------------------- diff --git a/plugins/network-elements/ovs/src/com/cloud/network/element/OvsElement.java b/plugins/network-elements/ovs/src/com/cloud/network/element/OvsElement.java index 03eeedd..05e81a1 100644 --- a/plugins/network-elements/ovs/src/com/cloud/network/element/OvsElement.java +++ b/plugins/network-elements/ovs/src/com/cloud/network/element/OvsElement.java @@ -246,7 +246,10 @@ StaticNatServiceProvider, IpDeployer { Map<Service, Map<Capability, String>> capabilities = new HashMap<Service, Map<Capability, String>>(); // L2 Support : SDN provisioning - capabilities.put(Service.Connectivity, null); + Map<Capability, String> connectivityCapabilities = new HashMap<Capability, String>(); + connectivityCapabilities.put(Capability.DistributedRouter, null); + capabilities.put(Service.Connectivity, connectivityCapabilities); + // L3 Support : Port Forwarding capabilities.put(Service.PortForwarding, null); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e3ec12e5/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 8c7b5fb..16a8399 100644 --- a/server/src/com/cloud/network/vpc/VpcManagerImpl.java +++ b/server/src/com/cloud/network/vpc/VpcManagerImpl.java @@ -65,6 +65,7 @@ import com.cloud.exception.PermissionDeniedException; import com.cloud.exception.ResourceAllocationException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.hypervisor.Hypervisor.HypervisorType; +import com.cloud.network.element.NetworkElement; import com.cloud.network.IpAddress; import com.cloud.network.IpAddressManager; import com.cloud.network.Network; @@ -376,6 +377,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis } } + validateConnectivtyServiceCapablitlies(svcProviderMap.get(Service.Connectivity), serviceCapabilitystList); boolean supportsDistributedRouter = isVpcOfferingSupportsDistributedRouter(serviceCapabilitystList); VpcOffering offering = createVpcOffering(name, displayText, svcProviderMap, false, null, @@ -460,6 +462,56 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis return supportsDistributedRouter; } + 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("DistributedRouter")) { + throw new InvalidParameterValueException("Invalid Capability:" + capabilityName + " specified. Only 'DistributedRouter' 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.DistributedRouter))) { + throw new InvalidParameterValueException("Provider: " + provider.getName() + " does not support " + + Network.Capability.DistributedRouter.getName() + " capability."); + } + } + } + } + } + } + @Override public Vpc getActiveVpc(long vpcId) { return _vpcDao.getActiveVpcById(vpcId);
