diff --git a/api/src/com/cloud/network/NetworkModel.java b/api/src/com/cloud/network/NetworkModel.java index ea39d835eb7..01c0e2195d4 100644 --- a/api/src/com/cloud/network/NetworkModel.java +++ b/api/src/com/cloud/network/NetworkModel.java @@ -276,4 +276,6 @@ public interface NetworkModel { Nic getNicInNetworkIncludingRemoved(long vmId, long networkId); boolean getExecuteInSeqNtwkElmtCmd(); + + boolean isNetworkReadyForGc(long networkId); } \ No newline at end of file diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index cb3cbbfca37..938d9b1e646 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -2975,6 +2975,11 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L List networkIds = _networksDao.findNetworksToGarbageCollect(); for (Long networkId : networkIds) { + + if (!_networkModel.isNetworkReadyForGc(networkId)) { + continue; + } + Long time = _lastNetworkIdsToFree.remove(networkId); if (time == null) { if (s_logger.isDebugEnabled()) { diff --git a/server/src/com/cloud/network/NetworkModelImpl.java b/server/src/com/cloud/network/NetworkModelImpl.java index 9ab8f3f0e2a..21ef8bcf0ea 100755 --- a/server/src/com/cloud/network/NetworkModelImpl.java +++ b/server/src/com/cloud/network/NetworkModelImpl.java @@ -2126,4 +2126,25 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel { public boolean getExecuteInSeqNtwkElmtCmd() { return _executeInSequenceNtwkElmtCmd; } + + @Override + public boolean isNetworkReadyForGc(long networkId) { + Network network = getNetwork(networkId); + List networkIds = _networksDao.findNetworksToGarbageCollect(); + List secondaryIps = _nicSecondaryIpDao.listSecondaryIpAddressInNetwork(networkId); + if (!networkIds.contains(networkId)) { + return false; + } + + // add an exception for networks that use external networking devices and has secondary guest IP's allocated. + // On network GC, when network goes through implement phase a new vlan is allocated, based on the acquired VLAN + // id cidr of the network is decided in case of external networking case. While NIC uses reservation strategy 'Start' + // which ensures that new primary ip is allocated for the NiC from the new CIDR. Secondary IP's have hardcoded IP's in + // network rules. So prevent network GC. + if (secondaryIps != null && !secondaryIps.isEmpty() && + networkIsConfiguredForExternalNetworking(network.getDataCenterId(), networkId)) { + } + + return true; + } } diff --git a/server/test/com/cloud/network/MockNetworkModelImpl.java b/server/test/com/cloud/network/MockNetworkModelImpl.java index bab9df8dd6d..92e4cb1c5bf 100644 --- a/server/test/com/cloud/network/MockNetworkModelImpl.java +++ b/server/test/com/cloud/network/MockNetworkModelImpl.java @@ -885,4 +885,9 @@ public class MockNetworkModelImpl extends ManagerBase implements NetworkModel { // TODO Auto-generated method stub return false; } + + @Override + public boolean isNetworkReadyForGc(long networkId) { + return true; + } } diff --git a/server/test/com/cloud/vpc/MockNetworkModelImpl.java b/server/test/com/cloud/vpc/MockNetworkModelImpl.java index a6ab1261c3c..9fbc65a8cb9 100644 --- a/server/test/com/cloud/vpc/MockNetworkModelImpl.java +++ b/server/test/com/cloud/vpc/MockNetworkModelImpl.java @@ -898,4 +898,8 @@ public class MockNetworkModelImpl extends ManagerBase implements NetworkModel { return false; } + @Override + public boolean isNetworkReadyForGc(long networkId) { + return true; + } }