Add the ability to extend a volume size

Change-Id: Ia3a316ec159ced9be0b6770c598aff4ea9ab42ac
Story: 2003539
Task: 24827
This commit is contained in:
Mathieu Gagné 2018-08-23 15:25:36 -04:00
parent d92678a7ac
commit 17578cdb9c
5 changed files with 55 additions and 0 deletions

View File

@ -189,6 +189,18 @@ class Proxy(proxy.Proxy):
"""
self._delete(_volume.Volume, volume, ignore_missing=ignore_missing)
def extend_volume(self, volume, size):
"""Extend a volume
:param volume: The value can be either the ID of a volume or a
:class:`~openstack.volume.v2.volume.Volume` instance.
:param size: New volume size
:returns: None
"""
volume = self._get_resource(_volume.Volume, volume)
volume.extend(self, size)
def backend_pools(self):
"""Returns a generator of cinder Back-end storage pools

View File

@ -13,6 +13,7 @@
from openstack.block_storage import block_storage_service
from openstack import format
from openstack import resource
from openstack import utils
class Volume(resource.Resource):
@ -76,6 +77,20 @@ class Volume(resource.Resource):
#: The timestamp of this volume creation.
created_at = resource.Body("created_at")
def _action(self, session, body):
"""Preform volume actions given the message body."""
# NOTE: This is using Volume.base_path instead of self.base_path
# as both Volume and VolumeDetail instances can be acted on, but
# the URL used is sans any additional /detail/ part.
url = utils.urljoin(Volume.base_path, self.id, 'action')
headers = {'Accept': ''}
return session.post(url, json=body, headers=headers)
def extend(self, session, size):
"""Extend a volume size."""
body = {'os-extend': {'new_size': size}}
self._action(session, body)
class VolumeDetail(Volume):

View File

@ -88,6 +88,12 @@ class TestVolumeProxy(test_proxy_base.TestProxyBase):
def test_volume_delete_ignore(self):
self.verify_delete(self.proxy.delete_volume, volume.Volume, True)
def test_volume_extend(self):
self._verify("openstack.block_storage.v2.volume.Volume.extend",
self.proxy.extend_volume,
method_args=["value", "new-size"],
expected_args=["new-size"])
def test_backend_pools(self):
self.verify_list(self.proxy.backend_pools, stats.Pools,
paginated=False)

View File

@ -11,6 +11,7 @@
# under the License.
import copy
import mock
from openstack.tests.unit import base
@ -63,6 +64,14 @@ VOLUME_DETAIL.update(DETAILS)
class TestVolume(base.TestCase):
def setUp(self):
super(TestVolume, self).setUp()
self.resp = mock.Mock()
self.resp.body = None
self.resp.json = mock.Mock(return_value=self.resp.body)
self.sess = mock.Mock()
self.sess.post = mock.Mock(return_value=self.resp)
def test_basic(self):
sot = volume.Volume(VOLUME)
self.assertEqual("volume", sot.resource_key)
@ -101,6 +110,16 @@ class TestVolume(base.TestCase):
self.assertEqual(VOLUME["size"], sot.size)
self.assertEqual(VOLUME["imageRef"], sot.image_id)
def test_extend(self):
sot = volume.Volume(**VOLUME)
self.assertIsNone(sot.extend(self.sess, '20'))
url = 'volumes/%s/action' % FAKE_ID
body = {"os-extend": {"new_size": "20"}}
headers = {'Accept': ''}
self.sess.post.assert_called_with(url, json=body, headers=headers)
class TestVolumeDetail(base.TestCase):

View File

@ -0,0 +1,3 @@
---
features:
- Add the ability to extend a volume size with extend_volume method.