From 0de59a856e554e0c8e784ed83b86534176b7716b Mon Sep 17 00:00:00 2001 From: Haomai Wang Date: Tue, 16 Jul 2013 17:04:34 +0800 Subject: [PATCH] Implement extend volume functionality in Sheepdog This implements the extend volume functionality for Sheepdog driver. Change-Id: Id7361e9571742bea210f13ced722829f489e7cb0 Implements: blueprint extend-sheepdog-volume --- cinder/tests/test_sheepdog.py | 17 +++++++++++++++++ cinder/volume/drivers/sheepdog.py | 23 +++++++++++++++++++++-- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/cinder/tests/test_sheepdog.py b/cinder/tests/test_sheepdog.py index b533516c9..9203f19ec 100644 --- a/cinder/tests/test_sheepdog.py +++ b/cinder/tests/test_sheepdog.py @@ -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() diff --git a/cinder/volume/drivers/sheepdog.py b/cinder/volume/drivers/sheepdog.py index cbca091a8..1e610fd0e 100644 --- a/cinder/volume/drivers/sheepdog.py +++ b/cinder/volume/drivers/sheepdog.py @@ -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}) -- 2.45.2