Updated Branches:
refs/heads/4.2 416130306 -> 8df22d181
CLOUDSTACK-4139: [VMWARE][ZWPS] Failed to resize the volumes which are created
from snapshot
Description:
Support offline volume resize on ESX by creating a worker VM
to attach the unattached volume to and then resize it.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/c850f0a0
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/c850f0a0
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/c850f0a0
Branch: refs/heads/4.2
Commit: c850f0a0e3749090fe5ed7d5c410bf10d06b2281
Parents: 4161303
Author: Vijayendra Bhamidipati <[email protected]>
Authored: Tue Aug 13 12:44:44 2013 -0700
Committer: Vijayendra Bhamidipati <[email protected]>
Committed: Tue Aug 13 12:46:35 2013 -0700
----------------------------------------------------------------------
.../vmware/resource/VmwareResource.java | 41 ++++++++++++++++++--
.../com/cloud/storage/VolumeManagerImpl.java | 4 +-
2 files changed, 40 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c850f0a0/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
----------------------------------------------------------------------
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 c6320f9..2906c5a 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
@@ -610,11 +610,39 @@ public class VmwareResource implements
StoragePoolResource, ServerResource, Vmwa
String path = cmd.getPath();
String vmName = cmd.getInstanceName();
long newSize = cmd.getNewSize()/1024;
+ boolean useWorkerVm = false;
+
+ VmwareHypervisorHost hyperHost = getHyperHost(getServiceContext());
+ String poolId = cmd.getPoolUuid();
+ VirtualMachineMO vmMo = null;
+ DatastoreMO dsMo = null;
+ ManagedObjectReference morDS = null;
+ String vmdkDataStorePath = null;
+
try {
- VmwareHypervisorHost hyperHost = getHyperHost(getServiceContext());
+ if (vmName.equalsIgnoreCase("none")) {
+ // we need to spawn a worker VM to attach the volume to and
+ // resize the volume.
+ useWorkerVm = true;
+ vmName = this.getWorkerName(getServiceContext(), cmd, 0);
+
+ morDS =
HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(hyperHost, poolId);
+ dsMo = new DatastoreMO(hyperHost.getContext(), morDS);
+ s_logger.info("Create worker VM " + vmName);
+ vmMo = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo,
vmName);
+ if (vmMo == null) {
+ throw new Exception("Unable to create a worker VM for
volume resize");
+ }
+
+ synchronized (this) {
+ vmdkDataStorePath =
VmwareStorageLayoutHelper.getLegacyDatastorePathFromVmdkFileName(dsMo, path +
".vmdk");
+ vmMo.attachDisk(new String[] { vmdkDataStorePath }, morDS);
+ }
+ }
+
// find VM through datacenter (VM is not at the target host yet)
- VirtualMachineMO vmMo = hyperHost.findVmOnPeerHyperHost(vmName);
+ vmMo = hyperHost.findVmOnPeerHyperHost(vmName);
if (vmMo == null) {
String msg = "VM " + vmName + " does not exist in VMware
datacenter";
s_logger.error(msg);
@@ -642,9 +670,16 @@ public class VmwareResource implements
StoragePoolResource, ServerResource, Vmwa
deviceConfigSpec.setOperation(VirtualDeviceConfigSpecOperation.EDIT);
vmConfigSpec.getDeviceChange().add(deviceConfigSpec);
if (!vmMo.configureVm(vmConfigSpec)) {
+ if (useWorkerVm == true) {
+ vmMo.detachDisk(vmdkDataStorePath, false);
+ vmMo.destroy();
+ }
throw new Exception("Failed to configure VM to resize disk.
vmName: " + vmName);
}
-
+ if (useWorkerVm == true) {
+ vmMo.detachDisk(vmdkDataStorePath, false);
+ vmMo.destroy();
+ }
return new ResizeVolumeAnswer(cmd, true, "success", newSize*1024);
} catch (Exception e) {
s_logger.error("Unable to resize volume",e);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c850f0a0/server/src/com/cloud/storage/VolumeManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/storage/VolumeManagerImpl.java
b/server/src/com/cloud/storage/VolumeManagerImpl.java
index 8d2eb56..f7c0f86 100644
--- a/server/src/com/cloud/storage/VolumeManagerImpl.java
+++ b/server/src/com/cloud/storage/VolumeManagerImpl.java
@@ -1096,12 +1096,12 @@ public class VolumeManagerImpl extends ManagerBase
implements VolumeManager {
"Can't resize a volume that has never been attached, not
sure which hypervisor type. Recreate volume to resize.");
}
- /* Only works for KVM/Xen for now */
+ /* Only works for KVM/Xen/VMware for now */
if (_volsDao.getHypervisorType(volume.getId()) != HypervisorType.KVM
&& _volsDao.getHypervisorType(volume.getId()) !=
HypervisorType.XenServer
&& _volsDao.getHypervisorType(volume.getId()) !=
HypervisorType.VMware) {
throw new InvalidParameterValueException(
- "Cloudstack currently only supports volumes marked as KVM
or XenServer hypervisor for resize");
+ "Cloudstack currently only supports volumes marked as KVM
or XenServer or ESX hypervisor for resize");
}