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 `_]