From 3f702b269d89c185dad965e9ec6c3a5166429aed Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Wed, 18 Aug 2021 17:51:11 +0530 Subject: [PATCH 01/10] xenserver: honor vm boot details Signed-off-by: Abhishek Kumar --- .../xenserver/resource/CitrixResourceBase.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java index f6d95ecbda5c..c1cbbafdc6e4 100644 --- a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java +++ b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java @@ -51,6 +51,7 @@ import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; +import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.diagnostics.CopyToSecondaryStorageAnswer; import org.apache.cloudstack.diagnostics.CopyToSecondaryStorageCommand; import org.apache.cloudstack.diagnostics.DiagnosticsService; @@ -1932,6 +1933,7 @@ protected void finalizeVmMetaData(final VM vm, final VM.Record vmr, final Connec vm.setPlatform(conn, platform); } } + setVmBootDetails(vm, conn, details); } // Add configuration settings VM record for User VM instances before creating VM @@ -1942,6 +1944,21 @@ protected void finalizeVmMetaData(final VM vm, final VM.Record vmr, final Connec } } + protected void setVmBootDetails(final VM vm, final Connection conn, final Map details) throws XenAPIException, XmlRpcException { + String bootType = details.get("boottype"); + if (!ApiConstants.BootType.UEFI.toString().equals(bootType)) { + bootType = ApiConstants.BootType.BIOS.toString(); + } + boolean isSecure = bootType.equals(ApiConstants.BootType.UEFI.toString()) && + ApiConstants.BootMode.SECURE.toString().equals(details.get("bootmode")); + final Map bootParams = vm.getHVMBootParams(conn); + bootParams.replace("firmware", bootType); + vm.setHVMBootParams(conn, bootParams); + final Map platform = vm.getPlatform(conn); + platform.put("secureboot", isSecure ? "true" : "false"); + vm.setPlatform(conn, platform); + } + /** * This method just creates a XenServer network following the tunnel network * naming convention From 7db3ac297a56b2e79d36ec54676cde4a1c1629f4 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Wed, 18 Aug 2021 18:13:18 +0530 Subject: [PATCH 02/10] ui: allow boot option selection for xenserver Signed-off-by: Abhishek Kumar --- ui/src/views/compute/DeployVM.vue | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ui/src/views/compute/DeployVM.vue b/ui/src/views/compute/DeployVM.vue index b1c24ccdd406..027a896bfaec 100644 --- a/ui/src/views/compute/DeployVM.vue +++ b/ui/src/views/compute/DeployVM.vue @@ -491,10 +491,9 @@
+ v-if="vm.templateid && ['KVM', 'VMware', 'Xenserver'].includes(hypervisor) && !template.deployasis"> From de40364222b3e1067d9ee2c57395c74274cc9399 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Wed, 18 Aug 2021 18:21:41 +0530 Subject: [PATCH 03/10] fix Signed-off-by: Abhishek Kumar --- .../xenserver/resource/CitrixResourceBase.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java index c1cbbafdc6e4..e3a143578002 100644 --- a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java +++ b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java @@ -1439,6 +1439,11 @@ public VM createVmFromTemplate(final Connection conn, final VirtualMachineTO vmS } catch (final Exception e) { throw new CloudRuntimeException("Unable to finalize VM MetaData: " + vmSpec); } + try { + setVmBootDetails(vm, conn, vmSpec.getBootMode(), vmSpec.getBootType()); + } catch (final XenAPIException | XmlRpcException e) { + throw new CloudRuntimeException(String.format("Unable to handle VM boot options: %s", vmSpec), e); + } return vm; } @@ -1933,7 +1938,6 @@ protected void finalizeVmMetaData(final VM vm, final VM.Record vmr, final Connec vm.setPlatform(conn, platform); } } - setVmBootDetails(vm, conn, details); } // Add configuration settings VM record for User VM instances before creating VM @@ -1944,13 +1948,12 @@ protected void finalizeVmMetaData(final VM vm, final VM.Record vmr, final Connec } } - protected void setVmBootDetails(final VM vm, final Connection conn, final Map details) throws XenAPIException, XmlRpcException { - String bootType = details.get("boottype"); + protected void setVmBootDetails(final VM vm, final Connection conn, String bootType, String bootMode) throws XenAPIException, XmlRpcException { if (!ApiConstants.BootType.UEFI.toString().equals(bootType)) { bootType = ApiConstants.BootType.BIOS.toString(); } boolean isSecure = bootType.equals(ApiConstants.BootType.UEFI.toString()) && - ApiConstants.BootMode.SECURE.toString().equals(details.get("bootmode")); + ApiConstants.BootMode.SECURE.toString().equals(bootMode); final Map bootParams = vm.getHVMBootParams(conn); bootParams.replace("firmware", bootType); vm.setHVMBootParams(conn, bootParams); From f27d4aaf7f339f28708a52708ecf7e35a9966eb5 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Fri, 20 Aug 2021 15:03:02 +0530 Subject: [PATCH 04/10] fix case Signed-off-by: Abhishek Kumar --- .../cloud/hypervisor/xenserver/resource/CitrixResourceBase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java index e3a143578002..375e1a26a789 100644 --- a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java +++ b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java @@ -1955,7 +1955,7 @@ protected void setVmBootDetails(final VM vm, final Connection conn, String bootT boolean isSecure = bootType.equals(ApiConstants.BootType.UEFI.toString()) && ApiConstants.BootMode.SECURE.toString().equals(bootMode); final Map bootParams = vm.getHVMBootParams(conn); - bootParams.replace("firmware", bootType); + bootParams.replace("firmware", bootType.toLowerCase()); vm.setHVMBootParams(conn, bootParams); final Map platform = vm.getPlatform(conn); platform.put("secureboot", isSecure ? "true" : "false"); From 0ff5ad006fcc55fd7b27640f16a5b534ea37fdc0 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Fri, 20 Aug 2021 17:01:21 +0530 Subject: [PATCH 05/10] fix Signed-off-by: Abhishek Kumar --- .../hypervisor/xenserver/resource/CitrixResourceBase.java | 4 ++-- .../cloud/agent/manager/allocator/impl/FirstFitAllocator.java | 2 +- ui/src/views/compute/DeployVM.vue | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java index 375e1a26a789..c07e0b9971f8 100644 --- a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java +++ b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java @@ -1440,7 +1440,7 @@ public VM createVmFromTemplate(final Connection conn, final VirtualMachineTO vmS throw new CloudRuntimeException("Unable to finalize VM MetaData: " + vmSpec); } try { - setVmBootDetails(vm, conn, vmSpec.getBootMode(), vmSpec.getBootType()); + setVmBootDetails(vm, conn, vmSpec.getBootType(), vmSpec.getBootMode()); } catch (final XenAPIException | XmlRpcException e) { throw new CloudRuntimeException(String.format("Unable to handle VM boot options: %s", vmSpec), e); } @@ -1958,7 +1958,7 @@ protected void setVmBootDetails(final VM vm, final Connection conn, String bootT bootParams.replace("firmware", bootType.toLowerCase()); vm.setHVMBootParams(conn, bootParams); final Map platform = vm.getPlatform(conn); - platform.put("secureboot", isSecure ? "true" : "false"); + platform.put("secureboot", Boolean.toString(isSecure)); vm.setPlatform(conn, platform); } diff --git a/server/src/main/java/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java b/server/src/main/java/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java index 01f7689fea2c..df6ea74881ec 100644 --- a/server/src/main/java/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java +++ b/server/src/main/java/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java @@ -123,7 +123,7 @@ public List allocateTo(VirtualMachineProfile vmProfile, DeploymentPlan pla isVMDeployedWithUefi = true; } } - s_logger.info(" Guest VM is requested with Cusotm[UEFI] Boot Type "+ isVMDeployedWithUefi); + s_logger.info(" Guest VM is requested with Custom[UEFI] Boot Type "+ isVMDeployedWithUefi); if (type == Host.Type.Storage) { diff --git a/ui/src/views/compute/DeployVM.vue b/ui/src/views/compute/DeployVM.vue index 027a896bfaec..cd91ce263d60 100644 --- a/ui/src/views/compute/DeployVM.vue +++ b/ui/src/views/compute/DeployVM.vue @@ -491,7 +491,7 @@
+ v-if="vm.templateid && ['KVM', 'VMware', 'XenServer'].includes(hypervisor) && !template.deployasis"> Date: Fri, 20 Aug 2021 23:56:56 +0530 Subject: [PATCH 06/10] host uefi capability Signed-off-by: Abhishek Kumar --- .../xenserver/discoverer/XcpServerDiscoverer.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/discoverer/XcpServerDiscoverer.java b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/discoverer/XcpServerDiscoverer.java index c2a0969c9d3c..ac6dae24b719 100644 --- a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/discoverer/XcpServerDiscoverer.java +++ b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/discoverer/XcpServerDiscoverer.java @@ -31,6 +31,7 @@ import javax.persistence.EntityExistsException; import org.apache.cloudstack.hypervisor.xenserver.XenserverConfigs; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.apache.xmlrpc.XmlRpcException; @@ -122,6 +123,15 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L private String xenServerIsoName = TemplateManager.XS_TOOLS_ISO; private String xenServerIsoDisplayText = "XenServer Tools Installer ISO (xen-pv-drv-iso)"; + public final static String MIN_UEFI_SUPPORTED_VERSION = "8.2"; + + public static boolean isUefiSupported(String hostProductVersion) { + if (StringUtils.isEmpty(hostProductVersion)) { + return false; + } + return hostProductVersion.compareTo(MIN_UEFI_SUPPORTED_VERSION) >= 0; + } + protected XcpServerDiscoverer() { } @@ -309,6 +319,7 @@ protected boolean poolHasHotFix(Connection conn, String hostIp, String hotFixUui details.put("username", username); params.put("username", username); details.put("password", password); + details.put(com.cloud.host.Host.HOST_UEFI_ENABLE, Boolean.toString(isUefiSupported(prodVersion))); params.put("password", password); params.put("zone", Long.toString(dcId)); params.put("guid", record.uuid); From f3cce42f10b941fe71e3a20232e4e8379a2255bb Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Sat, 21 Aug 2021 00:13:38 +0530 Subject: [PATCH 07/10] change Signed-off-by: Abhishek Kumar --- .../hypervisor/xenserver/resource/CitrixResourceBase.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java index c07e0b9971f8..862aafedbfe1 100644 --- a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java +++ b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java @@ -1952,13 +1952,13 @@ protected void setVmBootDetails(final VM vm, final Connection conn, String bootT if (!ApiConstants.BootType.UEFI.toString().equals(bootType)) { bootType = ApiConstants.BootType.BIOS.toString(); } - boolean isSecure = bootType.equals(ApiConstants.BootType.UEFI.toString()) && + Boolean isSecure = bootType.equals(ApiConstants.BootType.UEFI.toString()) && ApiConstants.BootMode.SECURE.toString().equals(bootMode); final Map bootParams = vm.getHVMBootParams(conn); bootParams.replace("firmware", bootType.toLowerCase()); vm.setHVMBootParams(conn, bootParams); final Map platform = vm.getPlatform(conn); - platform.put("secureboot", Boolean.toString(isSecure)); + platform.put("secureboot", isSecure.toString()); vm.setPlatform(conn, platform); } From e9a5b17f3bf63f85689c0d72fdc3f0210d8280f9 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Sat, 21 Aug 2021 00:51:30 +0530 Subject: [PATCH 08/10] add detail only if uefi supported Signed-off-by: Abhishek Kumar --- .../hypervisor/xenserver/discoverer/XcpServerDiscoverer.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/discoverer/XcpServerDiscoverer.java b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/discoverer/XcpServerDiscoverer.java index ac6dae24b719..e8e3c9b66e98 100644 --- a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/discoverer/XcpServerDiscoverer.java +++ b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/discoverer/XcpServerDiscoverer.java @@ -319,7 +319,9 @@ protected boolean poolHasHotFix(Connection conn, String hostIp, String hotFixUui details.put("username", username); params.put("username", username); details.put("password", password); - details.put(com.cloud.host.Host.HOST_UEFI_ENABLE, Boolean.toString(isUefiSupported(prodVersion))); + if (isUefiSupported(prodVersion)) { + details.put(com.cloud.host.Host.HOST_UEFI_ENABLE, Boolean.TRUE.toString()); + } params.put("password", password); params.put("zone", Long.toString(dcId)); params.put("guid", record.uuid); From 3454f16ea62b6991e814994f33a461288c374eaf Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Tue, 24 Aug 2021 12:24:28 +0530 Subject: [PATCH 09/10] update host detail Signed-off-by: Abhishek Kumar --- .../hypervisor/xenserver/resource/CitrixResourceBase.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java index 862aafedbfe1..b63480f5cf4d 100644 --- a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java +++ b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java @@ -16,6 +16,7 @@ // under the License. package com.cloud.hypervisor.xenserver.resource; +import static com.cloud.hypervisor.xenserver.discoverer.XcpServerDiscoverer.isUefiSupported; import static com.cloud.utils.NumbersUtil.toHumanReadableSize; import java.io.BufferedReader; @@ -1790,6 +1791,9 @@ protected void fillHostInfo(final Connection conn, final StartupRoutingCommand c } details.put("product_brand", productBrand); details.put("product_version", _host.getProductVersion()); + if (isUefiSupported(_host.getProductVersion())) { + details.put(com.cloud.host.Host.HOST_UEFI_ENABLE, Boolean.TRUE.toString()); + } if (hr.softwareVersion.get("product_version_text_short") != null) { details.put("product_version_text_short", hr.softwareVersion.get("product_version_text_short")); cmd.setHypervisorVersion(hr.softwareVersion.get("product_version_text_short")); From f3c8e642162f5b17d1247ff6caae69a508de3284 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Fri, 27 Aug 2021 13:36:39 +0530 Subject: [PATCH 10/10] fix version comparison Signed-off-by: Abhishek Kumar --- plugins/hypervisors/xenserver/pom.xml | 5 +++++ .../discoverer/XcpServerDiscoverer.java | 4 +++- .../discoverer/XcpServerDiscovererTest.java | 22 +++++++++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/plugins/hypervisors/xenserver/pom.xml b/plugins/hypervisors/xenserver/pom.xml index 694ebfbaaea4..7a2015ac1e58 100644 --- a/plugins/hypervisors/xenserver/pom.xml +++ b/plugins/hypervisors/xenserver/pom.xml @@ -48,5 +48,10 @@ xen-api ${cs.xapi.version} + + org.apache.maven + maven-artifact + 3.6.3 + diff --git a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/discoverer/XcpServerDiscoverer.java b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/discoverer/XcpServerDiscoverer.java index e8e3c9b66e98..bbf3686750d7 100644 --- a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/discoverer/XcpServerDiscoverer.java +++ b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/discoverer/XcpServerDiscoverer.java @@ -33,6 +33,7 @@ import org.apache.cloudstack.hypervisor.xenserver.XenserverConfigs; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; +import org.apache.maven.artifact.versioning.ComparableVersion; import org.apache.xmlrpc.XmlRpcException; import com.cloud.agent.AgentManager; @@ -129,7 +130,8 @@ public static boolean isUefiSupported(String hostProductVersion) { if (StringUtils.isEmpty(hostProductVersion)) { return false; } - return hostProductVersion.compareTo(MIN_UEFI_SUPPORTED_VERSION) >= 0; + ComparableVersion version = new ComparableVersion(hostProductVersion); + return version.compareTo(new ComparableVersion(MIN_UEFI_SUPPORTED_VERSION)) >= 0; } protected XcpServerDiscoverer() { diff --git a/plugins/hypervisors/xenserver/src/test/java/com/cloud/hypervisor/xenserver/discoverer/XcpServerDiscovererTest.java b/plugins/hypervisors/xenserver/src/test/java/com/cloud/hypervisor/xenserver/discoverer/XcpServerDiscovererTest.java index f8188afd6828..26c2e6da625c 100644 --- a/plugins/hypervisors/xenserver/src/test/java/com/cloud/hypervisor/xenserver/discoverer/XcpServerDiscovererTest.java +++ b/plugins/hypervisors/xenserver/src/test/java/com/cloud/hypervisor/xenserver/discoverer/XcpServerDiscovererTest.java @@ -17,6 +17,7 @@ package com.cloud.hypervisor.xenserver.discoverer; +import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InOrder; @@ -70,4 +71,25 @@ public void createXenServerToolsIsoEntryInDatabaseTestEntryAlreadyExist() { inOrder.verify(vmTemplateVOMock).setDisplayText("XenServer Tools Installer ISO (xen-pv-drv-iso)"); inOrder.verify(vmTemplateDao).update(1L, vmTemplateVOMock); } + + @Test + public void uefiSupportedVersionTest() { + Assert.assertTrue(XcpServerDiscoverer.isUefiSupported("8.2")); + Assert.assertTrue(XcpServerDiscoverer.isUefiSupported("8.2.0")); + Assert.assertTrue(XcpServerDiscoverer.isUefiSupported("8.2.1")); + Assert.assertTrue(XcpServerDiscoverer.isUefiSupported("9")); + Assert.assertTrue(XcpServerDiscoverer.isUefiSupported("9.1")); + Assert.assertTrue(XcpServerDiscoverer.isUefiSupported("9.1.0")); + Assert.assertTrue(XcpServerDiscoverer.isUefiSupported("10")); + Assert.assertTrue(XcpServerDiscoverer.isUefiSupported("10.1")); + Assert.assertTrue(XcpServerDiscoverer.isUefiSupported("10.1.0")); + Assert.assertFalse(XcpServerDiscoverer.isUefiSupported(null)); + Assert.assertFalse(XcpServerDiscoverer.isUefiSupported("")); + Assert.assertFalse(XcpServerDiscoverer.isUefiSupported("abc")); + Assert.assertFalse(XcpServerDiscoverer.isUefiSupported("0")); + Assert.assertFalse(XcpServerDiscoverer.isUefiSupported("7.4")); + Assert.assertFalse(XcpServerDiscoverer.isUefiSupported("8")); + Assert.assertFalse(XcpServerDiscoverer.isUefiSupported("8.1")); + Assert.assertFalse(XcpServerDiscoverer.isUefiSupported("8.1.0")); + } }