Skip to content

Commit 35b4339

Browse files
widoyadvr
authored andcommitted
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 <wido@widodh.nl>
1 parent e86bb41 commit 35b4339

2 files changed

Lines changed: 24 additions & 2 deletions

File tree

server/src/com/cloud/vm/UserVmManagerImpl.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@
137137
import com.cloud.dc.dao.DedicatedResourceDao;
138138
import com.cloud.dc.dao.HostPodDao;
139139
import com.cloud.dc.dao.VlanDao;
140+
import com.cloud.dc.Vlan;
140141
import com.cloud.dc.Vlan.VlanType;
141142
import com.cloud.dc.VlanVO;
142143
import com.cloud.deploy.DataCenterDeployment;
@@ -473,7 +474,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
473474
@Inject
474475
private UserStatisticsDao _userStatsDao;
475476
@Inject
476-
private VlanDao _vlanDao;
477+
protected VlanDao _vlanDao;
477478
@Inject
478479
VolumeService _volService;
479480
@Inject
@@ -1565,6 +1566,12 @@ public UserVm updateNicIpForVirtualMachine(UpdateVmNicIpCmd cmd) {
15651566
if (ipaddr == null) {
15661567
throw new InvalidParameterValueException("Allocating ip to guest nic " + nicVO.getUuid() + " failed, please choose another ip");
15671568
}
1569+
1570+
final IPAddressVO newIp = _ipAddressDao.findByIpAndDcId(dc.getId(), ipaddr);
1571+
final Vlan vlan = _vlanDao.findById(newIp.getVlanId());
1572+
nicVO.setIPv4Gateway(vlan.getVlanGateway());
1573+
nicVO.setIPv4Netmask(vlan.getVlanNetmask());
1574+
15681575
final IPAddressVO ip = _ipAddressDao.findByIpAndSourceNetworkId(nicVO.getNetworkId(), nicVO.getIPv4Address());
15691576
if (ip != null) {
15701577
Transaction.execute(new TransactionCallbackNoReturn() {
@@ -1584,7 +1591,7 @@ public void doInTransactionWithoutResult(TransactionStatus status) {
15841591
return null;
15851592
}
15861593

1587-
// update nic ipaddress
1594+
s_logger.debug("Updating IPv4 address of NIC " + nicVO + " to " + ipaddr + "/" + nicVO.getIPv4Netmask() + " with gateway " + nicVO.getIPv4Gateway());
15881595
nicVO.setIPv4Address(ipaddr);
15891596
_nicDao.persist(nicVO);
15901597

server/test/com/cloud/vm/UserVmManagerTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@
4242
import java.util.Map;
4343
import java.util.UUID;
4444

45+
import com.cloud.dc.VlanVO;
46+
import com.cloud.dc.dao.VlanDao;
47+
import com.cloud.network.dao.IPAddressVO;
4548
import com.cloud.network.element.UserDataServiceProvider;
4649
import com.cloud.storage.Storage;
4750
import com.cloud.user.User;
@@ -195,6 +198,8 @@ public class UserVmManagerTest {
195198
@Mock
196199
NicDao _nicDao;
197200
@Mock
201+
VlanDao _vlanDao;
202+
@Mock
198203
NicVO _nicMock;
199204
@Mock
200205
NetworkModel _networkModel;
@@ -243,6 +248,7 @@ public void setup() {
243248
_userVmMgr._vmSnapshotDao = _vmSnapshotDao;
244249
_userVmMgr._configDao = _configDao;
245250
_userVmMgr._nicDao = _nicDao;
251+
_userVmMgr._vlanDao = _vlanDao;
246252
_userVmMgr._networkModel = _networkModel;
247253
_userVmMgr._networkDao = _networkDao;
248254
_userVmMgr._dcDao = _dcDao;
@@ -843,9 +849,18 @@ public void testUpdateVmNicIpSuccess2() throws Exception {
843849
when(_dcDao.findById(anyLong())).thenReturn(_dcMock);
844850
when(_dcMock.getNetworkType()).thenReturn(NetworkType.Advanced);
845851

852+
IPAddressVO newIp = mock(IPAddressVO.class);
853+
when(newIp.getVlanId()).thenReturn(1L);
854+
855+
VlanVO vlan = mock(VlanVO.class);
856+
when(vlan.getVlanGateway()).thenReturn("10.10.10.1");
857+
when(vlan.getVlanNetmask()).thenReturn("255.255.255.0");
858+
846859
when(_ipAddrMgr.allocatePublicIpForGuestNic(Mockito.eq(_networkMock), anyLong(), Mockito.eq(_accountMock), anyString())).thenReturn("10.10.10.10");
847860
when(_ipAddressDao.findByIpAndSourceNetworkId(anyLong(), anyString())).thenReturn(null);
848861
when(_nicDao.persist(any(NicVO.class))).thenReturn(nic);
862+
when(_ipAddressDao.findByIpAndDcId(anyLong(), anyString())).thenReturn(newIp);
863+
when(_vlanDao.findById(anyLong())).thenReturn(vlan);
849864

850865
Account caller = new AccountVO("testaccount", 1, "networkdomain", (short)0, UUID.randomUUID().toString());
851866
UserVO user = new UserVO(1, "testuser", "password", "firstname", "lastName", "email", "timezone", UUID.randomUUID().toString(), User.Source.UNKNOWN);

0 commit comments

Comments
 (0)