From 4ad6c8e3cdee2ba4672f5c308223d3e15caeeed6 Mon Sep 17 00:00:00 2001 From: SadiJr Date: Mon, 1 Nov 2021 17:08:26 -0300 Subject: [PATCH 1/2] Remove restriction, in VMWare, to resize only SCSI disks, because VMWare supports resize of subtypes of SCSI, like LSILOGIC, LSILOGIC SAS, etc --- .../vmware/resource/VmwareResource.java | 49 +++++++++---------- .../java/com/cloud/vm/UserVmManagerImpl.java | 4 +- 2 files changed, 25 insertions(+), 28 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 d1776eaf8b03..c98135b0ef07 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 @@ -788,8 +788,10 @@ private Answer execute(ResizeVolumeCommand cmd) { try { if (newSize < oldSize) { - throw new Exception( - "VMware doesn't support shrinking volume from larger size: " + oldSize / ResourceType.bytesToMiB + " GB to a smaller size: " + newSize / ResourceType.bytesToMiB + " GB"); + String errorMsg = String.format("VMware doesn't support shrinking volume from larger size [%s] GB to a smaller size [%s] GB. Can't resize volume of VM [name: %s].", + oldSize / Float.valueOf(ResourceType.bytesToMiB), newSize / Float.valueOf(ResourceType.bytesToMiB), vmName); + s_logger.error(errorMsg); + throw new Exception(errorMsg); } else if (newSize == oldSize) { return new ResizeVolumeAnswer(cmd, true, "success", newSize * ResourceType.bytesToKiB); } @@ -831,11 +833,9 @@ private Answer execute(ResizeVolumeCommand cmd) { vmMo = hyperHost.findVmOnPeerHyperHost(vmName); if (vmMo == null) { - String msg = "VM " + vmName + " does not exist in VMware datacenter"; - - s_logger.error(msg); - - throw new Exception(msg); + String errorMsg = String.format("VM [name: %s] does not exist in VMware datacenter.", vmName); + s_logger.error(errorMsg); + throw new Exception(errorMsg); } @@ -898,7 +898,7 @@ private Answer execute(ResizeVolumeCommand cmd) { vmConfigSpec.getDeviceChange().add(deviceConfigSpec); if (!vmMo.configureVm(vmConfigSpec)) { - throw new Exception("Failed to configure VM to resize disk. vmName: " + vmName); + throw new Exception(String.format("Failed to configure VM [name: %s] to resize disk.", vmName)); } ResizeVolumeAnswer answer = new ResizeVolumeAnswer(cmd, true, "success", newSize * 1024); @@ -913,11 +913,9 @@ private Answer execute(ResizeVolumeCommand cmd) { } return answer; } catch (Exception e) { - s_logger.error("Unable to resize volume", e); - - String error = "Failed to resize volume: " + e.getMessage(); - - return new ResizeVolumeAnswer(cmd, false, error); + String errorMsg = String.format("Failed to resize volume of VM [name: %s] due to: [%s].", vmName, e.getMessage()); + s_logger.error(errorMsg, e); + return new ResizeVolumeAnswer(cmd, false, errorMsg); } finally { // OfflineVmwareMigration: 6. check if a worker was used and destroy it if needed try { @@ -928,7 +926,7 @@ private Answer execute(ResizeVolumeCommand cmd) { vmMo.destroy(); } } catch (Throwable e) { - s_logger.info("Failed to destroy worker VM: " + vmName); + s_logger.error(String.format("Failed to destroy worker VM [name: %s] due to: [%s].", vmName, e.getMessage()), e); } } } @@ -936,26 +934,25 @@ private Answer execute(ResizeVolumeCommand cmd) { private VirtualDisk getDiskAfterResizeDiskValidations(VirtualMachineMO vmMo, String volumePath) throws Exception { Pair vdisk = vmMo.getDiskDevice(volumePath); if (vdisk == null) { - if (s_logger.isTraceEnabled()) { - s_logger.trace("resize volume done (failed)"); - } - throw new Exception("No such disk device: " + volumePath); + String errorMsg = String.format("Resize volume of VM [name: %s] failed because disk device [path: %s] doesn't exist.", vmMo.getVmName(), volumePath); + s_logger.error(errorMsg); + throw new Exception(errorMsg); } // IDE virtual disk cannot be re-sized if VM is running if (vdisk.second() != null && vdisk.second().contains("ide")) { - throw new Exception("Re-sizing a virtual disk over an IDE controller is not supported in the VMware hypervisor. " + - "Please re-try when virtual disk is attached to a VM using a SCSI controller."); + String errorMsg = String.format("Re-sizing a virtual disk over an IDE controller is not supported in the VMware hypervisor. " + + "Please re-try when virtual disk is attached to VM [name: %s] using a SCSI controller.", vmMo.getVmName()); + s_logger.error(errorMsg); + throw new Exception(errorMsg); } - if (vdisk.second() != null && !vdisk.second().toLowerCase().startsWith("scsi")) { - s_logger.error("Unsupported disk device bus " + vdisk.second()); - throw new Exception("Unsupported disk device bus " + vdisk.second()); - } VirtualDisk disk = vdisk.first(); if ((VirtualDiskFlatVer2BackingInfo) disk.getBacking() != null && ((VirtualDiskFlatVer2BackingInfo) disk.getBacking()).getParent() != null) { - s_logger.error("Resize is not supported because Disk device has Parent " + ((VirtualDiskFlatVer2BackingInfo) disk.getBacking()).getParent().getUuid()); - throw new Exception("Resize is not supported because Disk device has Parent " + ((VirtualDiskFlatVer2BackingInfo) disk.getBacking()).getParent().getUuid()); + String errorMsg = String.format("Resize of volume in VM [name: %s] is not supported because Disk device [path: %s] has Parents: [%s].", + vmMo.getVmName(), volumePath, ((VirtualDiskFlatVer2BackingInfo) disk.getBacking()).getParent().getUuid()); + s_logger.error(errorMsg); + throw new Exception(errorMsg); } return disk; } diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index efb8f493038a..45c7ec107c8c 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -4440,8 +4440,8 @@ public void validateRootDiskResize(final HypervisorType hypervisorType, Long roo } 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("scsi")) { - String error = "Found unsupported root disk controller: " + vm.getDetails().get(VmDetailConstants.ROOT_DISK_CONTROLLER); + } else if (hypervisorType == HypervisorType.VMware && vm.getDetails().get(VmDetailConstants.ROOT_DISK_CONTROLLER).toLowerCase().contains("ide")) { + 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); } else { From a934975c44f4f230ed7cf8b4ef176f4f5cd09af7 Mon Sep 17 00:00:00 2001 From: SadiJr Date: Wed, 3 Nov 2021 08:50:02 -0300 Subject: [PATCH 2/2] Add check with lower case to IDE controller --- .../com/cloud/hypervisor/vmware/resource/VmwareResource.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 c98135b0ef07..179585caad4a 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 @@ -940,7 +940,7 @@ private VirtualDisk getDiskAfterResizeDiskValidations(VirtualMachineMO vmMo, Str } // IDE virtual disk cannot be re-sized if VM is running - if (vdisk.second() != null && vdisk.second().contains("ide")) { + if (vdisk.second() != null && vdisk.second().toLowerCase().contains("ide")) { String errorMsg = String.format("Re-sizing a virtual disk over an IDE controller is not supported in the VMware hypervisor. " + "Please re-try when virtual disk is attached to VM [name: %s] using a SCSI controller.", vmMo.getVmName()); s_logger.error(errorMsg);