diff --git a/engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/NetworkOrchestrationService.java b/engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/NetworkOrchestrationService.java index 82d0566169a..fa7601db27d 100644 --- a/engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/NetworkOrchestrationService.java +++ b/engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/NetworkOrchestrationService.java @@ -93,6 +93,9 @@ public interface NetworkOrchestrationService { ConfigKey ForgedTransmits = new ConfigKey("Advanced", Boolean.class, "network.forged.transmits", "true", "Whether to allow or deny forged transmits on nics for applicable network elements such as for vswitch/dvswitch portgroups.", true); + ConfigKey RollingRestartEnabled = new ConfigKey("Advanced", Boolean.class, "network.rolling.restart", "true", + "Whether to allow or deny rolling restart of network routers.", true); + List setupNetwork(Account owner, NetworkOffering offering, DeploymentPlan plan, String name, String displayText, boolean isDefault) throws ConcurrentOperationException; diff --git a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java index b61e7c2d7e9..35069c57412 100644 --- a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java +++ b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java @@ -2927,6 +2927,14 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra * @throws InsufficientCapacityException */ private boolean rollingRestartRouters(final NetworkVO network, final NetworkOffering offering, final DeployDestination dest, final ReservationContext context) throws ResourceUnavailableException, ConcurrentOperationException, InsufficientCapacityException { + if (!NetworkOrchestrationService.RollingRestartEnabled.value()) { + if (shutdownNetworkElementsAndResources(context, true, network)) { + implementNetworkElementsAndResources(dest, context, network, offering); + return true; + } + s_logger.debug("Failed to shutdown the network elements and resources as a part of network restart: " + network.getState()); + return false; + } s_logger.debug("Performing rolling restart of routers of network " + network); destroyExpendableRouters(_routerDao.findByNetwork(network.getId()), context); @@ -3831,6 +3839,6 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra public ConfigKey[] getConfigKeys() { return new ConfigKey[] {NetworkGcWait, NetworkGcInterval, NetworkLockTimeout, GuestDomainSuffix, NetworkThrottlingRate, MinVRVersion, - PromiscuousMode, MacAddressChanges, ForgedTransmits}; + PromiscuousMode, MacAddressChanges, ForgedTransmits, RollingRestartEnabled}; } } diff --git a/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java index 422992ef212..0447f7e090f 100644 --- a/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java +++ b/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java @@ -2458,6 +2458,13 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis * @throws InsufficientCapacityException */ private boolean rollingRestartVpc(final Vpc vpc, final ReservationContext context) throws ResourceUnavailableException, ConcurrentOperationException, InsufficientCapacityException { + if (!NetworkOrchestrationService.RollingRestartEnabled.value()) { + if (shutdownVpc(vpc.getId())) { + return startVpc(vpc.getId(), false); + } + s_logger.warn("Failed to shutdown vpc as a part of VPC " + vpc + " restart process"); + return false; + } s_logger.debug("Performing rolling restart of routers of VPC " + vpc); _ntwkMgr.destroyExpendableRouters(_routerDao.listByVpcId(vpc.getId()), context);