diff options
author | Lingxian Kong <anlin.kong@gmail.com> | 2021-02-19 10:57:12 +1300 |
---|---|---|
committer | Lingxian Kong <anlin.kong@gmail.com> | 2021-02-19 11:07:23 +1300 |
commit | 4c71809fadc070aa0f1ec3b4082546d4d2cf0d51 (patch) | |
tree | 00ab7422ecaa7e2600627dadaa79f7b271a09972 | |
parent | 8271ba8719db5bba6a1bb45cd7e2f6750ae5f56a (diff) | |
download | python-troveclient-4c71809fadc070aa0f1ec3b4082546d4d2cf0d51.tar.gz |
Bulk backup delete
Change-Id: I100f8a302aeb498e3c0cebd8d36ef5fa437d444d
-rw-r--r-- | releasenotes/notes/wallaby-bulk-backup-delete.yaml | 3 | ||||
-rw-r--r-- | troveclient/osc/v1/database_backups.py | 40 | ||||
-rw-r--r-- | troveclient/tests/osc/v1/test_database_backups.py | 30 |
3 files changed, 53 insertions, 20 deletions
diff --git a/releasenotes/notes/wallaby-bulk-backup-delete.yaml b/releasenotes/notes/wallaby-bulk-backup-delete.yaml new file mode 100644 index 0000000..0ad3f1b --- /dev/null +++ b/releasenotes/notes/wallaby-bulk-backup-delete.yaml @@ -0,0 +1,3 @@ +--- +features: + - Support deleting backups in batch. diff --git a/troveclient/osc/v1/database_backups.py b/troveclient/osc/v1/database_backups.py index 6cfaf8e..f4dd0e2 100644 --- a/troveclient/osc/v1/database_backups.py +++ b/troveclient/osc/v1/database_backups.py @@ -15,8 +15,11 @@ from osc_lib.command import command from osc_lib import exceptions from osc_lib import utils as osc_utils +from oslo_utils import uuidutils from troveclient.i18n import _ +from troveclient.osc.v1 import base +from troveclient import utils as trove_utils def set_attributes_for_print_detail(backup): @@ -169,7 +172,7 @@ class ShowDatabaseBackup(command.ShowOne): return zip(*sorted(backup.items())) -class DeleteDatabaseBackup(command.Command): +class DeleteDatabaseBackup(base.TroveDeleter): _description = _("Deletes a backup.") @@ -177,21 +180,34 @@ class DeleteDatabaseBackup(command.Command): parser = super(DeleteDatabaseBackup, self).get_parser(prog_name) parser.add_argument( 'backup', - metavar='<backup>', - help=_('ID or name of the backup.') + nargs='+', + metavar='backup', + help='Id or name of backup(s).' ) return parser def take_action(self, parsed_args): - database_backups = self.app.client_manager.database.backups - try: - backup = osc_utils.find_resource(database_backups, - parsed_args.backup) - database_backups.delete(backup) - except Exception as e: - msg = (_("Failed to delete backup %(backup)s: %(e)s") - % {'backup': parsed_args.backup, 'e': e}) - raise exceptions.CommandError(msg) + db_backups = self.app.client_manager.database.backups + + # Used for batch deletion + self.delete_func = db_backups.delete + self.resource = 'database backup' + + ids = [] + for backup_id in parsed_args.backup: + if not uuidutils.is_uuid_like(backup_id): + try: + backup_id = trove_utils.get_resource_id_by_name( + db_backups, backup_id + ) + except Exception as e: + msg = ("Failed to get database backup %s, error: %s" % + (backup_id, str(e))) + raise exceptions.CommandError(msg) + + ids.append(backup_id) + + self.delete_resources(ids) class CreateDatabaseBackup(command.ShowOne): diff --git a/troveclient/tests/osc/v1/test_database_backups.py b/troveclient/tests/osc/v1/test_database_backups.py index a552d25..a23622f 100644 --- a/troveclient/tests/osc/v1/test_database_backups.py +++ b/troveclient/tests/osc/v1/test_database_backups.py @@ -14,6 +14,7 @@ from unittest import mock from osc_lib import exceptions from osc_lib import utils +from oslo_utils import uuidutils from troveclient import common from troveclient.osc.v1 import database_backups @@ -181,25 +182,38 @@ class TestDatabaseBackupDelete(TestBackups): super(TestDatabaseBackupDelete, self).setUp() self.cmd = database_backups.DeleteDatabaseBackup(self.app, None) - @mock.patch.object(utils, 'find_resource') - def test_backup_delete(self, mock_find): + @mock.patch("troveclient.utils.get_resource_id_by_name") + def test_backup_delete(self, mock_getid): args = ['backup1'] - mock_find.return_value = args[0] + mock_getid.return_value = args[0] parsed_args = self.check_parser(self.cmd, args, []) - result = self.cmd.take_action(parsed_args) + self.cmd.take_action(parsed_args) self.backup_client.delete.assert_called_with('backup1') - self.assertIsNone(result) - @mock.patch.object(utils, 'find_resource') - def test_backup_delete_with_exception(self, mock_find): + @mock.patch("troveclient.utils.get_resource_id_by_name") + def test_backup_delete_with_exception(self, mock_getid): args = ['fakebackup'] parsed_args = self.check_parser(self.cmd, args, []) - mock_find.side_effect = exceptions.CommandError + mock_getid.side_effect = exceptions.CommandError self.assertRaises(exceptions.CommandError, self.cmd.take_action, parsed_args) + @mock.patch("troveclient.utils.get_resource_id_by_name") + def test_backup_bulk_delete(self, mock_getid): + backup_1 = uuidutils.generate_uuid() + backup_2 = uuidutils.generate_uuid() + mock_getid.return_value = backup_1 + + args = ["fake_backup", backup_2] + parsed_args = self.check_parser(self.cmd, args, []) + self.cmd.take_action(parsed_args) + + mock_getid.assert_called_once_with(self.backup_client, "fake_backup") + calls = [mock.call(backup_1), mock.call(backup_2)] + self.backup_client.delete.assert_has_calls(calls) + class TestBackupCreate(TestBackups): |