Skip to content

Commit c7c24cf

Browse files
author
gitlab
committed
Merge branch 'zsv-ldap' into 'feature-zsv-5.0.0-vm-support-vtpm-and-secuceboot'
<refactor>[vm]: move nvram to devices spec and add backup support See merge request zstackio/zstack!9518
2 parents 6b5bf82 + d3af48a commit c7c24cf

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)