Skip to content

Commit d3af48a

Browse files
author
Zhang Wenhao
committed
<refactor>[vm]: move nvram to devices spec and add backup support
Move nvRamSpec from VmInstanceSpec to VmDevicesSpec for better device management consistency with TPM. Add needRegister flag to NvRamSpec for explicit registration control. Remove unused NV_RAM_DEFAULT_SIZE constant. Update VmTpmExtensions and KvmSecureBootExtensions to use new NvRamSpec structure. Add backupFileUuid support for TPM and NvRam resource synchronization. Related: ZSV-11310 Resolves: ZSV-11653 Change-Id: I6c7177767470757575746b77696477756d716f6e
1 parent 09131e7 commit d3af48a

6 files changed

Lines changed: 37 additions & 30 deletions

File tree

compute/src/main/java/org/zstack/compute/vm/devices/VmTpmExtensions.java

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,18 @@
99
import org.zstack.header.tpm.entity.TpmVO;
1010
import org.zstack.header.tpm.entity.TpmVO_;
1111
import org.zstack.header.vm.CreateVmInstanceMsg;
12-
import org.zstack.header.vm.DiskAO;
1312
import org.zstack.header.vm.VmInstanceCreateExtensionPoint;
1413
import org.zstack.header.vm.VmInstanceSpec;
1514
import org.zstack.header.vm.VmInstanceVO;
1615
import org.zstack.header.vm.VmMachineType;
16+
import org.zstack.header.vm.devices.NvRamSpec;
1717
import org.zstack.header.vm.devices.VmDevicesSpec;
1818
import org.zstack.resourceconfig.ResourceConfig;
1919
import org.zstack.resourceconfig.ResourceConfigFacade;
2020
import org.zstack.utils.Utils;
2121
import org.zstack.utils.logging.CLogger;
2222

2323
import static org.zstack.compute.vm.VmGlobalConfig.ENABLE_UEFI_SECURE_BOOT;
24-
import static org.zstack.header.vm.VmInstanceConstant.NV_RAM_DEFAULT_SIZE;
2524

2625
public class VmTpmExtensions implements VmInstanceCreateExtensionPoint,
2726
BuildVmSpecExtensionPoint {
@@ -97,20 +96,23 @@ public void afterBuildVmSpec(VmInstanceSpec spec) {
9796
}
9897
}
9998

