|
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, bootMode); |
| 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,51 @@ 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, String bootMode) throws Exception { |
| 3221 | + String bootType = vmSpec.getDetails().getOrDefault(ApiConstants.BootType.UEFI.toString(), null); |
| 3222 | + String virtualTPMEnabled = vmSpec.getDetails().getOrDefault(VmDetailConstants.VIRTUAL_TPM_ENABLED, null); |
| 3223 | + if (StringUtils.isNotBlank(bootMode) && !bootMode.equalsIgnoreCase("bios") |
| 3224 | + && "secure".equalsIgnoreCase(bootType) |
| 3225 | + && Boolean.parseBoolean(virtualTPMEnabled)) { |
| 3226 | + logger.debug("Adding Virtual TPM device"); |
| 3227 | + for (VirtualDevice device : vmMo.getAllDeviceList()) { |
| 3228 | + if (device instanceof VirtualTPM) { |
| 3229 | + return; |
| 3230 | + } |
| 3231 | + } |
| 3232 | + Description description = new Description(); |
| 3233 | + description.setSummary("Trusted Platform Module"); |
| 3234 | + description.setLabel("Trusted Platform Module"); |
| 3235 | + VirtualTPM virtualTPM = new VirtualTPM(); |
| 3236 | + virtualTPM.setDeviceInfo(description); |
| 3237 | + virtualTPM.setKey(-1); |
| 3238 | + VirtualDeviceConfigSpec deviceConfigSpec = new VirtualDeviceConfigSpec(); |
| 3239 | + deviceConfigSpec.setDevice(virtualTPM); |
| 3240 | + deviceConfigSpec.setOperation(VirtualDeviceConfigSpecOperation.ADD); |
| 3241 | + vmConfigSpec.getDeviceChange().add(deviceConfigSpec); |
| 3242 | + } else { |
| 3243 | + logger.debug(String.format("Virtual TPM device is not enabled. It is only enabled when boot type is SECURE (actually %s) and vTPM is enabled (actually %s)", bootType, virtualTPMEnabled)); |
| 3244 | + for (VirtualDevice device : vmMo.getAllDeviceList()) { |
| 3245 | + if (device instanceof VirtualTPM) { |
| 3246 | + VirtualTPM virtualTPM = (VirtualTPM) device; |
| 3247 | + VirtualDeviceConfigSpec virtualDeviceConfigSpec = new VirtualDeviceConfigSpec(); |
| 3248 | + virtualDeviceConfigSpec.setDevice(virtualTPM); |
| 3249 | + virtualDeviceConfigSpec.setOperation(VirtualDeviceConfigSpecOperation.REMOVE); |
| 3250 | + vmConfigSpec.getDeviceChange().add(virtualDeviceConfigSpec); |
| 3251 | + } |
| 3252 | + } |
| 3253 | + |
| 3254 | + } |
| 3255 | + } |
| 3256 | + |
3206 | 3257 | private void tearDownVm(VirtualMachineMO vmMo) throws Exception { |
3207 | 3258 |
|
3208 | 3259 | if (vmMo == null) |
|
0 commit comments