diff --git a/api/src/com/cloud/api/commands/RestartNetworkCmd.java b/api/src/com/cloud/api/commands/RestartNetworkCmd.java index 65317009914..bd16a0df7b1 100644 --- a/api/src/com/cloud/api/commands/RestartNetworkCmd.java +++ b/api/src/com/cloud/api/commands/RestartNetworkCmd.java @@ -48,6 +48,9 @@ public class RestartNetworkCmd extends BaseAsyncCmd { @Parameter(name=ApiConstants.ID, type=CommandType.LONG, required=true, description="The id of the network to restart.") private Long id; + @Parameter(name=ApiConstants.CLEANUP, type=CommandType.BOOLEAN, required=false, description="If cleanup old network elements") + private Boolean cleanup; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// @@ -61,6 +64,13 @@ public class RestartNetworkCmd extends BaseAsyncCmd { return network.getId(); } } + + public Boolean getCleanup() { + if (cleanup != null) { + return cleanup; + } + return true; + } ///////////////////////////////////////////////////// @@ -79,7 +89,7 @@ public class RestartNetworkCmd extends BaseAsyncCmd { @Override public void execute() throws ResourceUnavailableException, ResourceAllocationException, ConcurrentOperationException, InsufficientCapacityException { - boolean result = _networkService.restartNetwork(this); + boolean result = _networkService.restartNetwork(this, getCleanup()); if (result) { SuccessResponse response = new SuccessResponse(getCommandName()); this.setResponseObject(response); diff --git a/api/src/com/cloud/network/NetworkService.java b/api/src/com/cloud/network/NetworkService.java index d44a9f02448..6aa92538861 100644 --- a/api/src/com/cloud/network/NetworkService.java +++ b/api/src/com/cloud/network/NetworkService.java @@ -63,7 +63,7 @@ public interface NetworkService { boolean deleteNetwork(long networkId); - boolean restartNetwork(RestartNetworkCmd cmd) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException; + boolean restartNetwork(RestartNetworkCmd cmd, boolean cleanup) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException; int getActiveNicsInNetwork(long networkId); diff --git a/api/src/com/cloud/network/element/NetworkElement.java b/api/src/com/cloud/network/element/NetworkElement.java index a4f42dffd9d..bf9ca329b8e 100644 --- a/api/src/com/cloud/network/element/NetworkElement.java +++ b/api/src/com/cloud/network/element/NetworkElement.java @@ -101,11 +101,12 @@ public interface NetworkElement extends Adapter { * The network is being restarted. * @param network * @param context + * @param cleanup If need to clean up old network elements * @return * @throws ConcurrentOperationException * @throws ResourceUnavailableException */ - boolean restart(Network network, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException; + boolean restart(Network network, ReservationContext context, boolean cleanup) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException; /** * The network is being destroyed. diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 950d2eafa5f..ba68dc7bab6 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -1213,7 +1213,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag // reapply all the firewall/staticNat/lb rules s_logger.debug("Applying network rules as a part of network " + network + " implement..."); - if (!restartNetwork(networkId, false, context.getAccount())) { + if (!restartNetwork(networkId, false, true, context.getAccount())) { s_logger.warn("Failed to reapply network rules 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()); } @@ -2360,7 +2360,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag @Override @ActionEvent(eventType = EventTypes.EVENT_NETWORK_RESTART, eventDescription = "restarting network", async = true) - public boolean restartNetwork(RestartNetworkCmd cmd) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException { + public boolean restartNetwork(RestartNetworkCmd cmd, boolean cleanup) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException { // This method restarts all network elements belonging to the network and re-applies all the rules Long networkId = cmd.getNetworkId(); @@ -2383,7 +2383,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag boolean success = true; // Restart network - network elements restart is required - success = restartNetwork(networkId, true, callerAccount); + success = restartNetwork(networkId, true, cleanup, callerAccount); if (success) { s_logger.debug("Network id=" + networkId + " is restarted successfully."); @@ -2414,7 +2414,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } } - private boolean restartNetwork(long networkId, boolean restartElements, Account caller) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException { + private boolean restartNetwork(long networkId, boolean restartElements, boolean cleanup, Account caller) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException { boolean success = true; NetworkVO network = _networksDao.findById(networkId); @@ -2427,7 +2427,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag for (NetworkElement element : _networkElements) { // stop and start the network element try { - boolean supported = element.restart(network, context); + boolean supported = element.restart(network, context, cleanup); if (!supported) { s_logger.trace("Network element(s) " + element.getName() + " doesn't support network id" + networkId + " restart"); } @@ -3101,7 +3101,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag s_logger.info("Restarting network " + network + " as a part of update network call"); try { - success = restartNetwork(networkId, true, caller); + success = restartNetwork(networkId, true, true, caller); } catch (Exception e) { success = false; } diff --git a/server/src/com/cloud/network/element/BareMetalElement.java b/server/src/com/cloud/network/element/BareMetalElement.java index 52a2ad7b719..fae74d8fbb3 100644 --- a/server/src/com/cloud/network/element/BareMetalElement.java +++ b/server/src/com/cloud/network/element/BareMetalElement.java @@ -107,7 +107,7 @@ public class BareMetalElement extends AdapterBase implements NetworkElement { } @Override - public boolean restart(Network network, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException, + public boolean restart(Network network, ReservationContext context, boolean cleanup) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException { return true; } diff --git a/server/src/com/cloud/network/element/CloudZonesNetworkElement.java b/server/src/com/cloud/network/element/CloudZonesNetworkElement.java index d58fdb71595..39259eec57d 100644 --- a/server/src/com/cloud/network/element/CloudZonesNetworkElement.java +++ b/server/src/com/cloud/network/element/CloudZonesNetworkElement.java @@ -229,7 +229,7 @@ public class CloudZonesNetworkElement extends AdapterBase implements NetworkElem } @Override - public boolean restart(Network network, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException{ + public boolean restart(Network network, ReservationContext context, boolean cleanup) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException{ s_logger.trace("Cloudzones element doesn't handle network restart for the network " + network); return true; diff --git a/server/src/com/cloud/network/element/DhcpElement.java b/server/src/com/cloud/network/element/DhcpElement.java index b30b5a70d29..6459cf2e98c 100644 --- a/server/src/com/cloud/network/element/DhcpElement.java +++ b/server/src/com/cloud/network/element/DhcpElement.java @@ -207,7 +207,7 @@ public class DhcpElement extends AdapterBase implements NetworkElement, Password } @Override - public boolean restart(Network network, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException{ + public boolean restart(Network network, ReservationContext context, boolean cleanup) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException{ DataCenter dc = _configMgr.getZone(network.getDataCenterId()); DeployDestination dest = new DeployDestination(dc, null, null, null); NetworkOffering offering = _configMgr.getNetworkOffering(network.getNetworkOfferingId()); diff --git a/server/src/com/cloud/network/element/ElasticLoadBalancerElement.java b/server/src/com/cloud/network/element/ElasticLoadBalancerElement.java index c096325814d..535cea4fd9d 100644 --- a/server/src/com/cloud/network/element/ElasticLoadBalancerElement.java +++ b/server/src/com/cloud/network/element/ElasticLoadBalancerElement.java @@ -124,7 +124,7 @@ public class ElasticLoadBalancerElement extends AdapterBase implements NetworkEl } @Override - public boolean restart(Network network, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException { + public boolean restart(Network network, ReservationContext context, boolean cleanup) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException { // TODO restart all loadbalancer vms by calling the ElasticLoadBalancerManager return false; } diff --git a/server/src/com/cloud/network/element/ExternalDhcpElement.java b/server/src/com/cloud/network/element/ExternalDhcpElement.java index c1f1970da9a..e8c19817863 100644 --- a/server/src/com/cloud/network/element/ExternalDhcpElement.java +++ b/server/src/com/cloud/network/element/ExternalDhcpElement.java @@ -120,7 +120,7 @@ public class ExternalDhcpElement extends AdapterBase implements NetworkElement, } @Override - public boolean restart(Network network, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException, + public boolean restart(Network network, ReservationContext context, boolean cleanup) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException { return true; } diff --git a/server/src/com/cloud/network/element/ExternalFirewallElement.java b/server/src/com/cloud/network/element/ExternalFirewallElement.java index 5a79e58f914..0d0db524b17 100644 --- a/server/src/com/cloud/network/element/ExternalFirewallElement.java +++ b/server/src/com/cloud/network/element/ExternalFirewallElement.java @@ -234,7 +234,7 @@ public class ExternalFirewallElement extends AdapterBase implements NetworkEleme } @Override - public boolean restart(Network network, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException{ + public boolean restart(Network network, ReservationContext context, boolean cleanup) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException{ return true; } diff --git a/server/src/com/cloud/network/element/NetscalerExternalLoadBalancerElement.java b/server/src/com/cloud/network/element/NetscalerExternalLoadBalancerElement.java index 1b618d2463c..4fe36ae2d09 100644 --- a/server/src/com/cloud/network/element/NetscalerExternalLoadBalancerElement.java +++ b/server/src/com/cloud/network/element/NetscalerExternalLoadBalancerElement.java @@ -150,7 +150,7 @@ public class NetscalerExternalLoadBalancerElement extends AdapterBase implements } @Override - public boolean restart(Network network, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException{ + public boolean restart(Network network, ReservationContext context, boolean cleanup) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException{ return true; } diff --git a/server/src/com/cloud/network/element/OvsElement.java b/server/src/com/cloud/network/element/OvsElement.java index 4cfe1ef50e2..4dca5bf9234 100644 --- a/server/src/com/cloud/network/element/OvsElement.java +++ b/server/src/com/cloud/network/element/OvsElement.java @@ -132,7 +132,7 @@ public class OvsElement extends AdapterBase implements NetworkElement { } @Override - public boolean restart(Network network, ReservationContext context) + public boolean restart(Network network, ReservationContext context, boolean cleanup) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException { return true; diff --git a/server/src/com/cloud/network/element/VirtualRouterElement.java b/server/src/com/cloud/network/element/VirtualRouterElement.java index a7e15b029dd..85f542eb159 100644 --- a/server/src/com/cloud/network/element/VirtualRouterElement.java +++ b/server/src/com/cloud/network/element/VirtualRouterElement.java @@ -136,7 +136,7 @@ public class VirtualRouterElement extends DhcpElement implements NetworkElement, } @Override - public boolean restart(Network network, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException{ + public boolean restart(Network network, ReservationContext context, boolean cleanup) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException{ DataCenter dc = _configMgr.getZone(network.getDataCenterId()); if (!canHandle(network.getGuestType(), dc)) { s_logger.trace("Virtual router element doesn't handle network restart for the network " + network); @@ -160,12 +160,14 @@ public class VirtualRouterElement extends DhcpElement implements NetworkElement, if (host_id == null || host_id == 0) { host_id = (router.getHostId() != null ? router.getHostId() : router.getLastHostId()); } - /* FIXME it's not completely safe to ignore these failure, but we would try to push on now */ - if (router.getState() != State.Stopped || _routerMgr.stopRouter(router.getId(), false) == null) { - s_logger.warn("Failed to stop virtual router element " + router + " as a part of network " + network + " restart"); - } - if (!_routerMgr.destroyRouter(router.getId())) { - s_logger.warn("Failed to destroy virtual router element " + router + " as a part of network " + network + " restart"); + if (cleanup) { + /* FIXME it's not completely safe to ignore these failure, but we would try to push on now */ + if (router.getState() != State.Stopped || _routerMgr.stopRouter(router.getId(), false) == null) { + s_logger.warn("Failed to stop virtual router element " + router + " as a part of network " + network + " restart"); + } + if (!_routerMgr.destroyRouter(router.getId())) { + s_logger.warn("Failed to destroy virtual router element " + router + " as a part of network " + network + " restart"); + } } } if (host_id == null || host_id == 0) {