|
51 | 51 |
|
52 | 52 | import com.cloud.capacity.CapacityManager;
|
53 | 53 | import com.cloud.hypervisor.vmware.mo.HostDatastoreBrowserMO;
|
| 54 | +import com.vmware.vim25.Description; |
54 | 55 | import com.vmware.vim25.FileInfo;
|
55 | 56 | import com.vmware.vim25.FileQueryFlags;
|
56 | 57 | import com.vmware.vim25.FolderFileInfo;
|
57 | 58 | import com.vmware.vim25.HostDatastoreBrowserSearchResults;
|
58 | 59 | import com.vmware.vim25.HostDatastoreBrowserSearchSpec;
|
59 | 60 | import com.vmware.vim25.VirtualCdromIsoBackingInfo;
|
60 | 61 | import com.vmware.vim25.VirtualMachineConfigSummary;
|
| 62 | +import com.vmware.vim25.VirtualTPM; |
61 | 63 | import org.apache.cloudstack.api.ApiConstants;
|
62 | 64 | import org.apache.cloudstack.backup.PrepareForBackupRestorationCommand;
|
63 | 65 | import org.apache.cloudstack.storage.command.CopyCommand;
|
@@ -2597,12 +2599,16 @@ protected StartAnswer execute(StartCommand cmd) {
|
2597 | 2599 |
|
2598 | 2600 | setBootOptions(vmSpec, bootMode, vmConfigSpec);
|
2599 | 2601 |
|
| 2602 | + // Config vTPM |
| 2603 | + configureVirtualTPM(vmMo, vmSpec, vmConfigSpec); |
| 2604 | + |
2600 | 2605 | if (StringUtils.isNotEmpty(vmStoragePolicyId)) {
|
2601 | 2606 | vmConfigSpec.getVmProfile().add(vmProfileSpec);
|
2602 | 2607 | if (logger.isTraceEnabled()) {
|
2603 | 2608 | logger.trace(String.format("Configuring the VM %s with storage policy: %s", vmInternalCSName, vmStoragePolicyId));
|
2604 | 2609 | }
|
2605 | 2610 | }
|
| 2611 | + |
2606 | 2612 | //
|
2607 | 2613 | // Configure VM
|
2608 | 2614 | //
|
@@ -3203,6 +3209,57 @@ protected void configureSpecVideoCardNewVRamSize(VirtualMachineVideoCard videoCa
|
3203 | 3209 | vmConfigSpec.getDeviceChange().add(arrayVideoCardConfigSpecs);
|
3204 | 3210 | }
|
3205 | 3211 |
|
| 3212 | + /** |
| 3213 | + * Add or Remove virtual TPM module |
| 3214 | + * |
| 3215 | + * @param vmMo virtual machine mo |
| 3216 | + * @param vmSpec virtual machine specs |
| 3217 | + * @param vmConfigSpec virtual machine config spec |
| 3218 | + * @throws Exception exception |
| 3219 | + */ |
| 3220 | + protected void configureVirtualTPM(VirtualMachineMO vmMo, VirtualMachineTO vmSpec, VirtualMachineConfigSpec vmConfigSpec) throws Exception { |
| 3221 | + String virtualTPMEnabled = vmSpec.getDetails().getOrDefault(VmDetailConstants.VIRTUAL_TPM_ENABLED, null); |
| 3222 | + if (Boolean.parseBoolean(virtualTPMEnabled)) { |
| 3223 | + for (VirtualDevice device : vmMo.getAllDeviceList()) { |
| 3224 | + if (device instanceof VirtualTPM) { |
| 3225 | + logger.debug(String.format("Virtual TPM device has already been added to VM %s, returning", vmMo.getVmName())); |
| 3226 | + return; |
| 3227 | + } |
| 3228 | + } |
| 3229 | + logger.debug(String.format("Adding Virtual TPM device to the VM %s", vmMo.getVmName())); |
| 3230 | + addVirtualTPMDevice(vmConfigSpec); |
| 3231 | + } else if (virtualTPMEnabled == null) { |
| 3232 | + logger.debug(String.format("Virtual TPM device is neither enabled nor disabled for VM %s, skipping", vmMo.getVmName())); |
| 3233 | + } else { |
| 3234 | + logger.debug(String.format("Virtual TPM device is disabled for VM %s", vmMo.getVmName())); |
| 3235 | + for (VirtualDevice device : vmMo.getAllDeviceList()) { |
| 3236 | + if (device instanceof VirtualTPM) { |
| 3237 | + logger.debug(String.format("Removing Virtual TPM device from VM %s as it is disabled", vmMo.getVmName())); |
| 3238 | + removeVirtualTPMDevice(vmConfigSpec, (VirtualTPM) device); |
| 3239 | + } |
| 3240 | + } |
| 3241 | + } |
| 3242 | + } |
| 3243 | + |
| 3244 | + protected void addVirtualTPMDevice(VirtualMachineConfigSpec vmConfigSpec) { |
| 3245 | + Description description = new Description(); |
| 3246 | + description.setSummary("Trusted Platform Module"); |
| 3247 | + description.setLabel("Trusted Platform Module"); |
| 3248 | + VirtualTPM virtualTPM = new VirtualTPM(); |
| 3249 | + virtualTPM.setDeviceInfo(description); |
| 3250 | + VirtualDeviceConfigSpec deviceConfigSpec = new VirtualDeviceConfigSpec(); |
| 3251 | + deviceConfigSpec.setDevice(virtualTPM); |
| 3252 | + deviceConfigSpec.setOperation(VirtualDeviceConfigSpecOperation.ADD); |
| 3253 | + vmConfigSpec.getDeviceChange().add(deviceConfigSpec); |
| 3254 | + } |
| 3255 | + |
| 3256 | + protected void removeVirtualTPMDevice(VirtualMachineConfigSpec vmConfigSpec, VirtualTPM virtualTPM) { |
| 3257 | + VirtualDeviceConfigSpec virtualDeviceConfigSpec = new VirtualDeviceConfigSpec(); |
| 3258 | + virtualDeviceConfigSpec.setDevice(virtualTPM); |
| 3259 | + virtualDeviceConfigSpec.setOperation(VirtualDeviceConfigSpecOperation.REMOVE); |
| 3260 | + vmConfigSpec.getDeviceChange().add(virtualDeviceConfigSpec); |
| 3261 | + } |
| 3262 | + |
3206 | 3263 | private void tearDownVm(VirtualMachineMO vmMo) throws Exception {
|
3207 | 3264 |
|
3208 | 3265 | if (vmMo == null)
|
|
0 commit comments