Skip to content

Commit 86cad79

Browse files
importvm: fix IP address allocation on Shared networks (#11811)
1 parent 4d95f08 commit 86cad79

File tree

3 files changed

+19
-12
lines changed

3 files changed

+19
-12
lines changed

engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4772,6 +4772,18 @@ public NicVO doInTransaction(TransactionStatus status) {
47724772
}
47734773
});
47744774

4775+
if (selectedIp != null && GuestType.Shared.equals(network.getGuestType())) {
4776+
IPAddressVO ipAddressVO = _ipAddressDao.findByIpAndSourceNetworkId(network.getId(), selectedIp);
4777+
if (ipAddressVO != null && IpAddress.State.Free.equals(ipAddressVO.getState())) {
4778+
ipAddressVO.setState(IPAddressVO.State.Allocated);
4779+
ipAddressVO.setAllocatedTime(new Date());
4780+
Account account = _accountDao.findById(vm.getAccountId());
4781+
ipAddressVO.setAllocatedInDomainId(account.getDomainId());
4782+
ipAddressVO.setAllocatedToAccountId(account.getId());
4783+
_ipAddressDao.update(ipAddressVO.getId(), ipAddressVO);
4784+
}
4785+
}
4786+
47754787
final Integer networkRate = _networkModel.getNetworkRate(network.getId(), vm.getId());
47764788
final NicProfile vmNic = new NicProfile(vo, network, vo.getBroadcastUri(), vo.getIsolationUri(), networkRate, _networkModel.isSecurityGroupSupportedInNetwork(network),
47774789
_networkModel.getNetworkTag(vm.getHypervisorType(), network));
@@ -4783,15 +4795,15 @@ protected String getSelectedIpForNicImport(Network network, DataCenter dataCente
47834795
if (network.getGuestType() == GuestType.L2) {
47844796
return null;
47854797
}
4786-
return dataCenter.getNetworkType() == NetworkType.Basic ?
4787-
getSelectedIpForNicImportOnBasicZone(ipAddresses.getIp4Address(), network, dataCenter):
4798+
return GuestType.Shared.equals(network.getGuestType()) ?
4799+
getSelectedIpForNicImportOnSharedNetwork(ipAddresses.getIp4Address(), network, dataCenter):
47884800
_ipAddrMgr.acquireGuestIpAddress(network, ipAddresses.getIp4Address());
47894801
}
47904802

4791-
protected String getSelectedIpForNicImportOnBasicZone(String requestedIp, Network network, DataCenter dataCenter) {
4803+
protected String getSelectedIpForNicImportOnSharedNetwork(String requestedIp, Network network, DataCenter dataCenter) {
47924804
IPAddressVO ipAddressVO = StringUtils.isBlank(requestedIp) ?
47934805
_ipAddressDao.findBySourceNetworkIdAndDatacenterIdAndState(network.getId(), dataCenter.getId(), IpAddress.State.Free):
4794-
_ipAddressDao.findByIp(requestedIp);
4806+
_ipAddressDao.findByIpAndSourceNetworkId(network.getId(), requestedIp);
47954807
if (ipAddressVO == null || ipAddressVO.getState() != IpAddress.State.Free) {
47964808
String msg = String.format("Cannot find a free IP to assign to VM NIC on network %s", network.getName());
47974809
logger.error(msg);

engine/orchestration/src/test/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestratorTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -822,7 +822,7 @@ public void testGetGuestIpForNicImportBasicZoneManualIP() {
822822
Mockito.when(network.getId()).thenReturn(networkId);
823823
Mockito.when(dataCenter.getId()).thenReturn(dataCenterId);
824824
Mockito.when(ipAddresses.getIp4Address()).thenReturn(requestedIp);
825-
Mockito.when(testOrchestrator._ipAddressDao.findByIp(requestedIp)).thenReturn(ipAddressVO);
825+
Mockito.when(testOrchestrator._ipAddressDao.findByIpAndSourceNetworkId(networkId, requestedIp)).thenReturn(ipAddressVO);
826826
String ipAddress = testOrchestrator.getSelectedIpForNicImport(network, dataCenter, ipAddresses);
827827
Assert.assertEquals(requestedIp, ipAddress);
828828
}

server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@
7171
import com.cloud.hypervisor.Hypervisor;
7272
import com.cloud.hypervisor.HypervisorGuru;
7373
import com.cloud.hypervisor.HypervisorGuruManager;
74-
import com.cloud.network.IpAddressManager;
7574
import com.cloud.network.Network;
7675
import com.cloud.network.NetworkModel;
7776
import com.cloud.network.Networks;
@@ -271,8 +270,6 @@ public class UnmanagedVMsManagerImpl implements UnmanagedVMsManager {
271270
@Inject
272271
private PhysicalNetworkDao physicalNetworkDao;
273272
@Inject
274-
private IpAddressManager ipAddressManager;
275-
@Inject
276273
private StoragePoolHostDao storagePoolHostDao;
277274
@Inject
278275
private HypervisorGuruManager hypervisorGuruManager;
@@ -2613,10 +2610,8 @@ private UserVm importKvmVirtualMachineFromDisk(final ImportSource importSource,
26132610
}
26142611

26152612
String macAddress = networkModel.getNextAvailableMacAddressInNetwork(networkId);
2616-
String ipAddress = null;
2617-
if (network.getGuestType() != Network.GuestType.L2) {
2618-
ipAddress = ipAddressManager.acquireGuestIpAddress(network, null);
2619-
}
2613+
2614+
String ipAddress = network.getGuestType() != Network.GuestType.L2 ? "auto" : null;
26202615

26212616
Network.IpAddresses requestedIpPair = new Network.IpAddresses(ipAddress, null, macAddress);
26222617

0 commit comments

Comments
 (0)