)]}'
{"releasenotes/notes/ironicclient-openstacksdk-migration-2664be4159e440b5.yaml":[{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"cc94798dcfa6b959cfde6ac5310001a7bc4d0651","unresolved":false,"context_lines":[{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Connection settings for Ironic should be added"},{"line_number":5,"context_line":"    directly to the [irnoic] section of the configuration now, instead of"},{"line_number":6,"context_line":"    [ironic_client]."},{"line_number":7,"context_line":"deprecations:"},{"line_number":8,"context_line":"  - |"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"9ad53559_107663a1","line":5,"updated":"2026-09-17 11:09:45.000000000","message":"The new upgrade release note instructs operators to add Ironic connection settings \"directly to the [irnoic] section of the configuration\". The group registered by this change in watcher/conf/ironic.py is named \u0027ironic\u0027, and the deprecations entry later in the same note spells it correctly, so the upgrade section contains a transposed-letter typo in the one identifier operators must type exactly.\n\n**Severity**: SUGGESTION | **Confidence**: 0.97\n\n**Impact**: Operators skimming or copy-editing the upgrade note may create a misspelled [irnoic] section that watcher silently ignores; once the deprecated [ironic_client] options are removed, such a deployment would quietly fall back to keystoneauth defaults or [watcher_clients_auth] instead of the intended Ironic connection settings.\n\n**Recommendation**:\nCorrect line 5 to say the [ironic] section.","commit_id":"3271f97c39625bc4c0a1c1c10c2a7b03637285c3"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"4d641f1a75ce9bba039ac7ed3e11a70328e4debc","unresolved":false,"context_lines":[{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Connection settings for Ironic should be added"},{"line_number":5,"context_line":"    directly to the [irnoic] section of the configuration now, instead of"},{"line_number":6,"context_line":"    [ironic_client]."},{"line_number":7,"context_line":"deprecations:"},{"line_number":8,"context_line":"  - |"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"b6752fc5_aeba836b","line":5,"updated":"2026-09-18 12:56:53.000000000","message":"The new upgrade release note tells operators to put Ironic connection settings into the \"[irnoic]\" section, misspelling the [ironic] configuration group this change introduces.\n\n**Severity**: SUGGESTION | **Confidence**: 0.97\n\n**Impact**: Operators following the upgrade note verbatim may create an [irnoic] section that watcher ignores, silently staying on the deprecated [ironic_client] options until those options are removed.\n\n**Recommendation**:\nCorrect the section name in the release note from [irnoic] to [ironic].","commit_id":"f8896b8d3652ab2919a63d7cd810e6de719439a1"}],"watcher/common/ironic_helper.py":[{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"877022100079a98dc4bf7c429d0c06286b0f9f35","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"class IronicHelper(BaseConnectionMixin):"},{"line_number":66,"context_line":"    def __init__(self, session\u003dNone, context\u003dNone):"},{"line_number":67,"context_line":"        \"\"\"Create and return a helper to call the nova service"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        :param session: Optional keystone session to create the openstack"},{"line_number":70,"context_line":"        connection."}],"source_content_type":"text/x-python","patch_set":2,"id":"57d932c2_bc2a66fd","line":67,"updated":"2026-07-31 11:10:00.000000000","message":"The docstring of IronicHelper.__init__ states \u0027Create and return a helper to call the nova service\u0027 but this is the IronicHelper class for the Ironic baremetal service. This appears to be a copy-paste error from the NovaHelper migration pattern.\n\n**Severity**: SUGGESTION | **Confidence**: 0.9\n\n**Benefit**: Misleading documentation that could confuse contributors reading the code, though no functional impact.\n\n**Recommendation**:\nChange \u0027nova service\u0027 to \u0027ironic service\u0027 in the docstring.","commit_id":"8a55d3be4e9ef3e80eb797d62adb0a8f0f896aae"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"877022100079a98dc4bf7c429d0c06286b0f9f35","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        # We need to pass an object with an \u0027uuid\u0027 attribute to make it work"},{"line_number":107,"context_line":"        return IronicNode.from_openstacksdk(node)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def set_power_state(self, node_uuid: str, state: str) -\u003e None:"},{"line_number":110,"context_line":"        if state in (\u0027on\u0027, \u0027off\u0027):"},{"line_number":111,"context_line":"            # some watcher code uses on/off as states, instead of the \"power"},{"line_number":112,"context_line":"            # on/off\" string that the sdk proxy uses"}],"source_content_type":"text/x-python","patch_set":2,"id":"d70de366_08a17dde","line":109,"updated":"2026-07-31 11:10:00.000000000","message":"The set_power_state method introduces new logic to convert \u0027on\u0027/\u0027off\u0027 to \u0027power on\u0027/\u0027power off\u0027 for SDK compatibility. However, the only test (test_set_power_state) passes \u0027power on\u0027 as input, which does not exercise this transformation branch. The actual callers in metal_helper/ironic.py use bar...\n\n**Severity**: WARNING | **Confidence**: 0.9\n\n**Impact**: If the normalization logic has a bug (e.g., wrong format string), power on/off operations on baremetal nodes will silently send incorrect target states to the Ironic API, potentially causing node power operations to fail without clear error messages.\n\n**Suggestion**:\nAdd a test case (or extend test_set_power_state) that calls set_power_state with \u0027on\u0027 and \u0027off\u0027 and asserts the mock is called with \u0027power on\u0027 and \u0027power off\u0027 respectively.","commit_id":"8a55d3be4e9ef3e80eb797d62adb0a8f0f896aae"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"e6cbeb68be4051ef70a0341cd2c8b82eaefd9268","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"class IronicHelper(BaseConnectionMixin):"},{"line_number":66,"context_line":"    def __init__(self, session\u003dNone, context\u003dNone):"},{"line_number":67,"context_line":"        \"\"\"Create and return a helper to call the nova service"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        :param session: Optional keystone session to create the openstack"},{"line_number":70,"context_line":"        connection."}],"source_content_type":"text/x-python","patch_set":3,"id":"235aced7_174dd9d1","line":67,"updated":"2026-09-16 17:37:47.000000000","message":"The rewritten IronicHelper.__init__ docstring says \u0027Create and return a helper to call the nova service\u0027, copied verbatim from NovaHelper (watcher/common/nova_helper.py:393-394) although this helper targets ironic. Line 106 keeps the leftover comment \"We need to pass an object with an \u0027uuid\u0027 attribute to make it work\" above \u0027return IronicNode.from_openstacksdk(node)\u0027, which describes nothing in the surrounding code (a remnant of the earlier ironicclient iteration that passed a Struct). watcher/conf/ironic.py:25 copies nova\u0027s comment \u0027Options migrated from ironic_client group (deprecated in 2026.1)\u0027 from watcher/conf/nova.py:96, contradicting watcher/conf/ironic_client.py which marks the same options deprecated_since\u003d\u00272026.2\u0027.\n\n**Severity**: SUGGESTION | **Confidence**: 0.92\n\n**Impact**: Future maintainers reading IronicHelper are told it calls nova, are directed by a nonsensical uuid comment to an invariant that does not exist, and the conf comment states the wrong deprecation release, all of which obscure the actual behavior during later maintenance.\n\n**Recommendation**:\nRewrite the docstring to say the ironic service, delete the stale uuid comment above the from_openstacksdk return, and update watcher/conf/ironic.py:25 to say deprecated in 2026.2 to match ironic_client.py.","commit_id":"37edc9f03d69672bb7a2ab48f177d6de6837e657"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"cc94798dcfa6b959cfde6ac5310001a7bc4d0651","unresolved":false,"context_lines":[{"line_number":80,"context_line":"            return"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        valid_interfaces \u003d CONF.ironic.valid_interfaces"},{"line_number":83,"context_line":"        if valid_interfaces is None and CONF.ironic.interface is None:"},{"line_number":84,"context_line":"            # NOTE(jgilaber): ensure the endpoint_type option from"},{"line_number":85,"context_line":"            # ironic_client is processed and set with the right format in"},{"line_number":86,"context_line":"            # [ironic] valid_interfaces, if the latter is not set in the"}],"source_content_type":"text/x-python","patch_set":5,"id":"1b6dc865_0cb30c49","line":83,"updated":"2026-09-17 11:09:45.000000000","message":"IronicHelper._override_deprecated_configs adds new supported behavior: it maps the deprecated [ironic_client] endpoint_type onto [ironic] valid_interfaces, stripping the URL suffix. The sibling NovaHelper and CinderHelper migrations each ship a dedicated config-override test suite (TestNovaHelperConfigOverrides, TestCinderHelperConfigOverrides) asserting the mapping for publicURL/internalURL/adminURL and bare values, but no equivalent test exists for IronicHelper, so a regression in the mapping or target group would pass CI.\n\n**Severity**: SUGGESTION | **Confidence**: 0.85\n\n**Impact**: A future edit that breaks the deprecated-option migration (wrong group name, broken URL suffix stripping, inverted guard) would silently change which service interface watcher uses to reach Ironic, and no existing test would fail to detect it.\n\n**Recommendation**:\nAdd a TestIronicHelperConfigOverrides-style suite mirroring TestNovaHelperConfigOverrides: set [ironic_client] endpoint_type to publicURL/internalURL/adminURL and bare public/internal/admin, construct ironic_helper.IronicHelper(), and assert CONF.ironic.valid_interfaces equals the expected single-interface list.","commit_id":"3271f97c39625bc4c0a1c1c10c2a7b03637285c3"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"4d641f1a75ce9bba039ac7ed3e11a70328e4debc","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        self._override_deprecated_configs()"},{"line_number":76,"context_line":"        self._create_sdk_connection(\u0027ironic\u0027, context\u003dcontext, session\u003dsession)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def _override_deprecated_configs(self):"},{"line_number":79,"context_line":"        if self._config_overrides:"},{"line_number":80,"context_line":"            return"},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"c5598a3b_88112465","line":78,"updated":"2026-09-18 12:56:53.000000000","message":"IronicHelper._override_deprecated_configs translates the deprecated [ironic_client] endpoint_type value into [ironic] valid_interfaces so existing deployments keep their configured interface after the SDK migration, but watcher/tests/unit/common/test_ironic_helper.py has no test for this compatibility path. The equivalent logic migrated for nova in this series is covered by dedicated tests, so the ironic copy is the only untested instance of this upgrade-critical behavior.\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: A regression in this migration would silently send Ironic API traffic to the wrong endpoint interface (for example public instead of a configured internalURL) for deployments that rely on the deprecated [ironic_client] endpoint_type option, breaking the baremetal integration after upgrade with no failing test to catch it.\n\n**Suggestion**:\nPort the nova tests to test_ironic_helper.py: set [ironic_client] endpoint_type\u003d\u0027internalURL\u0027, instantiate IronicHelper, and assert CONF.ironic.valid_interfaces \u003d\u003d [\u0027internal\u0027] (plus the publicURL/adminURL variants), and add a case asserting an explicit [ironic] valid_interfaces value is left untouched.","commit_id":"f8896b8d3652ab2919a63d7cd810e6de719439a1"}],"watcher/conf/ironic.py":[{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"877022100079a98dc4bf7c429d0c06286b0f9f35","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        \u0027api_version\u0027,"},{"line_number":28,"context_line":"        default\u003d\u00271\u0027,"},{"line_number":29,"context_line":"        deprecated_group\u003d\u0027ironic_client\u0027,"},{"line_number":30,"context_line":"        help\u003d\u0027Version of Ironic API to use in ironicclient.\u0027,"},{"line_number":31,"context_line":"    )"},{"line_number":32,"context_line":"]"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1422f822_0d4ee3c2","line":30,"updated":"2026-07-31 11:10:00.000000000","message":"Several help strings and docstrings in newly added or modified code still reference \u0027ironicclient\u0027 even though the migration replaces it with openstacksdk. The api_version help text in conf/ironic.py says \u0027Version of Ironic API to use in ironicclient\u0027 and the IronicNode dataclass docstring says \u0027...\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Minor confusion for operators reading config help and contributors reading code comments. No functional impact.\n\n**Recommendation**:\nUpdate help text to reference \u0027openstacksdk baremetal proxy\u0027 or \u0027Ironic API\u0027 instead of \u0027ironicclient\u0027. Update the IronicNode docstring to say \u0027openstacksdk Node object\u0027.","commit_id":"8a55d3be4e9ef3e80eb797d62adb0a8f0f896aae"}]}
