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 5d5ac17c685 xenserver: do not destroy halted hypervisor vm (#9175)
5d5ac17c685 is described below
commit 5d5ac17c685787556bb2015ca3c0dd4f2c9ace11
Author: Abhishek Kumar <[email protected]>
AuthorDate: Wed Apr 9 13:03:01 2025 +0530
xenserver: do not destroy halted hypervisor vm (#9175)
Signed-off-by: Abhishek Kumar <[email protected]>
---
.../xenserver/resource/CitrixResourceBase.java | 38 +++++++++++++++++-----
.../xen56/XenServer56FenceCommandWrapper.java | 2 +-
.../xen56p1/XenServer56FP1FenceCommandWrapper.java | 2 +-
.../CitrixCreateVMSnapshotCommandWrapper.java | 9 +++--
.../CitrixDeleteVMSnapshotCommandWrapper.java | 2 +-
.../CitrixRevertToVMSnapshotCommandWrapper.java | 3 +-
.../wrapper/xenbase/CitrixStartCommandWrapper.java | 2 +-
.../wrapper/xenbase/CitrixStopCommandWrapper.java | 2 +-
8 files changed, 40 insertions(+), 20 deletions(-)
diff --git
a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
index f53a70de722..322f69c9531 100644
---
a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
+++
b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
@@ -51,10 +51,6 @@ import java.util.concurrent.TimeoutException;
import javax.naming.ConfigurationException;
import javax.xml.parsers.ParserConfigurationException;
-import com.trilead.ssh2.SFTPException;
-import com.trilead.ssh2.SFTPv3Client;
-import com.trilead.ssh2.SFTPv3DirectoryEntry;
-import com.trilead.ssh2.SFTPv3FileAttributes;
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.diagnostics.CopyToSecondaryStorageAnswer;
import org.apache.cloudstack.diagnostics.CopyToSecondaryStorageCommand;
@@ -72,6 +68,7 @@ import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
+import org.apache.maven.artifact.versioning.ComparableVersion;
import org.apache.xmlrpc.XmlRpcException;
import org.joda.time.Duration;
import org.w3c.dom.Document;
@@ -153,6 +150,10 @@ import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachine.PowerState;
import com.cloud.vm.VmDetailConstants;
import com.trilead.ssh2.SCPClient;
+import com.trilead.ssh2.SFTPException;
+import com.trilead.ssh2.SFTPv3Client;
+import com.trilead.ssh2.SFTPv3DirectoryEntry;
+import com.trilead.ssh2.SFTPv3FileAttributes;
import com.xensource.xenapi.Bond;
import com.xensource.xenapi.Connection;
import com.xensource.xenapi.Console;
@@ -627,7 +628,7 @@ public abstract class CitrixResourceBase extends
ServerResourceBase implements S
if (VmPowerState.HALTED.equals(vmRec.powerState) &&
vmRec.affinity.equals(host) && !isAlienVm(vm, conn)) {
try {
- vm.destroy(conn);
+ destroyVm(vm, conn);
} catch (final Exception e) {
s_logger.warn("Catch Exception " +
e.getClass().getName() + ": unable to destroy VM " + vmRec.nameLabel + " due to
", e);
success = false;
@@ -1452,7 +1453,7 @@ public abstract class CitrixResourceBase extends
ServerResourceBase implements S
vm.setPVBootloader(conn, "pygrub");
vm.setPVBootloaderArgs(conn,
CitrixHelper.getPVbootloaderArgs(guestOsTypeName));
} else {
- vm.destroy(conn);
+ destroyVm(vm, conn, true);
throw new CloudRuntimeException("Unable to handle boot loader
type: " + vmSpec.getBootloader());
}
}
@@ -2038,7 +2039,7 @@ public abstract class CitrixResourceBase extends
ServerResourceBase implements S
final Long domId = vm.getDomid(conn);
callHostPlugin(conn, "vmopspremium", "forceShutdownVM", "domId",
domId.toString());
vm.powerStateReset(conn);
- vm.destroy(conn);
+ destroyVm(vm, conn);
} catch (final Exception e) {
final String msg = "forceShutdown failed due to " + e.toString();
s_logger.warn(msg, e);
@@ -3690,7 +3691,7 @@ public abstract class CitrixResourceBase extends
ServerResourceBase implements S
}
if (vm.getPowerState(conn) == VmPowerState.HALTED) {
try {
- vm.destroy(conn);
+ destroyVm(vm, conn, true);
} catch (final Exception e) {
s_logger.warn("VM destroy failed due to ", e);
}
@@ -5208,7 +5209,7 @@ public abstract class CitrixResourceBase extends
ServerResourceBase implements S
}
if (vm.getPowerState(conn) == VmPowerState.HALTED) {
try {
- vm.destroy(conn);
+ destroyVm(vm, conn, true);
} catch (final Exception e) {
final String msg = "VM destroy failed due to " +
e.toString();
s_logger.warn(msg, e);
@@ -5875,4 +5876,23 @@ public abstract class CitrixResourceBase extends
ServerResourceBase implements S
s_logger.warn(errMsg);
}
}
+
+ public boolean isDestroyHaltedVms() {
+ ComparableVersion version = new
ComparableVersion(getHost().getProductVersion());
+ if (version.compareTo(new ComparableVersion("8.0")) >= 0) {
+ return false;
+ }
+ return true;
+ }
+
+ public void destroyVm(VM vm, Connection connection, boolean forced) throws
XenAPIException, XmlRpcException {
+ if (!isDestroyHaltedVms() && !forced) {
+ return;
+ }
+ vm.destroy(connection);
+ }
+
+ public void destroyVm(VM vm, Connection connection) throws
XenAPIException, XmlRpcException {
+ destroyVm(vm, connection, false);
+ }
}
diff --git
a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xen56/XenServer56FenceCommandWrapper.java
b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xen56/XenServer56FenceCommandWrapper.java
index 3cebbd9a342..713807ffaee 100644
---
a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xen56/XenServer56FenceCommandWrapper.java
+++
b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xen56/XenServer56FenceCommandWrapper.java
@@ -56,7 +56,7 @@ public final class XenServer56FenceCommandWrapper extends
CommandWrapper<FenceCo
for (final VM vm : vms) {
s_logger.info("Fence command for VM " + command.getVmName());
vm.powerStateReset(conn);
- vm.destroy(conn);
+ xenServer56.destroyVm(vm, conn);
}
return new FenceAnswer(command);
} catch (final XmlRpcException e) {
diff --git
a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xen56p1/XenServer56FP1FenceCommandWrapper.java
b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xen56p1/XenServer56FP1FenceCommandWrapper.java
index bc7a4434bd0..dda87101de7 100644
---
a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xen56p1/XenServer56FP1FenceCommandWrapper.java
+++
b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xen56p1/XenServer56FP1FenceCommandWrapper.java
@@ -68,7 +68,7 @@ public final class XenServer56FP1FenceCommandWrapper extends
CommandWrapper<Fenc
}
s_logger.info("Fence command for VM " + command.getVmName());
vm.powerStateReset(conn);
- vm.destroy(conn);
+ xenServer56.destroyVm(vm, conn);
for (final VDI vdi : vdis) {
final Map<String, String> smConfig = vdi.getSmConfig(conn);
for (final String key : smConfig.keySet()) {
diff --git
a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixCreateVMSnapshotCommandWrapper.java
b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixCreateVMSnapshotCommandWrapper.java
index 68c295717c3..47c08b0cebe 100644
---
a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixCreateVMSnapshotCommandWrapper.java
+++
b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixCreateVMSnapshotCommandWrapper.java
@@ -100,6 +100,7 @@ public final class CitrixCreateVMSnapshotCommandWrapper
extends CommandWrapper<C
vm = citrixResourceBase.getVM(conn, vmName);
vmState = vm.getPowerState(conn);
} catch (final Exception e) {
+ s_logger.debug(String.format("Failed to find VM with name:
%s due to:", vmName), e);
if (!snapshotMemory) {
vm = citrixResourceBase.createWorkingVM(conn, vmName,
guestOSType, platformEmulator, listVolumeTo);
}
@@ -178,13 +179,11 @@ public final class CitrixCreateVMSnapshotCommandWrapper
extends CommandWrapper<C
vdi.destroy(conn);
}
}
- vmSnapshot.destroy(conn);
+ citrixResourceBase.destroyVm(vmSnapshot, conn, true);
}
}
- if (vmState == VmPowerState.HALTED) {
- if (vm != null) {
- vm.destroy(conn);
- }
+ if (vmState == VmPowerState.HALTED && vm != null) {
+ citrixResourceBase.destroyVm(vm, conn);
}
} catch (final Exception e2) {
s_logger.error("delete snapshot error due to " +
e2.getMessage());
diff --git
a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixDeleteVMSnapshotCommandWrapper.java
b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixDeleteVMSnapshotCommandWrapper.java
index b74111e8441..0bcbe13c558 100644
---
a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixDeleteVMSnapshotCommandWrapper.java
+++
b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixDeleteVMSnapshotCommandWrapper.java
@@ -68,7 +68,7 @@ public final class CitrixDeleteVMSnapshotCommandWrapper
extends CommandWrapper<D
if (command.getTarget().getType() ==
VMSnapshot.Type.DiskAndMemory) {
vdiList.add(snapshot.getSuspendVDI(conn));
}
- snapshot.destroy(conn);
+ citrixResourceBase.destroyVm(snapshot, conn, true);
for (final VDI vdi : vdiList) {
vdi.destroy(conn);
}
diff --git
a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixRevertToVMSnapshotCommandWrapper.java
b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixRevertToVMSnapshotCommandWrapper.java
index f8bb1b89242..445e764a38c 100644
---
a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixRevertToVMSnapshotCommandWrapper.java
+++
b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixRevertToVMSnapshotCommandWrapper.java
@@ -68,6 +68,7 @@ public final class CitrixRevertToVMSnapshotCommandWrapper
extends CommandWrapper
try {
vm = citrixResourceBase.getVM(conn, vmName);
} catch (final Exception e) {
+ s_logger.debug(String.format("Failed to find VM with name: %s
due to:", vmName), e);
vm = citrixResourceBase.createWorkingVM(conn, vmName,
command.getGuestOSType(), command.getPlatformEmulator(), listVolumeTo);
}
@@ -90,7 +91,7 @@ public final class CitrixRevertToVMSnapshotCommandWrapper
extends CommandWrapper
}
if (!snapshotMemory) {
- vm.destroy(conn);
+ citrixResourceBase.destroyVm(vm, conn);
vmState = PowerState.PowerOff;
} else {
vmState = PowerState.PowerOn;
diff --git
a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixStartCommandWrapper.java
b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixStartCommandWrapper.java
index ad76b7f4541..5867a151c85 100644
---
a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixStartCommandWrapper.java
+++
b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixStartCommandWrapper.java
@@ -75,7 +75,7 @@ public final class CitrixStartCommandWrapper extends
CommandWrapper<StartCommand
for (final VM v : vms) {
final VM.Record vRec = v.getRecord(conn);
if (vRec.powerState == VmPowerState.HALTED) {
- v.destroy(conn);
+ citrixResourceBase.destroyVm(v, conn, true);
} else if (vRec.powerState == VmPowerState.RUNNING) {
final String host = vRec.residentOn.getUuid(conn);
final String msg = "VM " + vmName + " is runing on
host " + host;
diff --git
a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixStopCommandWrapper.java
b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixStopCommandWrapper.java
index 8e7eb4caec2..87c2cb76822 100644
---
a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixStopCommandWrapper.java
+++
b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixStopCommandWrapper.java
@@ -143,7 +143,7 @@ public final class CitrixStopCommandWrapper extends
CommandWrapper<StopCommand,
for (final VIF vif : vifs) {
networks.add(vif.getNetwork(conn));
}
- vm.destroy(conn);
+ citrixResourceBase.destroyVm(vm, conn);
final SR sr =
citrixResourceBase.getISOSRbyVmName(conn, command.getVmName(), false);
citrixResourceBase.removeSR(conn, sr);
final SR configDriveSR =
citrixResourceBase.getISOSRbyVmName(conn, command.getVmName(), true);