From 766c898504cb1a9aea009299eccd4fe89d1fee4f Mon Sep 17 00:00:00 2001 From: prachi Date: Fri, 21 Oct 2011 16:04:56 -0700 Subject: [PATCH] Changes: DeletePhysicalNetwork changes and Configuring NetworkMgr to hold map of providers -> elements --- api/src/com/cloud/network/Network.java | 6 +- .../cloud/network/element/NetworkElement.java | 4 + .../ConfigurationManagerImpl.java | 26 ++-- .../com/cloud/network/NetworkManagerImpl.java | 113 +++++++++--------- .../src/com/cloud/network/dao/NetworkDao.java | 2 + .../com/cloud/network/dao/NetworkDaoImpl.java | 7 ++ .../PhysicalNetworkServiceProviderDao.java | 2 + ...PhysicalNetworkServiceProviderDaoImpl.java | 7 ++ .../network/element/BareMetalElement.java | 2 +- .../RedundantVirtualRouterElement.java | 5 + 10 files changed, 96 insertions(+), 78 deletions(-) diff --git a/api/src/com/cloud/network/Network.java b/api/src/com/cloud/network/Network.java index e020d2a4c75..eeb3b3a709c 100644 --- a/api/src/com/cloud/network/Network.java +++ b/api/src/com/cloud/network/Network.java @@ -102,9 +102,13 @@ public interface Network extends ControlledEntity { } } + /** + * Provider -> NetworkElement must always be one-to-one mapping. Thus for each NetworkElement we need a separate Provider added in here. + */ public static class Provider { private static List supportedProviders = new ArrayList(); + public static final Provider VirtualRouter = new Provider("VirtualRouter", false); public static final Provider DhcpServer = new Provider("DhcpServer", false); public static final Provider JuniperSRX = new Provider("JuniperSRX", true); @@ -113,7 +117,7 @@ public interface Network extends ControlledEntity { public static final Provider ExternalDhcpServer = new Provider("ExternalDhcpServer", true); public static final Provider ExternalGateWay = new Provider("ExternalGateWay", true); public static final Provider ElasticLoadBalancerVm = new Provider("ElasticLoadBalancerVm", false); - + public static final Provider RedundantVirtualRouter = new Provider("RedundantVirtualRouter", false); public static final Provider defaultProvider = VirtualRouter; public static final Provider None = new Provider("None", false); diff --git a/api/src/com/cloud/network/element/NetworkElement.java b/api/src/com/cloud/network/element/NetworkElement.java index 8ff75971b09..d85b36c22c8 100644 --- a/api/src/com/cloud/network/element/NetworkElement.java +++ b/api/src/com/cloud/network/element/NetworkElement.java @@ -46,6 +46,10 @@ public interface NetworkElement extends Adapter { Map> getCapabilities(); + /** + * NOTE: + * NetworkElement -> Network.Provider is a one-to-one mapping. While adding a new NetworkElement, one must add a new Provider name to Network.Provider. + */ Provider getProvider(); /** diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index 9110515ca02..4691eca4e16 100755 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -995,13 +995,12 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura volumes.add(2, "there are storage volumes for this zone"); tablesToCheck.add(volumes); - //FIXME - move this part of verification to deletePhysicalNetwork code - List vnet = new ArrayList(); - vnet.add(0, "op_dc_vnet_alloc"); - vnet.add(1, "data_center_id"); - vnet.add(2, "there are allocated vnets for this zone"); - tablesToCheck.add(vnet); - + List physicalNetworks = new ArrayList(); + physicalNetworks.add(0, "physical_network"); + physicalNetworks.add(1, "data_center_id"); + physicalNetworks.add(2, "there are physical networks in this zone"); + tablesToCheck.add(physicalNetworks); + for (List table : tablesToCheck) { String tableName = table.get(0); String column = table.get(1); @@ -1023,7 +1022,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura selectSql += " AND taken IS NOT NULL"; } - if (tableName.equals("host_pod_ref") || tableName.equals("host") || tableName.equals("volumes")) { + if (tableName.equals("host_pod_ref") || tableName.equals("host") || tableName.equals("volumes") || tableName.equals("physical_network")) { selectSql += " AND removed is NULL"; } @@ -1143,17 +1142,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura _vlanDao.remove(vlan.getId()); } - // Delete networks - //FIXME - move this part to deletePhysicalNetwork - List networks = _networkDao.listByZoneIncludingRemoved(zoneId); - if (networks != null && !networks.isEmpty()) { - for (NetworkVO network : networks) { - _networkDao.remove(network.getId()); - } - } - - //FIXME - Delete physical networks belonging to the zone - success = _zoneDao.remove(zoneId); if (success) { diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index b3e0819c98a..57a1cc25be6 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -59,7 +59,6 @@ import com.cloud.dc.AccountVlanMapVO; import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenter.NetworkType; import com.cloud.dc.DataCenterVO; -import com.cloud.dc.DataCenterVnetVO; import com.cloud.dc.Pod; import com.cloud.dc.PodVlanMapVO; import com.cloud.dc.Vlan; @@ -269,6 +268,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag HashMap _lastNetworkIdsToFree = new HashMap(); private static HashMap> s_serviceToImplementedProvidersMap = new HashMap>(); + private static HashMap s_providerToNetworkElementMap = new HashMap(); @Override public PublicIp assignPublicIpAddress(long dcId, Long podId, Account owner, VlanType type, Long networkId, String requestedIp) throws InsufficientAddressCapacityException { @@ -884,10 +884,31 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag _allowSubdomainNetworkAccess = Boolean.valueOf(_configs.get(Config.SubDomainNetworkAccess.key())); - //populate s_serviceToImplementedProvidersMap with current _networkElements + s_logger.info("Network Manager is configured."); + + return true; + } + + @Override + public String getName() { + return _name; + } + + @Override + public boolean start() { + + //populate s_serviceToImplementedProvidersMap & s_providerToNetworkElementMap with current _networkElements + //Need to do this in start() since _networkElements are not completely configured until then. for (NetworkElement element : _networkElements) { Map> capabilities = element.getCapabilities(); Provider implementedProvider = element.getProvider(); + if(implementedProvider != null){ + if(s_providerToNetworkElementMap.containsKey(implementedProvider.getName())){ + s_logger.error("Cannot start NetworkManager: Provider <-> NetworkElement must be a one-to-one map, multiple NetworkElements found for Provider: "+implementedProvider.getName()); + return false; + } + s_providerToNetworkElementMap.put(implementedProvider.getName(), element.getName()); + } if(capabilities != null && implementedProvider != null){ for(Service service : capabilities.keySet()){ if(s_serviceToImplementedProvidersMap.containsKey(service)){ @@ -901,19 +922,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } } } - - s_logger.info("Network Manager is configured."); - - return true; - } - - @Override - public String getName() { - return _name; - } - - @Override - public boolean start() { + _executor.scheduleWithFixedDelay(new NetworkGarbageCollector(), _networkGcInterval, _networkGcInterval, TimeUnit.SECONDS); return true; } @@ -3688,30 +3697,31 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag @Override @ActionEvent(eventType = EventTypes.EVENT_PHYSICAL_NETWORK_DELETE, eventDescription = "deleting physical network", async = true) + @DB public boolean deletePhysicalNetwork(Long physicalNetworkId) { // verify input parameters - PhysicalNetworkVO network = _physicalNetworkDao.findById(physicalNetworkId); - if (network == null) { + PhysicalNetworkVO pNetwork = _physicalNetworkDao.findById(physicalNetworkId); + if (pNetwork == null) { throw new InvalidParameterValueException("Network id=" + physicalNetworkId + "doesn't exist in the system"); } - //for all networks associated, check if they can be deleted. - //delete physical network only if no network is associated to it - List networks = _networksDao.listByPhysicalNetwork(physicalNetworkId); - if(networks != null && !networks.isEmpty()){ - s_logger.debug("Unable to remove the physical network id=" + physicalNetworkId + " as it has active networks associated."); - return false; + checkIfPhysicalNetworkIsDeletable(physicalNetworkId); + + // Delete networks + List networks = _networksDao.listByPhysicalNetworkIncludingRemoved(physicalNetworkId); + if (networks != null && !networks.isEmpty()) { + for (NetworkVO network : networks) { + _networksDao.remove(network.getId()); + } } - List allocatedVnets = _dcDao.listAllocatedVnets(physicalNetworkId); - - if(allocatedVnets != null && !allocatedVnets.isEmpty()){ - s_logger.debug("Unable to remove the physical network id=" + physicalNetworkId + " as it has active vnets associated."); - return false; - } - //checkIfPhysicalNetworkIsDeletable(physicalNetworkId); + //delete vnets + _dcDao.deleteVnet(physicalNetworkId); + //delete service providers + _pNSPDao.deleteProviders(physicalNetworkId); + return _physicalNetworkDao.remove(physicalNetworkId); } @@ -3719,6 +3729,12 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag private void checkIfPhysicalNetworkIsDeletable(Long physicalNetworkId) { List> tablesToCheck = new ArrayList>(); + List vnet = new ArrayList(); + vnet.add(0, "op_dc_vnet_alloc"); + vnet.add(1, "physical_network_id"); + vnet.add(2, "there are allocated vnets for this physical network"); + tablesToCheck.add(vnet); + List networks = new ArrayList(); networks.add(0, "networks"); networks.add(1, "physical_network_id"); @@ -3736,24 +3752,8 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag publicIP.add(1, "data_center_id"); publicIP.add(2, "there are public IP addresses allocated for this zone"); tablesToCheck.add(publicIP); - - List vmInstance = new ArrayList(); - vmInstance.add(0, "vm_instance"); - vmInstance.add(1, "data_center_id"); - vmInstance.add(2, "there are virtual machines running in this zone"); - tablesToCheck.add(vmInstance); - - List volumes = new ArrayList(); - volumes.add(0, "volumes"); - volumes.add(1, "data_center_id"); - volumes.add(2, "there are storage volumes for this zone"); - tablesToCheck.add(volumes);*/ - - List vnet = new ArrayList(); - vnet.add(0, "op_dc_vnet_alloc"); - vnet.add(1, "physical_network_id"); - vnet.add(2, "there are allocated vnets for this physical network"); - tablesToCheck.add(vnet); + */ + for (List table : tablesToCheck) { String tableName = table.get(0); @@ -3764,6 +3764,10 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag String selectSql = "SELECT * FROM `" + dbName + "`.`" + tableName + "` WHERE " + column + " = ?"; + if (tableName.equals("networks")) { + selectSql += " AND removed is NULL"; + } + if (tableName.equals("op_dc_vnet_alloc")) { selectSql += " AND taken IS NOT NULL"; } @@ -3776,14 +3780,6 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag selectSql += " AND taken IS NOT NULL"; } - if (tableName.equals("host_pod_ref") || tableName.equals("host") || tableName.equals("volumes")) { - selectSql += " AND removed is NULL"; - } - - if (tableName.equals("vm_instance")) { - selectSql += " AND state != '" + VirtualMachine.State.Expunging.toString() + "'"; - } - Transaction txn = Transaction.currentTxn(); try { PreparedStatement stmt = txn.prepareAutoCloseStatement(selectSql); @@ -3896,7 +3892,10 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } if(enabled){ - //TODO: need to check if the provider is ready for the physical network. + //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); + //element.isReady(); provider.setState(PhysicalNetworkServiceProvider.State.Enabled); }else{ //do we need to do anything for the provider instances before disabling? diff --git a/server/src/com/cloud/network/dao/NetworkDao.java b/server/src/com/cloud/network/dao/NetworkDao.java index 001df77b9f7..d2cdb39799b 100644 --- a/server/src/com/cloud/network/dao/NetworkDao.java +++ b/server/src/com/cloud/network/dao/NetworkDao.java @@ -69,5 +69,7 @@ public interface NetworkDao extends GenericDao { List listByPhysicalNetwork(long physicalNetworkId); + List listByPhysicalNetworkIncludingRemoved(long physicalNetworkId); + List listSecurityGroupEnabledNetworks(); } diff --git a/server/src/com/cloud/network/dao/NetworkDaoImpl.java b/server/src/com/cloud/network/dao/NetworkDaoImpl.java index ba708971189..c77d93b32c3 100644 --- a/server/src/com/cloud/network/dao/NetworkDaoImpl.java +++ b/server/src/com/cloud/network/dao/NetworkDaoImpl.java @@ -347,5 +347,12 @@ public class NetworkDaoImpl extends GenericDaoBase implements N sc.setParameters("isSgEnabled", true); return listBy(sc); } + + @Override + public List listByPhysicalNetworkIncludingRemoved(long physicalNetworkId) { + SearchCriteria sc = PhysicalNetworkSearch.create(); + sc.setParameters("physicalNetworkId", physicalNetworkId); + return listIncludingRemovedBy(sc); + } } diff --git a/server/src/com/cloud/network/dao/PhysicalNetworkServiceProviderDao.java b/server/src/com/cloud/network/dao/PhysicalNetworkServiceProviderDao.java index b41e022c7aa..128add7718d 100644 --- a/server/src/com/cloud/network/dao/PhysicalNetworkServiceProviderDao.java +++ b/server/src/com/cloud/network/dao/PhysicalNetworkServiceProviderDao.java @@ -23,4 +23,6 @@ import com.cloud.utils.db.GenericDao; public interface PhysicalNetworkServiceProviderDao extends GenericDao { List listBy(long physicalNetworkId); + + void deleteProviders(long physicalNetworkId); } diff --git a/server/src/com/cloud/network/dao/PhysicalNetworkServiceProviderDaoImpl.java b/server/src/com/cloud/network/dao/PhysicalNetworkServiceProviderDaoImpl.java index 0bb9b24fcec..0a373510a48 100644 --- a/server/src/com/cloud/network/dao/PhysicalNetworkServiceProviderDaoImpl.java +++ b/server/src/com/cloud/network/dao/PhysicalNetworkServiceProviderDaoImpl.java @@ -45,5 +45,12 @@ public class PhysicalNetworkServiceProviderDaoImpl extends GenericDaoBase sc = physicalNetworkSearch.create(); + sc.setParameters("physicalNetworkId", physicalNetworkId); + remove(sc); + } } diff --git a/server/src/com/cloud/network/element/BareMetalElement.java b/server/src/com/cloud/network/element/BareMetalElement.java index 37fa43b2d3e..23c8f7ecdc2 100644 --- a/server/src/com/cloud/network/element/BareMetalElement.java +++ b/server/src/com/cloud/network/element/BareMetalElement.java @@ -61,7 +61,7 @@ public class BareMetalElement extends AdapterBase implements NetworkElement { @Override public Provider getProvider() { - return Provider.ExternalDhcpServer; + return null; } @Override diff --git a/server/src/com/cloud/network/element/RedundantVirtualRouterElement.java b/server/src/com/cloud/network/element/RedundantVirtualRouterElement.java index 4e5ae3ad771..b1d5811e24f 100644 --- a/server/src/com/cloud/network/element/RedundantVirtualRouterElement.java +++ b/server/src/com/cloud/network/element/RedundantVirtualRouterElement.java @@ -37,6 +37,11 @@ public class RedundantVirtualRouterElement extends VirtualRouterElement implemen @Inject NetworkManager _networkMgr; @Inject VirtualRouterElementsDao _vrElementsDao; + @Override + public Provider getProvider() { + return Provider.RedundantVirtualRouter; + } + private boolean canHandle(Type networkType, long offeringId) { boolean result = (networkType == Network.Type.Isolated && _networkMgr.isProviderSupported(offeringId, Service.Gateway, Provider.VirtualRouter)); if (!result) {