mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
Fix VMWare leftovers when deleting VM without root disk (#9735)
This commit is contained in:
parent
a1117acbdf
commit
58a63f64fd
46
core/src/main/java/com/cloud/agent/api/CleanupVMCommand.java
Normal file
46
core/src/main/java/com/cloud/agent/api/CleanupVMCommand.java
Normal file
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -27,6 +27,7 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import com.cloud.agent.api.CleanupVMCommand;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import com.cloud.agent.api.to.NfsTO;
|
import com.cloud.agent.api.to.NfsTO;
|
||||||
@ -371,6 +372,13 @@ public class VMwareGuru extends HypervisorGuruBase implements HypervisorGuru, Co
|
|||||||
return tokens[0] + "@" + vCenterIp;
|
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) {
|
@Override public List<Command> finalizeExpungeNics(VirtualMachine vm, List<NicProfile> nics) {
|
||||||
List<Command> commands = new ArrayList<Command>();
|
List<Command> commands = new ArrayList<Command>();
|
||||||
List<NicVO> nicVOs = nicDao.listByVmId(vm.getId());
|
List<NicVO> nicVOs = nicDao.listByVmId(vm.getId());
|
||||||
|
|||||||
@ -45,6 +45,7 @@ import java.util.TimeZone;
|
|||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import com.cloud.agent.api.CleanupVMCommand;
|
||||||
import javax.naming.ConfigurationException;
|
import javax.naming.ConfigurationException;
|
||||||
import javax.xml.datatype.XMLGregorianCalendar;
|
import javax.xml.datatype.XMLGregorianCalendar;
|
||||||
|
|
||||||
@ -585,6 +586,8 @@ public class VmwareResource extends ServerResourceBase implements StoragePoolRes
|
|||||||
return execute((ResizeVolumeCommand) cmd);
|
return execute((ResizeVolumeCommand) cmd);
|
||||||
} else if (clz == UnregisterVMCommand.class) {
|
} else if (clz == UnregisterVMCommand.class) {
|
||||||
return execute((UnregisterVMCommand) cmd);
|
return execute((UnregisterVMCommand) cmd);
|
||||||
|
} else if (clz == CleanupVMCommand.class) {
|
||||||
|
return execute((CleanupVMCommand) cmd);
|
||||||
} else if (cmd instanceof StorageSubSystemCommand) {
|
} else if (cmd instanceof StorageSubSystemCommand) {
|
||||||
checkStorageProcessorAndHandlerNfsVersionAttribute((StorageSubSystemCommand) cmd);
|
checkStorageProcessorAndHandlerNfsVersionAttribute((StorageSubSystemCommand) cmd);
|
||||||
return storageHandler.handleStorageCommands((StorageSubSystemCommand) cmd);
|
return storageHandler.handleStorageCommands((StorageSubSystemCommand) cmd);
|
||||||
@ -5796,6 +5799,26 @@ public class VmwareResource extends ServerResourceBase implements StoragePoolRes
|
|||||||
return new Answer(cmd, true, "success");
|
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) {
|
protected Answer execute(UnregisterVMCommand cmd) {
|
||||||
VmwareContext context = getServiceContext();
|
VmwareContext context = getServiceContext();
|
||||||
VmwareHypervisorHost hyperHost = getHyperHost(context);
|
VmwareHypervisorHost hyperHost = getHyperHost(context);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user