From 0f40cfbea8b3f1f5c7385ff8cce359fc164848d9 Mon Sep 17 00:00:00 2001 From: Murali Reddy Date: Fri, 28 Jun 2013 12:21:56 +0530 Subject: [PATCH] CLOUDSTACK-2045: [Multiple IPs Per Nic] This feature is not working well in case of networks with external devices after GC 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. --- api/src/com/cloud/network/NetworkModel.java | 2 ++ .../com/cloud/network/NetworkManagerImpl.java | 5 +++++ .../com/cloud/network/NetworkModelImpl.java | 21 +++++++++++++++++++ .../cloud/network/MockNetworkModelImpl.java | 5 +++++ .../com/cloud/vpc/MockNetworkModelImpl.java | 4 ++++ 5 files changed, 37 insertions(+) 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; + } }