diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index c2c892f1f1b..6c4b61d5759 100755 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -63,7 +63,6 @@ import com.cloud.api.commands.UpdateNetworkOfferingCmd; import com.cloud.api.commands.UpdatePodCmd; import com.cloud.api.commands.UpdateServiceOfferingCmd; import com.cloud.api.commands.UpdateZoneCmd; -import com.cloud.capacity.Capacity; import com.cloud.capacity.dao.CapacityDao; import com.cloud.configuration.Resource.ResourceType; import com.cloud.configuration.dao.ConfigurationDao; @@ -113,7 +112,6 @@ import com.cloud.network.NetworkManager; import com.cloud.network.NetworkVO; import com.cloud.network.Networks.BroadcastDomainType; import com.cloud.network.Networks.TrafficType; -import com.cloud.network.PhysicalNetwork; import com.cloud.network.PhysicalNetworkVO; import com.cloud.network.dao.IPAddressDao; import com.cloud.network.dao.NetworkDao; @@ -3114,7 +3112,8 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura if ((lbServiceCapabilityMap != null) && (!lbServiceCapabilityMap.isEmpty())) { String isolationCapability = lbServiceCapabilityMap.get(Capability.SupportedLBIsolation); - if (isolationCapability != null) { + if (isolationCapability != null) { + _networkMgr.checkCapabilityForProvider(serviceProviderMap.get(Service.Lb), Service.Lb, Capability.SupportedLBIsolation, isolationCapability); dedicatedLb = isolationCapability.contains("dedicated"); } else { dedicatedLb = true; @@ -3127,6 +3126,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura if ((sourceNatServiceCapabilityMap != null) && (!sourceNatServiceCapabilityMap.isEmpty())) { String sourceNatType = sourceNatServiceCapabilityMap.get(Capability.SupportedSourceNatTypes.getName()); if (sourceNatType != null) { + _networkMgr.checkCapabilityForProvider(serviceProviderMap.get(Service.SourceNat), Service.SourceNat, Capability.SupportedSourceNatTypes, sourceNatType); sharedSourceNat = sourceNatType.contains("perzone"); } else { sharedSourceNat = false; @@ -3134,6 +3134,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura String param = sourceNatServiceCapabilityMap.get(Capability.RedundantRouter); if (param != null) { + _networkMgr.checkCapabilityForProvider(serviceProviderMap.get(Service.SourceNat), Service.SourceNat, Capability.RedundantRouter, param); redundantRouter = param.contains("true"); } else { redundantRouter = false; diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java index f9dab95e2e0..013f81d3f9b 100755 --- a/server/src/com/cloud/network/NetworkManager.java +++ b/server/src/com/cloud/network/NetworkManager.java @@ -273,4 +273,7 @@ public interface NetworkManager extends NetworkService { public boolean checkIpForService(IPAddressVO ip, Service service); void checkVirtualNetworkCidrOverlap(Long zoneId, String cidr); + + void checkCapabilityForProvider(Set providers, Service service, + Capability cap, String capValue); } diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 3bf308b3371..f6825c04f66 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -5754,4 +5754,34 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag return results; } + + @Override + public void checkCapabilityForProvider(Set providers, Service service, Capability cap, String capValue) { + for (Provider provider : providers) { + NetworkElement element = getElementImplementingProvider(provider.getName()); + if(element != null){ + Map> elementCapabilities = element.getCapabilities(); + if (elementCapabilities == null || !elementCapabilities.containsKey(service)) { + throw new UnsupportedServiceException("Service " + service.getName() + " is not supported by the element=" + element.getName() + " implementing Provider=" + provider.getName()); + } + Map serviceCapabilities = elementCapabilities.get(service); + if (serviceCapabilities == null || serviceCapabilities.isEmpty()) { + throw new UnsupportedServiceException("Service " + service.getName() + " doesn't have capabilites for element=" + element.getName() + " implementing Provider=" + provider.getName()); + } + + String value = serviceCapabilities.get(cap); + if (value == null || value.isEmpty()) { + throw new UnsupportedServiceException("Service " + service.getName() + " doesn't have capability " + cap.getName() + " for element=" + element.getName() + " implementing Provider=" + provider.getName()); + } + + capValue = capValue.toLowerCase(); + + if (!value.contains(capValue)) { + throw new UnsupportedServiceException("Service " + service.getName() + " doesn't support value " + capValue + " for capability " + cap.getName() + " for element=" + element.getName() + " implementing Provider=" + provider.getName()); + } + } else { + throw new UnsupportedServiceException("Unable to find network element for provider " + provider.getName()); + } + } + } }