diff --git a/api/src/com/cloud/network/NetworkService.java b/api/src/com/cloud/network/NetworkService.java index 1faba4ccc00..9e99c60bdf2 100644 --- a/api/src/com/cloud/network/NetworkService.java +++ b/api/src/com/cloud/network/NetworkService.java @@ -74,8 +74,6 @@ public interface NetworkService { NetworkProfile convertNetworkToNetworkProfile(long networkId); - Map> getZoneCapabilities(long zoneId); - Map> getNetworkCapabilities(long networkId, long zoneId); boolean isNetworkAvailableInDomain(long networkId, long domainId); diff --git a/server/src/com/cloud/dc/DataCenterVO.java b/server/src/com/cloud/dc/DataCenterVO.java index 45b9491cd84..8732e0c737e 100644 --- a/server/src/com/cloud/dc/DataCenterVO.java +++ b/server/src/com/cloud/dc/DataCenterVO.java @@ -165,7 +165,7 @@ public class DataCenterVO implements DataCenter { public void setFirewallProvider(String firewallProvider) { this.firewallProvider = firewallProvider; } - + public DataCenterVO(long id, String name, String description, String dns1, String dns2, String dns3, String dns4, String guestCidr, String domain, Long domainId, NetworkType zoneType, String zoneToken, String domainSuffix) { this(name, description, dns1, dns2, dns3, dns4, guestCidr, domain, domainId, zoneType, zoneToken, domainSuffix); this.id = id; @@ -221,7 +221,7 @@ public class DataCenterVO implements DataCenter { public void setUserDataProvider(String userDataProvider) { this.userDataProvider = userDataProvider; } - + @Override public Long getDomainId() { return domainId; diff --git a/server/src/com/cloud/network/ExternalNetworkDeviceManagerImpl.java b/server/src/com/cloud/network/ExternalNetworkDeviceManagerImpl.java index e3688fae8cb..2e96eb6ec2a 100644 --- a/server/src/com/cloud/network/ExternalNetworkDeviceManagerImpl.java +++ b/server/src/com/cloud/network/ExternalNetworkDeviceManagerImpl.java @@ -190,9 +190,9 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa return zoneId + "-" + name + "-" + ip; } - protected HostVO getExternalNetworkAppliance(long zoneId, Host.Type type) { + protected HostVO getExternalNetworkAppliance(long zoneId, long networkOfferingId, Host.Type type) { DataCenterVO zone = _dcDao.findById(zoneId); - if (!_networkMgr.zoneIsConfiguredForExternalNetworking(zoneId)) { + if (!_networkMgr.networkIsConfiguredForExternalNetworking(zoneId, networkOfferingId)) { s_logger.debug("Zone " + zone.getName() + " is not configured for external networking."); return null; } else { @@ -389,7 +389,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa // Find the external load balancer in this zone long zoneId = guestConfig.getDataCenterId(); DataCenterVO zone = _dcDao.findById(zoneId); - HostVO externalLoadBalancer = getExternalNetworkAppliance(zoneId, Host.Type.ExternalLoadBalancer); + HostVO externalLoadBalancer = getExternalNetworkAppliance(zoneId, guestConfig.getNetworkOfferingId(), Host.Type.ExternalLoadBalancer); if (externalLoadBalancer == null) { return false; @@ -433,7 +433,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa // Find the external load balancer in this zone long zoneId = network.getDataCenterId(); DataCenterVO zone = _dcDao.findById(zoneId); - HostVO externalLoadBalancer = getExternalNetworkAppliance(zoneId, Host.Type.ExternalLoadBalancer); + HostVO externalLoadBalancer = getExternalNetworkAppliance(zoneId, network.getNetworkOfferingId(), Host.Type.ExternalLoadBalancer); if (externalLoadBalancer == null) { return false; @@ -443,7 +443,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa boolean externalLoadBalancerIsInline = externalLoadBalancerIsInline(externalLoadBalancer); HostVO externalFirewall = null; if (externalLoadBalancerIsInline) { - externalFirewall = getExternalNetworkAppliance(zoneId, Host.Type.ExternalFirewall); + externalFirewall = getExternalNetworkAppliance(zoneId, network.getNetworkOfferingId(), Host.Type.ExternalFirewall); if (externalFirewall == null) { String msg = "External load balancer in zone " + zone.getName() + " is inline, but no external firewall in this zone."; s_logger.error(msg); @@ -675,7 +675,9 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa Host externalFirewall = _agentMgr.addHost(zoneId, resource, Host.Type.ExternalFirewall, hostDetails); if (externalFirewall != null) { - zone.setFirewallProvider(Network.Provider.JuniperSRX.getName()); + /* With NAAS, we no longer store default global providers with Zone. + * + zone.setFirewallProvider(Network.Provider.JuniperSRX.getName()); zone.setUserDataProvider(Network.Provider.DhcpServer.getName()); zone.setVpnProvider(null); @@ -695,7 +697,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa zone.setLoadBalancerProvider(Network.Provider.None.getName()); } - _dcDao.update(zone.getId(), zone); + _dcDao.update(zone.getId(), zone);*/ return externalFirewall; } else { return null; @@ -717,7 +719,9 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa try { if (_agentMgr.maintain(hostId) && _agentMgr.deleteHost(hostId, false, false, caller)) { - DataCenterVO zone = _dcDao.findById(externalFirewall.getDataCenterId()); + /* With NAAS, we do not have the concept of global providers stored with Zone + * + * DataCenterVO zone = _dcDao.findById(externalFirewall.getDataCenterId()); zone.setFirewallProvider(Network.Provider.VirtualRouter.getName()); zone.setUserDataProvider(Network.Provider.VirtualRouter.getName()); zone.setVpnProvider(Network.Provider.VirtualRouter.getName()); @@ -742,7 +746,8 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa } } - return _dcDao.update(zone.getId(), zone); + return _dcDao.update(zone.getId(), zone);*/ + return true; } else { return false; } @@ -796,7 +801,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa // Find the external firewall in this zone long zoneId = network.getDataCenterId(); DataCenterVO zone = _dcDao.findById(zoneId); - HostVO externalFirewall = getExternalNetworkAppliance(zoneId, Host.Type.ExternalFirewall); + HostVO externalFirewall = getExternalNetworkAppliance(zoneId, network.getNetworkOfferingId(), Host.Type.ExternalFirewall); if (externalFirewall == null) { return false; @@ -877,7 +882,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa // Find the external firewall in this zone long zoneId = network.getDataCenterId(); DataCenterVO zone = _dcDao.findById(zoneId); - HostVO externalFirewall = getExternalNetworkAppliance(zoneId, Host.Type.ExternalFirewall); + HostVO externalFirewall = getExternalNetworkAppliance(zoneId, network.getNetworkOfferingId(), Host.Type.ExternalFirewall); if (externalFirewall == null) { return false; @@ -947,7 +952,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa public boolean manageRemoteAccessVpn(boolean create, Network network, RemoteAccessVpn vpn) throws ResourceUnavailableException { - HostVO externalFirewall = getExternalNetworkAppliance(network.getDataCenterId(), Host.Type.ExternalFirewall); + HostVO externalFirewall = getExternalNetworkAppliance(network.getDataCenterId(), network.getNetworkOfferingId(), Host.Type.ExternalFirewall); if (externalFirewall == null) { return false; @@ -986,7 +991,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa } public boolean manageRemoteAccessVpnUsers(Network network, RemoteAccessVpn vpn, List vpnUsers) throws ResourceUnavailableException { - HostVO externalFirewall = getExternalNetworkAppliance(network.getDataCenterId(), Host.Type.ExternalFirewall); + HostVO externalFirewall = getExternalNetworkAppliance(network.getDataCenterId(), network.getNetworkOfferingId(), Host.Type.ExternalFirewall); if (externalFirewall == null) { return false; @@ -1271,14 +1276,20 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa s_logger.debug("External network stats collector is running..."); for (DataCenterVO zone : _dcDao.listAll()) { // Make sure the zone is configured for external networking - if (!_networkMgr.zoneIsConfiguredForExternalNetworking(zone.getId())) { + + //FIXME: add another way to check if zone has external networking. + + if (!_networkMgr.zoneIsConfiguredForExternalNetworking(zone.getId())) { s_logger.debug("Zone " + zone.getName() + " is not configured for external networking, so skipping usage check."); continue; } // Only collect stats if there is an external firewall in this zone - HostVO externalFirewall = getExternalNetworkAppliance(zone.getId(), Host.Type.ExternalFirewall); - HostVO externalLoadBalancer = getExternalNetworkAppliance(zone.getId(), Host.Type.ExternalLoadBalancer); + + //FIXME: add another way to check if zone has external networking. + + HostVO externalFirewall = getExternalNetworkAppliance(zone.getId(), 0, Host.Type.ExternalFirewall); + HostVO externalLoadBalancer = getExternalNetworkAppliance(zone.getId(), 0, Host.Type.ExternalLoadBalancer); if (externalFirewall == null) { s_logger.debug("Skipping usage check for zone " + zone.getName()); diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java index b9d41423359..38285f1ee28 100644 --- a/server/src/com/cloud/network/NetworkManager.java +++ b/server/src/com/cloud/network/NetworkManager.java @@ -187,10 +187,13 @@ public interface NetworkManager extends NetworkService { Nic getDefaultNic(long vmId); List getPasswordResetElements(); - + + @Deprecated boolean zoneIsConfiguredForExternalNetworking(long zoneId); + + boolean networkIsConfiguredForExternalNetworking(long zoneId, long networkOfferingId); - Map getServiceCapabilities(long zoneId, Long networkOfferingId, Service service); + Map getServiceCapabilities(Long networkOfferingId, Service service); boolean applyIpAssociations(Network network, boolean continueOnError) throws ResourceUnavailableException; diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 57a1cc25be6..212df37fe69 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -28,7 +28,6 @@ import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Random; @@ -270,6 +269,12 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag private static HashMap> s_serviceToImplementedProvidersMap = new HashMap>(); private static HashMap s_providerToNetworkElementMap = new HashMap(); + private NetworkElement getElementImplementingProvider(String providerName){ + String elementName = s_providerToNetworkElementMap.get(providerName); + NetworkElement element = _networkElements.get(elementName); + return element; + } + @Override public PublicIp assignPublicIpAddress(long dcId, Long podId, Account owner, VlanType type, Long networkId, String requestedIp) throws InsufficientAddressCapacityException { return fetchNewPublicIp(dcId, podId, null, owner, type, networkId, false, true, requestedIp); @@ -1794,7 +1799,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag // If networkDomain is not specified, take it from the global configuration if (isServiceSupportedByNetworkOffering(networkOfferingId, Service.Dns)) { - Map dnsCapabilities = getServiceCapabilities(zoneId, networkOfferingId, Service.Dns); + Map dnsCapabilities = getServiceCapabilities(networkOfferingId, Service.Dns); String isUpdateDnsSupported = dnsCapabilities.get(Capability.AllowDnsSuffixModification); if (isUpdateDnsSupported == null || !Boolean.valueOf(isUpdateDnsSupported)) { if (networkDomain != null) { @@ -2600,65 +2605,30 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag return _networksDao.getActiveNicsIn(networkId); } - @Override - public Map> getZoneCapabilities(long zoneId) { - DataCenterVO dc = _dcDao.findById(zoneId); - if (dc == null) { - throw new InvalidParameterValueException("Zone id=" + zoneId + " doesn't exist in the system."); - } - - // Get all service providers from the datacenter - Map providers = new HashMap(); - providers.put(Service.Firewall, dc.getFirewallProvider()); - providers.put(Service.Lb, dc.getLoadBalancerProvider()); - providers.put(Service.Vpn, dc.getVpnProvider()); - providers.put(Service.Dns, dc.getDnsProvider()); - providers.put(Service.Gateway, dc.getGatewayProvider()); - providers.put(Service.UserData, dc.getUserDataProvider()); - providers.put(Service.Dhcp, dc.getDhcpProvider()); - - Map> zoneCapabilities = new HashMap>(); - - for (NetworkElement element : _networkElements) { - if (providers.isEmpty()) { - break; - } - Map> elementCapabilities = element.getCapabilities(); - if (elementCapabilities != null) { - Iterator it = providers.keySet().iterator(); - while (it.hasNext()) { - Service service = it.next(); - String zoneProvider = providers.get(service); - if (zoneProvider != null) { - if (zoneProvider.equalsIgnoreCase(element.getProvider().getName())) { - if (elementCapabilities.containsKey(service)) { - Map capabilities = elementCapabilities.get(service); - // Verify if Service support capability - if (capabilities != null) { - for (Capability capability : capabilities.keySet()) { - assert (service.containsCapability(capability)) : "Capability " + capability.getName() + " is not supported by the service " + service.getName(); - } - } - zoneCapabilities.put(service, capabilities); - it.remove(); - } - } - } - } - } - } - return zoneCapabilities; - } - + @Override public Map> getNetworkCapabilities(long networkOfferingId, long zoneId) { - Map> zoneCapabilities = getZoneCapabilities(zoneId); Map> networkCapabilities = new HashMap>(); - for (Service service : zoneCapabilities.keySet()) { - if (isServiceSupportedByNetworkOffering(networkOfferingId, service)) { - networkCapabilities.put(service, zoneCapabilities.get(service)); + //list all services of this networkOffering + List servicesMap = _ntwkOfferingSrvcDao.getServices(networkOfferingId); + for(NetworkOfferingServiceMapVO instance : servicesMap ){ + Service service = Service.getService(instance.getService()); + //FIXME what if a service has multiple providers in the same networkOffering? + if(networkCapabilities.containsKey(service)){ + if(s_logger.isDebugEnabled()){ + s_logger.debug("Network Offering: "+ networkOfferingId +" has multiple Providers associated for this Service:"+service.getName()); + s_logger.debug("Returning the capabilities of the first Provider"); + } + continue; + } + NetworkElement element = getElementImplementingProvider(instance.getProvider()); + if(element != null){ + Map> elementCapabilities = element.getCapabilities();; + if (elementCapabilities != null && elementCapabilities.get(service) != null) { + networkCapabilities.put(service, elementCapabilities.get(instance.getService())); + } } } @@ -2666,18 +2636,35 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } @Override - public Map getServiceCapabilities(long zoneId, Long networkOfferingId, Service service) { + public Map getServiceCapabilities(Long networkOfferingId, Service service) { if (!isServiceSupportedByNetworkOffering(networkOfferingId, service)) { throw new UnsupportedServiceException("Service " + service.getName() + " is not supported by the network offering id=" + networkOfferingId); } + + Map serviceCapabilities = new HashMap(); - Map> networkCapabilities = getZoneCapabilities(zoneId); - if (networkCapabilities.get(service) == null) { - throw new UnsupportedServiceException("Service " + service.getName() + " is not supported in zone id=" + zoneId); + //get the Provider for this Service for this offering + List serviceProviderNames = _ntwkOfferingSrvcDao.getProvidersForService(networkOfferingId, service); + + //FIXME we return the capabilities of the first provider of the service - what if we have multiple providers for same Service? + if(serviceProviderNames != null && !serviceProviderNames.isEmpty()){ + NetworkElement element = getElementImplementingProvider(serviceProviderNames.get(0)); + if(element != null){ + Map> elementCapabilities = element.getCapabilities();; + + if (elementCapabilities == null || elementCapabilities.get(service) == null) { + throw new UnsupportedServiceException("Service " + service.getName() + " is not supported by the element=" + element.getName() + " implementing Provider=" + serviceProviderNames.get(0)); + } + serviceCapabilities = elementCapabilities.get(service); + } + }else{ + if(s_logger.isDebugEnabled()){ + s_logger.debug("Network Offering: "+ networkOfferingId +" does not have any Providers associated for this Service:"+service.getName()); + } } - - return networkCapabilities.get(service); + + return serviceCapabilities; } @Override @@ -2907,6 +2894,8 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } @Override + @Deprecated + // try to use the method networkIsConfiguredForExternalNetworking instead public boolean zoneIsConfiguredForExternalNetworking(long zoneId) { DataCenterVO zone = _dcDao.findById(zoneId); @@ -2925,6 +2914,28 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } } + + @Override + public boolean networkIsConfiguredForExternalNetworking(long zoneId, long networkOfferingId) { + DataCenterVO zone = _dcDao.findById(zoneId); + + boolean usesJuniperForGatewayService = _ntwkOfferingSrvcDao.isProviderSupported(networkOfferingId, Service.Gateway, Network.Provider.JuniperSRX); + boolean usesJuniperForFirewallService = _ntwkOfferingSrvcDao.isProviderSupported(networkOfferingId, Service.Firewall, Network.Provider.JuniperSRX); + boolean usesNetscalarForLBService = _ntwkOfferingSrvcDao.isProviderSupported(networkOfferingId, Service.Lb, Network.Provider.NetscalerMPX); + + if (zone.getNetworkType() == NetworkType.Advanced) { + if (usesJuniperForGatewayService && usesJuniperForFirewallService) { + return true; + } else if (_ntwkOfferingSrvcDao.isServiceSupported(networkOfferingId, Service.Gateway) && usesNetscalarForLBService) { + return true; + } else { + return false; + } + } else { + return usesJuniperForFirewallService; + } + + } @Override public boolean isServiceSupportedByNetworkOffering(long networkOfferingId, Network.Service service) { @@ -3134,7 +3145,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } - Map dnsCapabilities = getServiceCapabilities(network.getDataCenterId(), network.getNetworkOfferingId(), Service.Dns); + Map dnsCapabilities = getServiceCapabilities(network.getNetworkOfferingId(), Service.Dns); String isUpdateDnsSupported = dnsCapabilities.get(Capability.AllowDnsSuffixModification); if (isUpdateDnsSupported == null || !Boolean.valueOf(isUpdateDnsSupported)) { throw new InvalidParameterValueException("Domain name change is not supported for network id=" + network.getNetworkOfferingId() + " in zone id=" + network.getDataCenterId()); @@ -3893,8 +3904,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag if(enabled){ //TODO: need to check if the provider element is ready for the physical network. - String elementName = s_providerToNetworkElementMap.get(provider.getProviderName()); - NetworkElement element = _networkElements.get(elementName); + NetworkElement element = getElementImplementingProvider(provider.getProviderName()); //element.isReady(); provider.setState(PhysicalNetworkServiceProvider.State.Enabled); }else{ diff --git a/server/src/com/cloud/network/element/F5ExternalLoadBalancerElement.java b/server/src/com/cloud/network/element/F5ExternalLoadBalancerElement.java index 4208556386e..9a9c62d8018 100644 --- a/server/src/com/cloud/network/element/F5ExternalLoadBalancerElement.java +++ b/server/src/com/cloud/network/element/F5ExternalLoadBalancerElement.java @@ -41,10 +41,9 @@ import com.cloud.network.Network.Provider; import com.cloud.network.Network.Service; import com.cloud.network.NetworkManager; import com.cloud.network.Networks.TrafficType; -import com.cloud.network.PublicIpAddress; import com.cloud.network.rules.FirewallRule; -import com.cloud.network.rules.StaticNat; import com.cloud.offering.NetworkOffering; +import com.cloud.offerings.dao.NetworkOfferingServiceMapDao; import com.cloud.utils.component.AdapterBase; import com.cloud.utils.component.Inject; import com.cloud.vm.NicProfile; @@ -60,6 +59,7 @@ public class F5ExternalLoadBalancerElement extends AdapterBase implements LoadBa @Inject NetworkManager _networkManager; @Inject ExternalNetworkDeviceManager _externalNetworkManager; @Inject ConfigurationManager _configMgr; + @Inject NetworkOfferingServiceMapDao _ntwkOfferingSrvcDao; private boolean canHandle(Network config) { DataCenter zone = _configMgr.getZone(config.getDataCenterId()); @@ -68,8 +68,8 @@ public class F5ExternalLoadBalancerElement extends AdapterBase implements LoadBa return false; } - return (_networkManager.zoneIsConfiguredForExternalNetworking(zone.getId()) && - zone.getLoadBalancerProvider() != null && zone.getLoadBalancerProvider().equals(Network.Provider.F5BigIp.getName())); + return (_networkManager.networkIsConfiguredForExternalNetworking(zone.getId(), config.getNetworkOfferingId()) && + _ntwkOfferingSrvcDao.isProviderSupported(config.getNetworkOfferingId(), Service.Lb, Network.Provider.F5BigIp)); } @Override diff --git a/server/src/com/cloud/network/element/JuniperSRXExternalFirewallElement.java b/server/src/com/cloud/network/element/JuniperSRXExternalFirewallElement.java index 537454c26fa..feea82cd6d0 100644 --- a/server/src/com/cloud/network/element/JuniperSRXExternalFirewallElement.java +++ b/server/src/com/cloud/network/element/JuniperSRXExternalFirewallElement.java @@ -47,7 +47,6 @@ import com.cloud.network.RemoteAccessVpn; import com.cloud.network.VpnUser; import com.cloud.network.dao.NetworkDao; import com.cloud.network.rules.FirewallRule; -import com.cloud.network.rules.StaticNat; import com.cloud.offering.NetworkOffering; import com.cloud.offerings.NetworkOfferingVO; import com.cloud.offerings.dao.NetworkOfferingDao; @@ -79,7 +78,7 @@ public class JuniperSRXExternalFirewallElement extends AdapterBase implements So return false; } - return _networkManager.zoneIsConfiguredForExternalNetworking(zone.getId()); + return _networkManager.networkIsConfiguredForExternalNetworking(zone.getId(),config.getNetworkOfferingId()); } @Override diff --git a/server/src/com/cloud/network/element/NetscalerExternalLoadBalancerElement.java b/server/src/com/cloud/network/element/NetscalerExternalLoadBalancerElement.java index e1393694428..352c26a48fe 100644 --- a/server/src/com/cloud/network/element/NetscalerExternalLoadBalancerElement.java +++ b/server/src/com/cloud/network/element/NetscalerExternalLoadBalancerElement.java @@ -41,10 +41,9 @@ import com.cloud.network.Network.Provider; import com.cloud.network.Network.Service; import com.cloud.network.NetworkManager; import com.cloud.network.Networks.TrafficType; -import com.cloud.network.PublicIpAddress; import com.cloud.network.rules.FirewallRule; -import com.cloud.network.rules.StaticNat; import com.cloud.offering.NetworkOffering; +import com.cloud.offerings.dao.NetworkOfferingServiceMapDao; import com.cloud.utils.component.AdapterBase; import com.cloud.utils.component.Inject; import com.cloud.vm.NicProfile; @@ -60,6 +59,7 @@ public class NetscalerExternalLoadBalancerElement extends AdapterBase implements @Inject NetworkManager _networkManager; @Inject ExternalNetworkDeviceManager _externalNetworkManager; @Inject ConfigurationManager _configMgr; + @Inject NetworkOfferingServiceMapDao _ntwkOfferingSrvcDao; private boolean canHandle(Network config) { DataCenter zone = _configMgr.getZone(config.getDataCenterId()); @@ -68,8 +68,8 @@ public class NetscalerExternalLoadBalancerElement extends AdapterBase implements return false; } - return (_networkManager.zoneIsConfiguredForExternalNetworking(zone.getId()) && - zone.getLoadBalancerProvider() != null && zone.getLoadBalancerProvider().equals(Network.Provider.NetscalerMPX.getName())); + return (_networkManager.networkIsConfiguredForExternalNetworking(zone.getId(), config.getNetworkOfferingId()) && + _ntwkOfferingSrvcDao.isProviderSupported(config.getNetworkOfferingId(), Service.Lb, Network.Provider.NetscalerMPX)); } @Override diff --git a/server/src/com/cloud/network/firewall/FirewallManagerImpl.java b/server/src/com/cloud/network/firewall/FirewallManagerImpl.java index a35fd5956ed..69e26bc42d1 100644 --- a/server/src/com/cloud/network/firewall/FirewallManagerImpl.java +++ b/server/src/com/cloud/network/firewall/FirewallManagerImpl.java @@ -358,10 +358,10 @@ public class FirewallManagerImpl implements FirewallService, FirewallManager, Ma if (purpose == Purpose.LoadBalancing) { if (!_elbEnabled) { - protocolCapabilities = _networkMgr.getServiceCapabilities(network.getDataCenterId(), network.getNetworkOfferingId(), Service.Lb); + protocolCapabilities = _networkMgr.getServiceCapabilities(network.getNetworkOfferingId(), Service.Lb); } } else { - protocolCapabilities = _networkMgr.getServiceCapabilities(network.getDataCenterId(), network.getNetworkOfferingId(), Service.Firewall); + protocolCapabilities = _networkMgr.getServiceCapabilities(network.getNetworkOfferingId(), Service.Firewall); } if (protocolCapabilities != null) { diff --git a/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java b/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java index 5bca18cecaa..1760f20f36d 100644 --- a/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java +++ b/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java @@ -88,7 +88,7 @@ public class ExternalGuestNetworkGuru extends GuestNetworkGuru { NetworkVO config = (NetworkVO) super.design(offering, plan, userSpecified, owner); if (config == null) { return null; - } else if (_networkMgr.zoneIsConfiguredForExternalNetworking(plan.getDataCenterId())) { + } else if (_networkMgr.networkIsConfiguredForExternalNetworking(plan.getDataCenterId(), config.getNetworkOfferingId())) { config.setState(State.Allocated); } @@ -103,7 +103,7 @@ public class ExternalGuestNetworkGuru extends GuestNetworkGuru { return null; } - if (!_networkMgr.zoneIsConfiguredForExternalNetworking(config.getDataCenterId())) { + if (!_networkMgr.networkIsConfiguredForExternalNetworking(config.getDataCenterId(), config.getNetworkOfferingId())) { return super.implement(config, offering, dest, context); } @@ -176,7 +176,7 @@ public class ExternalGuestNetworkGuru extends GuestNetworkGuru { public NicProfile allocate(Network config, NicProfile nic, VirtualMachineProfile vm) throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException { - if (_networkMgr.zoneIsConfiguredForExternalNetworking(config.getDataCenterId()) && nic != null && nic.getRequestedIp() != null) { + if (_networkMgr.networkIsConfiguredForExternalNetworking(config.getDataCenterId(), config.getNetworkOfferingId()) && nic != null && nic.getRequestedIp() != null) { throw new CloudRuntimeException("Does not support custom ip allocation at this time: " + nic); } @@ -204,7 +204,7 @@ public class ExternalGuestNetworkGuru extends GuestNetworkGuru { return; } - if (_networkMgr.zoneIsConfiguredForExternalNetworking(config.getDataCenterId())) { + if (_networkMgr.networkIsConfiguredForExternalNetworking(config.getDataCenterId(), config.getNetworkOfferingId())) { nic.setIp4Address(null); nic.setGateway(null); nic.setNetmask(null); @@ -221,7 +221,7 @@ public class ExternalGuestNetworkGuru extends GuestNetworkGuru { return; } DataCenter dc = _dcDao.findById(config.getDataCenterId()); - if (_networkMgr.zoneIsConfiguredForExternalNetworking(config.getDataCenterId())) { + if (_networkMgr.networkIsConfiguredForExternalNetworking(config.getDataCenterId(), config.getNetworkOfferingId())) { nic.setBroadcastUri(config.getBroadcastUri()); nic.setIsolationUri(config.getBroadcastUri()); nic.setDns1(dc.getDns1()); @@ -255,7 +255,7 @@ public class ExternalGuestNetworkGuru extends GuestNetworkGuru { } NetworkVO network = _networkDao.findById(nic.getNetworkId()); - if (network != null && _networkMgr.zoneIsConfiguredForExternalNetworking(network.getDataCenterId())) { + if (network != null && _networkMgr.networkIsConfiguredForExternalNetworking(network.getDataCenterId(), network.getNetworkOfferingId())) { return true; } else { return super.release(nic, vm, reservationId); diff --git a/server/src/com/cloud/offerings/dao/NetworkOfferingServiceMapDaoImpl.java b/server/src/com/cloud/offerings/dao/NetworkOfferingServiceMapDaoImpl.java index 5aa825bc9f1..b033bd89993 100644 --- a/server/src/com/cloud/offerings/dao/NetworkOfferingServiceMapDaoImpl.java +++ b/server/src/com/cloud/offerings/dao/NetworkOfferingServiceMapDaoImpl.java @@ -74,6 +74,7 @@ public class NetworkOfferingServiceMapDaoImpl extends GenericDaoBase getServicesForProvider(long networkOfferingId, Provider provider) { List services = new ArrayList(); diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 8fd9ac2144d..22185fa8ba4 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -118,6 +118,7 @@ import com.cloud.hypervisor.dao.HypervisorCapabilitiesDao; import com.cloud.network.IPAddressVO; import com.cloud.network.Network; import com.cloud.network.Network.Provider; +import com.cloud.network.Network.Service; import com.cloud.network.NetworkManager; import com.cloud.network.NetworkVO; import com.cloud.network.Networks.TrafficType; @@ -139,6 +140,7 @@ import com.cloud.offering.NetworkOffering.Availability; import com.cloud.offering.ServiceOffering; import com.cloud.offerings.NetworkOfferingVO; import com.cloud.offerings.dao.NetworkOfferingDao; +import com.cloud.offerings.dao.NetworkOfferingServiceMapDao; import com.cloud.org.Cluster; import com.cloud.org.Grouping; import com.cloud.projects.Project; @@ -346,6 +348,8 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager protected FirewallManager _firewallMgr; @Inject protected ProjectManager _projectMgr; + @Inject + protected NetworkOfferingServiceMapDao _ntwkOfferingSrvcDao; protected ScheduledExecutorService _executor = null; protected int _expungeInterval; @@ -2691,6 +2695,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager List nics = _nicDao.listByVmId(vm.getId()); NicVO guestNic = null; + NetworkVO guestNetwork = null; for (NicVO nic : nics) { NetworkVO network = _networkDao.findById(nic.getNetworkId()); long isDefault = (nic.isDefaultNic()) ? 1 : 0; @@ -2699,6 +2704,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager if (network.getTrafficType() == TrafficType.Guest) { originalIp = nic.getIp4Address(); guestNic = nic; + guestNetwork = network; } } boolean ipChanged = false; @@ -2717,7 +2723,8 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager if (ipChanged) { DataCenterVO dc = _dcDao.findById(vm.getDataCenterIdToDeployIn()); UserVmVO userVm = profile.getVirtualMachine(); - if (dc.getDhcpProvider().equalsIgnoreCase(Provider.ExternalDhcpServer.getName())){ + //dc.getDhcpProvider().equalsIgnoreCase(Provider.ExternalDhcpServer.getName()) + if (_ntwkOfferingSrvcDao.isProviderSupported(guestNetwork.getNetworkOfferingId(), Service.Dhcp, Provider.ExternalDhcpServer)){ _nicDao.update(guestNic.getId(), guestNic); userVm.setPrivateIpAddress(guestNic.getIp4Address()); _vmDao.update(userVm.getId(), userVm);