Add type annotations to ironicclient/osc/plugin.py

Changes:
Add type annotations following code conventions.
Added file to the migrated files list.

Change-Id: I830051fa48223097b1605c77b1c6c3f13671f99e
Signed-off-by: Karan Anand <anandkarancompsci@gmail.com>
This commit is contained in:
Karan Anand
2026-03-21 16:52:57 -04:00
parent f2878e63f5
commit 5c886f9059
2 changed files with 44 additions and 23 deletions

View File

@@ -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

View File

@@ -39,4 +39,5 @@ files = [
"ironicclient/client.py",
"ironicclient/shell.py",
"ironicclient/__init__.py",
"ironicclient/osc/plugin.py",
]