From 337c07c0d12e3aa5e9ca832913bb78f052154e4c Mon Sep 17 00:00:00 2001 From: Alena Prokharchyk Date: Thu, 17 Nov 2011 15:20:30 -0800 Subject: [PATCH] Default gateway service to sourceNat service in the API --- .../ListSupportedNetworkServicesCmd.java | 5 ++ .../cloud/api/response/ServiceResponse.java | 4 - .../src/com/cloud/api/ApiResponseHelper.java | 8 ++ .../ConfigurationManagerImpl.java | 73 +++++++++---------- .../src/com/cloud/network/NetworkManager.java | 2 +- .../com/cloud/network/NetworkManagerImpl.java | 42 +++++------ .../F5ExternalLoadBalancerElement.java | 3 +- .../JuniperSRXExternalFirewallElement.java | 15 ++-- .../NetscalerExternalLoadBalancerElement.java | 14 ++-- .../network/element/VirtualRouterElement.java | 7 +- .../guru/ExternalGuestNetworkGuru.java | 3 +- .../cloud/network/MockNetworkManagerImpl.java | 2 +- 12 files changed, 86 insertions(+), 92 deletions(-) diff --git a/api/src/com/cloud/api/commands/ListSupportedNetworkServicesCmd.java b/api/src/com/cloud/api/commands/ListSupportedNetworkServicesCmd.java index 8aa6dad8e11..304ad274994 100644 --- a/api/src/com/cloud/api/commands/ListSupportedNetworkServicesCmd.java +++ b/api/src/com/cloud/api/commands/ListSupportedNetworkServicesCmd.java @@ -31,6 +31,7 @@ import com.cloud.api.response.ListResponse; import com.cloud.api.response.ServiceResponse; import com.cloud.exception.InvalidParameterValueException; import com.cloud.network.Network; +import com.cloud.network.Network.Service; import com.cloud.user.Account; @@ -101,6 +102,10 @@ public class ListSupportedNetworkServicesCmd extends BaseListCmd { ListResponse response = new ListResponse(); List servicesResponses = new ArrayList(); for (Network.Service service : services) { + //skip gateway service + if (service == Service.Gateway) { + continue; + } ServiceResponse serviceResponse = _responseGenerator.createNetworkServiceResponse(service); servicesResponses.add(serviceResponse); } diff --git a/api/src/com/cloud/api/response/ServiceResponse.java b/api/src/com/cloud/api/response/ServiceResponse.java index d3ce9198c7d..4b703eaa2cf 100644 --- a/api/src/com/cloud/api/response/ServiceResponse.java +++ b/api/src/com/cloud/api/response/ServiceResponse.java @@ -35,10 +35,6 @@ public class ServiceResponse extends BaseResponse { @SerializedName("capability") @Param(description="the list of capabilities", responseObject = CapabilityResponse.class) private List capabilities; - public String getName() { - return name; - } - public void setName(String name) { this.name = name; } diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index decaca7f407..496e32f33b2 100755 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -2348,6 +2348,10 @@ public class ApiResponseHelper implements ResponseGenerator { List serviceResponses = new ArrayList(); for (String service : serviceProviderMap.keySet()) { ServiceResponse svcRsp = new ServiceResponse(); + //skip gateway service + if (service.equalsIgnoreCase(Service.Gateway.getName())) { + continue; + } svcRsp.setName(service); List providers = new ArrayList(); for (String provider : serviceProviderMap.get(service)) { @@ -2452,6 +2456,10 @@ public class ApiResponseHelper implements ResponseGenerator { if (serviceCapabilitiesMap != null) { for (Service service : serviceCapabilitiesMap.keySet()) { ServiceResponse serviceResponse = new ServiceResponse(); + //skip gateway service + if (service == Service.Gateway) { + continue; + } serviceResponse.setName(service.getName()); // set list of capabilities for the service diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index b02802a5f11..23629750bce 100755 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -2917,7 +2917,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura for (String serviceName : cmd.getSupportedServices()) { //validate if the service is supported Service service = Network.Service.getService(serviceName); - if (service == null) { + if (service == null || service == Service.Gateway) { throw new InvalidParameterValueException("Invalid service " + serviceName); } @@ -2933,6 +2933,12 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura } serviceProviderMap.put(service, defaultProviders); } + + //add gateway provider (if sourceNat provider is enabled) + Set sourceNatServiceProviders = serviceProviderMap.get(Service.SourceNat); + if (sourceNatServiceProviders != null && !sourceNatServiceProviders.isEmpty()) { + serviceProviderMap.put(Service.Gateway, sourceNatServiceProviders); + } // populate providers Map> svcPrv = cmd.getServiceProviders(); @@ -2956,6 +2962,8 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura } } } + + //validate // verify the LB service capabilities specified in the network offering Map lbServiceCapabilityMap = cmd.getServiceCapabilities(Service.Lb); @@ -2971,17 +2979,9 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura } validateSourceNatServiceCapablities(sourceNatServiceCapabilityMap); - // verify the Gateway service capabilities specified in the network offering - Map gwServiceCapabilityMap = cmd.getServiceCapabilities(Service.Gateway); - if (!serviceProviderMap.containsKey(Service.Gateway) && gwServiceCapabilityMap != null && !gwServiceCapabilityMap.isEmpty()) { - throw new InvalidParameterValueException("Capabilities for Gateway service can be specifed only when Gateway service is enabled for network offering."); - } - validateGatewayServiceCapablities(gwServiceCapabilityMap); - Map> serviceCapabilityMap = new HashMap>(); serviceCapabilityMap.put(Service.Lb, lbServiceCapabilityMap); serviceCapabilityMap.put(Service.SourceNat, sourceNatServiceCapabilityMap); - serviceCapabilityMap.put(Service.Gateway, gwServiceCapabilityMap); return createNetworkOffering(userId, name, displayText, trafficType, tags, maxConnections, specifyVlan, availability, networkRate, serviceProviderMap, false, guestType, false, serviceOfferingId, serviceCapabilityMap); @@ -3003,28 +3003,27 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura 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"); + if (sourceNatServiceCapabilityMap.keySet().size() > 2) { + throw new InvalidParameterValueException("Only " + Capability.SupportedSourceNatTypes.getName() + " and " + Capability.RedundantRouter + " capabilities can be sepcified for firewall service"); } - String sourceNatType = sourceNatServiceCapabilityMap.get(Capability.SupportedSourceNatTypes); - boolean perAccount = sourceNatType.contains("peraccount"); - boolean perZone = sourceNatType.contains("perzone"); - if ((perAccount && perZone) || (!perAccount && !perZone)) { - throw new InvalidParameterValueException("Either perAccount or perZone source NAT type can be specified for " + Capability.SupportedSourceNatTypes.getName()); - } - } - } - - void validateGatewayServiceCapablities(Map gwServiceCapabilityMap) { - 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); - boolean enabled = param.contains("true"); - boolean disabled = param.contains("false"); - if (!enabled && !disabled) { - throw new InvalidParameterValueException("Unknown specified value for " + Capability.RedundantRouter.getName()); + + for (Capability capability : sourceNatServiceCapabilityMap.keySet()) { + String value = sourceNatServiceCapabilityMap.get(capability); + if (capability == Capability.SupportedSourceNatTypes) { + boolean perAccount = value.contains("peraccount"); + boolean perZone = value.contains("perzone"); + if ((perAccount && perZone) || (!perAccount && !perZone)) { + throw new InvalidParameterValueException("Either perAccount or perZone source NAT type can be specified for " + Capability.SupportedSourceNatTypes.getName()); + } + } else if (capability == Capability.RedundantRouter) { + boolean enabled = value.contains("true"); + boolean disabled = value.contains("false"); + if (!enabled && !disabled) { + throw new InvalidParameterValueException("Unknown specified value for " + Capability.RedundantRouter.getName()); + } + } else { + throw new InvalidParameterValueException("Only " + Capability.SupportedSourceNatTypes.getName() + " and " + Capability.RedundantRouter + " capabilities can be sepcified for firewall service"); + } } } } @@ -3046,17 +3045,13 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura dedicatedLb = isolationCapability.contains("dedicated"); } - Map fwServiceCapabilityMap = serviceCapabilityMap.get(Service.Firewall); + Map sourceNatServiceCapabilityMap = serviceCapabilityMap.get(Service.SourceNat); boolean sharedSourceNat = false; - if ((fwServiceCapabilityMap != null) && (!fwServiceCapabilityMap.isEmpty())) { - String sourceNatType = fwServiceCapabilityMap.get(Capability.SupportedSourceNatTypes.getName()); - sharedSourceNat = sourceNatType.contains("perzone"); - } - - Map gwServiceCapabilityMap = serviceCapabilityMap.get(Service.Gateway); boolean redundantRouter = false; - if ((gwServiceCapabilityMap != null) && (!gwServiceCapabilityMap.isEmpty())) { - String param = gwServiceCapabilityMap.get(Capability.RedundantRouter); + if ((sourceNatServiceCapabilityMap != null) && (!sourceNatServiceCapabilityMap.isEmpty())) { + String sourceNatType = sourceNatServiceCapabilityMap.get(Capability.SupportedSourceNatTypes.getName()); + sharedSourceNat = sourceNatType.contains("perzone"); + String param = sourceNatServiceCapabilityMap.get(Capability.RedundantRouter); if (param != null) { redundantRouter = param.contains("true"); } diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java index 4b004b78529..d740cf328dc 100644 --- a/server/src/com/cloud/network/NetworkManager.java +++ b/server/src/com/cloud/network/NetworkManager.java @@ -246,5 +246,5 @@ public interface NetworkManager extends NetworkService { boolean getAllowSubdomainAccessGlobal(); - boolean isProviderInNetwork(Provider provider, long networkId); + boolean isProviderForNetwork(Provider provider, long networkId); } diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 6f74f24710f..2602961f29a 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -3114,24 +3114,15 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag @Override public boolean networkIsConfiguredForExternalNetworking(long zoneId, long networkId) { - DataCenterVO zone = _dcDao.findById(zoneId); - - boolean usesJuniperForGatewayService = _ntwkSrvcDao.canProviderSupportServiceInNetwork(networkId, Service.Gateway, Network.Provider.JuniperSRX); - boolean usesJuniperForFirewallService = _ntwkSrvcDao.canProviderSupportServiceInNetwork(networkId, Service.Firewall, Network.Provider.JuniperSRX); - boolean usesNetscalarForLBService = _ntwkSrvcDao.canProviderSupportServiceInNetwork(networkId, Service.Lb, Network.Provider.Netscaler); - boolean usesF5ForLBService = _ntwkSrvcDao.canProviderSupportServiceInNetwork(networkId, Service.Lb, Network.Provider.F5BigIp); - - if (zone.getNetworkType() == NetworkType.Advanced) { - if (usesJuniperForGatewayService && usesJuniperForFirewallService) { - return true; - } else if (_ntwkSrvcDao.areServicesSupportedInNetwork(networkId, Service.Gateway) && (usesF5ForLBService || usesNetscalarForLBService)) { - return true; - } else { - return false; - } - } else { - return usesJuniperForFirewallService; - } + boolean netscalerInNetwork = isProviderForNetwork(Network.Provider.Netscaler, networkId); + boolean juniperInNetwork = isProviderForNetwork(Network.Provider.JuniperSRX, networkId); + boolean f5InNetwork = isProviderForNetwork(Network.Provider.F5BigIp, networkId); + + if (netscalerInNetwork || juniperInNetwork || f5InNetwork) { + return true; + } else { + return false; + } } @Override @@ -4169,17 +4160,24 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } //validate Services + boolean addGatewayService = false; for(String serviceName : enabledServices){ Network.Service service = Network.Service.getService(serviceName); - if(service == null){ + if (service == null || service == Service.Gateway){ throw new InvalidParameterValueException("Invalid Network Service specified=" + serviceName); + } else if (service == Service.SourceNat) { + addGatewayService = true; } services.add(service); } + + if (addGatewayService) { + services.add(Service.Gateway); + } + }else{ //enable all the default services supported by this element. - services = new ArrayList(element.getCapabilities().keySet()); - + services = new ArrayList(element.getCapabilities().keySet()); } Transaction txn = Transaction.currentTxn(); @@ -5032,7 +5030,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } @Override - public boolean isProviderInNetwork(Provider provider, long networkId) { + public boolean isProviderForNetwork(Provider provider, long networkId) { if (_ntwkSrvcDao.isProviderForNetwork(networkId, provider) == null) { return true; } else { diff --git a/server/src/com/cloud/network/element/F5ExternalLoadBalancerElement.java b/server/src/com/cloud/network/element/F5ExternalLoadBalancerElement.java index 6a6e6f2521f..4c468f78d8a 100644 --- a/server/src/com/cloud/network/element/F5ExternalLoadBalancerElement.java +++ b/server/src/com/cloud/network/element/F5ExternalLoadBalancerElement.java @@ -99,13 +99,12 @@ public class F5ExternalLoadBalancerElement extends ExternalLoadBalancerDeviceMan @Inject NetworkDao _networkDao; private boolean canHandle(Network config) { - DataCenter zone = _configMgr.getZone(config.getDataCenterId()); if (config.getGuestType() != Network.GuestType.Isolated || config.getTrafficType() != TrafficType.Guest) { s_logger.trace("Not handling network with Type " + config.getGuestType() + " and traffic type " + config.getTrafficType()); return false; } - return (_networkManager.networkIsConfiguredForExternalNetworking(zone.getId(), config.getId()) && + return (_networkManager.isProviderForNetwork(getProvider(), config.getId()) && _ntwkSrvcDao.canProviderSupportServiceInNetwork(config.getId(), Service.Lb, Network.Provider.F5BigIp)); } diff --git a/server/src/com/cloud/network/element/JuniperSRXExternalFirewallElement.java b/server/src/com/cloud/network/element/JuniperSRXExternalFirewallElement.java index 0e8e994bab8..904216cb3b9 100644 --- a/server/src/com/cloud/network/element/JuniperSRXExternalFirewallElement.java +++ b/server/src/com/cloud/network/element/JuniperSRXExternalFirewallElement.java @@ -111,7 +111,7 @@ public class JuniperSRXExternalFirewallElement extends ExternalFirewallDeviceMan return false; } - return _networkManager.networkIsConfiguredForExternalNetworking(zone.getId(),config.getId())&& + return _networkManager.isProviderForNetwork(getProvider(), config.getId()) && _ntwkSrvcDao.canProviderSupportServiceInNetwork(config.getId(), Service.Lb, Network.Provider.JuniperSRX); } @@ -242,22 +242,17 @@ public class JuniperSRXExternalFirewallElement extends ExternalFirewallDeviceMan Map> capabilities = new HashMap>(); // Set capabilities for Firewall service - Map firewallCapabilities = new HashMap(); - - // Specifies that NAT rules can be made for either TCP or UDP traffic - firewallCapabilities.put(Capability.SupportedProtocols, "tcp,udp"); - + Map firewallCapabilities = new HashMap(); + firewallCapabilities.put(Capability.SupportedProtocols, "tcp,udp"); firewallCapabilities.put(Capability.MultipleIps, "true"); - - // Specifies that this element can measure network usage on a per public IP basis firewallCapabilities.put(Capability.TrafficStatistics, "per public ip"); + capabilities.put(Service.Firewall, firewallCapabilities); - // Specifies supported VPN types + // Set VPN capabilities Map vpnCapabilities = new HashMap(); vpnCapabilities.put(Capability.SupportedVpnTypes, "ipsec"); capabilities.put(Service.Vpn, vpnCapabilities); - capabilities.put(Service.Firewall, firewallCapabilities); capabilities.put(Service.Gateway, null); Map sourceNatCapabilities = new HashMap(); diff --git a/server/src/com/cloud/network/element/NetscalerExternalLoadBalancerElement.java b/server/src/com/cloud/network/element/NetscalerExternalLoadBalancerElement.java index 891eef7c402..02f931bc334 100644 --- a/server/src/com/cloud/network/element/NetscalerExternalLoadBalancerElement.java +++ b/server/src/com/cloud/network/element/NetscalerExternalLoadBalancerElement.java @@ -23,7 +23,9 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; + import javax.ejb.Local; + import org.apache.log4j.Logger; import com.cloud.agent.AgentManager; @@ -34,7 +36,6 @@ import com.cloud.api.commands.ListNetscalerLoadBalancerNetworksCmd; import com.cloud.api.commands.ListNetscalerLoadBalancersCmd; import com.cloud.api.response.NetscalerLoadBalancerResponse; import com.cloud.configuration.ConfigurationManager; -import com.cloud.dc.DataCenter; import com.cloud.dc.dao.DataCenterDao; import com.cloud.deploy.DeployDestination; import com.cloud.exception.ConcurrentOperationException; @@ -46,18 +47,18 @@ import com.cloud.host.dao.HostDao; import com.cloud.network.ExternalLoadBalancerDeviceManager; import com.cloud.network.ExternalLoadBalancerDeviceManagerImpl; import com.cloud.network.ExternalLoadBalancerDeviceVO; -import com.cloud.network.Network; -import com.cloud.network.NetworkExternalLoadBalancerVO; -import com.cloud.network.NetworkVO; -import com.cloud.network.PhysicalNetworkVO; import com.cloud.network.ExternalLoadBalancerDeviceVO.LBDeviceState; import com.cloud.network.ExternalNetworkDeviceManager.NetworkDevice; +import com.cloud.network.Network; import com.cloud.network.Network.Capability; import com.cloud.network.Network.Provider; import com.cloud.network.Network.Service; +import com.cloud.network.NetworkExternalLoadBalancerVO; import com.cloud.network.NetworkManager; +import com.cloud.network.NetworkVO; import com.cloud.network.Networks.TrafficType; import com.cloud.network.PhysicalNetworkServiceProvider; +import com.cloud.network.PhysicalNetworkVO; import com.cloud.network.dao.ExternalLoadBalancerDeviceDao; import com.cloud.network.dao.NetworkDao; import com.cloud.network.dao.NetworkExternalLoadBalancerDao; @@ -92,13 +93,12 @@ public class NetscalerExternalLoadBalancerElement extends ExternalLoadBalancerDe @Inject NetworkDao _networkDao; private boolean canHandle(Network config) { - DataCenter zone = _configMgr.getZone(config.getDataCenterId()); if (config.getGuestType() != Network.GuestType.Isolated || config.getTrafficType() != TrafficType.Guest) { s_logger.trace("Not handling network with Type " + config.getGuestType() + " and traffic type " + config.getTrafficType()); return false; } - return (_networkManager.networkIsConfiguredForExternalNetworking(zone.getId(), config.getId()) && + return (_networkManager.isProviderForNetwork(getProvider(), config.getId()) && _ntwkSrvcDao.canProviderSupportServiceInNetwork(config.getId(), Service.Lb, Network.Provider.Netscaler)); } diff --git a/server/src/com/cloud/network/element/VirtualRouterElement.java b/server/src/com/cloud/network/element/VirtualRouterElement.java index f36f6771425..47533ff2275 100644 --- a/server/src/com/cloud/network/element/VirtualRouterElement.java +++ b/server/src/com/cloud/network/element/VirtualRouterElement.java @@ -109,7 +109,7 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl } if (service == null) { - if (!_networkMgr.isProviderInNetwork(getProvider(), network.getId())) { + if (!_networkMgr.isProviderForNetwork(getProvider(), network.getId())) { s_logger.trace("Element " + getProvider().getName() + " is not a provider for the network " + network); return false; } @@ -307,12 +307,11 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl capabilities.put(Service.UserData, null); capabilities.put(Service.Dhcp, null); - Map gatewayCapabilities = new HashMap(); - gatewayCapabilities.put(Capability.RedundantRouter, "true"); - capabilities.put(Service.Gateway, gatewayCapabilities); + capabilities.put(Service.Gateway, null); Map sourceNatCapabilities = new HashMap(); sourceNatCapabilities.put(Capability.SupportedSourceNatTypes, "per account"); + sourceNatCapabilities.put(Capability.RedundantRouter, "true"); capabilities.put(Service.SourceNat, sourceNatCapabilities); capabilities.put(Service.StaticNat, null); diff --git a/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java b/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java index 7362550c073..11c0799c76e 100644 --- a/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java +++ b/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java @@ -34,13 +34,12 @@ import com.cloud.event.EventUtils; import com.cloud.event.EventVO; import com.cloud.exception.InsufficientAddressCapacityException; import com.cloud.exception.InsufficientVirtualNetworkCapcityException; -import com.cloud.network.ExternalNetworkDeviceManager; import com.cloud.network.Network; -import com.cloud.network.PhysicalNetworkVO; import com.cloud.network.Network.State; import com.cloud.network.NetworkManager; import com.cloud.network.NetworkVO; import com.cloud.network.Networks.BroadcastDomainType; +import com.cloud.network.PhysicalNetworkVO; import com.cloud.network.dao.NetworkDao; import com.cloud.network.dao.PhysicalNetworkDao; import com.cloud.network.ovs.OvsNetworkManager; diff --git a/server/test/com/cloud/network/MockNetworkManagerImpl.java b/server/test/com/cloud/network/MockNetworkManagerImpl.java index 67954eaecf4..cfe053f6395 100755 --- a/server/test/com/cloud/network/MockNetworkManagerImpl.java +++ b/server/test/com/cloud/network/MockNetworkManagerImpl.java @@ -698,7 +698,7 @@ public class MockNetworkManagerImpl implements NetworkManager, Manager, NetworkS } @Override - public boolean isProviderInNetwork(Provider provider, long networkId) { + public boolean isProviderForNetwork(Provider provider, long networkId) { // TODO Auto-generated method stub return false; }