diff --git a/setup.cfg b/setup.cfg index bcdd0ea3..fa5dfb34 100644 --- a/setup.cfg +++ b/setup.cfg @@ -35,6 +35,7 @@ openstack.database.v1 = database_configuration_list = troveclient.osc.v1.database_configurations:ListDatabaseConfigurations database_flavor_list = troveclient.osc.v1.database_flavors:ListDatabaseFlavors database_limit_list = troveclient.osc.v1.database_limits:ListDatabaseLimits + database_user_list = troveclient.osc.v1.database_users:ListDatabaseUsers [build_sphinx] all_files = 1 diff --git a/troveclient/osc/v1/database_users.py b/troveclient/osc/v1/database_users.py new file mode 100644 index 00000000..3cf6ffe3 --- /dev/null +++ b/troveclient/osc/v1/database_users.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 Users action implementations""" + +from osc_lib.command import command +from osc_lib import utils + +from troveclient.i18n import _ + + +class ListDatabaseUsers(command.Lister): + + _description = _("Lists the users for an instance.") + columns = ['Name', 'Host', 'Databases'] + + def get_parser(self, prog_name): + parser = super(ListDatabaseUsers, self).get_parser(prog_name) + parser.add_argument( + dest='instance', + metavar='', + help=_('ID of the instance.') + ) + return parser + + def take_action(self, parsed_args): + db_users = self.app.client_manager.database.users + items = db_users.list(parsed_args.instance) + users = items + while (items.next): + items = db_users.list(parsed_args.instance, marker=items.next) + users += items + for user in users: + db_names = [db['name'] for db in user.databases] + user.databases = ', '.join(db_names) + users = [utils.get_item_properties(u, self.columns) for u in users] + return self.columns, users diff --git a/troveclient/tests/osc/v1/fakes.py b/troveclient/tests/osc/v1/fakes.py index 9edbc9e2..1cdff6f0 100644 --- a/troveclient/tests/osc/v1/fakes.py +++ b/troveclient/tests/osc/v1/fakes.py @@ -19,6 +19,7 @@ from troveclient.v1 import backups from troveclient.v1 import clusters from troveclient.v1 import flavors from troveclient.v1 import limits +from troveclient.v1 import users class TestDatabasev1(utils.TestCommand): @@ -68,3 +69,10 @@ class FakeLimits(object): 'verb': 'DELETE', 'remaining': 200, 'unit': 'MINUTE'}) + + +class FakeUsers(object): + fake_users = fakes.FakeHTTPClient().get_instances_1234_users()[2]['users'] + + def get_instances_1234_users_harry(self): + return users.User(None, self.fake_users[2]) diff --git a/troveclient/tests/osc/v1/test_database_users.py b/troveclient/tests/osc/v1/test_database_users.py new file mode 100644 index 00000000..ecef4d84 --- /dev/null +++ b/troveclient/tests/osc/v1/test_database_users.py @@ -0,0 +1,42 @@ +# 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. + +from troveclient import common +from troveclient.osc.v1 import database_users +from troveclient.tests.osc.v1 import fakes + + +class TestUsers(fakes.TestDatabasev1): + fake_users = fakes.FakeUsers() + + def setUp(self): + super(TestUsers, self).setUp() + self.user_client = self.app.client_manager.database.users + + +class TestUserList(TestUsers): + columns = database_users.ListDatabaseUsers.columns + values = ('harry', '%', 'db1') + + def setUp(self): + super(TestUserList, self).setUp() + self.cmd = database_users.ListDatabaseUsers(self.app, None) + data = [self.fake_users.get_instances_1234_users_harry()] + self.user_client.list.return_value = common.Paginated(data) + + def test_user_list_defaults(self): + args = ['my_instance'] + parsed_args = self.check_parser(self.cmd, args, []) + columns, data = self.cmd.take_action(parsed_args) + self.user_client.list.assert_called_once_with(*args) + self.assertEqual(self.columns, columns) + self.assertEqual([self.values], data)