From 5f734f718eb80cfccc83604892b20ec6068e6589 Mon Sep 17 00:00:00 2001 From: Spaceman1984 <49917670+Spaceman1984@users.noreply.github.com> Date: Wed, 19 May 2021 11:03:16 +0200 Subject: [PATCH] vmware: Disk controller vmware deploy as is (#5006) Fixes #4344 --- .../vmware/resource/VmwareResource.java | 46 ++----------------- .../java/com/cloud/vm/UserVmManagerImpl.java | 7 +++ ui/src/components/view/DetailSettings.vue | 11 +++-- 3 files changed, 18 insertions(+), 46 deletions(-) diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java index b5bfa9800fa..4702dcee5d9 100644 --- a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java +++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java @@ -2067,9 +2067,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa } VirtualMachineDiskInfo matchingExistingDisk = getMatchingExistingDisk(diskInfoBuilder, vol, hyperHost, context); - controllerKey = getDiskController(matchingExistingDisk, vol, vmSpec, ideControllerKey, scsiControllerKey); - String diskController = getDiskController(vmMo, matchingExistingDisk, vol, controllerInfo); - + String diskController = getDiskController(vmMo, matchingExistingDisk, vol, controllerInfo, deployAsIs); if (DiskControllerType.getType(diskController) == DiskControllerType.osdefault) { diskController = vmMo.getRecommendedDiskController(null); } @@ -3273,47 +3271,9 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa return null; } - private int getDiskController(VirtualMachineDiskInfo matchingExistingDisk, DiskTO vol, VirtualMachineTO vmSpec, int ideControllerKey, int scsiControllerKey) { - - int controllerKey; - if (matchingExistingDisk != null) { - s_logger.info("Chose disk controller based on existing information: " + matchingExistingDisk.getDiskDeviceBusName()); - if (matchingExistingDisk.getDiskDeviceBusName().startsWith("ide")) - return ideControllerKey; - else - return scsiControllerKey; - } - - if (vol.getType() == Volume.Type.ROOT) { - Map vmDetails = vmSpec.getDetails(); - if (vmDetails != null && vmDetails.get(VmDetailConstants.ROOT_DISK_CONTROLLER) != null) { - if (vmDetails.get(VmDetailConstants.ROOT_DISK_CONTROLLER).equalsIgnoreCase("scsi")) { - s_logger.info("Chose disk controller for vol " + vol.getType() + " -> scsi, based on root disk controller settings: " - + vmDetails.get(VmDetailConstants.ROOT_DISK_CONTROLLER)); - controllerKey = scsiControllerKey; - } else { - s_logger.info("Chose disk controller for vol " + vol.getType() + " -> ide, based on root disk controller settings: " - + vmDetails.get(VmDetailConstants.ROOT_DISK_CONTROLLER)); - controllerKey = ideControllerKey; - } - } else { - s_logger.info("Chose disk controller for vol " + vol.getType() + " -> scsi. due to null root disk controller setting"); - controllerKey = scsiControllerKey; - } - - } else { - // DATA volume always use SCSI device - s_logger.info("Chose disk controller for vol " + vol.getType() + " -> scsi"); - controllerKey = scsiControllerKey; - } - - return controllerKey; - } - - private String getDiskController(VirtualMachineMO vmMo, VirtualMachineDiskInfo matchingExistingDisk, DiskTO vol, Pair controllerInfo) throws Exception { - int controllerKey; + private String getDiskController(VirtualMachineMO vmMo, VirtualMachineDiskInfo matchingExistingDisk, DiskTO vol, Pair controllerInfo, boolean deployAsIs) throws Exception { DiskControllerType controllerType = DiskControllerType.none; - if (matchingExistingDisk != null) { + if (deployAsIs && matchingExistingDisk != null) { String currentBusName = matchingExistingDisk.getDiskDeviceBusName(); if (currentBusName != null) { s_logger.info("Chose disk controller based on existing information: " + currentBusName); diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index b4ef74f92f5..0784d50a60e 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -2521,6 +2521,13 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir String extraConfig = cmd.getExtraConfig(); UserVmVO vmInstance = _vmDao.findById(cmd.getId()); + if (MapUtils.isNotEmpty(details) || cmd.isCleanupDetails()) { + VMTemplateVO template = _templateDao.findById(vmInstance.getTemplateId()); + if (template != null && template.isDeployAsIs()) { + throw new CloudRuntimeException("Detail settings are read from OVA, it cannot be changed by API call."); + } + } + long accountId = vmInstance.getAccountId(); if (isDisplayVm != null && isDisplayVm != vmInstance.isDisplay()) { diff --git a/ui/src/components/view/DetailSettings.vue b/ui/src/components/view/DetailSettings.vue index 9bb72fffca4..2571bed9e65 100644 --- a/ui/src/components/view/DetailSettings.vue +++ b/ui/src/components/view/DetailSettings.vue @@ -80,11 +80,12 @@ slot="actions" v-if="!disableSettings && 'updateTemplate' in $store.getters.apis && 'updateVirtualMachine' in $store.getters.apis && isAdminOrOwner() && allowEditOfDetail(item.name)"> - - + + @@ -99,7 +100,7 @@ :cancelText="$t('label.no')" placement="left" > - + @@ -130,6 +131,7 @@ export default { newValue: '', loading: false, resourceType: 'UserVm', + deployasistemplate: false, error: false } }, @@ -163,6 +165,9 @@ export default { this.detailOptions = json.listdetailoptionsresponse.detailoptions.details }) this.disableSettings = (this.$route.meta.name === 'vm' && this.resource.state !== 'Stopped') + api('listTemplates', { templatefilter: 'all', id: this.resource.templateid }).then(json => { + this.deployasistemplate = json.listtemplatesresponse.template[0].deployasis + }) }, filterOrReadOnlyDetails () { for (var i = 0; i < this.details.length; i++) {