From 6b2fad56705b7b5fd256b4db9f078d0c21f64a4f Mon Sep 17 00:00:00 2001 From: Sushil Kumar Date: Thu, 5 Nov 2015 22:19:58 +0000 Subject: [PATCH] Allow use of backup name in trove create 'trove create' only accepts a backup id as a value when restoring an instance from a backup. This change enables the use of the backup name as well. A few minor typos were fixed as well to make the output more consistent. Co-authored-by: Sushil Kumar Co-authored-by: Peter Stachowski Change-Id: I01f9ba96c8bdec5cfa4c4b477eb824b4456774d1 Closes-Bug: #1513636 --- ...ackup-name-in-create-1a9e85978a3ab8bc.yaml | 4 ++++ troveclient/tests/fakes.py | 4 ++++ troveclient/tests/test_v1_shell.py | 24 +++++++++++++++++++ troveclient/v1/shell.py | 16 ++++++------- 4 files changed, 40 insertions(+), 8 deletions(-) create mode 100644 releasenotes/notes/allow-backup-name-in-create-1a9e85978a3ab8bc.yaml diff --git a/releasenotes/notes/allow-backup-name-in-create-1a9e85978a3ab8bc.yaml b/releasenotes/notes/allow-backup-name-in-create-1a9e85978a3ab8bc.yaml new file mode 100644 index 00000000..33f15240 --- /dev/null +++ b/releasenotes/notes/allow-backup-name-in-create-1a9e85978a3ab8bc.yaml @@ -0,0 +1,4 @@ +--- +fixes: + - Allow use of backup name in trove create + when restoring a backup. diff --git a/troveclient/tests/fakes.py b/troveclient/tests/fakes.py index 6ef23fff..0feed291 100644 --- a/troveclient/tests/fakes.py +++ b/troveclient/tests/fakes.py @@ -509,6 +509,10 @@ class FakeHTTPClient(base_client.HTTPClient): r = {'backup': self.get_backups()[2]['backups'][0]} return (200, {}, r) + def get_backups_bkp_1(self, **kw): + r = {'backup': self.get_backups()[2]['backups'][0]} + return (200, {}, r) + def get_instances_1234_backups(self, **kw): r = {'backups': [self.get_backups()[2]['backups'][0]]} return (200, {}, r) diff --git a/troveclient/tests/test_v1_shell.py b/troveclient/tests/test_v1_shell.py index 11767da7..a99df3e3 100644 --- a/troveclient/tests/test_v1_shell.py +++ b/troveclient/tests/test_v1_shell.py @@ -298,6 +298,30 @@ class ShellTest(utils.TestCase): 'Invalid NIC argument: nic=\'net-id=some-id,port-id=some-id\'', self.run_command, cmd) + def test_boot_restore_by_id(self): + self.run_command('create test-restore-1 1 --size 1 --backup bk_1234') + self.assert_called_anytime( + 'POST', '/instances', + {'instance': { + 'volume': {'size': 1, 'type': None}, + 'flavorRef': 1, + 'name': 'test-restore-1', + 'restorePoint': {'backupRef': 'bk-1234'}, + 'replica_count': 1 + }}) + + def test_boot_restore_by_name(self): + self.run_command('create test-restore-1 1 --size 1 --backup bkp_1') + self.assert_called_anytime( + 'POST', '/instances', + {'instance': { + 'volume': {'size': 1, 'type': None}, + 'flavorRef': 1, + 'name': 'test-restore-1', + 'restorePoint': {'backupRef': 'bk-1234'}, + 'replica_count': 1 + }}) + def test_cluster_create(self): cmd = ('cluster-create test-clstr vertica 7.1 ' '--instance flavor=2,volume=2 ' diff --git a/troveclient/v1/shell.py b/troveclient/v1/shell.py index 1ff50196..d6549ff3 100644 --- a/troveclient/v1/shell.py +++ b/troveclient/v1/shell.py @@ -344,7 +344,7 @@ def do_cluster_shrink(cs, args): @utils.arg('instance', metavar='', - help='ID or name of the instance.') + help='ID or name of the instance.') @utils.service_type('database') def do_delete(cs, args): """Deletes an instance.""" @@ -411,7 +411,7 @@ def do_update(cs, args): help="Volume type. Optional when volume support is enabled.") @utils.arg('flavor', metavar='', - help='Flavor ID or name of the instance.') + help='A flavor name or ID.') @utils.arg('--databases', metavar='', help='Optional list of databases.', nargs="+", default=[]) @@ -421,7 +421,7 @@ def do_update(cs, args): @utils.arg('--backup', metavar='', default=None, - help='A backup ID.') + help='A backup name or ID.') @utils.arg('--availability_zone', metavar='', default=None, @@ -475,7 +475,7 @@ def do_create(cs, args): "type": args.volume_type} restore_point = None if args.backup: - restore_point = {"backupRef": args.backup} + restore_point = {"backupRef": _find_backup(cs, args.backup).id} if args.replica_of: replica_of_instance = _find_instance(cs, args.replica_of) databases = [{'name': value} for value in args.databases] @@ -783,7 +783,7 @@ def do_eject_replica_source(cs, args): # Backup related commands -@utils.arg('backup', metavar='', help='ID of the backup.') +@utils.arg('backup', metavar='', help='ID or name of the backup.') @utils.service_type('database') def do_backup_show(cs, args): """Shows details of a backup.""" @@ -824,7 +824,7 @@ def do_backup_list_instance(cs, args): 'the last ID displayed in the previous run.') @utils.arg('--datastore', metavar='', default=None, - help='Name or ID of the datastore to list backups for.') + help='ID or name of the datastore (to filter backups by).') @utils.service_type('database') def do_backup_list(cs, args): """Lists available backups.""" @@ -929,7 +929,7 @@ def do_database_list(cs, args): @utils.arg('instance', metavar='', - help='ID or name of the instance.') + help='ID or name of the instance.') @utils.arg('database', metavar='', help='Name of the database.') @utils.service_type('database') def do_database_delete(cs, args): @@ -941,7 +941,7 @@ def do_database_delete(cs, args): # User related actions @utils.arg('instance', metavar='', - help='ID or name of the instance.') + help='ID or name of the instance.') @utils.arg('name', metavar='', help='Name of user.') @utils.arg('password', metavar='', help='Password of user.') @utils.arg('--host', metavar='', default=None,