From cb329095b19e94cef014de9deb9964117e524844 Mon Sep 17 00:00:00 2001 From: alena Date: Thu, 27 Oct 2011 10:47:41 -0700 Subject: [PATCH] When restartNetwork, just shutdown/implement elements and rules, no need to shutdown/implement the network itself. --- .../DefaultComponentLibrary.java | 2 + .../com/cloud/network/NetworkManagerImpl.java | 133 ++++++++++-------- .../PhysicalNetworkExternalDeviceVO.java | 3 + 3 files changed, 77 insertions(+), 61 deletions(-) diff --git a/server/src/com/cloud/configuration/DefaultComponentLibrary.java b/server/src/com/cloud/configuration/DefaultComponentLibrary.java index 251c163bdbe..a29ed284b4b 100755 --- a/server/src/com/cloud/configuration/DefaultComponentLibrary.java +++ b/server/src/com/cloud/configuration/DefaultComponentLibrary.java @@ -81,6 +81,7 @@ import com.cloud.network.dao.NetworkDaoImpl; import com.cloud.network.dao.NetworkDomainDaoImpl; import com.cloud.network.dao.NetworkRuleConfigDaoImpl; import com.cloud.network.dao.PhysicalNetworkDaoImpl; +import com.cloud.network.dao.PhysicalNetworkExternalDeviceDaoImpl; import com.cloud.network.dao.PhysicalNetworkServiceProviderDaoImpl; import com.cloud.network.dao.RemoteAccessVpnDaoImpl; import com.cloud.network.dao.VirtualRouterElementsDaoImpl; @@ -297,6 +298,7 @@ public class DefaultComponentLibrary extends ComponentLibraryBase implements Com addDao("PhysicalNetworkDao", PhysicalNetworkDaoImpl.class); addDao("PhysicalNetworkServiceProviderDao", PhysicalNetworkServiceProviderDaoImpl.class); addDao("VirtualRouterElementsDao", VirtualRouterElementsDaoImpl.class); + addDao("PhysicalNetworkExternalDeviceDao", PhysicalNetworkExternalDeviceDaoImpl.class); } @Override diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 131d2764d3f..bad8ae2010c 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -1282,31 +1282,8 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag network.setMode(result.getMode()); _networksDao.update(networkId, network); - // If this is a 1) guest virtual network 2) network has sourceNat service 3) network offering does not support a Shared source NAT rule, - // associate a source NAT IP (if one isn't already associated with the network) - if (network.getType() == Network.Type.Isolated && isServiceSupportedByNetworkOffering(network.getNetworkOfferingId(), Service.SourceNat) && !offering.isSharedSourceNatService()) { - List ips = _ipAddressDao.listByAssociatedNetwork(networkId, true); - - if (ips.isEmpty()) { - s_logger.debug("Creating a source nat ip for " + network); - Account owner = _accountMgr.getAccount(network.getAccountId()); - assignSourceNatIpAddress(owner, network, context.getCaller().getId()); - } - } - - for (NetworkElement element : _networkElements) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Asking " + element.getName() + " to implemenet " + network); - } - element.implement(network, offering, dest, context); - } - - // reapply all the firewall/staticNat/lb rules - s_logger.debug("Reprogramming network " + network + " as a part of network implement"); - if (!reprogramNetworkRules(networkId, UserContext.current().getCaller(), network)) { - s_logger.warn("Failed to re-program the network as a part of network " + network + " implement"); - throw new ResourceUnavailableException("Unable to apply network rules as a part of network " + network + " implement", DataCenter.class, network.getDataCenterId()); - } + //implement network elements and re-apply all the network rules + implementNetworkElementsAndResources(dest, context, network, offering); network.setState(Network.State.Implemented); _networksDao.update(network.getId(), network); @@ -1324,6 +1301,35 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } } + private void implementNetworkElementsAndResources(DeployDestination dest, ReservationContext context, NetworkVO network, NetworkOfferingVO offering) + throws ConcurrentOperationException, InsufficientAddressCapacityException, ResourceUnavailableException, InsufficientCapacityException { + // If this is a 1) guest virtual network 2) network has sourceNat service 3) network offering does not support a Shared source NAT rule, + // associate a source NAT IP (if one isn't already associated with the network) + if (network.getType() == Network.Type.Isolated && isServiceSupportedByNetworkOffering(network.getNetworkOfferingId(), Service.SourceNat) && !offering.isSharedSourceNatService()) { + List ips = _ipAddressDao.listByAssociatedNetwork(network.getId(), true); + + if (ips.isEmpty()) { + s_logger.debug("Creating a source nat ip for " + network); + Account owner = _accountMgr.getAccount(network.getAccountId()); + assignSourceNatIpAddress(owner, network, context.getCaller().getId()); + } + } + + for (NetworkElement element : _networkElements) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Asking " + element.getName() + " to implemenet " + network); + } + element.implement(network, offering, dest, context); + } + + // reapply all the firewall/staticNat/lb rules + s_logger.debug("Reprogramming network " + network + " as a part of network implement"); + if (!reprogramNetworkRules(network.getId(), UserContext.current().getCaller(), network)) { + s_logger.warn("Failed to re-program the network as a part of network " + network + " implement"); + throw new ResourceUnavailableException("Unable to apply network rules as a part of network " + network + " implement", DataCenter.class, network.getDataCenterId()); + } + } + @DB protected void updateNic(NicVO nic, long networkId, int count) { Transaction txn = Transaction.currentTxn(); @@ -2167,15 +2173,41 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag _networksDao.update(network.getId(), network); txn.commit(); + boolean success = shutdownNetworkElementsAndResources(context, cleanupElements, network); + + txn.start(); + if (success) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Network id=" + networkId + " is shutdown successfully, cleaning up corresponding resources now."); + } + NetworkGuru guru = _networkGurus.get(network.getGuruName()); + NetworkProfile profile = convertNetworkToNetworkProfile(network.getId()); + guru.shutdown(profile, _networkOfferingDao.findById(network.getNetworkOfferingId())); + + applyProfileToNetwork(network, profile); + + network.setState(Network.State.Allocated); + _networksDao.update(network.getId(), network); + _networksDao.clearCheckForGc(networkId); + + } else { + network.setState(Network.State.Implemented); + _networksDao.update(network.getId(), network); + } + txn.commit(); + } + + private boolean shutdownNetworkElementsAndResources(ReservationContext context, boolean cleanupElements, NetworkVO network) { //1) Cleanup all the rules for the network. If it fails, just log the failure and proceed with shutting down the elements boolean cleanupResult = true; try { - cleanupResult = shutdownNetworkResources(networkId, context.getAccount(), context.getCaller().getId()); + cleanupResult = shutdownNetworkResources(network.getId(), context.getAccount(), context.getCaller().getId()); } catch (Exception ex) { s_logger.warn("shutdownNetworkRules failed during the network " + network + " shutdown due to ", ex); } finally { + //just warn the administrator that the network elements failed to shutdown if (!cleanupResult) { - s_logger.warn("Failed to cleanup network id=" + networkId + " resources as a part of shutdownNetwork"); + s_logger.warn("Failed to cleanup network id=" + network.getId() + " resources as a part of shutdownNetwork"); } } @@ -2199,27 +2231,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag success = false; } } - - txn.start(); - if (success) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Network id=" + networkId + " is shutdown successfully, cleaning up corresponding resources now."); - } - NetworkGuru guru = _networkGurus.get(network.getGuruName()); - NetworkProfile profile = convertNetworkToNetworkProfile(network.getId()); - guru.shutdown(profile, _networkOfferingDao.findById(network.getNetworkOfferingId())); - - applyProfileToNetwork(network, profile); - - network.setState(Network.State.Allocated); - _networksDao.update(network.getId(), network); - _networksDao.clearCheckForGc(networkId); - - } else { - network.setState(Network.State.Implemented); - _networksDao.update(network.getId(), network); - } - txn.commit(); + return success; } @Override @@ -2479,33 +2491,32 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag ReservationContext context = new ReservationContextImpl(null, null, callerUser, callerAccount); s_logger.debug("Shutting down the network id=" + networkId + " as a part of network restart"); - shutdownNetwork(networkId, context, cleanup); - - //check that the network was shutdown properly - network = _networksDao.findById(networkId); - if (network.getState() != Network.State.Allocated && network.getState() != Network.State.Setup) { - s_logger.debug("Failed to shutdown the network as a part of network restart: " + network.getState()); + if (!shutdownNetworkElementsAndResources(context, cleanup, network)) { + s_logger.debug("Failed to shutdown the network elements and resources as a part of network restart: " + network.getState()); return false; } + //Only after network was shutdown properly, change the network offering if (newNetworkOfferingId != null) { s_logger.debug("Updating network " + network + " with the new network offering id=" + newNetworkOfferingId + " as a part of network restart"); network.setNetworkOfferingId(newNetworkOfferingId); _networksDao.update(networkId, network); } - //implement the network again + //implement the network elements and rules again DeployDestination dest = new DeployDestination(_dcDao.findById(network.getDataCenterId()), null, null, null); - s_logger.debug("Implementing the network " + network + " as a part of network restart"); - Pair implemented = implementNetwork(networkId, dest, context); + s_logger.debug("Implementing the network " + network + " elements and resources as a part of network restart"); + NetworkOfferingVO offering = _networkOfferingDao.findById(network.getNetworkOfferingId()); - if (implemented.first() == null) { - s_logger.warn("Failed to implement the network " + network + " as a part of network restart"); + try { + implementNetworkElementsAndResources(dest, context, network, offering); + } catch (Exception ex) { + s_logger.warn("Failed to implement network " + network + " elements and resources as a part of network restart due to ", ex); return false; - } else { - return true; } + + return true; } diff --git a/server/src/com/cloud/network/PhysicalNetworkExternalDeviceVO.java b/server/src/com/cloud/network/PhysicalNetworkExternalDeviceVO.java index 1c1ba51f077..8d9ca116dad 100644 --- a/server/src/com/cloud/network/PhysicalNetworkExternalDeviceVO.java +++ b/server/src/com/cloud/network/PhysicalNetworkExternalDeviceVO.java @@ -49,6 +49,9 @@ public class PhysicalNetworkExternalDeviceVO { this.networkServiceProviderId = networkServiceProviderId; this.hostId = hostId; } + + protected PhysicalNetworkExternalDeviceVO(){ + } public long getId() { return id;