createNetworkOffering: verify that individual services can be enabled for each provider specified for the network offering

This commit is contained in:
Alena Prokharchyk 2011-11-18 14:42:20 -08:00
parent 3d6a87867a
commit 5ea4133d7b
3 changed files with 54 additions and 12 deletions

View File

@ -2941,12 +2941,17 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura
}
// populate providers
Map<Provider, Set<Service>> providerCombinationToVerify = new HashMap<Provider, Set<Service>>();
Map<String, List<String>> svcPrv = cmd.getServiceProviders();
if (svcPrv != null) {
for (String serviceStr : svcPrv.keySet()) {
Network.Service service = Network.Service.getService(serviceStr);
if (serviceProviderMap.containsKey(service)) {
Set<Provider> providers = new HashSet<Provider>();
//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<Service> serviceSet = null;
if (providerCombinationToVerify.get(provider) == null) {
serviceSet = new HashSet<Service>();
} 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<Capability, String> lbServiceCapabilityMap = cmd.getServiceCapabilities(Service.Lb);
@ -3509,5 +3525,4 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura
return null;
}
}

View File

@ -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<Provider, Set<Service>> providersMap);
}

View File

@ -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<Service>(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<Provider, Set<Service>> 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<Service> 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());
}
}
}
}
}
}