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) -> {