From 46a303217839a8abe22de300fce982a8ad662308 Mon Sep 17 00:00:00 2001 From: Wei Zhou <57355700+weizhouapache@users.noreply.github.com> Date: Wed, 16 Jun 2021 17:49:42 +0200 Subject: [PATCH] server: set correct gateway when update vm nic on shared networks (#5105) This PR fixes the issue that nic has wrong gateway after updating vm nic. Steps to reproduce the issue (1) create shared network (in advanced zone or advanced zone with sg) (2) create new shared network (with same startip/endip/netmask, but different gateway). (3) create a vm in new network (4) stop vm and update vm nic ip address Expected result: The vm has correct gateway and netmask (of second network) Actual result: The vm has wrong gateway and netmask (of first network) --- server/src/main/java/com/cloud/vm/UserVmManagerImpl.java | 2 +- server/src/test/java/com/cloud/vm/UserVmManagerTest.java | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index adc8c324040..6d858743745 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -1728,7 +1728,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir throw new InvalidParameterValueException("Allocating ip to guest nic " + nicVO.getUuid() + " failed, please choose another ip"); } - final IPAddressVO newIp = _ipAddressDao.findByIpAndDcId(dc.getId(), ipaddr); + final IPAddressVO newIp = _ipAddressDao.findByIpAndSourceNetworkId(network.getId(), ipaddr); final Vlan vlan = _vlanDao.findById(newIp.getVlanId()); nicVO.setIPv4Gateway(vlan.getVlanGateway()); nicVO.setIPv4Netmask(vlan.getVlanNetmask()); diff --git a/server/src/test/java/com/cloud/vm/UserVmManagerTest.java b/server/src/test/java/com/cloud/vm/UserVmManagerTest.java index 9d58f4f00b5..1103fb17961 100644 --- a/server/src/test/java/com/cloud/vm/UserVmManagerTest.java +++ b/server/src/test/java/com/cloud/vm/UserVmManagerTest.java @@ -604,6 +604,7 @@ public class UserVmManagerTest { NicVO nic = new NicVO("nic", 1L, 2L, VirtualMachine.Type.User); when(_nicDao.findById(anyLong())).thenReturn(nic); + nic.setIPv4Address("10.10.10.9"); when(_vmDao.findById(anyLong())).thenReturn(_vmMock); when(_networkDao.findById(anyLong())).thenReturn(_networkMock); doReturn(9L).when(_networkMock).getNetworkOfferingId(); @@ -630,9 +631,9 @@ public class UserVmManagerTest { when(vlan.getVlanNetmask()).thenReturn("255.255.255.0"); when(_ipAddrMgr.allocatePublicIpForGuestNic(Mockito.eq(_networkMock), nullable(Long.class), Mockito.eq(_accountMock), anyString())).thenReturn("10.10.10.10"); - lenient().when(_ipAddressDao.findByIpAndSourceNetworkId(anyLong(), anyString())).thenReturn(null); + when(_ipAddressDao.findByIpAndSourceNetworkId(anyLong(), eq("10.10.10.10"))).thenReturn(newIp); + when(_ipAddressDao.findByIpAndSourceNetworkId(anyLong(), eq("10.10.10.9"))).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());