)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":35263,"name":"Matt Crees","email":"mattc@stackhpc.com","username":"mattcrees"},"change_message_id":"2e3af6bf0f750aba96fbbcf7b26d7201e99faa07","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"d2f943ad_14fd6d4e","updated":"2025-08-27 13:40:33.000000000","message":"Thanks @markpowers@uchicago.edu! This works a treat, nicely done.","commit_id":"da044d0f2396b5122d0b5eaf1d81f88ab29478d9"},{"author":{"_account_id":33582,"name":"Mark Powers","email":"markpowers@uchicago.edu","username":"markpowers"},"change_message_id":"749e42f9a70229cd78fcd26bddddecc6ce11d6ea","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"6bc2e9bb_ceee35fa","updated":"2025-09-18 15:11:20.000000000","message":"I believe this checking can be made more efficient by filtering traits within \"list resource provider\" API directly via the `required` parameter, but I haven\u0027t had time to update this change yet.\n\nhttps://docs.openstack.org/api-ref/placement/#list-resource-providers","commit_id":"cab9f3fa47561eacc66f7040fc6bd306f96b1af5"},{"author":{"_account_id":15197,"name":"Pierre Riteau","email":"pierre@stackhpc.com","username":"priteau","status":"StackHPC"},"change_message_id":"46a749c6052bc4c6a1e6c9cbc0af44574c20654d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"876c3040_4d0b0679","updated":"2025-09-01 08:29:10.000000000","message":"recheck ipv6 job failed","commit_id":"cab9f3fa47561eacc66f7040fc6bd306f96b1af5"},{"author":{"_account_id":35263,"name":"Matt Crees","email":"mattc@stackhpc.com","username":"mattcrees"},"change_message_id":"f71ae1ac61e409511134b9d6244c9bdda87f8480","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":4,"id":"3b100f37_655c7e7d","updated":"2025-11-26 17:38:19.000000000","message":"I\u0027ve not got any solutions for this yet, but I\u0027m not seeing this currently working for either required or forbidden traits.\n\nWith a flavor that includes `trait:CUSTOM_TESTO\u003drequired`, it fails to find a valid host.\n```\nNov 26 17:30:08 mattc-blazar blazar-manager[893187]: DEBUG novaclient.v2.client [None req-0a27ceff-e372-45d1-ac1e-61fa605992e3 None None] REQ: curl -g -i -X GET http://127.0.0.1/compute/v2.1/flavors/testo -H \"Accept: application/json\" -H \"User-Agent: python-novaclient\" -H \"X-Auth-Token: {SHA256}22ca4bba77f8ade75be1585346b7c55da388acede440b1e6d311f8d685d110f2\" {{(pid\u003d893187) _htt\u003e\nNov 26 17:30:08 mattc-blazar blazar-manager[893187]: DEBUG novaclient.v2.client [None req-0a27ceff-e372-45d1-ac1e-61fa605992e3 None None] RESP: [200] Connection: close Content-Length: 376 Content-Type: application/json Date: Wed, 26 Nov 2025 17:30:08 GMT OpenStack-API-Version: compute 2.1 Server: Apache/2.4.58 (Ubuntu) Vary: OpenStack-API-Version,X-OpenStack-Nova-API-Version X-O\u003e\nNov 26 17:30:08 mattc-blazar blazar-manager[893187]: DEBUG novaclient.v2.client [None req-0a27ceff-e372-45d1-ac1e-61fa605992e3 None None] RESP BODY: {\"flavor\": {\"id\": \"testo\", \"name\": \"m1.tiny.testo\", \"ram\": 512, \"disk\": 1, \"swap\": \"\", \"OS-FLV-EXT-DATA:ephemeral\": 0, \"OS-FLV-DISABLED:disabled\": false, \"vcpus\": 1, \"os-flavor-access:is_public\": true, \"rxtx_factor\": 1.0, \"links\": [\u003e\nNov 26 17:30:08 mattc-blazar blazar-manager[893187]: DEBUG novaclient.v2.client [None req-0a27ceff-e372-45d1-ac1e-61fa605992e3 None None] GET call to compute for http://127.0.0.1/compute/v2.1/flavors/testo used request id req-d6be680c-499b-4476-8989-ae5c4366f251 {{(pid\u003d893187) request /opt/stack/data/venv/lib/python3.12/site-packages/keystoneauth1/session.py:1073}}\nNov 26 17:30:08 mattc-blazar blazar-manager[893187]: DEBUG novaclient.v2.client [None req-0a27ceff-e372-45d1-ac1e-61fa605992e3 None None] REQ: curl -g -i -X GET http://127.0.0.1/compute/v2.1/flavors/testo/os-extra_specs -H \"Accept: application/json\" -H \"User-Agent: python-novaclient\" -H \"X-Auth-Token: {SHA256}22ca4bba77f8ade75be1585346b7c55da388acede440b1e6d311f8d685d110f2\" {{(p\u003e\nNov 26 17:30:08 mattc-blazar blazar-manager[893187]: DEBUG novaclient.v2.client [None req-0a27ceff-e372-45d1-ac1e-61fa605992e3 None None] RESP: [200] Connection: close Content-Length: 51 Content-Type: application/json Date: Wed, 26 Nov 2025 17:30:08 GMT OpenStack-API-Version: compute 2.1 Server: Apache/2.4.58 (Ubuntu) Vary: OpenStack-API-Version,X-OpenStack-Nova-API-Version X-Op\u003e\nNov 26 17:30:08 mattc-blazar blazar-manager[893187]: DEBUG novaclient.v2.client [None req-0a27ceff-e372-45d1-ac1e-61fa605992e3 None None] RESP BODY: {\"extra_specs\": {\"trait:CUSTOM_TESTO\": \"required\"}} {{(pid\u003d893187) _http_log_response /opt/stack/data/venv/lib/python3.12/site-packages/keystoneauth1/session.py:648}}\nNov 26 17:30:08 mattc-blazar blazar-manager[893187]: DEBUG novaclient.v2.client [None req-0a27ceff-e372-45d1-ac1e-61fa605992e3 None None] GET call to compute for http://127.0.0.1/compute/v2.1/flavors/testo/os-extra_specs used request id req-a030c2a6-7864-49cb-8ee0-811478f78611 {{(pid\u003d893187) request /opt/stack/data/venv/lib/python3.12/site-packages/keystoneauth1/session.py:1073}}\nNov 26 17:30:09 mattc-blazar blazar-manager[893187]: DEBUG blazar.plugins.flavor.flavor_plugin [None req-0a27ceff-e372-45d1-ac1e-61fa605992e3 None None] Placement filtered out host mattc-blazar based on traits {{(pid\u003d893187) _query_available_hosts /opt/stack/blazar/blazar/plugins/flavor/flavor_plugin.py:154}}\nNov 26 17:30:09 mattc-blazar blazar-manager[893187]: ERROR oslo_messaging.rpc.server [None req-0a27ceff-e372-45d1-ac1e-61fa605992e3 None None] Exception during message handling: blazar.manager.exceptions.NotEnoughHostsAvailable: Not enough hosts available\n```\n\nWith a flavor that includes `trait:CUSTOM_TESTO\u003dforbidden`, Placement is unhappy with the request itself. This one\u0027s strange, because the trait definitely exists.\n```\nNov 26 17:16:47 mattc-blazar devstack@placement-api.service[887335]: DEBUG dbcounter [-] [887335] Writing DB stats placement:SELECT\u003d3 {{(pid\u003d887335) stat_writer /opt/stack/data/venv/lib/python3.12/site-packages/dbcounter.py:115}}\nNov 26 17:16:56 mattc-blazar devstack@placement-api.service[887336]: DEBUG placement.requestlog [None req-cabaa8e6-b543-4ea9-9fff-042a9879f787 None None] Starting request: 127.0.0.1 \"GET /placement/resource_providers?required\u003d!CUSTOM_TESTO)\" {{(pid\u003d887336) __call__ /opt/stack/placement/placement/requestlog.py:55}}\nNov 26 17:16:56 mattc-blazar devstack@placement-api.service[887336]: DEBUG placement.wsgi_wrapper [None req-cabaa8e6-b543-4ea9-9fff-042a9879f787 service blazar] Placement API returning an error response: Invalid trait(s) in \"required\" parameter: No such trait(s): CUSTOM_TESTO). {{(pid\u003d887336) call_func /opt/stack/placement/placement/wsgi_wrapper.py:31}}\n```\n\n\nI plan to keep looking into this, but wanted to raise for now in case anyone has any ideas?","commit_id":"e5dffcacc5456c8a77489256b7136c7fbb8c2224"},{"author":{"_account_id":35263,"name":"Matt Crees","email":"mattc@stackhpc.com","username":"mattcrees"},"change_message_id":"b12f7ffe6ea4ee4ad32a57ef18fed18338fa6af8","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":4,"id":"a1d2c7fa_2684067b","in_reply_to":"3b100f37_655c7e7d","updated":"2025-11-27 10:23:53.000000000","message":"The required trait check was failing because `hypervisor_hostname not in placement_rps_matching_traits` would not actually find if hypervisor_hostname was in the list of resource providers, because placement_rps_matching_traits is a list of dictionaries. I\u0027ve suggested a fix in another comment.","commit_id":"e5dffcacc5456c8a77489256b7136c7fbb8c2224"},{"author":{"_account_id":33582,"name":"Mark Powers","email":"markpowers@uchicago.edu","username":"markpowers"},"change_message_id":"e5040504362ae5615ca776eed1971f78ab0061e5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"85f68130_c73a6602","in_reply_to":"a1d2c7fa_2684067b","updated":"2025-12-01 21:35:58.000000000","message":"I found an issue with the query string generating code.","commit_id":"e5dffcacc5456c8a77489256b7136c7fbb8c2224"},{"author":{"_account_id":33582,"name":"Mark Powers","email":"markpowers@uchicago.edu","username":"markpowers"},"change_message_id":"e5040504362ae5615ca776eed1971f78ab0061e5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"856f2bc9_08849ac7","updated":"2025-12-01 21:35:58.000000000","message":"Fixed these issues, which were problems that arose when cherry-picking from our fork that should now be resolved.","commit_id":"47f071fa2d2fed4b2feab7c83c0f5e5bfaea0752"},{"author":{"_account_id":15197,"name":"Pierre Riteau","email":"pierre@stackhpc.com","username":"priteau","status":"StackHPC"},"change_message_id":"fb59ece4d9c8004436cb040e7bc623ebe6d12941","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"78adebd5_f4ce6048","updated":"2026-02-05 12:43:27.000000000","message":"Looks good, just got some minor comments.","commit_id":"47f071fa2d2fed4b2feab7c83c0f5e5bfaea0752"},{"author":{"_account_id":35263,"name":"Matt Crees","email":"mattc@stackhpc.com","username":"mattcrees"},"change_message_id":"b26b713504bb311a374ac7c2c39927dd8d6dd79a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"120e0eda_ee8829ba","updated":"2025-12-09 14:27:13.000000000","message":"Thanks Mark! All working well in my testing now :)","commit_id":"47f071fa2d2fed4b2feab7c83c0f5e5bfaea0752"}],"blazar/plugins/flavor/flavor_plugin.py":[{"author":{"_account_id":15197,"name":"Pierre Riteau","email":"pierre@stackhpc.com","username":"priteau","status":"StackHPC"},"change_message_id":"81948531fd1661bf1b05e26a0b4b0d7efc468136","unresolved":true,"context_lines":[{"line_number":110,"context_line":"                values[\u0027amount\u0027], \"amount\", 1, db_api.DB_MAX_INT)"},{"line_number":111,"context_line":"        except ValueError as e:"},{"line_number":112,"context_line":"            raise mgr_exceptions.MalformedParameter(str(e))"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    def _get_hosts_by_trait(self):"},{"line_number":115,"context_line":"        \"\"\"Return a mapping of trait to set of hostnames having that trait.\"\"\""},{"line_number":116,"context_line":"        def _get_rp_traits(rp):"},{"line_number":117,"context_line":"            return rp, self._placement_client.get_traits(rp[\"uuid\"])"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        # Gather hosts per resource trait"},{"line_number":120,"context_line":"        hosts_by_trait \u003d collections.defaultdict(set)"},{"line_number":121,"context_line":"        resource_providers \u003d self._placement_client.list_resource_providers()"},{"line_number":122,"context_line":"        with concurrent.futures.ThreadPoolExecutor() as executor:"},{"line_number":123,"context_line":"            futures \u003d ["},{"line_number":124,"context_line":"                executor.submit(_get_rp_traits, rp)"},{"line_number":125,"context_line":"                for rp in resource_providers"},{"line_number":126,"context_line":"            ]"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"            for future in concurrent.futures.as_completed(futures):"},{"line_number":129,"context_line":"                rp, traits \u003d future.result()"},{"line_number":130,"context_line":"                for trait in traits:"},{"line_number":131,"context_line":"                    hosts_by_trait[trait].add(rp[\"name\"])"},{"line_number":132,"context_line":"        return hosts_by_trait"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def _query_available_hosts(self, start_date, end_date,"},{"line_number":135,"context_line":"                               resource_request, resource_traits):"}],"source_content_type":"text/x-python","patch_set":1,"id":"f4bc7c77_f89f7ba9","line":132,"range":{"start_line":113,"start_character":0,"end_line":132,"end_character":29},"updated":"2025-08-28 11:10:38.000000000","message":"This can fail when Placement can\u0027t answer (API issues, networking, etc.), what would be the output for the user?","commit_id":"da044d0f2396b5122d0b5eaf1d81f88ab29478d9"},{"author":{"_account_id":33582,"name":"Mark Powers","email":"markpowers@uchicago.edu","username":"markpowers"},"change_message_id":"74bb6c311dc7344bb8ca323e4078b7e515b43eee","unresolved":false,"context_lines":[{"line_number":110,"context_line":"                values[\u0027amount\u0027], \"amount\", 1, db_api.DB_MAX_INT)"},{"line_number":111,"context_line":"        except ValueError as e:"},{"line_number":112,"context_line":"            raise mgr_exceptions.MalformedParameter(str(e))"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    def _get_hosts_by_trait(self):"},{"line_number":115,"context_line":"        \"\"\"Return a mapping of trait to set of hostnames having that trait.\"\"\""},{"line_number":116,"context_line":"        def _get_rp_traits(rp):"},{"line_number":117,"context_line":"            return rp, self._placement_client.get_traits(rp[\"uuid\"])"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        # Gather hosts per resource trait"},{"line_number":120,"context_line":"        hosts_by_trait \u003d collections.defaultdict(set)"},{"line_number":121,"context_line":"        resource_providers \u003d self._placement_client.list_resource_providers()"},{"line_number":122,"context_line":"        with concurrent.futures.ThreadPoolExecutor() as executor:"},{"line_number":123,"context_line":"            futures \u003d ["},{"line_number":124,"context_line":"                executor.submit(_get_rp_traits, rp)"},{"line_number":125,"context_line":"                for rp in resource_providers"},{"line_number":126,"context_line":"            ]"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"            for future in concurrent.futures.as_completed(futures):"},{"line_number":129,"context_line":"                rp, traits \u003d future.result()"},{"line_number":130,"context_line":"                for trait in traits:"},{"line_number":131,"context_line":"                    hosts_by_trait[trait].add(rp[\"name\"])"},{"line_number":132,"context_line":"        return hosts_by_trait"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def _query_available_hosts(self, start_date, end_date,"},{"line_number":135,"context_line":"                               resource_request, resource_traits):"}],"source_content_type":"text/x-python","patch_set":1,"id":"b84d3851_6b490400","line":132,"range":{"start_line":113,"start_character":0,"end_line":132,"end_character":29},"in_reply_to":"d8ac7378_39b373e1","updated":"2025-10-02 16:59:23.000000000","message":"Done","commit_id":"da044d0f2396b5122d0b5eaf1d81f88ab29478d9"},{"author":{"_account_id":33582,"name":"Mark Powers","email":"markpowers@uchicago.edu","username":"markpowers"},"change_message_id":"dbd0e52e26bf347eeb6e8f83b3b83a38fbbe0285","unresolved":true,"context_lines":[{"line_number":110,"context_line":"                values[\u0027amount\u0027], \"amount\", 1, db_api.DB_MAX_INT)"},{"line_number":111,"context_line":"        except ValueError as e:"},{"line_number":112,"context_line":"            raise mgr_exceptions.MalformedParameter(str(e))"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    def _get_hosts_by_trait(self):"},{"line_number":115,"context_line":"        \"\"\"Return a mapping of trait to set of hostnames having that trait.\"\"\""},{"line_number":116,"context_line":"        def _get_rp_traits(rp):"},{"line_number":117,"context_line":"            return rp, self._placement_client.get_traits(rp[\"uuid\"])"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        # Gather hosts per resource trait"},{"line_number":120,"context_line":"        hosts_by_trait \u003d collections.defaultdict(set)"},{"line_number":121,"context_line":"        resource_providers \u003d self._placement_client.list_resource_providers()"},{"line_number":122,"context_line":"        with concurrent.futures.ThreadPoolExecutor() as executor:"},{"line_number":123,"context_line":"            futures \u003d ["},{"line_number":124,"context_line":"                executor.submit(_get_rp_traits, rp)"},{"line_number":125,"context_line":"                for rp in resource_providers"},{"line_number":126,"context_line":"            ]"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"            for future in concurrent.futures.as_completed(futures):"},{"line_number":129,"context_line":"                rp, traits \u003d future.result()"},{"line_number":130,"context_line":"                for trait in traits:"},{"line_number":131,"context_line":"                    hosts_by_trait[trait].add(rp[\"name\"])"},{"line_number":132,"context_line":"        return hosts_by_trait"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def _query_available_hosts(self, start_date, end_date,"},{"line_number":135,"context_line":"                               resource_request, resource_traits):"}],"source_content_type":"text/x-python","patch_set":1,"id":"d8ac7378_39b373e1","line":132,"range":{"start_line":113,"start_character":0,"end_line":132,"end_character":29},"in_reply_to":"f4bc7c77_f89f7ba9","updated":"2025-08-28 21:46:36.000000000","message":"I\u0027ve updated list_resource_providers to behavior like get_resource_provider in this respect. The user will see the message from `ResourceProviderListFailed` or `ResourceProviderNotFound` based on where the placement API fails.","commit_id":"da044d0f2396b5122d0b5eaf1d81f88ab29478d9"},{"author":{"_account_id":35263,"name":"Matt Crees","email":"mattc@stackhpc.com","username":"mattcrees"},"change_message_id":"b12f7ffe6ea4ee4ad32a57ef18fed18338fa6af8","unresolved":true,"context_lines":[{"line_number":149,"context_line":"            hypervisor_hostname \u003d host_info[\u0027host\u0027][\u0027hypervisor_hostname\u0027]"},{"line_number":150,"context_line":"            if ("},{"line_number":151,"context_line":"                resource_traits and"},{"line_number":152,"context_line":"                hypervisor_hostname not in placement_rps_matching_traits"},{"line_number":153,"context_line":"            ):"},{"line_number":154,"context_line":"                LOG.debug("},{"line_number":155,"context_line":"                    \"Placement filtered out host %s based on traits\","}],"source_content_type":"text/x-python","patch_set":4,"id":"b71801f2_666fbfb9","line":152,"updated":"2025-11-27 10:23:53.000000000","message":"```suggestion\n                hypervisor_hostname not in [rp[\u0027name\u0027] for rp in placement_rps_matching_traits]\n```","commit_id":"e5dffcacc5456c8a77489256b7136c7fbb8c2224"},{"author":{"_account_id":33582,"name":"Mark Powers","email":"markpowers@uchicago.edu","username":"markpowers"},"change_message_id":"e5040504362ae5615ca776eed1971f78ab0061e5","unresolved":false,"context_lines":[{"line_number":149,"context_line":"            hypervisor_hostname \u003d host_info[\u0027host\u0027][\u0027hypervisor_hostname\u0027]"},{"line_number":150,"context_line":"            if ("},{"line_number":151,"context_line":"                resource_traits and"},{"line_number":152,"context_line":"                hypervisor_hostname not in placement_rps_matching_traits"},{"line_number":153,"context_line":"            ):"},{"line_number":154,"context_line":"                LOG.debug("},{"line_number":155,"context_line":"                    \"Placement filtered out host %s based on traits\","}],"source_content_type":"text/x-python","patch_set":4,"id":"52aa671c_d04fd073","line":152,"in_reply_to":"b71801f2_666fbfb9","updated":"2025-12-01 21:35:58.000000000","message":"I\u0027ve updated this to generate a set of hostnames first.","commit_id":"e5dffcacc5456c8a77489256b7136c7fbb8c2224"},{"author":{"_account_id":15197,"name":"Pierre Riteau","email":"pierre@stackhpc.com","username":"priteau","status":"StackHPC"},"change_message_id":"fb59ece4d9c8004436cb040e7bc623ebe6d12941","unresolved":true,"context_lines":[{"line_number":143,"context_line":"                    query\u003df\"required\u003d{required_string}\","},{"line_number":144,"context_line":"                    microversion\u003d\"1.22\","},{"line_number":145,"context_line":"                )"},{"line_number":146,"context_line":"        placment_rps_matching_traits_hostnames \u003d {"},{"line_number":147,"context_line":"            rp[\u0027name\u0027] for rp in placement_rps_matching_traits"},{"line_number":148,"context_line":"        } if placement_rps_matching_traits else set()"},{"line_number":149,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"73ffec86_3577db11","line":146,"range":{"start_line":146,"start_character":8,"end_line":146,"end_character":46},"updated":"2026-02-05 12:43:27.000000000","message":"s/placment/placement/","commit_id":"47f071fa2d2fed4b2feab7c83c0f5e5bfaea0752"},{"author":{"_account_id":35263,"name":"Matt Crees","email":"mattc@stackhpc.com","username":"mattcrees"},"change_message_id":"a9922635563535bad114640921203f065aaba54d","unresolved":false,"context_lines":[{"line_number":143,"context_line":"                    query\u003df\"required\u003d{required_string}\","},{"line_number":144,"context_line":"                    microversion\u003d\"1.22\","},{"line_number":145,"context_line":"                )"},{"line_number":146,"context_line":"        placment_rps_matching_traits_hostnames \u003d {"},{"line_number":147,"context_line":"            rp[\u0027name\u0027] for rp in placement_rps_matching_traits"},{"line_number":148,"context_line":"        } if placement_rps_matching_traits else set()"},{"line_number":149,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"b8733fd1_a5660402","line":146,"range":{"start_line":146,"start_character":8,"end_line":146,"end_character":46},"in_reply_to":"73ffec86_3577db11","updated":"2026-02-05 15:16:13.000000000","message":"Done","commit_id":"47f071fa2d2fed4b2feab7c83c0f5e5bfaea0752"},{"author":{"_account_id":15197,"name":"Pierre Riteau","email":"pierre@stackhpc.com","username":"priteau","status":"StackHPC"},"change_message_id":"fb59ece4d9c8004436cb040e7bc623ebe6d12941","unresolved":true,"context_lines":[{"line_number":154,"context_line":"                resource_traits and"},{"line_number":155,"context_line":"                ("},{"line_number":156,"context_line":"                    hypervisor_hostname"},{"line_number":157,"context_line":"                    not in placment_rps_matching_traits_hostnames"},{"line_number":158,"context_line":"                )"},{"line_number":159,"context_line":"            ):"},{"line_number":160,"context_line":"                LOG.debug("}],"source_content_type":"text/x-python","patch_set":5,"id":"f688aa19_5fa79799","line":157,"range":{"start_line":157,"start_character":27,"end_line":157,"end_character":65},"updated":"2026-02-05 12:43:27.000000000","message":"s/placment/placement/","commit_id":"47f071fa2d2fed4b2feab7c83c0f5e5bfaea0752"},{"author":{"_account_id":35263,"name":"Matt Crees","email":"mattc@stackhpc.com","username":"mattcrees"},"change_message_id":"a9922635563535bad114640921203f065aaba54d","unresolved":false,"context_lines":[{"line_number":154,"context_line":"                resource_traits and"},{"line_number":155,"context_line":"                ("},{"line_number":156,"context_line":"                    hypervisor_hostname"},{"line_number":157,"context_line":"                    not in placment_rps_matching_traits_hostnames"},{"line_number":158,"context_line":"                )"},{"line_number":159,"context_line":"            ):"},{"line_number":160,"context_line":"                LOG.debug("}],"source_content_type":"text/x-python","patch_set":5,"id":"02db02f8_c86ec5d5","line":157,"range":{"start_line":157,"start_character":27,"end_line":157,"end_character":65},"in_reply_to":"f688aa19_5fa79799","updated":"2026-02-05 15:16:13.000000000","message":"Done","commit_id":"47f071fa2d2fed4b2feab7c83c0f5e5bfaea0752"}],"blazar/tests/plugins/flavor/test_flavor_plugin.py":[{"author":{"_account_id":15197,"name":"Pierre Riteau","email":"pierre@stackhpc.com","username":"priteau","status":"StackHPC"},"change_message_id":"fb59ece4d9c8004436cb040e7bc623ebe6d12941","unresolved":true,"context_lines":[{"line_number":354,"context_line":"    @mock.patch.object(placement.BlazarPlacementClient,"},{"line_number":355,"context_line":"                       \u0027list_resource_providers\u0027)"},{"line_number":356,"context_line":"    def test__query_available_hosts(self, mock_list_resource_providers):"},{"line_number":357,"context_line":"        mock_list_resource_providers.return_value \u003d {}"},{"line_number":358,"context_line":"        get_reservations \u003d self.patch(db_utils,"},{"line_number":359,"context_line":"                                      \u0027get_reservations_by_host_id\u0027)"},{"line_number":360,"context_line":"        get_reservations.return_value \u003d []"}],"source_content_type":"text/x-python","patch_set":5,"id":"2752fe3d_ff21d53f","line":357,"range":{"start_line":357,"start_character":52,"end_line":357,"end_character":54},"updated":"2026-02-05 12:43:27.000000000","message":"```suggestion\n        mock_list_resource_providers.return_value \u003d []\n```","commit_id":"47f071fa2d2fed4b2feab7c83c0f5e5bfaea0752"},{"author":{"_account_id":35263,"name":"Matt Crees","email":"mattc@stackhpc.com","username":"mattcrees"},"change_message_id":"a9922635563535bad114640921203f065aaba54d","unresolved":false,"context_lines":[{"line_number":354,"context_line":"    @mock.patch.object(placement.BlazarPlacementClient,"},{"line_number":355,"context_line":"                       \u0027list_resource_providers\u0027)"},{"line_number":356,"context_line":"    def test__query_available_hosts(self, mock_list_resource_providers):"},{"line_number":357,"context_line":"        mock_list_resource_providers.return_value \u003d {}"},{"line_number":358,"context_line":"        get_reservations \u003d self.patch(db_utils,"},{"line_number":359,"context_line":"                                      \u0027get_reservations_by_host_id\u0027)"},{"line_number":360,"context_line":"        get_reservations.return_value \u003d []"}],"source_content_type":"text/x-python","patch_set":5,"id":"41abe83c_9139d9bf","line":357,"range":{"start_line":357,"start_character":52,"end_line":357,"end_character":54},"in_reply_to":"2752fe3d_ff21d53f","updated":"2026-02-05 15:16:13.000000000","message":"Done","commit_id":"47f071fa2d2fed4b2feab7c83c0f5e5bfaea0752"}],"blazar/utils/openstack/placement.py":[{"author":{"_account_id":15197,"name":"Pierre Riteau","email":"pierre@stackhpc.com","username":"priteau","status":"StackHPC"},"change_message_id":"81948531fd1661bf1b05e26a0b4b0d7efc468136","unresolved":true,"context_lines":[{"line_number":329,"context_line":"        if resp:"},{"line_number":330,"context_line":"            return resp.json().get(\"traits\", [])"},{"line_number":331,"context_line":"        raise exceptions.ResourceProviderNotFound(resource_provider\u003drp_uuid)"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"    def list_resource_providers(self):"},{"line_number":334,"context_line":"        \"\"\"Get all resource providers.\"\"\""},{"line_number":335,"context_line":"        resp \u003d self.get(\u0027/resource_providers\u0027)"},{"line_number":336,"context_line":"        resource_providers \u003d []"},{"line_number":337,"context_line":"        if resp:"},{"line_number":338,"context_line":"            json_resp \u003d resp.json()"},{"line_number":339,"context_line":"            if json_resp[\u0027resource_providers\u0027]:"},{"line_number":340,"context_line":"                resource_providers \u003d json_resp[\u0027resource_providers\u0027]"},{"line_number":341,"context_line":"        return resource_providers"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"    @retrying.retry(stop_max_attempt_number\u003d5,"},{"line_number":344,"context_line":"                    retry_on_exception\u003dlambda e: isinstance("}],"source_content_type":"text/x-python","patch_set":1,"id":"dce4f487_a84d924b","line":341,"range":{"start_line":332,"start_character":0,"end_line":341,"end_character":33},"updated":"2025-08-28 11:10:38.000000000","message":"Could you please move this function near create_resource_provider and delete_resource_provider?","commit_id":"da044d0f2396b5122d0b5eaf1d81f88ab29478d9"},{"author":{"_account_id":33582,"name":"Mark Powers","email":"markpowers@uchicago.edu","username":"markpowers"},"change_message_id":"dbd0e52e26bf347eeb6e8f83b3b83a38fbbe0285","unresolved":false,"context_lines":[{"line_number":329,"context_line":"        if resp:"},{"line_number":330,"context_line":"            return resp.json().get(\"traits\", [])"},{"line_number":331,"context_line":"        raise exceptions.ResourceProviderNotFound(resource_provider\u003drp_uuid)"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"    def list_resource_providers(self):"},{"line_number":334,"context_line":"        \"\"\"Get all resource providers.\"\"\""},{"line_number":335,"context_line":"        resp \u003d self.get(\u0027/resource_providers\u0027)"},{"line_number":336,"context_line":"        resource_providers \u003d []"},{"line_number":337,"context_line":"        if resp:"},{"line_number":338,"context_line":"            json_resp \u003d resp.json()"},{"line_number":339,"context_line":"            if json_resp[\u0027resource_providers\u0027]:"},{"line_number":340,"context_line":"                resource_providers \u003d json_resp[\u0027resource_providers\u0027]"},{"line_number":341,"context_line":"        return resource_providers"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"    @retrying.retry(stop_max_attempt_number\u003d5,"},{"line_number":344,"context_line":"                    retry_on_exception\u003dlambda e: isinstance("}],"source_content_type":"text/x-python","patch_set":1,"id":"96d17af2_5a69c6a3","line":341,"range":{"start_line":332,"start_character":0,"end_line":341,"end_character":33},"in_reply_to":"dce4f487_a84d924b","updated":"2025-08-28 21:46:36.000000000","message":"Done","commit_id":"da044d0f2396b5122d0b5eaf1d81f88ab29478d9"},{"author":{"_account_id":35263,"name":"Matt Crees","email":"mattc@stackhpc.com","username":"mattcrees"},"change_message_id":"ee6943724fa02e56f651e522049317299f03ed5a","unresolved":true,"context_lines":[{"line_number":156,"context_line":"        :raise: ResourceProviderListFailed on error."},{"line_number":157,"context_line":"        \"\"\""},{"line_number":158,"context_line":"        resp \u003d self.get("},{"line_number":159,"context_line":"            \u0027/resource_providers?{query}\u0027, microversion\u003dmicroversion)"},{"line_number":160,"context_line":"        if resp:"},{"line_number":161,"context_line":"            json_resp \u003d resp.json()"},{"line_number":162,"context_line":"            if json_resp[\u0027resource_providers\u0027]:"}],"source_content_type":"text/x-python","patch_set":4,"id":"af91ebfc_7eb2b380","line":159,"updated":"2025-11-26 17:05:37.000000000","message":"```suggestion\n            f\u0027/resource_providers?{query}\u0027, microversion\u003dmicroversion)\n```\n\n`query` needs to be templated into this string:\n```\nPlacement API returning an error response: Invalid query string parameters: Additional properties are not allowed (\u0027{query}\u0027 was unexpected\n```","commit_id":"e5dffcacc5456c8a77489256b7136c7fbb8c2224"},{"author":{"_account_id":33582,"name":"Mark Powers","email":"markpowers@uchicago.edu","username":"markpowers"},"change_message_id":"e5040504362ae5615ca776eed1971f78ab0061e5","unresolved":false,"context_lines":[{"line_number":156,"context_line":"        :raise: ResourceProviderListFailed on error."},{"line_number":157,"context_line":"        \"\"\""},{"line_number":158,"context_line":"        resp \u003d self.get("},{"line_number":159,"context_line":"            \u0027/resource_providers?{query}\u0027, microversion\u003dmicroversion)"},{"line_number":160,"context_line":"        if resp:"},{"line_number":161,"context_line":"            json_resp \u003d resp.json()"},{"line_number":162,"context_line":"            if json_resp[\u0027resource_providers\u0027]:"}],"source_content_type":"text/x-python","patch_set":4,"id":"519d5c8e_2fb73d90","line":159,"in_reply_to":"af91ebfc_7eb2b380","updated":"2025-12-01 21:35:58.000000000","message":"Done","commit_id":"e5dffcacc5456c8a77489256b7136c7fbb8c2224"}]}
