From bd401268ac03ceaabd2c92c9ffdddab44c57738a Mon Sep 17 00:00:00 2001 From: zhanggang Date: Fri, 8 Dec 2017 00:34:38 -0500 Subject: [PATCH] Add backup-delete to OSC This change adds database support to the python-openstackclient project for the backup-delete command. The trove command backup-delete is now: openstack database backup delete Change-Id: I869d8649cc83d8c889995a8133e6b91407d7f862 Partially-Implements: trove-support-in-python-openstackclient --- ...backup-delete-to-osc-e302b87809cb814c.yaml | 5 +++ setup.cfg | 1 + troveclient/osc/v1/database_backups.py | 26 ++++++++++++++++ .../tests/osc/v1/test_database_backups.py | 31 +++++++++++++++++++ 4 files changed, 63 insertions(+) create mode 100644 releasenotes/notes/add-backup-delete-to-osc-e302b87809cb814c.yaml diff --git a/releasenotes/notes/add-backup-delete-to-osc-e302b87809cb814c.yaml b/releasenotes/notes/add-backup-delete-to-osc-e302b87809cb814c.yaml new file mode 100644 index 00000000..b5ac0f80 --- /dev/null +++ b/releasenotes/notes/add-backup-delete-to-osc-e302b87809cb814c.yaml @@ -0,0 +1,5 @@ +--- +features: + - | + The command ``trove backup-delete`` is now available to use in + the python-openstackclient CLI as ``openstack database backup delete`` diff --git a/setup.cfg b/setup.cfg index 032800a8..ad8ef730 100644 --- a/setup.cfg +++ b/setup.cfg @@ -30,6 +30,7 @@ openstack.cli.extension = database = troveclient.osc.plugin openstack.database.v1 = + database_backup_delete = troveclient.osc.v1.database_backups:DeleteDatabaseBackup database_backup_list = troveclient.osc.v1.database_backups:ListDatabaseBackups database_backup_show = troveclient.osc.v1.database_backups:ShowDatabaseBackup database_cluster_list = troveclient.osc.v1.database_clusters:ListDatabaseClusters diff --git a/troveclient/osc/v1/database_backups.py b/troveclient/osc/v1/database_backups.py index 89895967..dc12755a 100644 --- a/troveclient/osc/v1/database_backups.py +++ b/troveclient/osc/v1/database_backups.py @@ -13,6 +13,7 @@ """Database v1 Backups action implementations""" from osc_lib.command import command +from osc_lib import exceptions from osc_lib import utils as osc_utils import six @@ -94,3 +95,28 @@ class ShowDatabaseBackup(command.ShowOne): backup = osc_utils.find_resource(database_backups, parsed_args.backup) backup = set_attributes_for_print_detail(backup) return zip(*sorted(six.iteritems(backup))) + + +class DeleteDatabaseBackup(command.Command): + + _description = _("Deletes a backup.") + + def get_parser(self, prog_name): + parser = super(DeleteDatabaseBackup, self).get_parser(prog_name) + parser.add_argument( + 'backup', + metavar='', + help=_('ID or name of the backup.') + ) + 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) diff --git a/troveclient/tests/osc/v1/test_database_backups.py b/troveclient/tests/osc/v1/test_database_backups.py index a674586d..23550122 100644 --- a/troveclient/tests/osc/v1/test_database_backups.py +++ b/troveclient/tests/osc/v1/test_database_backups.py @@ -10,6 +10,11 @@ # License for the specific language governing permissions and limitations # under the License. +import mock + +from osc_lib import exceptions +from osc_lib import utils + from troveclient import common from troveclient.osc.v1 import database_backups from troveclient.tests.osc.v1 import fakes @@ -84,3 +89,29 @@ class TestBackupShow(TestBackups): columns, data = self.cmd.take_action(parsed_args) self.assertEqual(self.columns, columns) self.assertEqual(self.values, data) + + +class TestDatabaseBackupDelete(TestBackups): + + def setUp(self): + 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): + args = ['backup1'] + mock_find.return_value = args[0] + parsed_args = self.check_parser(self.cmd, args, []) + result = 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): + args = ['fakebackup'] + parsed_args = self.check_parser(self.cmd, args, []) + + mock_find.side_effect = exceptions.CommandError + self.assertRaises(exceptions.CommandError, + self.cmd.take_action, + parsed_args)