Updated Branches: refs/heads/4.1 4d9056c2f -> 87286d054
Summary: Add missing ResizeVolumeCommand in VmwareResource.java Submitted-by: hongtu_zang <[email protected]> Signed-off-by: Marcus Sorensen <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/87286d05 Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/87286d05 Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/87286d05 Branch: refs/heads/4.1 Commit: 87286d0549ea131943998e4756fc6dbe725e7db6 Parents: 4d9056c Author: Marcus Sorensen <[email protected]> Authored: Wed Feb 6 07:52:37 2013 -0700 Committer: Marcus Sorensen <[email protected]> Committed: Wed Feb 6 07:55:11 2013 -0700 ---------------------------------------------------------------------- .../hypervisor/vmware/resource/VmwareResource.java | 52 +++++++++++++++ .../src/com/cloud/storage/StorageManagerImpl.java | 7 +- 2 files changed, 56 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/87286d05/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 a1b1336..841a535 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 @@ -154,6 +154,8 @@ import com.cloud.agent.api.storage.DestroyCommand; import com.cloud.agent.api.storage.PrimaryStorageDownloadAnswer; import com.cloud.agent.api.storage.PrimaryStorageDownloadCommand; import com.cloud.agent.api.to.FirewallRuleTO; +import com.cloud.agent.api.storage.ResizeVolumeAnswer; +import com.cloud.agent.api.storage.ResizeVolumeCommand; import com.cloud.agent.api.to.IpAddressTO; import com.cloud.agent.api.to.NicTO; import com.cloud.agent.api.to.PortForwardingRuleTO; @@ -449,6 +451,8 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa answer = execute((Site2SiteVpnCfgCommand) cmd); } else if (clz == CheckS2SVpnConnectionsCommand.class) { answer = execute((CheckS2SVpnConnectionsCommand) cmd); + } else if (clz == ResizeVolumeCommand.class) { + return execute((ResizeVolumeCommand) cmd); } else { answer = Answer.createUnsupportedCommandAnswer(cmd); } @@ -487,6 +491,54 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa return answer; } + + private Answer execute(ResizeVolumeCommand cmd) { + String path = cmd.getPath(); + String vmName = cmd.getInstanceName(); + long newSize = cmd.getNewSize()/1024; + + try { + VmwareHypervisorHost hyperHost = getHyperHost(getServiceContext()); + ManagedObjectReference morDc = hyperHost.getHyperHostDatacenter(); + // find VM through datacenter (VM is not at the target host yet) + VirtualMachineMO 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); + } + + Pair<VirtualDisk, String> vdisk = vmMo.getDiskDevice(path, false); + if(vdisk == null) { + if(s_logger.isTraceEnabled()) + s_logger.trace("resize volume done (failed)"); + throw new Exception("No such disk device: " + path); + } + VirtualDisk disk = vdisk.first(); + long oldSize = disk.getCapacityInKB(); + 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){ + return new ResizeVolumeAnswer(cmd, true, "success", newSize*1024); + } + disk.setCapacityInKB(newSize); + + VirtualMachineConfigSpec vmConfigSpec = new VirtualMachineConfigSpec(); + VirtualDeviceConfigSpec deviceConfigSpec = new VirtualDeviceConfigSpec(); + deviceConfigSpec.setDevice(disk); + deviceConfigSpec.setOperation(VirtualDeviceConfigSpecOperation.edit); + vmConfigSpec.setDeviceChange(new VirtualDeviceConfigSpec[] { deviceConfigSpec }); + if (!vmMo.configureVm(vmConfigSpec)) { + throw new Exception("Failed to configure VM to resize disk. vmName: " + vmName); + } + + return new ResizeVolumeAnswer(cmd, true, "success", newSize*1024); + } catch (Exception e) { + s_logger.error("Unable to resize volume",e); + String error = "failed to resize volume:" +e; + return new ResizeVolumeAnswer(cmd, false, error ); + } + } protected Answer execute(CheckNetworkCommand cmd) { if (s_logger.isInfoEnabled()) { http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/87286d05/server/src/com/cloud/storage/StorageManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index 45e3a7f..05e0cfe 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -2043,10 +2043,11 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C throw new InvalidParameterValueException("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){ - throw new InvalidParameterValueException("Cloudstack currently only supports volumes marked as KVM or XenServer hypervisor for resize"); + && _volsDao.getHypervisorType(volume.getId()) != HypervisorType.XenServer + && _volsDao.getHypervisorType(volume.getId()) != HypervisorType.VMware){ + throw new InvalidParameterValueException("Cloudstack currently only supports volumes marked as KVM, XenServer or VMware hypervisor for resize"); } if (volume == null) {
