Skip to content

Commit 41df743

Browse files
author
gitlab
committed
Merge branch 'zsv-ldap-7' into 'feature-zsv-5.0.0-vm-support-vtpm-and-secuceboot'
<feature>[kvm]: sync VM host files after migration See merge request zstackio/zstack!9454
2 parents 8841411 + 339a604 commit 41df743

3 files changed

Lines changed: 70 additions & 1 deletion

File tree

conf/springConfigXml/Kvm.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,7 @@
274274
<zstack:extension interface="org.zstack.header.vm.VmPreMigrationExtensionPoint" />
275275
<zstack:extension interface="org.zstack.header.vm.AfterReimageVmInstanceExtensionPoint" />
276276
<zstack:extension interface="org.zstack.header.vm.VmReleaseResourceExtensionPoint" />
277+
<zstack:extension interface="org.zstack.header.vm.VmInstanceMigrateExtensionPoint" />
277278
</zstack:plugin>
278279
</bean>
279280
</beans>

plugin/kvm/src/main/java/org/zstack/kvm/efi/KvmSecureBootExtensions.java

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.zstack.core.db.SQL;
1414
import org.zstack.core.workflow.SimpleFlowChain;
1515
import org.zstack.header.core.Completion;
16+
import org.zstack.header.core.NoErrorCompletion;
1617
import org.zstack.header.core.ReturnValueCompletion;
1718
import org.zstack.header.core.workflow.Flow;
1819
import org.zstack.header.core.workflow.FlowDoneHandler;
@@ -33,6 +34,7 @@
3334
import org.zstack.header.vm.AfterReimageVmInstanceExtensionPoint;
3435
import org.zstack.header.vm.VmInstanceDestroyExtensionPoint;
3536
import org.zstack.header.vm.VmInstanceInventory;
37+
import org.zstack.header.vm.VmInstanceMigrateExtensionPoint;
3638
import org.zstack.header.vm.VmInstanceSpec;
3739
import org.zstack.header.vm.VmInstantiateResourceException;
3840
import org.zstack.header.vm.VmMigrationType;
@@ -90,7 +92,8 @@ public class KvmSecureBootExtensions implements KVMStartVmExtensionPoint,
9092
VmInstanceDestroyExtensionPoint,
9193
VmPreMigrationExtensionPoint,
9294
AfterReimageVmInstanceExtensionPoint,
93-
VmReleaseResourceExtensionPoint {
95+
VmReleaseResourceExtensionPoint,
96+
VmInstanceMigrateExtensionPoint {
9497
private static final CLogger logger = Utils.getLogger(KvmSecureBootExtensions.class);
9598

9699
@Autowired
@@ -782,4 +785,68 @@ public void run(MessageReply reply) {
782785
}
783786
});
784787
}
788+
789+
@Override
790+
public void afterMigrateVm(VmInstanceInventory inv, String srcHostUuid, NoErrorCompletion completion) {
791+
String destHostUuid = inv.getHostUuid();
792+
String vmUuid = inv.getUuid();
793+
794+
List<VmHostFileVO> vmHostFiles = Q.New(VmHostFileVO.class)
795+
.eq(VmHostFileVO_.vmInstanceUuid, vmUuid)
796+
.eq(VmHostFileVO_.hostUuid, srcHostUuid)
797+
.list();
798+
if (vmHostFiles.isEmpty()) {
799+
completion.done();
800+
return;
801+
}
802+
803+
// clean up stale VmHostFileVO/VmHostFileContentVO on dest host
804+
// before sync creates new records
805+
List<VmHostFileVO> staleFiles = Q.New(VmHostFileVO.class)
806+
.eq(VmHostFileVO_.vmInstanceUuid, vmUuid)
807+
.eq(VmHostFileVO_.hostUuid, destHostUuid)
808+
.list();
809+
if (!staleFiles.isEmpty()) {
810+
List<String> staleUuids = staleFiles.stream()
811+
.map(VmHostFileVO::getUuid)
812+
.collect(java.util.stream.Collectors.toList());
813+
SQL.New(VmHostFileContentVO.class)
814+
.in(VmHostFileContentVO_.uuid, staleUuids)
815+
.delete();
816+
SQL.New(VmHostFileVO.class)
817+
.in(VmHostFileVO_.uuid, staleUuids)
818+
.delete();
819+
logger.debug(String.format("cleaned up %d stale VmHostFileVO/Content on dest host[uuid=%s] for VM[uuid=%s]",
820+
staleFiles.size(), destHostUuid, vmUuid));
821+
}
822+
823+
logger.info(String.format("sync VM host file[vmUuid=%s] from dest host[uuid=%s] after migration",
824+
vmUuid, destHostUuid));
825+
SyncVmHostFilesFromHostMsg syncMsg = new SyncVmHostFilesFromHostMsg();
826+
syncMsg.setHostUuid(destHostUuid);
827+
syncMsg.setVmUuid(vmUuid);
828+
829+
for (VmHostFileVO file : vmHostFiles) {
830+
if (file.getType() == VmHostFileType.NvRam) {
831+
syncMsg.setNvRamPath(file.getPath());
832+
} else if (file.getType() == VmHostFileType.TpmState) {
833+
syncMsg.setTpmStateFolder(file.getPath());
834+
} else {
835+
logger.warn(String.format("unsupported vm host file type: %s, skip syncing for VM[uuid:%s]",
836+
file.getType(), vmUuid));
837+
}
838+
}
839+
840+
bus.makeLocalServiceId(syncMsg, VmInstanceConstant.SECURE_BOOT_SERVICE_ID);
841+
bus.send(syncMsg, new CloudBusCallBack(completion) {
842+
@Override
843+
public void run(MessageReply reply) {
844+
if (!reply.isSuccess()) {
845+
logger.warn(String.format("failed to sync VM host file[vmUuid=%s] from host[uuid=%s] after migration, but tolerated: %s",
846+
vmUuid, destHostUuid, reply.getError().getReadableDetails()));
847+
}
848+
completion.done();
849+
}
850+
});
851+
}
785852
}

test/src/test/resources/springConfigXml/Kvm.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,7 @@
273273
<zstack:extension interface="org.zstack.header.vm.VmPreMigrationExtensionPoint" />
274274
<zstack:extension interface="org.zstack.header.vm.AfterReimageVmInstanceExtensionPoint" />
275275
<zstack:extension interface="org.zstack.header.vm.VmReleaseResourceExtensionPoint" />
276+
<zstack:extension interface="org.zstack.header.vm.VmInstanceMigrateExtensionPoint" />
276277
</zstack:plugin>
277278
</bean>
278279
</beans>

0 commit comments

Comments
 (0)