diff --git a/openstackclient/network/client.py b/openstackclient/network/client.py index 5165e1ecdc..82a47fb25e 100644 --- a/openstackclient/network/client.py +++ b/openstackclient/network/client.py @@ -23,6 +23,7 @@ DEFAULT_API_VERSION = '2.0' API_VERSION_OPTION = 'os_network_api_version' API_NAME = 'network' API_VERSIONS = ('2.0', '2') +API_EXTENSIONS = ('taas',) def make_client(instance): diff --git a/openstackclient/shell.py b/openstackclient/shell.py index 6bbbb5f7b6..56b3158788 100644 --- a/openstackclient/shell.py +++ b/openstackclient/shell.py @@ -118,15 +118,42 @@ class OpenStackShell(shell.OpenStackShell): }, ) - # Command groups deal only with major versions - version = '.v' + version_opt.replace('.', '_').split('_')[0] - cmd_group = 'openstack.' + api.replace('-', '_') + version + # Build our command group which we expect to look like: + # + # openstack..vN + # + # Note that command groups deal only with major versions + cmd_group = '.'.join( + [ + 'openstack', + api.replace('-', '_'), + 'v' + version_opt.replace('.', '_').split('_')[0], + ] + ) self.command_manager.add_command_group(cmd_group) self.log.debug( '%(name)s API version %(version)s, cmd group %(group)s', {'name': api, 'version': version_opt, 'group': cmd_group}, ) + mod_extensions = getattr(mod, 'API_EXTENSIONS', None) + if not mod_extensions: + continue + + for extension in mod_extensions: + extension_cmd_group = '.'.join([cmd_group, extension]) + self.command_manager.add_command_group(extension_cmd_group) + self.log.debug( + '%(name)s API version %(version)s ' + '(%(extension)s extension), cmd group %(group)s', + { + 'name': api, + 'version': version_opt, + 'extension': extension, + 'group': cmd_group, + }, + ) + def _load_commands(self): """Load commands via cliff/stevedore diff --git a/pyproject.toml b/pyproject.toml index dc2cbf3864..95b6de0985 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,7 +11,6 @@ authors = [ readme = {file = "README.rst", content-type = "text/x-rst"} license = {text = "Apache-2.0"} dynamic = ["version", "dependencies"] -# dependencies = [ ] requires-python = ">=3.10" classifiers = [ "Environment :: OpenStack", @@ -27,10 +26,6 @@ classifiers = [ "Programming Language :: Python :: 3.13", ] -# [project.optional-dependencies] -# test = [ -# ] - [project.urls] Homepage = "https://docs.openstack.org/python-openstackclient/" Repository = "https://opendev.org/openstack/python-openstackclient/" @@ -540,7 +535,7 @@ subnet_pool_set = "openstackclient.network.v2.subnet_pool:SetSubnetPool" subnet_pool_show = "openstackclient.network.v2.subnet_pool:ShowSubnetPool" subnet_pool_unset = "openstackclient.network.v2.subnet_pool:UnsetSubnetPool" -# Tap-as-a-Service +[project.entry-points."openstack.network.v2.taas"] tap_flow_create = "openstackclient.network.v2.taas.tap_flow:CreateTapFlow" tap_flow_delete = "openstackclient.network.v2.taas.tap_flow:DeleteTapFlow" tap_flow_list = "openstackclient.network.v2.taas.tap_flow:ListTapFlow"