From 8c4dbd48ff4e997ded8a1dad3b8f10da256195c9 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Thu, 9 Oct 2025 10:34:33 +0200 Subject: [PATCH 1/4] importvm: fix IP address allocation on Shared networks --- .../engine/orchestration/NetworkOrchestrator.java | 6 +++--- .../apache/cloudstack/vm/UnmanagedVMsManagerImpl.java | 9 +-------- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java index a9c15afc2cfa..2ff69760e9ec 100644 --- a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java +++ b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java @@ -4783,12 +4783,12 @@ protected String getSelectedIpForNicImport(Network network, DataCenter dataCente if (network.getGuestType() == GuestType.L2) { return null; } - return dataCenter.getNetworkType() == NetworkType.Basic ? - getSelectedIpForNicImportOnBasicZone(ipAddresses.getIp4Address(), network, dataCenter): + return GuestType.Shared.equals(network.getGuestType()) ? + getSelectedIpForNicImportOnSharedNetwork(ipAddresses.getIp4Address(), network, dataCenter): _ipAddrMgr.acquireGuestIpAddress(network, ipAddresses.getIp4Address()); } - protected String getSelectedIpForNicImportOnBasicZone(String requestedIp, Network network, DataCenter dataCenter) { + protected String getSelectedIpForNicImportOnSharedNetwork(String requestedIp, Network network, DataCenter dataCenter) { IPAddressVO ipAddressVO = StringUtils.isBlank(requestedIp) ? _ipAddressDao.findBySourceNetworkIdAndDatacenterIdAndState(network.getId(), dataCenter.getId(), IpAddress.State.Free): _ipAddressDao.findByIp(requestedIp); diff --git a/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java b/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java index e5eb29a798da..be8ce77f6bb3 100644 --- a/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java @@ -71,7 +71,6 @@ import com.cloud.hypervisor.Hypervisor; import com.cloud.hypervisor.HypervisorGuru; import com.cloud.hypervisor.HypervisorGuruManager; -import com.cloud.network.IpAddressManager; import com.cloud.network.Network; import com.cloud.network.NetworkModel; import com.cloud.network.Networks; @@ -271,8 +270,6 @@ public class UnmanagedVMsManagerImpl implements UnmanagedVMsManager { @Inject private PhysicalNetworkDao physicalNetworkDao; @Inject - private IpAddressManager ipAddressManager; - @Inject private StoragePoolHostDao storagePoolHostDao; @Inject private HypervisorGuruManager hypervisorGuruManager; @@ -2613,12 +2610,8 @@ private UserVm importKvmVirtualMachineFromDisk(final ImportSource importSource, } String macAddress = networkModel.getNextAvailableMacAddressInNetwork(networkId); - String ipAddress = null; - if (network.getGuestType() != Network.GuestType.L2) { - ipAddress = ipAddressManager.acquireGuestIpAddress(network, null); - } - Network.IpAddresses requestedIpPair = new Network.IpAddresses(ipAddress, null, macAddress); + Network.IpAddresses requestedIpPair = new Network.IpAddresses(null, null, macAddress); NicProfile nicProfile = new NicProfile(requestedIpPair.getIp4Address(), requestedIpPair.getIp6Address(), requestedIpPair.getMacAddress()); nicProfile.setOrderIndex(0); From 80ebaae3eec8d07de3f1098403fa751304b03602 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Fri, 10 Oct 2025 10:59:23 +0200 Subject: [PATCH 2/4] Update 11811: update ip on shared network to Allocated state --- .../engine/orchestration/NetworkOrchestrator.java | 11 ++++++++++- .../engine/orchestration/NetworkOrchestratorTest.java | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java index 2ff69760e9ec..b61a478bca5c 100644 --- a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java +++ b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java @@ -4772,6 +4772,15 @@ public NicVO doInTransaction(TransactionStatus status) { } }); + if (selectedIp != null && GuestType.Shared.equals(network.getGuestType())) { + IPAddressVO ipAddressVO = _ipAddressDao.findByIpAndSourceNetworkId(network.getId(), selectedIp); + if (ipAddressVO != null && IpAddress.State.Free.equals(ipAddressVO.getState())) { + ipAddressVO.setState(IPAddressVO.State.Allocated); + ipAddressVO.setAllocatedTime(new Date()); + _ipAddressDao.update(ipAddressVO.getId(), ipAddressVO); + } + } + final Integer networkRate = _networkModel.getNetworkRate(network.getId(), vm.getId()); final NicProfile vmNic = new NicProfile(vo, network, vo.getBroadcastUri(), vo.getIsolationUri(), networkRate, _networkModel.isSecurityGroupSupportedInNetwork(network), _networkModel.getNetworkTag(vm.getHypervisorType(), network)); @@ -4791,7 +4800,7 @@ protected String getSelectedIpForNicImport(Network network, DataCenter dataCente protected String getSelectedIpForNicImportOnSharedNetwork(String requestedIp, Network network, DataCenter dataCenter) { IPAddressVO ipAddressVO = StringUtils.isBlank(requestedIp) ? _ipAddressDao.findBySourceNetworkIdAndDatacenterIdAndState(network.getId(), dataCenter.getId(), IpAddress.State.Free): - _ipAddressDao.findByIp(requestedIp); + _ipAddressDao.findByIpAndSourceNetworkId(network.getId(), requestedIp); if (ipAddressVO == null || ipAddressVO.getState() != IpAddress.State.Free) { String msg = String.format("Cannot find a free IP to assign to VM NIC on network %s", network.getName()); logger.error(msg); diff --git a/engine/orchestration/src/test/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestratorTest.java b/engine/orchestration/src/test/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestratorTest.java index 064ca44c69a2..a95f0e364759 100644 --- a/engine/orchestration/src/test/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestratorTest.java +++ b/engine/orchestration/src/test/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestratorTest.java @@ -822,7 +822,7 @@ public void testGetGuestIpForNicImportBasicZoneManualIP() { Mockito.when(network.getId()).thenReturn(networkId); Mockito.when(dataCenter.getId()).thenReturn(dataCenterId); Mockito.when(ipAddresses.getIp4Address()).thenReturn(requestedIp); - Mockito.when(testOrchestrator._ipAddressDao.findByIp(requestedIp)).thenReturn(ipAddressVO); + Mockito.when(testOrchestrator._ipAddressDao.findByIpAndSourceNetworkId(networkId, requestedIp)).thenReturn(ipAddressVO); String ipAddress = testOrchestrator.getSelectedIpForNicImport(network, dataCenter, ipAddresses); Assert.assertEquals(requestedIp, ipAddress); } From 9be63629122e09809cb187c3070dfa07810fb353 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Fri, 10 Oct 2025 11:38:31 +0200 Subject: [PATCH 3/4] Update 11811: update ip domain_id and account_id --- .../cloudstack/engine/orchestration/NetworkOrchestrator.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java index b61a478bca5c..4c7641fb79bd 100644 --- a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java +++ b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java @@ -4777,6 +4777,9 @@ public NicVO doInTransaction(TransactionStatus status) { if (ipAddressVO != null && IpAddress.State.Free.equals(ipAddressVO.getState())) { ipAddressVO.setState(IPAddressVO.State.Allocated); ipAddressVO.setAllocatedTime(new Date()); + Account account = _accountDao.findById(vm.getAccountId()); + ipAddressVO.setAllocatedInDomainId(account.getDomainId()); + ipAddressVO.setAllocatedToAccountId(account.getId()); _ipAddressDao.update(ipAddressVO.getId(), ipAddressVO); } } From 49c449fd774f8096097455574d11abfaaf8ab2f0 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Fri, 10 Oct 2025 12:24:36 +0200 Subject: [PATCH 4/4] Update 11811: automatically allocate IP address on non-L2 networks --- .../org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java b/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java index be8ce77f6bb3..0cf921f36bed 100644 --- a/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java @@ -2611,7 +2611,9 @@ private UserVm importKvmVirtualMachineFromDisk(final ImportSource importSource, String macAddress = networkModel.getNextAvailableMacAddressInNetwork(networkId); - Network.IpAddresses requestedIpPair = new Network.IpAddresses(null, null, macAddress); + String ipAddress = network.getGuestType() != Network.GuestType.L2 ? "auto" : null; + + Network.IpAddresses requestedIpPair = new Network.IpAddresses(ipAddress, null, macAddress); NicProfile nicProfile = new NicProfile(requestedIpPair.getIp4Address(), requestedIpPair.getIp6Address(), requestedIpPair.getMacAddress()); nicProfile.setOrderIndex(0);