100-
if (needRegisterNvRam) {
101-
DiskAO nvRamSpec = new DiskAO();
102-
nvRamSpec.setSize(NV_RAM_DEFAULT_SIZE);
103-
nvRamSpec.setName("NvRam-of-VM-" + vmUuid);
104-
spec.setNvRamSpec(nvRamSpec);
99+
VmDevicesSpec devicesSpec = spec.getDevicesSpec();
100+
if (devicesSpec == null) {
101+
devicesSpec = new VmDevicesSpec();
102+
spec.setDevicesSpec(devicesSpec);
105103
}
106104

107-
if (tpmUuid != null) {
108-
VmDevicesSpec devicesSpec = spec.getDevicesSpec();
109-
if (devicesSpec == null) {
110-
devicesSpec = new VmDevicesSpec();
111-
spec.setDevicesSpec(devicesSpec);
105+
if (needRegisterNvRam) {
106+
NvRamSpec nvRamSpec = devicesSpec.getNvRam();
107+
if (nvRamSpec == null) {
108+
nvRamSpec = new NvRamSpec();
109+
devicesSpec.setNvRam(nvRamSpec);
112110
}
113111

112+
nvRamSpec.setNeedRegister(true);
113+
}
114+
115+
if (tpmUuid != null) {
114116
TpmSpec tpmSpec = devicesSpec.getTpm();
115117
if (tpmSpec == null) {
116118
tpmSpec = new TpmSpec();

header/src/main/java/org/zstack/header/vm/VmInstanceConstant.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@ public interface VmInstanceConstant {
2727
String SHUTDOWN_DETAIL_BY_GUEST = "by guest";
2828
String SHUTDOWN_DETAIL_FINISHED = "finished";
2929

30-
long NV_RAM_DEFAULT_SIZE = SizeUnit.MEGABYTE.toByte(1);
31-
3230
enum Params {
3331
VmInstanceSpec,
3432
AttachingVolumeInventory,

header/src/main/java/org/zstack/header/vm/VmInstanceSpec.java

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -404,8 +404,7 @@ public void setCandidatePrimaryStorageUuidsForDataVolume(List<String> candidateP
404404
private List<DiskAO> dataDisks;
405405
private List<DiskAO> deprecatedDisksSpecs = new ArrayList<>();
406406
private VmCustomSpecificationStruct vmCustomSpecification;
407-
private VmDevicesSpec devicesSpec;
408-
private DiskAO nvRamSpec;
407+
private VmDevicesSpec devicesSpec = new VmDevicesSpec();
409408
private OperatingSystemBootingSpec osSpec = new OperatingSystemBootingSpec();
410409

411410
public DiskAO getRootDisk() {
@@ -448,14 +447,6 @@ public void setDevicesSpec(VmDevicesSpec devicesSpec) {
448447
this.devicesSpec = devicesSpec;
449448
}
450449

451-
public DiskAO getNvRamSpec() {
452-
return nvRamSpec;
453-
}
454-
455-
public void setNvRamSpec(DiskAO nvRamSpec) {
456-
this.nvRamSpec = nvRamSpec;
457-
}
458-
459450
public OperatingSystemBootingSpec getOsSpec() {
460451
return osSpec;
461452
}

header/src/main/java/org/zstack/header/vm/devices/NvRamSpec.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,18 @@
33
import org.zstack.header.rest.APINoSee;
44

55
public class NvRamSpec {
6+
private boolean needRegister;
67
@APINoSee
78
private String backupFileUuid;
89

10+
public boolean isNeedRegister() {
11+
return needRegister;
12+
}
13+
14+
public void setNeedRegister(boolean needRegister) {
15+
this.needRegister = needRegister;
16+
}
17+
918
public String getBackupFileUuid() {
1019
return backupFileUuid;
1120
}

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

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
import org.zstack.header.storage.snapshot.VolumeSnapshotCreationExtensionPoint;
5454
import org.zstack.header.storage.snapshot.VolumeSnapshotInventory;
5555
import org.zstack.header.storage.snapshot.group.VolumeSnapshotGroupInventory;
56+
import org.zstack.header.vm.devices.NvRamSpec;
5657
import org.zstack.header.volume.VolumeInventory;
5758
import org.zstack.kvm.KVMAgentCommands;
5859
import org.zstack.kvm.KVMAgentCommands.*;
@@ -119,19 +120,21 @@ public void beforeStartVmOnKvm(KVMHostInventory host, VmInstanceSpec spec, KVMAg
119120
}
120121
}
121122

122-
if (spec.getNvRamSpec() != null) {
123-
prepareNvRamToStartVmCmd(cmd, spec.getNvRamSpec(), host);
123+
final NvRamSpec nvRam = spec.getDevicesSpec().getNvRam();
124+
if (nvRam != null && nvRam.isNeedRegister()) {
125+
prepareNvRamToStartVmCmd(cmd, nvRam, host);
124126
}
125127
}
126128

127-
private void prepareNvRamToStartVmCmd(KVMAgentCommands.StartVmCmd cmd, DiskAO nvRamSpec, KVMHostInventory host) {
129+
private void prepareNvRamToStartVmCmd(KVMAgentCommands.StartVmCmd cmd, NvRamSpec nvRam, KVMHostInventory host) {
128130
VolumeTO volume = new VolumeTO();
129131
volume.setDeviceType(VolumeTO.FILE);
130132
volume.setInstallPath(buildNvramFilePath(cmd.getVmInstanceUuid()));
131133
volume.setVolumeUuid(null); // not a volume
132134
cmd.setNvRam(volume);
133135

134136
synchronized (hostFileLock) {
137+
final Timestamp now = Timestamp.from(Instant.now());
135138
VmHostFileVO nvRamFile = Q.New(VmHostFileVO.class)
136139
.eq(VmHostFileVO_.vmInstanceUuid, cmd.getVmInstanceUuid())
137140
.eq(VmHostFileVO_.type, VmHostFileType.NvRam)
@@ -144,14 +147,14 @@ private void prepareNvRamToStartVmCmd(KVMAgentCommands.StartVmCmd cmd, DiskAO nv
144147
nvRamFile.setVmInstanceUuid(cmd.getVmInstanceUuid());
145148
nvRamFile.setType(VmHostFileType.NvRam);
146149
nvRamFile.setPath(volume.getInstallPath());
147-
nvRamFile.setCreateDate(Timestamp.from(Instant.now()));
150+
nvRamFile.setCreateDate(now);
148151
nvRamFile.setResourceName("NvRam file for " + cmd.getVmInstanceUuid());
149152
databaseFacade.persist(nvRamFile);
150153
} else {
151154
SQL.New(VmHostFileVO.class)
152155
.eq(VmHostFileVO_.uuid, nvRamFile.getUuid())
153156
.set(VmHostFileVO_.path, volume.getInstallPath())
154-
.set(VmHostFileVO_.lastOpDate, Timestamp.from(Instant.now()))
157+
.set(VmHostFileVO_.lastOpDate, now)
155158
.update();
156159
}
157160
}
@@ -265,7 +268,7 @@ public void preBeforeInstantiateVmResource(VmInstanceSpec spec) throws VmInstant
265268

266269
@Override
267270
public void preInstantiateVmResource(VmInstanceSpec spec, Completion completion) {
268-
final DiskAO nvRamSpec = spec.getNvRamSpec();
271+
final NvRamSpec nvRamSpec = spec.getDevicesSpec() == null ? null : spec.getDevicesSpec().getNvRam();
269272
if (nvRamSpec == null) {
270273
completion.success();
271274
return;
@@ -275,6 +278,7 @@ public void preInstantiateVmResource(VmInstanceSpec spec, Completion completion)
275278
context.hostUuid = spec.getDestHost().getUuid();
276279
context.vmUuid = spec.getVmInventory().getUuid();
277280
context.type = VmHostFileType.NvRam;
281+
context.backupUuid = nvRamSpec.getBackupFileUuid();
278282
context.syncReason = "pre-instantiate VM resource";
279283
prepareHostFileOnHost(context, completion);
280284
}

plugin/kvm/src/main/java/org/zstack/kvm/tpm/KvmTpmExtensions.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ public void preInstantiateVmResource(VmInstanceSpec spec, Completion completion)
137137
clearRollbackInfo(spec);
138138
final PrepareTpmResourceContext context = new PrepareTpmResourceContext();
139139
context.tpmUuid = tpmSpec.getTpmUuid();
140+
context.backupFileUuid = tpmSpec.getBackupFileUuid(); // maybe null
140141
context.providerUuid = resourceKeyBackend.findKeyProviderUuidByTpm(context.tpmUuid);
141142
context.providerName = resourceKeyBackend.findKeyProviderNameByTpm(context.tpmUuid);
142143

@@ -151,6 +152,7 @@ public void run(FlowTrigger trigger, Map data) {
151152
innerContext.hostUuid = spec.getDestHost().getUuid();
152153
innerContext.vmUuid = spec.getVmInventory().getUuid();
153154
innerContext.type = VmHostFileType.TpmState;
155+
innerContext.backupUuid = context.backupFileUuid;
154156
innerContext.syncReason = "pre-instantiate VM resource";
155157
secureBootExtensions.prepareHostFileOnHost(innerContext, new Completion(trigger) {
156158
@Override
@@ -265,6 +267,7 @@ static class PrepareTpmStateHostFileContext {
265267

266268
static class PrepareTpmResourceContext {
267269
String tpmUuid;
270+
String backupFileUuid;
268271
String providerUuid;
269272
String providerName;
270273
String dekBase64;

0 commit comments

Comments
 (0)