From 17a7b7cda41cbbfd824a9425a4379acc571ad1bb Mon Sep 17 00:00:00 2001 From: alena Date: Fri, 4 Nov 2011 17:39:40 -0700 Subject: [PATCH] listNetworkOfferings: added an ability to filter based on the Services supported --- api/src/com/cloud/api/ApiConstants.java | 3 +- .../api/commands/ListNetworkOfferingsCmd.java | 9 ++++- .../ConfigurationManagerImpl.java | 32 +++++++++++++-- .../src/com/cloud/network/NetworkManager.java | 2 +- .../com/cloud/network/NetworkManagerImpl.java | 28 ++++++------- .../cloud/network/guru/DirectNetworkGuru.java | 6 +-- .../cloud/network/guru/GuestNetworkGuru.java | 2 +- .../lb/LoadBalancingRulesManagerImpl.java | 2 +- .../VirtualNetworkApplianceManagerImpl.java | 6 +-- .../cloud/network/rules/RulesManagerImpl.java | 2 +- .../vpn/RemoteAccessVpnManagerImpl.java | 2 +- .../dao/NetworkOfferingServiceMapDao.java | 2 +- .../dao/NetworkOfferingServiceMapDaoImpl.java | 39 +++++++++++++++---- .../cloud/network/MockNetworkManagerImpl.java | 2 +- 14 files changed, 98 insertions(+), 39 deletions(-) diff --git a/api/src/com/cloud/api/ApiConstants.java b/api/src/com/cloud/api/ApiConstants.java index b29048e9f57..c1ef4281453 100755 --- a/api/src/com/cloud/api/ApiConstants.java +++ b/api/src/com/cloud/api/ApiConstants.java @@ -292,6 +292,7 @@ public class ApiConstants { public static final String NETWORK_SERVICE_PROVIDER_ID = "nspid"; public static final String SECURITY_GROUP_SERVICE = "securitygroupservice"; public static final String SERVICE_LIST = "servicelist"; - public static final String CAN_ENABLE_INDIVIDUAL_SERVICE = "canEnableIndividualService"; + public static final String CAN_ENABLE_INDIVIDUAL_SERVICE = "canenableindividualservice"; + public static final String SUPPORTED_SERVICES = "supportedservices"; } diff --git a/api/src/com/cloud/api/commands/ListNetworkOfferingsCmd.java b/api/src/com/cloud/api/commands/ListNetworkOfferingsCmd.java index a29f2cea0cb..647b1aec8b6 100644 --- a/api/src/com/cloud/api/commands/ListNetworkOfferingsCmd.java +++ b/api/src/com/cloud/api/commands/ListNetworkOfferingsCmd.java @@ -27,7 +27,6 @@ import com.cloud.api.ApiConstants; import com.cloud.api.BaseListCmd; import com.cloud.api.Implementation; import com.cloud.api.Parameter; -import com.cloud.api.BaseCmd.CommandType; import com.cloud.api.response.ListResponse; import com.cloud.api.response.NetworkOfferingResponse; import com.cloud.offering.NetworkOffering; @@ -77,6 +76,10 @@ public class ListNetworkOfferingsCmd extends BaseListCmd { @Parameter(name=ApiConstants.GUEST_IP_TYPE, type=CommandType.STRING, description="list network offerings by guest type: Shared or Isolated") private String guestIpType; + //Network information + @Parameter(name=ApiConstants.SUPPORTED_SERVICES, type=CommandType.LIST, collectionType=CommandType.STRING, description="list network offerings supporting certain services") + private List supportedServices; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -129,6 +132,10 @@ public class ListNetworkOfferingsCmd extends BaseListCmd { return guestIpType; } + public List getSupportedServices() { + return supportedServices; + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index 12259ee6697..30a677bcba9 100755 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -3034,6 +3034,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura DataCenter zone = null; Long networkId = cmd.getNetworkId(); String guestIpType = cmd.getGuestIpType(); + List supportedServicesStr = cmd.getSupportedServices(); if (zoneId != null) { zone = getZone(zoneId); @@ -3096,7 +3097,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura // Don't return system network offerings to the user sc.addAnd("systemOnly", SearchCriteria.Op.EQ, false); - // list offerings available for upgrade only + // if networkId is specified, list offerings available for upgrade only (for this network) if (networkId != null) { // check if network exists and the caller can operate with it Network network = _networkMgr.getNetwork(networkId); @@ -3123,8 +3124,33 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura if (id != null) { sc.addAnd("id", SearchCriteria.Op.EQ, id); } - - return _networkOfferingDao.search(sc, searchFilter); + + List offerings = _networkOfferingDao.search(sc, searchFilter);; + + if (supportedServicesStr != null && !supportedServicesStr.isEmpty() && !offerings.isEmpty()) { + List supportedOfferings = new ArrayList(); + Service[] suppportedServices = new Service[supportedServicesStr.size()]; + int i = 0; + for (String supportedServiceStr : supportedServicesStr) { + Service service = Service.getService(supportedServiceStr); + if (service == null) { + throw new InvalidParameterValueException("Invalid service specified " + supportedServiceStr); + } else { + suppportedServices[i] = service; + } + i++; + } + + for (NetworkOfferingVO offering : offerings) { + if (_networkMgr.areServicesSupportedByNetworkOffering(offering.getId(), suppportedServices)) { + supportedOfferings.add(offering); + } + } + + return supportedOfferings; + } else { + return offerings; + } } @Override diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java index f4d8cdfadfe..44e2b07d084 100644 --- a/server/src/com/cloud/network/NetworkManager.java +++ b/server/src/com/cloud/network/NetworkManager.java @@ -190,7 +190,7 @@ public interface NetworkManager extends NetworkService { boolean applyIpAssociations(Network network, boolean continueOnError) throws ResourceUnavailableException; - boolean isServiceSupportedByNetworkOffering(long networkOfferingId, Network.Service service); + boolean areServicesSupportedByNetworkOffering(long networkOfferingId, Service... services); NetworkVO getNetworkWithSecurityGroupEnabled(Long zoneId); diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index e1465d36e6f..175ab7fc5c1 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -1386,7 +1386,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag // associate a source NAT IP (if one isn't already associated with the network) boolean sharedSourceNat = false; - if (isServiceSupportedByNetworkOffering(network.getNetworkOfferingId(), Service.SourceNat)) { + if (areServicesSupportedByNetworkOffering(network.getNetworkOfferingId(), Service.SourceNat)) { Map sourceNatCapabilities = getServiceCapabilities(network.getNetworkOfferingId(), Service.SourceNat); if (sourceNatCapabilities != null) { String supportedSourceNatTypes = sourceNatCapabilities.get(Capability.SupportedSourceNatTypes).toLowerCase(); @@ -1396,7 +1396,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } } - if (network.getGuestType() == Network.GuestType.Isolated && isServiceSupportedByNetworkOffering(network.getNetworkOfferingId(), Service.SourceNat) && !sharedSourceNat) { + if (network.getGuestType() == Network.GuestType.Isolated && areServicesSupportedByNetworkOffering(network.getNetworkOfferingId(), Service.SourceNat) && !sharedSourceNat) { List ips = _ipAddressDao.listByAssociatedNetwork(network.getId(), true); if (ips.isEmpty()) { @@ -1600,7 +1600,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag Network associatedNetwork = getNetwork(ipVO.getAssociatedWithNetworkId()); - if (isServiceSupportedByNetworkOffering(associatedNetwork.getNetworkOfferingId(), Service.SourceNat)) { + if (areServicesSupportedByNetworkOffering(associatedNetwork.getNetworkOfferingId(), Service.SourceNat)) { throw new IllegalArgumentException("ip address is used for source nat purposes and can not be disassociated."); } @@ -1805,7 +1805,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } // Regular user can create Guest Isolated Source Nat enabled network only - if (caller.getType() == Account.ACCOUNT_TYPE_NORMAL && (networkOffering.getTrafficType() != TrafficType.Guest || networkOffering.getGuestType() != Network.GuestType.Isolated && isServiceSupportedByNetworkOffering(networkOffering.getId(), Service.SourceNat))) { + if (caller.getType() == Account.ACCOUNT_TYPE_NORMAL && (networkOffering.getTrafficType() != TrafficType.Guest || networkOffering.getGuestType() != Network.GuestType.Isolated && areServicesSupportedByNetworkOffering(networkOffering.getId(), Service.SourceNat))) { throw new InvalidParameterValueException("Regular user can create a network only from the network offering having traffic type " + TrafficType.Guest + " and network type " + Network.GuestType.Isolated + " with a service " + Service.SourceNat + " enabled"); } @@ -1844,7 +1844,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag //Vlan is created in 2 cases: //1) GuestType is Shared //2) GuestType is Isolated, but SourceNat service is disabled - boolean createVlan = ((network.getGuestType() == Network.GuestType.Shared) || (network.getGuestType() == GuestType.Isolated && !isServiceSupportedByNetworkOffering(networkOffering.getId(), Service.SourceNat))); + boolean createVlan = ((network.getGuestType() == Network.GuestType.Shared) || (network.getGuestType() == GuestType.Isolated && !areServicesSupportedByNetworkOffering(networkOffering.getId(), Service.SourceNat))); if (caller.getType() == Account.ACCOUNT_TYPE_ADMIN && createVlan && defineNetworkConfig) { // Create vlan ip range @@ -1904,7 +1904,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } // If networkDomain is not specified, take it from the global configuration - if (isServiceSupportedByNetworkOffering(networkOfferingId, Service.Dns)) { + if (areServicesSupportedByNetworkOffering(networkOfferingId, Service.Dns)) { Map dnsCapabilities = getServiceCapabilities(networkOfferingId, Service.Dns); String isUpdateDnsSupported = dnsCapabilities.get(Capability.AllowDnsSuffixModification); if (isUpdateDnsSupported == null || !Boolean.valueOf(isUpdateDnsSupported)) { @@ -2731,7 +2731,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag @Override public Map getServiceCapabilities(Long networkOfferingId, Service service) { - if (!isServiceSupportedByNetworkOffering(networkOfferingId, service)) { + if (!areServicesSupportedByNetworkOffering(networkOfferingId, service)) { throw new UnsupportedServiceException("Service " + service.getName() + " is not supported by the network offering id=" + networkOfferingId); } @@ -3021,7 +3021,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag if (zone.getNetworkType() == NetworkType.Advanced) { if (usesJuniperForGatewayService && usesJuniperForFirewallService) { return true; - } else if (_ntwkOfferingSrvcDao.isServiceSupported(networkOfferingId, Service.Gateway) && (usesF5ForLBService || usesNetscalarForLBService)) { + } else if (_ntwkOfferingSrvcDao.areServicesSupported(networkOfferingId, Service.Gateway) && (usesF5ForLBService || usesNetscalarForLBService)) { return true; } else { return false; @@ -3033,8 +3033,8 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } @Override - public boolean isServiceSupportedByNetworkOffering(long networkOfferingId, Network.Service service) { - return (_ntwkOfferingSrvcDao.isServiceSupported(networkOfferingId, service)); + public boolean areServicesSupportedByNetworkOffering(long networkOfferingId, Service... services) { + return (_ntwkOfferingSrvcDao.areServicesSupported(networkOfferingId, services)); } private boolean cleanupIpResources(long ipId, long userId, Account caller) { @@ -3504,7 +3504,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag NetworkOffering newNetworkOffering = _networkOfferingDao.findById(newNetworkOfferingId); //security group service should be the same - if (isServiceSupportedByNetworkOffering(oldNetworkOfferingId, Service.SecurityGroup) != isServiceSupportedByNetworkOffering(newNetworkOfferingId, Service.SecurityGroup)) { + if (areServicesSupportedByNetworkOffering(oldNetworkOfferingId, Service.SecurityGroup) != areServicesSupportedByNetworkOffering(newNetworkOfferingId, Service.SecurityGroup)) { s_logger.debug("Offerings " + newNetworkOfferingId + " and " + oldNetworkOfferingId + " have different securityGroupProperty, can't upgrade"); return false; } @@ -4228,14 +4228,14 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag List offeringsToReturn = new ArrayList(); NetworkOffering originalOffering = _configMgr.getNetworkOffering(getNetwork(networkId).getNetworkOfferingId()); - boolean securityGroupSupportedByOriginalOff = isServiceSupportedByNetworkOffering(originalOffering.getId(), Service.SecurityGroup); + boolean securityGroupSupportedByOriginalOff = areServicesSupportedByNetworkOffering(originalOffering.getId(), Service.SecurityGroup); //security group supported property should be the same List offerings = _networkOfferingDao.getOfferingIdsToUpgradeFrom(originalOffering); for (Long offeringId : offerings) { - if (isServiceSupportedByNetworkOffering(offeringId, Service.SecurityGroup) == securityGroupSupportedByOriginalOff) { + if (areServicesSupportedByNetworkOffering(offeringId, Service.SecurityGroup) == securityGroupSupportedByOriginalOff) { offeringsToReturn.add(offeringId); } } @@ -4723,7 +4723,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag @Override public boolean isServiceEnabled(long physicalNetworkId, long networkOfferingId, Service service) { //check if the service is supported by the network offering - if (!isServiceSupportedByNetworkOffering(networkOfferingId, service)) { + if (!areServicesSupportedByNetworkOffering(networkOfferingId, service)) { s_logger.debug("Service " + service.getName() + " is not supported by the network offering id=" + networkOfferingId); return false; } diff --git a/server/src/com/cloud/network/guru/DirectNetworkGuru.java b/server/src/com/cloud/network/guru/DirectNetworkGuru.java index 11eb445383b..360bf23ebf1 100644 --- a/server/src/com/cloud/network/guru/DirectNetworkGuru.java +++ b/server/src/com/cloud/network/guru/DirectNetworkGuru.java @@ -78,8 +78,8 @@ public class DirectNetworkGuru extends AdapterBase implements NetworkGuru { protected boolean canHandle(NetworkOffering offering, DataCenter dc) { // this guru handles only non-system network with type=Shared and serviceNat service disabled //TODO - after broadCastDomainType + physical network are introduced, don't rely on network type of the dc - if (dc.getNetworkType() == NetworkType.Advanced && offering.getGuestType() == Network.GuestType.Shared && !_networkMgr.isServiceSupportedByNetworkOffering(offering.getId(), Service.SourceNat)&& offering.getTrafficType() == TrafficType.Guest) { - if (_networkMgr.isServiceSupportedByNetworkOffering(offering.getId(), Service.SecurityGroup)) { + if (dc.getNetworkType() == NetworkType.Advanced && offering.getGuestType() == Network.GuestType.Shared && !_networkMgr.areServicesSupportedByNetworkOffering(offering.getId(), Service.SourceNat)&& offering.getTrafficType() == TrafficType.Guest) { + if (_networkMgr.areServicesSupportedByNetworkOffering(offering.getId(), Service.SecurityGroup)) { return true; } else if (!offering.isSystemOnly()) { return true; @@ -127,7 +127,7 @@ public class DirectNetworkGuru extends AdapterBase implements NetworkGuru { } - boolean isSecurityGroupEnabled = _networkMgr.isServiceSupportedByNetworkOffering(offering.getId(), Service.SecurityGroup); + boolean isSecurityGroupEnabled = _networkMgr.areServicesSupportedByNetworkOffering(offering.getId(), Service.SecurityGroup); if (isSecurityGroupEnabled) { config.setName("SecurityGroupEnabledNetwork"); config.setDisplayText("SecurityGroupEnabledNetwork"); diff --git a/server/src/com/cloud/network/guru/GuestNetworkGuru.java b/server/src/com/cloud/network/guru/GuestNetworkGuru.java index 1e02e5e3741..4019c33a461 100644 --- a/server/src/com/cloud/network/guru/GuestNetworkGuru.java +++ b/server/src/com/cloud/network/guru/GuestNetworkGuru.java @@ -80,7 +80,7 @@ public class GuestNetworkGuru extends AdapterBase implements NetworkGuru { protected boolean canHandle(NetworkOffering offering, DataCenter dc) { // This guru handles only non-system Guest Isolated network that supports Source nat service - if (dc.getNetworkType() == NetworkType.Advanced && offering.getTrafficType() == TrafficType.Guest && offering.getGuestType() == Network.GuestType.Isolated && _networkMgr.isServiceSupportedByNetworkOffering(offering.getId(), Service.SourceNat) && !offering.isSystemOnly()) { + if (dc.getNetworkType() == NetworkType.Advanced && offering.getTrafficType() == TrafficType.Guest && offering.getGuestType() == Network.GuestType.Isolated && _networkMgr.areServicesSupportedByNetworkOffering(offering.getId(), Service.SourceNat) && !offering.isSystemOnly()) { return true; } else { s_logger.trace("We only take care of Guest Virtual networks in zone of type " + NetworkType.Advanced); diff --git a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java index 784a89f1572..ec479710e81 100755 --- a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java +++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java @@ -421,7 +421,7 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesManager, _accountMgr.checkAccess(caller.getCaller(), null, ipAddr); // verify that lb service is supported by the network - if (!_networkMgr.isServiceSupportedByNetworkOffering(network.getNetworkOfferingId(), Service.Lb)) { + if (!_networkMgr.areServicesSupportedByNetworkOffering(network.getNetworkOfferingId(), Service.Lb)) { throw new InvalidParameterValueException("LB service is not supported in network id= " + networkId); } diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index 6363a479618..d953d0cd9d9 100755 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -1031,9 +1031,9 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian long dcId = dest.getDataCenter().getId(); DataCenterDeployment plan = new DataCenterDeployment(dcId); - boolean isPodBased = (dest.getDataCenter().getNetworkType() == NetworkType.Basic || _networkMgr.isServiceSupportedByNetworkOffering(guestNetwork.getNetworkOfferingId(), Service.SecurityGroup)) && guestNetwork.getTrafficType() == TrafficType.Guest; + boolean isPodBased = (dest.getDataCenter().getNetworkType() == NetworkType.Basic || _networkMgr.areServicesSupportedByNetworkOffering(guestNetwork.getNetworkOfferingId(), Service.SecurityGroup)) && guestNetwork.getTrafficType() == TrafficType.Guest; boolean publicNetwork = false; - if (_networkMgr.isServiceSupportedByNetworkOffering(guestNetwork.getNetworkOfferingId(), Service.SourceNat)) { + if (_networkMgr.areServicesSupportedByNetworkOffering(guestNetwork.getNetworkOfferingId(), Service.SourceNat)) { publicNetwork = true; } if (isRedundant && !publicNetwork) { @@ -1333,7 +1333,7 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian DataCenterDeployment plan = null; DataCenter dc = dest.getDataCenter(); long dcId = dc.getId(); - boolean isPodBased = (dc.getNetworkType() == NetworkType.Basic || _networkMgr.isServiceSupportedByNetworkOffering(guestNetwork.getNetworkOfferingId(), Service.SecurityGroup)) && guestNetwork.getTrafficType() == TrafficType.Guest; + boolean isPodBased = (dc.getNetworkType() == NetworkType.Basic || _networkMgr.areServicesSupportedByNetworkOffering(guestNetwork.getNetworkOfferingId(), Service.SecurityGroup)) && guestNetwork.getTrafficType() == TrafficType.Guest; DomainRouterVO router = null; List routers = null; diff --git a/server/src/com/cloud/network/rules/RulesManagerImpl.java b/server/src/com/cloud/network/rules/RulesManagerImpl.java index ce9592bfd4f..3e406f7941a 100755 --- a/server/src/com/cloud/network/rules/RulesManagerImpl.java +++ b/server/src/com/cloud/network/rules/RulesManagerImpl.java @@ -343,7 +343,7 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { } Network network = _networkMgr.getNetwork(networkId); - if (!_networkMgr.isServiceSupportedByNetworkOffering(network.getNetworkOfferingId(), Service.Firewall)) { + if (!_networkMgr.areServicesSupportedByNetworkOffering(network.getNetworkOfferingId(), Service.Firewall)) { throw new InvalidParameterValueException("Unable to create static nat rule; Firewall service is not supported in network id=" + networkId); } diff --git a/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java b/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java index 27cd65674c6..6a1866f34d7 100755 --- a/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java +++ b/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java @@ -139,7 +139,7 @@ public class RemoteAccessVpnManagerImpl implements RemoteAccessVpnService, Manag //Verify that vpn service is enabled for the network Network network = _networkMgr.getNetwork(ipAddr.getAssociatedWithNetworkId()); - if (!_networkMgr.isServiceSupportedByNetworkOffering(network.getNetworkOfferingId(), Service.Vpn)) { + if (!_networkMgr.areServicesSupportedByNetworkOffering(network.getNetworkOfferingId(), Service.Vpn)) { throw new InvalidParameterValueException("Vpn service is not supported in network id=" + ipAddr.getAssociatedWithNetworkId()); } diff --git a/server/src/com/cloud/offerings/dao/NetworkOfferingServiceMapDao.java b/server/src/com/cloud/offerings/dao/NetworkOfferingServiceMapDao.java index 323ce374d1e..4231b78b176 100644 --- a/server/src/com/cloud/offerings/dao/NetworkOfferingServiceMapDao.java +++ b/server/src/com/cloud/offerings/dao/NetworkOfferingServiceMapDao.java @@ -30,7 +30,7 @@ import com.cloud.utils.db.GenericDao; * */ public interface NetworkOfferingServiceMapDao extends GenericDao { - boolean isServiceSupported(long networkOfferingId, Service service); + boolean areServicesSupported(long networkOfferingId, Service... services); boolean isProviderSupported(long networkOfferingId, Service service, Provider provider); List getServicesForProvider(long networkOfferingId, Provider provider); List getProvidersForService(long networkOfferingid, Service service); diff --git a/server/src/com/cloud/offerings/dao/NetworkOfferingServiceMapDaoImpl.java b/server/src/com/cloud/offerings/dao/NetworkOfferingServiceMapDaoImpl.java index b033bd89993..4109112191d 100644 --- a/server/src/com/cloud/offerings/dao/NetworkOfferingServiceMapDaoImpl.java +++ b/server/src/com/cloud/offerings/dao/NetworkOfferingServiceMapDaoImpl.java @@ -39,6 +39,7 @@ import com.cloud.utils.db.SearchCriteria; @Local(value=NetworkOfferingServiceMapDao.class) @DB(txn=false) public class NetworkOfferingServiceMapDaoImpl extends GenericDaoBase implements NetworkOfferingServiceMapDao { final SearchBuilder AllFieldsSearch; + final SearchBuilder MultipleServicesSearch; protected NetworkOfferingServiceMapDaoImpl() { super(); @@ -47,18 +48,42 @@ public class NetworkOfferingServiceMapDaoImpl extends GenericDaoBase sc = AllFieldsSearch.create(); + public boolean areServicesSupported(long networkOfferingId, Service... services) { + SearchCriteria sc = MultipleServicesSearch.create(); sc.setParameters("networkOfferingId", networkOfferingId); - sc.setParameters("service", service.getName()); - if (findOneBy(sc) != null) { - return true; - } else { - return false; + + if (services != null) { + String[] servicesStr = new String[services.length]; + + int i = 0; + for (Service service : services) { + servicesStr[i] = service.getName(); + i++; + } + + sc.setParameters("service", (Object[])servicesStr); } + + List offerings = listBy(sc); + + if (services != null) { + if (offerings.size() == services.length) { + return true; + } + } else if (!offerings.isEmpty()) { + return true; + } + + return false; } @Override diff --git a/server/test/com/cloud/network/MockNetworkManagerImpl.java b/server/test/com/cloud/network/MockNetworkManagerImpl.java index 35092947b11..ef17f8ac6a7 100644 --- a/server/test/com/cloud/network/MockNetworkManagerImpl.java +++ b/server/test/com/cloud/network/MockNetworkManagerImpl.java @@ -360,7 +360,7 @@ public class MockNetworkManagerImpl implements NetworkManager, Manager, NetworkS } @Override - public boolean isServiceSupportedByNetworkOffering(long networkOfferingId, Service service) { + public boolean areServicesSupportedByNetworkOffering(long networkOfferingId, Service... services) { // TODO Auto-generated method stub return false; }