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