Implement extend volume functionality in Sheepdog

This implements the extend volume functionality for Sheepdog driver.

Change-Id: Id7361e9571742bea210f13ced722829f489e7cb0
Implements: blueprint extend-sheepdog-volume
This commit is contained in:
Haomai Wang 2013-07-16 17:04:34 +08:00
parent 5be685218b
commit 0de59a856e
2 changed files with 38 additions and 2 deletions

View File

@ -23,6 +23,7 @@ import tempfile
from cinder import exception
from cinder.image import image_utils
from cinder import test
from cinder import units
from cinder.volume.drivers.sheepdog import SheepdogDriver
@ -125,3 +126,19 @@ class SheepdogTestCase(test.TestCase):
self.driver.copy_image_to_volume(None, {'name': 'test',
'size': 1},
FakeImageService(), None)
def test_extend_volume(self):
fake_name = u'volume-00000001'
fake_size = '20'
fake_vol = {'project_id': 'testprjid', 'name': fake_name,
'size': fake_size,
'id': 'a720b3c0-d1f0-11e1-9b23-0800200c9a66'}
self.mox.StubOutWithMock(self.driver, '_resize')
size = int(fake_size) * units.GiB
self.driver._resize(fake_vol, size=size)
self.mox.ReplayAll()
self.driver.extend_volume(fake_vol, fake_size)
self.mox.VerifyAll()

View File

@ -27,6 +27,7 @@ from oslo.config import cfg
from cinder import exception
from cinder.image import image_utils
from cinder.openstack.common import log as logging
from cinder import units
from cinder.volume import driver
@ -84,8 +85,10 @@ class SheepdogDriver(driver.VolumeDriver):
if tmp_dir and not os.path.exists(tmp_dir):
os.makedirs(tmp_dir)
def _resize(self, volume):
size = int(volume['size']) * (1024 ** 3)
def _resize(self, volume, size=None):
if not size:
size = int(volume['size']) * units.GiB
self._try_execute('collie', 'vdi', 'resize',
volume['name'], size)
@ -177,3 +180,19 @@ class SheepdogDriver(driver.VolumeDriver):
if refresh:
self._update_volume_stats()
return self._stats
def extend_volume(self, volume, new_size):
"""Extend an Existing Volume."""
old_size = volume['size']
try:
size = int(new_size) * units.GiB
self._resize(volume, size=size)
except Exception:
msg = _('Failed to Extend Volume '
'%(volname)s') % {'volname': volume['name']}
LOG.error(msg)
raise exception.VolumeBackendAPIException(data=msg)
LOG.debug(_("Extend volume from %(old_size) to %(new_size)"),
{'old_size': old_size, 'new_size': new_size})