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
:noindex:
:members: create_volume, delete_volume, get_volume, find_volume,
volumes, get_volume_metadata, set_volume_metadata,
:members: create_volume, delete_volume, update_volume, get_volume,
find_volume, volumes, get_volume_metadata, set_volume_metadata,
delete_volume_metadata, extend_volume, set_volume_readonly,
retype_volume, set_volume_bootable_status, reset_volume_status,
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.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):
"""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):
def setUp(self):
super(TestVolume, self).setUp()
super().setUp()
if not self.user_cloud.has_service('block-storage'):
self.skipTest('block-storage service not supported by cloud')
self.VOLUME_NAME = self.getUniqueString()
self.VOLUME_ID = None
volume_name = self.getUniqueString()
volume = self.user_cloud.block_storage.create_volume(
name=self.VOLUME_NAME,
size=1)
self.volume = self.user_cloud.block_storage.create_volume(
name=volume_name,
size=1,
)
self.user_cloud.block_storage.wait_for_status(
volume,
self.volume,
status='available',
failures=['error'],
interval=2,
wait=self._wait_for_timeout)
assert isinstance(volume, _volume.Volume)
self.assertEqual(self.VOLUME_NAME, volume.name)
self.VOLUME_ID = volume.id
wait=self._wait_for_timeout,
)
self.assertIsInstance(self.volume, _volume.Volume)
self.assertEqual(volume_name, self.volume.name)
def tearDown(self):
sot = self.user_cloud.block_storage.delete_volume(
self.VOLUME_ID,
ignore_missing=False)
self.assertIsNone(sot)
super(TestVolume, self).tearDown()
self.user_cloud.block_storage.delete_volume(self.volume)
super().tearDown()
def test_get(self):
sot = self.user_cloud.block_storage.get_volume(self.VOLUME_ID)
self.assertEqual(self.VOLUME_NAME, sot.name)
def test_volume(self):
# get
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.