)]}'
{"releasenotes/notes/drop-extend-placement-client-a3f1c9e2.yaml":[{"robot_id":"zuul","robot_run_id":"a6d32149f47d4e11a0c5672e962638cb","url":"https://zuul.teim.app/t/main/buildset/a6d32149f47d4e11a0c5672e962638cb","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":"5702012a5d9bd0cc52719a7cb990c99d4c9f2864","patch_set":1,"id":"7343721d_46f48eb8","line":7,"updated":"2026-04-29 09:35:36.000000000","message":"The release note says \u0027This method was added in tempest-40.0.0 which is no longer used.\u0027 The phrasing \u0027which is no longer used\u0027 is ambiguous -- it could be read as \u0027tempest-40.0.0 is no longer used\u0027 rather than \u0027ExtendPlacementClient is no longer used\u0027.\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Clearer release notes prevent confusion for operators reading the upgrade section when deploying new versions.\n\n**Recommendation**:\nRephrase the last line to clarify what is no longer needed, e.g.: \u0027The ``ExtendPlacementClient`` wrapper is no longer needed since the plugin now requires tempest \u003e\u003d 40.0.0.\u0027","commit_id":"4ce896e4087f831473cb0f29cecb80d923a92eeb"}],"requirements.txt":[{"robot_id":"zuul","robot_run_id":"e8d4df11e6b74b02a301ba779719c129","url":"https://zuul.teim.app/t/main/buildset/e8d4df11e6b74b02a301ba779719c129","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":"cfe210a4adaf4379c95d41864e4d190f520da1ad","patch_set":3,"id":"e375c622_c0880a73","line":8,"updated":"2026-05-05 10:36:27.000000000","message":"The tempest minimum version bump from 27.0.0 to 40.0.0 is a significant jump. While the commit message justifies this by noting tempest 40.0.0 shipped with 2024.2/Dalmatian, the requirements.txt change is the only guard ensuring the correct version is installed at runtime.\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: If a deployment or CI environment has an older tempest installed (pre-40.0.0), the plugin will fail at runtime with an AttributeError because ResourceProvidersClient will not have the required methods. This is mitigated by the pip constraint but could surface in mixed-version environments.\n\n**Suggestion**:\nVerify that no CI job configuration or lower-constraints.txt file in the repository pins tempest below 40.0.0. If a lower-constraints.txt exists, update it accordingly. Consider adding a release note or upgrade note mentioning the tempest version requirement change.","commit_id":"aba59e3f14bdfbc78b355b4c5ae4aa2460dcfcb6"}],"watcher_tempest_plugin/infra_optim_clients.py":[{"robot_id":"zuul","robot_run_id":"a6d32149f47d4e11a0c5672e962638cb","url":"https://zuul.teim.app/t/main/buildset/a6d32149f47d4e11a0c5672e962638cb","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":"5702012a5d9bd0cc52719a7cb990c99d4c9f2864","patch_set":1,"id":"b679fe3b_6af930e2","line":1,"updated":"2026-04-29 09:35:36.000000000","message":"Commit subject line is 61 characters, exceeding the 50-character OpenStack convention. \u0027Drop ExtendPlacementClient in favor of tempest placement lib\u0027 should be shortened.\n\n**Severity**: WARNING | **Confidence**: 0.9\n\n**Impact**: Commit message formatting is enforced during OpenStack review. A subject line exceeding 50 chars may be flagged by reviewers or automated checks.\n\n**Suggestion**:\nShorten to something like \u0027Drop ExtendPlacementClient for tempest lib\u0027 (49 chars) or \u0027Replace ExtendPlacementClient with tempest lib\u0027 (49 chars).","commit_id":"4ce896e4087f831473cb0f29cecb80d923a92eeb"},{"robot_id":"zuul","robot_run_id":"95d4045dbde8452c9d91b7677ddcba80","url":"https://zuul.teim.app/t/main/buildset/95d4045dbde8452c9d91b7677ddcba80","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":"ff43a59494ba04be622bb983843e8a050a599996","patch_set":2,"id":"04040ef0_0d3cafb6","line":35,"updated":"2026-05-05 10:01:16.000000000","message":"The commit message states tempest 40.0.0 added the upstream methods, but does not include a minimum version constraint in requirements (e.g., tempest\u003e\u003d40.0.0). If an older tempest is installed, the plugin would fail at runtime with an AttributeError.\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Prevents silent breakage when the plugin is installed alongside an older tempest release that lacks ResourceProvidersClient.list_resource_provider_traits.\n\n**Recommendation**:\nAdd tempest\u003e\u003d40.0.0 to the plugin\u0027s requirements (e.g., requirements.txt or setup.cfg) if not already present. Verify the current minimum tempest version constraint in the project packaging to confirm it already covers 40.0.0.","commit_id":"473b9b891d06afc677e5e08761d0d386cc6fb160"}],"watcher_tempest_plugin/tests/scenario/base.py":[{"robot_id":"zuul","robot_run_id":"a6d32149f47d4e11a0c5672e962638cb","url":"https://zuul.teim.app/t/main/buildset/a6d32149f47d4e11a0c5672e962638cb","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":"5702012a5d9bd0cc52719a7cb990c99d4c9f2864","patch_set":1,"id":"8f16ebd3_99967728","line":1012,"updated":"2026-04-29 09:35:36.000000000","message":"The check_node_trait method could simplify its return expression. The pattern `if condition: return True else: return False` is equivalent to `return condition`.\n\n**Severity**: SUGGESTION | **Confidence**: 0.9\n\n**Benefit**: More concise and Pythonic code. The current pattern is a common readability anti-pattern that adds unnecessary branching.\n\n**Recommendation**:\nReplace lines 1012-1015 with: `return trait in traits.get(\u0027traits\u0027)`. This is a pre-existing issue but since the method body was modified in this patch it would be a natural cleanup.","commit_id":"4ce896e4087f831473cb0f29cecb80d923a92eeb"},{"robot_id":"zuul","robot_run_id":"95d4045dbde8452c9d91b7677ddcba80","url":"https://zuul.teim.app/t/main/buildset/95d4045dbde8452c9d91b7677ddcba80","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":"ff43a59494ba04be622bb983843e8a050a599996","patch_set":2,"id":"66e68ee4_6e34558f","line":1031,"updated":"2026-05-05 10:01:16.000000000","message":"In base.py line 1031, traits.get(\u0027traits\u0027) returns None if the key is absent, making the `in` check return False silently. The old code had the same behaviour, so this is not a regression, but a defensive .get(\u0027traits\u0027, []) would be more robust.\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: Protects against a subtle None-related bug if the Placement API ever returns a response without the \u0027traits\u0027 key, making the failure mode explicit rather than silent.\n\n**Recommendation**:\nConsider changing `traits.get(\u0027traits\u0027)` to `traits.get(\u0027traits\u0027, [])` on line 1031 to guard against None. This is a minor improvement and can be addressed in a follow-up patch.","commit_id":"473b9b891d06afc677e5e08761d0d386cc6fb160"},{"robot_id":"zuul","robot_run_id":"e8d4df11e6b74b02a301ba779719c129","url":"https://zuul.teim.app/t/main/buildset/e8d4df11e6b74b02a301ba779719c129","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":"cfe210a4adaf4379c95d41864e4d190f520da1ad","patch_set":3,"id":"521213b0_9e39ef05","line":125,"updated":"2026-05-05 10:36:27.000000000","message":"The variable name \u0027placement_client\u0027 in base.py now refers to a ResourceProvidersClient instance rather than the old ExtendPlacementClient. While the name is still semantically reasonable, it could be renamed to \u0027resource_providers_client\u0027 for consistency with the upstream tempest Manager attribute name.\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Consistent naming with the upstream tempest Manager makes the code easier to understand for contributors familiar with tempest internals. It also makes grep/search for \u0027resource_providers_client\u0027 find all usages uniformly.\n\n**Recommendation**:\nConsider renaming \u0027cls.placement_client\u0027 to \u0027cls.resource_providers_client\u0027 throughout base.py and all test files that reference it, to match the upstream Manager attribute name. This is a style improvement, not a functional requirement.","commit_id":"aba59e3f14bdfbc78b355b4c5ae4aa2460dcfcb6"},{"robot_id":"zuul","robot_run_id":"e8d4df11e6b74b02a301ba779719c129","url":"https://zuul.teim.app/t/main/buildset/e8d4df11e6b74b02a301ba779719c129","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":"cfe210a4adaf4379c95d41864e4d190f520da1ad","patch_set":3,"id":"fe1aa1c8_a80333b1","line":1031,"updated":"2026-05-05 10:36:27.000000000","message":"The has_resource_provider_trait() method now uses \u0027traits.get(\u0027traits\u0027, [])\u0027 with a safe default empty list, which is a good defensive improvement over the original code that assumed \u0027traits\u0027 key always existed.\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: This defensive pattern could also be applied to get_resource_provider_inventory() where \u0027inventories\u0027 key access assumes the API always returns the expected structure.\n\n**Recommendation**:\nConsider also applying defensive .get() defaults in get_resource_provider_inventory() at line 1039, e.g., \u0027inventories \u003d self.placement_client.list_resource_provider_inventories(res_id).get(\"inventories\", {})\u0027. This is a low-priority consistency improvement.","commit_id":"aba59e3f14bdfbc78b355b4c5ae4aa2460dcfcb6"}]}
