Skip to content

Commit 5d5ac17

Browse files
authored
xenserver: do not destroy halted hypervisor vm (#9175)
Signed-off-by: Abhishek Kumar <[email protected]>
1 parent e08f88f commit 5d5ac17

8 files changed

+40
-20
lines changed

Diff for: plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java

+29-9
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,6 @@
5151
import javax.naming.ConfigurationException;
5252
import javax.xml.parsers.ParserConfigurationException;
5353

54-
import com.trilead.ssh2.SFTPException;
55-
import com.trilead.ssh2.SFTPv3Client;
56-
import com.trilead.ssh2.SFTPv3DirectoryEntry;
57-
import com.trilead.ssh2.SFTPv3FileAttributes;
5854
import org.apache.cloudstack.api.ApiConstants;
5955
import org.apache.cloudstack.diagnostics.CopyToSecondaryStorageAnswer;
6056
import org.apache.cloudstack.diagnostics.CopyToSecondaryStorageCommand;
@@ -72,6 +68,7 @@
7268
import org.apache.commons.lang3.BooleanUtils;
7369
import org.apache.commons.lang3.StringUtils;
7470
import org.apache.log4j.Logger;
71+
import org.apache.maven.artifact.versioning.ComparableVersion;
7572
import org.apache.xmlrpc.XmlRpcException;
7673
import org.joda.time.Duration;
7774
import org.w3c.dom.Document;
@@ -153,6 +150,10 @@
153150
import com.cloud.vm.VirtualMachine.PowerState;
154151
import com.cloud.vm.VmDetailConstants;
155152
import com.trilead.ssh2.SCPClient;
153+
import com.trilead.ssh2.SFTPException;
154+
import com.trilead.ssh2.SFTPv3Client;
155+
import com.trilead.ssh2.SFTPv3DirectoryEntry;
156+
import com.trilead.ssh2.SFTPv3FileAttributes;
156157
import com.xensource.xenapi.Bond;
157158
import com.xensource.xenapi.Connection;
158159
import com.xensource.xenapi.Console;
@@ -627,7 +628,7 @@ public boolean cleanupHaltedVms(final Connection conn) throws XenAPIException, X
627628

628629
if (VmPowerState.HALTED.equals(vmRec.powerState) && vmRec.affinity.equals(host) && !isAlienVm(vm, conn)) {
629630
try {
630-
vm.destroy(conn);
631+
destroyVm(vm, conn);
631632
} catch (final Exception e) {
632633
s_logger.warn("Catch Exception " + e.getClass().getName() + ": unable to destroy VM " + vmRec.nameLabel + " due to ", e);
633634
success = false;
@@ -1452,7 +1453,7 @@ public VM createVmFromTemplate(final Connection conn, final VirtualMachineTO vmS
14521453
vm.setPVBootloader(conn, "pygrub");
14531454
vm.setPVBootloaderArgs(conn, CitrixHelper.getPVbootloaderArgs(guestOsTypeName));
14541455
} else {
1455-
vm.destroy(conn);
1456+
destroyVm(vm, conn, true);
14561457
throw new CloudRuntimeException("Unable to handle boot loader type: " + vmSpec.getBootloader());
14571458
}
14581459
}
@@ -2038,7 +2039,7 @@ void forceShutdownVM(final Connection conn, final VM vm) {
20382039
final Long domId = vm.getDomid(conn);
20392040
callHostPlugin(conn, "vmopspremium", "forceShutdownVM", "domId", domId.toString());
20402041
vm.powerStateReset(conn);
2041-
vm.destroy(conn);
2042+
destroyVm(vm, conn);
20422043
} catch (final Exception e) {
20432044
final String msg = "forceShutdown failed due to " + e.toString();
20442045
s_logger.warn(msg, e);
@@ -3690,7 +3691,7 @@ public String handleVmStartFailure(final Connection conn, final String vmName, f
36903691
}
36913692
if (vm.getPowerState(conn) == VmPowerState.HALTED) {
36923693
try {
3693-
vm.destroy(conn);
3694+
destroyVm(vm, conn, true);
36943695
} catch (final Exception e) {
36953696
s_logger.warn("VM destroy failed due to ", e);
36963697
}
@@ -5208,7 +5209,7 @@ protected void startvmfailhandle(final Connection conn, final VM vm, final List<
52085209
}
52095210
if (vm.getPowerState(conn) == VmPowerState.HALTED) {
52105211
try {
5211-
vm.destroy(conn);
5212+
destroyVm(vm, conn, true);
52125213
} catch (final Exception e) {
52135214
final String msg = "VM destroy failed due to " + e.toString();
52145215
s_logger.warn(msg, e);
@@ -5875,4 +5876,23 @@ private void umountNfs(Connection conn, String remoteDir, String localDir) {
58755876
s_logger.warn(errMsg);
58765877
}
58775878
}
5879+
5880+
public boolean isDestroyHaltedVms() {
5881+
ComparableVersion version = new ComparableVersion(getHost().getProductVersion());
5882+
if (version.compareTo(new ComparableVersion("8.0")) >= 0) {
5883+
return false;
5884+
}
5885+
return true;
5886+
}
5887+
5888+
public void destroyVm(VM vm, Connection connection, boolean forced) throws XenAPIException, XmlRpcException {
5889+
if (!isDestroyHaltedVms() && !forced) {
5890+
return;
5891+
}
5892+
vm.destroy(connection);
5893+
}
5894+
5895+
public void destroyVm(VM vm, Connection connection) throws XenAPIException, XmlRpcException {
5896+
destroyVm(vm, connection, false);
5897+
}
58785898
}

Diff for: plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xen56/XenServer56FenceCommandWrapper.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public Answer execute(final FenceCommand command, final XenServer56Resource xenS
5656
for (final VM vm : vms) {
5757
s_logger.info("Fence command for VM " + command.getVmName());
5858
vm.powerStateReset(conn);
59-
vm.destroy(conn);
59+
xenServer56.destroyVm(vm, conn);
6060
}
6161
return new FenceAnswer(command);
6262
} catch (final XmlRpcException e) {

Diff for: plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xen56p1/XenServer56FP1FenceCommandWrapper.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public Answer execute(final FenceCommand command, final XenServer56Resource xenS
6868
}
6969
s_logger.info("Fence command for VM " + command.getVmName());
7070
vm.powerStateReset(conn);
71-
vm.destroy(conn);
71+
xenServer56.destroyVm(vm, conn);
7272
for (final VDI vdi : vdis) {
7373
final Map<String, String> smConfig = vdi.getSmConfig(conn);
7474
for (final String key : smConfig.keySet()) {

Diff for: plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixCreateVMSnapshotCommandWrapper.java

+4-5
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ public Answer execute(final CreateVMSnapshotCommand command, final CitrixResourc
100100
vm = citrixResourceBase.getVM(conn, vmName);
101101
vmState = vm.getPowerState(conn);
102102
} catch (final Exception e) {
103+
s_logger.debug(String.format("Failed to find VM with name: %s due to:", vmName), e);
103104
if (!snapshotMemory) {
104105
vm = citrixResourceBase.createWorkingVM(conn, vmName, guestOSType, platformEmulator, listVolumeTo);
105106
}
@@ -178,13 +179,11 @@ public Answer execute(final CreateVMSnapshotCommand command, final CitrixResourc
178179
vdi.destroy(conn);
179180
}
180181
}
181-
vmSnapshot.destroy(conn);
182+
citrixResourceBase.destroyVm(vmSnapshot, conn, true);
182183
}
183184
}
184-
if (vmState == VmPowerState.HALTED) {
185-
if (vm != null) {
186-
vm.destroy(conn);
187-
}
185+
if (vmState == VmPowerState.HALTED && vm != null) {
186+
citrixResourceBase.destroyVm(vm, conn);
188187
}
189188
} catch (final Exception e2) {
190189
s_logger.error("delete snapshot error due to " + e2.getMessage());

Diff for: plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixDeleteVMSnapshotCommandWrapper.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public Answer execute(final DeleteVMSnapshotCommand command, final CitrixResourc
6868
if (command.getTarget().getType() == VMSnapshot.Type.DiskAndMemory) {
6969
vdiList.add(snapshot.getSuspendVDI(conn));
7070
}
71-
snapshot.destroy(conn);
71+
citrixResourceBase.destroyVm(snapshot, conn, true);
7272
for (final VDI vdi : vdiList) {
7373
vdi.destroy(conn);
7474
}

Diff for: plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixRevertToVMSnapshotCommandWrapper.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ public Answer execute(final RevertToVMSnapshotCommand command, final CitrixResou
6868
try {
6969
vm = citrixResourceBase.getVM(conn, vmName);
7070
} catch (final Exception e) {
71+
s_logger.debug(String.format("Failed to find VM with name: %s due to:", vmName), e);
7172
vm = citrixResourceBase.createWorkingVM(conn, vmName, command.getGuestOSType(), command.getPlatformEmulator(), listVolumeTo);
7273
}
7374

@@ -90,7 +91,7 @@ public Answer execute(final RevertToVMSnapshotCommand command, final CitrixResou
9091
}
9192

9293
if (!snapshotMemory) {
93-
vm.destroy(conn);
94+
citrixResourceBase.destroyVm(vm, conn);
9495
vmState = PowerState.PowerOff;
9596
} else {
9697
vmState = PowerState.PowerOn;

Diff for: plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixStartCommandWrapper.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ public Answer execute(final StartCommand command, final CitrixResourceBase citri
7575
for (final VM v : vms) {
7676
final VM.Record vRec = v.getRecord(conn);
7777
if (vRec.powerState == VmPowerState.HALTED) {
78-
v.destroy(conn);
78+
citrixResourceBase.destroyVm(v, conn, true);
7979
} else if (vRec.powerState == VmPowerState.RUNNING) {
8080
final String host = vRec.residentOn.getUuid(conn);
8181
final String msg = "VM " + vmName + " is runing on host " + host;

Diff for: plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixStopCommandWrapper.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ public Answer execute(final StopCommand command, final CitrixResourceBase citrix
143143
for (final VIF vif : vifs) {
144144
networks.add(vif.getNetwork(conn));
145145
}
146-
vm.destroy(conn);
146+
citrixResourceBase.destroyVm(vm, conn);
147147
final SR sr = citrixResourceBase.getISOSRbyVmName(conn, command.getVmName(), false);
148148
citrixResourceBase.removeSR(conn, sr);
149149
final SR configDriveSR = citrixResourceBase.getISOSRbyVmName(conn, command.getVmName(), true);

0 commit comments

Comments
 (0)