This is an automated email from the ASF dual-hosted git repository.

rohit pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/master by this push:
     new 98e84e3  server: fix public IP association/disassociation to new 
network (#3489)
98e84e3 is described below

commit 98e84e372fbe57339f1d657708c14f00012e7294
Author: Abhishek Kumar <[email protected]>
AuthorDate: Sun Jul 14 17:23:11 2019 +0530

    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 <[email protected]>
---
 .../src/main/java/com/cloud/network/IpAddressManagerImpl.java | 11 ++---------
 .../src/main/java/com/cloud/network/NetworkServiceImpl.java   | 11 +++++++----
 .../src/test/java/com/cloud/network/IpAddressManagerTest.java |  7 +++----
 3 files changed, 12 insertions(+), 17 deletions(-)

diff --git a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java 
b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java
index c152034..817efcc 100644
--- a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java
+++ b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java
@@ -29,9 +29,6 @@ import java.util.UUID;
 
 import javax.inject.Inject;
 
-import com.cloud.dc.DomainVlanMapVO;
-import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.acl.ControlledEntity.ACLType;
 import org.apache.cloudstack.acl.SecurityChecker.AccessType;
 import org.apache.cloudstack.api.response.AcquirePodIpCmdResponse;
@@ -44,6 +41,7 @@ import org.apache.cloudstack.region.PortableIp;
 import org.apache.cloudstack.region.PortableIpDao;
 import org.apache.cloudstack.region.PortableIpVO;
 import org.apache.cloudstack.region.Region;
+import org.apache.log4j.Logger;
 
 import com.cloud.agent.AgentManager;
 import com.cloud.alert.AlertManager;
@@ -54,6 +52,7 @@ import com.cloud.dc.AccountVlanMapVO;
 import com.cloud.dc.DataCenter;
 import com.cloud.dc.DataCenter.NetworkType;
 import com.cloud.dc.DataCenterIpAddressVO;
+import com.cloud.dc.DomainVlanMapVO;
 import com.cloud.dc.HostPodVO;
 import com.cloud.dc.Pod;
 import com.cloud.dc.PodVlanMapVO;
@@ -1429,12 +1428,6 @@ public class IpAddressManagerImpl extends ManagerBase 
implements IpAddressManage
         if (!sharedSourceNat) {
             if (getExistingSourceNatInNetwork(owner.getId(), network.getId()) 
== null) {
                 if (network.getGuestType() == GuestType.Isolated && 
network.getVpcId() == null && !ipToAssoc.isPortable()) {
-                    if (network.getState() == Network.State.Allocated) {
-                        //prevent associating an ip address to an allocated 
(unimplemented network).
-                        //it will cause the ip to become source nat, and it 
can't be disassociated later on.
-                        String msg = String.format("Network with UUID:%s is in 
allocated and needs to be implemented first before acquiring an IP address", 
network.getUuid());
-                        throw new InvalidParameterValueException(msg);
-                    }
                     isSourceNat = true;
                 }
             }
diff --git a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java 
b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java
index 0e52c05..bdfba47 100644
--- a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java
+++ b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java
@@ -924,7 +924,12 @@ public class NetworkServiceImpl extends ManagerBase 
implements NetworkService {
             _accountMgr.checkAccess(caller, null, true, ipVO);
         }
 
-        if (ipVO.isSourceNat()) {
+        Network guestNetwork = null;
+        final Long networkId = ipVO.getAssociatedWithNetworkId();
+        if (networkId != null) {
+            guestNetwork = getNetwork(networkId);
+        }
+        if (ipVO.isSourceNat() && guestNetwork != null && 
guestNetwork.getState() != Network.State.Allocated) {
             throw new IllegalArgumentException("ip address is used for source 
nat purposes and can not be disassociated.");
         }
 
@@ -941,9 +946,7 @@ public class NetworkServiceImpl extends ManagerBase 
implements NetworkService {
         boolean success = _ipAddrMgr.disassociatePublicIpAddress(ipAddressId, 
userId, caller);
 
         if (success) {
-            Long networkId = ipVO.getAssociatedWithNetworkId();
-            if (networkId != null) {
-                Network guestNetwork = getNetwork(networkId);
+            if (guestNetwork != null) {
                 NetworkOffering offering = 
_entityMgr.findById(NetworkOffering.class, guestNetwork.getNetworkOfferingId());
                 Long vmId = ipVO.getAssociatedWithVmId();
                 if (offering.isElasticIp() && vmId != null) {
diff --git a/server/src/test/java/com/cloud/network/IpAddressManagerTest.java 
b/server/src/test/java/com/cloud/network/IpAddressManagerTest.java
index 09519b9..74deb2d 100644
--- a/server/src/test/java/com/cloud/network/IpAddressManagerTest.java
+++ b/server/src/test/java/com/cloud/network/IpAddressManagerTest.java
@@ -36,8 +36,8 @@ import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.Mockito;
 import org.mockito.Spy;
+import org.mockito.runners.MockitoJUnitRunner;
 
-import com.cloud.exception.InvalidParameterValueException;
 import com.cloud.exception.ResourceUnavailableException;
 import com.cloud.network.Network.Service;
 import com.cloud.network.dao.IPAddressDao;
@@ -50,7 +50,6 @@ import com.cloud.offerings.NetworkOfferingVO;
 import com.cloud.offerings.dao.NetworkOfferingDao;
 import com.cloud.user.AccountVO;
 import com.cloud.utils.net.Ip;
-import org.mockito.runners.MockitoJUnitRunner;
 
 @RunWith(MockitoJUnitRunner.class)
 public class IpAddressManagerTest {
@@ -170,7 +169,7 @@ public class IpAddressManagerTest {
         assertTrue("Source NAT should be true", isSourceNat);
     }
 
-    @Test(expected = InvalidParameterValueException.class)
+    @Test
     public void assertSourceNatAllocatedNetwork() {
 
         NetworkVO networkAllocated = Mockito.mock(NetworkVO.class);
@@ -184,7 +183,7 @@ public class IpAddressManagerTest {
         Mockito.when(networkDao.findById(2L)).thenReturn(networkAllocated);
         
doReturn(null).when(ipAddressManager).getExistingSourceNatInNetwork(1L, 2L);
 
-        ipAddressManager.isSourceNatAvailableForNetwork(account, ipAddressVO, 
networkAllocated);
+        assertTrue(ipAddressManager.isSourceNatAvailableForNetwork(account, 
ipAddressVO, networkAllocated));
     }
 
     @Test

Reply via email to