This is an automated email from the ASF dual-hosted git repository. dahn pushed a commit to branch 4.19 in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/4.19 by this push: new 8d3ae3e0574 [Vmware] Improve listing of Vmware Datacenter VMs for migration to KVM (#10770) 8d3ae3e0574 is described below commit 8d3ae3e0574b9fc10d1d5635ad4d96e36bb8cce0 Author: Nicolas Vazquez <nicovazque...@gmail.com> AuthorDate: Wed May 14 03:12:27 2025 -0300 [Vmware] Improve listing of Vmware Datacenter VMs for migration to KVM (#10770) Co-authored-by: dahn <daan.hoogl...@gmail.com> Co-authored-by: Suresh Kumar Anaparti <sureshkumar.anapa...@gmail.com> --- .../api/response/UnmanagedInstanceResponse.java | 24 +++++ .../apache/cloudstack/vm/UnmanagedInstanceTO.java | 19 ++++ .../vmware/manager/VmwareManagerImpl.java | 88 +++++++++++++---- .../api/command/admin/zone/ListVmwareDcVmsCmd.java | 19 ++++ .../main/java/com/cloud/api/ApiResponseHelper.java | 2 + ui/src/views/tools/ManageInstances.vue | 28 ++++++ ui/src/views/tools/SelectVmwareVcenter.vue | 7 ++ .../com/cloud/hypervisor/vmware/mo/BaseMO.java | 107 +++++++++++++++++++++ .../cloud/hypervisor/vmware/mo/DatacenterMO.java | 26 +---- .../cloud/hypervisor/vmware/util/VmwareHelper.java | 13 +++ 10 files changed, 289 insertions(+), 44 deletions(-) diff --git a/api/src/main/java/org/apache/cloudstack/api/response/UnmanagedInstanceResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/UnmanagedInstanceResponse.java index 7a26b178591..c1156f5f23a 100644 --- a/api/src/main/java/org/apache/cloudstack/api/response/UnmanagedInstanceResponse.java +++ b/api/src/main/java/org/apache/cloudstack/api/response/UnmanagedInstanceResponse.java @@ -79,6 +79,14 @@ public class UnmanagedInstanceResponse extends BaseResponse { @Param(description = "the operating system of the virtual machine") private String operatingSystem; + @SerializedName(ApiConstants.BOOT_MODE) + @Param(description = "indicates the boot mode") + private String bootMode; + + @SerializedName(ApiConstants.BOOT_TYPE) + @Param(description = "indicates the boot type") + private String bootType; + @SerializedName(ApiConstants.DISK) @Param(description = "the list of disks associated with the virtual machine", responseObject = UnmanagedInstanceDiskResponse.class) private Set<UnmanagedInstanceDiskResponse> disks; @@ -211,4 +219,20 @@ public class UnmanagedInstanceResponse extends BaseResponse { public void addNic(NicResponse nic) { this.nics.add(nic); } + + public String getBootMode() { + return bootMode; + } + + public void setBootMode(String bootMode) { + this.bootMode = bootMode; + } + + public String getBootType() { + return bootType; + } + + public void setBootType(String bootType) { + this.bootType = bootType; + } } diff --git a/api/src/main/java/org/apache/cloudstack/vm/UnmanagedInstanceTO.java b/api/src/main/java/org/apache/cloudstack/vm/UnmanagedInstanceTO.java index 6f632853527..f1027b74eca 100644 --- a/api/src/main/java/org/apache/cloudstack/vm/UnmanagedInstanceTO.java +++ b/api/src/main/java/org/apache/cloudstack/vm/UnmanagedInstanceTO.java @@ -61,6 +61,9 @@ public class UnmanagedInstanceTO { private String vncPassword; + private String bootType; + private String bootMode; + public String getName() { return name; } @@ -189,6 +192,22 @@ public class UnmanagedInstanceTO { this.vncPassword = vncPassword; } + public String getBootType() { + return bootType; + } + + public void setBootType(String bootType) { + this.bootType = bootType; + } + + public String getBootMode() { + return bootMode; + } + + public void setBootMode(String bootMode) { + this.bootMode = bootMode; + } + public static class Disk { private String diskId; diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java index 61a949f42d3..2bdd496dd92 100644 --- a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java +++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java @@ -43,6 +43,7 @@ import javax.inject.Inject; import javax.naming.ConfigurationException; import javax.persistence.EntityExistsException; +import com.cloud.hypervisor.vmware.mo.VirtualMachineMO; import com.cloud.hypervisor.vmware.util.VmwareClient; import org.apache.cloudstack.api.command.admin.zone.AddVmwareDcCmd; import org.apache.cloudstack.api.command.admin.zone.ImportVsphereStoragePoliciesCmd; @@ -1587,14 +1588,26 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw return compatiblePools; } - @Override - public List<UnmanagedInstanceTO> listVMsInDatacenter(ListVmwareDcVmsCmd cmd) { + private static class VcenterData { + public final String vcenter; + public final String datacenterName; + public final String username; + public final String password; + + public VcenterData(String vcenter, String datacenterName, String username, String password) { + this.vcenter = vcenter; + this.datacenterName = datacenterName; + this.username = username; + this.password = password; + } + } + + private VcenterData getVcenterData(ListVmwareDcVmsCmd cmd) { String vcenter = cmd.getVcenter(); String datacenterName = cmd.getDatacenterName(); String username = cmd.getUsername(); String password = cmd.getPassword(); Long existingVcenterId = cmd.getExistingVcenterId(); - String keyword = cmd.getKeyword(); if ((existingVcenterId == null && StringUtils.isBlank(vcenter)) || (existingVcenterId != null && StringUtils.isNotBlank(vcenter))) { @@ -1615,34 +1628,67 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw username = vmwareDc.getUser(); password = vmwareDc.getPassword(); } + VcenterData vmwaredc = new VcenterData(vcenter, datacenterName, username, password); + return vmwaredc; + } + + private static VmwareContext getVmwareContext(String vcenter, String username, String password) throws Exception { + s_logger.debug(String.format("Connecting to the VMware vCenter %s", vcenter)); + String serviceUrl = String.format("https://%s/sdk/vimService", vcenter); + VmwareClient vimClient = new VmwareClient(vcenter); + vimClient.connect(serviceUrl, username, password); + return new VmwareContext(vimClient, vcenter); + } + + @Override + public List<UnmanagedInstanceTO> listVMsInDatacenter(ListVmwareDcVmsCmd cmd) { + VcenterData vmwareDC = getVcenterData(cmd); + String vcenter = vmwareDC.vcenter; + String username = vmwareDC.username; + String password = vmwareDC.password; + String datacenterName = vmwareDC.datacenterName; + String keyword = cmd.getKeyword(); + String esxiHostName = cmd.getHostName(); + String virtualMachineName = cmd.getInstanceName(); try { - s_logger.debug(String.format("Connecting to the VMware datacenter %s at vCenter %s to retrieve VMs", - datacenterName, vcenter)); - String serviceUrl = String.format("https://%s/sdk/vimService", vcenter); - VmwareClient vimClient = new VmwareClient(vcenter); - vimClient.connect(serviceUrl, username, password); - VmwareContext context = new VmwareContext(vimClient, vcenter); - - DatacenterMO dcMo = new DatacenterMO(context, datacenterName); - ManagedObjectReference dcMor = dcMo.getMor(); - if (dcMor == null) { - String msg = String.format("Unable to find VMware datacenter %s in vCenter %s", - datacenterName, vcenter); - s_logger.error(msg); - throw new InvalidParameterValueException(msg); + VmwareContext context = getVmwareContext(vcenter, username, password); + DatacenterMO dcMo = getDatacenterMO(context, vcenter, datacenterName); + + List<UnmanagedInstanceTO> instances; + if (StringUtils.isNotBlank(esxiHostName) && StringUtils.isNotBlank(virtualMachineName)) { + ManagedObjectReference hostMor = dcMo.findHost(esxiHostName); + if (hostMor == null) { + String errorMsg = String.format("Cannot find a host with name %s on vcenter %s", esxiHostName, vcenter); + s_logger.error(errorMsg); + throw new CloudRuntimeException(errorMsg); + } + HostMO hostMO = new HostMO(context, hostMor); + VirtualMachineMO vmMo = hostMO.findVmOnHyperHost(virtualMachineName); + instances = Collections.singletonList(VmwareHelper.getUnmanagedInstance(hostMO, vmMo)); + } else { + instances = dcMo.getAllVmsOnDatacenter(keyword); } - List<UnmanagedInstanceTO> instances = dcMo.getAllVmsOnDatacenter(); - return StringUtils.isBlank(keyword) ? instances : - instances.stream().filter(x -> x.getName().toLowerCase().contains(keyword.toLowerCase())).collect(Collectors.toList()); + return instances; } catch (Exception e) { - String errorMsg = String.format("Error retrieving stopped VMs from the VMware VC %s datacenter %s: %s", + String errorMsg = String.format("Error retrieving VMs from the VMware VC %s datacenter %s: %s", vcenter, datacenterName, e.getMessage()); s_logger.error(errorMsg, e); throw new CloudRuntimeException(errorMsg); } } + private static DatacenterMO getDatacenterMO(VmwareContext context, String vcenter, String datacenterName) throws Exception { + DatacenterMO dcMo = new DatacenterMO(context, datacenterName); + ManagedObjectReference dcMor = dcMo.getMor(); + if (dcMor == null) { + String msg = String.format("Unable to find VMware datacenter %s in vCenter %s", datacenterName, vcenter); + s_logger.error(msg); + throw new InvalidParameterValueException(msg); + } + return dcMo; + } + @Override public boolean hasNexusVSM(Long clusterId) { ClusterVSMMapVO vsmMapVo = null; diff --git a/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ListVmwareDcVmsCmd.java b/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ListVmwareDcVmsCmd.java index 4dd1b4beb09..3c7b233f7c9 100644 --- a/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ListVmwareDcVmsCmd.java +++ b/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ListVmwareDcVmsCmd.java @@ -70,6 +70,12 @@ public class ListVmwareDcVmsCmd extends BaseListCmd { @Parameter(name = ApiConstants.PASSWORD, type = CommandType.STRING, description = "The password for specified username.") private String password; + @Parameter(name = ApiConstants.HOST_NAME, type = CommandType.STRING, description = "Name of the host on vCenter. Must be set along with the instancename parameter") + private String hostName; + + @Parameter(name = ApiConstants.INSTANCE_NAME, type = CommandType.STRING, description = "Name of the VM on vCenter. Must be set along with the hostname parameter") + private String instanceName; + public String getVcenter() { return vcenter; } @@ -86,10 +92,18 @@ public class ListVmwareDcVmsCmd extends BaseListCmd { return datacenterName; } + public String getHostName() { + return hostName; + } + public Long getExistingVcenterId() { return existingVcenterId; } + public String getInstanceName() { + return instanceName; + } + @Override public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { checkParameters(); @@ -125,6 +139,11 @@ public class ListVmwareDcVmsCmd extends BaseListCmd { throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Please set all the information for a vCenter IP/Name, datacenter, username and password"); } + if ((StringUtils.isNotBlank(instanceName) && StringUtils.isBlank(hostName)) || + (StringUtils.isBlank(instanceName) && StringUtils.isNotBlank(hostName))) { + throw new ServerApiException(ApiErrorCode.PARAM_ERROR, + "Please set the hostname parameter along with the instancename parameter"); + } } @Override diff --git a/server/src/main/java/com/cloud/api/ApiResponseHelper.java b/server/src/main/java/com/cloud/api/ApiResponseHelper.java index ed7a51d215c..77276090dae 100644 --- a/server/src/main/java/com/cloud/api/ApiResponseHelper.java +++ b/server/src/main/java/com/cloud/api/ApiResponseHelper.java @@ -5145,6 +5145,8 @@ public class ApiResponseHelper implements ResponseGenerator { response.setMemory(instance.getMemory()); response.setOperatingSystemId(instance.getOperatingSystemId()); response.setOperatingSystem(instance.getOperatingSystem()); + response.setBootMode(instance.getBootMode()); + response.setBootType(instance.getBootType()); response.setObjectName("unmanagedinstance"); if (instance.getDisks() != null) { diff --git a/ui/src/views/tools/ManageInstances.vue b/ui/src/views/tools/ManageInstances.vue index 2ff9052d8b9..85b1deea915 100644 --- a/ui/src/views/tools/ManageInstances.vue +++ b/ui/src/views/tools/ManageInstances.vue @@ -1302,6 +1302,31 @@ export default { this.fetchInstances() } }, + fetchVmwareInstanceForKVMMigration (vmname, hostname) { + const params = {} + if (this.isMigrateFromVmware && this.selectedVmwareVcenter) { + if (this.selectedVmwareVcenter.vcenter) { + params.datacentername = this.selectedVmwareVcenter.datacentername + params.vcenter = this.selectedVmwareVcenter.vcenter + params.username = this.selectedVmwareVcenter.username + params.password = this.selectedVmwareVcenter.password + } else { + params.existingvcenterid = this.selectedVmwareVcenter.existingvcenterid + } + params.instancename = vmname + params.hostname = hostname + } + api('listVmwareDcVms', params).then(json => { + const response = json.listvmwaredcvmsresponse + this.selectedUnmanagedInstance = response.unmanagedinstance[0] + this.selectedUnmanagedInstance.ostypename = this.selectedUnmanagedInstance.osdisplayname + this.selectedUnmanagedInstance.state = this.selectedUnmanagedInstance.powerstate + }).catch(error => { + this.$notifyError(error) + }).finally(() => { + this.loading = false + }) + }, onManageInstanceAction () { this.selectedUnmanagedInstance = {} if (this.unmanagedInstances.length > 0 && @@ -1319,6 +1344,9 @@ export default { } }) this.showUnmanageForm = false + } else if (this.isMigrateFromVmware) { + this.fetchVmwareInstanceForKVMMigration(this.selectedUnmanagedInstance.name, this.selectedUnmanagedInstance.hostname) + this.showUnmanageForm = true } else { this.showUnmanageForm = true } diff --git a/ui/src/views/tools/SelectVmwareVcenter.vue b/ui/src/views/tools/SelectVmwareVcenter.vue index 80618655719..d742e72f9e0 100644 --- a/ui/src/views/tools/SelectVmwareVcenter.vue +++ b/ui/src/views/tools/SelectVmwareVcenter.vue @@ -227,6 +227,8 @@ export default { } else { params.existingvcenterid = this.selectedExistingVcenterId } + params.page = 1 + params.pagesize = 10 api('listVmwareDcVms', params).then(json => { const obj = { params: params, @@ -265,6 +267,11 @@ export default { this.loading = false }) }, + onSelectExternalVmwareDatacenter (value) { + if (this.vcenterSelectedOption === 'new' && !(this.vcenter === '' || this.datacentername === '' || this.username === '' || this.password === '')) { + this.listVmwareDatacenterVms() + } + }, onSelectExistingVmwareDatacenter (value) { this.selectedExistingVcenterId = value }, diff --git a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/BaseMO.java b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/BaseMO.java index 88f6c871fbd..0d380bd7ff7 100644 --- a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/BaseMO.java +++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/BaseMO.java @@ -16,6 +16,13 @@ // under the License. package com.cloud.hypervisor.vmware.mo; +import com.cloud.utils.Pair; +import com.vmware.vim25.DynamicProperty; +import com.vmware.vim25.ObjectContent; +import com.vmware.vim25.VirtualMachineBootOptions; +import com.vmware.vim25.VirtualMachinePowerState; +import org.apache.cloudstack.vm.UnmanagedInstanceTO; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import com.vmware.vim25.CustomFieldDef; @@ -24,12 +31,22 @@ import com.vmware.vim25.ManagedObjectReference; import com.cloud.hypervisor.vmware.util.VmwareContext; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + public class BaseMO { private static final Logger s_logger = Logger.getLogger(BaseMO.class); protected VmwareContext _context; protected ManagedObjectReference _mor; + protected static String[] propertyPathsForUnmanagedVmsThinListing = new String[] {"name", "config.template", + "runtime.powerState", "config.guestId", "config.guestFullName", "runtime.host", + "config.bootOptions", "config.firmware"}; + private String _name; public BaseMO(VmwareContext context, ManagedObjectReference mor) { @@ -153,4 +170,94 @@ public class BaseMO { return cfmMo.getCustomFieldKey(morType, fieldName); } + + private static UnmanagedInstanceTO.PowerState convertPowerState(VirtualMachinePowerState powerState) { + return powerState == VirtualMachinePowerState.POWERED_ON ? UnmanagedInstanceTO.PowerState.PowerOn : + powerState == VirtualMachinePowerState.POWERED_OFF ? UnmanagedInstanceTO.PowerState.PowerOff : UnmanagedInstanceTO.PowerState.PowerUnknown; + } + + protected List<UnmanagedInstanceTO> convertVmsObjectContentsToUnmanagedInstances(List<ObjectContent> ocs, String keyword) throws Exception { + Map<String, Pair<String, String>> hostClusterNamesMap = new HashMap<>(); + List<UnmanagedInstanceTO> vms = new ArrayList<>(); + if (ocs != null) { + for (ObjectContent oc : ocs) { + List<DynamicProperty> objProps = oc.getPropSet(); + if (objProps != null) { + UnmanagedInstanceTO vm = createUnmanagedInstanceTOFromThinListingDynamicProperties( + objProps, keyword, hostClusterNamesMap); + if (vm != null) { + vms.add(vm); + } + } + } + } + if (vms.size() > 0) { + vms.sort(Comparator.comparing(UnmanagedInstanceTO::getName)); + } + return vms; + } + + private UnmanagedInstanceTO createUnmanagedInstanceTOFromThinListingDynamicProperties(List<DynamicProperty> objProps, + String keyword, + Map<String, Pair<String, String>> hostClusterNamesMap) throws Exception { + UnmanagedInstanceTO vm = new UnmanagedInstanceTO(); + String vmName; + boolean isTemplate = false; + boolean excludeByKeyword = false; + + for (DynamicProperty objProp : objProps) { + if (objProp.getName().equals("name")) { + vmName = (String) objProp.getVal(); + if (StringUtils.isNotBlank(keyword) && !vmName.contains(keyword)) { + excludeByKeyword = true; + } + vm.setName(vmName); + } else if (objProp.getName().equals("config.template")) { + isTemplate = (Boolean) objProp.getVal(); + } else if (objProp.getName().equals("runtime.powerState")) { + VirtualMachinePowerState powerState = (VirtualMachinePowerState) objProp.getVal(); + vm.setPowerState(convertPowerState(powerState)); + } else if (objProp.getName().equals("config.guestFullName")) { + vm.setOperatingSystem((String) objProp.getVal()); + } else if (objProp.getName().equals("config.guestId")) { + vm.setOperatingSystemId((String) objProp.getVal()); + } else if (objProp.getName().equals("config.bootOptions")) { + VirtualMachineBootOptions bootOptions = (VirtualMachineBootOptions) objProp.getVal(); + String bootMode = "LEGACY"; + if (bootOptions != null && bootOptions.isEfiSecureBootEnabled()) { + bootMode = "SECURE"; + } + vm.setBootMode(bootMode); + } else if (objProp.getName().equals("config.firmware")) { + String firmware = (String) objProp.getVal(); + vm.setBootType(firmware.equalsIgnoreCase("efi") ? "UEFI" : "BIOS"); + } else if (objProp.getName().equals("runtime.host")) { + ManagedObjectReference hostMor = (ManagedObjectReference) objProp.getVal(); + setUnmanagedInstanceTOHostAndCluster(vm, hostMor, hostClusterNamesMap); + } + } + if (isTemplate || excludeByKeyword) { + return null; + } + return vm; + } + + private void setUnmanagedInstanceTOHostAndCluster(UnmanagedInstanceTO vm, ManagedObjectReference hostMor, + Map<String, Pair<String, String>> hostClusterNamesMap) throws Exception { + if (hostMor != null && StringUtils.isNotBlank(hostMor.getValue())) { + String hostMorValue = hostMor.getValue(); + Pair<String, String> hostClusterPair; + if (hostClusterNamesMap.containsKey(hostMorValue)) { + hostClusterPair = hostClusterNamesMap.get(hostMorValue); + } else { + HostMO hostMO = new HostMO(_context, hostMor); + ClusterMO clusterMO = new ClusterMO(_context, hostMO.getHyperHostCluster()); + hostClusterPair = new Pair<>(hostMO.getHostName(), clusterMO.getName()); + hostClusterNamesMap.put(hostMorValue, hostClusterPair); + } + vm.setHostName(hostClusterPair.first()); + vm.setClusterName(hostClusterPair.second()); + } + } + } diff --git a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/DatacenterMO.java b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/DatacenterMO.java index d8c7e8a61ea..7aa18276d44 100644 --- a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/DatacenterMO.java +++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/DatacenterMO.java @@ -21,7 +21,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import com.cloud.hypervisor.vmware.util.VmwareHelper; import org.apache.cloudstack.vm.UnmanagedInstanceTO; import org.apache.commons.collections.CollectionUtils; import org.apache.log4j.Logger; @@ -161,28 +160,9 @@ public class DatacenterMO extends BaseMO { return null; } - public List<UnmanagedInstanceTO> getAllVmsOnDatacenter() throws Exception { - List<UnmanagedInstanceTO> vms = new ArrayList<>(); - List<ObjectContent> ocs = getVmPropertiesOnDatacenterVmFolder(new String[] {"name"}); - if (ocs != null) { - for (ObjectContent oc : ocs) { - ManagedObjectReference vmMor = oc.getObj(); - if (vmMor != null) { - VirtualMachineMO vmMo = new VirtualMachineMO(_context, vmMor); - try { - if (!vmMo.isTemplate()) { - HostMO hostMO = vmMo.getRunningHost(); - UnmanagedInstanceTO unmanagedInstance = VmwareHelper.getUnmanagedInstance(hostMO, vmMo); - vms.add(unmanagedInstance); - } - } catch (Exception e) { - s_logger.debug(String.format("Unexpected error checking unmanaged instance %s, excluding it: %s", vmMo.getVmName(), e.getMessage()), e); - } - } - } - } - - return vms; + public List<UnmanagedInstanceTO> getAllVmsOnDatacenter(String keyword) throws Exception { + List<ObjectContent> ocs = getVmPropertiesOnDatacenterVmFolder(propertyPathsForUnmanagedVmsThinListing); + return convertVmsObjectContentsToUnmanagedInstances(ocs, keyword); } public List<HostMO> getAllHostsOnDatacenter() throws Exception { diff --git a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/util/VmwareHelper.java b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/util/VmwareHelper.java index b273688c162..9311360cd12 100644 --- a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/util/VmwareHelper.java +++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/util/VmwareHelper.java @@ -59,6 +59,8 @@ import com.vmware.vim25.NasDatastoreInfo; import com.vmware.vim25.VMwareDVSPortSetting; import com.vmware.vim25.VirtualDeviceFileBackingInfo; import com.vmware.vim25.VirtualIDEController; +import com.vmware.vim25.VirtualMachineBootOptions; +import com.vmware.vim25.VirtualMachineConfigInfo; import com.vmware.vim25.VirtualMachineConfigSummary; import com.vmware.vim25.VirtualMachineGuestOsIdentifier; import com.vmware.vim25.VirtualMachineToolsStatus; @@ -810,6 +812,17 @@ public class VmwareHelper { instance.setCpuSpeed(configSummary.getCpuReservation()); instance.setMemory(configSummary.getMemorySizeMB()); } + VirtualMachineConfigInfo configInfo = vmMo.getConfigInfo(); + if (configInfo != null) { + String firmware = configInfo.getFirmware(); + instance.setBootType(firmware.equalsIgnoreCase("efi") ? "UEFI" : "BIOS"); + VirtualMachineBootOptions bootOptions = configInfo.getBootOptions(); + String bootMode = "LEGACY"; + if (bootOptions != null && bootOptions.isEfiSecureBootEnabled()) { + bootMode = "SECURE"; + } + instance.setBootMode(bootMode); + } try { ClusterMO clusterMo = new ClusterMO(hyperHost.getContext(), hyperHost.getHyperHostCluster());