Merge "volume: Add backup metadata helpers"

This commit is contained in:
Zuul 2025-03-27 23:40:56 +00:00 committed by Gerrit Code Review
commit 1519ba0ec7
9 changed files with 99 additions and 8 deletions

View File

@ -42,7 +42,6 @@ class Backup(resource.Resource):
allow_create = True
allow_delete = True
allow_list = True
allow_get = True
#: Properties
#: backup availability zone

View File

@ -1395,6 +1395,63 @@ class Proxy(proxy.Proxy):
backup = self._get_resource(_backup.Backup, backup)
backup.force_delete(self)
def update_backup(self, backup, **attrs):
"""Update a backup
:param backup: Either the ID of a backup or a
:class:`~openstack.block_storage.v3.backup.Backup`.
:param dict attrs: The attributes to update on the volume.
:returns: The updated backup
:rtype: :class:`~openstack.block_storage.v3.backup.Backup`
"""
return self._update(_backup.Backup, backup, **attrs)
def get_backup_metadata(self, backup):
"""Return a dictionary of metadata for a backup
:param backup: Either the ID of a backup or a
:class:`~openstack.block_storage.v3.backup.Backup`.
:returns: A :class:`~openstack.block_storage.v3.backup.Backup` with the
backup's metadata.
:rtype: :class:`~openstack.block_storage.v3.backup.Backup`
"""
backup = self._get_resource(_backup.Backup, backup)
return backup.fetch_metadata(self)
def set_backup_metadata(self, backup, **metadata):
"""Update metadata for a backup
:param backup: Either the ID of a backup or a
:class:`~openstack.block_storage.v3.backup.Backup`.
:param metadata: Key/value pairs to be updated in the backup's
metadata. No other metadata is modified by this call.
:returns: A :class:`~openstack.block_storage.v3.backup.Backup` with the
backup's metadata.
:rtype: :class:`~openstack.block_storage.v3.backup.Backup`
"""
backup = self._get_resource(_backup.Backup, backup)
return backup.set_metadata(self, metadata=metadata)
def delete_backup_metadata(self, backup, keys=None):
"""Delete metadata for a backup
:param backup: Either the ID of a backup or a
:class:`~openstack.block_storage.v3.backup.Backup`.
:param list keys: The keys to delete. If left empty complete
metadata will be removed.
:rtype: ``None``
"""
backup = self._get_resource(_backup.Backup, backup)
if keys is not None:
for key in keys:
backup.delete_metadata_item(self, key)
else:
backup.delete_metadata(self)
# ====== BACKUP ACTIONS ======
def restore_backup(self, backup, volume_id=None, name=None):
"""Restore a Backup to volume

View File

@ -27,7 +27,6 @@ class Attachment(resource.Resource):
allow_delete = True
allow_commit = True
allow_list = True
allow_get = True
allow_fetch = True
_max_microversion = "3.54"

View File

@ -12,13 +12,14 @@
import warnings
from openstack.common import metadata
from openstack import exceptions
from openstack import resource
from openstack import utils
from openstack import warnings as os_warnings
class Backup(resource.Resource):
class Backup(resource.Resource, metadata.MetadataMixin):
"""Volume Backup"""
resource_key = "backup"
@ -46,8 +47,8 @@ class Backup(resource.Resource):
allow_fetch = True
allow_create = True
allow_delete = True
allow_commit = True
allow_list = True
allow_get = True
#: Properties
#: backup availability zone

View File

@ -25,7 +25,6 @@ class Transfer(resource.Resource):
allow_delete = True
allow_fetch = True
allow_list = True
allow_get = True
# Properties
#: UUID of the transfer.

View File

@ -61,7 +61,6 @@ class TestBackup(base.TestCase):
self.assertTrue(sot.allow_create)
self.assertTrue(sot.allow_delete)
self.assertTrue(sot.allow_list)
self.assertTrue(sot.allow_get)
self.assertTrue(sot.allow_fetch)
self.assertDictEqual(

View File

@ -90,7 +90,6 @@ class TestAttachment(base.TestCase):
self.assertTrue(sot.allow_create)
self.assertTrue(sot.allow_delete)
self.assertTrue(sot.allow_list)
self.assertTrue(sot.allow_get)
self.assertTrue(sot.allow_commit)
self.assertIsNotNone(sot._max_microversion)

View File

@ -65,8 +65,8 @@ class TestBackup(base.TestCase):
self.assertTrue(sot.allow_create)
self.assertTrue(sot.allow_delete)
self.assertTrue(sot.allow_list)
self.assertTrue(sot.allow_get)
self.assertTrue(sot.allow_fetch)
self.assertTrue(sot.allow_commit)
self.assertIsNotNone(sot._max_microversion)
self.assertDictEqual(

View File

@ -117,6 +117,9 @@ class TestVolume(TestVolumeProxy):
expected_kwargs={"params": {"cascade": False, "force": True}},
)
def test_volume_update(self):
self.verify_update(self.proxy.update_volume, volume.Volume)
def test_get_volume_metadata(self):
self._verify(
"openstack.block_storage.v3.volume.Volume.fetch_metadata",
@ -745,6 +748,9 @@ class TestBackup(TestVolumeProxy):
expected_args=[self.proxy],
)
def test_backup_update(self):
self.verify_update(self.proxy.update_backup, backup.Backup)
def test_backup_create_attrs(self):
# NOTE: mock has_service
self.proxy._connection = mock.Mock()
@ -772,6 +778,38 @@ class TestBackup(TestVolumeProxy):
expected_args=[self.proxy, "new_status"],
)
def test_backup_get_metadata(self):
self._verify(
"openstack.block_storage.v3.backup.Backup.fetch_metadata",
self.proxy.get_backup_metadata,
method_args=["value"],
expected_args=[self.proxy],
expected_result=volume.Volume(id="value", metadata={}),
)
def test_backup_set_metadata(self):
kwargs = {"a": "1", "b": "2"}
id = "an_id"
self._verify(
"openstack.block_storage.v3.backup.Backup.set_metadata",
self.proxy.set_backup_metadata,
method_args=[id],
method_kwargs=kwargs,
method_result=volume.Volume.existing(id=id, metadata=kwargs),
expected_args=[self.proxy],
expected_kwargs={'metadata': kwargs},
expected_result=volume.Volume.existing(id=id, metadata=kwargs),
)
def test_backup_delete_metadata(self):
self._verify(
"openstack.block_storage.v3.backup.Backup.delete_metadata_item",
self.proxy.delete_backup_metadata,
expected_result=None,
method_args=["value", ["key"]],
expected_args=[self.proxy, "key"],
)
class TestSnapshot(TestVolumeProxy):
def test_snapshot_get(self):