Default gateway service to sourceNat service in the API

This commit is contained in:
Alena Prokharchyk 2011-11-17 15:20:30 -08:00
parent 0a10e32d69
commit 337c07c0d1
12 changed files with 86 additions and 92 deletions

View File

@ -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<ServiceResponse> response = new ListResponse<ServiceResponse>();
List<ServiceResponse> servicesResponses = new ArrayList<ServiceResponse>();
for (Network.Service service : services) {
//skip gateway service
if (service == Service.Gateway) {
continue;
}
ServiceResponse serviceResponse = _responseGenerator.createNetworkServiceResponse(service);
servicesResponses.add(serviceResponse);
}

View File

@ -35,10 +35,6 @@ public class ServiceResponse extends BaseResponse {
@SerializedName("capability") @Param(description="the list of capabilities", responseObject = CapabilityResponse.class)
private List<CapabilityResponse> capabilities;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}

View File

@ -2348,6 +2348,10 @@ public class ApiResponseHelper implements ResponseGenerator {
List<ServiceResponse> serviceResponses = new ArrayList<ServiceResponse>();
for (String service : serviceProviderMap.keySet()) {
ServiceResponse svcRsp = new ServiceResponse();
//skip gateway service
if (service.equalsIgnoreCase(Service.Gateway.getName())) {
continue;
}
svcRsp.setName(service);
List<ProviderResponse> providers = new ArrayList<ProviderResponse>();
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

View File

@ -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<Provider> sourceNatServiceProviders = serviceProviderMap.get(Service.SourceNat);
if (sourceNatServiceProviders != null && !sourceNatServiceProviders.isEmpty()) {
serviceProviderMap.put(Service.Gateway, sourceNatServiceProviders);
}
// populate providers
Map<String, List<String>> 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<Capability, String> 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<Capability, String> 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<Service, Map<Capability, String>> serviceCapabilityMap = new HashMap<Service, Map<Capability, String>>();
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<Capability, String> 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<Capability, String> 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<Capability, String> fwServiceCapabilityMap = serviceCapabilityMap.get(Service.Firewall);
Map<Capability, String> 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<Capability, String> 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");
}

View File

@ -246,5 +246,5 @@ public interface NetworkManager extends NetworkService {
boolean getAllowSubdomainAccessGlobal();
boolean isProviderInNetwork(Provider provider, long networkId);
boolean isProviderForNetwork(Provider provider, long networkId);
}

View File

@ -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<Service>(element.getCapabilities().keySet());
services = new ArrayList<Service>(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 {

View File

@ -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));
}

View File

@ -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<Service, Map<Capability, String>> capabilities = new HashMap<Service, Map<Capability, String>>();
// Set capabilities for Firewall service
Map<Capability, String> firewallCapabilities = new HashMap<Capability, String>();
// Specifies that NAT rules can be made for either TCP or UDP traffic
firewallCapabilities.put(Capability.SupportedProtocols, "tcp,udp");
Map<Capability, String> firewallCapabilities = new HashMap<Capability, String>();
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<Capability, String> vpnCapabilities = new HashMap<Capability, String>();
vpnCapabilities.put(Capability.SupportedVpnTypes, "ipsec");
capabilities.put(Service.Vpn, vpnCapabilities);
capabilities.put(Service.Firewall, firewallCapabilities);
capabilities.put(Service.Gateway, null);
Map<Capability, String> sourceNatCapabilities = new HashMap<Capability, String>();

View File

@ -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));
}

View File

@ -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<Capability, String> gatewayCapabilities = new HashMap<Capability, String>();
gatewayCapabilities.put(Capability.RedundantRouter, "true");
capabilities.put(Service.Gateway, gatewayCapabilities);
capabilities.put(Service.Gateway, null);
Map<Capability, String> sourceNatCapabilities = new HashMap<Capability, String>();
sourceNatCapabilities.put(Capability.SupportedSourceNatTypes, "per account");
sourceNatCapabilities.put(Capability.RedundantRouter, "true");
capabilities.put(Service.SourceNat, sourceNatCapabilities);
capabilities.put(Service.StaticNat, null);

View File

@ -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;

View File

@ -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;
}