From 5ea4133d7b185c9acb9bbd89cc35eb3ba4842719 Mon Sep 17 00:00:00 2001 From: Alena Prokharchyk Date: Fri, 18 Nov 2011 14:42:20 -0800 Subject: [PATCH] createNetworkOffering: verify that individual services can be enabled for each provider specified for the network offering --- .../ConfigurationManagerImpl.java | 19 ++++++++- .../src/com/cloud/network/NetworkManager.java | 7 +++- .../com/cloud/network/NetworkManagerImpl.java | 40 +++++++++++++++---- 3 files changed, 54 insertions(+), 12 deletions(-) diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index 23629750bce..e688c775bca 100755 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -2941,12 +2941,17 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura } // populate providers + Map> providerCombinationToVerify = new HashMap>(); Map> svcPrv = cmd.getServiceProviders(); if (svcPrv != null) { for (String serviceStr : svcPrv.keySet()) { Network.Service service = Network.Service.getService(serviceStr); if (serviceProviderMap.containsKey(service)) { Set providers = new HashSet(); + //in Acton, don't allow to specify more than 1 provider per service + if (svcPrv.get(serviceStr) != null && svcPrv.get(serviceStr).size() > 1) { + throw new InvalidParameterValueException("In the current release only one provider can be specified for the service"); + } for (String prvNameStr : svcPrv.get(serviceStr)) { // check if provider is supported Network.Provider provider; @@ -2955,6 +2960,16 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura throw new InvalidParameterValueException("Invalid service provider: " + prvNameStr); } providers.add(provider); + + Set serviceSet = null; + if (providerCombinationToVerify.get(provider) == null) { + serviceSet = new HashSet(); + } else { + serviceSet = providerCombinationToVerify.get(provider); + } + serviceSet.add(service); + providerCombinationToVerify.put(provider, serviceSet); + } serviceProviderMap.put(service, providers); } else { @@ -2963,7 +2978,8 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura } } - //validate + //validate providers combination here + _networkMgr.canProviderSupportServices(providerCombinationToVerify); // verify the LB service capabilities specified in the network offering Map lbServiceCapabilityMap = cmd.getServiceCapabilities(Service.Lb); @@ -3509,5 +3525,4 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura return null; } - } diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java index b72463360e5..d8eba6d5fc8 100644 --- a/server/src/com/cloud/network/NetworkManager.java +++ b/server/src/com/cloud/network/NetworkManager.java @@ -21,6 +21,7 @@ package com.cloud.network; import java.util.List; import java.util.Map; +import java.util.Set; import com.cloud.acl.ControlledEntity.ACLType; import com.cloud.dc.Vlan; @@ -244,7 +245,9 @@ public interface NetworkManager extends NetworkService { Long getPhysicalNetworkId(Network network); - boolean getAllowSubdomainAccessGlobal(); + boolean getAllowSubdomainAccessGlobal(); + + boolean isProviderForNetwork(Provider provider, long networkId); - boolean isProviderForNetwork(Provider provider, long networkId); + void canProviderSupportServices(Map> providersMap); } diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index ed5410a96d2..7dbea5968e6 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -4175,7 +4175,6 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag if (addGatewayService) { services.add(Service.Gateway); } - }else{ //enable all the default services supported by this element. services = new ArrayList(element.getCapabilities().keySet()); @@ -5032,12 +5031,37 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag @Override public boolean isProviderForNetwork(Provider provider, long networkId) { - if (_ntwkSrvcDao.isProviderForNetwork(networkId, provider) != null) { - return true; - } else { - return false; - } + if (_ntwkSrvcDao.isProviderForNetwork(networkId, provider) != null) { + return true; + } else { + return false; + } + } + + @Override + public void canProviderSupportServices(Map> providersMap) { + for (Provider provider : providersMap.keySet()) { + //check if services can be turned off + NetworkElement element = getElementImplementingProvider(provider.getName()); + if(element == null){ + throw new InvalidParameterValueException("Unable to find the Network Element implementing the Service Provider '" + provider.getName() + "'"); + } + + Set enabledServices = providersMap.get(provider); + + if(enabledServices != null && !enabledServices.isEmpty()){ + if(!element.canEnableIndividualServices()){ + if(enabledServices.size() != element.getCapabilities().keySet().size()){ + throw new InvalidParameterValueException("Cannot enable subset of Services, Please specify the complete list of Services for this Service Provider '" + provider.getName() + "'"); + } + } + for(Service service : enabledServices){ + //check if the service is provided by this Provider + if(!element.getCapabilities().containsKey(service)){ + throw new UnsupportedServiceException(provider.getName() + " Provider cannot provide service " + service.getName()); + } + } + } + } } - - }