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.

This commit is contained in:
Likitha Shetty 2013-08-16 14:02:19 +05:30
parent 25f15bd355
commit 2e0ad8e573
1 changed files with 17 additions and 4 deletions

View File

@ -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));