This is an automated email from the ASF dual-hosted git repository.

nvazquez pushed a commit to branch 4.22
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/4.22 by this push:
     new 4e679ad8778 Ensure the detail value is not null when updating the vnc 
access details of the vms with failed migrations on host maintenance (#13492)
4e679ad8778 is described below

commit 4e679ad8778e558952de9b3fe9b7a96d7fdfc144
Author: Suresh Kumar Anaparti <[email protected]>
AuthorDate: Wed Oct 7 00:43:34 2026 +0530

    Ensure the detail value is not null when updating the vnc access details of 
the vms with failed migrations on host maintenance (#13492)
    
    - Fixes the Constraint error Column 'value' cannot be null
---
 .../wrapper/LibvirtGetVncPortCommandWrapper.java   |  1 +
 .../com/cloud/resource/ResourceManagerImpl.java    | 27 ++++++++++++++++++----
 .../cloud/resource/ResourceManagerImplTest.java    |  2 ++
 3 files changed, 26 insertions(+), 4 deletions(-)

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 c16c9bcb9a8..aa628950f92 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 final class LibvirtGetVncPortCommandWrapper extends 
CommandWrapper<GetVnc
             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 275658a27e9..02cd4de1e86 100755
--- a/server/src/main/java/com/cloud/resource/ResourceManagerImpl.java
+++ b/server/src/main/java/com/cloud/resource/ResourceManagerImpl.java
@@ -1829,10 +1829,29 @@ public class ResourceManagerImpl extends ManagerBase 
implements ResourceManager,
     protected void setKVMVncAccess(long hostId, List<VMInstanceVO> 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 403afcac8a8..b9da7390566 100644
--- a/server/src/test/java/com/cloud/resource/ResourceManagerImplTest.java
+++ b/server/src/test/java/com/cloud/resource/ResourceManagerImplTest.java
@@ -211,8 +211,10 @@ public class ResourceManagerImplTest {
         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) -> {

Reply via email to