From 0898ebacb8d9c38ae36adaf593867a9b16a50504 Mon Sep 17 00:00:00 2001 From: Rui Chen Date: Wed, 22 Feb 2017 14:39:09 +0800 Subject: [PATCH] Support list commands by group name keyword The output of current "command list" is so long, it's very difficult for users to find out the commands they care about. Add "--group " option to filter the commands by group name keyword, like: --group volume, list all openstack.volume.v2 (cinder) commands That support the scenario that users need to know the current support commands of some OpenStack services(nova, neutron, cinder and so on) in OSC. Change-Id: Id673042729ad36a0cac0b81fb31a3537c24f03fc Closes-Bug: #1666780 --- doc/source/command-objects/command.rst | 6 ++++ openstackclient/common/module.py | 14 ++++++++ .../tests/functional/common/test_module.py | 35 +++++++++++++++++++ .../tests/unit/common/test_module.py | 35 +++++++++++++++++++ .../notes/bug-1666780-c10010e9061689d3.yaml | 11 ++++++ 5 files changed, 101 insertions(+) create mode 100644 releasenotes/notes/bug-1666780-c10010e9061689d3.yaml diff --git a/doc/source/command-objects/command.rst b/doc/source/command-objects/command.rst index 34c07da625..918fd959ad 100644 --- a/doc/source/command-objects/command.rst +++ b/doc/source/command-objects/command.rst @@ -15,3 +15,9 @@ List recognized commands by group .. code:: bash openstack command list + [--group ] + +.. option:: --group + + Show commands filtered by a command group, for example: identity, volume, + compute, image, network and other keywords diff --git a/openstackclient/common/module.py b/openstackclient/common/module.py index ba911ecb8f..20497f2131 100644 --- a/openstackclient/common/module.py +++ b/openstackclient/common/module.py @@ -29,12 +29,26 @@ class ListCommand(command.Lister): auth_required = False + def get_parser(self, prog_name): + parser = super(ListCommand, self).get_parser(prog_name) + parser.add_argument( + '--group', + metavar='', + help=_('Show commands filtered by a command group, for example: ' + 'identity, volume, compute, image, network and ' + 'other keywords'), + ) + return parser + def take_action(self, parsed_args): cm = self.app.command_manager groups = cm.get_command_groups() groups = sorted(groups) columns = ('Command Group', 'Commands') + if parsed_args.group: + groups = (group for group in groups if parsed_args.group in group) + commands = [] for group in groups: command_names = cm.get_command_names(group) diff --git a/openstackclient/tests/functional/common/test_module.py b/openstackclient/tests/functional/common/test_module.py index f4f2e95215..e9e4ee3a6f 100644 --- a/openstackclient/tests/functional/common/test_module.py +++ b/openstackclient/tests/functional/common/test_module.py @@ -42,3 +42,38 @@ class ModuleTest(base.TestCase): cmd_output = json.loads(self.openstack('module list --all -f json')) for one_module in self.CLIENTS + self.LIBS: self.assertIn(one_module, cmd_output.keys()) + + +class CommandTest(base.TestCase): + """Functional tests for openstackclient command list.""" + GROUPS = [ + 'openstack.volume.v2', + 'openstack.network.v2', + 'openstack.image.v2', + 'openstack.identity.v3', + 'openstack.compute.v2', + 'openstack.common', + 'openstack.cli', + ] + + def test_command_list_no_option(self): + cmd_output = json.loads(self.openstack('command list -f json')) + group_names = [each.get('Command Group') for each in cmd_output] + for one_group in self.GROUPS: + self.assertIn(one_group, group_names) + + def test_command_list_with_group(self): + input_groups = [ + 'volume', + 'network', + 'image', + 'identity', + 'compute.v2' + ] + for each_input in input_groups: + cmd_output = json.loads(self.openstack( + 'command list --group %s -f json' % each_input + )) + group_names = [each.get('Command Group') for each in cmd_output] + for each_name in group_names: + self.assertIn(each_input, each_name) diff --git a/openstackclient/tests/unit/common/test_module.py b/openstackclient/tests/unit/common/test_module.py index 4b586d3b2d..2491d63965 100644 --- a/openstackclient/tests/unit/common/test_module.py +++ b/openstackclient/tests/unit/common/test_module.py @@ -88,6 +88,41 @@ class TestCommandList(utils.TestCommand): self.assertEqual(datalist, tuple(data)) + def test_command_list_with_group_not_found(self): + arglist = [ + '--group', 'not_exist', + ] + verifylist = [ + ('group', 'not_exist'), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + columns, data = self.cmd.take_action(parsed_args) + + collist = ('Command Group', 'Commands') + self.assertEqual(collist, columns) + self.assertEqual([], data) + + def test_command_list_with_group(self): + arglist = [ + '--group', 'common', + ] + verifylist = [ + ('group', 'common'), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + columns, data = self.cmd.take_action(parsed_args) + + collist = ('Command Group', 'Commands') + self.assertEqual(collist, columns) + datalist = (( + 'openstack.common', + 'limits show\nextension list' + ),) + + self.assertEqual(datalist, tuple(data)) + @mock.patch.dict( 'openstackclient.common.module.sys.modules', diff --git a/releasenotes/notes/bug-1666780-c10010e9061689d3.yaml b/releasenotes/notes/bug-1666780-c10010e9061689d3.yaml new file mode 100644 index 0000000000..952a1f7a95 --- /dev/null +++ b/releasenotes/notes/bug-1666780-c10010e9061689d3.yaml @@ -0,0 +1,11 @@ +--- +features: + - | + Support list commands by group name keyword. Add ``--group`` option to + filter the commands by group name keyword, like: --group volume, list all + openstack.volume.v2 (cinder) commands. + That support the scenario that users need to know the current support + commands of some OpenStack services(nova, neutron, cinder and so on) in + OSC, and make it easier for users to find out the related commands that + they care about. + [Bug `1666780 `_]