From d4e0fbda83cdd8e8a66a29a88a4b9ebe0f3c0e01 Mon Sep 17 00:00:00 2001 From: Alena Prokharchyk Date: Wed, 4 Jan 2012 12:31:30 -0800 Subject: [PATCH] bug 12686: added search by zoneId to the listNetworkOfferings --- .../api/commands/ListNetworkOfferingsCmd.java | 4 ++- api/src/com/cloud/network/NetworkService.java | 2 +- server/src/com/cloud/api/ApiDBUtils.java | 2 +- .../ConfigurationManagerImpl.java | 29 +++++++++++---- .../src/com/cloud/network/NetworkManager.java | 4 +++ .../com/cloud/network/NetworkManagerImpl.java | 35 +++++++++++++++++-- .../dao/NetworkOfferingServiceMapDao.java | 1 + .../dao/NetworkOfferingServiceMapDaoImpl.java | 14 ++++++++ .../cloud/network/MockNetworkManagerImpl.java | 2 +- 9 files changed, 80 insertions(+), 13 deletions(-) diff --git a/api/src/com/cloud/api/commands/ListNetworkOfferingsCmd.java b/api/src/com/cloud/api/commands/ListNetworkOfferingsCmd.java index fe70733b231..0f665b6e3d1 100644 --- a/api/src/com/cloud/api/commands/ListNetworkOfferingsCmd.java +++ b/api/src/com/cloud/api/commands/ListNetworkOfferingsCmd.java @@ -81,7 +81,9 @@ public class ListNetworkOfferingsCmd extends BaseListCmd { private List supportedServices; @Parameter(name=ApiConstants.SOURCE_NAT_SUPPORTED, type=CommandType.BOOLEAN, description="true if need to list only netwok offerings where source nat is supported, false otherwise") - private Boolean sourceNatSupported; + private Boolean sourceNatSupported; + + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// diff --git a/api/src/com/cloud/network/NetworkService.java b/api/src/com/cloud/network/NetworkService.java index 49d7e2b31ae..87eef8f07d1 100644 --- a/api/src/com/cloud/network/NetworkService.java +++ b/api/src/com/cloud/network/NetworkService.java @@ -84,7 +84,7 @@ public interface NetworkService { Network getSystemNetworkByZoneAndTrafficType(long zoneId, TrafficType trafficType); - Map> listNetworkOfferingServices(long networkOfferingId); + Map> listNetworkOfferingServicesAndProviders(long networkOfferingId); PhysicalNetwork createPhysicalNetwork(Long zoneId, String vnetRange, String networkSpeed, List isolationMethods, String broadcastDomainRange, Long domainId, List tags); diff --git a/server/src/com/cloud/api/ApiDBUtils.java b/server/src/com/cloud/api/ApiDBUtils.java index b4ca6a342cd..0d2982ed226 100755 --- a/server/src/com/cloud/api/ApiDBUtils.java +++ b/server/src/com/cloud/api/ApiDBUtils.java @@ -699,7 +699,7 @@ public class ApiDBUtils { } public static Map> listNetworkOfferingServices(long networkOfferingId) { - return _networkMgr.listNetworkOfferingServices(networkOfferingId); + return _networkMgr.listNetworkOfferingServicesAndProviders(networkOfferingId); } public static List getElementServices(Provider provider) { diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index 3a5ff24b1bb..07e9c5dff57 100755 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -103,12 +103,12 @@ import com.cloud.exception.ResourceUnavailableException; import com.cloud.host.HostVO; import com.cloud.host.dao.HostDao; import com.cloud.hypervisor.Hypervisor.HypervisorType; +import com.cloud.network.IPAddressVO; import com.cloud.network.Network; import com.cloud.network.Network.Capability; import com.cloud.network.Network.GuestType; import com.cloud.network.Network.Provider; import com.cloud.network.Network.Service; -import com.cloud.network.IPAddressVO; import com.cloud.network.NetworkManager; import com.cloud.network.NetworkVO; import com.cloud.network.Networks.BroadcastDomainType; @@ -163,6 +163,8 @@ import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.SecondaryStorageVmDao; import com.cloud.vm.dao.VMInstanceDao; +import edu.emory.mathcs.backport.java.util.Arrays; + @Local(value = { ConfigurationManager.class, ConfigurationService.class }) public class ConfigurationManagerImpl implements ConfigurationManager, ConfigurationService { public static final Logger s_logger = Logger.getLogger(ConfigurationManagerImpl.class.getName()); @@ -3200,6 +3202,9 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura if (zoneId != null) { zone = getZone(zoneId); + if (zone == null) { + throw new InvalidParameterValueException("Unable to find the zone by id=" + zoneId); + } } Object keyword = cmd.getKeyword(); @@ -3288,21 +3293,22 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura //filter by supported services boolean listBySupportedServices = (supportedServicesStr != null && !supportedServicesStr.isEmpty() && !offerings.isEmpty()); - boolean parseOfferings = (listBySupportedServices || sourceNatSupported != null); + boolean checkIfProvidersAreEnabled = (zoneId != null); + boolean parseOfferings = (listBySupportedServices || sourceNatSupported != null || checkIfProvidersAreEnabled); if (parseOfferings) { List supportedOfferings = new ArrayList(); - Service[] suppportedServices = null; + Service[] supportedServices = null; if (listBySupportedServices) { - suppportedServices = new Service[supportedServicesStr.size()]; + supportedServices = 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; + supportedServices[i] = service; } i++; } @@ -3310,9 +3316,20 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura for (NetworkOfferingVO offering : offerings) { boolean addOffering = true; + List checkForProviders = new ArrayList(); if (listBySupportedServices) { - addOffering = addOffering && _networkMgr.areServicesSupportedByNetworkOffering(offering.getId(), suppportedServices); + addOffering = addOffering && _networkMgr.areServicesSupportedByNetworkOffering(offering.getId(), supportedServices); + } + + if (checkIfProvidersAreEnabled) { + if (supportedServices != null && supportedServices.length > 0) { + checkForProviders = Arrays.asList(supportedServices); + } else { + checkForProviders = _networkMgr.listNetworkOfferingServices(offering.getId()); + } + + addOffering = addOffering && _networkMgr.areServicesEnabledInZone(zoneId, offering.getId(), offering.getTags(), checkForProviders); } if (sourceNatSupported != null) { diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java index 51443a9f160..747bbff4538 100644 --- a/server/src/com/cloud/network/NetworkManager.java +++ b/server/src/com/cloud/network/NetworkManager.java @@ -260,4 +260,8 @@ public interface NetworkManager extends NetworkService { HypervisorType hypervisorType); boolean canAddDefaultSecurityGroup(); + + List listNetworkOfferingServices(long networkOfferingId); + + boolean areServicesEnabledInZone(long zoneId, long networkOfferingId, String tags, List services); } diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 8e09dbda381..a21c6232667 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -3883,7 +3883,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } @Override - public Map> listNetworkOfferingServices(long networkOfferingId) { + public Map> listNetworkOfferingServicesAndProviders(long networkOfferingId) { Map> serviceProviderMap = new HashMap>(); List map = _ntwkOfferingSrvcDao.listByNetworkOfferingId(networkOfferingId); @@ -3952,8 +3952,8 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag protected boolean canUpgradeProviders(long oldNetworkOfferingId, long newNetworkOfferingId) { //list of services and providers should be the same - Map> newServices = listNetworkOfferingServices(newNetworkOfferingId); - Map> oldServices = listNetworkOfferingServices(oldNetworkOfferingId); + Map> newServices = listNetworkOfferingServicesAndProviders(newNetworkOfferingId); + Map> oldServices = listNetworkOfferingServicesAndProviders(oldNetworkOfferingId); if (newServices.size() < oldServices.size()) { s_logger.debug("Network offering downgrade is not allowed: number of supported services for the new offering " + newNetworkOfferingId + " is less than the old offering " + oldNetworkOfferingId); @@ -5429,4 +5429,33 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag String defaultAdding = _configDao.getValue(Config.SecurityGroupDefaultAdding.key()); return (defaultAdding != null && defaultAdding.equalsIgnoreCase("true")); } + + @Override + public List listNetworkOfferingServices(long networkOfferingId) { + List services = new ArrayList(); + List servicesStr = _ntwkOfferingSrvcDao.listServicesForNetworkOffering(networkOfferingId); + for (String serviceStr : servicesStr) { + services.add(Service.getService(serviceStr)); + } + + return services; + } + + @Override + public boolean areServicesEnabledInZone(long zoneId, long networkOfferingId, String tags, List services) { + long physicalNtwkId = findPhysicalNetworkId(zoneId, tags); + boolean result = true; + List checkedProvider = new ArrayList(); + for (Service service : services) { + //get all the providers, and check if each provider is enabled + List providerNames = _ntwkOfferingSrvcDao.listProvidersForServiceForNetworkOffering(networkOfferingId, service); + for (String providerName : providerNames) { + if (!checkedProvider.contains(providerName)) { + result = result && isProviderEnabledInPhysicalNetwork(physicalNtwkId, providerName); + } + } + } + + return result; + } } diff --git a/server/src/com/cloud/offerings/dao/NetworkOfferingServiceMapDao.java b/server/src/com/cloud/offerings/dao/NetworkOfferingServiceMapDao.java index ee774576b51..2ccbe5a7b7f 100644 --- a/server/src/com/cloud/offerings/dao/NetworkOfferingServiceMapDao.java +++ b/server/src/com/cloud/offerings/dao/NetworkOfferingServiceMapDao.java @@ -35,6 +35,7 @@ public interface NetworkOfferingServiceMapDao extends GenericDao listProvidersForServiceForNetworkOffering(long networkOfferingId, Service service); boolean isProviderForNetworkOffering(long networkOfferingId, Provider provider); + List listServicesForNetworkOffering(long networkOfferingId); } diff --git a/server/src/com/cloud/offerings/dao/NetworkOfferingServiceMapDaoImpl.java b/server/src/com/cloud/offerings/dao/NetworkOfferingServiceMapDaoImpl.java index 7620b7953aa..161cf4ddc1b 100644 --- a/server/src/com/cloud/offerings/dao/NetworkOfferingServiceMapDaoImpl.java +++ b/server/src/com/cloud/offerings/dao/NetworkOfferingServiceMapDaoImpl.java @@ -39,6 +39,7 @@ public class NetworkOfferingServiceMapDaoImpl extends GenericDaoBase AllFieldsSearch; final SearchBuilder MultipleServicesSearch; final GenericSearchBuilder ProvidersSearch; + final GenericSearchBuilder ServicesSearch; protected NetworkOfferingServiceMapDaoImpl() { super(); @@ -59,6 +60,11 @@ public class NetworkOfferingServiceMapDaoImpl extends GenericDaoBase listServicesForNetworkOffering(long networkOfferingId) { + SearchCriteria sc = ServicesSearch.create();; + sc.setParameters("networkOfferingId", networkOfferingId); + + return customSearch(sc, null); + } } diff --git a/server/test/com/cloud/network/MockNetworkManagerImpl.java b/server/test/com/cloud/network/MockNetworkManagerImpl.java index 881589ad56a..b0217a1819d 100755 --- a/server/test/com/cloud/network/MockNetworkManagerImpl.java +++ b/server/test/com/cloud/network/MockNetworkManagerImpl.java @@ -429,7 +429,7 @@ public class MockNetworkManagerImpl implements NetworkManager, Manager, NetworkS } @Override - public Map> listNetworkOfferingServices(long networkOfferingId) { + public Map> listNetworkOfferingServicesAndProviders(long networkOfferingId) { return null; }