Merge "Add backup export command"

This commit is contained in:
Zuul
2025-07-21 17:55:26 +00:00
committed by Gerrit Code Review
6 changed files with 73 additions and 0 deletions

View File

@@ -716,6 +716,18 @@ class Proxy(proxy.Proxy):
"""
return self._get(_backup.Backup, backup)
def export_record(self, backup):
"""Get a backup
:param backup: The value can be the ID of a backup
or a :class:`~openstack.block_storage.v2.backup.Backup`
instance.
:returns: The backup export record fields
"""
backup = self._get_resource(_backup.Backup, backup)
return backup.export(self)
def find_backup(self, name_or_id, ignore_missing=True, *, details=True):
"""Find a single backup

View File

@@ -164,6 +164,17 @@ class Backup(resource.Resource):
exceptions.raise_from_response(resp)
return resp
def export(self, session):
"""Export the current backup
:param session: openstack session
:return: The backup export record fields
"""
url = utils.urljoin(self.base_path, self.id, "export_record")
resp = session.get(url)
exceptions.raise_from_response(resp)
return resp.json()
def restore(self, session, volume_id=None, name=None):
"""Restore current backup to volume

View File

@@ -1433,6 +1433,18 @@ class Proxy(proxy.Proxy):
backup = self._get_resource(_backup.Backup, backup)
return backup.fetch_metadata(self)
def export_record(self, backup):
"""Get a backup meatadata to export
:param backup: The value can be the ID of a backup
or a :class:`~openstack.block_storage.v2.backup.Backup`
instance.
:returns: The backup export record fields
"""
backup = self._get_resource(_backup.Backup, backup)
return backup.export(self)
def set_backup_metadata(self, backup, **metadata):
"""Update metadata for a backup

View File

@@ -187,6 +187,17 @@ class Backup(resource.Resource, metadata.MetadataMixin):
exceptions.raise_from_response(resp)
return resp
def export(self, session):
"""Export the current backup
:param session: openstack session
:return: The backup export record fields
"""
url = utils.urljoin(self.base_path, self.id, "export_record")
resp = session.get(url)
exceptions.raise_from_response(resp)
return resp
def restore(self, session, volume_id=None, name=None):
"""Restore current backup to volume

View File

@@ -582,6 +582,21 @@ class BlockStorageCloudMixin(openstackcloud._OpenStackCloudMixin):
return backup
def export_volume_backup(self, backup_id):
"""Export a volume backup.
:param backup_id: the ID of the backup.
:returns: The backup export record fields
:raises: :class:`~openstack.exceptions.ResourceTimeout` if wait time
exceeded.
:raises: :class:`~openstack.exceptions.SDKException` on operation
error.
"""
payload = {'backup': backup_id}
return self.block_storage.export_record(**payload)
# TODO(stephenfin): Remove 'filters' in a future major version
def get_volume_backup(self, name_or_id, filters=None):
"""Get a volume backup by name or ID.

View File

@@ -147,6 +147,18 @@ class TestBackup(base.TestCase):
params={},
)
def test_export(self):
sot = backup.Backup(**BACKUP)
create_response = mock.Mock()
create_response.status_code = 200
create_response.json.return_value = {}
create_response.headers = {}
self.sess.get.return_value = create_response
url = f'backups/{FAKE_ID}/export_record'
sot.export(self.sess)
self.sess.get.assert_called_with(url)
def test_restore(self):
sot = backup.Backup(**BACKUP)