Client support for export and import backup service metadata
Add client code to a new admin API for backup-export and backup-import allowing an admin to copy the backup metadata details. client code for https://review.openstack.org/#/c/69351/ blueprint cinder-backup-recover-api DocImpact new admin API calls backup-import and backup-export Change-Id: Id306fc9cf562a87bb6a36eae692852eefc592b74
This commit is contained in:
parent
7914e46b03
commit
c48e41b8b7
cinderclient
@ -572,6 +572,27 @@ class FakeHTTPClient(base_client.HTTPClient):
|
||||
return (200, {},
|
||||
{'restore': _stub_restore()})
|
||||
|
||||
def get_backups_76a17945_3c6f_435c_975b_b5685db10b62_export_record(self,
|
||||
**kw):
|
||||
return (200,
|
||||
{},
|
||||
{'backup-record': {'backup_service': 'fake-backup-service',
|
||||
'backup_url': 'fake-backup-url'}})
|
||||
|
||||
def get_backups_1234_export_record(self, **kw):
|
||||
return (200,
|
||||
{},
|
||||
{'backup-record': {'backup_service': 'fake-backup-service',
|
||||
'backup_url': 'fake-backup-url'}})
|
||||
|
||||
def post_backups_import_record(self, **kw):
|
||||
base_uri = 'http://localhost:8776'
|
||||
tenant_id = '0fa851f6668144cf9cd8c8419c1646c1'
|
||||
backup1 = '76a17945-3c6f-435c-975b-b5685db10b62'
|
||||
return (200,
|
||||
{},
|
||||
{'backup': _stub_backup(backup1, base_uri, tenant_id)})
|
||||
|
||||
#
|
||||
# QoSSpecs
|
||||
#
|
||||
|
@ -113,6 +113,16 @@ class ShellTest(utils.TestCase):
|
||||
self.run_command('backup-restore 1234')
|
||||
self.assert_called('POST', '/backups/1234/restore')
|
||||
|
||||
def test_record_export(self):
|
||||
self.run_command('backup-export 1234')
|
||||
self.assert_called('GET', '/backups/1234/export_record')
|
||||
|
||||
def test_record_import(self):
|
||||
self.run_command('backup-import fake.driver URL_STRING')
|
||||
expected = {'backup-record': {'backup_service': 'fake.driver',
|
||||
'backup_url': 'URL_STRING'}}
|
||||
self.assert_called('POST', '/backups/import_record', expected)
|
||||
|
||||
def test_snapshot_list_filter_volume_id(self):
|
||||
self.run_command('snapshot-list --volume-id=1234')
|
||||
self.assert_called('GET', '/snapshots/detail?volume_id=1234')
|
||||
|
@ -51,3 +51,17 @@ class VolumeBackupsTest(utils.TestCase):
|
||||
backup_id = '76a17945-3c6f-435c-975b-b5685db10b62'
|
||||
cs.restores.restore(backup_id)
|
||||
cs.assert_called('POST', '/backups/%s/restore' % backup_id)
|
||||
|
||||
def test_record_export(self):
|
||||
backup_id = '76a17945-3c6f-435c-975b-b5685db10b62'
|
||||
cs.backups.export_record(backup_id)
|
||||
cs.assert_called('GET',
|
||||
'/backups/%s/export_record' % backup_id)
|
||||
|
||||
def test_record_import(self):
|
||||
backup_service = 'fake-backup-service'
|
||||
backup_url = 'fake-backup-url'
|
||||
expected_body = {'backup-record': {'backup_service': backup_service,
|
||||
'backup_url': backup_url}}
|
||||
cs.backups.import_record(backup_service, backup_url)
|
||||
cs.assert_called('POST', '/backups/import_record', expected_body)
|
||||
|
@ -1002,6 +1002,28 @@ def do_backup_restore(cs, args):
|
||||
cs.restores.restore(args.backup, volume_id)
|
||||
|
||||
|
||||
@utils.arg('backup', metavar='<backup>',
|
||||
help='ID of the backup to export.')
|
||||
@utils.service_type('volumev2')
|
||||
def do_backup_export(cs, args):
|
||||
"""Export backup metadata record."""
|
||||
info = cs.backups.export_record(args.backup)
|
||||
utils.print_dict(info)
|
||||
|
||||
|
||||
@utils.arg('backup_service', metavar='<backup_service>',
|
||||
help='Backup service to use for importing the backup.')
|
||||
@utils.arg('backup_url', metavar='<backup_url>',
|
||||
help='Backup URL for importing the backup metadata.')
|
||||
@utils.service_type('volumev2')
|
||||
def do_backup_import(cs, args):
|
||||
"""Import backup metadata record."""
|
||||
info = cs.backups.import_record(args.backup_service, args.backup_url)
|
||||
info.pop('links', None)
|
||||
|
||||
utils.print_dict(info)
|
||||
|
||||
|
||||
@utils.arg('volume', metavar='<volume>',
|
||||
help='Name or ID of the volume to transfer.')
|
||||
@utils.arg('--name',
|
||||
|
@ -74,3 +74,26 @@ class VolumeBackupManager(base.ManagerWithFind):
|
||||
:param backup: The :class:`VolumeBackup` to delete.
|
||||
"""
|
||||
self._delete("/backups/%s" % base.getid(backup))
|
||||
|
||||
def export_record(self, backup_id):
|
||||
"""Export volume backup metadata record.
|
||||
|
||||
:param backup_id: The ID of the backup to export.
|
||||
:rtype: :class:`VolumeBackup`
|
||||
"""
|
||||
resp, body = \
|
||||
self.api.client.get("/backups/%s/export_record" % backup_id)
|
||||
return body['backup-record']
|
||||
|
||||
def import_record(self, backup_service, backup_url):
|
||||
"""Export volume backup metadata record.
|
||||
|
||||
:param backup_service: Backup service to use for importing the backup
|
||||
:param backup_urlBackup URL for importing the backup metadata
|
||||
:rtype: :class:`VolumeBackup`
|
||||
"""
|
||||
body = {'backup-record': {'backup_service': backup_service,
|
||||
'backup_url': backup_url}}
|
||||
self.run_hooks('modify_body_for_update', body, 'backup-record')
|
||||
resp, body = self.api.client.post("/backups/import_record", body=body)
|
||||
return body['backup']
|
||||
|
Loading…
x
Reference in New Issue
Block a user