From 59d0b78b7f33ac4ceaa1751d41fdf9f8c48f0809 Mon Sep 17 00:00:00 2001 From: "zhong.zhou" Date: Thu, 16 Apr 2026 12:01:34 +0800 Subject: [PATCH] [kvm]: create key when attach tpm For existing non-vTPM VMs, attach the key provider and materialize the actual key before preInstantiateVmResource, so libvirt secret cache lookup does not miss keyVersion. Resolves: ZSV-11729 Change-Id: I6e6d6c6c647122226769756b75756c6f72654477 --- .../org/zstack/kvm/tpm/KvmTpmManager.java | 32 ++++++++++++++++--- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/tpm/KvmTpmManager.java b/plugin/kvm/src/main/java/org/zstack/kvm/tpm/KvmTpmManager.java index 6152dff890..74ca49a5f7 100644 --- a/plugin/kvm/src/main/java/org/zstack/kvm/tpm/KvmTpmManager.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/tpm/KvmTpmManager.java @@ -30,6 +30,7 @@ import org.zstack.header.message.APIMessage; import org.zstack.header.message.Message; import org.zstack.header.message.MessageReply; +import org.zstack.header.keyprovider.EncryptedResourceKeyManager; import org.zstack.header.secret.SecretHostDeleteMsg; import org.zstack.header.tpm.api.APIAddTpmEvent; import org.zstack.header.tpm.api.APIAddTpmMsg; @@ -105,6 +106,8 @@ public class KvmTpmManager extends AbstractService { @Autowired private TpmEncryptedResourceKeyBackend tpmKeyBackend; @Autowired + private EncryptedResourceKeyManager resourceKeyManager; + @Autowired private KvmSecureBootExtensions secureBootExtensions; @Override @@ -253,11 +256,32 @@ private void addTpmToVm(AddTpmToVmContext context, Completion completion) { .then(Flow.of("attach-key-provider-to-tpm") .skipIf(data -> VmGlobalConfig.ALLOWED_TPM_VM_WITHOUT_KMS.value(Boolean.class)) .handle(trigger -> { - if (context.keyProviderUuid != null) { - tpmKeyBackend.attachKeyProviderToTpm(context.createdTpmUuid, context.keyProviderUuid); - context.keyProviderAttached = true; + if (context.keyProviderUuid == null) { + trigger.fail(operr("keyProviderUuid is required when adding TPM to VM[uuid:%s]", + context.vmInstanceUuid)); + return; } - trigger.next(); + + tpmKeyBackend.attachKeyProviderToTpm(context.createdTpmUuid, context.keyProviderUuid); + context.keyProviderAttached = true; + + EncryptedResourceKeyManager.GetOrCreateResourceKeyContext keyCtx = + new EncryptedResourceKeyManager.GetOrCreateResourceKeyContext(); + keyCtx.setResourceUuid(context.createdTpmUuid); + keyCtx.setResourceType(TpmVO.class.getSimpleName()); + keyCtx.setKeyProviderUuid(context.keyProviderUuid); + keyCtx.setPurpose("vtpm"); + resourceKeyManager.getOrCreateKey(keyCtx, new ReturnValueCompletion(trigger) { + @Override + public void success(EncryptedResourceKeyManager.ResourceKeyResult returnValue) { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); }) .rollback(trigger -> { if (context.keyProviderAttached && context.createdTpmUuid != null) {