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

sureshanaparti 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 273699cf566 kvm: fix wrong CheckVirtualMachineAnswer when vm does not 
exist (#12928)
273699cf566 is described below

commit 273699cf566394759d8c709707ce57e3348a883f
Author: Wei Zhou <[email protected]>
AuthorDate: Fri Apr 10 12:31:29 2026 +0200

    kvm: fix wrong CheckVirtualMachineAnswer when vm does not exist (#12928)
    
    * kvm: fix wrong CheckVirtualMachineAnswer when vm does not exist
    
    * kvm: add LibvirtCheckVirtualMachineCommandWrapperTest
    
    Co-authored-by: dahn <[email protected]>
---
 .../LibvirtCheckVirtualMachineCommandWrapper.java  |   9 +-
 ...bvirtCheckVirtualMachineCommandWrapperTest.java | 191 +++++++++++++++++++++
 2 files changed, 195 insertions(+), 5 deletions(-)

diff --git 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckVirtualMachineCommandWrapper.java
 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckVirtualMachineCommandWrapper.java
index 99005755cbb..aa6a37b6561 100644
--- 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckVirtualMachineCommandWrapper.java
+++ 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckVirtualMachineCommandWrapper.java
@@ -45,11 +45,10 @@ public final class LibvirtCheckVirtualMachineCommandWrapper 
extends CommandWrapp
             Integer vncPort = null;
             if (state == PowerState.PowerOn) {
                 vncPort = libvirtComputingResource.getVncPort(conn, 
command.getVmName());
-            }
-
-            Domain vm = conn.domainLookupByName(command.getVmName());
-            if (state == PowerState.PowerOn && 
DomainInfo.DomainState.VIR_DOMAIN_PAUSED.equals(vm.getInfo().state)) {
-                return new CheckVirtualMachineAnswer(command, 
PowerState.PowerUnknown, vncPort);
+                Domain vm = conn.domainLookupByName(command.getVmName());
+                if 
(DomainInfo.DomainState.VIR_DOMAIN_PAUSED.equals(vm.getInfo().state)) {
+                    return new CheckVirtualMachineAnswer(command, 
PowerState.PowerUnknown, vncPort);
+                }
             }
 
             return new CheckVirtualMachineAnswer(command, state, vncPort);
diff --git 
a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckVirtualMachineCommandWrapperTest.java
 
b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckVirtualMachineCommandWrapperTest.java
new file mode 100644
index 00000000000..a06a9c50bc1
--- /dev/null
+++ 
b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckVirtualMachineCommandWrapperTest.java
@@ -0,0 +1,191 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package com.cloud.hypervisor.kvm.resource.wrapper;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.libvirt.Connect;
+import org.libvirt.Domain;
+import org.libvirt.DomainInfo;
+import org.libvirt.DomainInfo.DomainState;
+import org.libvirt.LibvirtException;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import com.cloud.agent.api.CheckVirtualMachineAnswer;
+import com.cloud.agent.api.CheckVirtualMachineCommand;
+import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource;
+import com.cloud.vm.VirtualMachine.PowerState;
+
+@RunWith(MockitoJUnitRunner.class)
+public class LibvirtCheckVirtualMachineCommandWrapperTest {
+
+    private static final String VM_NAME = "i-2-3-VM";
+
+    @Mock
+    private LibvirtComputingResource libvirtComputingResource;
+    @Mock
+    private LibvirtUtilitiesHelper libvirtUtilitiesHelper;
+    @Mock
+    private Connect conn;
+    @Mock
+    private Domain domain;
+
+    private LibvirtCheckVirtualMachineCommandWrapper wrapper;
+    private CheckVirtualMachineCommand command;
+
+    @Before
+    public void setUp() throws LibvirtException {
+        wrapper = new LibvirtCheckVirtualMachineCommandWrapper();
+        command = new CheckVirtualMachineCommand(VM_NAME);
+
+        
when(libvirtComputingResource.getLibvirtUtilitiesHelper()).thenReturn(libvirtUtilitiesHelper);
+        
when(libvirtUtilitiesHelper.getConnectionByVmName(VM_NAME)).thenReturn(conn);
+    }
+
+    @Test
+    public void testExecuteVmPoweredOnReturnsStateAndVncPort() throws 
LibvirtException {
+        DomainInfo domainInfo = new DomainInfo();
+        domainInfo.state = DomainState.VIR_DOMAIN_RUNNING;
+
+        when(libvirtComputingResource.getVmState(conn, 
VM_NAME)).thenReturn(PowerState.PowerOn);
+        when(libvirtComputingResource.getVncPort(conn, 
VM_NAME)).thenReturn(5900);
+        when(conn.domainLookupByName(VM_NAME)).thenReturn(domain);
+        when(domain.getInfo()).thenReturn(domainInfo);
+
+        CheckVirtualMachineAnswer answer = (CheckVirtualMachineAnswer) 
wrapper.execute(command, libvirtComputingResource);
+
+        assertTrue(answer.getResult());
+        assertEquals(PowerState.PowerOn, answer.getState());
+        assertEquals(Integer.valueOf(5900), answer.getVncPort());
+    }
+
+    @Test
+    public void testExecuteVmPausedReturnsPowerUnknown() throws 
LibvirtException {
+        DomainInfo domainInfo = new DomainInfo();
+        domainInfo.state = DomainState.VIR_DOMAIN_PAUSED;
+
+        when(libvirtComputingResource.getVmState(conn, 
VM_NAME)).thenReturn(PowerState.PowerOn);
+        when(libvirtComputingResource.getVncPort(conn, 
VM_NAME)).thenReturn(5901);
+        when(conn.domainLookupByName(VM_NAME)).thenReturn(domain);
+        when(domain.getInfo()).thenReturn(domainInfo);
+
+        CheckVirtualMachineAnswer answer = (CheckVirtualMachineAnswer) 
wrapper.execute(command, libvirtComputingResource);
+
+        assertTrue(answer.getResult());
+        assertEquals(PowerState.PowerUnknown, answer.getState());
+        assertEquals(Integer.valueOf(5901), answer.getVncPort());
+    }
+
+    @Test
+    public void testExecuteVmPoweredOffReturnsStateWithNullVncPort() throws 
LibvirtException {
+        when(libvirtComputingResource.getVmState(conn, 
VM_NAME)).thenReturn(PowerState.PowerOff);
+
+        CheckVirtualMachineAnswer answer = (CheckVirtualMachineAnswer) 
wrapper.execute(command, libvirtComputingResource);
+
+        assertTrue(answer.getResult());
+        assertEquals(PowerState.PowerOff, answer.getState());
+        assertNull(answer.getVncPort());
+    }
+
+    @Test
+    public void testExecuteVmStateUnknownReturnsStateWithNullVncPort() throws 
LibvirtException {
+        when(libvirtComputingResource.getVmState(conn, 
VM_NAME)).thenReturn(PowerState.PowerUnknown);
+
+        CheckVirtualMachineAnswer answer = (CheckVirtualMachineAnswer) 
wrapper.execute(command, libvirtComputingResource);
+
+        assertTrue(answer.getResult());
+        assertEquals(PowerState.PowerUnknown, answer.getState());
+        assertNull(answer.getVncPort());
+    }
+
+    @Test
+    public void testExecuteVmPoweredOnWithNullVncPort() throws 
LibvirtException {
+        DomainInfo domainInfo = new DomainInfo();
+        domainInfo.state = DomainState.VIR_DOMAIN_RUNNING;
+
+        when(libvirtComputingResource.getVmState(conn, 
VM_NAME)).thenReturn(PowerState.PowerOn);
+        when(libvirtComputingResource.getVncPort(conn, 
VM_NAME)).thenReturn(null);
+        when(conn.domainLookupByName(VM_NAME)).thenReturn(domain);
+        when(domain.getInfo()).thenReturn(domainInfo);
+
+        CheckVirtualMachineAnswer answer = (CheckVirtualMachineAnswer) 
wrapper.execute(command, libvirtComputingResource);
+
+        assertTrue(answer.getResult());
+        assertEquals(PowerState.PowerOn, answer.getState());
+        assertNull(answer.getVncPort());
+    }
+
+    @Test
+    public void testExecuteLibvirtExceptionOnGetConnectionReturnsFailure() 
throws LibvirtException {
+        LibvirtException libvirtException = mock(LibvirtException.class);
+        when(libvirtException.getMessage()).thenReturn("Connection refused");
+        
when(libvirtUtilitiesHelper.getConnectionByVmName(VM_NAME)).thenThrow(libvirtException);
+
+        CheckVirtualMachineAnswer answer = (CheckVirtualMachineAnswer) 
wrapper.execute(command, libvirtComputingResource);
+
+        assertFalse(answer.getResult());
+        assertEquals("Connection refused", answer.getDetails());
+    }
+
+    @Test
+    public void testExecuteLibvirtExceptionOnGetVncPortReturnsFailure() throws 
LibvirtException {
+        LibvirtException libvirtException = mock(LibvirtException.class);
+        when(libvirtException.getMessage()).thenReturn("VNC port error");
+        when(libvirtComputingResource.getVmState(conn, 
VM_NAME)).thenReturn(PowerState.PowerOn);
+        when(libvirtComputingResource.getVncPort(conn, 
VM_NAME)).thenThrow(libvirtException);
+
+        CheckVirtualMachineAnswer answer = (CheckVirtualMachineAnswer) 
wrapper.execute(command, libvirtComputingResource);
+
+        assertFalse(answer.getResult());
+        assertEquals("VNC port error", answer.getDetails());
+    }
+
+    @Test
+    public void testExecuteLibvirtExceptionOnDomainLookupReturnsFailure() 
throws LibvirtException {
+        LibvirtException libvirtException = mock(LibvirtException.class);
+        when(libvirtException.getMessage()).thenReturn("Domain not found");
+        when(libvirtComputingResource.getVmState(conn, 
VM_NAME)).thenReturn(PowerState.PowerOn);
+        when(libvirtComputingResource.getVncPort(conn, 
VM_NAME)).thenReturn(5900);
+        when(conn.domainLookupByName(VM_NAME)).thenThrow(libvirtException);
+
+        CheckVirtualMachineAnswer answer = (CheckVirtualMachineAnswer) 
wrapper.execute(command, libvirtComputingResource);
+
+        assertFalse(answer.getResult());
+        assertEquals("Domain not found", answer.getDetails());
+    }
+
+    @Test
+    public void testExecuteCallsGetLibvirtUtilitiesHelper() throws 
LibvirtException {
+        when(libvirtComputingResource.getVmState(conn, 
VM_NAME)).thenReturn(PowerState.PowerOff);
+
+        wrapper.execute(command, libvirtComputingResource);
+
+        verify(libvirtComputingResource).getLibvirtUtilitiesHelper();
+        verify(libvirtUtilitiesHelper).getConnectionByVmName(VM_NAME);
+    }
+}

Reply via email to