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 35b4339  CLOUDSTACK-10212: Update Netmask/Gateway when Changing IPv4 
address (#2388)
35b4339 is described below

commit 35b43399467737c23ec8d1b1337f1bcfb8e88aa1
Author: Wido den Hollander <[email protected]>
AuthorDate: Tue Jan 9 09:23:16 2018 +0100

    CLOUDSTACK-10212: Update Netmask/Gateway when Changing IPv4 address (#2388)
    
    This can otherwise cause problems in Basic Networking where multiple
    IPv4 ranges are configured in a POD.
    
    Signed-off-by: Wido den Hollander <[email protected]>
---
 server/src/com/cloud/vm/UserVmManagerImpl.java  | 11 +++++++++--
 server/test/com/cloud/vm/UserVmManagerTest.java | 15 +++++++++++++++
 2 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java 
b/server/src/com/cloud/vm/UserVmManagerImpl.java
index 71935ff..362786b 100644
--- a/server/src/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/com/cloud/vm/UserVmManagerImpl.java
@@ -137,6 +137,7 @@ import com.cloud.dc.dao.DataCenterDao;
 import com.cloud.dc.dao.DedicatedResourceDao;
 import com.cloud.dc.dao.HostPodDao;
 import com.cloud.dc.dao.VlanDao;
+import com.cloud.dc.Vlan;
 import com.cloud.dc.Vlan.VlanType;
 import com.cloud.dc.VlanVO;
 import com.cloud.deploy.DataCenterDeployment;
@@ -473,7 +474,7 @@ public class UserVmManagerImpl extends ManagerBase 
implements UserVmManager, Vir
     @Inject
     private UserStatisticsDao _userStatsDao;
     @Inject
-    private VlanDao _vlanDao;
+    protected VlanDao _vlanDao;
     @Inject
     VolumeService _volService;
     @Inject
@@ -1565,6 +1566,12 @@ public class UserVmManagerImpl extends ManagerBase 
implements UserVmManager, Vir
                 if (ipaddr == null) {
                     throw new InvalidParameterValueException("Allocating ip to 
guest nic " + nicVO.getUuid() + " failed, please choose another ip");
                 }
+
+                final IPAddressVO newIp = 
_ipAddressDao.findByIpAndDcId(dc.getId(), ipaddr);
+                final Vlan vlan = _vlanDao.findById(newIp.getVlanId());
+                nicVO.setIPv4Gateway(vlan.getVlanGateway());
+                nicVO.setIPv4Netmask(vlan.getVlanNetmask());
+
                 final IPAddressVO ip = 
_ipAddressDao.findByIpAndSourceNetworkId(nicVO.getNetworkId(), 
nicVO.getIPv4Address());
                 if (ip != null) {
                     Transaction.execute(new TransactionCallbackNoReturn() {
@@ -1584,7 +1591,7 @@ public class UserVmManagerImpl extends ManagerBase 
implements UserVmManager, Vir
             return null;
         }
 
-        // update nic ipaddress
+        s_logger.debug("Updating IPv4 address of NIC " + nicVO + " to " + 
ipaddr + "/" + nicVO.getIPv4Netmask() + " with gateway " + 
nicVO.getIPv4Gateway());
         nicVO.setIPv4Address(ipaddr);
         _nicDao.persist(nicVO);
 
diff --git a/server/test/com/cloud/vm/UserVmManagerTest.java 
b/server/test/com/cloud/vm/UserVmManagerTest.java
index 89555a2..c61d5cd 100644
--- a/server/test/com/cloud/vm/UserVmManagerTest.java
+++ b/server/test/com/cloud/vm/UserVmManagerTest.java
@@ -42,6 +42,9 @@ import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 
+import com.cloud.dc.VlanVO;
+import com.cloud.dc.dao.VlanDao;
+import com.cloud.network.dao.IPAddressVO;
 import com.cloud.network.element.UserDataServiceProvider;
 import com.cloud.storage.Storage;
 import com.cloud.user.User;
@@ -195,6 +198,8 @@ public class UserVmManagerTest {
     @Mock
     NicDao _nicDao;
     @Mock
+    VlanDao _vlanDao;
+    @Mock
     NicVO _nicMock;
     @Mock
     NetworkModel _networkModel;
@@ -243,6 +248,7 @@ public class UserVmManagerTest {
         _userVmMgr._vmSnapshotDao = _vmSnapshotDao;
         _userVmMgr._configDao = _configDao;
         _userVmMgr._nicDao = _nicDao;
+        _userVmMgr._vlanDao = _vlanDao;
         _userVmMgr._networkModel = _networkModel;
         _userVmMgr._networkDao = _networkDao;
         _userVmMgr._dcDao = _dcDao;
@@ -843,9 +849,18 @@ public class UserVmManagerTest {
         when(_dcDao.findById(anyLong())).thenReturn(_dcMock);
         when(_dcMock.getNetworkType()).thenReturn(NetworkType.Advanced);
 
+        IPAddressVO newIp = mock(IPAddressVO.class);
+        when(newIp.getVlanId()).thenReturn(1L);
+
+        VlanVO vlan = mock(VlanVO.class);
+        when(vlan.getVlanGateway()).thenReturn("10.10.10.1");
+        when(vlan.getVlanNetmask()).thenReturn("255.255.255.0");
+
         when(_ipAddrMgr.allocatePublicIpForGuestNic(Mockito.eq(_networkMock), 
anyLong(), Mockito.eq(_accountMock), anyString())).thenReturn("10.10.10.10");
         when(_ipAddressDao.findByIpAndSourceNetworkId(anyLong(), 
anyString())).thenReturn(null);
         when(_nicDao.persist(any(NicVO.class))).thenReturn(nic);
+        when(_ipAddressDao.findByIpAndDcId(anyLong(), 
anyString())).thenReturn(newIp);
+        when(_vlanDao.findById(anyLong())).thenReturn(vlan);
 
         Account caller = new AccountVO("testaccount", 1, "networkdomain", 
(short)0, UUID.randomUUID().toString());
         UserVO user = new UserVO(1, "testuser", "password", "firstname", 
"lastName", "email", "timezone", UUID.randomUUID().toString(), 
User.Source.UNKNOWN);

-- 
To stop receiving notification emails like this one, please contact
['"[email protected]" <[email protected]>'].

Reply via email to