summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzhanggang <zhanggang@cmss.chinamobile.com>2017-12-21 21:43:13 -0500
committerzhanggang <zhanggang@cmss.chinamobile.com>2017-12-22 04:06:41 -0500
commit504918fc63233c240c0498f0990b400e8b4eba22 (patch)
treebed9409ac8b6783249a3362eb4b9b93bc81c76d5
parent896e1cb143e3e290141a583d9664eb6c14aa6968 (diff)
downloadpython-troveclient-504918fc63233c240c0498f0990b400e8b4eba22.tar.gz
Add backup-create to OSC
This change adds database support to the python-openstackclient project for the backup-create command. The trove command backup-create is now: openstack database backup create Change-Id: I0dedce04efa9d2af4455bb6a94a96b6cbfc77bab Partially-Implements: blueprint trove-support-in-python-openstackclient
-rw-r--r--releasenotes/notes/add-backup-create-to-osc-c3d257365cf65cae.yaml5
-rw-r--r--setup.cfg1
-rw-r--r--troveclient/osc/v1/database_backups.py53
-rw-r--r--troveclient/tests/osc/v1/test_database_backups.py61
4 files changed, 120 insertions, 0 deletions
diff --git a/releasenotes/notes/add-backup-create-to-osc-c3d257365cf65cae.yaml b/releasenotes/notes/add-backup-create-to-osc-c3d257365cf65cae.yaml
new file mode 100644
index 0000000..9e39b22
--- /dev/null
+++ b/releasenotes/notes/add-backup-create-to-osc-c3d257365cf65cae.yaml
@@ -0,0 +1,5 @@
+---
+features:
+ - |
+ The command ``trove backup-create`` is now available to use in
+ the python-openstackclient CLI as ``openstack database backup create``
diff --git a/setup.cfg b/setup.cfg
index 6e07c5f..5dc2d9c 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -30,6 +30,7 @@ openstack.cli.extension =
database = troveclient.osc.plugin
openstack.database.v1 =
+ database_backup_create= troveclient.osc.v1.database_backups:CreateDatabaseBackup
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
diff --git a/troveclient/osc/v1/database_backups.py b/troveclient/osc/v1/database_backups.py
index dc12755..110d32e 100644
--- a/troveclient/osc/v1/database_backups.py
+++ b/troveclient/osc/v1/database_backups.py
@@ -120,3 +120,56 @@ class DeleteDatabaseBackup(command.Command):
msg = (_("Failed to delete backup %(backup)s: %(e)s")
% {'backup': parsed_args.backup, 'e': e})
raise exceptions.CommandError(msg)
+
+
+class CreateDatabaseBackup(command.ShowOne):
+
+ _description = _("Creates a backup of an instance.")
+
+ def get_parser(self, prog_name):
+ parser = super(CreateDatabaseBackup, self).get_parser(prog_name)
+ parser.add_argument(
+ 'instance',
+ metavar='<instance>',
+ help=_('ID or name of the instance.')
+ )
+ parser.add_argument(
+ 'name',
+ metavar='<name>',
+ help=_('Name of the backup.')
+ )
+ parser.add_argument(
+ '--description',
+ metavar='<description>',
+ default=None,
+ help=_('An optional description for the backup.')
+ )
+ parser.add_argument(
+ '--parent',
+ metavar='<parent>',
+ default=None,
+ help=_('Optional ID of the parent backup to perform an'
+ ' incremental backup from.')
+ )
+ parser.add_argument(
+ '--incremental',
+ action='store_true',
+ default=False,
+ help=_('Create an incremental backup based on the last'
+ ' full or incremental backup. It will create a'
+ ' full backup if no existing backup found.')
+ )
+ return parser
+
+ def take_action(self, parsed_args):
+ manager = self.app.client_manager.database
+ database_backups = manager.backups
+ instance = osc_utils.find_resource(manager.instances,
+ parsed_args.instance)
+ backup = database_backups.create(parsed_args.name,
+ instance,
+ description=parsed_args.description,
+ parent_id=parsed_args.parent,
+ incremental=parsed_args.incremental)
+ backup = set_attributes_for_print_detail(backup)
+ return zip(*sorted(six.iteritems(backup)))
diff --git a/troveclient/tests/osc/v1/test_database_backups.py b/troveclient/tests/osc/v1/test_database_backups.py
index 2355012..bf36209 100644
--- a/troveclient/tests/osc/v1/test_database_backups.py
+++ b/troveclient/tests/osc/v1/test_database_backups.py
@@ -115,3 +115,64 @@ class TestDatabaseBackupDelete(TestBackups):
self.assertRaises(exceptions.CommandError,
self.cmd.take_action,
parsed_args)
+
+
+class TestBackupCreate(TestBackups):
+
+ values = ('2015-05-16T14:22:28', 'mysql', '5.6', 'v-56', None, 'bk-1234',
+ '1234',
+ 'http://backup_srvr/database_backups/bk-1234.xbstream.gz.enc',
+ 'bkp_1', None, 0.11, 'COMPLETED', '2015-05-16T14:23:08')
+
+ def setUp(self):
+ super(TestBackupCreate, self).setUp()
+ self.cmd = database_backups.CreateDatabaseBackup(self.app, None)
+ self.data = self.fake_backups.get_backup_bk_1234()
+ self.backup_client.create.return_value = self.data
+ self.columns = (
+ 'created',
+ 'datastore',
+ 'datastore_version',
+ 'datastore_version_id',
+ 'description',
+ 'id',
+ 'instance_id',
+ 'locationRef',
+ 'name',
+ 'parent_id',
+ 'size',
+ 'status',
+ 'updated',
+ )
+
+ def test_backup_create_return_value(self):
+ args = ['1234', 'bk-1234']
+ parsed_args = self.check_parser(self.cmd, args, [])
+ columns, data = self.cmd.take_action(parsed_args)
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.values, data)
+
+ @mock.patch.object(utils, 'find_resource')
+ def test_backup_create(self, mock_find):
+ args = ['1234', 'bk-1234-1']
+ mock_find.return_value = args[0]
+ parsed_args = self.check_parser(self.cmd, args, [])
+ self.cmd.take_action(parsed_args)
+ self.backup_client.create.assert_called_with('bk-1234-1',
+ '1234',
+ description=None,
+ parent_id=None,
+ incremental=False)
+
+ @mock.patch.object(utils, 'find_resource')
+ def test_incremental_backup_create(self, mock_find):
+ args = ['1234', 'bk-1234-2', '--description', 'backup 1234',
+ '--parent', '1234-1', '--incremental']
+ mock_find.return_value = args[0]
+ parsed_args = self.check_parser(self.cmd, args, [])
+ self.cmd.take_action(parsed_args)
+ self.backup_client.create.assert_called_with('bk-1234-2',
+ '1234',
+ description='backup 1234',
+ parent_id='1234-1',
+ incremental=True)