)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"64e520e668dc016cad1306951cafde9cbb7fbf15","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"d037b4de_7834a957","updated":"2025-11-18 12:25:39.000000000","message":"Smallest of nits","commit_id":"f5e6975485fd6e28289c49a1f3bf91c510b20ab5"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6de32d5f128dd7510ce88a4749c90afbcaeace15","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"220a9a2b_c890f931","updated":"2025-11-26 11:34:23.000000000","message":"Great work here so far. Lots of comments, but they\u0027re almost all about making more use of the code *you\u0027ve* already written 😄","commit_id":"4db0682fc98d4a2127343edc31a15ad96b3da7aa"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"461b06ecf826f00aa12d4657b2c6fd707613181d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"976d8514_2f8bbc36","updated":"2025-12-02 00:16:13.000000000","message":"Will get around to the other comments in a bit - feel free to read the ones I\u0027ve replied to so far.","commit_id":"f5af8276ce0d876ac41a8414c5f363681136d32c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d836fb520b0f3ddda4c4e44de7ff6cc6c3220432","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"f1ce41a3_3e2fbac2","updated":"2025-12-04 13:49:51.000000000","message":"I think there are a few comments still unresolved here","commit_id":"e01c21d8c3de5bab0059803ef894d18138f93b21"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c6b1ef4a258f850703c58af8104c342d5290dae2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"f443016c_746b6000","updated":"2026-01-07 11:30:17.000000000","message":"Still the same open comments","commit_id":"e07058fe3cbe3bddd32c811692be7fcaeac3c53e"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"6df9df7052b8ddbc80b7b097f6a2d1328b135c38","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"249617fb_487529da","in_reply_to":"f443016c_746b6000","updated":"2026-01-08 09:56:32.000000000","message":"Sorry, Zuul keeps adding you back to the attention set when I push changes... I\u0027ll fix it manually if it happens again next time.","commit_id":"e07058fe3cbe3bddd32c811692be7fcaeac3c53e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"13cf0e40f2c8f61a3257e362a1006e65c7a3bc3b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"87db7731_cb01ce18","updated":"2026-01-27 17:29:05.000000000","message":"Some final nits","commit_id":"154bac80113797531e57a0c6bfae20b4b0489871"}],"openstackclient/identity/v3/project.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"64e520e668dc016cad1306951cafde9cbb7fbf15","unresolved":true,"context_lines":[{"line_number":512,"context_line":""},{"line_number":513,"context_line":"        kwargs \u003d {}"},{"line_number":514,"context_line":""},{"line_number":515,"context_line":"        # Get project id first; otherwise, find_project() can\u0027t find parents/children if only project name was given"},{"line_number":516,"context_line":"        if parsed_args.domain:"},{"line_number":517,"context_line":"            domain \u003d common.find_domain_id_sdk("},{"line_number":518,"context_line":"                identity_client, parsed_args.domain"}],"source_content_type":"text/x-python","patch_set":5,"id":"cb9cbae8_de94de73","line":515,"updated":"2025-11-18 12:25:39.000000000","message":"Can you wrap this at \u003c\u003d 79 characters? We just re-enabled the rule to enforce this so it won\u0027t merge without it","commit_id":"f5e6975485fd6e28289c49a1f3bf91c510b20ab5"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"4a11ebdff59d7188f268adda66d791b2b84166bd","unresolved":false,"context_lines":[{"line_number":512,"context_line":""},{"line_number":513,"context_line":"        kwargs \u003d {}"},{"line_number":514,"context_line":""},{"line_number":515,"context_line":"        # Get project id first; otherwise, find_project() can\u0027t find parents/children if only project name was given"},{"line_number":516,"context_line":"        if parsed_args.domain:"},{"line_number":517,"context_line":"            domain \u003d common.find_domain_id_sdk("},{"line_number":518,"context_line":"                identity_client, parsed_args.domain"}],"source_content_type":"text/x-python","patch_set":5,"id":"c4541ff7_b692d0a1","line":515,"in_reply_to":"cb9cbae8_de94de73","updated":"2025-11-18 18:01:45.000000000","message":"Done","commit_id":"f5e6975485fd6e28289c49a1f3bf91c510b20ab5"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6de32d5f128dd7510ce88a4749c90afbcaeace15","unresolved":true,"context_lines":[{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        if parsed_args.properties:"},{"line_number":113,"context_line":"            kwargs \u003d parsed_args.properties.copy()"},{"line_number":114,"context_line":"        if \u0027is_domain\u0027 in kwargs.keys():"},{"line_number":115,"context_line":"            if kwargs[\u0027is_domain\u0027].lower() \u003d\u003d \"true\":"},{"line_number":116,"context_line":"                kwargs[\u0027is_domain\u0027] \u003d True"},{"line_number":117,"context_line":"            elif kwargs[\u0027is_domain\u0027].lower() \u003d\u003d \"false\":"}],"source_content_type":"text/x-python","patch_set":6,"id":"d584cebe_328167a9","line":114,"updated":"2025-11-26 11:34:23.000000000","message":"unrelated nit, but seeing as you\u0027re adding whitespace already...\n\n```suggestion\n\n        if \u0027is_domain\u0027 in kwargs.keys():\n```","commit_id":"4db0682fc98d4a2127343edc31a15ad96b3da7aa"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"fa96d7324a4b9557bb343d4f067198f3bcc63c63","unresolved":false,"context_lines":[{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        if parsed_args.properties:"},{"line_number":113,"context_line":"            kwargs \u003d parsed_args.properties.copy()"},{"line_number":114,"context_line":"        if \u0027is_domain\u0027 in kwargs.keys():"},{"line_number":115,"context_line":"            if kwargs[\u0027is_domain\u0027].lower() \u003d\u003d \"true\":"},{"line_number":116,"context_line":"                kwargs[\u0027is_domain\u0027] \u003d True"},{"line_number":117,"context_line":"            elif kwargs[\u0027is_domain\u0027].lower() \u003d\u003d \"false\":"}],"source_content_type":"text/x-python","patch_set":6,"id":"ca96db08_33567804","line":114,"in_reply_to":"d584cebe_328167a9","updated":"2025-12-02 00:13:04.000000000","message":"Fix applied.","commit_id":"4db0682fc98d4a2127343edc31a15ad96b3da7aa"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6de32d5f128dd7510ce88a4749c90afbcaeace15","unresolved":true,"context_lines":[{"line_number":135,"context_line":"        if parsed_args.parent:"},{"line_number":136,"context_line":"            kwargs[\u0027parent_id\u0027] \u003d common.find_project_id_sdk("},{"line_number":137,"context_line":"                identity_client,"},{"line_number":138,"context_line":"                parsed_args.parent,"},{"line_number":139,"context_line":"            )"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        kwargs[\u0027is_enabled\u0027] \u003d parsed_args.enabled"}],"source_content_type":"text/x-python","patch_set":6,"id":"182e5850_8794d97e","line":138,"updated":"2025-11-26 11:34:23.000000000","message":"Do we need to pass domain in here if set? I assume if there\u0027s a domain owning the project then that domain would also own the parent project? You might need to look at what keystoneclient is doing here.","commit_id":"4db0682fc98d4a2127343edc31a15ad96b3da7aa"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"6df9df7052b8ddbc80b7b097f6a2d1328b135c38","unresolved":true,"context_lines":[{"line_number":135,"context_line":"        if parsed_args.parent:"},{"line_number":136,"context_line":"            kwargs[\u0027parent_id\u0027] \u003d common.find_project_id_sdk("},{"line_number":137,"context_line":"                identity_client,"},{"line_number":138,"context_line":"                parsed_args.parent,"},{"line_number":139,"context_line":"            )"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        kwargs[\u0027is_enabled\u0027] \u003d parsed_args.enabled"}],"source_content_type":"text/x-python","patch_set":6,"id":"a78098fd_60bc0a28","line":138,"in_reply_to":"182e5850_8794d97e","updated":"2026-01-08 09:56:32.000000000","message":"The domain wasn\u0027t being passed in here before (when it was using keystoneclient), and keystoneclient doesn\u0027t do anything special when a domain isn\u0027t passed in. So if we changed it to pass in the domain, then that would be a behavior change it seems, even though it does make more sense to me too.","commit_id":"4db0682fc98d4a2127343edc31a15ad96b3da7aa"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"13cf0e40f2c8f61a3257e362a1006e65c7a3bc3b","unresolved":true,"context_lines":[{"line_number":135,"context_line":"        if parsed_args.parent:"},{"line_number":136,"context_line":"            kwargs[\u0027parent_id\u0027] \u003d common.find_project_id_sdk("},{"line_number":137,"context_line":"                identity_client,"},{"line_number":138,"context_line":"                parsed_args.parent,"},{"line_number":139,"context_line":"            )"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        kwargs[\u0027is_enabled\u0027] \u003d parsed_args.enabled"}],"source_content_type":"text/x-python","patch_set":6,"id":"c6523700_063500d4","line":138,"in_reply_to":"a78098fd_60bc0a28","updated":"2026-01-27 17:29:05.000000000","message":"Right, let\u0027s do this in a follow-up.","commit_id":"4db0682fc98d4a2127343edc31a15ad96b3da7aa"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"0738494123a32806db4c6cadbd73859cda627ca2","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        if parsed_args.parent:"},{"line_number":136,"context_line":"            kwargs[\u0027parent_id\u0027] \u003d common.find_project_id_sdk("},{"line_number":137,"context_line":"                identity_client,"},{"line_number":138,"context_line":"                parsed_args.parent,"},{"line_number":139,"context_line":"            )"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        kwargs[\u0027is_enabled\u0027] \u003d parsed_args.enabled"}],"source_content_type":"text/x-python","patch_set":6,"id":"6c63effb_824f83df","line":138,"in_reply_to":"c6523700_063500d4","updated":"2026-01-27 21:58:30.000000000","message":"Ah, I thought I\u0027d already pushed one but looks like I forgot. Link - https://review.opendev.org/c/openstack/python-openstackclient/+/974953","commit_id":"4db0682fc98d4a2127343edc31a15ad96b3da7aa"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6de32d5f128dd7510ce88a4749c90afbcaeace15","unresolved":true,"context_lines":[{"line_number":138,"context_line":"                parsed_args.parent,"},{"line_number":139,"context_line":"            )"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        kwargs[\u0027is_enabled\u0027] \u003d parsed_args.enabled"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        if parsed_args.tags:"},{"line_number":144,"context_line":"            kwargs[\u0027tags\u0027] \u003d list(set(parsed_args.tags))"}],"source_content_type":"text/x-python","patch_set":6,"id":"4cb159b2_da2edc06","line":141,"updated":"2025-11-26 11:34:23.000000000","message":"nit: we could set this initially when creating `kwargs`","commit_id":"4db0682fc98d4a2127343edc31a15ad96b3da7aa"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"e64ee595f1ead208e66a1f205879e4c287dc0487","unresolved":false,"context_lines":[{"line_number":138,"context_line":"                parsed_args.parent,"},{"line_number":139,"context_line":"            )"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        kwargs[\u0027is_enabled\u0027] \u003d parsed_args.enabled"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        if parsed_args.tags:"},{"line_number":144,"context_line":"            kwargs[\u0027tags\u0027] \u003d list(set(parsed_args.tags))"}],"source_content_type":"text/x-python","patch_set":6,"id":"cd3fd85a_938474e8","line":141,"in_reply_to":"4cb159b2_da2edc06","updated":"2025-12-03 00:10:51.000000000","message":"If `parsed_args.properties` exists, `kwargs` is initialized as `parsed_args.properties`. If  there happened to be an `enabled` property in `parsed_args.properties`, then the existing behavior is that `parsed_args.enabled` should take precedence and overwrite it. So I think `is_enabled` should still be set here to keep that behavior.","commit_id":"4db0682fc98d4a2127343edc31a15ad96b3da7aa"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"b845b126e7fabe91087096f518199d9feefc87f1","unresolved":false,"context_lines":[{"line_number":138,"context_line":"                parsed_args.parent,"},{"line_number":139,"context_line":"            )"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        kwargs[\u0027is_enabled\u0027] \u003d parsed_args.enabled"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        if parsed_args.tags:"},{"line_number":144,"context_line":"            kwargs[\u0027tags\u0027] \u003d list(set(parsed_args.tags))"}],"source_content_type":"text/x-python","patch_set":6,"id":"64765ac6_05599f1a","line":141,"in_reply_to":"cd3fd85a_938474e8","updated":"2025-12-04 13:49:35.000000000","message":"Ack, that makes sense.","commit_id":"4db0682fc98d4a2127343edc31a15ad96b3da7aa"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6de32d5f128dd7510ce88a4749c90afbcaeace15","unresolved":true,"context_lines":[{"line_number":143,"context_line":"        if parsed_args.tags:"},{"line_number":144,"context_line":"            kwargs[\u0027tags\u0027] \u003d list(set(parsed_args.tags))"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"        if parsed_args.immutable is not None:"},{"line_number":147,"context_line":"            kwargs[\u0027options\u0027] \u003d {}"},{"line_number":148,"context_line":"            kwargs[\u0027options\u0027][\u0027immutable\u0027] \u003d parsed_args.immutable"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"        try:"},{"line_number":151,"context_line":"            project \u003d identity_client.create_project("}],"source_content_type":"text/x-python","patch_set":6,"id":"bd512710_4cb3a16b","line":148,"range":{"start_line":146,"start_character":45,"end_line":148,"end_character":66},"updated":"2025-11-26 11:34:23.000000000","message":"```suggestion\n        if parsed_args.immutable is not None:\n            kwargs[\u0027options\u0027] \u003d {\u0027immutable\u0027: parsed_args.immutable}\n```","commit_id":"4db0682fc98d4a2127343edc31a15ad96b3da7aa"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"fa96d7324a4b9557bb343d4f067198f3bcc63c63","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        if parsed_args.tags:"},{"line_number":144,"context_line":"            kwargs[\u0027tags\u0027] \u003d list(set(parsed_args.tags))"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"        if parsed_args.immutable is not None:"},{"line_number":147,"context_line":"            kwargs[\u0027options\u0027] \u003d {}"},{"line_number":148,"context_line":"            kwargs[\u0027options\u0027][\u0027immutable\u0027] \u003d parsed_args.immutable"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"        try:"},{"line_number":151,"context_line":"            project \u003d identity_client.create_project("}],"source_content_type":"text/x-python","patch_set":6,"id":"a74e43e0_334de407","line":148,"range":{"start_line":146,"start_character":45,"end_line":148,"end_character":66},"in_reply_to":"bd512710_4cb3a16b","updated":"2025-12-02 00:13:04.000000000","message":"Fix applied.","commit_id":"4db0682fc98d4a2127343edc31a15ad96b3da7aa"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6de32d5f128dd7510ce88a4749c90afbcaeace15","unresolved":true,"context_lines":[{"line_number":201,"context_line":"        errors \u003d 0"},{"line_number":202,"context_line":"        for project in parsed_args.projects:"},{"line_number":203,"context_line":"            try:"},{"line_number":204,"context_line":"                if parsed_args.domain is not None:"},{"line_number":205,"context_line":"                    project \u003d common.find_project_id_sdk("},{"line_number":206,"context_line":"                        identity_client,"},{"line_number":207,"context_line":"                        project,"},{"line_number":208,"context_line":"                        domain_name_or_id\u003dparsed_args.domain,"},{"line_number":209,"context_line":"                        validate_actor_existence\u003dTrue,"},{"line_number":210,"context_line":"                        validate_domain_actor_existence\u003dFalse,"},{"line_number":211,"context_line":"                    )"},{"line_number":212,"context_line":"                else:"},{"line_number":213,"context_line":"                    project \u003d common.find_project_id_sdk("},{"line_number":214,"context_line":"                        identity_client,"},{"line_number":215,"context_line":"                        project,"},{"line_number":216,"context_line":"                        validate_actor_existence\u003dTrue,"},{"line_number":217,"context_line":"                        validate_domain_actor_existence\u003dFalse,"},{"line_number":218,"context_line":"                    )"},{"line_number":219,"context_line":"                identity_client.delete_project(project)"},{"line_number":220,"context_line":"            except Exception as e:"},{"line_number":221,"context_line":"                errors +\u003d 1"}],"source_content_type":"text/x-python","patch_set":6,"id":"c71941c5_105d8e1d","line":218,"range":{"start_line":204,"start_character":0,"end_line":218,"end_character":21},"updated":"2025-11-26 11:34:23.000000000","message":"I believe this could be simplified? If the `domain_name_or_id` defaults to `None` so passing through `parsed_args.domain` will give the same result if that\u0027s unset (i.e. `None`)?\n\n\n```suggestion\n                project \u003d common.find_project_id_sdk(\n                    identity_client,\n                    project,\n                    domain_name_or_id\u003dparsed_args.domain,\n                    validate_actor_existence\u003dTrue,\n                    validate_domain_actor_existence\u003dFalse,\n                )\n```","commit_id":"4db0682fc98d4a2127343edc31a15ad96b3da7aa"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"31471b4813adff75b77d2cefb1f27af2acd8c155","unresolved":false,"context_lines":[{"line_number":201,"context_line":"        errors \u003d 0"},{"line_number":202,"context_line":"        for project in parsed_args.projects:"},{"line_number":203,"context_line":"            try:"},{"line_number":204,"context_line":"                if parsed_args.domain is not None:"},{"line_number":205,"context_line":"                    project \u003d common.find_project_id_sdk("},{"line_number":206,"context_line":"                        identity_client,"},{"line_number":207,"context_line":"                        project,"},{"line_number":208,"context_line":"                        domain_name_or_id\u003dparsed_args.domain,"},{"line_number":209,"context_line":"                        validate_actor_existence\u003dTrue,"},{"line_number":210,"context_line":"                        validate_domain_actor_existence\u003dFalse,"},{"line_number":211,"context_line":"                    )"},{"line_number":212,"context_line":"                else:"},{"line_number":213,"context_line":"                    project \u003d common.find_project_id_sdk("},{"line_number":214,"context_line":"                        identity_client,"},{"line_number":215,"context_line":"                        project,"},{"line_number":216,"context_line":"                        validate_actor_existence\u003dTrue,"},{"line_number":217,"context_line":"                        validate_domain_actor_existence\u003dFalse,"},{"line_number":218,"context_line":"                    )"},{"line_number":219,"context_line":"                identity_client.delete_project(project)"},{"line_number":220,"context_line":"            except Exception as e:"},{"line_number":221,"context_line":"                errors +\u003d 1"}],"source_content_type":"text/x-python","patch_set":6,"id":"485d6b46_55627f18","line":218,"range":{"start_line":204,"start_character":0,"end_line":218,"end_character":21},"in_reply_to":"c71941c5_105d8e1d","updated":"2026-01-13 22:23:42.000000000","message":"Done, see similar thread below.","commit_id":"4db0682fc98d4a2127343edc31a15ad96b3da7aa"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6de32d5f128dd7510ce88a4749c90afbcaeace15","unresolved":true,"context_lines":[{"line_number":323,"context_line":"            kwargs[\u0027parent_id\u0027] \u003d parent_id"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"        user \u003d None"},{"line_number":326,"context_line":"        if parsed_args.user:"},{"line_number":327,"context_line":"            if parsed_args.domain:"},{"line_number":328,"context_line":"                user_id \u003d common.find_user_id_sdk("},{"line_number":329,"context_line":"                    identity_client,"},{"line_number":330,"context_line":"                    parsed_args.user,"},{"line_number":331,"context_line":"                    domain_name_or_id\u003ddomain_id,"},{"line_number":332,"context_line":"                )"},{"line_number":333,"context_line":"            else:"},{"line_number":334,"context_line":"                user_id \u003d common.find_user_id_sdk("},{"line_number":335,"context_line":"                    identity_client,"},{"line_number":336,"context_line":"                    parsed_args.user,"},{"line_number":337,"context_line":"                )"},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"            user \u003d user_id"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"        if parsed_args.is_enabled is not None:"}],"source_content_type":"text/x-python","patch_set":6,"id":"94590f19_fef915d5","line":338,"range":{"start_line":326,"start_character":28,"end_line":338,"end_character":1},"updated":"2025-11-26 11:34:23.000000000","message":"Same comment above wrt simplifying this. Also, do we need to two user variables? Couldn\u0027t we assign directly to `user` here? (or get rid of `user` and use `user_id` instead)?","commit_id":"4db0682fc98d4a2127343edc31a15ad96b3da7aa"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"6df9df7052b8ddbc80b7b097f6a2d1328b135c38","unresolved":false,"context_lines":[{"line_number":323,"context_line":"            kwargs[\u0027parent_id\u0027] \u003d parent_id"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"        user \u003d None"},{"line_number":326,"context_line":"        if parsed_args.user:"},{"line_number":327,"context_line":"            if parsed_args.domain:"},{"line_number":328,"context_line":"                user_id \u003d common.find_user_id_sdk("},{"line_number":329,"context_line":"                    identity_client,"},{"line_number":330,"context_line":"                    parsed_args.user,"},{"line_number":331,"context_line":"                    domain_name_or_id\u003ddomain_id,"},{"line_number":332,"context_line":"                )"},{"line_number":333,"context_line":"            else:"},{"line_number":334,"context_line":"                user_id \u003d common.find_user_id_sdk("},{"line_number":335,"context_line":"                    identity_client,"},{"line_number":336,"context_line":"                    parsed_args.user,"},{"line_number":337,"context_line":"                )"},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"            user \u003d user_id"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"        if parsed_args.is_enabled is not None:"}],"source_content_type":"text/x-python","patch_set":6,"id":"b6b3627c_f0736941","line":338,"range":{"start_line":326,"start_character":28,"end_line":338,"end_character":1},"in_reply_to":"94590f19_fef915d5","updated":"2026-01-08 09:56:32.000000000","message":"Good point, not sure why I introduced `user_id`... fixed :)","commit_id":"4db0682fc98d4a2127343edc31a15ad96b3da7aa"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6de32d5f128dd7510ce88a4749c90afbcaeace15","unresolved":true,"context_lines":[{"line_number":367,"context_line":""},{"line_number":368,"context_line":"        return ("},{"line_number":369,"context_line":"            column_headers,"},{"line_number":370,"context_line":"            ("},{"line_number":371,"context_line":"                utils.get_item_properties("},{"line_number":372,"context_line":"                    s,"},{"line_number":373,"context_line":"                    columns,"},{"line_number":374,"context_line":"                )"},{"line_number":375,"context_line":"                for s in data"},{"line_number":376,"context_line":"            ),"},{"line_number":377,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":6,"id":"4e9d32ae_2c786d99","line":374,"range":{"start_line":370,"start_character":13,"end_line":374,"end_character":17},"updated":"2025-11-26 11:34:23.000000000","message":"nit: this will fit on one line now if you and `ruff` will do that for you if you drop the trailing comma","commit_id":"4db0682fc98d4a2127343edc31a15ad96b3da7aa"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"6df9df7052b8ddbc80b7b097f6a2d1328b135c38","unresolved":false,"context_lines":[{"line_number":367,"context_line":""},{"line_number":368,"context_line":"        return ("},{"line_number":369,"context_line":"            column_headers,"},{"line_number":370,"context_line":"            ("},{"line_number":371,"context_line":"                utils.get_item_properties("},{"line_number":372,"context_line":"                    s,"},{"line_number":373,"context_line":"                    columns,"},{"line_number":374,"context_line":"                )"},{"line_number":375,"context_line":"                for s in data"},{"line_number":376,"context_line":"            ),"},{"line_number":377,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":6,"id":"2f83c757_d9b1ef45","line":374,"range":{"start_line":370,"start_character":13,"end_line":374,"end_character":17},"in_reply_to":"4e9d32ae_2c786d99","updated":"2026-01-08 09:56:32.000000000","message":"Done","commit_id":"4db0682fc98d4a2127343edc31a15ad96b3da7aa"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6de32d5f128dd7510ce88a4749c90afbcaeace15","unresolved":true,"context_lines":[{"line_number":446,"context_line":"        if parsed_args.properties:"},{"line_number":447,"context_line":"            kwargs.update(parsed_args.properties)"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":"        if parsed_args.domain:"},{"line_number":450,"context_line":"            domain \u003d common.find_domain_id_sdk("},{"line_number":451,"context_line":"                identity_client,"},{"line_number":452,"context_line":"                parsed_args.domain,"},{"line_number":453,"context_line":"                validate_actor_existence\u003dFalse,"},{"line_number":454,"context_line":"            )"},{"line_number":455,"context_line":"            project \u003d identity_client.find_project("},{"line_number":456,"context_line":"                parsed_args.project,"},{"line_number":457,"context_line":"                domain_id\u003ddomain,"},{"line_number":458,"context_line":"                ignore_missing\u003dTrue,"},{"line_number":459,"context_line":"            )"},{"line_number":460,"context_line":"        else:"},{"line_number":461,"context_line":"            project \u003d identity_client.find_project("},{"line_number":462,"context_line":"                parsed_args.project,"},{"line_number":463,"context_line":"                ignore_missing\u003dTrue,"},{"line_number":464,"context_line":"            )"},{"line_number":465,"context_line":""},{"line_number":466,"context_line":"        if ("},{"line_number":467,"context_line":"            parsed_args.tags"}],"source_content_type":"text/x-python","patch_set":6,"id":"fe3e044f_cec7927d","line":464,"range":{"start_line":449,"start_character":0,"end_line":464,"end_character":13},"updated":"2025-11-26 11:34:23.000000000","message":"Why can\u0027t we simplify this to a single call to your `find_project_id_sdk` helper here? That handles optional domains and will do the `find_domain` call for us, right?","commit_id":"4db0682fc98d4a2127343edc31a15ad96b3da7aa"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"31471b4813adff75b77d2cefb1f27af2acd8c155","unresolved":false,"context_lines":[{"line_number":446,"context_line":"        if parsed_args.properties:"},{"line_number":447,"context_line":"            kwargs.update(parsed_args.properties)"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":"        if parsed_args.domain:"},{"line_number":450,"context_line":"            domain \u003d common.find_domain_id_sdk("},{"line_number":451,"context_line":"                identity_client,"},{"line_number":452,"context_line":"                parsed_args.domain,"},{"line_number":453,"context_line":"                validate_actor_existence\u003dFalse,"},{"line_number":454,"context_line":"            )"},{"line_number":455,"context_line":"            project \u003d identity_client.find_project("},{"line_number":456,"context_line":"                parsed_args.project,"},{"line_number":457,"context_line":"                domain_id\u003ddomain,"},{"line_number":458,"context_line":"                ignore_missing\u003dTrue,"},{"line_number":459,"context_line":"            )"},{"line_number":460,"context_line":"        else:"},{"line_number":461,"context_line":"            project \u003d identity_client.find_project("},{"line_number":462,"context_line":"                parsed_args.project,"},{"line_number":463,"context_line":"                ignore_missing\u003dTrue,"},{"line_number":464,"context_line":"            )"},{"line_number":465,"context_line":""},{"line_number":466,"context_line":"        if ("},{"line_number":467,"context_line":"            parsed_args.tags"}],"source_content_type":"text/x-python","patch_set":6,"id":"af4462d2_f9262610","line":464,"range":{"start_line":449,"start_character":0,"end_line":464,"end_character":13},"in_reply_to":"fe3e044f_cec7927d","updated":"2026-01-13 22:23:42.000000000","message":"Good point; initially I had thought it was possible for a project to not have a domain (so I was considering the need to distinguish between \"specifying no domain\" and \"no domain info specified,\" hence why I took so long to respond to this - sorry!), but seems that is impossible anyway! Fixed :)","commit_id":"4db0682fc98d4a2127343edc31a15ad96b3da7aa"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6de32d5f128dd7510ce88a4749c90afbcaeace15","unresolved":true,"context_lines":[{"line_number":468,"context_line":"            or parsed_args.remove_tag"},{"line_number":469,"context_line":"            or parsed_args.clear_tags"},{"line_number":470,"context_line":"        ):"},{"line_number":471,"context_line":"            existing_tags \u003d []"},{"line_number":472,"context_line":"            if project:"},{"line_number":473,"context_line":"                existing_tags \u003d project.tags"},{"line_number":474,"context_line":""},{"line_number":475,"context_line":"            kwargs[\u0027tags\u0027] \u003d tag.get_tags_in_args_sdk("},{"line_number":476,"context_line":"                parsed_args, existing_tags"},{"line_number":477,"context_line":"            )"},{"line_number":478,"context_line":""},{"line_number":479,"context_line":"        project_id \u003d project.id if project else parsed_args.project"},{"line_number":480,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"b7414a36_75880f89","line":477,"range":{"start_line":471,"start_character":0,"end_line":477,"end_character":13},"updated":"2025-11-26 11:34:23.000000000","message":"~~This logic looks wrong. I don\u0027t see use of `parsed_args.tags` (or any of the other options, for that matter)~~\n\nAh, wait, we let `get_tags_in_args_sdk` handle this. I can\u0027t say I love that design: it makes this far more difficult to read IMO. afaict, this is the only caller of that helper. Could you just inline it?","commit_id":"4db0682fc98d4a2127343edc31a15ad96b3da7aa"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"af39be7824eab18cef0388b46e9fa72968b0195a","unresolved":false,"context_lines":[{"line_number":468,"context_line":"            or parsed_args.remove_tag"},{"line_number":469,"context_line":"            or parsed_args.clear_tags"},{"line_number":470,"context_line":"        ):"},{"line_number":471,"context_line":"            existing_tags \u003d []"},{"line_number":472,"context_line":"            if project:"},{"line_number":473,"context_line":"                existing_tags \u003d project.tags"},{"line_number":474,"context_line":""},{"line_number":475,"context_line":"            kwargs[\u0027tags\u0027] \u003d tag.get_tags_in_args_sdk("},{"line_number":476,"context_line":"                parsed_args, existing_tags"},{"line_number":477,"context_line":"            )"},{"line_number":478,"context_line":""},{"line_number":479,"context_line":"        project_id \u003d project.id if project else parsed_args.project"},{"line_number":480,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"e571259b_0670edd8","line":477,"range":{"start_line":471,"start_character":0,"end_line":477,"end_character":13},"in_reply_to":"b7414a36_75880f89","updated":"2025-12-02 00:48:32.000000000","message":"I was only following the existing design; I\u0027m not at all attached to it. Done.","commit_id":"4db0682fc98d4a2127343edc31a15ad96b3da7aa"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6de32d5f128dd7510ce88a4749c90afbcaeace15","unresolved":true,"context_lines":[{"line_number":517,"context_line":""},{"line_number":518,"context_line":"        # Get project id first; otherwise, find_project() can\u0027t find parents/children"},{"line_number":519,"context_line":"        # if only project name was given"},{"line_number":520,"context_line":"        if parsed_args.domain:"},{"line_number":521,"context_line":"            domain \u003d common.find_domain_id_sdk("},{"line_number":522,"context_line":"                identity_client, parsed_args.domain"},{"line_number":523,"context_line":"            )"},{"line_number":524,"context_line":"            project \u003d common.find_project_id_sdk("},{"line_number":525,"context_line":"                identity_client,"},{"line_number":526,"context_line":"                parsed_args.project,"},{"line_number":527,"context_line":"                domain_name_or_id\u003ddomain,"},{"line_number":528,"context_line":"                validate_actor_existence\u003dFalse,"},{"line_number":529,"context_line":"            )"},{"line_number":530,"context_line":"            kwargs[\u0027domain_id\u0027] \u003d domain"},{"line_number":531,"context_line":"        else:"},{"line_number":532,"context_line":"            project \u003d common.find_project_id_sdk("},{"line_number":533,"context_line":"                identity_client,"},{"line_number":534,"context_line":"                parsed_args.project,"},{"line_number":535,"context_line":"                validate_actor_existence\u003dFalse,"},{"line_number":536,"context_line":"            )"},{"line_number":537,"context_line":""},{"line_number":538,"context_line":"        # Include these options as query parameters if they are provided"},{"line_number":539,"context_line":"        if parsed_args.parents:"}],"source_content_type":"text/x-python","patch_set":6,"id":"30d0a770_c1ff9f22","line":536,"range":{"start_line":520,"start_character":0,"end_line":536,"end_character":13},"updated":"2025-11-26 11:34:23.000000000","message":"Again, why can\u0027t we simplify this to a single call to your `find_project_id_sdk` helper here?","commit_id":"4db0682fc98d4a2127343edc31a15ad96b3da7aa"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"31471b4813adff75b77d2cefb1f27af2acd8c155","unresolved":false,"context_lines":[{"line_number":517,"context_line":""},{"line_number":518,"context_line":"        # Get project id first; otherwise, find_project() can\u0027t find parents/children"},{"line_number":519,"context_line":"        # if only project name was given"},{"line_number":520,"context_line":"        if parsed_args.domain:"},{"line_number":521,"context_line":"            domain \u003d common.find_domain_id_sdk("},{"line_number":522,"context_line":"                identity_client, parsed_args.domain"},{"line_number":523,"context_line":"            )"},{"line_number":524,"context_line":"            project \u003d common.find_project_id_sdk("},{"line_number":525,"context_line":"                identity_client,"},{"line_number":526,"context_line":"                parsed_args.project,"},{"line_number":527,"context_line":"                domain_name_or_id\u003ddomain,"},{"line_number":528,"context_line":"                validate_actor_existence\u003dFalse,"},{"line_number":529,"context_line":"            )"},{"line_number":530,"context_line":"            kwargs[\u0027domain_id\u0027] \u003d domain"},{"line_number":531,"context_line":"        else:"},{"line_number":532,"context_line":"            project \u003d common.find_project_id_sdk("},{"line_number":533,"context_line":"                identity_client,"},{"line_number":534,"context_line":"                parsed_args.project,"},{"line_number":535,"context_line":"                validate_actor_existence\u003dFalse,"},{"line_number":536,"context_line":"            )"},{"line_number":537,"context_line":""},{"line_number":538,"context_line":"        # Include these options as query parameters if they are provided"},{"line_number":539,"context_line":"        if parsed_args.parents:"}],"source_content_type":"text/x-python","patch_set":6,"id":"e96dae39_0df985ae","line":536,"range":{"start_line":520,"start_character":0,"end_line":536,"end_character":13},"in_reply_to":"30d0a770_c1ff9f22","updated":"2026-01-13 22:23:42.000000000","message":"Fixed, as above :)","commit_id":"4db0682fc98d4a2127343edc31a15ad96b3da7aa"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6de32d5f128dd7510ce88a4749c90afbcaeace15","unresolved":true,"context_lines":[{"line_number":535,"context_line":"                validate_actor_existence\u003dFalse,"},{"line_number":536,"context_line":"            )"},{"line_number":537,"context_line":""},{"line_number":538,"context_line":"        # Include these options as query parameters if they are provided"},{"line_number":539,"context_line":"        if parsed_args.parents:"},{"line_number":540,"context_line":"            kwargs[\u0027parents_as_ids\u0027] \u003d True"},{"line_number":541,"context_line":"        if parsed_args.children:"},{"line_number":542,"context_line":"            kwargs[\u0027subtree_as_ids\u0027] \u003d True"},{"line_number":543,"context_line":""},{"line_number":544,"context_line":"        project \u003d identity_client.find_project("},{"line_number":545,"context_line":"            project, **kwargs, ignore_missing\u003dFalse"}],"source_content_type":"text/x-python","patch_set":6,"id":"8addd768_5f282311","line":542,"range":{"start_line":538,"start_character":0,"end_line":542,"end_character":43},"updated":"2025-11-26 11:34:23.000000000","message":"Could we do:\n\n```suggestion\n        kwargs[\u0027parents_as_ids\u0027] \u003d parsed_args.parents\n        kwargs[\u0027subtree_as_ids\u0027] \u003d parsed_args.children\n```\n\n?","commit_id":"4db0682fc98d4a2127343edc31a15ad96b3da7aa"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"13cf0e40f2c8f61a3257e362a1006e65c7a3bc3b","unresolved":false,"context_lines":[{"line_number":535,"context_line":"                validate_actor_existence\u003dFalse,"},{"line_number":536,"context_line":"            )"},{"line_number":537,"context_line":""},{"line_number":538,"context_line":"        # Include these options as query parameters if they are provided"},{"line_number":539,"context_line":"        if parsed_args.parents:"},{"line_number":540,"context_line":"            kwargs[\u0027parents_as_ids\u0027] \u003d True"},{"line_number":541,"context_line":"        if parsed_args.children:"},{"line_number":542,"context_line":"            kwargs[\u0027subtree_as_ids\u0027] \u003d True"},{"line_number":543,"context_line":""},{"line_number":544,"context_line":"        project \u003d identity_client.find_project("},{"line_number":545,"context_line":"            project, **kwargs, ignore_missing\u003dFalse"}],"source_content_type":"text/x-python","patch_set":6,"id":"ebf36f2a_050745b8","line":542,"range":{"start_line":538,"start_character":0,"end_line":542,"end_character":43},"in_reply_to":"21ea0a9c_77052817","updated":"2026-01-27 17:29:05.000000000","message":"Acknowledged","commit_id":"4db0682fc98d4a2127343edc31a15ad96b3da7aa"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"fa96d7324a4b9557bb343d4f067198f3bcc63c63","unresolved":true,"context_lines":[{"line_number":535,"context_line":"                validate_actor_existence\u003dFalse,"},{"line_number":536,"context_line":"            )"},{"line_number":537,"context_line":""},{"line_number":538,"context_line":"        # Include these options as query parameters if they are provided"},{"line_number":539,"context_line":"        if parsed_args.parents:"},{"line_number":540,"context_line":"            kwargs[\u0027parents_as_ids\u0027] \u003d True"},{"line_number":541,"context_line":"        if parsed_args.children:"},{"line_number":542,"context_line":"            kwargs[\u0027subtree_as_ids\u0027] \u003d True"},{"line_number":543,"context_line":""},{"line_number":544,"context_line":"        project \u003d identity_client.find_project("},{"line_number":545,"context_line":"            project, **kwargs, ignore_missing\u003dFalse"}],"source_content_type":"text/x-python","patch_set":6,"id":"21ea0a9c_77052817","line":542,"range":{"start_line":538,"start_character":0,"end_line":542,"end_character":43},"in_reply_to":"8addd768_5f282311","updated":"2025-12-02 00:13:04.000000000","message":"These are query parameters, and as far as I can tell, the API treats (for the most part) any presence of the parameters as a \"true\" value. (I tried calling the API with `?subtree_as_ids\u003d` as `false`, `False`, `null`, `none`, `None`, and `0`, and only `0` resulted in no subtree information being returned).","commit_id":"4db0682fc98d4a2127343edc31a15ad96b3da7aa"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"13cf0e40f2c8f61a3257e362a1006e65c7a3bc3b","unresolved":true,"context_lines":[{"line_number":315,"context_line":"            kwargs[\u0027parent_id\u0027] \u003d parent_id"},{"line_number":316,"context_line":""},{"line_number":317,"context_line":"        user \u003d None"},{"line_number":318,"context_line":"        if parsed_args.user:"},{"line_number":319,"context_line":"            if parsed_args.domain:"},{"line_number":320,"context_line":"                user \u003d common.find_user_id_sdk("},{"line_number":321,"context_line":"                    identity_client,"},{"line_number":322,"context_line":"                    parsed_args.user,"},{"line_number":323,"context_line":"                    domain_name_or_id\u003ddomain_id,"},{"line_number":324,"context_line":"                )"},{"line_number":325,"context_line":"            else:"},{"line_number":326,"context_line":"                user \u003d common.find_user_id_sdk("},{"line_number":327,"context_line":"                    identity_client,"},{"line_number":328,"context_line":"                    parsed_args.user,"},{"line_number":329,"context_line":"                )"},{"line_number":330,"context_line":""},{"line_number":331,"context_line":"        if parsed_args.is_enabled is not None:"},{"line_number":332,"context_line":"            kwargs[\u0027is_enabled\u0027] \u003d parsed_args.is_enabled"}],"source_content_type":"text/x-python","patch_set":15,"id":"5d8b8ff0_a8d38938","line":329,"range":{"start_line":318,"start_character":28,"end_line":329,"end_character":17},"updated":"2026-01-27 17:29:05.000000000","message":"We can simplify this I believe:\n\n```suggestion\n        if parsed_args.user:\n            user \u003d common.find_user_id_sdk(\n                identity_client,\n                parsed_args.user,\n                domain_name_or_id\u003ddomain_id,\n            )\n```\n\nsince you have an `if domain_name_or_id is None` check [in the called function](https://review.opendev.org/c/openstack/python-openstackclient/+/965317/15/openstackclient/identity/common.py#308).","commit_id":"154bac80113797531e57a0c6bfae20b4b0489871"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"2034b11fdd587298d7e59c7cb66063cb1339dfee","unresolved":false,"context_lines":[{"line_number":315,"context_line":"            kwargs[\u0027parent_id\u0027] \u003d parent_id"},{"line_number":316,"context_line":""},{"line_number":317,"context_line":"        user \u003d None"},{"line_number":318,"context_line":"        if parsed_args.user:"},{"line_number":319,"context_line":"            if parsed_args.domain:"},{"line_number":320,"context_line":"                user \u003d common.find_user_id_sdk("},{"line_number":321,"context_line":"                    identity_client,"},{"line_number":322,"context_line":"                    parsed_args.user,"},{"line_number":323,"context_line":"                    domain_name_or_id\u003ddomain_id,"},{"line_number":324,"context_line":"                )"},{"line_number":325,"context_line":"            else:"},{"line_number":326,"context_line":"                user \u003d common.find_user_id_sdk("},{"line_number":327,"context_line":"                    identity_client,"},{"line_number":328,"context_line":"                    parsed_args.user,"},{"line_number":329,"context_line":"                )"},{"line_number":330,"context_line":""},{"line_number":331,"context_line":"        if parsed_args.is_enabled is not None:"},{"line_number":332,"context_line":"            kwargs[\u0027is_enabled\u0027] \u003d parsed_args.is_enabled"}],"source_content_type":"text/x-python","patch_set":15,"id":"e16ef972_6043c744","line":329,"range":{"start_line":318,"start_character":28,"end_line":329,"end_character":17},"in_reply_to":"5d8b8ff0_a8d38938","updated":"2026-01-27 22:00:36.000000000","message":"Good catch, done :)","commit_id":"154bac80113797531e57a0c6bfae20b4b0489871"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"13cf0e40f2c8f61a3257e362a1006e65c7a3bc3b","unresolved":true,"context_lines":[{"line_number":429,"context_line":"            kwargs[\u0027options\u0027] \u003d {\u0027immutable\u0027: parsed_args.immutable}"},{"line_number":430,"context_line":"        if parsed_args.properties:"},{"line_number":431,"context_line":"            kwargs.update(parsed_args.properties)"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"        if parsed_args.domain:"},{"line_number":434,"context_line":"            domain \u003d common.find_domain_id_sdk("},{"line_number":435,"context_line":"                identity_client,"},{"line_number":436,"context_line":"                parsed_args.domain,"},{"line_number":437,"context_line":"                validate_actor_existence\u003dFalse,"},{"line_number":438,"context_line":"            )"},{"line_number":439,"context_line":"            project \u003d identity_client.find_project("},{"line_number":440,"context_line":"                parsed_args.project,"},{"line_number":441,"context_line":"                domain_id\u003ddomain,"},{"line_number":442,"context_line":"                ignore_missing\u003dTrue,"},{"line_number":443,"context_line":"            )"},{"line_number":444,"context_line":"        else:"},{"line_number":445,"context_line":"            project \u003d identity_client.find_project("},{"line_number":446,"context_line":"                parsed_args.project,"},{"line_number":447,"context_line":"                ignore_missing\u003dTrue,"},{"line_number":448,"context_line":"            )"},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"        if ("},{"line_number":451,"context_line":"            parsed_args.tags"}],"source_content_type":"text/x-python","patch_set":15,"id":"b7fc43b1_606c62a6","line":448,"range":{"start_line":432,"start_character":1,"end_line":448,"end_character":13},"updated":"2026-01-27 17:29:05.000000000","message":"Can we use `find_project_id_sdk` here?\n\n\n\n```suggestion\n\n        project \u003d common.find_project_id_sdk(\n            parsed_args.project,\n            domain_name_or_id\u003dparsed_args.domain,\n            validate_actor_existence\u003dFalse,\n            validate_domain_actor_existence\u003dFalse,\n        )\n```","commit_id":"154bac80113797531e57a0c6bfae20b4b0489871"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3d4721d8b465ce626dbe19f7e944480199849f67","unresolved":true,"context_lines":[{"line_number":429,"context_line":"            kwargs[\u0027options\u0027] \u003d {\u0027immutable\u0027: parsed_args.immutable}"},{"line_number":430,"context_line":"        if parsed_args.properties:"},{"line_number":431,"context_line":"            kwargs.update(parsed_args.properties)"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"        if parsed_args.domain:"},{"line_number":434,"context_line":"            domain \u003d common.find_domain_id_sdk("},{"line_number":435,"context_line":"                identity_client,"},{"line_number":436,"context_line":"                parsed_args.domain,"},{"line_number":437,"context_line":"                validate_actor_existence\u003dFalse,"},{"line_number":438,"context_line":"            )"},{"line_number":439,"context_line":"            project \u003d identity_client.find_project("},{"line_number":440,"context_line":"                parsed_args.project,"},{"line_number":441,"context_line":"                domain_id\u003ddomain,"},{"line_number":442,"context_line":"                ignore_missing\u003dTrue,"},{"line_number":443,"context_line":"            )"},{"line_number":444,"context_line":"        else:"},{"line_number":445,"context_line":"            project \u003d identity_client.find_project("},{"line_number":446,"context_line":"                parsed_args.project,"},{"line_number":447,"context_line":"                ignore_missing\u003dTrue,"},{"line_number":448,"context_line":"            )"},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"        if ("},{"line_number":451,"context_line":"            parsed_args.tags"}],"source_content_type":"text/x-python","patch_set":15,"id":"92be4957_ecbb909a","line":448,"range":{"start_line":432,"start_character":1,"end_line":448,"end_character":13},"in_reply_to":"3d7e7dc4_3d6665cb","updated":"2026-02-13 13:49:19.000000000","message":"Aha, fair enough. We probably want a comment here in that case. An easy follow-up though.","commit_id":"154bac80113797531e57a0c6bfae20b4b0489871"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"0738494123a32806db4c6cadbd73859cda627ca2","unresolved":false,"context_lines":[{"line_number":429,"context_line":"            kwargs[\u0027options\u0027] \u003d {\u0027immutable\u0027: parsed_args.immutable}"},{"line_number":430,"context_line":"        if parsed_args.properties:"},{"line_number":431,"context_line":"            kwargs.update(parsed_args.properties)"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"        if parsed_args.domain:"},{"line_number":434,"context_line":"            domain \u003d common.find_domain_id_sdk("},{"line_number":435,"context_line":"                identity_client,"},{"line_number":436,"context_line":"                parsed_args.domain,"},{"line_number":437,"context_line":"                validate_actor_existence\u003dFalse,"},{"line_number":438,"context_line":"            )"},{"line_number":439,"context_line":"            project \u003d identity_client.find_project("},{"line_number":440,"context_line":"                parsed_args.project,"},{"line_number":441,"context_line":"                domain_id\u003ddomain,"},{"line_number":442,"context_line":"                ignore_missing\u003dTrue,"},{"line_number":443,"context_line":"            )"},{"line_number":444,"context_line":"        else:"},{"line_number":445,"context_line":"            project \u003d identity_client.find_project("},{"line_number":446,"context_line":"                parsed_args.project,"},{"line_number":447,"context_line":"                ignore_missing\u003dTrue,"},{"line_number":448,"context_line":"            )"},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"        if ("},{"line_number":451,"context_line":"            parsed_args.tags"}],"source_content_type":"text/x-python","patch_set":15,"id":"bf8afb29_ede10a5c","line":448,"range":{"start_line":432,"start_character":1,"end_line":448,"end_character":13},"in_reply_to":"b7fc43b1_606c62a6","updated":"2026-01-27 21:58:30.000000000","message":"Good catch, my guess is that I was again writing this thinking that not only was possible for a project to not have a domain, but also that this domain argument could be used to modify what domain the project belongs to and unset it... glad I understand better now 😅","commit_id":"154bac80113797531e57a0c6bfae20b4b0489871"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"0a8d5e7325fb409dc4745e30b43b4bd1f8d31e36","unresolved":true,"context_lines":[{"line_number":429,"context_line":"            kwargs[\u0027options\u0027] \u003d {\u0027immutable\u0027: parsed_args.immutable}"},{"line_number":430,"context_line":"        if parsed_args.properties:"},{"line_number":431,"context_line":"            kwargs.update(parsed_args.properties)"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"        if parsed_args.domain:"},{"line_number":434,"context_line":"            domain \u003d common.find_domain_id_sdk("},{"line_number":435,"context_line":"                identity_client,"},{"line_number":436,"context_line":"                parsed_args.domain,"},{"line_number":437,"context_line":"                validate_actor_existence\u003dFalse,"},{"line_number":438,"context_line":"            )"},{"line_number":439,"context_line":"            project \u003d identity_client.find_project("},{"line_number":440,"context_line":"                parsed_args.project,"},{"line_number":441,"context_line":"                domain_id\u003ddomain,"},{"line_number":442,"context_line":"                ignore_missing\u003dTrue,"},{"line_number":443,"context_line":"            )"},{"line_number":444,"context_line":"        else:"},{"line_number":445,"context_line":"            project \u003d identity_client.find_project("},{"line_number":446,"context_line":"                parsed_args.project,"},{"line_number":447,"context_line":"                ignore_missing\u003dTrue,"},{"line_number":448,"context_line":"            )"},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"        if ("},{"line_number":451,"context_line":"            parsed_args.tags"}],"source_content_type":"text/x-python","patch_set":15,"id":"3d7e7dc4_3d6665cb","line":448,"range":{"start_line":432,"start_character":1,"end_line":448,"end_character":13},"in_reply_to":"bf8afb29_ede10a5c","updated":"2026-01-27 22:13:15.000000000","message":"Ah wait a second, it\u0027s not because of that. We can\u0027t use the helper here because the helper returns the id only, but we need the entire project object so we can grab the tags. (There is currently no SDK call that returns the tags given a project id, but maybe there should be?)","commit_id":"154bac80113797531e57a0c6bfae20b4b0489871"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"13cf0e40f2c8f61a3257e362a1006e65c7a3bc3b","unresolved":true,"context_lines":[{"line_number":509,"context_line":""},{"line_number":510,"context_line":"        kwargs \u003d {}"},{"line_number":511,"context_line":""},{"line_number":512,"context_line":"        domain \u003d None"},{"line_number":513,"context_line":"        if parsed_args.domain:"},{"line_number":514,"context_line":"            domain \u003d common.find_domain_id_sdk("},{"line_number":515,"context_line":"                identity_client, parsed_args.domain"}],"source_content_type":"text/x-python","patch_set":15,"id":"8f0ae702_3375bedd","line":512,"updated":"2026-01-27 17:29:05.000000000","message":"Okay, we\u0027re doing this first since we need to fetch the domain ID for later use. Might be worth adding a comment (I was going to ask why we didn\u0027t pass `parsed_args.domain` directly through to `find_project_id_sdk` in the call below)","commit_id":"154bac80113797531e57a0c6bfae20b4b0489871"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"5b20dcb328ca6f15f5736e2b43d804e1c985674a","unresolved":false,"context_lines":[{"line_number":509,"context_line":""},{"line_number":510,"context_line":"        kwargs \u003d {}"},{"line_number":511,"context_line":""},{"line_number":512,"context_line":"        domain \u003d None"},{"line_number":513,"context_line":"        if parsed_args.domain:"},{"line_number":514,"context_line":"            domain \u003d common.find_domain_id_sdk("},{"line_number":515,"context_line":"                identity_client, parsed_args.domain"}],"source_content_type":"text/x-python","patch_set":15,"id":"a54043ba_b5876f7f","line":512,"in_reply_to":"8f0ae702_3375bedd","updated":"2026-01-27 22:08:17.000000000","message":"Renamed it to `domain_id` for clarity and also added a comment, done.","commit_id":"154bac80113797531e57a0c6bfae20b4b0489871"}],"openstackclient/identity/v3/tag.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6de32d5f128dd7510ce88a4749c90afbcaeace15","unresolved":true,"context_lines":[{"line_number":124,"context_line":"    )"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"def update_tags_in_args(parsed_args, obj, args):"},{"line_number":128,"context_line":"    if parsed_args.clear_tags:"},{"line_number":129,"context_line":"        args[\u0027tags\u0027] \u003d []"},{"line_number":130,"context_line":"        obj.tags \u003d []"},{"line_number":131,"context_line":"    if parsed_args.remove_tag:"},{"line_number":132,"context_line":"        args[\u0027tags\u0027] \u003d sorted(set(obj.tags) - set(parsed_args.remove_tag))"},{"line_number":133,"context_line":"        return"},{"line_number":134,"context_line":"    if parsed_args.tags:"},{"line_number":135,"context_line":"        args[\u0027tags\u0027] \u003d sorted(set(obj.tags).union(set(parsed_args.tags)))"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"def get_tags_in_args_sdk(parsed_args, existing_tags):"}],"source_content_type":"text/x-python","patch_set":6,"id":"66b00a54_f06c5d19","line":135,"range":{"start_line":127,"start_character":0,"end_line":135,"end_character":73},"updated":"2025-11-26 11:34:23.000000000","message":"I don\u0027t believe this has any callers now? Can you delete it?","commit_id":"4db0682fc98d4a2127343edc31a15ad96b3da7aa"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"af39be7824eab18cef0388b46e9fa72968b0195a","unresolved":false,"context_lines":[{"line_number":124,"context_line":"    )"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"def update_tags_in_args(parsed_args, obj, args):"},{"line_number":128,"context_line":"    if parsed_args.clear_tags:"},{"line_number":129,"context_line":"        args[\u0027tags\u0027] \u003d []"},{"line_number":130,"context_line":"        obj.tags \u003d []"},{"line_number":131,"context_line":"    if parsed_args.remove_tag:"},{"line_number":132,"context_line":"        args[\u0027tags\u0027] \u003d sorted(set(obj.tags) - set(parsed_args.remove_tag))"},{"line_number":133,"context_line":"        return"},{"line_number":134,"context_line":"    if parsed_args.tags:"},{"line_number":135,"context_line":"        args[\u0027tags\u0027] \u003d sorted(set(obj.tags).union(set(parsed_args.tags)))"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"def get_tags_in_args_sdk(parsed_args, existing_tags):"}],"source_content_type":"text/x-python","patch_set":6,"id":"561a2b68_e1825c31","line":135,"range":{"start_line":127,"start_character":0,"end_line":135,"end_character":73},"in_reply_to":"66b00a54_f06c5d19","updated":"2025-12-02 00:48:32.000000000","message":"Done","commit_id":"4db0682fc98d4a2127343edc31a15ad96b3da7aa"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6de32d5f128dd7510ce88a4749c90afbcaeace15","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":6,"id":"8ae64d40_90a99c8c","line":147,"updated":"2025-11-26 11:34:23.000000000","message":"I said this on the previous file, but I believe this could be inlined","commit_id":"4db0682fc98d4a2127343edc31a15ad96b3da7aa"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"789c361e6a9f0a92b56a894ff0384559437330a2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"ccb82572_26b39013","line":147,"in_reply_to":"8ae64d40_90a99c8c","updated":"2025-12-02 17:06:06.000000000","message":"Done","commit_id":"4db0682fc98d4a2127343edc31a15ad96b3da7aa"}],"releasenotes/notes/migrate-project-to-sdk-9201efd2804371de.yaml":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c6b1ef4a258f850703c58af8104c342d5290dae2","unresolved":true,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Migrate ``project`` commands from keystoneclient to SDK."},{"line_number":5,"context_line":"upgrade:"},{"line_number":6,"context_line":"  - |"},{"line_number":7,"context_line":"    Filtering in ``project`` commands is now case sensitive."}],"source_content_type":"text/x-yaml","patch_set":14,"id":"8fd3bdd7_f4185d2b","line":7,"range":{"start_line":5,"start_character":0,"end_line":7,"end_character":60},"updated":"2026-01-07 11:30:17.000000000","message":"Is this true? Was it definitely case-insensitive previously?","commit_id":"e07058fe3cbe3bddd32c811692be7fcaeac3c53e"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"31471b4813adff75b77d2cefb1f27af2acd8c155","unresolved":true,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Migrate ``project`` commands from keystoneclient to SDK."},{"line_number":5,"context_line":"upgrade:"},{"line_number":6,"context_line":"  - |"},{"line_number":7,"context_line":"    Filtering in ``project`` commands is now case sensitive."}],"source_content_type":"text/x-yaml","patch_set":14,"id":"ef7157e0_64ab3828","line":7,"range":{"start_line":5,"start_character":0,"end_line":7,"end_character":60},"in_reply_to":"8fd3bdd7_f4185d2b","updated":"2026-01-13 22:23:42.000000000","message":"Yes, from my testing:\n\n```\n$ openstack --os-cloud devstack-admin project list\n+----------------------------------+--------------------+\n| ID                               | Name               |\n+----------------------------------+--------------------+\n| 2820a8a2d24e44f9a23b6bdff6cfe701 | demo               |\n| 2908d634434347568a13638f04024c7e | invisible_to_admin |\n| 326d54eed15b477081ff253c198dfd33 | service            |\n| 7f116fa6188f4244933dddb7163c1eba | admin              |\n| b4cf43022cfd4c5593cac84752c987e2 | alt_demo           |\n+----------------------------------+--------------------+\n```\n\n\n\n`project show` with name:\n```\n$ openstack --os-cloud devstack-admin project show demo\n+-------------+----------------------------------+\n| Field       | Value                            |\n+-------------+----------------------------------+\n| description |                                  |\n| domain_id   | default                          |\n| enabled     | True                             |\n| id          | 2820a8a2d24e44f9a23b6bdff6cfe701 |\n| is_domain   | False                            |\n| name        | demo                             |\n| options     | {}                               |\n| parent_id   | default                          |\n| tags        | []                               |\n+-------------+----------------------------------+\n\n\n\n$ openstack --os-cloud devstack-admin project show Demo\n+-------------+----------------------------------+\n| Field       | Value                            |\n+-------------+----------------------------------+\n| description |                                  |\n| domain_id   | default                          |\n| enabled     | True                             |\n| id          | 2820a8a2d24e44f9a23b6bdff6cfe701 |\n| is_domain   | False                            |\n| name        | demo                             |\n| options     | {}                               |\n| parent_id   | default                          |\n| tags        | []                               |\n+-------------+----------------------------------+\n```\n\n\n\n`project show` with id (first A is capitalized):\n```\n$ openstack --os-cloud devstack-admin project show 2820a8a2d24e44f9a23b6bdff6cfe701\n+-------------+----------------------------------+\n| Field       | Value                            |\n+-------------+----------------------------------+\n| description |                                  |\n| domain_id   | default                          |\n| enabled     | True                             |\n| id          | 2820a8a2d24e44f9a23b6bdff6cfe701 |\n| is_domain   | False                            |\n| name        | demo                             |\n| options     | {}                               |\n| parent_id   | default                          |\n| tags        | []                               |\n+-------------+----------------------------------+\n\n\n\n$ openstack --os-cloud devstack-admin project show 2820A8a2d24e44f9a23b6bdff6cfe701\n+-------------+----------------------------------+\n| Field       | Value                            |\n+-------------+----------------------------------+\n| description |                                  |\n| domain_id   | default                          |\n| enabled     | True                             |\n| id          | 2820a8a2d24e44f9a23b6bdff6cfe701 |\n| is_domain   | False                            |\n| name        | demo                             |\n| options     | {}                               |\n| parent_id   | default                          |\n| tags        | []                               |\n+-------------+----------------------------------+\n```\n\n\n\n`project list` with domain name:\n```\n$ openstack --os-cloud devstack-admin project list --domain DEFAULT\n+----------------------------------+--------------------+\n| ID                               | Name               |\n+----------------------------------+--------------------+\n| 7f116fa6188f4244933dddb7163c1eba | admin              |\n| b4cf43022cfd4c5593cac84752c987e2 | alt_demo           |\n| 2820a8a2d24e44f9a23b6bdff6cfe701 | demo               |\n| 2908d634434347568a13638f04024c7e | invisible_to_admin |\n| 326d54eed15b477081ff253c198dfd33 | service            |\n+----------------------------------+--------------------+\n\n\n\n$ openstack --os-cloud devstack-admin project list --domain default\n+----------------------------------+--------------------+\n| ID                               | Name               |\n+----------------------------------+--------------------+\n| 7f116fa6188f4244933dddb7163c1eba | admin              |\n| b4cf43022cfd4c5593cac84752c987e2 | alt_demo           |\n| 2820a8a2d24e44f9a23b6bdff6cfe701 | demo               |\n| 2908d634434347568a13638f04024c7e | invisible_to_admin |\n| 326d54eed15b477081ff253c198dfd33 | service            |\n+----------------------------------+--------------------+\n```","commit_id":"e07058fe3cbe3bddd32c811692be7fcaeac3c53e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"13cf0e40f2c8f61a3257e362a1006e65c7a3bc3b","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Migrate ``project`` commands from keystoneclient to SDK."},{"line_number":5,"context_line":"upgrade:"},{"line_number":6,"context_line":"  - |"},{"line_number":7,"context_line":"    Filtering in ``project`` commands is now case sensitive."}],"source_content_type":"text/x-yaml","patch_set":14,"id":"aad9ae64_b5b73391","line":7,"range":{"start_line":5,"start_character":0,"end_line":7,"end_character":60},"in_reply_to":"ba9c2ed0_195ac0a7","updated":"2026-01-27 17:29:05.000000000","message":"Acknowledged","commit_id":"e07058fe3cbe3bddd32c811692be7fcaeac3c53e"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"a7b2cca43c083aa150b54a003a78a44d89b1ad25","unresolved":true,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Migrate ``project`` commands from keystoneclient to SDK."},{"line_number":5,"context_line":"upgrade:"},{"line_number":6,"context_line":"  - |"},{"line_number":7,"context_line":"    Filtering in ``project`` commands is now case sensitive."}],"source_content_type":"text/x-yaml","patch_set":14,"id":"ba9c2ed0_195ac0a7","line":7,"range":{"start_line":5,"start_character":0,"end_line":7,"end_character":60},"in_reply_to":"ef7157e0_64ab3828","updated":"2026-01-17 00:56:02.000000000","message":"Another easy way I have been able to check is to edit the `test_project_show` functional test to run `f\u0027project show --domain {self.domain_name} {self.project_name.upper()}\u0027`, which should fail with the patch applied and pass without it.","commit_id":"e07058fe3cbe3bddd32c811692be7fcaeac3c53e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bf7050fd16b00a275b34ab8a0fb391e6dc60d67c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"bce798a6_1429cc05","line":8,"range":{"start_line":5,"start_character":0,"end_line":8,"end_character":1},"updated":"2026-02-13 14:06:54.000000000","message":"I finally got around to testing this locally to figure out what\u0027s going. Without this patch:\n\n```\n❯ openstack project show -f value -c id admin\nd8dea803f1fe44e2bdf9d9d017750b4e\n\n❯ openstack project show -f value -c id ADMIN\nd8dea803f1fe44e2bdf9d9d017750b4e\n```\n\nWith this patch:\n\n```\n❯ openstack project show -f value -c id admin\nd8dea803f1fe44e2bdf9d9d017750b4e\n\n❯ openstack project show -f value -c id ADMIN\nNo Project found for ADMIN\n```\n\nLooking at the flow, I see both clients make roughly the same set of requests:\n\n```\nGET /identity/v3/projects/ADMIN\nGET /identity/v3/projects?name\u003dADMIN\n```\n\nSo this difference was clearly in the code. I then took a look at the `Resource.find` implementation and found it uses the `_get_one_match` classmethod to filter multiple results. As you can see [here](https://github.com/openstack/openstacksdk/blob/5507837df5ad01c3447a4006c5355faca4ee1ec1/openstack/resource.py#L2237), it does a case-sensitive comparison. By comparison, keystoneclient skips this and just returns ensures you only get one response back, as seen [here](https://github.com/openstack/python-keystoneclient/blob/master/keystoneclient/base.py#L506-L507).\n\nidk if we want to change the behavior of SDK or not. There are merits to both approaches.","commit_id":"85e731df4715536da91a8afedbe32da7de65e53a"}]}
