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

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


The following commit(s) were added to refs/heads/4.19 by this push:
     new 58a63f64fd6 Fix VMWare leftovers when deleting VM without root disk 
(#9735)
58a63f64fd6 is described below

commit 58a63f64fd6c42d8e359baad4992ada7bf61b330
Author: Gabriel Pordeus Santos <[email protected]>
AuthorDate: Sun Feb 9 05:31:39 2025 -0300

    Fix VMWare leftovers when deleting VM without root disk (#9735)
---
 .../java/com/cloud/agent/api/CleanupVMCommand.java | 46 ++++++++++++++++++++++
 .../java/com/cloud/hypervisor/guru/VMwareGuru.java |  8 ++++
 .../hypervisor/vmware/resource/VmwareResource.java | 23 +++++++++++
 3 files changed, 77 insertions(+)

diff --git a/core/src/main/java/com/cloud/agent/api/CleanupVMCommand.java 
b/core/src/main/java/com/cloud/agent/api/CleanupVMCommand.java
new file mode 100644
index 00000000000..a4d73a8b164
--- /dev/null
+++ b/core/src/main/java/com/cloud/agent/api/CleanupVMCommand.java
@@ -0,0 +1,46 @@
+//
+// 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.agent.api;
+
+/**
+ * This command will destroy a leftover VM during the expunge process if it 
wasn't destroyed before.
+ *
+ */
+public class CleanupVMCommand extends Command {
+    String vmName;
+    boolean executeInSequence;
+
+    public CleanupVMCommand(String vmName) {
+        this(vmName, false);
+    }
+    public CleanupVMCommand(String vmName, boolean executeInSequence) {
+        this.vmName = vmName;
+        this.executeInSequence = executeInSequence;
+    }
+
+    @Override
+    public boolean executeInSequence() {
+        return executeInSequence;
+    }
+
+    public String getVmName() {
+        return vmName;
+    }
+}
diff --git 
a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/guru/VMwareGuru.java
 
b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/guru/VMwareGuru.java
index 822fc870c67..9fc73e37082 100644
--- 
a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/guru/VMwareGuru.java
+++ 
b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/guru/VMwareGuru.java
@@ -27,6 +27,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 
+import com.cloud.agent.api.CleanupVMCommand;
 import javax.inject.Inject;
 
 import com.cloud.agent.api.to.NfsTO;
@@ -371,6 +372,13 @@ public class VMwareGuru extends HypervisorGuruBase 
implements HypervisorGuru, Co
         return tokens[0] + "@" + vCenterIp;
     }
 
+    @Override public List<Command> finalizeExpunge(VirtualMachine vm) {
+        List<Command> commands = new ArrayList<Command>();
+        final CleanupVMCommand cleanupVMCommand = new 
CleanupVMCommand(vm.getInstanceName(), true);
+        commands.add(cleanupVMCommand);
+        return commands;
+    }
+
     @Override public List<Command> finalizeExpungeNics(VirtualMachine vm, 
List<NicProfile> nics) {
         List<Command> commands = new ArrayList<Command>();
         List<NicVO> nicVOs = nicDao.listByVmId(vm.getId());
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 92821c7e26d..20495530909 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
@@ -45,6 +45,7 @@ import java.util.TimeZone;
 import java.util.UUID;
 import java.util.stream.Collectors;
 
+import com.cloud.agent.api.CleanupVMCommand;
 import javax.naming.ConfigurationException;
 import javax.xml.datatype.XMLGregorianCalendar;
 
@@ -585,6 +586,8 @@ public class VmwareResource extends ServerResourceBase 
implements StoragePoolRes
                 return execute((ResizeVolumeCommand) cmd);
             } else if (clz == UnregisterVMCommand.class) {
                 return execute((UnregisterVMCommand) cmd);
+            } else if (clz == CleanupVMCommand.class) {
+                return execute((CleanupVMCommand) cmd);
             } else if (cmd instanceof StorageSubSystemCommand) {
                 
checkStorageProcessorAndHandlerNfsVersionAttribute((StorageSubSystemCommand) 
cmd);
                 return 
storageHandler.handleStorageCommands((StorageSubSystemCommand) cmd);
@@ -5796,6 +5799,26 @@ public class VmwareResource extends ServerResourceBase 
implements StoragePoolRes
         return new Answer(cmd, true, "success");
     }
 
+    protected Answer execute(CleanupVMCommand cmd) {
+        VmwareContext context = getServiceContext();
+        VmwareHypervisorHost hyperHost = getHyperHost(context);
+
+        try {
+            VirtualMachineMO vmMo = 
hyperHost.findVmOnHyperHost(cmd.getVmName());
+            if (vmMo == null) {
+                String msg = String.format("VM [%s] not found on vCenter, 
cleanup not needed.", cmd.getVmName());
+                s_logger.debug(msg);
+                return new Answer(cmd, true, msg);
+            }
+            vmMo.destroy();
+            String msg = String.format("VM [%s] remnants on vCenter cleaned 
up.", cmd.getVmName());
+            s_logger.debug(msg);
+            return new Answer(cmd, true, msg);
+        } catch (Exception e) {
+            return new Answer(cmd, false, createLogMessageException(e, cmd));
+        }
+    }
+
     protected Answer execute(UnregisterVMCommand cmd) {
         VmwareContext context = getServiceContext();
         VmwareHypervisorHost hyperHost = getHyperHost(context);

Reply via email to