diff --git a/releasenotes/notes/add-root-show-to-osc-17e49422c5dc71de.yaml b/releasenotes/notes/add-root-show-to-osc-17e49422c5dc71de.yaml new file mode 100644 index 00000000..7e68fda9 --- /dev/null +++ b/releasenotes/notes/add-root-show-to-osc-17e49422c5dc71de.yaml @@ -0,0 +1,5 @@ +--- +features: + - | + The command ``trove root-show`` is now available to use in + the python-openstackclient CLI as ``openstack database root show``. diff --git a/setup.cfg b/setup.cfg index b9f6d8a7..398e5591 100644 --- a/setup.cfg +++ b/setup.cfg @@ -60,6 +60,7 @@ openstack.database.v1 = database_instance_show = troveclient.osc.v1.database_instances:ShowDatabaseInstance database_limit_list = troveclient.osc.v1.database_limits:ListDatabaseLimits database_root_enable = troveclient.osc.v1.database_root:EnableDatabaseRoot + database_root_show = troveclient.osc.v1.database_root:ShowDatabaseRoot database_user_create = troveclient.osc.v1.database_users:CreateDatabaseUser database_user_delete = troveclient.osc.v1.database_users:DeleteDatabaseUser database_user_grant_access = troveclient.osc.v1.database_users:GrantDatabaseUserAccess diff --git a/troveclient/osc/v1/database_root.py b/troveclient/osc/v1/database_root.py index d65a1ab2..dcac9ec7 100644 --- a/troveclient/osc/v1/database_root.py +++ b/troveclient/osc/v1/database_root.py @@ -81,3 +81,34 @@ class EnableDatabaseRoot(command.ShowOne): result = {'name': root[0], 'password': root[1]} return zip(*sorted(six.iteritems(result))) + + +class ShowDatabaseRoot(command.ShowOne): + + _description = _("Gets status if root was ever enabled for " + "an instance or cluster.") + + def get_parser(self, prog_name): + parser = super(ShowDatabaseRoot, self).get_parser(prog_name) + parser.add_argument( + 'instance_or_cluster', + metavar='', + help=_('ID or name of the instance or cluster.'), + ) + + return parser + + def take_action(self, parsed_args): + database_client_manager = self.app.client_manager.database + instance_or_cluster, resource_type = find_instance_or_cluster( + database_client_manager, + parsed_args.instance_or_cluster) + + db_root = database_client_manager.root + if resource_type == 'instance': + root = db_root.is_instance_root_enabled(instance_or_cluster) + else: + root = db_root.is_cluster_root_enabled(instance_or_cluster) + + result = {'is_root_enabled': root.rootEnabled} + return zip(*sorted(six.iteritems(result))) diff --git a/troveclient/tests/osc/v1/fakes.py b/troveclient/tests/osc/v1/fakes.py index 90205a65..1e7f04bc 100644 --- a/troveclient/tests/osc/v1/fakes.py +++ b/troveclient/tests/osc/v1/fakes.py @@ -132,6 +132,19 @@ class FakeDatastores(object): class FakeRoot(object): + fake_instance_1234_root = (fakes.FakeHTTPClient() + .get_instances_1234_root()[2]) + fake_cls_1234_root = (fakes.FakeHTTPClient() + .get_clusters_cls_1234_root()[2]) + + def get_instance_1234_root(self): + return users.User(None, self.fake_instance_1234_root, + loaded=True) + + def get_cls_1234_root(self): + return users.User(None, self.fake_cls_1234_root, + loaded=True) + def post_instance_1234_root(self): root = fakes.FakeHTTPClient().post_instances_1234_root()[2]['user'] return root['name'], root['password'] diff --git a/troveclient/tests/osc/v1/test_database_root.py b/troveclient/tests/osc/v1/test_database_root.py index 3e3d9f19..c7c2dbe7 100644 --- a/troveclient/tests/osc/v1/test_database_root.py +++ b/troveclient/tests/osc/v1/test_database_root.py @@ -76,3 +76,37 @@ class TestRootEnable(TestRoot): self.cmd.take_action(parsed_args) self.root_client.create_cluster_root(None, root_password='secret') + + +class TestRootShow(TestRoot): + + def setUp(self): + super(TestRootShow, self).setUp() + self.cmd = database_root.ShowDatabaseRoot(self.app, None) + self.data = { + 'instance': self.fake_root.get_instance_1234_root(), + 'cluster': self.fake_root.get_cls_1234_root() + } + self.columns = ('is_root_enabled',) + + @mock.patch.object(utils, 'find_resource') + def test_show_instance_1234_root(self, mock_find): + self.root_client.is_instance_root_enabled.return_value = ( + self.data['instance']) + args = ['1234'] + parsed_args = self.check_parser(self.cmd, args, []) + columns, data = self.cmd.take_action(parsed_args) + self.assertEqual(self.columns, columns) + self.assertEqual(('True',), data) + + @mock.patch.object(utils, 'find_resource') + def test_show_cluster_1234_root(self, mock_find): + mock_find.side_effect = [exceptions.CommandError(), + (None, 'cluster')] + self.root_client.is_cluster_root_enabled.return_value = ( + self.data['cluster']) + args = ['1234'] + parsed_args = self.check_parser(self.cmd, args, []) + columns, data = self.cmd.take_action(parsed_args) + self.assertEqual(self.columns, columns) + self.assertEqual(('True',), data)