diff --git a/api/src/com/cloud/network/element/NetworkElement.java b/api/src/com/cloud/network/element/NetworkElement.java index c6845d3d346..e93962a0ebc 100644 --- a/api/src/com/cloud/network/element/NetworkElement.java +++ b/api/src/com/cloud/network/element/NetworkElement.java @@ -14,6 +14,7 @@ package com.cloud.network.element; import java.util.List; import java.util.Map; +import java.util.Set; import com.cloud.deploy.DeployDestination; import com.cloud.exception.ConcurrentOperationException; @@ -133,5 +134,5 @@ public interface NetworkElement extends Adapter { * @param services * @return true/false */ - boolean verifyServicesCombination(List services); + boolean verifyServicesCombination(Set services); } diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 02745b7abc5..be604943d7d 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -6748,14 +6748,6 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag l.add(service); } - for (String provider : providerSvcs.keySet()) { - NetworkElement element = getElementImplementingProvider(provider); - List services = providerSvcs.get(provider); - if (!element.verifyServicesCombination(services)) { - throw new UnsupportedServiceException("Provider " + provider + " doesn't support services combination: " + services); - } - } - return svcProviders; } @@ -6852,11 +6844,16 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag + provider.getName(), null); } } + List serviceList = new ArrayList(); 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()); } + serviceList.add(service.getName()); + } + if (!element.verifyServicesCombination(enabledServices)) { + throw new UnsupportedServiceException("Provider " + provider.getName() + " doesn't support services combination: " + serviceList); } } } diff --git a/server/src/com/cloud/network/element/BareMetalElement.java b/server/src/com/cloud/network/element/BareMetalElement.java index 1e56003d1f0..143af710e6b 100644 --- a/server/src/com/cloud/network/element/BareMetalElement.java +++ b/server/src/com/cloud/network/element/BareMetalElement.java @@ -14,6 +14,7 @@ package com.cloud.network.element; import java.util.List; import java.util.Map; +import java.util.Set; import javax.ejb.Local; @@ -118,7 +119,7 @@ public class BareMetalElement extends AdapterBase implements NetworkElement { } @Override - public boolean verifyServicesCombination(List services) { + public boolean verifyServicesCombination(Set services) { return true; } } diff --git a/server/src/com/cloud/network/element/CiscoNexusVSMElement.java b/server/src/com/cloud/network/element/CiscoNexusVSMElement.java index c57b6644fe1..557d6f3f0c0 100644 --- a/server/src/com/cloud/network/element/CiscoNexusVSMElement.java +++ b/server/src/com/cloud/network/element/CiscoNexusVSMElement.java @@ -15,6 +15,7 @@ package com.cloud.network.element; import java.util.List; import java.util.Map; import java.util.ArrayList; +import java.util.Set; import javax.ejb.Local; @@ -127,7 +128,7 @@ public class CiscoNexusVSMElement extends CiscoNexusVSMDeviceManagerImpl impleme } @Override - public boolean verifyServicesCombination(List services) { + public boolean verifyServicesCombination(Set services) { return true; } diff --git a/server/src/com/cloud/network/element/CloudZonesNetworkElement.java b/server/src/com/cloud/network/element/CloudZonesNetworkElement.java index ba886f3e789..a6ffa8d9ba8 100644 --- a/server/src/com/cloud/network/element/CloudZonesNetworkElement.java +++ b/server/src/com/cloud/network/element/CloudZonesNetworkElement.java @@ -15,6 +15,7 @@ package com.cloud.network.element; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import javax.ejb.Local; @@ -233,7 +234,7 @@ public class CloudZonesNetworkElement extends AdapterBase implements NetworkElem } @Override - public boolean verifyServicesCombination(List services) { + public boolean verifyServicesCombination(Set services) { return true; } diff --git a/server/src/com/cloud/network/element/ElasticLoadBalancerElement.java b/server/src/com/cloud/network/element/ElasticLoadBalancerElement.java index a7ed40df194..55dfe7d33a5 100644 --- a/server/src/com/cloud/network/element/ElasticLoadBalancerElement.java +++ b/server/src/com/cloud/network/element/ElasticLoadBalancerElement.java @@ -178,7 +178,7 @@ public class ElasticLoadBalancerElement extends AdapterBase implements LoadBalan } @Override - public boolean verifyServicesCombination(List services) { + public boolean verifyServicesCombination(Set services) { return true; } diff --git a/server/src/com/cloud/network/element/ExternalDhcpElement.java b/server/src/com/cloud/network/element/ExternalDhcpElement.java index 262aa8b02c4..89cfbc06b9c 100755 --- a/server/src/com/cloud/network/element/ExternalDhcpElement.java +++ b/server/src/com/cloud/network/element/ExternalDhcpElement.java @@ -15,6 +15,7 @@ package com.cloud.network.element; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import javax.ejb.Local; @@ -142,7 +143,7 @@ public class ExternalDhcpElement extends AdapterBase implements NetworkElement, } @Override - public boolean verifyServicesCombination(List services) { + public boolean verifyServicesCombination(Set services) { return true; } } diff --git a/server/src/com/cloud/network/element/F5ExternalLoadBalancerElement.java b/server/src/com/cloud/network/element/F5ExternalLoadBalancerElement.java index f8824d951a5..348053ca7f5 100644 --- a/server/src/com/cloud/network/element/F5ExternalLoadBalancerElement.java +++ b/server/src/com/cloud/network/element/F5ExternalLoadBalancerElement.java @@ -458,7 +458,7 @@ public class F5ExternalLoadBalancerElement extends ExternalLoadBalancerDeviceMan } @Override - public boolean verifyServicesCombination(List services) { + public boolean verifyServicesCombination(Set services) { return true; } diff --git a/server/src/com/cloud/network/element/JuniperSRXExternalFirewallElement.java b/server/src/com/cloud/network/element/JuniperSRXExternalFirewallElement.java index 73577d6a3ea..a7c4a01e3ea 100644 --- a/server/src/com/cloud/network/element/JuniperSRXExternalFirewallElement.java +++ b/server/src/com/cloud/network/element/JuniperSRXExternalFirewallElement.java @@ -535,7 +535,7 @@ PortForwardingServiceProvider, RemoteAccessVPNServiceProvider, IpDeployer, Junip } @Override - public boolean verifyServicesCombination(List services) { + public boolean verifyServicesCombination(Set services) { return true; } diff --git a/server/src/com/cloud/network/element/NetscalerElement.java b/server/src/com/cloud/network/element/NetscalerElement.java index 63d9b654189..6f6f17c6c46 100644 --- a/server/src/com/cloud/network/element/NetscalerElement.java +++ b/server/src/com/cloud/network/element/NetscalerElement.java @@ -15,6 +15,7 @@ package com.cloud.network.element; import java.net.URI; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -543,15 +544,19 @@ StaticNatServiceProvider { } @Override - public boolean verifyServicesCombination(List services) { - List netscalerServices = new ArrayList(); - netscalerServices.add(Service.Lb.getName()); - netscalerServices.add(Service.StaticNat.getName()); + public boolean verifyServicesCombination(Set services) { + Set netscalerServices = new HashSet(); + netscalerServices.add(Service.Lb); + netscalerServices.add(Service.StaticNat); // NetScaler can only act as Lb and Static Nat service provider if (services != null && !services.isEmpty() && !netscalerServices.containsAll(services)) { + String servicesList = ""; + for (Service service : services) { + servicesList += service.getName() + " "; + } s_logger.warn("NetScaler network element can only support LB and Static NAT services and service combination " - + services + " is not supported."); + + servicesList + " is not supported."); return false; } diff --git a/server/src/com/cloud/network/element/OvsElement.java b/server/src/com/cloud/network/element/OvsElement.java index 9a736671593..b27c36e69cd 100644 --- a/server/src/com/cloud/network/element/OvsElement.java +++ b/server/src/com/cloud/network/element/OvsElement.java @@ -14,6 +14,7 @@ package com.cloud.network.element; import java.util.List; import java.util.Map; +import java.util.Set; import javax.ejb.Local; @@ -126,7 +127,7 @@ public class OvsElement extends AdapterBase implements NetworkElement { } @Override - public boolean verifyServicesCombination(List services) { + public boolean verifyServicesCombination(Set services) { return true; } } diff --git a/server/src/com/cloud/network/element/SecurityGroupElement.java b/server/src/com/cloud/network/element/SecurityGroupElement.java index db4dd52ce2e..ef4dc1fe945 100644 --- a/server/src/com/cloud/network/element/SecurityGroupElement.java +++ b/server/src/com/cloud/network/element/SecurityGroupElement.java @@ -15,6 +15,7 @@ package com.cloud.network.element; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import javax.ejb.Local; @@ -101,7 +102,7 @@ public class SecurityGroupElement extends AdapterBase implements NetworkElement } @Override - public boolean verifyServicesCombination(List services) { + public boolean verifyServicesCombination(Set services) { return true; } } diff --git a/server/src/com/cloud/network/element/VirtualRouterElement.java b/server/src/com/cloud/network/element/VirtualRouterElement.java index 3fa4c826978..c09318fe0a5 100755 --- a/server/src/com/cloud/network/element/VirtualRouterElement.java +++ b/server/src/com/cloud/network/element/VirtualRouterElement.java @@ -869,11 +869,16 @@ LoadBalancingServiceProvider, PortForwardingServiceProvider, RemoteAccessVPNServ } @Override - public boolean verifyServicesCombination(List services) { - if (!services.contains("SourceNat")) { - if (services.contains("StaticNat") || services.contains("Firewall") || services.contains("Lb") || services.contains("PortForwarding") || - services.contains("Vpn")) { - s_logger.warn("Virtual router can't enable services " + services + " without source NAT service"); + public boolean verifyServicesCombination(Set services) { + if (!services.contains(Service.SourceNat)) { + if (services.contains(Service.StaticNat) || services.contains(Service.Firewall) || services.contains(Service.Lb) || + services.contains(Service.PortForwarding) || services.contains(Service.Vpn)) { + String servicesList = "["; + for (Service service : services) { + servicesList += service.getName() + " "; + } + servicesList += "]"; + s_logger.warn("Virtual router can't enable services " + servicesList + " without source NAT service"); return false; } }