Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions conf/springConfigXml/Kvm.xml
Original file line number Diff line number Diff line change
Expand Up @@ -288,6 +288,7 @@
<zstack:extension interface="org.zstack.header.storage.snapshot.VolumeSnapshotCreationExtensionPoint" />
<zstack:extension interface="org.zstack.header.vm.BeforeHaStartVmInstanceExtensionPoint" />
<zstack:extension interface="org.zstack.header.vm.ConvertVmInstanceToTemplatedVmExtensionPoint" />
<zstack:extension interface="org.zstack.kvm.KVMStopVmExtensionPoint" />
</zstack:plugin>
</bean>

Expand Down
9 changes: 9 additions & 0 deletions plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java
Original file line number Diff line number Diff line change
Expand Up @@ -3421,6 +3421,7 @@ public static class StopVmCmd extends AgentCommand {
private long timeout;
private boolean forceStopIfNoOperatingSystemDetected;
private List<VmNicInventory> vmNics;
private List<VmHostFileBackupJob> tpmBackupJobs;

public String getUuid() {
return uuid;
Expand Down Expand Up @@ -3461,6 +3462,14 @@ public List<VmNicInventory> getVmNics() {
public void setVmNics(List<VmNicInventory> vmNics) {
this.vmNics = vmNics;
}

public List<VmHostFileBackupJob> getTpmBackupJobs() {
return tpmBackupJobs;
}

public void setTpmBackupJobs(List<VmHostFileBackupJob> tpmBackupJobs) {
this.tpmBackupJobs = tpmBackupJobs;
}
}

public static class StopVmResponse extends AgentResponse {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
import org.zstack.header.vm.additions.VmHostBackupFileVO_;
import org.zstack.header.vm.additions.VmHostFileContentVO;
import org.zstack.header.vm.additions.VmHostFileContentVO_;
import org.zstack.header.vm.additions.VmHostFileBackupJob;
import org.zstack.header.vm.additions.VmHostFileOperation;
import org.zstack.header.vm.additions.VmHostFileType;
import org.zstack.header.vm.additions.VmHostFileVO;
Expand All @@ -57,9 +58,11 @@
import org.zstack.header.volume.VolumeInventory;
import org.zstack.kvm.KVMAgentCommands;
import org.zstack.kvm.KVMAgentCommands.*;
import org.zstack.kvm.KVMException;
import org.zstack.kvm.KVMGlobalConfig;
import org.zstack.kvm.KVMHostInventory;
import org.zstack.kvm.KVMStartVmExtensionPoint;
import org.zstack.kvm.KVMStopVmExtensionPoint;
import org.zstack.kvm.KvmCommandSender;
import org.zstack.kvm.KvmResponseWrapper;
import org.zstack.kvm.VolumeTO;
Expand Down Expand Up @@ -93,7 +96,8 @@ public class KvmSecureBootExtensions implements KVMStartVmExtensionPoint,
VmInstanceMigrateExtensionPoint,
VolumeSnapshotCreationExtensionPoint,
BeforeHaStartVmInstanceExtensionPoint,
ConvertVmInstanceToTemplatedVmExtensionPoint {
ConvertVmInstanceToTemplatedVmExtensionPoint,
KVMStopVmExtensionPoint {
private static final CLogger logger = Utils.getLogger(KvmSecureBootExtensions.class);

@Autowired
Expand Down Expand Up @@ -611,6 +615,39 @@ public void afterReimageVmInstance(VolumeInventory inventory) {
"deleted all VmHostFileVO and VmHostBackupFileVO records", vmUuid));
}

@Override
public void beforeStopVmOnKvm(KVMHostInventory host, VmInstanceInventory vm,
KVMAgentCommands.StopVmCmd cmd) throws KVMException {
String vmUuid = vm.getUuid();
String hostUuid = host.getUuid();

VmHostFileVO tpmFile = Q.New(VmHostFileVO.class)
.eq(VmHostFileVO_.vmInstanceUuid, vmUuid)
.eq(VmHostFileVO_.hostUuid, hostUuid)
.eq(VmHostFileVO_.type, VmHostFileType.TpmState)
.find();
if (tpmFile == null) {
return;
}

VmHostFileBackupJob job = new VmHostFileBackupJob();
job.setSrcPath(tpmFile.getPath());
job.setDestPath(buildTpmStateSnapshotBackupFilePath(vmUuid));
job.setType(VmHostFileType.TpmState.toString());
cmd.setTpmBackupJobs(Collections.singletonList(job));

logger.debug(String.format("set TPM backup jobs on StopVmCmd for VM[uuid:%s]: %s -> %s",
vmUuid, job.getSrcPath(), job.getDestPath()));
}

@Override
public void stopVmOnKvmSuccess(KVMHostInventory host, VmInstanceInventory vm) {
}

@Override
public void stopVmOnKvmFailed(KVMHostInventory host, VmInstanceInventory vm, ErrorCode err) {
}

@Override
public void releaseVmResource(VmInstanceSpec spec, Completion completion) {
if (spec.getDestHost() == null) {
Expand Down Expand Up @@ -640,6 +677,7 @@ public void releaseVmResource(VmInstanceSpec spec, Completion completion) {
syncMsg.setNvRamPath(file.getPath());
} else if (file.getType() == VmHostFileType.TpmState) {
syncMsg.setTpmStateFolder(file.getPath());
syncMsg.setTpmStateFallbackFolder(buildTpmStateSnapshotBackupFilePath(vmUuid));
} else {
logger.warn(String.format("unsupported vm host file type: %s, skip syncing for VM[uuid:%s] from host[uuid:%s]",
file.getType(), vmUuid, hostUuid));
Expand Down Expand Up @@ -699,6 +737,7 @@ public void beforeHaStartVmInstance(String vmUuid, String judgerClassName, List<
syncMsg.setNvRamPath(file.getPath());
} else if (file.getType() == VmHostFileType.TpmState) {
syncMsg.setTpmStateFolder(file.getPath());
syncMsg.setTpmStateFallbackFolder(buildTpmStateSnapshotBackupFilePath(vmUuid));
} else {
logger.warn(String.format(
"unsupported vm host file type: %s, skip syncing for VM[uuid:%s] from host[uuid:%s]",
Expand Down
Loading