From 559c011e8e7a7c871b1c0044c9909c9890583bfb Mon Sep 17 00:00:00 2001 From: Alexandru Bagu Date: Sat, 29 Mar 2025 12:35:32 +0100 Subject: [PATCH 1/3] match nic mac for ip address fetch --- .../agent/api/GetVmIpAddressCommand.java | 8 +++++++- .../vmware/resource/VmwareResource.java | 17 ++++++++++++----- .../xenbase/CitrixRequestWrapperTest.java | 2 +- .../java/com/cloud/vm/UserVmManagerImpl.java | 19 +++++++++---------- 4 files changed, 29 insertions(+), 17 deletions(-) diff --git a/core/src/main/java/com/cloud/agent/api/GetVmIpAddressCommand.java b/core/src/main/java/com/cloud/agent/api/GetVmIpAddressCommand.java index a9c7413b9f07..febe23b08f37 100644 --- a/core/src/main/java/com/cloud/agent/api/GetVmIpAddressCommand.java +++ b/core/src/main/java/com/cloud/agent/api/GetVmIpAddressCommand.java @@ -23,12 +23,14 @@ public class GetVmIpAddressCommand extends Command { String vmName; String vmNetworkCidr; + String vmNetworkMac; boolean windows = false; - public GetVmIpAddressCommand(String vmName, String vmNetworkCidr, boolean windows) { + public GetVmIpAddressCommand(String vmName, String vmNetworkCidr, String vmNetworkMac, boolean windows) { this.vmName = vmName; this.windows = windows; this.vmNetworkCidr = vmNetworkCidr; + this.vmNetworkMac = vmNetworkMac; } @Override @@ -47,4 +49,8 @@ public boolean isWindows(){ public String getVmNetworkCidr() { return vmNetworkCidr; } + + public String getVmNetworkMac() { + return vmNetworkMac; + } } diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java index a6bd95ee8970..0ec7b1e9662b 100644 --- a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java +++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java @@ -5738,7 +5738,6 @@ protected Answer execute(GetVmIpAddressCommand cmd) { String details = "Unable to find IP Address of VM. "; String vmName = cmd.getVmName(); boolean result = false; - String ip = null; Answer answer = null; VmwareContext context = getServiceContext(); @@ -5757,11 +5756,19 @@ protected Answer execute(GetVmIpAddressCommand cmd) { if (toolsStatus == VirtualMachineToolsStatus.TOOLS_NOT_INSTALLED) { details += "Vmware tools not installed."; } else { - ip = guestInfo.getIpAddress(); - if (ip != null) { - result = true; + var normalizedMac = cmd.getVmNetworkMac().replaceAll("-", ":"); + for(var guestInfoNic : guestInfo.getNet()) { + var normalizedNicMac = guestInfoNic.getMacAddress().replaceAll("-", ":"); + if (!result && normalizedNicMac.equalsIgnoreCase(normalizedMac)) { + result = true; + details = null; + for (var ipAddr : guestInfoNic.getIpAddress()) { + if(NetUtils.isIpWithInCidrRange(ipAddr, cmd.getVmNetworkCidr())) { + details = ipAddr; + } + } + } } - details = ip; } } else { details += "VM " + vmName + " no longer exists on vSphere host: " + hyperHost.getHyperHostName(); diff --git a/plugins/hypervisors/xenserver/src/test/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixRequestWrapperTest.java b/plugins/hypervisors/xenserver/src/test/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixRequestWrapperTest.java index 9ecb14d841ff..73de25595d65 100755 --- a/plugins/hypervisors/xenserver/src/test/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixRequestWrapperTest.java +++ b/plugins/hypervisors/xenserver/src/test/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixRequestWrapperTest.java @@ -1934,7 +1934,7 @@ public void testGetVmIpAddressCommand() throws XenAPIException, XmlRpcException vmIpsMap.put("Test", "127.0.0.1"); rec.networks = vmIpsMap; - final GetVmIpAddressCommand getVmIpAddrCmd = new GetVmIpAddressCommand("Test", "127.0.0.1/24", false); + final GetVmIpAddressCommand getVmIpAddrCmd = new GetVmIpAddressCommand("Test", "127.0.0.1/24", "00:1b:63:84:45:e6", false); final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance(); assertNotNull(wrapper); diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index 167995a6b5f3..d4cbf8efdb2d 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -762,17 +762,22 @@ public VmIpAddrFetchThread(long vmId, String vmUuid, long nicId, String instance @Override protected void runInContext() { - GetVmIpAddressCommand cmd = new GetVmIpAddressCommand(vmName, networkCidr, isWindows); + NicVO nic = _nicDao.findById(nicId); + GetVmIpAddressCommand cmd = new GetVmIpAddressCommand(vmName, networkCidr, nic.getMacAddress(), isWindows); boolean decrementCount = true; - NicVO nic = _nicDao.findById(nicId); try { logger.debug("Trying IP retrieval for VM [id: {}, uuid: {}, name: {}], nic {}", vmId, vmUuid, vmName, nic); Answer answer = _agentMgr.send(hostId, cmd); if (answer.getResult()) { String vmIp = answer.getDetails(); - - if (NetUtils.isValidIp4(vmIp)) { + if (null == vmIp) { + // we got a valid response and the NIC does not have an IP assigned, as such we will update the database with null + if (nic.getIPv4Address() != null) { + nic.setIPv4Address(null); + _nicDao.update(nicId, nic); + } + } else if (NetUtils.isValidIp4(vmIp)) { // set this vm ip addr in vm nic. if (nic != null) { nic.setIPv4Address(vmIp); @@ -787,12 +792,6 @@ protected void runInContext() { } } } else { - //previously vm has ip and nic table has ip address. After vm restart or stop/start - //if vm doesnot get the ip then set the ip in nic table to null - if (nic.getIPv4Address() != null) { - nic.setIPv4Address(null); - _nicDao.update(nicId, nic); - } if (answer.getDetails() != null) { logger.debug("Failed to get vm ip for Vm [id: {}, uuid: {}, name: {}], details: {}", vmId, vmUuid, vmName, answer.getDetails()); From 4a40b00a8e51c7251495ed9fc63f97f20c472a41 Mon Sep 17 00:00:00 2001 From: Alexandru Bagu Date: Sat, 29 Mar 2025 13:02:45 +0100 Subject: [PATCH 2/3] rename field to properly match usage --- .../com/cloud/agent/api/GetVmIpAddressCommand.java | 10 +++++----- .../hypervisor/vmware/resource/VmwareResource.java | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/com/cloud/agent/api/GetVmIpAddressCommand.java b/core/src/main/java/com/cloud/agent/api/GetVmIpAddressCommand.java index febe23b08f37..3aa8cf382c94 100644 --- a/core/src/main/java/com/cloud/agent/api/GetVmIpAddressCommand.java +++ b/core/src/main/java/com/cloud/agent/api/GetVmIpAddressCommand.java @@ -23,14 +23,14 @@ public class GetVmIpAddressCommand extends Command { String vmName; String vmNetworkCidr; - String vmNetworkMac; + String vmNicMac; boolean windows = false; - public GetVmIpAddressCommand(String vmName, String vmNetworkCidr, String vmNetworkMac, boolean windows) { + public GetVmIpAddressCommand(String vmName, String vmNetworkCidr, String vmNicMac, boolean windows) { this.vmName = vmName; this.windows = windows; this.vmNetworkCidr = vmNetworkCidr; - this.vmNetworkMac = vmNetworkMac; + this.vmNicMac = vmNicMac; } @Override @@ -50,7 +50,7 @@ public String getVmNetworkCidr() { return vmNetworkCidr; } - public String getVmNetworkMac() { - return vmNetworkMac; + public String getVmNicMac() { + return vmNicMac; } } diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java index 0ec7b1e9662b..0b2cfdb0839f 100644 --- a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java +++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java @@ -5756,7 +5756,7 @@ protected Answer execute(GetVmIpAddressCommand cmd) { if (toolsStatus == VirtualMachineToolsStatus.TOOLS_NOT_INSTALLED) { details += "Vmware tools not installed."; } else { - var normalizedMac = cmd.getVmNetworkMac().replaceAll("-", ":"); + var normalizedMac = cmd.getVmNicMac().replaceAll("-", ":"); for(var guestInfoNic : guestInfo.getNet()) { var normalizedNicMac = guestInfoNic.getMacAddress().replaceAll("-", ":"); if (!result && normalizedNicMac.equalsIgnoreCase(normalizedMac)) { From 2726acae0ed75689d8bff4961e000da8dd28e19d Mon Sep 17 00:00:00 2001 From: Alexandru Bagu Date: Fri, 25 Apr 2025 11:37:50 +0200 Subject: [PATCH 3/3] rebase to 4.20 and adapt code to match other PR --- .../com/cloud/agent/api/GetVmIpAddressCommand.java | 10 +++++----- .../hypervisor/vmware/resource/VmwareResource.java | 2 +- .../wrapper/xenbase/CitrixRequestWrapperTest.java | 2 +- .../src/main/java/com/cloud/vm/UserVmManagerImpl.java | 10 ++++++---- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/core/src/main/java/com/cloud/agent/api/GetVmIpAddressCommand.java b/core/src/main/java/com/cloud/agent/api/GetVmIpAddressCommand.java index 3aa8cf382c94..4efc0781f919 100644 --- a/core/src/main/java/com/cloud/agent/api/GetVmIpAddressCommand.java +++ b/core/src/main/java/com/cloud/agent/api/GetVmIpAddressCommand.java @@ -23,14 +23,14 @@ public class GetVmIpAddressCommand extends Command { String vmName; String vmNetworkCidr; - String vmNicMac; boolean windows = false; + String macAddress; - public GetVmIpAddressCommand(String vmName, String vmNetworkCidr, String vmNicMac, boolean windows) { + public GetVmIpAddressCommand(String vmName, String vmNetworkCidr, boolean windows, String macAddress) { this.vmName = vmName; this.windows = windows; this.vmNetworkCidr = vmNetworkCidr; - this.vmNicMac = vmNicMac; + this.macAddress = macAddress; } @Override @@ -50,7 +50,7 @@ public String getVmNetworkCidr() { return vmNetworkCidr; } - public String getVmNicMac() { - return vmNicMac; + public String getMacAddress() { + return macAddress; } } diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java index 0b2cfdb0839f..1e282502e7b8 100644 --- a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java +++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java @@ -5756,7 +5756,7 @@ protected Answer execute(GetVmIpAddressCommand cmd) { if (toolsStatus == VirtualMachineToolsStatus.TOOLS_NOT_INSTALLED) { details += "Vmware tools not installed."; } else { - var normalizedMac = cmd.getVmNicMac().replaceAll("-", ":"); + var normalizedMac = cmd.getMacAddress().replaceAll("-", ":"); for(var guestInfoNic : guestInfo.getNet()) { var normalizedNicMac = guestInfoNic.getMacAddress().replaceAll("-", ":"); if (!result && normalizedNicMac.equalsIgnoreCase(normalizedMac)) { diff --git a/plugins/hypervisors/xenserver/src/test/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixRequestWrapperTest.java b/plugins/hypervisors/xenserver/src/test/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixRequestWrapperTest.java index 73de25595d65..d464a2664935 100755 --- a/plugins/hypervisors/xenserver/src/test/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixRequestWrapperTest.java +++ b/plugins/hypervisors/xenserver/src/test/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixRequestWrapperTest.java @@ -1934,7 +1934,7 @@ public void testGetVmIpAddressCommand() throws XenAPIException, XmlRpcException vmIpsMap.put("Test", "127.0.0.1"); rec.networks = vmIpsMap; - final GetVmIpAddressCommand getVmIpAddrCmd = new GetVmIpAddressCommand("Test", "127.0.0.1/24", "00:1b:63:84:45:e6", false); + final GetVmIpAddressCommand getVmIpAddrCmd = new GetVmIpAddressCommand("Test", "127.0.0.1/24", false, null); final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance(); assertNotNull(wrapper); diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index d4cbf8efdb2d..4cd6db91523f 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -749,8 +749,9 @@ private class VmIpAddrFetchThread extends ManagedContextRunnable { boolean isWindows; Long hostId; String networkCidr; + String macAddress; - public VmIpAddrFetchThread(long vmId, String vmUuid, long nicId, String instanceName, boolean windows, Long hostId, String networkCidr) { + public VmIpAddrFetchThread(long vmId, String vmUuid, long nicId, String instanceName, boolean windows, Long hostId, String networkCidr, String macAddress) { this.vmId = vmId; this.vmUuid = vmUuid; this.nicId = nicId; @@ -758,14 +759,15 @@ public VmIpAddrFetchThread(long vmId, String vmUuid, long nicId, String instance this.isWindows = windows; this.hostId = hostId; this.networkCidr = networkCidr; + this.macAddress = macAddress; } @Override protected void runInContext() { - NicVO nic = _nicDao.findById(nicId); - GetVmIpAddressCommand cmd = new GetVmIpAddressCommand(vmName, networkCidr, nic.getMacAddress(), isWindows); + GetVmIpAddressCommand cmd = new GetVmIpAddressCommand(vmName, networkCidr, isWindows, macAddress); boolean decrementCount = true; + NicVO nic = _nicDao.findById(nicId); try { logger.debug("Trying IP retrieval for VM [id: {}, uuid: {}, name: {}], nic {}", vmId, vmUuid, vmName, nic); Answer answer = _agentMgr.send(hostId, cmd); @@ -2686,7 +2688,7 @@ protected void runInContext() { boolean isWindows = _guestOSCategoryDao.findById(_guestOSDao.findById(vm.getGuestOSId()).getCategoryId()).getName().equalsIgnoreCase("Windows"); _vmIpFetchThreadExecutor.execute(new VmIpAddrFetchThread(vmId, vmInstance.getUuid(), nicId, vmInstance.getInstanceName(), - isWindows, vm.getHostId(), network.getCidr())); + isWindows, vm.getHostId(), network.getCidr(), nicVo.getMacAddress())); } } catch (Exception e) {