)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cb7855ec49904567c261848f32ae4d1602d31c02","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"d2c1b1bc_e4ff4128","updated":"2026-09-11 11:50:29.000000000","message":"This is very thorough. The -1 is for the missing `check_api_version` function, since that\u0027ll result in an ugly (and wrong) warning for users attempting to use microversions. The rest of the changes can (and in some case, should) be done in a follow-up (though I\u0027d have a personal preference for doing as much as non-user facing changes I\u0027ve suggested as possible in this patch)","commit_id":"be6e799c089c0bbc83d178aaa3f15cc1e9e2d72d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"7d610f936516c8351f77d071e418924268a98625","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"a94f08d5_d37f6d2a","updated":"2026-09-09 23:33:01.000000000","message":"recheck E: Unable to locate package ksmtuned","commit_id":"be6e799c089c0bbc83d178aaa3f15cc1e9e2d72d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1b633a8141a57a1bcdbbe9a4f947ef40fdc6ff70","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"2880dfd1_80a7bdd3","updated":"2026-09-21 20:14:04.000000000","message":"There\u0027s an open TODO here (noted by Mel) but that\u0027s not a blocker, fwict.","commit_id":"bdb61bbcfe11d2fe731cd538e0a95ef7596dcbd5"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"297a9d071a42376003ec4cb85d37f391fc65a084","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"c18e9cce_a526b731","updated":"2026-09-21 14:59:33.000000000","message":"recheck https://meetings.opendev.org/irclogs/%23openstack-infra/%23openstack-infra.2026-09-19.log.html#openstack-infra.2026-09-19.log.html#t2026-09-19T17:05:59","commit_id":"bdb61bbcfe11d2fe731cd538e0a95ef7596dcbd5"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"ee84a995af7fc76bef97519f6f7e67202f2567b7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"d205ab57_0eb2e46b","updated":"2026-09-23 15:25:45.000000000","message":"recheck BadRequestException: 400: Client Error for url: https://10.176.194.219/compute/v2.1/os-quota-sets/0f433ea004a843ee8d28b35b53cd74c2/defaults, Project ID 0f433ea004a843ee8d28b35b53cd74c2 is not a valid project.","commit_id":"49e6c55cbdb0ce7731dc4ad6c829d40b1a74dc75"}],"openstackclient/accelerator/client.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cb7855ec49904567c261848f32ae4d1602d31c02","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":3,"id":"1811a762_96cd732d","line":53,"updated":"2026-09-11 11:50:29.000000000","message":"You need to add a `check_api_version` function here. It should always return `True` since you\u0027re using SDK and that supports auto-negotiation. See e.g. `openstackclient/volume/client.py` for examples. Without this, you\u0027ll get a warning like the below every time you try to use the `--os-accelerator-api-version` opt:\n\n```\naccelerator API version 2.2 is not in supported versions: 2\n```\n\n(you can test this yourself by removing the function from e.g. `openstackclient/volume/client.py` and using the `--os-volume-api-version` opt)","commit_id":"be6e799c089c0bbc83d178aaa3f15cc1e9e2d72d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"a48a6f58590d718f1e97abac021d99ad8ed5d606","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"516f55df_193d14d3","line":53,"in_reply_to":"1811a762_96cd732d","updated":"2026-09-19 00:33:13.000000000","message":"Done","commit_id":"be6e799c089c0bbc83d178aaa3f15cc1e9e2d72d"}],"openstackclient/accelerator/v2/accelerator_request.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cb7855ec49904567c261848f32ae4d1602d31c02","unresolved":true,"context_lines":[{"line_number":40,"context_line":"            \u0027hostname\u0027,"},{"line_number":41,"context_line":"            metavar\u003d\u0027\u003chostname\u003e\u0027,"},{"line_number":42,"context_line":"            help\u003d_(\"Hostname to bind the accelerator request to\"),"},{"line_number":43,"context_line":"        )"},{"line_number":44,"context_line":"        parser.add_argument("},{"line_number":45,"context_line":"            \u0027instance_uuid\u0027,"},{"line_number":46,"context_line":"            metavar\u003d\u0027\u003cinstance_uuid\u003e\u0027,"},{"line_number":47,"context_line":"            help\u003d_(\"UUID of the instance to bind the accelerator request to\"),"},{"line_number":48,"context_line":"        )"},{"line_number":49,"context_line":"        parser.add_argument("},{"line_number":50,"context_line":"            \u0027device_rp_uuid\u0027,"},{"line_number":51,"context_line":"            metavar\u003d\u0027\u003cdevice_rp_uuid\u003e\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"fe1e5a71_9c285c1e","line":48,"range":{"start_line":43,"start_character":9,"end_line":48,"end_character":9},"updated":"2026-09-11 11:50:29.000000000","message":"OSC uses the `server` terminology pretty consistently. Can we change this in a follow-up?","commit_id":"be6e799c089c0bbc83d178aaa3f15cc1e9e2d72d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"35c0845eeac8d32345ca4750f6b8331f30e8c729","unresolved":true,"context_lines":[{"line_number":40,"context_line":"            \u0027hostname\u0027,"},{"line_number":41,"context_line":"            metavar\u003d\u0027\u003chostname\u003e\u0027,"},{"line_number":42,"context_line":"            help\u003d_(\"Hostname to bind the accelerator request to\"),"},{"line_number":43,"context_line":"        )"},{"line_number":44,"context_line":"        parser.add_argument("},{"line_number":45,"context_line":"            \u0027instance_uuid\u0027,"},{"line_number":46,"context_line":"            metavar\u003d\u0027\u003cinstance_uuid\u003e\u0027,"},{"line_number":47,"context_line":"            help\u003d_(\"UUID of the instance to bind the accelerator request to\"),"},{"line_number":48,"context_line":"        )"},{"line_number":49,"context_line":"        parser.add_argument("},{"line_number":50,"context_line":"            \u0027device_rp_uuid\u0027,"},{"line_number":51,"context_line":"            metavar\u003d\u0027\u003cdevice_rp_uuid\u003e\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"94099508_a9106224","line":48,"range":{"start_line":43,"start_character":9,"end_line":48,"end_character":9},"in_reply_to":"c754dc14_42e6f11f","updated":"2026-09-22 02:48:18.000000000","message":"Follow up proposed at https://review.opendev.org/c/openstack/python-openstackclient/+/1006597","commit_id":"be6e799c089c0bbc83d178aaa3f15cc1e9e2d72d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"a48a6f58590d718f1e97abac021d99ad8ed5d606","unresolved":true,"context_lines":[{"line_number":40,"context_line":"            \u0027hostname\u0027,"},{"line_number":41,"context_line":"            metavar\u003d\u0027\u003chostname\u003e\u0027,"},{"line_number":42,"context_line":"            help\u003d_(\"Hostname to bind the accelerator request to\"),"},{"line_number":43,"context_line":"        )"},{"line_number":44,"context_line":"        parser.add_argument("},{"line_number":45,"context_line":"            \u0027instance_uuid\u0027,"},{"line_number":46,"context_line":"            metavar\u003d\u0027\u003cinstance_uuid\u003e\u0027,"},{"line_number":47,"context_line":"            help\u003d_(\"UUID of the instance to bind the accelerator request to\"),"},{"line_number":48,"context_line":"        )"},{"line_number":49,"context_line":"        parser.add_argument("},{"line_number":50,"context_line":"            \u0027device_rp_uuid\u0027,"},{"line_number":51,"context_line":"            metavar\u003d\u0027\u003cdevice_rp_uuid\u003e\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"c754dc14_42e6f11f","line":48,"range":{"start_line":43,"start_character":9,"end_line":48,"end_character":9},"in_reply_to":"fe1e5a71_9c285c1e","updated":"2026-09-19 00:33:13.000000000","message":"Yes, let me put together a follow up for this and other remaining follow up comments.","commit_id":"be6e799c089c0bbc83d178aaa3f15cc1e9e2d72d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cb7855ec49904567c261848f32ae4d1602d31c02","unresolved":true,"context_lines":[{"line_number":41,"context_line":"            metavar\u003d\u0027\u003chostname\u003e\u0027,"},{"line_number":42,"context_line":"            help\u003d_(\"Hostname to bind the accelerator request to\"),"},{"line_number":43,"context_line":"        )"},{"line_number":44,"context_line":"        parser.add_argument("},{"line_number":45,"context_line":"            \u0027instance_uuid\u0027,"},{"line_number":46,"context_line":"            metavar\u003d\u0027\u003cinstance_uuid\u003e\u0027,"},{"line_number":47,"context_line":"            help\u003d_(\"UUID of the instance to bind the accelerator request to\"),"},{"line_number":48,"context_line":"        )"},{"line_number":49,"context_line":"        parser.add_argument("},{"line_number":50,"context_line":"            \u0027device_rp_uuid\u0027,"},{"line_number":51,"context_line":"            metavar\u003d\u0027\u003cdevice_rp_uuid\u003e\u0027,"},{"line_number":52,"context_line":"            help\u003d_("},{"line_number":53,"context_line":"                \"UUID of the device resource provider to \""},{"line_number":54,"context_line":"                \"bind the accelerator request to\""},{"line_number":55,"context_line":"            ),"},{"line_number":56,"context_line":"        )"},{"line_number":57,"context_line":"        return parser"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def take_action("}],"source_content_type":"text/x-python","patch_set":3,"id":"4a974d62_d4d4ddd5","line":56,"range":{"start_line":44,"start_character":0,"end_line":56,"end_character":9},"updated":"2026-09-11 11:50:29.000000000","message":"This is a follow-up, but each of these should accept IDs **and** names and attempt to do lookups using the corresponding `find_` proxy methods. We can then drop the `uuid`.\n\nDitto for any other command that accepts UUIDs.","commit_id":"be6e799c089c0bbc83d178aaa3f15cc1e9e2d72d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"35c0845eeac8d32345ca4750f6b8331f30e8c729","unresolved":false,"context_lines":[{"line_number":41,"context_line":"            metavar\u003d\u0027\u003chostname\u003e\u0027,"},{"line_number":42,"context_line":"            help\u003d_(\"Hostname to bind the accelerator request to\"),"},{"line_number":43,"context_line":"        )"},{"line_number":44,"context_line":"        parser.add_argument("},{"line_number":45,"context_line":"            \u0027instance_uuid\u0027,"},{"line_number":46,"context_line":"            metavar\u003d\u0027\u003cinstance_uuid\u003e\u0027,"},{"line_number":47,"context_line":"            help\u003d_(\"UUID of the instance to bind the accelerator request to\"),"},{"line_number":48,"context_line":"        )"},{"line_number":49,"context_line":"        parser.add_argument("},{"line_number":50,"context_line":"            \u0027device_rp_uuid\u0027,"},{"line_number":51,"context_line":"            metavar\u003d\u0027\u003cdevice_rp_uuid\u003e\u0027,"},{"line_number":52,"context_line":"            help\u003d_("},{"line_number":53,"context_line":"                \"UUID of the device resource provider to \""},{"line_number":54,"context_line":"                \"bind the accelerator request to\""},{"line_number":55,"context_line":"            ),"},{"line_number":56,"context_line":"        )"},{"line_number":57,"context_line":"        return parser"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def take_action("}],"source_content_type":"text/x-python","patch_set":3,"id":"f51bb6fe_c53d63be","line":56,"range":{"start_line":44,"start_character":0,"end_line":56,"end_character":9},"in_reply_to":"4a974d62_d4d4ddd5","updated":"2026-09-22 02:48:18.000000000","message":"Done","commit_id":"be6e799c089c0bbc83d178aaa3f15cc1e9e2d72d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cb7855ec49904567c261848f32ae4d1602d31c02","unresolved":true,"context_lines":[{"line_number":99,"context_line":"            help\u003d_("},{"line_number":100,"context_line":"                \"Group ID of the device profile for the accelerator request\""},{"line_number":101,"context_line":"            ),"},{"line_number":102,"context_line":"        )"},{"line_number":103,"context_line":"        parser.add_argument("},{"line_number":104,"context_line":"            \u0027--image-uuid\u0027,"},{"line_number":105,"context_line":"            metavar\u003d\u0027\u003cglance_image_uuid\u003e\u0027,"},{"line_number":106,"context_line":"            dest\u003d\u0027img_uuid\u0027,"},{"line_number":107,"context_line":"            help\u003d_(\"UUID of the image saved in Glance\"),"},{"line_number":108,"context_line":"        )"},{"line_number":109,"context_line":"        return parser"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    def take_action("}],"source_content_type":"text/x-python","patch_set":3,"id":"5939310b_091a3142","line":108,"range":{"start_line":102,"start_character":9,"end_line":108,"end_character":9},"updated":"2026-09-11 11:50:29.000000000","message":"Same comment as above around accepting UUIDs **and** names. You get the point...","commit_id":"be6e799c089c0bbc83d178aaa3f15cc1e9e2d72d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"35c0845eeac8d32345ca4750f6b8331f30e8c729","unresolved":false,"context_lines":[{"line_number":99,"context_line":"            help\u003d_("},{"line_number":100,"context_line":"                \"Group ID of the device profile for the accelerator request\""},{"line_number":101,"context_line":"            ),"},{"line_number":102,"context_line":"        )"},{"line_number":103,"context_line":"        parser.add_argument("},{"line_number":104,"context_line":"            \u0027--image-uuid\u0027,"},{"line_number":105,"context_line":"            metavar\u003d\u0027\u003cglance_image_uuid\u003e\u0027,"},{"line_number":106,"context_line":"            dest\u003d\u0027img_uuid\u0027,"},{"line_number":107,"context_line":"            help\u003d_(\"UUID of the image saved in Glance\"),"},{"line_number":108,"context_line":"        )"},{"line_number":109,"context_line":"        return parser"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    def take_action("}],"source_content_type":"text/x-python","patch_set":3,"id":"3d7887ac_c90ea00c","line":108,"range":{"start_line":102,"start_character":9,"end_line":108,"end_character":9},"in_reply_to":"5939310b_091a3142","updated":"2026-09-22 02:48:18.000000000","message":"Done","commit_id":"be6e799c089c0bbc83d178aaa3f15cc1e9e2d72d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cb7855ec49904567c261848f32ae4d1602d31c02","unresolved":true,"context_lines":[{"line_number":250,"context_line":"        )"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"def _show_accelerator_request("},{"line_number":254,"context_line":"    acc_client: Any, uuid: str"},{"line_number":255,"context_line":") -\u003e tuple[tuple[str, ...], tuple[Any, ...]]:"},{"line_number":256,"context_line":"    columns \u003d ("}],"source_content_type":"text/x-python","patch_set":3,"id":"0d441506_8b64ffaf","line":253,"updated":"2026-09-11 11:50:29.000000000","message":"style nit: could we move this to the top of the file?","commit_id":"be6e799c089c0bbc83d178aaa3f15cc1e9e2d72d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"a48a6f58590d718f1e97abac021d99ad8ed5d606","unresolved":false,"context_lines":[{"line_number":250,"context_line":"        )"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"def _show_accelerator_request("},{"line_number":254,"context_line":"    acc_client: Any, uuid: str"},{"line_number":255,"context_line":") -\u003e tuple[tuple[str, ...], tuple[Any, ...]]:"},{"line_number":256,"context_line":"    columns \u003d ("}],"source_content_type":"text/x-python","patch_set":3,"id":"2d80b8ba_c1a87f40","line":253,"in_reply_to":"0d441506_8b64ffaf","updated":"2026-09-19 00:33:13.000000000","message":"Done","commit_id":"be6e799c089c0bbc83d178aaa3f15cc1e9e2d72d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cb7855ec49904567c261848f32ae4d1602d31c02","unresolved":true,"context_lines":[{"line_number":251,"context_line":""},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"def _show_accelerator_request("},{"line_number":254,"context_line":"    acc_client: Any, uuid: str"},{"line_number":255,"context_line":") -\u003e tuple[tuple[str, ...], tuple[Any, ...]]:"},{"line_number":256,"context_line":"    columns \u003d ("},{"line_number":257,"context_line":"        \"uuid\","}],"source_content_type":"text/x-python","patch_set":3,"id":"486176a4_24fb31c9","line":254,"updated":"2026-09-11 11:50:29.000000000","message":"If you add `from openstack.accelerator import v2 as accelerator_v2` at the top, you can do:\n\n```suggestion\n    client: accelerator_v2.Proxy, uuid: str\n```\n\nand you\u0027ll get actual types in here.\n\nAlso, can we move this to the top of the file to mirror what we do elsewhere (e.g. identity and network)","commit_id":"be6e799c089c0bbc83d178aaa3f15cc1e9e2d72d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"a48a6f58590d718f1e97abac021d99ad8ed5d606","unresolved":false,"context_lines":[{"line_number":251,"context_line":""},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"def _show_accelerator_request("},{"line_number":254,"context_line":"    acc_client: Any, uuid: str"},{"line_number":255,"context_line":") -\u003e tuple[tuple[str, ...], tuple[Any, ...]]:"},{"line_number":256,"context_line":"    columns \u003d ("},{"line_number":257,"context_line":"        \"uuid\","}],"source_content_type":"text/x-python","patch_set":3,"id":"d89a1243_24d209e5","line":254,"in_reply_to":"486176a4_24fb31c9","updated":"2026-09-19 00:33:13.000000000","message":"Done","commit_id":"be6e799c089c0bbc83d178aaa3f15cc1e9e2d72d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cb7855ec49904567c261848f32ae4d1602d31c02","unresolved":true,"context_lines":[{"line_number":253,"context_line":"def _show_accelerator_request("},{"line_number":254,"context_line":"    acc_client: Any, uuid: str"},{"line_number":255,"context_line":") -\u003e tuple[tuple[str, ...], tuple[Any, ...]]:"},{"line_number":256,"context_line":"    columns \u003d ("},{"line_number":257,"context_line":"        \"uuid\","},{"line_number":258,"context_line":"        \"state\","},{"line_number":259,"context_line":"        \"device_profile_name\","},{"line_number":260,"context_line":"        \"hostname\","},{"line_number":261,"context_line":"        \"device_rp_uuid\","},{"line_number":262,"context_line":"        \"instance_uuid\","},{"line_number":263,"context_line":"        \"attach_handle_type\","},{"line_number":264,"context_line":"        \"attach_handle_info\","},{"line_number":265,"context_line":"    )"},{"line_number":266,"context_line":"    arq \u003d acc_client.get_accelerator_request(uuid)"},{"line_number":267,"context_line":"    data \u003d arq.to_dict()"},{"line_number":268,"context_line":"    return columns, utils.get_dict_properties(data, columns)"}],"source_content_type":"text/x-python","patch_set":3,"id":"568e126c_e7f51695","line":268,"range":{"start_line":256,"start_character":0,"end_line":268,"end_character":60},"updated":"2026-09-11 11:50:29.000000000","message":"This works, but it\u0027d be more typical to use the `osc_lib.utils.get_item_properties` helper here.\n\n```suggestion\n    columns \u003d (\n        \"uuid\",\n        \"state\",\n        \"device_profile_name\",\n        \"hostname\",\n        \"device_rp_uuid\",\n        \"instance_uuid\",\n        \"attach_handle_type\",\n        \"attach_handle_info\",\n    )\n    arq \u003d client.get_accelerator_request(uuid)\n    return columns, utils.get_item_properties(data, columns)\n```\n\nAlso, I assume we need the `get_accelerator_request` call here? Doesn\u0027t e.g. `create_accelerator_request` return a full copy of the request? If not, _personally_ I\u0027d move the `get_accelerator_request` call into the callers (even if that means a bit of duplication) since you can make this clear. This function would then become a `_format_accelerator_request` function like we use through e.g. the `openstackclient.identity` module.","commit_id":"be6e799c089c0bbc83d178aaa3f15cc1e9e2d72d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"a48a6f58590d718f1e97abac021d99ad8ed5d606","unresolved":false,"context_lines":[{"line_number":253,"context_line":"def _show_accelerator_request("},{"line_number":254,"context_line":"    acc_client: Any, uuid: str"},{"line_number":255,"context_line":") -\u003e tuple[tuple[str, ...], tuple[Any, ...]]:"},{"line_number":256,"context_line":"    columns \u003d ("},{"line_number":257,"context_line":"        \"uuid\","},{"line_number":258,"context_line":"        \"state\","},{"line_number":259,"context_line":"        \"device_profile_name\","},{"line_number":260,"context_line":"        \"hostname\","},{"line_number":261,"context_line":"        \"device_rp_uuid\","},{"line_number":262,"context_line":"        \"instance_uuid\","},{"line_number":263,"context_line":"        \"attach_handle_type\","},{"line_number":264,"context_line":"        \"attach_handle_info\","},{"line_number":265,"context_line":"    )"},{"line_number":266,"context_line":"    arq \u003d acc_client.get_accelerator_request(uuid)"},{"line_number":267,"context_line":"    data \u003d arq.to_dict()"},{"line_number":268,"context_line":"    return columns, utils.get_dict_properties(data, columns)"}],"source_content_type":"text/x-python","patch_set":3,"id":"cbe51856_8c825133","line":268,"range":{"start_line":256,"start_character":0,"end_line":268,"end_character":60},"in_reply_to":"568e126c_e7f51695","updated":"2026-09-19 00:33:13.000000000","message":"Done","commit_id":"be6e799c089c0bbc83d178aaa3f15cc1e9e2d72d"}],"openstackclient/accelerator/v2/attribute.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cb7855ec49904567c261848f32ae4d1602d31c02","unresolved":true,"context_lines":[{"line_number":152,"context_line":"        return _show_attribute(acc_client, parsed_args.attribute)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"def _show_attribute("},{"line_number":156,"context_line":"    acc_client: Any, uuid: str"},{"line_number":157,"context_line":") -\u003e tuple[tuple[str, ...], tuple[Any, ...]]:"},{"line_number":158,"context_line":"    columns \u003d ("},{"line_number":159,"context_line":"        \"created_at\","},{"line_number":160,"context_line":"        \"updated_at\","},{"line_number":161,"context_line":"        \"uuid\","},{"line_number":162,"context_line":"        \"deployable_id\","},{"line_number":163,"context_line":"        \"key\","},{"line_number":164,"context_line":"        \"value\","},{"line_number":165,"context_line":"    )"},{"line_number":166,"context_line":"    attribute \u003d acc_client.get_attribute(uuid)"},{"line_number":167,"context_line":"    data \u003d attribute.to_dict()"},{"line_number":168,"context_line":"    return columns, utils.get_dict_properties(data, columns)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3af7f1e8_6d37717d","line":168,"range":{"start_line":155,"start_character":0,"end_line":168,"end_character":60},"updated":"2026-09-11 11:50:29.000000000","message":"All the same comments around moving this, adding the type for the acc_client, using `get_item_properties` and the potentially duplicate API call.","commit_id":"be6e799c089c0bbc83d178aaa3f15cc1e9e2d72d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"a48a6f58590d718f1e97abac021d99ad8ed5d606","unresolved":false,"context_lines":[{"line_number":152,"context_line":"        return _show_attribute(acc_client, parsed_args.attribute)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"def _show_attribute("},{"line_number":156,"context_line":"    acc_client: Any, uuid: str"},{"line_number":157,"context_line":") -\u003e tuple[tuple[str, ...], tuple[Any, ...]]:"},{"line_number":158,"context_line":"    columns \u003d ("},{"line_number":159,"context_line":"        \"created_at\","},{"line_number":160,"context_line":"        \"updated_at\","},{"line_number":161,"context_line":"        \"uuid\","},{"line_number":162,"context_line":"        \"deployable_id\","},{"line_number":163,"context_line":"        \"key\","},{"line_number":164,"context_line":"        \"value\","},{"line_number":165,"context_line":"    )"},{"line_number":166,"context_line":"    attribute \u003d acc_client.get_attribute(uuid)"},{"line_number":167,"context_line":"    data \u003d attribute.to_dict()"},{"line_number":168,"context_line":"    return columns, utils.get_dict_properties(data, columns)"}],"source_content_type":"text/x-python","patch_set":3,"id":"cadd2d1c_f5278750","line":168,"range":{"start_line":155,"start_character":0,"end_line":168,"end_character":60},"in_reply_to":"3af7f1e8_6d37717d","updated":"2026-09-19 00:33:13.000000000","message":"Done","commit_id":"be6e799c089c0bbc83d178aaa3f15cc1e9e2d72d"}],"openstackclient/accelerator/v2/deployable.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cb7855ec49904567c261848f32ae4d1602d31c02","unresolved":true,"context_lines":[{"line_number":46,"context_line":"    ) -\u003e tuple[Sequence[str], Iterable[Any]]:"},{"line_number":47,"context_line":"        acc_client \u003d self.app.client_manager.accelerator"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        column_headers: tuple[str, ...] \u003d ("},{"line_number":50,"context_line":"            \"uuid\","},{"line_number":51,"context_line":"            \"name\","},{"line_number":52,"context_line":"            \"device_id\","},{"line_number":53,"context_line":"        )"},{"line_number":54,"context_line":"        columns: tuple[str, ...] \u003d ("},{"line_number":55,"context_line":"            \"id\","},{"line_number":56,"context_line":"            \"name\","},{"line_number":57,"context_line":"            \"device_id\","},{"line_number":58,"context_line":"        )"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"        if parsed_args.detail:"},{"line_number":61,"context_line":"            column_headers \u003d ("}],"source_content_type":"text/x-python","patch_set":3,"id":"17028519_84857ac4","line":58,"range":{"start_line":49,"start_character":0,"end_line":58,"end_character":9},"updated":"2026-09-11 11:50:29.000000000","message":"The distinction isn\u0027t needed here. The `id` field is set up as an alias of the `uuid` in `openstack/accelerator/v2/deployable.py`, so you use UUID in both cases. Note this is what you\u0027re doing in other files already.\n\n```suggestion\n        columns: tuple[str, ...] \u003d (\n            \"uuid\",\n            \"name\",\n            \"device_id\",\n        )\n```","commit_id":"be6e799c089c0bbc83d178aaa3f15cc1e9e2d72d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"a48a6f58590d718f1e97abac021d99ad8ed5d606","unresolved":true,"context_lines":[{"line_number":46,"context_line":"    ) -\u003e tuple[Sequence[str], Iterable[Any]]:"},{"line_number":47,"context_line":"        acc_client \u003d self.app.client_manager.accelerator"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        column_headers: tuple[str, ...] \u003d ("},{"line_number":50,"context_line":"            \"uuid\","},{"line_number":51,"context_line":"            \"name\","},{"line_number":52,"context_line":"            \"device_id\","},{"line_number":53,"context_line":"        )"},{"line_number":54,"context_line":"        columns: tuple[str, ...] \u003d ("},{"line_number":55,"context_line":"            \"id\","},{"line_number":56,"context_line":"            \"name\","},{"line_number":57,"context_line":"            \"device_id\","},{"line_number":58,"context_line":"        )"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"        if parsed_args.detail:"},{"line_number":61,"context_line":"            column_headers \u003d ("}],"source_content_type":"text/x-python","patch_set":3,"id":"31dcdd9f_ff2c95a6","line":58,"range":{"start_line":49,"start_character":0,"end_line":58,"end_character":9},"in_reply_to":"17028519_84857ac4","updated":"2026-09-19 00:33:13.000000000","message":"OK, I am not familiar with this but if I understand correctly, the `id` field is set to use `uuid` as the `id` (via alternate_id) [1]. This means that it will map the uuid field from the API to the Resource.id, but not the other way around. Accessing Resource.uuid will yield nothing/empty.\n\n[1] https://github.com/openstack/openstacksdk/blob/b22ad455fc9dcde0e10c125a7d5bc56f515e3e56/openstack/accelerator/v2/deployable.py#L36","commit_id":"be6e799c089c0bbc83d178aaa3f15cc1e9e2d72d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"4d54c17f3029803961e5638375eef23c4e61efb7","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    ) -\u003e tuple[Sequence[str], Iterable[Any]]:"},{"line_number":47,"context_line":"        acc_client \u003d self.app.client_manager.accelerator"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        column_headers: tuple[str, ...] \u003d ("},{"line_number":50,"context_line":"            \"uuid\","},{"line_number":51,"context_line":"            \"name\","},{"line_number":52,"context_line":"            \"device_id\","},{"line_number":53,"context_line":"        )"},{"line_number":54,"context_line":"        columns: tuple[str, ...] \u003d ("},{"line_number":55,"context_line":"            \"id\","},{"line_number":56,"context_line":"            \"name\","},{"line_number":57,"context_line":"            \"device_id\","},{"line_number":58,"context_line":"        )"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"        if parsed_args.detail:"},{"line_number":61,"context_line":"            column_headers \u003d ("}],"source_content_type":"text/x-python","patch_set":3,"id":"8c4a4e30_cc932433","line":58,"range":{"start_line":49,"start_character":0,"end_line":58,"end_character":9},"in_reply_to":"31dcdd9f_ff2c95a6","updated":"2026-09-21 11:47:14.000000000","message":"Yes, exactly 👌","commit_id":"be6e799c089c0bbc83d178aaa3f15cc1e9e2d72d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cb7855ec49904567c261848f32ae4d1602d31c02","unresolved":true,"context_lines":[{"line_number":58,"context_line":"        )"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"        if parsed_args.detail:"},{"line_number":61,"context_line":"            column_headers \u003d ("},{"line_number":62,"context_line":"                \"created_at\","},{"line_number":63,"context_line":"                \"updated_at\","},{"line_number":64,"context_line":"                *column_headers,"},{"line_number":65,"context_line":"                \"parent_id\","},{"line_number":66,"context_line":"                \"root_id\","},{"line_number":67,"context_line":"                \"num_accelerators\","},{"line_number":68,"context_line":"            )"},{"line_number":69,"context_line":"            columns \u003d ("},{"line_number":70,"context_line":"                \"created_at\","},{"line_number":71,"context_line":"                \"updated_at\","},{"line_number":72,"context_line":"                *columns,"},{"line_number":73,"context_line":"                \"parent_id\","},{"line_number":74,"context_line":"                \"root_id\","},{"line_number":75,"context_line":"                \"num_accelerators\","},{"line_number":76,"context_line":"            )"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        data \u003d acc_client.deployables()"},{"line_number":79,"context_line":"        return ("}],"source_content_type":"text/x-python","patch_set":3,"id":"35e41212_c7a3fc1e","line":76,"range":{"start_line":61,"start_character":0,"end_line":76,"end_character":13},"updated":"2026-09-11 11:50:29.000000000","message":"```suggestion\n            columns \u003d (\n                \"created_at\",\n                \"updated_at\",\n                *columns,\n                \"parent_id\",\n                \"root_id\",\n                \"num_accelerators\",\n            )\n```","commit_id":"be6e799c089c0bbc83d178aaa3f15cc1e9e2d72d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"4d54c17f3029803961e5638375eef23c4e61efb7","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        )"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"        if parsed_args.detail:"},{"line_number":61,"context_line":"            column_headers \u003d ("},{"line_number":62,"context_line":"                \"created_at\","},{"line_number":63,"context_line":"                \"updated_at\","},{"line_number":64,"context_line":"                *column_headers,"},{"line_number":65,"context_line":"                \"parent_id\","},{"line_number":66,"context_line":"                \"root_id\","},{"line_number":67,"context_line":"                \"num_accelerators\","},{"line_number":68,"context_line":"            )"},{"line_number":69,"context_line":"            columns \u003d ("},{"line_number":70,"context_line":"                \"created_at\","},{"line_number":71,"context_line":"                \"updated_at\","},{"line_number":72,"context_line":"                *columns,"},{"line_number":73,"context_line":"                \"parent_id\","},{"line_number":74,"context_line":"                \"root_id\","},{"line_number":75,"context_line":"                \"num_accelerators\","},{"line_number":76,"context_line":"            )"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        data \u003d acc_client.deployables()"},{"line_number":79,"context_line":"        return ("}],"source_content_type":"text/x-python","patch_set":3,"id":"e6d24039_4a5cb0d3","line":76,"range":{"start_line":61,"start_character":0,"end_line":76,"end_character":13},"in_reply_to":"35e41212_c7a3fc1e","updated":"2026-09-21 11:47:14.000000000","message":"Done","commit_id":"be6e799c089c0bbc83d178aaa3f15cc1e9e2d72d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cb7855ec49904567c261848f32ae4d1602d31c02","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":3,"id":"13ac99b3_d8f97039","line":161,"range":{"start_line":147,"start_character":1,"end_line":161,"end_character":1},"updated":"2026-09-11 11:50:29.000000000","message":"Same comments","commit_id":"be6e799c089c0bbc83d178aaa3f15cc1e9e2d72d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"a48a6f58590d718f1e97abac021d99ad8ed5d606","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"4cd8f085_a097f0c1","line":161,"range":{"start_line":147,"start_character":1,"end_line":161,"end_character":1},"in_reply_to":"13ac99b3_d8f97039","updated":"2026-09-19 00:33:13.000000000","message":"Done","commit_id":"be6e799c089c0bbc83d178aaa3f15cc1e9e2d72d"}],"openstackclient/accelerator/v2/device.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cb7855ec49904567c261848f32ae4d1602d31c02","unresolved":true,"context_lines":[{"line_number":88,"context_line":"        return _show_device(acc_client, parsed_args.device)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"def _show_device("},{"line_number":92,"context_line":"    acc_client: Any, uuid: str"},{"line_number":93,"context_line":") -\u003e tuple[tuple[str, ...], tuple[Any, ...]]:"},{"line_number":94,"context_line":"    columns \u003d ("},{"line_number":95,"context_line":"        \"created_at\","},{"line_number":96,"context_line":"        \"updated_at\","},{"line_number":97,"context_line":"        \"uuid\","},{"line_number":98,"context_line":"        \"type\","},{"line_number":99,"context_line":"        \"vendor\","},{"line_number":100,"context_line":"        \"model\","},{"line_number":101,"context_line":"        \"hostname\","},{"line_number":102,"context_line":"        \"std_board_info\","},{"line_number":103,"context_line":"        \"vendor_board_info\","},{"line_number":104,"context_line":"    )"},{"line_number":105,"context_line":"    device \u003d acc_client.get_device(uuid)"},{"line_number":106,"context_line":"    data \u003d device.to_dict()"},{"line_number":107,"context_line":"    return columns, utils.get_dict_properties(data, columns)"}],"source_content_type":"text/x-python","patch_set":3,"id":"d63fe474_362e988a","line":107,"range":{"start_line":91,"start_character":0,"end_line":107,"end_character":60},"updated":"2026-09-11 11:50:29.000000000","message":"All the same comments around moving this, adding type, using `get_item_properties` and the potentially duplicate API call.","commit_id":"be6e799c089c0bbc83d178aaa3f15cc1e9e2d72d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"a48a6f58590d718f1e97abac021d99ad8ed5d606","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        return _show_device(acc_client, parsed_args.device)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"def _show_device("},{"line_number":92,"context_line":"    acc_client: Any, uuid: str"},{"line_number":93,"context_line":") -\u003e tuple[tuple[str, ...], tuple[Any, ...]]:"},{"line_number":94,"context_line":"    columns \u003d ("},{"line_number":95,"context_line":"        \"created_at\","},{"line_number":96,"context_line":"        \"updated_at\","},{"line_number":97,"context_line":"        \"uuid\","},{"line_number":98,"context_line":"        \"type\","},{"line_number":99,"context_line":"        \"vendor\","},{"line_number":100,"context_line":"        \"model\","},{"line_number":101,"context_line":"        \"hostname\","},{"line_number":102,"context_line":"        \"std_board_info\","},{"line_number":103,"context_line":"        \"vendor_board_info\","},{"line_number":104,"context_line":"    )"},{"line_number":105,"context_line":"    device \u003d acc_client.get_device(uuid)"},{"line_number":106,"context_line":"    data \u003d device.to_dict()"},{"line_number":107,"context_line":"    return columns, utils.get_dict_properties(data, columns)"}],"source_content_type":"text/x-python","patch_set":3,"id":"61593bba_1bcb9de1","line":107,"range":{"start_line":91,"start_character":0,"end_line":107,"end_character":60},"in_reply_to":"d63fe474_362e988a","updated":"2026-09-19 00:33:13.000000000","message":"Done","commit_id":"be6e799c089c0bbc83d178aaa3f15cc1e9e2d72d"}],"openstackclient/accelerator/v2/device_profile.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cb7855ec49904567c261848f32ae4d1602d31c02","unresolved":true,"context_lines":[{"line_number":38,"context_line":"            \u0027name\u0027,"},{"line_number":39,"context_line":"            metavar\u003d\u0027\u003cname\u003e\u0027,"},{"line_number":40,"context_line":"            help\u003d_(\"Unique name for the device profile\"),"},{"line_number":41,"context_line":"        )"},{"line_number":42,"context_line":"        parser.add_argument("},{"line_number":43,"context_line":"            \u0027groups\u0027,"},{"line_number":44,"context_line":"            metavar\u003d\u0027\u003cgroups\u003e\u0027,"},{"line_number":45,"context_line":"            help\u003d_("},{"line_number":46,"context_line":"                \"Device profile groups as a JSON list. \""},{"line_number":47,"context_line":"                \"e.g. \u0027[{\\\"resources:FPGA\\\": 1, \""},{"line_number":48,"context_line":"                \"\\\"trait:CUSTOM_FPGA_INTEL\\\": \\\"required\\\"}]\u0027\""},{"line_number":49,"context_line":"            ),"},{"line_number":50,"context_line":"        )"},{"line_number":51,"context_line":"        parser.add_argument("},{"line_number":52,"context_line":"            \u0027--description\u0027,"},{"line_number":53,"context_line":"            metavar\u003d\u0027\u003cdescription\u003e\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"127582be_b01728aa","line":50,"range":{"start_line":41,"start_character":9,"end_line":50,"end_character":9},"updated":"2026-09-11 11:50:29.000000000","message":"This is a follow-up, but this feel pretty hard to use. Could we deprecate this and replace it with a `--group` opt that uses `osc_lib.cli.parseractions.MultiKeyValueAction`. That way this could become:\n\n```\n--group\u003dresources:FPGA\u003d1,trait:CUSTOM_FPGA_INTEL\u003drequired\n```\n\nwhich (IMO) is a bit more pleasant?\n\nNote that the group should be marked as required if the API necessitates this","commit_id":"be6e799c089c0bbc83d178aaa3f15cc1e9e2d72d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"a48a6f58590d718f1e97abac021d99ad8ed5d606","unresolved":true,"context_lines":[{"line_number":38,"context_line":"            \u0027name\u0027,"},{"line_number":39,"context_line":"            metavar\u003d\u0027\u003cname\u003e\u0027,"},{"line_number":40,"context_line":"            help\u003d_(\"Unique name for the device profile\"),"},{"line_number":41,"context_line":"        )"},{"line_number":42,"context_line":"        parser.add_argument("},{"line_number":43,"context_line":"            \u0027groups\u0027,"},{"line_number":44,"context_line":"            metavar\u003d\u0027\u003cgroups\u003e\u0027,"},{"line_number":45,"context_line":"            help\u003d_("},{"line_number":46,"context_line":"                \"Device profile groups as a JSON list. \""},{"line_number":47,"context_line":"                \"e.g. \u0027[{\\\"resources:FPGA\\\": 1, \""},{"line_number":48,"context_line":"                \"\\\"trait:CUSTOM_FPGA_INTEL\\\": \\\"required\\\"}]\u0027\""},{"line_number":49,"context_line":"            ),"},{"line_number":50,"context_line":"        )"},{"line_number":51,"context_line":"        parser.add_argument("},{"line_number":52,"context_line":"            \u0027--description\u0027,"},{"line_number":53,"context_line":"            metavar\u003d\u0027\u003cdescription\u003e\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"2319c5c3_1e5eb7d7","line":50,"range":{"start_line":41,"start_character":9,"end_line":50,"end_character":9},"in_reply_to":"127582be_b01728aa","updated":"2026-09-19 00:33:13.000000000","message":"I\u0027ll include something like this in the follow up.","commit_id":"be6e799c089c0bbc83d178aaa3f15cc1e9e2d72d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"35c0845eeac8d32345ca4750f6b8331f30e8c729","unresolved":false,"context_lines":[{"line_number":38,"context_line":"            \u0027name\u0027,"},{"line_number":39,"context_line":"            metavar\u003d\u0027\u003cname\u003e\u0027,"},{"line_number":40,"context_line":"            help\u003d_(\"Unique name for the device profile\"),"},{"line_number":41,"context_line":"        )"},{"line_number":42,"context_line":"        parser.add_argument("},{"line_number":43,"context_line":"            \u0027groups\u0027,"},{"line_number":44,"context_line":"            metavar\u003d\u0027\u003cgroups\u003e\u0027,"},{"line_number":45,"context_line":"            help\u003d_("},{"line_number":46,"context_line":"                \"Device profile groups as a JSON list. \""},{"line_number":47,"context_line":"                \"e.g. \u0027[{\\\"resources:FPGA\\\": 1, \""},{"line_number":48,"context_line":"                \"\\\"trait:CUSTOM_FPGA_INTEL\\\": \\\"required\\\"}]\u0027\""},{"line_number":49,"context_line":"            ),"},{"line_number":50,"context_line":"        )"},{"line_number":51,"context_line":"        parser.add_argument("},{"line_number":52,"context_line":"            \u0027--description\u0027,"},{"line_number":53,"context_line":"            metavar\u003d\u0027\u003cdescription\u003e\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"66f246f0_e6922bc5","line":50,"range":{"start_line":41,"start_character":9,"end_line":50,"end_character":9},"in_reply_to":"2319c5c3_1e5eb7d7","updated":"2026-09-22 02:48:18.000000000","message":"Done","commit_id":"be6e799c089c0bbc83d178aaa3f15cc1e9e2d72d"}],"openstackclient/common/clientmanager.py":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"9e127cc7fbd814b31fe9e4353824514b8f6958ea","unresolved":true,"context_lines":[{"line_number":275,"context_line":"PLUGIN_MODULES \u003d get_plugin_modules("},{"line_number":276,"context_line":"    \u0027openstack.cli.base\u0027,"},{"line_number":277,"context_line":")"},{"line_number":278,"context_line":"# Append list of external plugin modules"},{"line_number":279,"context_line":"PLUGIN_MODULES.extend("},{"line_number":280,"context_line":"    get_plugin_modules("},{"line_number":281,"context_line":"        \u0027openstack.cli.extension\u0027,"},{"line_number":282,"context_line":"    )"},{"line_number":283,"context_line":")"}],"source_content_type":"text/x-python","patch_set":4,"id":"97bef661_f6ae21b1","line":283,"range":{"start_line":278,"start_character":0,"end_line":283,"end_character":1},"updated":"2026-09-21 17:46:26.000000000","message":"During manual testing I hit an argparse conflict when python-cyborgclient is still installed alongside the in-tree accelerator module: both register `API_NAME \u003d \u0027accelerator\u0027` and both call `build_option_parser()` to add `--os-accelerator-api-version`, so the second one crashes.\n\n  neutronclient avoided this by design — it uses `API_NAME \u003d \u0027neutronclient\u0027` (not `\u0027network\u0027`) and its build_option_parser is a no-op.\n\nOne way to handle it is to skip cli.extension modules in clientmanager.py when a cli.base module already provides the same API_NAME. Something like:\n\n```\n_base_api_names \u003d {mod.API_NAME for mod in PLUGIN_MODULES}\nPLUGIN_MODULES.extend(\n    mod for mod in get_plugin_modules(\u0027openstack.cli.extension\u0027)\n    if mod.API_NAME not in _base_api_names\n)\n```\n\nWhat do you think? Any other suggestions?","commit_id":"bdb61bbcfe11d2fe731cd538e0a95ef7596dcbd5"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"dabc1803e1c3b31e413cfb1b73437a7f88d61990","unresolved":true,"context_lines":[{"line_number":275,"context_line":"PLUGIN_MODULES \u003d get_plugin_modules("},{"line_number":276,"context_line":"    \u0027openstack.cli.base\u0027,"},{"line_number":277,"context_line":")"},{"line_number":278,"context_line":"# Append list of external plugin modules"},{"line_number":279,"context_line":"PLUGIN_MODULES.extend("},{"line_number":280,"context_line":"    get_plugin_modules("},{"line_number":281,"context_line":"        \u0027openstack.cli.extension\u0027,"},{"line_number":282,"context_line":"    )"},{"line_number":283,"context_line":")"}],"source_content_type":"text/x-python","patch_set":4,"id":"dd0f0907_174717ee","line":283,"range":{"start_line":278,"start_character":0,"end_line":283,"end_character":1},"in_reply_to":"2068d31f_b9654415","updated":"2026-09-22 00:21:22.000000000","message":"AFAICT the `conflict_resolver` only works within a single namespace whereas our conflict is between two separate namespaces `openstack.cli.base` and `openstack.cli.extension`. So I think we will not be able to use it to handle this case.\n\nI think it might be best to include it in this patch so we don\u0027t have to think about it. Will update.","commit_id":"bdb61bbcfe11d2fe731cd538e0a95ef7596dcbd5"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1b633a8141a57a1bcdbbe9a4f947ef40fdc6ff70","unresolved":true,"context_lines":[{"line_number":275,"context_line":"PLUGIN_MODULES \u003d get_plugin_modules("},{"line_number":276,"context_line":"    \u0027openstack.cli.base\u0027,"},{"line_number":277,"context_line":")"},{"line_number":278,"context_line":"# Append list of external plugin modules"},{"line_number":279,"context_line":"PLUGIN_MODULES.extend("},{"line_number":280,"context_line":"    get_plugin_modules("},{"line_number":281,"context_line":"        \u0027openstack.cli.extension\u0027,"},{"line_number":282,"context_line":"    )"},{"line_number":283,"context_line":")"}],"source_content_type":"text/x-python","patch_set":4,"id":"2068d31f_b9654415","line":283,"range":{"start_line":278,"start_character":0,"end_line":283,"end_character":1},"in_reply_to":"97bef661_f6ae21b1","updated":"2026-09-21 20:14:04.000000000","message":"The other option is to use the `conflict_resolver` functionality found in recent stevedore releases. This could be slotted into into `get_plugin_modules` above. There are docs on this [here](https://docs.openstack.org/stevedore/latest/user/conflict_resolution.html#writing-a-custom-resolver). What you\u0027re suggested here would also work though and is probably simpler...\n\ntbh, I\u0027m happy with either. Do you want to opt for your preferred option and propose this in a separate patch? Before or after is fine once we don\u0027t cut a release with this change but without that one.","commit_id":"bdb61bbcfe11d2fe731cd538e0a95ef7596dcbd5"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"35c0845eeac8d32345ca4750f6b8331f30e8c729","unresolved":false,"context_lines":[{"line_number":275,"context_line":"PLUGIN_MODULES \u003d get_plugin_modules("},{"line_number":276,"context_line":"    \u0027openstack.cli.base\u0027,"},{"line_number":277,"context_line":")"},{"line_number":278,"context_line":"# Append list of external plugin modules"},{"line_number":279,"context_line":"PLUGIN_MODULES.extend("},{"line_number":280,"context_line":"    get_plugin_modules("},{"line_number":281,"context_line":"        \u0027openstack.cli.extension\u0027,"},{"line_number":282,"context_line":"    )"},{"line_number":283,"context_line":")"}],"source_content_type":"text/x-python","patch_set":4,"id":"469666bd_50f019ab","line":283,"range":{"start_line":278,"start_character":0,"end_line":283,"end_character":1},"in_reply_to":"dd0f0907_174717ee","updated":"2026-09-22 02:48:18.000000000","message":"Done","commit_id":"bdb61bbcfe11d2fe731cd538e0a95ef7596dcbd5"}],"openstackclient/tests/unit/accelerator/v2/fakes.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cb7855ec49904567c261848f32ae4d1602d31c02","unresolved":true,"context_lines":[{"line_number":25,"context_line":"        self.app.client_manager.accelerator \u003d mock.Mock("},{"line_number":26,"context_line":"            spec\u003daccelerator_v2.Proxy"},{"line_number":27,"context_line":"        )"},{"line_number":28,"context_line":"        self.acc_client \u003d self.app.client_manager.accelerator"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class TestAccelerator("}],"source_content_type":"text/x-python","patch_set":3,"id":"57aab969_1a7ee026","line":28,"updated":"2026-09-11 11:50:29.000000000","message":"nit: any reason not to expand this?\n\n```suggestion\n        self.accelerator_client \u003d self.app.client_manager.accelerator\n```\n\n(An LSP should be able to trivially bulk rename this)","commit_id":"be6e799c089c0bbc83d178aaa3f15cc1e9e2d72d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"a48a6f58590d718f1e97abac021d99ad8ed5d606","unresolved":false,"context_lines":[{"line_number":25,"context_line":"        self.app.client_manager.accelerator \u003d mock.Mock("},{"line_number":26,"context_line":"            spec\u003daccelerator_v2.Proxy"},{"line_number":27,"context_line":"        )"},{"line_number":28,"context_line":"        self.acc_client \u003d self.app.client_manager.accelerator"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class TestAccelerator("}],"source_content_type":"text/x-python","patch_set":3,"id":"94324952_bcd468c3","line":28,"in_reply_to":"57aab969_1a7ee026","updated":"2026-09-19 00:33:13.000000000","message":"Done","commit_id":"be6e799c089c0bbc83d178aaa3f15cc1e9e2d72d"}]}
