Merge "Add set_readonly_volume to BlockStorageCloudMixin"
This commit is contained in:
@@ -384,6 +384,34 @@ class Proxy(_base_proxy.BaseBlockStorageProxy):
|
|||||||
volume = self._get_resource(_volume.Volume, volume)
|
volume = self._get_resource(_volume.Volume, volume)
|
||||||
volume.extend(self, size)
|
volume.extend(self, size)
|
||||||
|
|
||||||
|
def set_volume_readonly(self, volume, readonly=True):
|
||||||
|
"""Set a volume's read-only flag.
|
||||||
|
|
||||||
|
:param name_or_id: Name, unique ID of the volume or a volume dict.
|
||||||
|
:param bool readonly: Whether the volume should be a read-only volume
|
||||||
|
or not
|
||||||
|
|
||||||
|
:raises: OpenStackCloudTimeout if wait time exceeded.
|
||||||
|
:raises: OpenStackCloudException on operation error.
|
||||||
|
"""
|
||||||
|
volume = self._get_resource(_volume.Volume, volume)
|
||||||
|
volume.set_readonly(self, readonly)
|
||||||
|
|
||||||
|
def retype_volume(self, volume, new_type, migration_policy="never"):
|
||||||
|
"""Retype the volume.
|
||||||
|
|
||||||
|
:param name_or_id: Name, unique ID of the volume or a volume dict.
|
||||||
|
:param new_type: The new volume type that volume is changed with.
|
||||||
|
:param migration_policy: Specify if the volume should be migrated when
|
||||||
|
it is re-typed. Possible values are on-demand
|
||||||
|
or never. Default: never.
|
||||||
|
|
||||||
|
:raises: OpenStackCloudTimeout if wait time exceeded.
|
||||||
|
:raises: OpenStackCloudException on operation error.
|
||||||
|
"""
|
||||||
|
volume = self._get_resource(_volume.Volume, volume)
|
||||||
|
volume.retype(self, new_type, migration_policy)
|
||||||
|
|
||||||
def backend_pools(self):
|
def backend_pools(self):
|
||||||
"""Returns a generator of cinder Back-end storage pools
|
"""Returns a generator of cinder Back-end storage pools
|
||||||
|
|
||||||
|
@@ -114,5 +114,10 @@ class Volume(resource.Resource):
|
|||||||
body = {'os-extend': {'new_size': size}}
|
body = {'os-extend': {'new_size': size}}
|
||||||
self._action(session, body)
|
self._action(session, body)
|
||||||
|
|
||||||
|
def set_readonly(self, session, readonly):
|
||||||
|
"""Set volume readonly flag"""
|
||||||
|
body = {'os-update_readonly_flag': {'readonly': readonly}}
|
||||||
|
self._action(session, body)
|
||||||
|
|
||||||
|
|
||||||
VolumeDetail = Volume
|
VolumeDetail = Volume
|
||||||
|
@@ -156,6 +156,18 @@ class TestVolumeProxy(test_proxy_base.TestProxyBase):
|
|||||||
method_args=["value", "new-size"],
|
method_args=["value", "new-size"],
|
||||||
expected_args=["new-size"])
|
expected_args=["new-size"])
|
||||||
|
|
||||||
|
def test_volume_set_readonly_no_argument(self):
|
||||||
|
self._verify("openstack.block_storage.v3.volume.Volume.set_readonly",
|
||||||
|
self.proxy.set_volume_readonly,
|
||||||
|
method_args=["value"],
|
||||||
|
expected_args=[True])
|
||||||
|
|
||||||
|
def test_volume_set_readonly_false(self):
|
||||||
|
self._verify("openstack.block_storage.v3.volume.Volume.set_readonly",
|
||||||
|
self.proxy.set_volume_readonly,
|
||||||
|
method_args=["value", False],
|
||||||
|
expected_args=[False])
|
||||||
|
|
||||||
def test_backend_pools(self):
|
def test_backend_pools(self):
|
||||||
self.verify_list(self.proxy.backend_pools, stats.Pools)
|
self.verify_list(self.proxy.backend_pools, stats.Pools)
|
||||||
|
|
||||||
|
@@ -127,3 +127,23 @@ class TestVolume(base.TestCase):
|
|||||||
body = {"os-extend": {"new_size": "20"}}
|
body = {"os-extend": {"new_size": "20"}}
|
||||||
headers = {'Accept': ''}
|
headers = {'Accept': ''}
|
||||||
self.sess.post.assert_called_with(url, json=body, headers=headers)
|
self.sess.post.assert_called_with(url, json=body, headers=headers)
|
||||||
|
|
||||||
|
def test_set_volume_readonly(self):
|
||||||
|
sot = volume.Volume(**VOLUME)
|
||||||
|
|
||||||
|
self.assertIsNone(sot.set_readonly(self.sess, True))
|
||||||
|
|
||||||
|
url = 'volumes/%s/action' % FAKE_ID
|
||||||
|
body = {'os-update_readonly_flag': {'readonly': True}}
|
||||||
|
headers = {'Accept': ''}
|
||||||
|
self.sess.post.assert_called_with(url, json=body, headers=headers)
|
||||||
|
|
||||||
|
def test_set_volume_readonly_false(self):
|
||||||
|
sot = volume.Volume(**VOLUME)
|
||||||
|
|
||||||
|
self.assertIsNone(sot.set_readonly(self.sess, False))
|
||||||
|
|
||||||
|
url = 'volumes/%s/action' % FAKE_ID
|
||||||
|
body = {'os-update_readonly_flag': {'readonly': False}}
|
||||||
|
headers = {'Accept': ''}
|
||||||
|
self.sess.post.assert_called_with(url, json=body, headers=headers)
|
||||||
|
Reference in New Issue
Block a user