This is an automated email from the ASF dual-hosted git repository.
rohit pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/main by this push:
new 5d7ea30 vmware: Remove restriction, in VMWare, to resize only SCSI
disks (#5650)
5d7ea30 is described below
commit 5d7ea30f87d0c333a647cef832412f30187a29cb
Author: SadiJr <[email protected]>
AuthorDate: Sat Jan 8 00:32:00 2022 -0300
vmware: Remove restriction, in VMWare, to resize only SCSI disks (#5650)
Remove restriction, in VMWare, to resize only SCSI disks, because VMWare
supports resize of subtypes of SCSI, like LSILOGIC, LSILOGIC SAS, etc
In VMWare, there are different types of SCSI controllers, such as BusLogic
Parallel, LSI Logic Parallel, LSI Logic SAS, etc. All of these sub-types
support the disk resize operation, the only exception is the IDE controller.
However, in ACS, there is a logical restriction to allow only resizing of
volumes of the specific SCSI type; thus, not allowing resizing of the SCSI
sub-types. This PR corrects this behavior blocking the resize of volumes which
uses IDE controller only.
More information can be found at:
https://www.starwindsoftware.com/blog/storage-controllers-in-vmware-vsphere
https://www.nakivo.com/blog/scsi-controller-and-other-vmware-controller-types/
https://docs.vmware.com/en/VMware-vSphere/7.0/com.vmware.vsphere.vm_admin.doc/GUID-5872D173-A076-42FE-8D0B-9DB0EB0E7362.html
https://communities.vmware.com/t5/ESXi-Discussions/Unable-to-increase-disk-Space/td-p/397823
Co-authored-by: SadiJr <[email protected]>
---
.../hypervisor/vmware/resource/VmwareResource.java | 51 ++++++++++------------
.../main/java/com/cloud/vm/UserVmManagerImpl.java | 4 +-
2 files changed, 26 insertions(+), 29 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 cce875e..297e534 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
@@ -784,8 +784,10 @@ public class VmwareResource implements
StoragePoolResource, ServerResource, Vmwa
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);
}
@@ -827,11 +829,9 @@ public class VmwareResource implements
StoragePoolResource, ServerResource, Vmwa
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);
}
@@ -894,7 +894,7 @@ public class VmwareResource implements StoragePoolResource,
ServerResource, Vmwa
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);
@@ -909,11 +909,9 @@ public class VmwareResource implements
StoragePoolResource, ServerResource, Vmwa
}
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 {
@@ -924,7 +922,7 @@ public class VmwareResource implements StoragePoolResource,
ServerResource, Vmwa
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);
}
}
}
@@ -932,26 +930,25 @@ public class VmwareResource implements
StoragePoolResource, ServerResource, Vmwa
private VirtualDisk getDiskAfterResizeDiskValidations(VirtualMachineMO
vmMo, String volumePath) throws Exception {
Pair<VirtualDisk, String> 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.");
+ 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);
+ 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 3eb01ea..3df23af 100644
--- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
@@ -4453,8 +4453,8 @@ 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("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 {