diff --git a/ironicclient/osc/plugin.py b/ironicclient/osc/plugin.py index 09f3d78c6..0a24db664 100644 --- a/ironicclient/osc/plugin.py +++ b/ironicclient/osc/plugin.py @@ -16,26 +16,30 @@ """OpenStackClient plugin for Bare Metal service.""" +from __future__ import annotations + import argparse import logging +from osc_lib import clientmanager from osc_lib import utils from ironicclient.common import http +from ironicclient.v1 import client as v1_client -LOG = logging.getLogger(__name__) +LOG: logging.Logger = logging.getLogger(__name__) -CLIENT_CLASS = 'ironicclient.v1.client.Client' -API_VERSION_OPTION = 'os_baremetal_api_version' -API_NAME = 'baremetal' +CLIENT_CLASS: str = 'ironicclient.v1.client.Client' +API_VERSION_OPTION: str = 'os_baremetal_api_version' +API_NAME: str = 'baremetal' # NOTE(TheJulia) Latest known version tracking has been moved # to the ironicclient/common/http.py file as the OSC commitment # is latest known, and we should only store it in one location. -LAST_KNOWN_API_VERSION = http.LAST_KNOWN_API_VERSION -LATEST_VERSION = http.LATEST_VERSION +LAST_KNOWN_API_VERSION: int = http.LAST_KNOWN_API_VERSION +LATEST_VERSION: str = http.LATEST_VERSION -API_VERSIONS = { +API_VERSIONS: dict[str, str] = { '1.%d' % i: CLIENT_CLASS for i in range(1, LAST_KNOWN_API_VERSION + 1) } @@ -43,17 +47,20 @@ API_VERSIONS['1'] = CLIENT_CLASS # NOTE(dtantsur): flag to indicate that the requested version was "latest". # Due to how OSC works we cannot just add "latest" to the list of supported # versions - it breaks the major version detection. -OS_BAREMETAL_API_LATEST = True +OS_BAREMETAL_API_LATEST: bool = True -def make_client(instance): +def make_client( + instance: clientmanager.ClientManager, +) -> v1_client.Client: """Returns a baremetal service client.""" - requested_api_version = instance._api_version[API_NAME] + requested_api_version: str = instance._api_version[API_NAME] - baremetal_client_class = utils.get_client_class( - API_NAME, - requested_api_version, - API_VERSIONS) + baremetal_client_class: type[v1_client.Client] = ( + utils.get_client_class( + API_NAME, + requested_api_version, + API_VERSIONS)) LOG.debug('Instantiating baremetal client: %s', baremetal_client_class) LOG.debug('Baremetal API version: %s', requested_api_version if not OS_BAREMETAL_API_LATEST @@ -63,28 +70,34 @@ def make_client(instance): # NOTE(dtantsur): '1' means 'the latest v1 API version'. Since we don't # have other major versions, it's identical to 'latest'. requested_api_version = LATEST_VERSION - allow_api_version_downgrade = True + allow_api_version_downgrade: bool = True else: allow_api_version_downgrade = OS_BAREMETAL_API_LATEST - client = baremetal_client_class( + result: v1_client.Client = baremetal_client_class( os_ironic_api_version=requested_api_version, # NOTE(dtantsur): enable re-negotiation of the latest version, if CLI # latest is too high for the server we're talking to. allow_api_version_downgrade=allow_api_version_downgrade, session=instance.session, - region_name=instance._region_name, + # TODO(karan): _region_name is a private attr on ClientManager; + # osc-lib should expose this publicly. See also: + # https://bugs.launchpad.net/python-ironicclient/+bug/2146739 + region_name=instance._region_name, # type: ignore[attr-defined] # NOTE(vdrok): This will be set as endpoint_override, and the Client # class will be able to do the version stripping if needed endpoint_override=instance.get_endpoint_for_service_type( API_NAME, interface=instance.interface, - region_name=instance._region_name + # TODO(karan): same _region_name private attr access as above + region_name=instance._region_name # type: ignore[attr-defined] ) ) - return client + return result -def build_option_parser(parser): +def build_option_parser( + parser: argparse.ArgumentParser, +) -> argparse.ArgumentParser: """Hook to add global options.""" parser.add_argument( '--os-baremetal-api-version', @@ -101,9 +114,9 @@ def build_option_parser(parser): return parser -def _get_environment_version(default): +def _get_environment_version(default: str) -> str: global OS_BAREMETAL_API_LATEST - env_value = utils.env('OS_BAREMETAL_API_VERSION') + env_value: str | None = utils.env('OS_BAREMETAL_API_VERSION') if not env_value: env_value = default if env_value == 'latest': @@ -122,7 +135,14 @@ class ReplaceLatestVersion(argparse.Action): replaces "latest" with the latest known version, and sets the global OS_BAREMETAL_API_LATEST flag appropriately. """ - def __call__(self, parser, namespace, values, option_string=None): + # base Action.__call__ accepts str | Sequence[Any] | None; narrowed here + def __call__( # type: ignore[override] + self, + parser: argparse.ArgumentParser, + namespace: argparse.Namespace, + values: str, + option_string: str | None = None, + ) -> None: global OS_BAREMETAL_API_LATEST if values == 'latest': values = LATEST_VERSION diff --git a/pyproject.toml b/pyproject.toml index 53fa1a872..a26021ac9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,4 +39,5 @@ files = [ "ironicclient/client.py", "ironicclient/shell.py", "ironicclient/__init__.py", + "ironicclient/osc/plugin.py", ] \ No newline at end of file