44import org .springframework .beans .factory .annotation .Autowired ;
55import org .springframework .beans .factory .annotation .Configurable ;
66import org .zstack .compute .vm .VmGlobalConfig ;
7+ import org .zstack .compute .vm .devices .TpmEncryptedResourceKeyBackend ;
78import org .zstack .core .db .Q ;
89import org .zstack .header .storage .snapshot .group .VolumeSnapshotGroupVO ;
910import org .zstack .header .storage .snapshot .group .VolumeSnapshotGroupVO_ ;
1516import org .zstack .header .vm .additions .VmHostFileType ;
1617import org .zstack .header .vm .devices .NvRamSpec ;
1718import org .zstack .header .vm .devices .VmDevicesSpec ;
19+ import org .zstack .kvm .KVMSystemTags ;
1820import org .zstack .resourceconfig .ResourceConfigFacade ;
1921import org .zstack .utils .Utils ;
2022import org .zstack .utils .logging .CLogger ;
@@ -26,7 +28,9 @@ public class SnapshotGroupRevertTpmHelper {
2628 private static final CLogger logger = Utils .getLogger (SnapshotGroupRevertTpmHelper .class );
2729
2830 @ Autowired
29- ResourceConfigFacade resourceConfigFacade ;
31+ private ResourceConfigFacade resourceConfigFacade ;
32+ @ Autowired
33+ private TpmEncryptedResourceKeyBackend tpmKeyBackend ;
3034
3135 public void setupFromApi (APICreateVmInstanceFromVolumeSnapshotGroupMsg apiMsg , CreateVmInstanceMsg cmsg ) {
3236 String snapshotGroupUuid = apiMsg .getVolumeSnapshotGroupUuid ();
@@ -87,17 +91,31 @@ public void setupFromApi(APICreateVmInstanceFromVolumeSnapshotGroupMsg apiMsg, C
8791 tpmSpec .setEnable (true );
8892
8993 if (resetTpm ) {
90- // resetTpm=true: reset secretUuid, generate a new one during VM creation
94+ // resetTpm=true: reset generate a new one during VM creation
9195 logger .debug (String .format ("resetTpm is true for volume snapshot group[uuid:%s], " +
92- "will reset secretUuid, tpmBackupFileUuid:%s" , snapshotGroupUuid , tpmBackupFile .getUuid ()));
96+ "will reset tpmBackupFileUuid:%s" , snapshotGroupUuid , tpmBackupFile .getUuid ()));
9397 } else {
9498 tpmSpec .setBackupFileUuid (tpmBackupFile .getUuid ());
95- // resetTpm=false: should reuse secretUuid + keyProviderUuid recorded in VolumeSnapshotGroup,
96- // but the recording step is not yet implemented, leave them empty for now
97- // TODO: retrieve secretUuid and keyProviderUuid from VolumeSnapshotGroup and set them here
98- logger .warn (String .format ("resetTpm is false for volume snapshot group[uuid:%s], " +
99- "should restore secretUuid and keyProviderUuid but they are not yet recorded in snapshot group, " +
100- "leaving empty. tpmBackupFileUuid:%s" , snapshotGroupUuid , tpmBackupFile .getUuid ()));
99+ }
100+
101+ String keyProviderName = KVMSystemTags .TPM_KEY_PROVIDER_NAME
102+ .getTokenByResourceUuid (tpmBackupFile .getUuid (), KVMSystemTags .TPM_KEY_PROVIDER_NAME_TOKEN );
103+ if (keyProviderName == null ) {
104+ logger .warn (String .format (
105+ "failed to find keyProvider from snapshotGroup[uuid:%s] by tpmBackupFile[uuid:%s]" ,
106+ snapshotGroupUuid , tpmBackupFile .getUuid ()));
107+ if (tpmSpec .getKeyProviderUuid () == null ) {
108+ tpmSpec .setKeyProviderUuid (tpmKeyBackend .defaultKeyProviderUuid ()); // maybe null
109+ }
110+ } else {
111+ String keyProviderUuid = tpmKeyBackend .findKeyProviderUuidByName (keyProviderName );
112+ if (keyProviderUuid == null ) {
113+ logger .warn (String .format (
114+ "failed to resolve keyProvider[name:%s] from snapshotGroup[uuid:%s] by tpmBackupFile[uuid:%s], keep keyProviderUuid unset" ,
115+ keyProviderName , snapshotGroupUuid , tpmBackupFile .getUuid ()));
116+ } else {
117+ tpmSpec .setKeyProviderUuid (keyProviderUuid );
118+ }
101119 }
102120 }
103121
0 commit comments