You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by bf...@apache.org on 2013/02/07 21:04:12 UTC
[21/51] [abbrv] git commit: refs/heads/ui-plugins - Summary: Add
missing ResizeVolumeCommand in VmwareResource.java
Summary: Add missing ResizeVolumeCommand in VmwareResource.java
Submitted-by: hongtu_zang <ho...@tcloudcomputing.com>
Signed-off-by: Marcus Sorensen <ma...@betterservers.com>
Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/c5185c09
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/c5185c09
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/c5185c09
Branch: refs/heads/ui-plugins
Commit: c5185c09efd8747f22e1ed4268cea3d037d6fde6
Parents: 6e4aeea
Author: Marcus Sorensen <ma...@betterservers.com>
Authored: Wed Feb 6 07:52:37 2013 -0700
Committer: Marcus Sorensen <ma...@betterservers.com>
Committed: Wed Feb 6 07:52:37 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/c5185c09/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/c5185c09/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) {