Skip to content

Commit 4ab7d1b

Browse files
author
gitlab
committed
Merge branch 'zsv-ldap@@2' into 'feature-zsv-5.0.0-vm-support-vtpm-and-secuceboot'
<fix>[kvm]: prepare nvram folder before migrate VM See merge request zstackio/zstack!9396
2 parents 1a4f0d2 + 3d09ff8 commit 4ab7d1b

4 files changed

Lines changed: 73 additions & 1 deletion

File tree

conf/springConfigXml/Kvm.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,7 @@
271271
<zstack:extension interface="org.zstack.kvm.KVMStartVmExtensionPoint" />
272272
<zstack:extension interface="org.zstack.header.vm.PreVmInstantiateResourceExtensionPoint" />
273273
<zstack:extension interface="org.zstack.header.vm.VmInstanceDestroyExtensionPoint" />
274+
<zstack:extension interface="org.zstack.header.vm.VmPreMigrationExtensionPoint" />
274275
</zstack:plugin>
275276
</bean>
276277
</beans>

plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2824,6 +2824,8 @@ public static class StartVmResponse extends VmDevicesInfoResponse {
28242824
}
28252825

28262826
public static class VmHostFileTO {
2827+
public static final String FORMAT_PREPARE_ONLY = "PrepareOnly";
2828+
28272829
private String path;
28282830
/**
28292831
* maybe "NvRam" or "TpmState" ...
@@ -2832,9 +2834,13 @@ public static class VmHostFileTO {
28322834
private String type;
28332835
/**
28342836
* maybe "Simple" or "TarballGzip"
2837+
* if prepare only, use {@link #FORMAT_PREPARE_ONLY}
28352838
* @see VmHostFileContentFormat
28362839
*/
28372840
private String fileFormat;
2841+
/**
2842+
* null if fileFormat is {@link #FORMAT_PREPARE_ONLY}
2843+
*/
28382844
@NoLogging
28392845
private String contentBase64;
28402846
private String error;

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

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import org.springframework.beans.factory.annotation.Autowired;
44
import org.zstack.compute.legacy.ComputeLegacyGlobalProperty;
55
import org.zstack.compute.vm.VmGlobalConfig;
6+
import org.zstack.compute.vm.VmSystemTags;
67
import org.zstack.compute.vm.devices.VmTpmManager;
78
import org.zstack.core.Platform;
89
import org.zstack.core.cloudbus.CloudBus;
@@ -24,12 +25,16 @@
2425
import org.zstack.header.identity.AccountResourceRefVO;
2526
import org.zstack.header.identity.AccountResourceRefVO_;
2627
import org.zstack.header.message.MessageReply;
28+
import org.zstack.header.tpm.entity.TpmVO;
29+
import org.zstack.header.tpm.entity.TpmVO_;
2730
import org.zstack.header.vm.DiskAO;
2831
import org.zstack.header.vm.PreVmInstantiateResourceExtensionPoint;
2932
import org.zstack.header.vm.VmInstanceDestroyExtensionPoint;
3033
import org.zstack.header.vm.VmInstanceInventory;
3134
import org.zstack.header.vm.VmInstanceSpec;
3235
import org.zstack.header.vm.VmInstantiateResourceException;
36+
import org.zstack.header.vm.VmMigrationType;
37+
import org.zstack.header.vm.VmPreMigrationExtensionPoint;
3338
import org.zstack.header.vm.additions.VmHostBackupFileVO;
3439
import org.zstack.header.vm.additions.VmHostBackupFileVO_;
3540
import org.zstack.header.vm.additions.VmHostFileContentFormat;
@@ -72,14 +77,18 @@
7277
import java.util.Map;
7378
import java.util.Objects;
7479

80+
import static org.zstack.compute.vm.VmGlobalConfig.ENABLE_UEFI_SECURE_BOOT;
7581
import static org.zstack.core.Platform.operr;
82+
import static org.zstack.header.vm.VmMigrationType.HostMigration;
7683
import static org.zstack.kvm.KVMConstant.*;
84+
import static org.zstack.utils.CollectionDSL.list;
7785
import static org.zstack.utils.CollectionUtils.findOneOrNull;
7886
import static org.zstack.utils.CollectionUtils.transform;
7987

8088
public class KvmSecureBootExtensions implements KVMStartVmExtensionPoint,
8189
PreVmInstantiateResourceExtensionPoint,
82-
VmInstanceDestroyExtensionPoint {
90+
VmInstanceDestroyExtensionPoint,
91+
VmPreMigrationExtensionPoint {
8392
private static final CLogger logger = Utils.getLogger(KvmSecureBootExtensions.class);
8493

8594
@Autowired
@@ -160,6 +169,61 @@ private void prepareNvRamToStartVmCmd(KVMAgentCommands.StartVmCmd cmd, DiskAO nv
160169
}
161170
}
162171

172+
@Override
173+
public void preVmMigration(VmInstanceInventory vm, VmMigrationType type, String dstHostUuid, Completion completion) {
174+
if (HostMigration != type) {
175+
completion.success();
176+
return;
177+
}
178+
179+
String tpmUuid = Q.New(TpmVO.class)
180+
.eq(TpmVO_.vmInstanceUuid, vm.getUuid())
181+
.select(TpmVO_.uuid)
182+
.findValue();
183+
boolean needRegisterNvRam = tpmUuid != null;
184+
if (!needRegisterNvRam) {
185+
String bootMode = VmSystemTags.BOOT_MODE.getTokenByResourceUuid(vm.getUuid(), VmSystemTags.BOOT_MODE_TOKEN);
186+
if (isUefiBootMode(bootMode)) {
187+
ResourceConfig resourceConfig = resourceConfigFacade.getResourceConfig(ENABLE_UEFI_SECURE_BOOT.getIdentity());
188+
needRegisterNvRam = resourceConfig.getResourceConfigValue(vm.getUuid(), Boolean.class) == Boolean.TRUE;
189+
}
190+
191+
if (!needRegisterNvRam) {
192+
completion.success();
193+
return;
194+
}
195+
}
196+
197+
SimpleFlowChain.of("prepare-nvram-before-vm-" + vm.getUuid() + "-migrate")
198+
.then("prepare-nvram-folder-on-dest-host", trigger -> {
199+
VmHostFileTO to = new VmHostFileTO();
200+
to.setPath(buildNvramFilePath(vm.getUuid()));
201+
to.setType(VmHostFileType.NvRam.toString());
202+
to.setFileFormat(VmHostFileTO.FORMAT_PREPARE_ONLY);
203+
204+
RewriteVmHostFilesContext context = new RewriteVmHostFilesContext();
205+
context.hostUuid = dstHostUuid;
206+
context.hostFiles = list(to);
207+
208+
rewriteVmHostFiles(context, new Completion(trigger) {
209+
@Override
210+
public void success() {
211+
trigger.next();
212+
}
213+
214+
@Override
215+
public void fail(ErrorCode errorCode) {
216+
trigger.fail(errorCode);
217+
}
218+
});
219+
})
220+
// TpmState folder is not needed to prepare
221+
.propagateExceptionTo(completion)
222+
.done(completion::success)
223+
.error(completion::fail)
224+
.start();
225+
}
226+
163227
public static class SyncVmHostFilesFromHostContext {
164228
public String hostUuid;
165229
public String vmUuid;

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,7 @@
270270
<zstack:extension interface="org.zstack.kvm.KVMStartVmExtensionPoint" />
271271
<zstack:extension interface="org.zstack.header.vm.PreVmInstantiateResourceExtensionPoint" />
272272
<zstack:extension interface="org.zstack.header.vm.VmInstanceDestroyExtensionPoint" />
273+
<zstack:extension interface="org.zstack.header.vm.VmPreMigrationExtensionPoint" />
273274
</zstack:plugin>
274275
</bean>
275276
</beans>

0 commit comments

Comments
 (0)