From 2db7bf24e4a23888f8b281927e9365ec1ce8a32c Mon Sep 17 00:00:00 2001 From: wangyao Date: Thu, 30 Nov 2017 19:54:23 +0800 Subject: [PATCH] Add datastore-show to OSC This change adds database support to the python-openstackclient project for the datastore-show command. The trove command datastore-show is now: openstack datastore show Change-Id: I126493627d6b7fdf60e5d605dd64cfb3fbead10e Partially-Implements: trove-support-in-python-openstackclient --- ...atastore-show-to-osc-79a855d2e026ae80.yaml | 4 +++ setup.cfg | 1 + troveclient/osc/v1/datastores.py | 36 +++++++++++++++++++ troveclient/tests/osc/v1/test_datastores.py | 24 +++++++++++++ 4 files changed, 65 insertions(+) create mode 100644 releasenotes/notes/add-datastore-show-to-osc-79a855d2e026ae80.yaml diff --git a/releasenotes/notes/add-datastore-show-to-osc-79a855d2e026ae80.yaml b/releasenotes/notes/add-datastore-show-to-osc-79a855d2e026ae80.yaml new file mode 100644 index 00000000..a1ebd235 --- /dev/null +++ b/releasenotes/notes/add-datastore-show-to-osc-79a855d2e026ae80.yaml @@ -0,0 +1,4 @@ +--- +features: + - The command ``trove datastore-show`` is now available to use in + the python-openstackclient CLI as ``openstack datastore show`` diff --git a/setup.cfg b/setup.cfg index bba3b9ac..dc56292a 100644 --- a/setup.cfg +++ b/setup.cfg @@ -39,6 +39,7 @@ openstack.database.v1 = database_list = troveclient.osc.v1.databases:ListDatabases database_user_list = troveclient.osc.v1.database_users:ListDatabaseUsers datastore_list = troveclient.osc.v1.datastores:ListDatastores + datastore_show = troveclient.osc.v1.datastores:ShowDatastore [build_sphinx] diff --git a/troveclient/osc/v1/datastores.py b/troveclient/osc/v1/datastores.py index eb63dc85..c28624c2 100644 --- a/troveclient/osc/v1/datastores.py +++ b/troveclient/osc/v1/datastores.py @@ -14,10 +14,26 @@ from osc_lib.command import command from osc_lib import utils +import six from troveclient.i18n import _ +def set_attributes_for_print_detail(datastore): + info = datastore._info.copy() + versions = info.get('versions', []) + versions_str = "\n".join( + [ver['name'] + " (" + ver['id'] + ")" for ver in versions]) + info['versions (id)'] = versions_str + info.pop('versions', None) + info.pop('links', None) + if hasattr(datastore, 'default_version'): + def_ver_id = getattr(datastore, 'default_version') + info['default_version'] = [ + ver['name'] for ver in versions if ver['id'] == def_ver_id][0] + return info + + class ListDatastores(command.Lister): _description = _("List available datastores") @@ -28,3 +44,23 @@ class ListDatastores(command.Lister): datastores = datastore_client.list() ds = [utils.get_item_properties(d, self.columns) for d in datastores] return self.columns, ds + + +class ShowDatastore(command.ShowOne): + _description = _("Shows details of a datastore") + + def get_parser(self, prog_name): + parser = super(ShowDatastore, self).get_parser(prog_name) + parser.add_argument( + 'datastore', + metavar='', + help=_('ID of the datastore'), + ) + return parser + + def take_action(self, parsed_args): + datastore_client = self.app.client_manager.database.datastores + datastore = utils.find_resource(datastore_client, + parsed_args.datastore) + datastore = set_attributes_for_print_detail(datastore) + return zip(*sorted(six.iteritems(datastore))) diff --git a/troveclient/tests/osc/v1/test_datastores.py b/troveclient/tests/osc/v1/test_datastores.py index 13e2c2fc..a675175b 100644 --- a/troveclient/tests/osc/v1/test_datastores.py +++ b/troveclient/tests/osc/v1/test_datastores.py @@ -39,3 +39,27 @@ class TestDatastoreList(TestDatastores): self.datastore_client.list.assert_called_once_with() self.assertEqual(self.columns, columns) self.assertEqual([self.values], data) + + +class TestDatastoreShow(TestDatastores): + + values = ('5.6', 'd-123', 'mysql', '5.6 (v-56)') + + def setUp(self): + super(TestDatastoreShow, self).setUp() + self.cmd = datastores.ShowDatastore(self.app, None) + self.data = self.fake_datastores.get_datastores_d_123() + self.datastore_client.get.return_value = self.data + self.columns = ( + 'default_version', + 'id', + 'name', + 'versions (id)', + ) + + def test_show(self): + args = ['mysql'] + 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)