diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtGetVncPortCommandWrapper.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtGetVncPortCommandWrapper.java index c16c9bcb9a8b..aa628950f925 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtGetVncPortCommandWrapper.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtGetVncPortCommandWrapper.java @@ -41,6 +41,7 @@ public Answer execute(final GetVncPortCommand command, final LibvirtComputingRes final Integer vncPort = libvirtComputingResource.getVncPort(conn, command.getName()); return new GetVncPortAnswer(command, libvirtComputingResource.getPrivateIp(), 5900 + vncPort); } catch (final LibvirtException e) { + logger.error("Failed to get vnc port for the vm: {} due to {}", command.getName(), e.getMessage()); return new GetVncPortAnswer(command, e.toString()); } } diff --git a/server/src/main/java/com/cloud/resource/ResourceManagerImpl.java b/server/src/main/java/com/cloud/resource/ResourceManagerImpl.java index 87059badbec5..855a4f666b81 100755 --- a/server/src/main/java/com/cloud/resource/ResourceManagerImpl.java +++ b/server/src/main/java/com/cloud/resource/ResourceManagerImpl.java @@ -1825,10 +1825,29 @@ public Host cancelHostAsDegraded(final CancelHostAsDegradedCmd cmd) throws NoTra protected void setKVMVncAccess(long hostId, List vms) { for (VMInstanceVO vm : vms) { GetVncPortAnswer vmVncPortAnswer = (GetVncPortAnswer) _agentMgr.easySend(hostId, new GetVncPortCommand(vm.getId(), vm.getInstanceName())); - if (vmVncPortAnswer != null) { - vmInstanceDetailsDao.addDetail(vm.getId(), VmDetailConstants.KVM_VNC_ADDRESS, vmVncPortAnswer.getAddress(), true); - vmInstanceDetailsDao.addDetail(vm.getId(), VmDetailConstants.KVM_VNC_PORT, String.valueOf(vmVncPortAnswer.getPort()), true); - } + updateVncAccessDetailForVM(vm, vmVncPortAnswer, hostId); + } + } + + private void updateVncAccessDetailForVM(VMInstanceVO vm, GetVncPortAnswer vmVncPortAnswer, long hostId) { + if (vm == null || vmVncPortAnswer == null) { + logger.warn("VM or VNC port answer is null. Cannot update VNC access details."); + return; + } + + if (!vmVncPortAnswer.getResult()) { + logger.warn("Failed to get VNC port for VM {} on host {}. Details: {}", vm, hostId, vmVncPortAnswer.getDetails()); + return; + } + + String vncAddress = vmVncPortAnswer.getAddress(); + String vncPort = String.valueOf(vmVncPortAnswer.getPort()); + if (org.apache.commons.lang3.StringUtils.isNotBlank(vmVncPortAnswer.getAddress()) && org.apache.commons.lang3.StringUtils.isNotBlank(vncPort)) { + logger.info("Setting VNC access details for VM {} on host {} to address: {}, port: {}", vm, hostId, vncAddress, vncPort); + vmInstanceDetailsDao.addDetail(vm.getId(), VmDetailConstants.KVM_VNC_ADDRESS, vncAddress, true); + vmInstanceDetailsDao.addDetail(vm.getId(), VmDetailConstants.KVM_VNC_PORT, vncPort, true); + } else { + logger.warn("Unable to set VNC access details for VM {} on host {} as the address or port is blank. Address: {}, Port: {}", vm, hostId, vncAddress, vncPort); } } diff --git a/server/src/test/java/com/cloud/resource/ResourceManagerImplTest.java b/server/src/test/java/com/cloud/resource/ResourceManagerImplTest.java index 30a021591a5d..dce7fa0da16d 100644 --- a/server/src/test/java/com/cloud/resource/ResourceManagerImplTest.java +++ b/server/src/test/java/com/cloud/resource/ResourceManagerImplTest.java @@ -210,8 +210,10 @@ public void setup() throws Exception { actionEventUtilsMocked = Mockito.mockStatic(ActionEventUtils.class); BDDMockito.given(ActionEventUtils.onCompletedActionEvent(anyLong(), anyLong(), anyString(), anyString(), anyString(), anyLong(), anyString(), anyLong())) .willReturn(1L); + when(getVncPortAnswerVm1.getResult()).thenReturn(true); when(getVncPortAnswerVm1.getAddress()).thenReturn(vm1VncAddress); when(getVncPortAnswerVm1.getPort()).thenReturn(vm1VncPort); + when(getVncPortAnswerVm2.getResult()).thenReturn(true); when(getVncPortAnswerVm2.getAddress()).thenReturn(vm2VncAddress); when(getVncPortAnswerVm2.getPort()).thenReturn(vm2VncPort); getVncPortCommandMockedConstruction = Mockito.mockConstruction(GetVncPortCommand.class, (mock,context) -> {