Skip to content

Commit 98e84e3

Browse files
shwstppryadvr
authored andcommitted
server: fix public IP association/disassociation to new network (#3489)
Fixes #3321 This changes removes exception throwing while associating an IP address to a new isolated network which is in Allocated state. And it allows disassociating an IP address when it is used for source NAT purpose but network is in allocated state. Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
1 parent 9e6ee7c commit 98e84e3

3 files changed

Lines changed: 12 additions & 17 deletions

File tree

server/src/main/java/com/cloud/network/IpAddressManagerImpl.java

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,6 @@
2929

3030
import javax.inject.Inject;
3131

32-
import com.cloud.dc.DomainVlanMapVO;
33-
import org.apache.log4j.Logger;
34-
3532
import org.apache.cloudstack.acl.ControlledEntity.ACLType;
3633
import org.apache.cloudstack.acl.SecurityChecker.AccessType;
3734
import org.apache.cloudstack.api.response.AcquirePodIpCmdResponse;
@@ -44,6 +41,7 @@
4441
import org.apache.cloudstack.region.PortableIpDao;
4542
import org.apache.cloudstack.region.PortableIpVO;
4643
import org.apache.cloudstack.region.Region;
44+
import org.apache.log4j.Logger;
4745

4846
import com.cloud.agent.AgentManager;
4947
import com.cloud.alert.AlertManager;
@@ -54,6 +52,7 @@
5452
import com.cloud.dc.DataCenter;
5553
import com.cloud.dc.DataCenter.NetworkType;
5654
import com.cloud.dc.DataCenterIpAddressVO;
55+
import com.cloud.dc.DomainVlanMapVO;
5756
import com.cloud.dc.HostPodVO;
5857
import com.cloud.dc.Pod;
5958
import com.cloud.dc.PodVlanMapVO;
@@ -1429,12 +1428,6 @@ protected boolean isSourceNatAvailableForNetwork(Account owner, IPAddressVO ipTo
14291428
if (!sharedSourceNat) {
14301429
if (getExistingSourceNatInNetwork(owner.getId(), network.getId()) == null) {
14311430
if (network.getGuestType() == GuestType.Isolated && network.getVpcId() == null && !ipToAssoc.isPortable()) {
1432-
if (network.getState() == Network.State.Allocated) {
1433-
//prevent associating an ip address to an allocated (unimplemented network).
1434-
//it will cause the ip to become source nat, and it can't be disassociated later on.
1435-
String msg = String.format("Network with UUID:%s is in allocated and needs to be implemented first before acquiring an IP address", network.getUuid());
1436-
throw new InvalidParameterValueException(msg);
1437-
}
14381431
isSourceNat = true;
14391432
}
14401433
}

server/src/main/java/com/cloud/network/NetworkServiceImpl.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -924,7 +924,12 @@ private boolean releaseIpAddressInternal(long ipAddressId) throws InsufficientAd
924924
_accountMgr.checkAccess(caller, null, true, ipVO);
925925
}
926926

927-
if (ipVO.isSourceNat()) {
927+
Network guestNetwork = null;
928+
final Long networkId = ipVO.getAssociatedWithNetworkId();
929+
if (networkId != null) {
930+
guestNetwork = getNetwork(networkId);
931+
}
932+
if (ipVO.isSourceNat() && guestNetwork != null && guestNetwork.getState() != Network.State.Allocated) {
928933
throw new IllegalArgumentException("ip address is used for source nat purposes and can not be disassociated.");
929934
}
930935

@@ -941,9 +946,7 @@ private boolean releaseIpAddressInternal(long ipAddressId) throws InsufficientAd
941946
boolean success = _ipAddrMgr.disassociatePublicIpAddress(ipAddressId, userId, caller);
942947

943948
if (success) {
944-
Long networkId = ipVO.getAssociatedWithNetworkId();
945-
if (networkId != null) {
946-
Network guestNetwork = getNetwork(networkId);
949+
if (guestNetwork != null) {
947950
NetworkOffering offering = _entityMgr.findById(NetworkOffering.class, guestNetwork.getNetworkOfferingId());
948951
Long vmId = ipVO.getAssociatedWithVmId();
949952
if (offering.isElasticIp() && vmId != null) {

server/src/test/java/com/cloud/network/IpAddressManagerTest.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@
3636
import org.mockito.Mock;
3737
import org.mockito.Mockito;
3838
import org.mockito.Spy;
39+
import org.mockito.runners.MockitoJUnitRunner;
3940

40-
import com.cloud.exception.InvalidParameterValueException;
4141
import com.cloud.exception.ResourceUnavailableException;
4242
import com.cloud.network.Network.Service;
4343
import com.cloud.network.dao.IPAddressDao;
@@ -50,7 +50,6 @@
5050
import com.cloud.offerings.dao.NetworkOfferingDao;
5151
import com.cloud.user.AccountVO;
5252
import com.cloud.utils.net.Ip;
53-
import org.mockito.runners.MockitoJUnitRunner;
5453

5554
@RunWith(MockitoJUnitRunner.class)
5655
public class IpAddressManagerTest {
@@ -170,7 +169,7 @@ public void assertSourceNatImplementedNetwork() {
170169
assertTrue("Source NAT should be true", isSourceNat);
171170
}
172171

173-
@Test(expected = InvalidParameterValueException.class)
172+
@Test
174173
public void assertSourceNatAllocatedNetwork() {
175174

176175
NetworkVO networkAllocated = Mockito.mock(NetworkVO.class);
@@ -184,7 +183,7 @@ public void assertSourceNatAllocatedNetwork() {
184183
Mockito.when(networkDao.findById(2L)).thenReturn(networkAllocated);
185184
doReturn(null).when(ipAddressManager).getExistingSourceNatInNetwork(1L, 2L);
186185

187-
ipAddressManager.isSourceNatAvailableForNetwork(account, ipAddressVO, networkAllocated);
186+
assertTrue(ipAddressManager.isSourceNatAvailableForNetwork(account, ipAddressVO, networkAllocated));
188187
}
189188

190189
@Test

0 commit comments

Comments
 (0)