-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviews.apache.org/r/7099/
-----------------------------------------------------------

Review request for cloudstack.


Description
-------

Initial implementation of resize volumes. Works only for KVM but can be easily 
used to add in other hypervisors. Works with local,sharedmountpoint,NFS,and 
CLVM storage. This is a significant chunk of code and my first attempt at a new 
API call so please let me know if there are any issues with where/how things 
are done.

This KVM implementation includes a host script "resizevolume.sh" because of 
several current limitations. 1) we don't seem to have java bindings for 
virStorageVolResize() or virDomainBlockResize(), and even if we did, 
virStorageVolResize() doesn't work for logical volume pools. It will presumably 
be awhile before that's patched and available on current distros.

New API call is 'resizeVolume', with parameters: 

'id' for volume id

'size' for new size, accepts things like 10G, 10240M, 10485760K, 10737418240B 
or 10737418240

'shrinkok' this one is a boolean that confirms the user is ok with the volume 
shrinking. I did this because it seems reasonable that someone might want to 
give back storage, and since it's potentially dangerous (users need to free up 
the end of the block device that they want to give back) there needs to be some 
sort of signoff. This can be disabled/removed if others think it's too much of 
a liability. The code checks size twice, comparing the requested size once 
against what we think the volume size is per database, and once again comparing 
the actual qcow2/lv size against the requested size, both times ensuring that 
shrinkok is true before continuing.

If the resize succeeds, but libvirt fails to live update qemu of the new size 
(whether due to bug, non-virtio disks, or something else), there's currently no 
indication other than that the API call returns the new size as seen from 
libvirt, which itself should be an indication that a powercycle is needed if 
the API call succeeds, the size is what was requested, and the host isn't 
seeing the new size. Perhaps a field should be added, like 
'rebootrequired:true' to make it easy.

One thing I haven't tackled at all is how to handle the service offering 
fields.  If someone has a service offering with a static 5GB discription like 
the default storage offerings have, that won't change. Suggestions welcome. 
Should we update the service offering to custom, or could that mess up other 
things like tags?


Diffs
-----

  api/src/com/cloud/agent/api/storage/ResizeVolumeAnswer.java e69de29 
  api/src/com/cloud/agent/api/storage/ResizeVolumeCommand.java e69de29 
  api/src/com/cloud/api/ApiConstants.java 067ddf7 
  api/src/com/cloud/api/commands/ResizeVolumeCmd.java e69de29 
  api/src/com/cloud/event/EventTypes.java e84a403 
  api/src/com/cloud/storage/StorageService.java 4fb3b55 
  api/src/com/cloud/storage/Volume.java 6e8e48e 
  client/tomcatconf/commands.properties.in e233694 
  
plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
 9312519 
  scripts/storage/qcow2/resizevolume.sh e69de29 
  server/src/com/cloud/storage/StorageManagerImpl.java 83b2846 

Diff: https://reviews.apache.org/r/7099/diff/


Testing
-------

Tested CLVM,NFS,local,sharedmountpoint, qcow2 and lvm formats

create test volumes on above listed pools, attach to VM instance

within instance, format as ext4, populate with files, grow, resize filesystem: 
pass

within instance, format as ext4, populate with files, shrink filesystem, shrink 
volume, unmount, fsck, remount: pass

try passing bad arguments to API call fails as expected

try resizing as wrong user fails as expected

force resizevolume.sh to fail through various means bubbles the error up as 
expected, resets the volume state to Ready


Thanks,

Marcus Sorensen

Reply via email to