From c2b4dc2739a52e7237c34ce8188d47e5c43012e5 Mon Sep 17 00:00:00 2001 From: nvazquez Date: Thu, 5 Jun 2025 21:55:21 -0300 Subject: [PATCH 1/3] [Vmware to KVM Migration] Preserve boot type and boot mode of instances to be migrated --- .../cloudstack/vm/UnmanagedVMsManagerImpl.java | 13 ++++++++++--- ui/src/components/view/InfoCard.vue | 12 ++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java b/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java index 8d5387b3ffd5..88a7e6b7dadc 100644 --- a/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java @@ -1113,7 +1113,8 @@ private UserVm importVirtualMachineInternal(final UnmanagedInstanceTO unmanagedI final VirtualMachineTemplate template, final String displayName, final String hostName, final Account caller, final Account owner, final Long userId, final ServiceOfferingVO serviceOffering, final Map dataDiskOfferingMap, final Map nicNetworkMap, final Map callerNicIpAddressMap, - final Map details, final boolean migrateAllowed, final boolean forced, final boolean isImportUnmanagedFromSameHypervisor) { + final Map details, final boolean migrateAllowed, final boolean forced, final boolean isImportUnmanagedFromSameHypervisor, + final String bootType, final String bootMode) { logger.debug(LogUtils.logGsonWithoutException("Trying to import VM [%s] with name [%s], in zone [%s], cluster [%s], and host [%s], using template [%s], service offering [%s], disks map [%s], NICs map [%s] and details [%s].", unmanagedInstance, instanceName, zone, cluster, host, template, serviceOffering, dataDiskOfferingMap, nicNetworkMap, details)); UserVm userVm = null; @@ -1188,6 +1189,10 @@ private UserVm importVirtualMachineInternal(final UnmanagedInstanceTO unmanagedI allDetails.put(VmDetailConstants.KVM_VNC_PASSWORD, unmanagedInstance.getVncPassword()); } + if (StringUtils.isNotBlank(bootType) && bootType.equalsIgnoreCase("uefi") && StringUtils.isNotBlank(bootMode)) { + allDetails.put("UEFI", bootMode); + } + VirtualMachine.PowerState powerState = VirtualMachine.PowerState.PowerOff; if (unmanagedInstance.getPowerState().equals(UnmanagedInstanceTO.PowerState.PowerOn)) { powerState = VirtualMachine.PowerState.PowerOn; @@ -1564,7 +1569,8 @@ private UserVm importUnmanagedInstanceFromHypervisor(DataCenter zone, Cluster cl template, displayName, hostName, CallContext.current().getCallingAccount(), owner, userId, serviceOffering, dataDiskOfferingMap, nicNetworkMap, nicIpAddressMap, - details, migrateAllowed, forced, true); + details, migrateAllowed, forced, true, + unmanagedInstance.getBootType(), unmanagedInstance.getBootMode()); break; } if (userVm != null) { @@ -1684,7 +1690,8 @@ protected UserVm importUnmanagedInstanceFromVmwareToKvm(DataCenter zone, Cluster template, displayName, hostName, caller, owner, userId, serviceOffering, dataDiskOfferingMap, nicNetworkMap, nicIpAddressMap, - details, false, forced, false); + details, false, forced, false, + sourceVMwareInstance.getBootType(), sourceVMwareInstance.getBootMode()); long timeElapsedInSecs = (System.currentTimeMillis() - importStartTime) / 1000; logger.debug(String.format("VMware VM %s imported successfully to CloudStack instance %s (%s), Time taken: %d secs, OVF files imported from %s, Source VMware VM details - OS: %s, PowerState: %s, Disks: %s, NICs: %s", sourceVMName, instanceName, displayName, timeElapsedInSecs, (ovfTemplateOnConvertLocation != null)? "MS" : "KVM Host", sourceVMwareInstance.getOperatingSystem(), sourceVMwareInstance.getPowerState(), sourceVMwareInstance.getDisks(), sourceVMwareInstance.getNics())); diff --git a/ui/src/components/view/InfoCard.vue b/ui/src/components/view/InfoCard.vue index 65c4d3ac0f5e..e6c3cc7ca923 100644 --- a/ui/src/components/view/InfoCard.vue +++ b/ui/src/components/view/InfoCard.vue @@ -728,6 +728,18 @@ {{ resource.webhookname || resource.webhookid }} +
+
{{ $t('label.boottype') }}
+
+ {{ resource.boottype }} +
+
+
+
{{ $t('label.bootmode') }}
+
+ {{ resource.bootmode }} +
+
{{ $t('label.management.servers') }}
From bce65786e40e39a64657655a60305a12ed90b61b Mon Sep 17 00:00:00 2001 From: nvazquez Date: Fri, 13 Jun 2025 11:59:05 -0300 Subject: [PATCH 2/3] Restore end of line --- ui/src/components/view/InfoCard.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/src/components/view/InfoCard.vue b/ui/src/components/view/InfoCard.vue index 74f979cf2e35..446b8c00aa40 100644 --- a/ui/src/components/view/InfoCard.vue +++ b/ui/src/components/view/InfoCard.vue @@ -1386,4 +1386,4 @@ export default { border-radius: 50%; border: 1px solid rgba(177, 177, 177, 0.788); } - \ No newline at end of file + From 6f68eca6ae2bcaa1a939199092b7d41f03959477 Mon Sep 17 00:00:00 2001 From: nvazquez Date: Mon, 16 Jun 2025 09:11:34 -0300 Subject: [PATCH 3/3] Extract lines to new method --- .../apache/cloudstack/vm/UnmanagedVMsManagerImpl.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java b/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java index 88a7e6b7dadc..5c02acafbbb5 100644 --- a/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java @@ -1189,9 +1189,7 @@ private UserVm importVirtualMachineInternal(final UnmanagedInstanceTO unmanagedI allDetails.put(VmDetailConstants.KVM_VNC_PASSWORD, unmanagedInstance.getVncPassword()); } - if (StringUtils.isNotBlank(bootType) && bootType.equalsIgnoreCase("uefi") && StringUtils.isNotBlank(bootMode)) { - allDetails.put("UEFI", bootMode); - } + addImportingVMBootTypeAndModeDetails(bootType, bootMode, allDetails); VirtualMachine.PowerState powerState = VirtualMachine.PowerState.PowerOff; if (unmanagedInstance.getPowerState().equals(UnmanagedInstanceTO.PowerState.PowerOn)) { @@ -1264,6 +1262,12 @@ private UserVm importVirtualMachineInternal(final UnmanagedInstanceTO unmanagedI return userVm; } + private void addImportingVMBootTypeAndModeDetails(String bootType, String bootMode, Map allDetails) { + if (StringUtils.isNotBlank(bootType) && bootType.equalsIgnoreCase("uefi") && StringUtils.isNotBlank(bootMode)) { + allDetails.put("UEFI", bootMode); + } + } + private HashMap getUnmanagedInstancesForHost(HostVO host, String instanceName, List managedVms) { HashMap unmanagedInstances = new HashMap<>(); if (host.isInMaintenanceStates()) {