)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"652a6fe671a3acdcb2fb32696bdae8c05dccd10e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"b0385e16_3f657fdf","updated":"2026-05-08 11:26:33.000000000","message":"LGTM, this simplifies a lot our plugin. Thanks","commit_id":"58831c0ab37d24d31a833caa873af3fe92f28241"}],"releasenotes/notes/drop-extend-placement-client-a3f1c9e2.yaml":[{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"12ea0b8a458bbfbf18aa26c749f66388d5d18b63","unresolved":true,"context_lines":[{"line_number":4,"context_line":"    The internal ``ExtendPlacementClient`` class has been removed."},{"line_number":5,"context_line":"    The plugin now uses ``resource_providers_client`` exposed directly"},{"line_number":6,"context_line":"    by ``tempest.clients.Manager`` via ``mgr.resource_providers_client``."},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"    This method was added in tempest-40.0.0 which is no longer used."}],"source_content_type":"text/x-yaml","patch_set":1,"id":"12530cd6_1b88efa9","line":7,"in_reply_to":"7343721d_46f48eb8","updated":"2026-04-29 09:38:17.000000000","message":"\u003e 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\u003e \n\u003e **Severity**: SUGGESTION | **Confidence**: 0.8\n\u003e \n\u003e **Benefit**: Clearer release notes prevent confusion for operators reading the upgrade section when deploying new versions.\n\u003e \n\u003e **Recommendation**:\n\u003e Rephrase 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\n\nYes, good point.","commit_id":"4ce896e4087f831473cb0f29cecb80d923a92eeb"}],"requirements.txt":[{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"d549aeafad730ea619fca02942c60fa9855a7a78","unresolved":false,"context_lines":[{"line_number":5,"context_line":"pbr\u003e\u003d3.1.1 # Apache-2.0"},{"line_number":6,"context_line":"oslo.log\u003e\u003d3.36.0 # Apache-2.0"},{"line_number":7,"context_line":"oslo.utils\u003e\u003d3.33.0 # Apache-2.0"},{"line_number":8,"context_line":"tempest\u003e\u003d40.0.0 # Apache-2.0"},{"line_number":9,"context_line":"os-traits\u003e\u003d0.15.0 # Apache-2.0"}],"source_content_type":"text/plain","patch_set":3,"id":"0977ea52_dc942a46","line":8,"in_reply_to":"71553a41_d830f2a8","updated":"2026-05-08 10:36:27.000000000","message":"Bumped the version to 41.0.0","commit_id":"aba59e3f14bdfbc78b355b4c5ae4aa2460dcfcb6"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"bbd48b8336b52272e8b72588f44463a2073ce394","unresolved":false,"context_lines":[{"line_number":5,"context_line":"pbr\u003e\u003d3.1.1 # Apache-2.0"},{"line_number":6,"context_line":"oslo.log\u003e\u003d3.36.0 # Apache-2.0"},{"line_number":7,"context_line":"oslo.utils\u003e\u003d3.33.0 # Apache-2.0"},{"line_number":8,"context_line":"tempest\u003e\u003d40.0.0 # Apache-2.0"},{"line_number":9,"context_line":"os-traits\u003e\u003d0.15.0 # Apache-2.0"}],"source_content_type":"text/plain","patch_set":3,"id":"71553a41_d830f2a8","line":8,"in_reply_to":"e375c622_c0880a73","updated":"2026-05-06 16:15:47.000000000","message":"this is fine we could bump to 41.0.0 technially but in practice teh version we have been using on stabel branches has been much higher then this for years.","commit_id":"aba59e3f14bdfbc78b355b4c5ae4aa2460dcfcb6"}],"watcher_tempest_plugin/infra_optim_clients.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"bbd48b8336b52272e8b72588f44463a2073ce394","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# -*- encoding: utf-8 -*-"},{"line_number":2,"context_line":"# Copyright (c) 2016 b\u003c\u003ecom"},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"}],"source_content_type":"text/x-python","patch_set":1,"id":"3faf8f45_7a2927d0","line":1,"in_reply_to":"0441f0ae_3230504a","updated":"2026-05-06 16:15:47.000000000","message":"Done","commit_id":"4ce896e4087f831473cb0f29cecb80d923a92eeb"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"12ea0b8a458bbfbf18aa26c749f66388d5d18b63","unresolved":true,"context_lines":[{"line_number":1,"context_line":"# -*- encoding: utf-8 -*-"},{"line_number":2,"context_line":"# Copyright (c) 2016 b\u003c\u003ecom"},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"}],"source_content_type":"text/x-python","patch_set":1,"id":"0441f0ae_3230504a","line":1,"in_reply_to":"b679fe3b_6af930e2","updated":"2026-04-29 09:38:17.000000000","message":"\u003e 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\u003e \n\u003e **Severity**: WARNING | **Confidence**: 0.9\n\u003e \n\u003e **Impact**: Commit message formatting is enforced during OpenStack review. A subject line exceeding 50 chars may be flagged by reviewers or automated checks.\n\u003e \n\u003e **Suggestion**:\n\u003e Shorten to something like \u0027Drop ExtendPlacementClient for tempest lib\u0027 (49 chars) or \u0027Replace ExtendPlacementClient with tempest lib\u0027 (49 chars).\n\n\nGood suggestion!","commit_id":"4ce896e4087f831473cb0f29cecb80d923a92eeb"}],"watcher_tempest_plugin/tests/scenario/base.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"bbd48b8336b52272e8b72588f44463a2073ce394","unresolved":false,"context_lines":[{"line_number":1009,"context_line":"        :return: True if node has the trait else False"},{"line_number":1010,"context_line":"        \"\"\""},{"line_number":1011,"context_line":"        traits \u003d self.placement_client.list_resource_provider_traits(node_id)"},{"line_number":1012,"context_line":"        if trait in traits.get(\u0027traits\u0027):"},{"line_number":1013,"context_line":"            return True"},{"line_number":1014,"context_line":"        else:"},{"line_number":1015,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":1,"id":"76ec7e35_28ed3701","line":1012,"in_reply_to":"63952f5b_b996f72c","updated":"2026-05-06 16:15:47.000000000","message":"Done","commit_id":"4ce896e4087f831473cb0f29cecb80d923a92eeb"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"12ea0b8a458bbfbf18aa26c749f66388d5d18b63","unresolved":true,"context_lines":[{"line_number":1009,"context_line":"        :return: True if node has the trait else False"},{"line_number":1010,"context_line":"        \"\"\""},{"line_number":1011,"context_line":"        traits \u003d self.placement_client.list_resource_provider_traits(node_id)"},{"line_number":1012,"context_line":"        if trait in traits.get(\u0027traits\u0027):"},{"line_number":1013,"context_line":"            return True"},{"line_number":1014,"context_line":"        else:"},{"line_number":1015,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":1,"id":"63952f5b_b996f72c","line":1012,"in_reply_to":"8f16ebd3_99967728","updated":"2026-04-29 09:38:17.000000000","message":"\u003e 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\u003e \n\u003e **Severity**: SUGGESTION | **Confidence**: 0.9\n\u003e \n\u003e **Benefit**: More concise and Pythonic code. The current pattern is a common readability anti-pattern that adds unnecessary branching.\n\u003e \n\u003e **Recommendation**:\n\u003e Replace 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.\n\nGood point!","commit_id":"4ce896e4087f831473cb0f29cecb80d923a92eeb"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"bbd48b8336b52272e8b72588f44463a2073ce394","unresolved":true,"context_lines":[{"line_number":122,"context_line":"        super(BaseInfraOptimScenarioTest, cls).setup_clients()"},{"line_number":123,"context_line":"        cls.client \u003d cls.mgr.io_client"},{"line_number":124,"context_line":"        cls.gnocchi \u003d cls.mgr.gn_client"},{"line_number":125,"context_line":"        cls.placement_client \u003d cls.mgr.resource_providers_client"},{"line_number":126,"context_line":"        cls.prometheus_client \u003d cls.mgr.prometheus_client"},{"line_number":127,"context_line":"        cls.flavors_client \u003d cls.mgr.flavors_client"},{"line_number":128,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"e602fdeb_79ac1398","line":125,"in_reply_to":"521213b0_9e39ef05","updated":"2026-05-06 16:15:47.000000000","message":"this is a good suggestion if you need to respin but i woudl treat this as a nit.","commit_id":"aba59e3f14bdfbc78b355b4c5ae4aa2460dcfcb6"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"d549aeafad730ea619fca02942c60fa9855a7a78","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        super(BaseInfraOptimScenarioTest, cls).setup_clients()"},{"line_number":123,"context_line":"        cls.client \u003d cls.mgr.io_client"},{"line_number":124,"context_line":"        cls.gnocchi \u003d cls.mgr.gn_client"},{"line_number":125,"context_line":"        cls.placement_client \u003d cls.mgr.resource_providers_client"},{"line_number":126,"context_line":"        cls.prometheus_client \u003d cls.mgr.prometheus_client"},{"line_number":127,"context_line":"        cls.flavors_client \u003d cls.mgr.flavors_client"},{"line_number":128,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"84495912_ae7e0347","line":125,"in_reply_to":"e602fdeb_79ac1398","updated":"2026-05-08 10:36:27.000000000","message":"Done","commit_id":"aba59e3f14bdfbc78b355b4c5ae4aa2460dcfcb6"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"d549aeafad730ea619fca02942c60fa9855a7a78","unresolved":true,"context_lines":[{"line_number":1028,"context_line":"        :return: True if node has the trait else False"},{"line_number":1029,"context_line":"        \"\"\""},{"line_number":1030,"context_line":"        traits \u003d self.placement_client.list_resource_provider_traits(node_id)"},{"line_number":1031,"context_line":"        return trait in traits.get(\u0027traits\u0027, [])"},{"line_number":1032,"context_line":""},{"line_number":1033,"context_line":"    def get_resource_provider_inventory(self, res_id):"},{"line_number":1034,"context_line":"        \"\"\"Get resource provider details for a node"}],"source_content_type":"text/x-python","patch_set":3,"id":"f7d8b00c_581f914a","line":1031,"in_reply_to":"0c28b9bb_82cdce4a","updated":"2026-05-08 10:36:27.000000000","message":"Switched to empty dict.","commit_id":"aba59e3f14bdfbc78b355b4c5ae4aa2460dcfcb6"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"a166c61dbbc540259f26aed7e781ba246341c6c5","unresolved":false,"context_lines":[{"line_number":1028,"context_line":"        :return: True if node has the trait else False"},{"line_number":1029,"context_line":"        \"\"\""},{"line_number":1030,"context_line":"        traits \u003d self.placement_client.list_resource_provider_traits(node_id)"},{"line_number":1031,"context_line":"        return trait in traits.get(\u0027traits\u0027, [])"},{"line_number":1032,"context_line":""},{"line_number":1033,"context_line":"    def get_resource_provider_inventory(self, res_id):"},{"line_number":1034,"context_line":"        \"\"\"Get resource provider details for a node"}],"source_content_type":"text/x-python","patch_set":3,"id":"8da8b88e_6c62686f","line":1031,"in_reply_to":"f7d8b00c_581f914a","updated":"2026-05-08 11:11:01.000000000","message":"Done","commit_id":"aba59e3f14bdfbc78b355b4c5ae4aa2460dcfcb6"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"bbd48b8336b52272e8b72588f44463a2073ce394","unresolved":true,"context_lines":[{"line_number":1028,"context_line":"        :return: True if node has the trait else False"},{"line_number":1029,"context_line":"        \"\"\""},{"line_number":1030,"context_line":"        traits \u003d self.placement_client.list_resource_provider_traits(node_id)"},{"line_number":1031,"context_line":"        return trait in traits.get(\u0027traits\u0027, [])"},{"line_number":1032,"context_line":""},{"line_number":1033,"context_line":"    def get_resource_provider_inventory(self, res_id):"},{"line_number":1034,"context_line":"        \"\"\"Get resource provider details for a node"}],"source_content_type":"text/x-python","patch_set":3,"id":"0c28b9bb_82cdce4a","line":1031,"in_reply_to":"fe1aa1c8_a80333b1","updated":"2026-05-06 16:15:47.000000000","message":"this is valid. since your updating it anyway you shoudl resolve this\n\nget_resource_provider_inventory\n\nhttps://github.com/openstack/tempest/blob/master/tempest/lib/services/placement/resource_providers_client.py#L60-L71\n\nreturns a ResponseBody\nhttps://github.com/openstack/tempest/blob/master/tempest/lib/common/rest_client.py#L1146-L1160\n\nwhich default to an empty dict\nso \n\ninventories \u003d self.placement_client.list_resource_provider_inventories(\n            res_id)[\u0027inventories\u0027]\n            \nwill raise a key error for a resouce provider without inventories only traits.\n\nnot that is very rare but its better to avoid a key error if we can.\n\ni just dont know if we should return None in that case or {}","commit_id":"aba59e3f14bdfbc78b355b4c5ae4aa2460dcfcb6"}]}
