block storage: Add update_volume proxy method

Noticed during a recent email exchange [1].

[1] http://lists.openstack.org/pipermail/openstack-discuss/2022-June/029325.html

Change-Id: If67d0d2a01f691cc837a3f005711638056e735ec
Signed-off-by: Stephen Finucane <stephenfin@redhat.com>
This commit is contained in:
Stephen Finucane 2022-06-30 12:23:33 +01:00
parent 2b7469cc85
commit bf6563e97f
4 changed files with 58 additions and 21 deletions

View File

@ -17,8 +17,8 @@ Volume Operations
.. autoclass:: openstack.block_storage.v3._proxy.Proxy .. autoclass:: openstack.block_storage.v3._proxy.Proxy
:noindex: :noindex:
:members: create_volume, delete_volume, get_volume, find_volume, :members: create_volume, delete_volume, update_volume, get_volume,
volumes, get_volume_metadata, set_volume_metadata, find_volume, volumes, get_volume_metadata, set_volume_metadata,
delete_volume_metadata, extend_volume, set_volume_readonly, delete_volume_metadata, extend_volume, set_volume_readonly,
retype_volume, set_volume_bootable_status, reset_volume_status, retype_volume, set_volume_bootable_status, reset_volume_status,
revert_volume_to_snapshot, attach_volume, detach_volume, revert_volume_to_snapshot, attach_volume, detach_volume,

View File

@ -519,6 +519,18 @@ class Proxy(_base_proxy.BaseBlockStorageProxy):
volume = self._get_resource(_volume.Volume, volume) volume = self._get_resource(_volume.Volume, volume)
volume.force_delete(self) volume.force_delete(self)
def update_volume(self, volume, **attrs):
"""Update a volume
:param volume: Either the ID of a volume or a
:class:`~openstack.block_storage.v3.volume.Volume` instance.
:param dict attrs: The attributes to update on the volume.
:returns: The updated volume
:rtype: :class:`~openstack.block_storage.v3.volume.Volume`
"""
return self._update(_volume.Volume, volume, **attrs)
def get_volume_metadata(self, volume): def get_volume_metadata(self, volume):
"""Return a dictionary of metadata for a volume """Return a dictionary of metadata for a volume

View File

@ -17,34 +17,55 @@ from openstack.tests.functional.block_storage.v3 import base
class TestVolume(base.BaseBlockStorageTest): class TestVolume(base.BaseBlockStorageTest):
def setUp(self): def setUp(self):
super(TestVolume, self).setUp() super().setUp()
if not self.user_cloud.has_service('block-storage'): if not self.user_cloud.has_service('block-storage'):
self.skipTest('block-storage service not supported by cloud') self.skipTest('block-storage service not supported by cloud')
self.VOLUME_NAME = self.getUniqueString() volume_name = self.getUniqueString()
self.VOLUME_ID = None
volume = self.user_cloud.block_storage.create_volume( self.volume = self.user_cloud.block_storage.create_volume(
name=self.VOLUME_NAME, name=volume_name,
size=1) size=1,
)
self.user_cloud.block_storage.wait_for_status( self.user_cloud.block_storage.wait_for_status(
volume, self.volume,
status='available', status='available',
failures=['error'], failures=['error'],
interval=2, interval=2,
wait=self._wait_for_timeout) wait=self._wait_for_timeout,
assert isinstance(volume, _volume.Volume) )
self.assertEqual(self.VOLUME_NAME, volume.name) self.assertIsInstance(self.volume, _volume.Volume)
self.VOLUME_ID = volume.id self.assertEqual(volume_name, self.volume.name)
def tearDown(self): def tearDown(self):
sot = self.user_cloud.block_storage.delete_volume( self.user_cloud.block_storage.delete_volume(self.volume)
self.VOLUME_ID, super().tearDown()
ignore_missing=False)
self.assertIsNone(sot)
super(TestVolume, self).tearDown()
def test_get(self): def test_volume(self):
sot = self.user_cloud.block_storage.get_volume(self.VOLUME_ID) # get
self.assertEqual(self.VOLUME_NAME, sot.name) volume = self.user_cloud.block_storage.get_volume(self.volume.id)
self.assertEqual(self.volume.name, volume.name)
# find
volume = self.user_cloud.block_storage.find_volume(self.volume.name)
self.assertEqual(self.volume.id, volume.id)
# list
volumes = self.user_cloud.block_storage.volumes()
# other tests may have created volumes so we don't assert that this is
# the *only* volume present
self.assertIn(self.volume.id, {v.id for v in volumes})
# update
volume_name = self.getUniqueString()
volume_description = self.getUniqueString()
volume = self.user_cloud.block_storage.update_volume(
self.volume,
name=volume_name,
description=volume_description,
)
self.assertIsInstance(volume, _volume.Volume)
volume = self.user_cloud.block_storage.get_volume(self.volume.id)
self.assertEqual(volume_name, volume.name)
self.assertEqual(volume_description, volume.description)

View File

@ -0,0 +1,4 @@
---
features:
- |
Added ``update_volume`` to the block storage proxy.