From 29bdd7f5cbe67069690f36bf372408a2081025b9 Mon Sep 17 00:00:00 2001 From: Trevor McCasland Date: Tue, 17 Jan 2017 17:18:49 -0600 Subject: [PATCH] Add database-list to OSC This change adds database support to the python-openstackclient project for the database-list command. The trove command database-list is now: openstack database list To confirm the databases list command I had to create an instance and specify a database name like how it shows in the user-guide[1] on step 2. [1] http://docs.openstack.org/user-guide/create-db.html Change-Id: I4f4682eff1addc3fc837f5468939ddd96572e238 Partially-Implements: trove-support-in-python-openstackclient --- ...database-list-to-osc-b547e8954e8b6fc7.yaml | 4 ++ setup.cfg | 1 + troveclient/osc/v1/databases.py | 46 ++++++++++++++++++ troveclient/tests/osc/v1/fakes.py | 8 ++++ troveclient/tests/osc/v1/test_databases.py | 48 +++++++++++++++++++ 5 files changed, 107 insertions(+) create mode 100644 releasenotes/notes/add-database-list-to-osc-b547e8954e8b6fc7.yaml create mode 100644 troveclient/osc/v1/databases.py create mode 100644 troveclient/tests/osc/v1/test_databases.py diff --git a/releasenotes/notes/add-database-list-to-osc-b547e8954e8b6fc7.yaml b/releasenotes/notes/add-database-list-to-osc-b547e8954e8b6fc7.yaml new file mode 100644 index 00000000..91e5b18a --- /dev/null +++ b/releasenotes/notes/add-database-list-to-osc-b547e8954e8b6fc7.yaml @@ -0,0 +1,4 @@ +--- +features: + - The command ``trove database-list`` is now available to use in + the python-openstackclient CLI as ``openstack database list`` diff --git a/setup.cfg b/setup.cfg index 956a424c..37bd1224 100644 --- a/setup.cfg +++ b/setup.cfg @@ -36,6 +36,7 @@ openstack.database.v1 = database_flavor_list = troveclient.osc.v1.database_flavors:ListDatabaseFlavors database_instance_list = troveclient.osc.v1.database_instances:ListDatabaseInstances database_limit_list = troveclient.osc.v1.database_limits:ListDatabaseLimits + database_list = troveclient.osc.v1.databases:ListDatabases database_user_list = troveclient.osc.v1.database_users:ListDatabaseUsers diff --git a/troveclient/osc/v1/databases.py b/troveclient/osc/v1/databases.py new file mode 100644 index 00000000..54a9746a --- /dev/null +++ b/troveclient/osc/v1/databases.py @@ -0,0 +1,46 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""Database v1 Databases action implementations""" + +from osc_lib.command import command +from osc_lib import utils as osc_utils + +from troveclient.i18n import _ +from troveclient import utils + + +class ListDatabases(command.Lister): + + _description = _("Get a list of all Databases from the instance.") + columns = ['Name'] + + def get_parser(self, prog_name): + parser = super(ListDatabases, self).get_parser(prog_name) + parser.add_argument( + dest='instance', + metavar='', + help=_('ID or name of the instance.') + ) + return parser + + def take_action(self, parsed_args): + manager = self.app.client_manager.database + databases = manager.databases + instance = utils.find_resource(manager.instances, parsed_args.instance) + items = databases.list(instance) + dbs = items + while items.next: + items = databases.list(instance, marker=items.next) + dbs += items + dbs = [osc_utils.get_item_properties(db, self.columns) for db in dbs] + return self.columns, dbs diff --git a/troveclient/tests/osc/v1/fakes.py b/troveclient/tests/osc/v1/fakes.py index 4f43ed17..0700f337 100644 --- a/troveclient/tests/osc/v1/fakes.py +++ b/troveclient/tests/osc/v1/fakes.py @@ -17,6 +17,7 @@ from troveclient.tests import fakes from troveclient.tests.osc import utils from troveclient.v1 import backups from troveclient.v1 import clusters +from troveclient.v1 import databases from troveclient.v1 import flavors from troveclient.v1 import instances from troveclient.v1 import limits @@ -84,3 +85,10 @@ class FakeInstances(object): def get_instances_1234(self): return instances.Instance(None, self.fake_instances[0]) + + +class FakeDatabases(object): + fake_databases = [{'name': 'fakedb1'}] + + def get_databases_1(self): + return databases.Database(None, self.fake_databases[0]) diff --git a/troveclient/tests/osc/v1/test_databases.py b/troveclient/tests/osc/v1/test_databases.py new file mode 100644 index 00000000..2593aa35 --- /dev/null +++ b/troveclient/tests/osc/v1/test_databases.py @@ -0,0 +1,48 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import mock + +from troveclient import common +from troveclient.osc.v1 import databases +from troveclient.tests.osc.v1 import fakes +from troveclient import utils + + +class TestDatabases(fakes.TestDatabasev1): + fake_databases = fakes.FakeDatabases() + + def setUp(self): + super(TestDatabases, self).setUp() + self.mock_client = self.app.client_manager.database + self.database_client = self.app.client_manager.database.databases + + +class TestDatabaseList(TestDatabases): + columns = databases.ListDatabases.columns + values = ('fakedb1',) + + def setUp(self): + super(TestDatabaseList, self).setUp() + self.cmd = databases.ListDatabases(self.app, None) + data = [self.fake_databases.get_databases_1()] + self.database_client.list.return_value = common.Paginated(data) + + @mock.patch.object(utils, 'find_resource') + def test_database_list_defaults(self, mock_find): + args = ['my_instance'] + mock_find.return_value = args[0] + parsed_args = self.check_parser(self.cmd, args, []) + columns, data = self.cmd.take_action(parsed_args) + self.database_client.list.assert_called_once_with(args[0]) + self.assertEqual(self.columns, columns) + self.assertEqual([tuple(self.values)], data)