This is an automated email from the ASF dual-hosted git repository.

shwstppr pushed a commit to branch 4.17
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/4.17 by this push:
     new 98479183601 api, vmware: allow VM setting/detail for disk controller 
(root/data) to override template details (#6276)
98479183601 is described below

commit 98479183601260495790a997419480d989f05aa6
Author: Pearl Dsilva <[email protected]>
AuthorDate: Mon Aug 22 13:27:07 2022 +0530

    api, vmware: allow VM setting/detail for disk controller (root/data) to 
override template details (#6276)
    
    This PR allows VM details wrt root & data disk controller passed via 
details parameter of deployVMCmd to take precedence over template settings, 
i.e., the order of precedence for determining VM disk controller is : VM 
details passed during deployment > template settings > global setting 
vmware.root.disk.controller.
---
 .../main/java/com/cloud/vm/UserVmManagerImpl.java  | 78 +++++++++++++---------
 1 file changed, 47 insertions(+), 31 deletions(-)

diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java 
b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
index 0fcaf6a2b2e..9d56c339eed 100644
--- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
@@ -4304,6 +4304,15 @@ public class UserVmManagerImpl extends ManagerBase 
implements UserVmManager, Vir
                 if (!isImport && isIso) {
                     vm.setIsoId(template.getId());
                 }
+
+                long guestOSId = template.getGuestOSId();
+                GuestOSVO guestOS = _guestOSDao.findById(guestOSId);
+                long guestOSCategoryId = guestOS.getCategoryId();
+                GuestOSCategoryVO guestOSCategory = 
_guestOSCategoryDao.findById(guestOSCategoryId);
+                if (hypervisorType.equals(HypervisorType.VMware)) {
+                    updateVMDiskController(vm, customParameters, guestOS);
+                }
+
                 Long rootDiskSize = null;
                 // custom root disk size, resizes base template to larger size
                 if 
(customParameters.containsKey(VmDetailConstants.ROOT_DISK_SIZE)) {
@@ -4324,36 +4333,6 @@ public class UserVmManagerImpl extends ManagerBase 
implements UserVmManager, Vir
                     vm.setDisplayVm(true);
                 }
 
-                long guestOSId = template.getGuestOSId();
-                GuestOSVO guestOS = _guestOSDao.findById(guestOSId);
-                long guestOSCategoryId = guestOS.getCategoryId();
-                GuestOSCategoryVO guestOSCategory = 
_guestOSCategoryDao.findById(guestOSCategoryId);
-
-                // If hypervisor is vSphere and OS is OS X, set special 
settings.
-                if (hypervisorType.equals(HypervisorType.VMware)) {
-                    if (guestOS.getDisplayName().toLowerCase().contains("apple 
mac os")) {
-                        vm.setDetail(VmDetailConstants.SMC_PRESENT, "TRUE");
-                        vm.setDetail(VmDetailConstants.ROOT_DISK_CONTROLLER, 
"scsi");
-                        vm.setDetail(VmDetailConstants.DATA_DISK_CONTROLLER, 
"scsi");
-                        vm.setDetail(VmDetailConstants.FIRMWARE, "efi");
-                        s_logger.info("guestOS is OSX : overwrite root disk 
controller to scsi, use smc and efi");
-                    } else {
-                        String controllerSetting = 
StringUtils.defaultIfEmpty(_configDao.getValue(Config.VmwareRootDiskControllerType.key()),
-                                
Config.VmwareRootDiskControllerType.getDefaultValue());
-                        // Don't override if VM already has root/data disk 
controller detail
-                        if 
(vm.getDetail(VmDetailConstants.ROOT_DISK_CONTROLLER) == null) {
-                            
vm.setDetail(VmDetailConstants.ROOT_DISK_CONTROLLER, controllerSetting);
-                        }
-                        if 
(vm.getDetail(VmDetailConstants.DATA_DISK_CONTROLLER) == null) {
-                            if (controllerSetting.equalsIgnoreCase("scsi")) {
-                                
vm.setDetail(VmDetailConstants.DATA_DISK_CONTROLLER, "scsi");
-                            } else {
-                                
vm.setDetail(VmDetailConstants.DATA_DISK_CONTROLLER, "osdefault");
-                            }
-                        }
-                    }
-                }
-
                 if (isImport) {
                     vm.setDataCenterId(zone.getId());
                     vm.setHostId(host.getId());
@@ -4443,6 +4422,42 @@ public class UserVmManagerImpl extends ManagerBase 
implements UserVmManager, Vir
         });
     }
 
+    private void updateVMDiskController(UserVmVO vm, Map<String, String> 
customParameters, GuestOSVO guestOS) {
+        // If hypervisor is vSphere and OS is OS X, set special settings.
+        if (guestOS.getDisplayName().toLowerCase().contains("apple mac os")) {
+            vm.setDetail(VmDetailConstants.SMC_PRESENT, "TRUE");
+            vm.setDetail(VmDetailConstants.ROOT_DISK_CONTROLLER, "scsi");
+            vm.setDetail(VmDetailConstants.DATA_DISK_CONTROLLER, "scsi");
+            vm.setDetail(VmDetailConstants.FIRMWARE, "efi");
+            s_logger.info("guestOS is OSX : overwrite root disk controller to 
scsi, use smc and efi");
+        } else {
+            String rootDiskControllerSetting = 
customParameters.get(VmDetailConstants.ROOT_DISK_CONTROLLER);
+            String dataDiskControllerSetting = 
customParameters.get(VmDetailConstants.DATA_DISK_CONTROLLER);
+            if (StringUtils.isNotEmpty(rootDiskControllerSetting)) {
+                vm.setDetail(VmDetailConstants.ROOT_DISK_CONTROLLER, 
rootDiskControllerSetting);
+            }
+
+            if (StringUtils.isNotEmpty(dataDiskControllerSetting)) {
+                vm.setDetail(VmDetailConstants.DATA_DISK_CONTROLLER, 
dataDiskControllerSetting);
+            }
+
+            String controllerSetting = 
StringUtils.defaultIfEmpty(_configDao.getValue(Config.VmwareRootDiskControllerType.key()),
+                    Config.VmwareRootDiskControllerType.getDefaultValue());
+
+            // Don't override if VM already has root/data disk controller 
detail
+            if (vm.getDetail(VmDetailConstants.ROOT_DISK_CONTROLLER) == null) {
+                vm.setDetail(VmDetailConstants.ROOT_DISK_CONTROLLER, 
controllerSetting);
+            }
+            if (vm.getDetail(VmDetailConstants.DATA_DISK_CONTROLLER) == null) {
+                if (controllerSetting.equalsIgnoreCase("scsi")) {
+                    vm.setDetail(VmDetailConstants.DATA_DISK_CONTROLLER, 
"scsi");
+                } else {
+                    vm.setDetail(VmDetailConstants.DATA_DISK_CONTROLLER, 
"osdefault");
+                }
+            }
+        }
+    }
+
     /**
      * take the properties and set them on the vm.
      * consider should we be complete, and make sure all default values are 
copied as well if known?
@@ -4495,6 +4510,7 @@ public class UserVmManagerImpl extends ManagerBase 
implements UserVmManager, Vir
     public void validateRootDiskResize(final HypervisorType hypervisorType, 
Long rootDiskSize, VMTemplateVO templateVO, UserVmVO vm, final Map<String, 
String> customParameters) throws InvalidParameterValueException
     {
         // rootdisksize must be larger than template.
+        boolean isIso = ImageFormat.ISO == templateVO.getFormat();
         if ((rootDiskSize << 30) < templateVO.getSize()) {
             String error = "Unsupported: rootdisksize override is smaller than 
template size " + toHumanReadableSize(templateVO.getSize());
             s_logger.error(error);
@@ -4502,7 +4518,7 @@ public class UserVmManagerImpl extends ManagerBase 
implements UserVmManager, Vir
         } else if ((rootDiskSize << 30) > templateVO.getSize()) {
             if (hypervisorType == HypervisorType.VMware && (vm.getDetails() == 
null || vm.getDetails().get(VmDetailConstants.ROOT_DISK_CONTROLLER) == null)) {
                 s_logger.warn("If Root disk controller parameter is not 
overridden, then Root disk resize may fail because current Root disk controller 
value is NULL.");
-            } else if (hypervisorType == HypervisorType.VMware && 
vm.getDetails().get(VmDetailConstants.ROOT_DISK_CONTROLLER).toLowerCase().contains("ide"))
 {
+            } else if (hypervisorType == HypervisorType.VMware && 
vm.getDetails().get(VmDetailConstants.ROOT_DISK_CONTROLLER).toLowerCase().contains("ide")
 && !isIso) {
                 String error = String.format("Found unsupported root disk 
controller [%s].", vm.getDetails().get(VmDetailConstants.ROOT_DISK_CONTROLLER));
                 s_logger.error(error);
                 throw new InvalidParameterValueException(error);

Reply via email to