From 2e0ad8e57335ab509ea6bfcb94433751fe4a2096 Mon Sep 17 00:00:00 2001 From: Likitha Shetty Date: Fri, 16 Aug 2013 14:02:19 +0530 Subject: [PATCH] CLOUDSTACK-4352. In VMWare, to resize an offline volume we create a worker vm. When a volume is being shrinked or when it is resized to the same size delete the vm before returning. --- .../vmware/resource/VmwareResource.java | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java index 1ce3d8e49bf..1c5e7b66512 100755 --- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java +++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java @@ -657,6 +657,9 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa } VirtualDisk disk = vdisk.first(); long oldSize = disk.getCapacityInKB(); + if (newSize <= oldSize && useWorkerVm == true) { + deleteWorkerVm(vmMo, vmdkDataStorePath); + } if (newSize < oldSize){ throw new Exception("VMware doesn't support shrinking volume from larger size: " + oldSize+ " MB to a smaller size: " + newSize + " MB"); } else if(newSize == oldSize){ @@ -671,14 +674,12 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa vmConfigSpec.getDeviceChange().add(deviceConfigSpec); if (!vmMo.configureVm(vmConfigSpec)) { if (useWorkerVm == true) { - vmMo.detachDisk(vmdkDataStorePath, false); - vmMo.destroy(); + deleteWorkerVm(vmMo, vmdkDataStorePath); } throw new Exception("Failed to configure VM to resize disk. vmName: " + vmName); } if (useWorkerVm == true) { - vmMo.detachDisk(vmdkDataStorePath, false); - vmMo.destroy(); + deleteWorkerVm(vmMo, vmdkDataStorePath); } return new ResizeVolumeAnswer(cmd, true, "success", newSize*1024); } catch (Exception e) { @@ -688,6 +689,18 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa } } + private void deleteWorkerVm(VirtualMachineMO vmMo, String vmdkDataStorePath) { + try { + if (vmMo != null) { + s_logger.info("Delete worker VM " + vmMo.getVmName()); + vmMo.detachDisk(vmdkDataStorePath, false); + vmMo.destroy(); + } + } catch (Exception e) { + s_logger.error("Unable to destroy worker vm", e); + } + } + protected Answer execute(CheckNetworkCommand cmd) { if (s_logger.isInfoEnabled()) { s_logger.info("Executing resource CheckNetworkCommand " + _gson.toJson(cmd));