diff --git a/api/src/com/cloud/api/ApiConstants.java b/api/src/com/cloud/api/ApiConstants.java index 2506a4cb19b..e79b37d866d 100755 --- a/api/src/com/cloud/api/ApiConstants.java +++ b/api/src/com/cloud/api/ApiConstants.java @@ -96,6 +96,7 @@ public class ApiConstants { public static final String IS_READY = "isready"; public static final String IS_RECURSIVE = "isrecursive"; public static final String IS_SHARED = "isshared"; + public static final String IS_LB_SHARED = "islbshared"; public static final String ISO_FILTER = "isofilter"; public static final String ISO_GUEST_OS_NONE = "None"; public static final String JOB_ID = "jobid"; diff --git a/api/src/com/cloud/api/commands/CreateNetworkOfferingCmd.java b/api/src/com/cloud/api/commands/CreateNetworkOfferingCmd.java index e3218d75bd1..316f44ab67a 100644 --- a/api/src/com/cloud/api/commands/CreateNetworkOfferingCmd.java +++ b/api/src/com/cloud/api/commands/CreateNetworkOfferingCmd.java @@ -33,6 +33,7 @@ import com.cloud.api.Implementation; import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.api.response.NetworkOfferingResponse; +import com.cloud.exception.InvalidParameterValueException; import com.cloud.network.Network.Capability; import com.cloud.network.Network.Service; import com.cloud.offering.NetworkOffering; @@ -238,14 +239,33 @@ public class CreateNetworkOfferingCmd extends BaseCmd { } public Map getServiceCapabilities(Service service) { + Map capabilityMap = null; - Map serviceCapabilityMap = null; if (serviceCapabilistList != null && !serviceCapabilistList.isEmpty()) { - if (serviceCapabilistList.containsKey(service.getName())) { - serviceCapabilityMap = (HashMap) serviceCapabilistList.get(service.getName()); + capabilityMap = new HashMap (); + Collection serviceCapabilityCollection = serviceCapabilistList.values(); + Iterator iter = serviceCapabilityCollection.iterator(); + while (iter.hasNext()) { + HashMap svcCapabilityMap = (HashMap) iter.next(); + Capability capability = null; + String svc = (String) svcCapabilityMap.get("service"); + String capabilityName = (String) svcCapabilityMap.get("capabilityType"); + String capabilityValue = (String) svcCapabilityMap.get("capabilityValue"); + + if (capabilityName != null) { + capability = Capability.getCapability(capabilityName); + } + + if ((capability == null) || (capabilityName == null) || (capabilityValue == null) ) { + throw new InvalidParameterValueException("Invalid capability:" + capabilityName + " capability value:" + capabilityValue); + } + if (svc.equalsIgnoreCase(service.getName())) { + capabilityMap.put(capability, capabilityValue); + } } } - return serviceCapabilityMap; + + return capabilityMap; } ///////////////////////////////////////////////////// diff --git a/api/src/com/cloud/api/commands/UpdateNetworkOfferingCmd.java b/api/src/com/cloud/api/commands/UpdateNetworkOfferingCmd.java index 688c419ab66..4d8653e2141 100644 --- a/api/src/com/cloud/api/commands/UpdateNetworkOfferingCmd.java +++ b/api/src/com/cloud/api/commands/UpdateNetworkOfferingCmd.java @@ -33,6 +33,7 @@ import com.cloud.api.Implementation; import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.api.response.NetworkOfferingResponse; +import com.cloud.exception.InvalidParameterValueException; import com.cloud.network.Network.Capability; import com.cloud.network.Network.Service; import com.cloud.offering.NetworkOffering; @@ -190,14 +191,33 @@ public class UpdateNetworkOfferingCmd extends BaseCmd { } public Map getServiceCapabilities(Service service) { + Map capabilityMap = null; - Map serviceCapabilityMap = null; if (serviceCapabilistList != null && !serviceCapabilistList.isEmpty()) { - if (serviceCapabilistList.containsKey(service.getName())) { - serviceCapabilityMap = (HashMap) serviceCapabilistList.get(service.getName()); + capabilityMap = new HashMap (); + Collection serviceCapabilityCollection = serviceCapabilistList.values(); + Iterator iter = serviceCapabilityCollection.iterator(); + while (iter.hasNext()) { + HashMap svcCapabilityMap = (HashMap) iter.next(); + Capability capability = null; + String svc = (String) svcCapabilityMap.get("service"); + String capabilityName = (String) svcCapabilityMap.get("capabilityType"); + String capabilityValue = (String) svcCapabilityMap.get("capabilityValue"); + + if (capabilityName != null) { + capability = Capability.getCapability(capabilityName); + } + + if ((capability == null) || (capabilityName == null) || (capabilityValue == null) ) { + throw new InvalidParameterValueException("Invalid capability:" + capabilityName + " capability value:" + capabilityValue); + } + if (svc.equalsIgnoreCase(service.getName())) { + capabilityMap.put(capability, capabilityValue); + } } } - return serviceCapabilityMap; + + return capabilityMap; } diff --git a/api/src/com/cloud/api/response/NetworkOfferingResponse.java b/api/src/com/cloud/api/response/NetworkOfferingResponse.java index 9451d4d5a82..1d624e6a1a7 100644 --- a/api/src/com/cloud/api/response/NetworkOfferingResponse.java +++ b/api/src/com/cloud/api/response/NetworkOfferingResponse.java @@ -69,7 +69,7 @@ public class NetworkOfferingResponse extends BaseResponse{ @SerializedName("service") @Param(description="the list of supported services", responseObject = ServiceResponse.class) private List services; - @SerializedName(ApiConstants.IS_SHARED) @Param(description="true if load balncer service offered is shared by multiple networks", responseObject = ServiceResponse.class) + @SerializedName(ApiConstants.IS_LB_SHARED) @Param(description="true if load balncer service offered is shared by multiple networks", responseObject = ServiceResponse.class) private Boolean isLbShared; @SerializedName(ApiConstants.IS_SHARED) @Param(description="true if soruce NAT service offered is shared by multiple networks", responseObject = ServiceResponse.class) diff --git a/api/src/com/cloud/network/Network.java b/api/src/com/cloud/network/Network.java index 58b707cb3c7..859625f5e7f 100644 --- a/api/src/com/cloud/network/Network.java +++ b/api/src/com/cloud/network/Network.java @@ -154,6 +154,8 @@ public interface Network extends ControlledEntity { public static class Capability { + private static List supportedCapabilities = new ArrayList(); + public static final Capability SupportedProtocols = new Capability("SupportedProtocols"); public static final Capability SupportedLBAlgorithms = new Capability("SupportedLbAlgorithms"); public static final Capability SupportedLBIsolation = new Capability("SupportedLBIsolation"); @@ -169,11 +171,21 @@ public interface Network extends ControlledEntity { public Capability(String name) { this.name = name; + supportedCapabilities.add(this); } public String getName() { return name; } + + public static Capability getCapability(String capabilityName) { + for (Capability capability : supportedCapabilities) { + if (capability.getName().equalsIgnoreCase(capabilityName)) { + return capability; + } + } + return null; + } } enum Event { diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index c8e4a0c6daf..c51c0780bdc 100755 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -2976,12 +2976,12 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura } validateLoadBalancerServiceCapabilities(lbServiceCapabilityMap); - // verify the Firewall service capabilities specified in the network offering - Map fwServiceCapabilityMap = cmd.getServiceCapabilities(Service.Firewall); - if (!cmd.getFirewallService() && fwServiceCapabilityMap != null && !fwServiceCapabilityMap.isEmpty()) { - throw new InvalidParameterValueException("Capabilities for Firewall service can be specifed only when Firewall service is enabled for network offering."); + // verify the Source NAT service capabilities specified in the network offering + Map sourceNatServiceCapabilityMap = cmd.getServiceCapabilities(Service.SourceNat); + if (!cmd.getSourceNatService() && sourceNatServiceCapabilityMap != null && !sourceNatServiceCapabilityMap.isEmpty()) { + throw new InvalidParameterValueException("Capabilities for source NAT service can be specifed only when source NAT service is enabled for network offering."); } - validateFirewallServiceCapablities(fwServiceCapabilityMap); + validateSourceNatServiceCapablities(sourceNatServiceCapabilityMap); // verify the Gateway service capabilities specified in the network offering Map gwServiceCapabilityMap = cmd.getServiceCapabilities(Service.Gateway); @@ -2992,7 +2992,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura Map> serviceCapabilityMap = new HashMap>(); serviceCapabilityMap.put(Service.Lb, lbServiceCapabilityMap); - serviceCapabilityMap.put(Service.Firewall, fwServiceCapabilityMap); + serviceCapabilityMap.put(Service.SourceNat, sourceNatServiceCapabilityMap); serviceCapabilityMap.put(Service.Gateway, gwServiceCapabilityMap); return createNetworkOffering(userId, name, displayText, trafficType, tags, maxConnections, specifyVlan, availability, networkRate, serviceProviderMap, false, @@ -3000,11 +3000,11 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura } void validateLoadBalancerServiceCapabilities(Map lbServiceCapabilityMap) { - if (lbServiceCapabilityMap != null) { - if (lbServiceCapabilityMap.keySet().size() > 1 || !lbServiceCapabilityMap.containsKey(Capability.SupportedLBIsolation.getName())) { + if (lbServiceCapabilityMap != null && !lbServiceCapabilityMap.isEmpty()) { + if (lbServiceCapabilityMap.keySet().size() > 1 || !lbServiceCapabilityMap.containsKey(Capability.SupportedLBIsolation)) { throw new InvalidParameterValueException("Only Load balancer isolation capability can be sepcified for LB service"); } - String isolationCapability = lbServiceCapabilityMap.get(Capability.SupportedLBIsolation.getName()); + String isolationCapability = lbServiceCapabilityMap.get(Capability.SupportedLBIsolation); boolean dedicatedLb = isolationCapability.contains("dedicated"); boolean sharedLB = isolationCapability.contains("shared"); if ((dedicatedLb && sharedLB) || (!dedicatedLb && !sharedLB)){ @@ -3013,12 +3013,12 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura } } - void validateFirewallServiceCapablities(Map fwServiceCapabilityMap) { - if (fwServiceCapabilityMap != null) { - if (fwServiceCapabilityMap.keySet().size() > 1 || !fwServiceCapabilityMap.containsKey(Capability.SupportedSourceNatTypes.getName())) { + void validateSourceNatServiceCapablities(Map sourceNatServiceCapabilityMap) { + if (sourceNatServiceCapabilityMap != null && !sourceNatServiceCapabilityMap.isEmpty()) { + if (sourceNatServiceCapabilityMap.keySet().size() > 1 || !sourceNatServiceCapabilityMap.containsKey(Capability.SupportedSourceNatTypes)) { throw new InvalidParameterValueException("Only Supported Source NAT type capability can be sepcified for firewall service"); } - String sourceNatType = fwServiceCapabilityMap.get(Capability.SupportedSourceNatTypes.getName()); + String sourceNatType = sourceNatServiceCapabilityMap.get(Capability.SupportedSourceNatTypes); boolean perAccount = sourceNatType.contains("peraccount"); boolean perZone = sourceNatType.contains("perzone"); if ((perAccount && perZone) || (!perAccount && !perZone)) { @@ -3028,8 +3028,8 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura } void validateGatewayServiceCapablities(Map gwServiceCapabilityMap) { - if (gwServiceCapabilityMap != null) { - if (gwServiceCapabilityMap.keySet().size() > 1 || !gwServiceCapabilityMap.containsKey(Capability.RedundantRouter.getName())) { + if (gwServiceCapabilityMap != null && !gwServiceCapabilityMap.isEmpty()) { + if (gwServiceCapabilityMap.keySet().size() > 1 || !gwServiceCapabilityMap.containsKey(Capability.RedundantRouter)) { throw new InvalidParameterValueException("Only redundant router capability can be sepcified for gateway service"); } String param = gwServiceCapabilityMap.get(Capability.RedundantRouter.getName()); @@ -3424,17 +3424,17 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura } offering.setDedicatedLb(dedicatedLb); - // verify the Firewall service capabilities specified in the network offering - Map fwServiceCapabilityMap = cmd.getServiceCapabilities(Service.Firewall); + // verify the source NAT service capabilities specified in the network offering + Map sourceNatServiceCapabilityMap = cmd.getServiceCapabilities(Service.SourceNat); boolean sharedSourceNat = false; - if (!cmd.getFirewallService() && fwServiceCapabilityMap != null && !fwServiceCapabilityMap.isEmpty()) { + if (!cmd.getSourceNatService() && sourceNatServiceCapabilityMap != null && !sourceNatServiceCapabilityMap.isEmpty()) { throw new InvalidParameterValueException("Capabilities for Firewall service can be specifed only when Firewall service is enabled for network offering."); } - validateFirewallServiceCapablities(fwServiceCapabilityMap); + validateSourceNatServiceCapablities(sourceNatServiceCapabilityMap); - if ((fwServiceCapabilityMap != null) && (!fwServiceCapabilityMap.isEmpty())) { - String sourceNatType = fwServiceCapabilityMap.get(Capability.SupportedSourceNatTypes.getName()); + if ((sourceNatServiceCapabilityMap != null) && (!sourceNatServiceCapabilityMap.isEmpty())) { + String sourceNatType = sourceNatServiceCapabilityMap.get(Capability.SupportedSourceNatTypes.getName()); sharedSourceNat = sourceNatType.contains("perzone"); } offering.setSharedSourceNat(sharedSourceNat);