)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"f88f3eb64bf0f38a078b5716a8b343fe36f9a441","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"f543230e_d3a67624","updated":"2024-03-07 19:39:00.000000000","message":"Currently working on functional tests and found some issues; will upload a new patch once I get those fixed.","commit_id":"5af5ad13505dae112ad49dbf4f4e909dddb997e6"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"1ffba16ac067696b924351e903d3a69aeaf151c6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"d45bfc3d_0076580b","updated":"2024-02-29 21:24:11.000000000","message":"I got a lot of errors from volume, compute, and common functional tests when running locally, so I want to see if Zuul gets the same ones.\n\nMeanwhile, the unit tests do seem to be passing, and so are the identity functional tests, though there are no functional tests specifically for role_assignment. Please let me know if you notice any glaring issues in the meantime :)","commit_id":"5af5ad13505dae112ad49dbf4f4e909dddb997e6"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"e58a2cedff11ff8e48d7ab042d6c29ec056a9b00","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"b569b7e6_102c84de","in_reply_to":"d45bfc3d_0076580b","updated":"2024-03-01 21:36:26.000000000","message":"Looks like Zuul didn\u0027t find any issues... probably an issue with my DevStack then :)","commit_id":"5af5ad13505dae112ad49dbf4f4e909dddb997e6"},{"author":{"_account_id":27900,"name":"Artem Goncharov","email":"artem.goncharov@gmail.com","username":"gtema"},"change_message_id":"0e5f6ea6d2ca898daa7d3732df35a230e9b6c6b8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"3e4e3103_488ef367","updated":"2024-03-13 15:43:55.000000000","message":"Sadly seem to need SDK work as well","commit_id":"72eee3c883e0fb714ba9ae26df22598404e1459f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"def5e187ea71ecb45f6a843fbdee1e4cc8c0d1f3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"98efaf06_61fe375c","updated":"2024-04-12 16:23:51.000000000","message":"The code itself is looking pretty good. Just need some work on the tests now.","commit_id":"11a00f148375250030306d2fe881f003439d1bca"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"38570406b43a922c4d1c06c49f46fe992825dd3a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"a8b520d0_3e935f69","updated":"2024-05-08 17:01:01.000000000","message":"| Syntax      | Description |\n| ----------- | ----------- |\n| Header      | Title |\n| Paragraph   | Text |","commit_id":"487346378c778ba6ce11f019a7bf9b51993c994b"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3dd7d23f31cefdf45d8834f33a5ea179cf049ae3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"9d31585d_fcb02dde","in_reply_to":"a8b520d0_3e935f69","updated":"2024-05-08 17:01:17.000000000","message":"Ignore this, was testing something.","commit_id":"487346378c778ba6ce11f019a7bf9b51993c994b"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"2fe0e462884a97e59196fb7389aac625f507ef79","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"4c252a91_e0fa3da1","updated":"2024-05-21 11:00:18.000000000","message":"Spotted a new thing. Sorry for missing it earlier.","commit_id":"227871aeb5a564f00c49f462ddd66c0feadee792"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8e549ad13be13cbdbef6b76837021fb12e381c07","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"434f130a_7339807c","updated":"2024-06-05 11:55:36.000000000","message":"This won\u0027t work as-is. The fact that all tests are passing suggest you need test coverage also 😉","commit_id":"7882e425f45b5d400b9884e86c467d23b83e0574"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6c0f1803266a3b654ce22d7c834dda31413fc058","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"3048caf8_335736a8","updated":"2024-06-13 11:22:48.000000000","message":"Can you add a release note? I\u0027m +2 once that\u0027s done.","commit_id":"d9540dc84fc11be0af8589b448c8982b5db91333"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"f2ebedd2a6f6420f4c80effa7da8450fe3d8452f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"80373f26_a3c83f4b","updated":"2024-06-12 16:05:39.000000000","message":"recheck - functional test failure is unrelated","commit_id":"d9540dc84fc11be0af8589b448c8982b5db91333"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"f3a7a725909254e196a7ec06c93c47dc51bc4779","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"e83bd73e_9162202f","in_reply_to":"3048caf8_335736a8","updated":"2024-06-13 23:01:34.000000000","message":"Done","commit_id":"d9540dc84fc11be0af8589b448c8982b5db91333"}],"openstackclient/identity/v3/role_assignment.py":[{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"960f4cb0ca1880eb44f98f6e06fcdcb90fbc0705","unresolved":true,"context_lines":[{"line_number":53,"context_line":"            metavar\u003d\u0027\u003cgroup\u003e\u0027,"},{"line_number":54,"context_line":"            help\u003d_(\u0027Group to filter (name or ID)\u0027),"},{"line_number":55,"context_line":"        )"},{"line_number":56,"context_line":"        common.add_group_domain_option_to_parser(parser)"},{"line_number":57,"context_line":"        system_or_domain_or_project \u003d parser.add_mutually_exclusive_group()"},{"line_number":58,"context_line":"        system_or_domain_or_project.add_argument("},{"line_number":59,"context_line":"            \u0027--domain\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"5c755165_57df528c","line":56,"range":{"start_line":56,"start_character":15,"end_line":56,"end_character":48},"updated":"2024-03-15 21:28:45.000000000","message":"I don\u0027t see any tests for group_domain, role_domain, project_domain, etc. I also don\u0027t see an argument in the parser for include_subtree (which is supported by SDK). Do I need to do anything for these?","commit_id":"72eee3c883e0fb714ba9ae26df22598404e1459f"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"217c97be8d8e139f1bb6e3feefe6698b5ab4a004","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            metavar\u003d\u0027\u003cgroup\u003e\u0027,"},{"line_number":54,"context_line":"            help\u003d_(\u0027Group to filter (name or ID)\u0027),"},{"line_number":55,"context_line":"        )"},{"line_number":56,"context_line":"        common.add_group_domain_option_to_parser(parser)"},{"line_number":57,"context_line":"        system_or_domain_or_project \u003d parser.add_mutually_exclusive_group()"},{"line_number":58,"context_line":"        system_or_domain_or_project.add_argument("},{"line_number":59,"context_line":"            \u0027--domain\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"49b0aac9_0a514aa9","line":56,"range":{"start_line":56,"start_character":15,"end_line":56,"end_character":48},"in_reply_to":"224d378a_79c4411c","updated":"2024-04-22 21:29:37.000000000","message":"Acknowledged","commit_id":"72eee3c883e0fb714ba9ae26df22598404e1459f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"def5e187ea71ecb45f6a843fbdee1e4cc8c0d1f3","unresolved":true,"context_lines":[{"line_number":53,"context_line":"            metavar\u003d\u0027\u003cgroup\u003e\u0027,"},{"line_number":54,"context_line":"            help\u003d_(\u0027Group to filter (name or ID)\u0027),"},{"line_number":55,"context_line":"        )"},{"line_number":56,"context_line":"        common.add_group_domain_option_to_parser(parser)"},{"line_number":57,"context_line":"        system_or_domain_or_project \u003d parser.add_mutually_exclusive_group()"},{"line_number":58,"context_line":"        system_or_domain_or_project.add_argument("},{"line_number":59,"context_line":"            \u0027--domain\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"224d378a_79c4411c","line":56,"range":{"start_line":56,"start_character":15,"end_line":56,"end_character":48},"in_reply_to":"5c755165_57df528c","updated":"2024-04-12 16:23:51.000000000","message":"\u003e I don\u0027t see any tests for group_domain, role_domain, project_domain, etc.\n\nIt would be useful to add unit tests, but perhaps as a follow-up?\n\n\u003e I also don\u0027t see an argument in the parser for include_subtree (which is supported by SDK). Do I need to do anything for these?\n\nThis sounds like a new feature. Again, consider doing this as a follow-up.","commit_id":"72eee3c883e0fb714ba9ae26df22598404e1459f"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"42c54c6847fee0235aceccc0650108fe8308dd10","unresolved":true,"context_lines":[{"line_number":184,"context_line":"            \u0027Inherited\u0027,"},{"line_number":185,"context_line":"        )"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"        inherited_to \u003d \u0027projects\u0027 if parsed_args.inherited else None"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        if parsed_args.effective:"},{"line_number":190,"context_line":"            call_kwargs[\u0027effective\u0027] \u003d True"}],"source_content_type":"text/x-python","patch_set":2,"id":"fcae9e1f_1790380e","line":187,"updated":"2024-03-13 17:51:01.000000000","message":"I have a question about the expected behavior of --inherited:\n\nThis is the output I get if I run this command manually on devstack (which I assume is using keystoneclient):\n```\n$ openstack --os-cloud devstack-admin role assignment list --inherited\n+-----------------------------+-----------------------------+-------+------------------------------+--------+--------+-----------+\n| Role                        | User                        | Group | Project                      | Domain | System | Inherited |\n+-----------------------------+-----------------------------+-------+------------------------------+--------+--------+-----------+\n| 5873480989f24fde8732b5b9b60 | 6e9eaeb199764dc4ac7741e5b01 |       | b9ca5e066e724f5ab47fb8ab18ad |        |        | True      |\n| b8b07                       | 89501                       |       | 4ddc                         |        |        |           |\n| 4dd444bd00c84c57a6711a676b2 | 1e0bbd2a2e9e4a608e71a791a4a |       |                              |        | all    | False     |\n| 11a85                       | dc0cd                       |       |                              |        |        |           |\n| 4dd444bd00c84c57a6711a676b2 | cf6c22c297034268aa0a13c0c99 |       |                              |        | all    | False     |\n| 11a85                       | 74150                       |       |                              |        |        |           |\n| 5f4b791bb8a948dcb1564aa84e6 | ea11ce8cec054ba195b06f7010f |       |                              |        | all    | False     |\n| 8222b                       | 054f4                       |       |                              |        |        |           |\n| 153570c00d3543f880190c16ffd | f655cf226d284991a07bd1e6955 |       |                              |        | all    | False     |\n| 8835e                       | c1a94                       |       |                              |        |        |           |\n+-----------------------------+-----------------------------+-------+------------------------------+--------+--------+-----------+\n```\nIt looks like all the ones that have Inherited as False that showed up here are ones where System is \u0027all\u0027. Is that supposed to happen, or should it be strictly returning role assignments that have Inherited as False?","commit_id":"72eee3c883e0fb714ba9ae26df22598404e1459f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"2fe0e462884a97e59196fb7389aac625f507ef79","unresolved":false,"context_lines":[{"line_number":184,"context_line":"            \u0027Inherited\u0027,"},{"line_number":185,"context_line":"        )"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"        inherited_to \u003d \u0027projects\u0027 if parsed_args.inherited else None"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        if parsed_args.effective:"},{"line_number":190,"context_line":"            call_kwargs[\u0027effective\u0027] \u003d True"}],"source_content_type":"text/x-python","patch_set":2,"id":"61eb3810_923c3cea","line":187,"in_reply_to":"fcae9e1f_1790380e","updated":"2024-05-21 11:00:18.000000000","message":"I\u0027m guessing this was happening because you were lacking SDK support. You fixed that in I977fba4a49d8bd779fc14851ab4145cebb66d46c so I\u0027m going to mark this as resolved now.","commit_id":"72eee3c883e0fb714ba9ae26df22598404e1459f"},{"author":{"_account_id":27900,"name":"Artem Goncharov","email":"artem.goncharov@gmail.com","username":"gtema"},"change_message_id":"0e5f6ea6d2ca898daa7d3732df35a230e9b6c6b8","unresolved":true,"context_lines":[{"line_number":191,"context_line":"        if include_names:"},{"line_number":192,"context_line":"            call_kwargs[\u0027include_names\u0027] \u003d True"},{"line_number":193,"context_line":"        if inherited_to:"},{"line_number":194,"context_line":"            call_kwargs[\u0027os_inherit_extension_inherited_to\u0027] \u003d inherited_to"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"        data \u003d identity_client.role_assignments(**call_kwargs)"},{"line_number":197,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3cef4c86_393b8ad3","line":194,"updated":"2024-03-13 15:43:55.000000000","message":"this is currently not supported by SDK","commit_id":"72eee3c883e0fb714ba9ae26df22598404e1459f"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"960f4cb0ca1880eb44f98f6e06fcdcb90fbc0705","unresolved":false,"context_lines":[{"line_number":191,"context_line":"        if include_names:"},{"line_number":192,"context_line":"            call_kwargs[\u0027include_names\u0027] \u003d True"},{"line_number":193,"context_line":"        if inherited_to:"},{"line_number":194,"context_line":"            call_kwargs[\u0027os_inherit_extension_inherited_to\u0027] \u003d inherited_to"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"        data \u003d identity_client.role_assignments(**call_kwargs)"},{"line_number":197,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"edef0eb2_752d3246","line":194,"in_reply_to":"3cef4c86_393b8ad3","updated":"2024-03-15 21:28:45.000000000","message":"Done","commit_id":"72eee3c883e0fb714ba9ae26df22598404e1459f"},{"author":{"_account_id":27900,"name":"Artem Goncharov","email":"artem.goncharov@gmail.com","username":"gtema"},"change_message_id":"0e5f6ea6d2ca898daa7d3732df35a230e9b6c6b8","unresolved":true,"context_lines":[{"line_number":233,"context_line":"                assignment.project \u003d \u0027\u0027"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"            inherited \u003d scope.get(\u0027OS-INHERIT:inherited_to\u0027) \u003d\u003d \u0027projects\u0027"},{"line_number":236,"context_line":"            assignment.inherited \u003d inherited"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"            del assignment.scope"},{"line_number":239,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"23ac28cc_5f766e6c","line":236,"updated":"2024-03-13 15:43:55.000000000","message":"uhm, I think this is supposed to fail since resource does not have this property present","commit_id":"72eee3c883e0fb714ba9ae26df22598404e1459f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"def5e187ea71ecb45f6a843fbdee1e4cc8c0d1f3","unresolved":false,"context_lines":[{"line_number":233,"context_line":"                assignment.project \u003d \u0027\u0027"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"            inherited \u003d scope.get(\u0027OS-INHERIT:inherited_to\u0027) \u003d\u003d \u0027projects\u0027"},{"line_number":236,"context_line":"            assignment.inherited \u003d inherited"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"            del assignment.scope"},{"line_number":239,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"25038c5e_b57a0c15","line":236,"in_reply_to":"237c6488_cc0dc8da","updated":"2024-04-12 16:23:51.000000000","message":"Done","commit_id":"72eee3c883e0fb714ba9ae26df22598404e1459f"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"5c7bfd19400cb8ba4b2cd09e8116651a6a4ba529","unresolved":true,"context_lines":[{"line_number":233,"context_line":"                assignment.project \u003d \u0027\u0027"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"            inherited \u003d scope.get(\u0027OS-INHERIT:inherited_to\u0027) \u003d\u003d \u0027projects\u0027"},{"line_number":236,"context_line":"            assignment.inherited \u003d inherited"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"            del assignment.scope"},{"line_number":239,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"e974c39c_d2150a83","line":236,"in_reply_to":"23ac28cc_5f766e6c","updated":"2024-04-04 19:50:48.000000000","message":"Changing this to `scope[\u0027OS-INHERIT:inherited_to\u0027]` fails appropriately, but it seems otherwise neither SDK nor OSC care if OSC passes invalid keyword arguments to SDK functions. (I tried this on both `role_assignments` and `user` and neither their functional tests nor their unit tests failed...)","commit_id":"72eee3c883e0fb714ba9ae26df22598404e1459f"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"0382199766cf4910e0f231606fc517a049bfd807","unresolved":true,"context_lines":[{"line_number":233,"context_line":"                assignment.project \u003d \u0027\u0027"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"            inherited \u003d scope.get(\u0027OS-INHERIT:inherited_to\u0027) \u003d\u003d \u0027projects\u0027"},{"line_number":236,"context_line":"            assignment.inherited \u003d inherited"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"            del assignment.scope"},{"line_number":239,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9ec4e724_bc963640","line":236,"in_reply_to":"7df19d79_5fcaac04","updated":"2024-04-04 23:00:48.000000000","message":"Hmmm I wonder if this is an SDK bug? The `list()` method in `openstacksdk/openstack/resource.py` on line 1985 has a parameter `allow_unknown_params` but it\u0027s never actually used in the method. At line 2042, there is\n```\n        api_filters \u003d cls._query_mapping._validate(\n            params,\n            base_path\u003dbase_path,\n            allow_unknown_params\u003dTrue,\n        )\n```\nwhich just uses a hardcoded True; not sure if this is related...?","commit_id":"72eee3c883e0fb714ba9ae26df22598404e1459f"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"7f8b7dd80a760da8c8b3311404d1779e0a40a517","unresolved":true,"context_lines":[{"line_number":233,"context_line":"                assignment.project \u003d \u0027\u0027"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"            inherited \u003d scope.get(\u0027OS-INHERIT:inherited_to\u0027) \u003d\u003d \u0027projects\u0027"},{"line_number":236,"context_line":"            assignment.inherited \u003d inherited"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"            del assignment.scope"},{"line_number":239,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"237c6488_cc0dc8da","line":236,"in_reply_to":"8eb33c8d_b96e6ac4","updated":"2024-04-04 23:22:02.000000000","message":"I made a separate review for this: https://review.opendev.org/c/openstack/openstacksdk/+/915097","commit_id":"72eee3c883e0fb714ba9ae26df22598404e1459f"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"21524d48865d8c1e7db8c30b9fd283528b2a5841","unresolved":true,"context_lines":[{"line_number":233,"context_line":"                assignment.project \u003d \u0027\u0027"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"            inherited \u003d scope.get(\u0027OS-INHERIT:inherited_to\u0027) \u003d\u003d \u0027projects\u0027"},{"line_number":236,"context_line":"            assignment.inherited \u003d inherited"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"            del assignment.scope"},{"line_number":239,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"8eb33c8d_b96e6ac4","line":236,"in_reply_to":"9ec4e724_bc963640","updated":"2024-04-04 23:07:21.000000000","message":"Changing that line to `allow_unknown_params\u003dallow_unknown_params` works! Unfortunately, since this is an SDK change, it still can\u0027t be tested by the `functional` suite, but I can confirm it works in `function-tips` if I add a non-existent argument to the call.","commit_id":"72eee3c883e0fb714ba9ae26df22598404e1459f"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"61bae4e1e3ce8f4cd217f4e94186480591635b6e","unresolved":true,"context_lines":[{"line_number":233,"context_line":"                assignment.project \u003d \u0027\u0027"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"            inherited \u003d scope.get(\u0027OS-INHERIT:inherited_to\u0027) \u003d\u003d \u0027projects\u0027"},{"line_number":236,"context_line":"            assignment.inherited \u003d inherited"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"            del assignment.scope"},{"line_number":239,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7df19d79_5fcaac04","line":236,"in_reply_to":"beeb9c28_714fcb37","updated":"2024-04-04 22:46:02.000000000","message":"The problem is that SDK does not return `OS-INHERIT:inherited_to` in `scope` if `--inherited` is not provided, similar to the way `project` is not part of `scope` if it wasn\u0027t provided. So the best I can do is \n```\n            if \u0027OS-INHERIT:inherited_to\u0027 in scope:\n                is_inherited \u003d scope[\u0027OS-INHERIT:inherited_to\u0027] \u003d\u003d \u0027projects\u0027\n                assignment.inherited \u003d is_inherited\n            else:\n                assignment.inherited \u003d False\n```\nbut in this case, the `functional` suite is passing again because `OS-INHERIT:inherited_to` will just not exist for anyone and `assignment.inherited` will always be False.","commit_id":"72eee3c883e0fb714ba9ae26df22598404e1459f"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"80cd7797498ee60c71354daebc119cce7252100e","unresolved":true,"context_lines":[{"line_number":233,"context_line":"                assignment.project \u003d \u0027\u0027"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"            inherited \u003d scope.get(\u0027OS-INHERIT:inherited_to\u0027) \u003d\u003d \u0027projects\u0027"},{"line_number":236,"context_line":"            assignment.inherited \u003d inherited"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"            del assignment.scope"},{"line_number":239,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"beeb9c28_714fcb37","line":236,"in_reply_to":"e974c39c_d2150a83","updated":"2024-04-04 20:44:20.000000000","message":"Never mind, that actually fails too many things (it fails whenever `--inherited` is not provided).","commit_id":"72eee3c883e0fb714ba9ae26df22598404e1459f"},{"author":{"_account_id":27900,"name":"Artem Goncharov","email":"artem.goncharov@gmail.com","username":"gtema"},"change_message_id":"0e5f6ea6d2ca898daa7d3732df35a230e9b6c6b8","unresolved":true,"context_lines":[{"line_number":237,"context_line":""},{"line_number":238,"context_line":"            del assignment.scope"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"            if hasattr(assignment, \u0027user\u0027) and assignment.user:"},{"line_number":241,"context_line":"                if include_names:"},{"line_number":242,"context_line":"                    usr \u003d \u0027@\u0027.join("},{"line_number":243,"context_line":"                        ["}],"source_content_type":"text/x-python","patch_set":2,"id":"9a5eea50_5c556e01","line":240,"updated":"2024-03-13 15:43:55.000000000","message":"we can actually get rid of \"hasattr\" since in SDK we always have it present","commit_id":"72eee3c883e0fb714ba9ae26df22598404e1459f"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"217c97be8d8e139f1bb6e3feefe6698b5ab4a004","unresolved":false,"context_lines":[{"line_number":237,"context_line":""},{"line_number":238,"context_line":"            del assignment.scope"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"            if hasattr(assignment, \u0027user\u0027) and assignment.user:"},{"line_number":241,"context_line":"                if include_names:"},{"line_number":242,"context_line":"                    usr \u003d \u0027@\u0027.join("},{"line_number":243,"context_line":"                        ["}],"source_content_type":"text/x-python","patch_set":2,"id":"155d3c08_fdcc1a88","line":240,"in_reply_to":"093390a0_423a6f42","updated":"2024-04-22 21:29:37.000000000","message":"Done","commit_id":"72eee3c883e0fb714ba9ae26df22598404e1459f"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"b597261f769fae35d8d218f785b4e1009a2b382f","unresolved":true,"context_lines":[{"line_number":237,"context_line":""},{"line_number":238,"context_line":"            del assignment.scope"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"            if hasattr(assignment, \u0027user\u0027) and assignment.user:"},{"line_number":241,"context_line":"                if include_names:"},{"line_number":242,"context_line":"                    usr \u003d \u0027@\u0027.join("},{"line_number":243,"context_line":"                        ["}],"source_content_type":"text/x-python","patch_set":2,"id":"d2fcec16_617d8110","line":240,"in_reply_to":"9a5eea50_5c556e01","updated":"2024-03-13 17:36:53.000000000","message":"Removing this seems to break the unit tests:\n```\n      File \"[...]/test_role_assignment.py\", line 254, in test_role_assignment_list_domain\n    columns, data \u003d self.cmd.take_action(parsed_args)\n\n      File \"[...]/role_assignment.py\", line 240, in take_action\n    if assignment.user:\n\n    AttributeError: \u0027FakeResource\u0027 object has no attribute \u0027user\u0027\n```","commit_id":"72eee3c883e0fb714ba9ae26df22598404e1459f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"def5e187ea71ecb45f6a843fbdee1e4cc8c0d1f3","unresolved":true,"context_lines":[{"line_number":237,"context_line":""},{"line_number":238,"context_line":"            del assignment.scope"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"            if hasattr(assignment, \u0027user\u0027) and assignment.user:"},{"line_number":241,"context_line":"                if include_names:"},{"line_number":242,"context_line":"                    usr \u003d \u0027@\u0027.join("},{"line_number":243,"context_line":"                        ["}],"source_content_type":"text/x-python","patch_set":2,"id":"093390a0_423a6f42","line":240,"in_reply_to":"d2fcec16_617d8110","updated":"2024-04-12 16:23:51.000000000","message":"That indicates that you\u0027re not using real objects in the tests. We shouldn\u0027t be seeing `FakeResource`. Rather, we should be seeing `RoleAssignment` objects.","commit_id":"72eee3c883e0fb714ba9ae26df22598404e1459f"},{"author":{"_account_id":27900,"name":"Artem Goncharov","email":"artem.goncharov@gmail.com","username":"gtema"},"change_message_id":"c6b4fab41c5241139b25a0f39ab907ad9ea690a7","unresolved":true,"context_lines":[{"line_number":237,"context_line":""},{"line_number":238,"context_line":"            del assignment.scope"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"            if hasattr(assignment, \u0027user\u0027) and assignment.user:"},{"line_number":241,"context_line":"                if include_names:"},{"line_number":242,"context_line":"                    usr \u003d \u0027@\u0027.join("},{"line_number":243,"context_line":"                        ["}],"source_content_type":"text/x-python","patch_set":2,"id":"fcc6927a_017d895f","line":240,"in_reply_to":"d2fcec16_617d8110","updated":"2024-06-17 10:27:11.000000000","message":"oh right, FakeResource is not a real sdk resource (at least not for now)","commit_id":"72eee3c883e0fb714ba9ae26df22598404e1459f"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"b1733a77b29040a0041a613578b983ddd415e23e","unresolved":true,"context_lines":[{"line_number":285,"context_line":"                    print(\"setting role to\")"},{"line_number":286,"context_line":"                    print(assignment.role[\u0027id\u0027])"},{"line_number":287,"context_line":"                    print(hasattr(assignment, \u0027role\u0027))"},{"line_number":288,"context_line":"                    setattr(assignment, \u0027role\u0027, assignment.role[\u0027id\u0027])"},{"line_number":289,"context_line":"                    print(\"role is now\")"},{"line_number":290,"context_line":"                    print(assignment.role)"},{"line_number":291,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":11,"id":"e1ab3ca7_e7db5522","line":288,"updated":"2024-04-22 21:28:46.000000000","message":"I\u0027m running into an issue here where this doesn\u0027t get set correctly. In the debug prints before this line, `print(assignment.role[\u0027id\u0027])` successfully prints the correct role ID, and `print(hasattr(assignment, \u0027role\u0027))` prints `True`. But after the `setattr()` happens, `print(assignment.role)` prints `{}` instead of the role ID.","commit_id":"ff4b9a1dc40f16b772322d8a5e29b6b9fc780ad2"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"ea171c4ecdd184063c1e04d0feefe5699b0239d9","unresolved":false,"context_lines":[{"line_number":285,"context_line":"                    print(\"setting role to\")"},{"line_number":286,"context_line":"                    print(assignment.role[\u0027id\u0027])"},{"line_number":287,"context_line":"                    print(hasattr(assignment, \u0027role\u0027))"},{"line_number":288,"context_line":"                    setattr(assignment, \u0027role\u0027, assignment.role[\u0027id\u0027])"},{"line_number":289,"context_line":"                    print(\"role is now\")"},{"line_number":290,"context_line":"                    print(assignment.role)"},{"line_number":291,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":11,"id":"fd4a1f41_65a687d6","line":288,"in_reply_to":"c64003a4_4c857c52","updated":"2024-04-25 19:25:35.000000000","message":"Done\nI ended up building a tuple myself :)","commit_id":"ff4b9a1dc40f16b772322d8a5e29b6b9fc780ad2"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9acc29b2aa2d9fc88029fa385601ebbb480da49f","unresolved":true,"context_lines":[{"line_number":285,"context_line":"                    print(\"setting role to\")"},{"line_number":286,"context_line":"                    print(assignment.role[\u0027id\u0027])"},{"line_number":287,"context_line":"                    print(hasattr(assignment, \u0027role\u0027))"},{"line_number":288,"context_line":"                    setattr(assignment, \u0027role\u0027, assignment.role[\u0027id\u0027])"},{"line_number":289,"context_line":"                    print(\"role is now\")"},{"line_number":290,"context_line":"                    print(assignment.role)"},{"line_number":291,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":11,"id":"c64003a4_4c857c52","line":288,"in_reply_to":"e1ab3ca7_e7db5522","updated":"2024-04-24 16:42:22.000000000","message":"We discussed this today, but this is failing because the code here is munging the `assignment` object to convert `role` from a dict to a string with either name or ID values. This isn\u0027t allowed with SDK\u0027s `Resource` class so we need to stop doing this. You can either (a) use a formatter to do this or (b) stop relying on `_as_tuple` and build a tuple yourself.","commit_id":"ff4b9a1dc40f16b772322d8a5e29b6b9fc780ad2"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"aba848a219b0bbbd68694194ac8aa5927c4b70ff","unresolved":true,"context_lines":[{"line_number":97,"context_line":"                if assignment.user and label \u003d\u003d \u0027name\u0027"},{"line_number":98,"context_line":"                else \u0027\u0027"},{"line_number":99,"context_line":"            ),"},{"line_number":100,"context_line":"            assignment.group.get(label, \u0027\u0027)"},{"line_number":101,"context_line":"            + ("},{"line_number":102,"context_line":"                \u0027@\u0027 + assignment.group[\u0027domain\u0027][\u0027name\u0027]"},{"line_number":103,"context_line":"                if assignment.group and label \u003d\u003d \u0027name\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"40d05444_e340e5b7","line":100,"range":{"start_line":100,"start_character":29,"end_line":100,"end_character":32},"updated":"2024-04-26 22:59:18.000000000","message":"This seems to be erroring out in the functional tests when a role assignment is created from a role without a group; the role assignment\u0027s group attribute ends up being `None` (I thought originally that it would be `{}`).","commit_id":"487346378c778ba6ce11f019a7bf9b51993c994b"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"e27b16309cbb6f255aea70effe3a86d620ad6bde","unresolved":true,"context_lines":[{"line_number":97,"context_line":"                if assignment.user and label \u003d\u003d \u0027name\u0027"},{"line_number":98,"context_line":"                else \u0027\u0027"},{"line_number":99,"context_line":"            ),"},{"line_number":100,"context_line":"            assignment.group.get(label, \u0027\u0027)"},{"line_number":101,"context_line":"            + ("},{"line_number":102,"context_line":"                \u0027@\u0027 + assignment.group[\u0027domain\u0027][\u0027name\u0027]"},{"line_number":103,"context_line":"                if assignment.group and label \u003d\u003d \u0027name\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"694705a5_245bebff","line":100,"range":{"start_line":100,"start_character":29,"end_line":100,"end_character":32},"in_reply_to":"40d05444_e340e5b7","updated":"2024-04-27 00:40:05.000000000","message":"I added checks for these being `None` but that makes the whole function very messy... I\u0027ll look into refactoring this without hardcoded column names to see if it\u0027s neater...","commit_id":"487346378c778ba6ce11f019a7bf9b51993c994b"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"4809003be591d74789a1e8e130ef9def89e271c8","unresolved":true,"context_lines":[{"line_number":97,"context_line":"                if assignment.user and label \u003d\u003d \u0027name\u0027"},{"line_number":98,"context_line":"                else \u0027\u0027"},{"line_number":99,"context_line":"            ),"},{"line_number":100,"context_line":"            assignment.group.get(label, \u0027\u0027)"},{"line_number":101,"context_line":"            + ("},{"line_number":102,"context_line":"                \u0027@\u0027 + assignment.group[\u0027domain\u0027][\u0027name\u0027]"},{"line_number":103,"context_line":"                if assignment.group and label \u003d\u003d \u0027name\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"a4295aab_81877079","line":100,"range":{"start_line":100,"start_character":29,"end_line":100,"end_character":32},"in_reply_to":"694705a5_245bebff","updated":"2024-05-02 20:16:55.000000000","message":"Ok, I did manage to get something that iterates through the column names, but it\u0027s less readable and still kind of messy-looking...\nThe hardcoded version is in patchset 13 and the new version is patchset 14. I\u0027ll see if I can do any more cleanup and refactoring of the new version, but for now this is as much as I can come up with...","commit_id":"487346378c778ba6ce11f019a7bf9b51993c994b"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"38570406b43a922c4d1c06c49f46fe992825dd3a","unresolved":false,"context_lines":[{"line_number":97,"context_line":"                if assignment.user and label \u003d\u003d \u0027name\u0027"},{"line_number":98,"context_line":"                else \u0027\u0027"},{"line_number":99,"context_line":"            ),"},{"line_number":100,"context_line":"            assignment.group.get(label, \u0027\u0027)"},{"line_number":101,"context_line":"            + ("},{"line_number":102,"context_line":"                \u0027@\u0027 + assignment.group[\u0027domain\u0027][\u0027name\u0027]"},{"line_number":103,"context_line":"                if assignment.group and label \u003d\u003d \u0027name\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"0c791eb2_d079856b","line":100,"range":{"start_line":100,"start_character":29,"end_line":100,"end_character":32},"in_reply_to":"a4295aab_81877079","updated":"2024-05-08 17:01:01.000000000","message":"Acknowledged","commit_id":"487346378c778ba6ce11f019a7bf9b51993c994b"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"38570406b43a922c4d1c06c49f46fe992825dd3a","unresolved":false,"context_lines":[{"line_number":93,"context_line":"                attr[\u0027name\u0027]"},{"line_number":94,"context_line":"                + ("},{"line_number":95,"context_line":"                    \"@\" + domain[\u0027name\u0027]"},{"line_number":96,"context_line":"                    if (domain :\u003d attr.get(\u0027domain\u0027))"},{"line_number":97,"context_line":"                    else \u0027\u0027"},{"line_number":98,"context_line":"                )"},{"line_number":99,"context_line":"            )"}],"source_content_type":"text/x-python","patch_set":15,"id":"1d076b13_3f4a344b","line":96,"range":{"start_line":96,"start_character":31,"end_line":96,"end_character":33},"updated":"2024-05-08 17:01:01.000000000","message":"Oh, the walrus operator. This may be the first use of this I\u0027ve seen. Nice.","commit_id":"25b75479b2cc79eeeba5a29b3dcbd00790b61a90"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"38570406b43a922c4d1c06c49f46fe992825dd3a","unresolved":true,"context_lines":[{"line_number":126,"context_line":"            ],"},{"line_number":127,"context_line":"            \u0027all\u0027 if assignment.scope.get(\"system\") else \u0027\u0027,"},{"line_number":128,"context_line":"            assignment.scope.get(\"OS-INHERIT:inherited_to\") \u003d\u003d \u0027projects\u0027,"},{"line_number":129,"context_line":"        )"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def take_action(self, parsed_args):"},{"line_number":132,"context_line":"        identity_client \u003d self.app.client_manager.sdk_connection.identity"}],"source_content_type":"text/x-python","patch_set":15,"id":"8092c241_c6811ab0","line":129,"updated":"2024-05-08 17:01:01.000000000","message":"You\u0027re being very clever here, which is no bad thing but does make this harder to read than is perhaps necessary. I think the bigger issue here is that some of these are top level fields (`role`, `user`, `group`) while the rest are nested under `scope` (`project`, `domain`, `system`). Why not treat just them differently? Something like this?\n\n```\ndef _format_role_assignment(assignment, include_names):\n    def _get_name(attr):\n        return (\n            attr[\u0027name\u0027]\n            + (\n                \"@\" + domain[\u0027name\u0027]\n                if (domain :\u003d attr.get(\u0027domain\u0027))\n                else \u0027\u0027\n            )\n        ) or \u0027\u0027 if attr else \u0027\u0027\n\n    def _get_id(attr):\n        return attr[\u0027id\u0027] or \u0027\u0027 if attr else \u0027\u0027\n\n    func \u003d _get_name if include_names else _get_id\n\n    return (\n        func(assignment.role),\n        func(assignment.user),\n        func(assignment.group),\n        func(assignment.scope.get(\u0027project\u0027)),\n        func(assignment.scope.get(\u0027domain\u0027)),\n        assignment.scope.get(\u0027system\u0027) and \u0027all\u0027,\n        assignment.scope.get(\"OS-INHERIT:inherited_to\") \u003d\u003d \u0027projects\u0027\n    )\n```\n\n(note that this doesn\u0027t need to be a method of the class either since you\u0027re not using anything from `self`: you can just make use of nested functions)","commit_id":"25b75479b2cc79eeeba5a29b3dcbd00790b61a90"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"920f9716e4f575fe7903ba8a942edd0a2f06e903","unresolved":true,"context_lines":[{"line_number":126,"context_line":"            ],"},{"line_number":127,"context_line":"            \u0027all\u0027 if assignment.scope.get(\"system\") else \u0027\u0027,"},{"line_number":128,"context_line":"            assignment.scope.get(\"OS-INHERIT:inherited_to\") \u003d\u003d \u0027projects\u0027,"},{"line_number":129,"context_line":"        )"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def take_action(self, parsed_args):"},{"line_number":132,"context_line":"        identity_client \u003d self.app.client_manager.sdk_connection.identity"}],"source_content_type":"text/x-python","patch_set":15,"id":"d72122f6_06ee366d","line":129,"in_reply_to":"8092c241_c6811ab0","updated":"2024-05-08 20:32:35.000000000","message":"Thanks, this does look better to me! I will change it and upload a new patchset.","commit_id":"25b75479b2cc79eeeba5a29b3dcbd00790b61a90"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"967873c57940a98d61741144de5170707c5b38e6","unresolved":false,"context_lines":[{"line_number":126,"context_line":"            ],"},{"line_number":127,"context_line":"            \u0027all\u0027 if assignment.scope.get(\"system\") else \u0027\u0027,"},{"line_number":128,"context_line":"            assignment.scope.get(\"OS-INHERIT:inherited_to\") \u003d\u003d \u0027projects\u0027,"},{"line_number":129,"context_line":"        )"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def take_action(self, parsed_args):"},{"line_number":132,"context_line":"        identity_client \u003d self.app.client_manager.sdk_connection.identity"}],"source_content_type":"text/x-python","patch_set":15,"id":"dc4e02ee_5e7bc171","line":129,"in_reply_to":"d72122f6_06ee366d","updated":"2024-05-08 20:59:38.000000000","message":"Done","commit_id":"25b75479b2cc79eeeba5a29b3dcbd00790b61a90"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"38570406b43a922c4d1c06c49f46fe992825dd3a","unresolved":true,"context_lines":[{"line_number":223,"context_line":"        if inherited_to:"},{"line_number":224,"context_line":"            call_kwargs[\u0027inherited_to\u0027] \u003d inherited_to"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"        data \u003d identity_client.role_assignments(**call_kwargs)"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        data_parsed \u003d []"},{"line_number":229,"context_line":"        for assignment in data:"}],"source_content_type":"text/x-python","patch_set":15,"id":"bed9cb3e_db0fc38e","line":226,"updated":"2024-05-08 17:01:01.000000000","message":"I would suspect most of the options are no-ops if they\u0027re unset i.e.. `None`) and a quick test suggests as much. If so, rather than building this `call_kwargs` argument can we just always pass these arguments?\n\n```\nassignments \u003d conn.identity.role_assignments(\n    role_id\u003drole_id,\n    user_id\u003duser_id,\n    scope_system\u003dsystem,\n    scope_domain_id\u003ddomain_id,\n    scope_project_id\u003dproject_id,\n    group_id\u003dgroup_id,\n    effective\u003dparsed_args.effective,\n    include_names\u003dinclude_names,\n    inherited_to\u003dinherited_to,\n)\n```\n\n???","commit_id":"25b75479b2cc79eeeba5a29b3dcbd00790b61a90"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"c2dcca157f7f71b6fc97659051ec0466f5062709","unresolved":false,"context_lines":[{"line_number":223,"context_line":"        if inherited_to:"},{"line_number":224,"context_line":"            call_kwargs[\u0027inherited_to\u0027] \u003d inherited_to"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"        data \u003d identity_client.role_assignments(**call_kwargs)"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        data_parsed \u003d []"},{"line_number":229,"context_line":"        for assignment in data:"}],"source_content_type":"text/x-python","patch_set":15,"id":"5770c501_3cb2ae11","line":226,"in_reply_to":"bd3278d9_576909ae","updated":"2024-05-08 21:37:05.000000000","message":"I still don\u0027t remember exactly what it was that was broken before, but either way it seems to be working correctly now; all the tests are passing :)","commit_id":"25b75479b2cc79eeeba5a29b3dcbd00790b61a90"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"920f9716e4f575fe7903ba8a942edd0a2f06e903","unresolved":true,"context_lines":[{"line_number":223,"context_line":"        if inherited_to:"},{"line_number":224,"context_line":"            call_kwargs[\u0027inherited_to\u0027] \u003d inherited_to"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"        data \u003d identity_client.role_assignments(**call_kwargs)"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        data_parsed \u003d []"},{"line_number":229,"context_line":"        for assignment in data:"}],"source_content_type":"text/x-python","patch_set":15,"id":"bd3278d9_576909ae","line":226,"in_reply_to":"bed9cb3e_db0fc38e","updated":"2024-05-08 20:32:35.000000000","message":"I had this format in patchset 1 but changed it to the `call_kwargs` stuff in patchset 2; I seem to remember the output being wrong somewhere without building the `call_kwargs`, but it\u0027s possible that this has since been fixed somewhere else, so I will look into this some more.","commit_id":"25b75479b2cc79eeeba5a29b3dcbd00790b61a90"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"2fe0e462884a97e59196fb7389aac625f507ef79","unresolved":true,"context_lines":[{"line_number":127,"context_line":"        if parsed_args.role_domain:"},{"line_number":128,"context_line":"            role_domain_id \u003d identity_client.find_domain("},{"line_number":129,"context_line":"                name_or_id\u003dparsed_args.role_domain, ignore_missing\u003dFalse"},{"line_number":130,"context_line":"            ).id"},{"line_number":131,"context_line":"        if parsed_args.role:"},{"line_number":132,"context_line":"            role_id \u003d identity_client.find_role("},{"line_number":133,"context_line":"                name_or_id\u003dparsed_args.role,"}],"source_content_type":"text/x-python","patch_set":18,"id":"de127e3c_a6fa2436","line":130,"updated":"2024-05-21 11:00:18.000000000","message":"There\u0027s a slight change in behavior here. Most of the `find_xxx` helpers in `openstackclient.identity.common` use `_find_identity_resource` under the hood. That specifically handles cases where the user can\u0027t list e.g. users (`HTTP 403 (Forbidden)`) and simply returns back the original value to the user. We probably want to duplicate that here? If so, you can either reimplement `find_domain`, `find_user` etc. or do the check here (I suspect the former would be better since there are _quite_ a few users of these methods around). In any case, the underlying call should probably look something like this:\n\n```\ntry:\n    role_domain_id \u003d identity_client.find_domain(\n        parsed_args.role_domain, ignore_missing\u003dFalse\n    ).id\nexcept sdk_exceptions.ForbiddenException:\n    # if we don\u0027t have permission to list users, use it as-is\n    role_domain_id \u003d parsed_args.role_domain\n```","commit_id":"227871aeb5a564f00c49f462ddd66c0feadee792"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"813a55ffff54319ee6b4cc3fa38c654d13281915","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        if parsed_args.role_domain:"},{"line_number":128,"context_line":"            role_domain_id \u003d identity_client.find_domain("},{"line_number":129,"context_line":"                name_or_id\u003dparsed_args.role_domain, ignore_missing\u003dFalse"},{"line_number":130,"context_line":"            ).id"},{"line_number":131,"context_line":"        if parsed_args.role:"},{"line_number":132,"context_line":"            role_id \u003d identity_client.find_role("},{"line_number":133,"context_line":"                name_or_id\u003dparsed_args.role,"}],"source_content_type":"text/x-python","patch_set":18,"id":"24e9bf93_a6260662","line":130,"in_reply_to":"de127e3c_a6fa2436","updated":"2024-05-23 23:16:31.000000000","message":"Done","commit_id":"227871aeb5a564f00c49f462ddd66c0feadee792"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8e549ad13be13cbdbef6b76837021fb12e381c07","unresolved":true,"context_lines":[{"line_number":55,"context_line":"    try:"},{"line_number":56,"context_line":"        return command(name_or_id\u003dname_or_id, *args, **kwargs)"},{"line_number":57,"context_line":"    except sdk_exceptions.ForbiddenException:"},{"line_number":58,"context_line":"        return {id: name_or_id}"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"class ListRoleAssignment(command.Lister):"}],"source_content_type":"text/x-python","patch_set":19,"id":"1145101a_bda25f80","line":58,"range":{"start_line":58,"start_character":16,"end_line":58,"end_character":18},"updated":"2024-06-05 11:55:36.000000000","message":"This is setting the key to the `id` function, not the string `\u0027id\u0027`.","commit_id":"7882e425f45b5d400b9884e86c467d23b83e0574"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"8bcaee6b1f5c0f1e4582df008bbc08ec5148cc9d","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    try:"},{"line_number":56,"context_line":"        return command(name_or_id\u003dname_or_id, *args, **kwargs)"},{"line_number":57,"context_line":"    except sdk_exceptions.ForbiddenException:"},{"line_number":58,"context_line":"        return {id: name_or_id}"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"class ListRoleAssignment(command.Lister):"}],"source_content_type":"text/x-python","patch_set":19,"id":"20cdb7f6_7cb4d866","line":58,"range":{"start_line":58,"start_character":16,"end_line":58,"end_character":18},"in_reply_to":"1145101a_bda25f80","updated":"2024-06-05 22:47:04.000000000","message":"Oops, you\u0027re right; I\u0027ve been writing too much JavaScript recently haha 😄","commit_id":"7882e425f45b5d400b9884e86c467d23b83e0574"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8e549ad13be13cbdbef6b76837021fb12e381c07","unresolved":true,"context_lines":[{"line_number":137,"context_line":"                identity_client.find_domain,"},{"line_number":138,"context_line":"                name_or_id\u003dparsed_args.role_domain,"},{"line_number":139,"context_line":"                ignore_missing\u003dFalse,"},{"line_number":140,"context_line":"            ).id"},{"line_number":141,"context_line":"        if parsed_args.role:"},{"line_number":142,"context_line":"            role_id \u003d _find_sdk("},{"line_number":143,"context_line":"                identity_client.find_role,"}],"source_content_type":"text/x-python","patch_set":19,"id":"37ce82d4_732e68a9","line":140,"updated":"2024-06-05 11:55:36.000000000","message":"You\u0027re missing test coverage here, because it\u0027s not possible to access `dict` attributes like this:\n\n```\n\u003e\u003e\u003e x \u003d {\u0027a\u0027: 2}\n\u003e\u003e\u003e x.a\nTraceback (most recent call last):\n  File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\nAttributeError: \u0027dict\u0027 object has no attribute \u0027a\u0027\n```\n\nRather than doing this, it might easier to have a `_get_id` function?\n\n```\nrole_domain_id \u003d _get_id(\n    identity_client.find_domain,\n    parsed_args.role_domain,\n)\n```\n\nWhere `_get_id` is e.g.\n\n\n```\ndef _get_id(meth, name_or_id, **kwargs):\n    \"\"\"Attempt to get the ID for the resource.\n\n    If this fails, return what the user gave us.\n    \"\"\"\n    try:\n        return meth(name_or_id, ignore_missing\u003dFalse, **kwargs).id\n    except sdk_exceptions.ForbiddenException:\n        return name_or_id\n```","commit_id":"7882e425f45b5d400b9884e86c467d23b83e0574"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"8bcaee6b1f5c0f1e4582df008bbc08ec5148cc9d","unresolved":false,"context_lines":[{"line_number":137,"context_line":"                identity_client.find_domain,"},{"line_number":138,"context_line":"                name_or_id\u003dparsed_args.role_domain,"},{"line_number":139,"context_line":"                ignore_missing\u003dFalse,"},{"line_number":140,"context_line":"            ).id"},{"line_number":141,"context_line":"        if parsed_args.role:"},{"line_number":142,"context_line":"            role_id \u003d _find_sdk("},{"line_number":143,"context_line":"                identity_client.find_role,"}],"source_content_type":"text/x-python","patch_set":19,"id":"296d70d1_11c56d79","line":140,"in_reply_to":"37ce82d4_732e68a9","updated":"2024-06-05 22:47:04.000000000","message":"Done","commit_id":"7882e425f45b5d400b9884e86c467d23b83e0574"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"5587a62e5af3e89720d10e036c097e2ccccdfba2","unresolved":true,"context_lines":[{"line_number":54,"context_line":"def _find_sdk_id(find_command, name_or_id, **kwargs):"},{"line_number":55,"context_line":"    try:"},{"line_number":56,"context_line":"        return find_command("},{"line_number":57,"context_line":"            name_or_id\u003dname_or_id, ignore_missing\u003dFalse, **kwargs"},{"line_number":58,"context_line":"        ).id"},{"line_number":59,"context_line":"    except sdk_exceptions.ForbiddenException:"},{"line_number":60,"context_line":"        return name_or_id"}],"source_content_type":"text/x-python","patch_set":20,"id":"106e71c0_15727868","line":57,"updated":"2024-06-06 23:51:21.000000000","message":"Just to confirm, setting `ignore_missing` to True here and just returning `name_or_id` if the result is False is _not_ what we want, right? Because we only want to catch `ForbiddenException` specifically and not other reasons for not finding a match?","commit_id":"d9540dc84fc11be0af8589b448c8982b5db91333"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"eb2a646c3ed4cb5c1563f514a6675498d2d844e4","unresolved":true,"context_lines":[{"line_number":54,"context_line":"def _find_sdk_id(find_command, name_or_id, **kwargs):"},{"line_number":55,"context_line":"    try:"},{"line_number":56,"context_line":"        return find_command("},{"line_number":57,"context_line":"            name_or_id\u003dname_or_id, ignore_missing\u003dFalse, **kwargs"},{"line_number":58,"context_line":"        ).id"},{"line_number":59,"context_line":"    except sdk_exceptions.ForbiddenException:"},{"line_number":60,"context_line":"        return name_or_id"}],"source_content_type":"text/x-python","patch_set":20,"id":"4b2827bf_7906fd6d","line":57,"in_reply_to":"106e71c0_15727868","updated":"2024-06-07 09:45:10.000000000","message":"I think it *is* what we want. We want to ignore `ForbiddenException` but we want to raise `ResourceNotFound`. The former implies we don\u0027t have permission but since the server might be able to do it for us we should allow it to continue. The latter implies we *do* have permission and the resource simply doesn\u0027t exist. There\u0027s no point going to the server in the latter case.\n\n**Later:** Actually, given the below you\u0027re probably correct: we should use `False` here.","commit_id":"d9540dc84fc11be0af8589b448c8982b5db91333"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7c63c34a3a2319f6c1198e2372aa57aaca032af7","unresolved":false,"context_lines":[{"line_number":54,"context_line":"def _find_sdk_id(find_command, name_or_id, **kwargs):"},{"line_number":55,"context_line":"    try:"},{"line_number":56,"context_line":"        return find_command("},{"line_number":57,"context_line":"            name_or_id\u003dname_or_id, ignore_missing\u003dFalse, **kwargs"},{"line_number":58,"context_line":"        ).id"},{"line_number":59,"context_line":"    except sdk_exceptions.ForbiddenException:"},{"line_number":60,"context_line":"        return name_or_id"}],"source_content_type":"text/x-python","patch_set":20,"id":"f704952f_25191d40","line":57,"in_reply_to":"4b2827bf_7906fd6d","updated":"2024-06-13 11:21:02.000000000","message":"Resolved per below. The code that\u0027s currently here is correct.","commit_id":"d9540dc84fc11be0af8589b448c8982b5db91333"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"82b70e656d4c4a33f6d4abd1ae81d4606ce731bb","unresolved":true,"context_lines":[{"line_number":56,"context_line":"        return find_command("},{"line_number":57,"context_line":"            name_or_id\u003dname_or_id, ignore_missing\u003dFalse, **kwargs"},{"line_number":58,"context_line":"        ).id"},{"line_number":59,"context_line":"    except sdk_exceptions.ForbiddenException:"},{"line_number":60,"context_line":"        return name_or_id"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"df0b102a_06e2671c","line":59,"updated":"2024-06-06 23:28:46.000000000","message":"It seems from https://opendev.org/openstack/openstacksdk/src/commit/771740cabab1e00f7b3e55c34e2182ae3c9490bb/openstack/resource.py#L2350 that SDK catches `ForbiddenException` in the `find_*()` commands; should I be catching `ResourceNotFound` here instead?","commit_id":"d9540dc84fc11be0af8589b448c8982b5db91333"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"45effafc9ef254c8c679a309dcdfd33ad5a08657","unresolved":true,"context_lines":[{"line_number":56,"context_line":"        return find_command("},{"line_number":57,"context_line":"            name_or_id\u003dname_or_id, ignore_missing\u003dFalse, **kwargs"},{"line_number":58,"context_line":"        ).id"},{"line_number":59,"context_line":"    except sdk_exceptions.ForbiddenException:"},{"line_number":60,"context_line":"        return name_or_id"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"a2d78c15_cad85e0c","line":59,"in_reply_to":"1c5744a7_5ccff419","updated":"2024-06-08 01:46:08.000000000","message":"Oh I think I misunderstood, sorry - you mean I _should_ keep `ignore_missing\u003dFalse` and check for both `ResourceNotFound` (not `ForbiddenException`) _and_ `None` (for those cases where SDK caught the `ForbiddenException` and then found nothing)?","commit_id":"d9540dc84fc11be0af8589b448c8982b5db91333"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"54a7850dabe3225808d4d6544fc957ae5a82d099","unresolved":true,"context_lines":[{"line_number":56,"context_line":"        return find_command("},{"line_number":57,"context_line":"            name_or_id\u003dname_or_id, ignore_missing\u003dFalse, **kwargs"},{"line_number":58,"context_line":"        ).id"},{"line_number":59,"context_line":"    except sdk_exceptions.ForbiddenException:"},{"line_number":60,"context_line":"        return name_or_id"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"1c5744a7_5ccff419","line":59,"in_reply_to":"63924e6f_205a0aaf","updated":"2024-06-08 00:25:28.000000000","message":"Ok, so if I\u0027m understanding you correctly, I should let SDK return `None` instead of raising `ResourceNotFound` when it can\u0027t find something? SDK raises `ResourceNotFound` when `ignore_missing \u003d\u003d False`, and it returns `None` when `ignore_missing \u003d\u003d True`, so I\u0027m guessing the value of `ignore_missing` is just flipped in your reply above?","commit_id":"d9540dc84fc11be0af8589b448c8982b5db91333"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7c63c34a3a2319f6c1198e2372aa57aaca032af7","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        return find_command("},{"line_number":57,"context_line":"            name_or_id\u003dname_or_id, ignore_missing\u003dFalse, **kwargs"},{"line_number":58,"context_line":"        ).id"},{"line_number":59,"context_line":"    except sdk_exceptions.ForbiddenException:"},{"line_number":60,"context_line":"        return name_or_id"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"df2ac44d_10afba12","line":59,"in_reply_to":"a2d78c15_cad85e0c","updated":"2024-06-13 11:21:02.000000000","message":"I tested this and have included my reproducer below. We **do** need `ignore_missing\u003dTrue`. While the `find_*()` commands catch `ForbiddenException` when attempting to retrieve by ID (`GET /resource/{name_or_id}`), they do not catch it when attemtping to list and filter (`GET /resource`). As such, we will eventually see `ForbiddenException` if the user doesn\u0027t have permission to retrieve the resource.\n\n---\n\n```\nimport sys\n\nimport openstack\nimport openstack.exceptions\n\nconn \u003d openstack.connect()\n\ntry:\n    result \u003d conn.identity.find_role(sys.argv[1], ignore_missing\u003dFalse)\n    print(f\u0027result: {result}\u0027)\nexcept openstack.exceptions.NotFoundException as exc:\n    print(f\u0027got 404: {exc}\u0027)\nexcept openstack.exceptions.ForbiddenException as exc:\n    print(f\u0027got 403: {exc}\u0027)\nexcept openstack.exceptions.BadRequestException as exc:\n    print(f\u0027got 400: {exc}\u0027)\n```\n\nI saved this to `test.py` then ran the following:\n\n```\n❯ OS_CLOUD\u003ddevstack-admin python test.py admin\nresult: openstack.identity.v3.role.Role(...)\n\n❯ OS_CLOUD\u003ddevstack-admin python test.py invalid\ngot 404: No Role found for invalid\n\n❯ OS_CLOUD\u003ddevstack python test.py invalid\ngot 403: ForbiddenException: 403: Client Error for url: http://10.0.111.251/identity/v3/roles?name\u003dinvalid, You are not authorized to perform the requested action: identity:list_roles.\n\n❯ OS_CLOUD\u003ddevstack python test.py admin\ngot 403: ForbiddenException: 403: Client Error for url: http://10.0.111.251/identity/v3/roles?name\u003dadmin, You are not authorized to perform the requested action: identity:list_roles.\n```","commit_id":"d9540dc84fc11be0af8589b448c8982b5db91333"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"eb2a646c3ed4cb5c1563f514a6675498d2d844e4","unresolved":true,"context_lines":[{"line_number":56,"context_line":"        return find_command("},{"line_number":57,"context_line":"            name_or_id\u003dname_or_id, ignore_missing\u003dFalse, **kwargs"},{"line_number":58,"context_line":"        ).id"},{"line_number":59,"context_line":"    except sdk_exceptions.ForbiddenException:"},{"line_number":60,"context_line":"        return name_or_id"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"63924e6f_205a0aaf","line":59,"in_reply_to":"df0b102a_06e2671c","updated":"2024-06-07 09:45:10.000000000","message":"Oh, good catch. That\u0027s annoying. So conceivably we could get HTTP 403 on the fetch operation and sdk will ignore it and attempt to list resources, raising `ResourceNotFound` if it fails and `ignore_missing \u003d\u003d True`. This being the case, you\u0027re probably correct above: we should pass `ignore_missing\u003dFalse` but you need to be careful here because there\u0027s a chance `find_xxx` will now return `None` so you can\u0027t call `.id` on this without a check for none\u0027ness first.","commit_id":"d9540dc84fc11be0af8589b448c8982b5db91333"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6c0f1803266a3b654ce22d7c834dda31413fc058","unresolved":true,"context_lines":[{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        inherited_to \u003d \u0027projects\u0027 if parsed_args.inherited else None"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"        effective \u003d True if parsed_args.effective else None"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"        data \u003d identity_client.role_assignments("},{"line_number":214,"context_line":"            role_id\u003drole_id,"}],"source_content_type":"text/x-python","patch_set":20,"id":"cbe899b9_58fb37ca","line":211,"updated":"2024-06-13 11:22:48.000000000","message":"nit: rather than doing this, you could have just set the `default\u003d` argument for the option to `None` rather than `False`.","commit_id":"d9540dc84fc11be0af8589b448c8982b5db91333"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"f3a7a725909254e196a7ec06c93c47dc51bc4779","unresolved":false,"context_lines":[{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        inherited_to \u003d \u0027projects\u0027 if parsed_args.inherited else None"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"        effective \u003d True if parsed_args.effective else None"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"        data \u003d identity_client.role_assignments("},{"line_number":214,"context_line":"            role_id\u003drole_id,"}],"source_content_type":"text/x-python","patch_set":20,"id":"a98ea37e_e6b37f4c","line":211,"in_reply_to":"cbe899b9_58fb37ca","updated":"2024-06-13 23:01:34.000000000","message":"Oh I didn\u0027t know that! Done 😄","commit_id":"d9540dc84fc11be0af8589b448c8982b5db91333"}],"openstackclient/tests/functional/identity/v3/test_role_assignment.py":[{"author":{"_account_id":27900,"name":"Artem Goncharov","email":"artem.goncharov@gmail.com","username":"gtema"},"change_message_id":"0e5f6ea6d2ca898daa7d3732df35a230e9b6c6b8","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"56d17c73_87cf0d92","line":187,"updated":"2024-03-13 15:43:55.000000000","message":"would you please add another test with \"inherited\"? (we know it will fail now, but only this way we can verify the stuff)","commit_id":"72eee3c883e0fb714ba9ae26df22598404e1459f"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"9408b5eac10325ecd84aba514d88c84c236b9280","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"02c29c3b_8861ee67","line":187,"in_reply_to":"440e9d8d_1ec5f479","updated":"2024-04-04 19:55:47.000000000","message":"Resolved","commit_id":"72eee3c883e0fb714ba9ae26df22598404e1459f"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"b597261f769fae35d8d218f785b4e1009a2b382f","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"e391ee46_1928cd29","line":187,"in_reply_to":"56d17c73_87cf0d92","updated":"2024-03-13 17:36:53.000000000","message":"👍 will do","commit_id":"72eee3c883e0fb714ba9ae26df22598404e1459f"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"3689d3f2cdb7137067fdc94a5ea67a6c9712fa15","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"440e9d8d_1ec5f479","line":187,"in_reply_to":"6eff824a_f8b20218","updated":"2024-03-21 09:09:52.000000000","message":"Done\nI can tell from print output that the filtering is working correctly now... the test itself still does not test for correct output though.","commit_id":"72eee3c883e0fb714ba9ae26df22598404e1459f"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"d84480b571c3ad8472804678537ee5a75d685aa5","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"e7d432de_1c8b46ed","line":187,"in_reply_to":"e391ee46_1928cd29","updated":"2024-03-13 18:45:54.000000000","message":"I added a test, but for some reason it\u0027s still passing for my local devstack; when I print out the `assignment.scope` variable right before the `scope.get()` line in `role_assignment.py`, one of the rows somehow includes `OS-INHERIT:inherited_to\u0027: \u0027projects\u0027` ...","commit_id":"72eee3c883e0fb714ba9ae26df22598404e1459f"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"75a16bccd317f623951bb0687dda2074cff86c1f","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"6eff824a_f8b20218","line":187,"in_reply_to":"e7d432de_1c8b46ed","updated":"2024-03-14 17:56:22.000000000","message":"Ok, I think it\u0027s still doing things wrong; it\u0027s just not outright failing because the test doesn\u0027t check the actual output for correctness.\n```\nskipping invalid table line: {\u0027project\u0027: {\u0027id\u0027: \u00270c4a7fa25b5448ccbe7adad425180c98\u0027}, \u0027OS-INHERIT:inherited_to\u0027: \u0027projects\u0027}\nskipping invalid table line: {\u0027project\u0027: {\u0027id\u0027: \u0027d4a537906217442ea9f3f177f2ff78e7\u0027}}\nskipping invalid table line: {\u0027project\u0027: {\u0027id\u0027: \u00274e9d01855cec4355a0003d2499f4b9a9\u0027}}\nskipping invalid table line: {\u0027project\u0027: {\u0027id\u0027: \u00274e9d01855cec4355a0003d2499f4b9a9\u0027}}\nskipping invalid table line: {\u0027project\u0027: {\u0027id\u0027: \u00276c70313d9fba4e89b8703ed48ad87ebb\u0027}}\nskipping invalid table line: {\u0027project\u0027: {\u0027id\u0027: \u0027b9ca5e066e724f5ab47fb8ab18ad4ddc\u0027}}\nskipping invalid table line: {\u0027project\u0027: {\u0027id\u0027: \u0027b9ca5e066e724f5ab47fb8ab18ad4ddc\u0027}}\nskipping invalid table line: {\u0027project\u0027: {\u0027id\u0027: \u00274e9d01855cec4355a0003d2499f4b9a9\u0027}}\nskipping invalid table line: {\u0027project\u0027: {\u0027id\u0027: \u0027b0c62a761fff4c4db598064da4896a19\u0027}}\nskipping invalid table line: {\u0027project\u0027: {\u0027id\u0027: \u0027b0c62a761fff4c4db598064da4896a19\u0027}}\nskipping invalid table line: {\u0027project\u0027: {\u0027id\u0027: \u0027b0c62a761fff4c4db598064da4896a19\u0027}}\nskipping invalid table line: {\u0027project\u0027: {\u0027id\u0027: \u0027b9ca5e066e724f5ab47fb8ab18ad4ddc\u0027}}\nskipping invalid table line: {\u0027project\u0027: {\u0027id\u0027: \u0027b0c62a761fff4c4db598064da4896a19\u0027}}\nskipping invalid table line: {\u0027project\u0027: {\u0027id\u0027: \u0027b0c62a761fff4c4db598064da4896a19\u0027}}\nskipping invalid table line: {\u0027project\u0027: {\u0027id\u0027: \u0027b9ca5e066e724f5ab47fb8ab18ad4ddc\u0027}}\nskipping invalid table line: {\u0027project\u0027: {\u0027id\u0027: \u0027d4a537906217442ea9f3f177f2ff78e7\u0027}}\nskipping invalid table line: {\u0027domain\u0027: {\u0027id\u0027: \u0027default\u0027}}\nskipping invalid table line: {\u0027project\u0027: {\u0027id\u0027: \u00274e9d01855cec4355a0003d2499f4b9a9\u0027}}\nskipping invalid table line: {\u0027project\u0027: {\u0027id\u0027: \u00274e9d01855cec4355a0003d2499f4b9a9\u0027}}\nskipping invalid table line: {\u0027project\u0027: {\u0027id\u0027: \u0027b9ca5e066e724f5ab47fb8ab18ad4ddc\u0027}}\nskipping invalid table line: {\u0027project\u0027: {\u0027id\u0027: \u0027b9ca5e066e724f5ab47fb8ab18ad4ddc\u0027}}\nskipping invalid table line: {\u0027project\u0027: {\u0027id\u0027: \u00274e9d01855cec4355a0003d2499f4b9a9\u0027}}\nskipping invalid table line: {\u0027system\u0027: {\u0027all\u0027: True}}\nskipping invalid table line: {\u0027system\u0027: {\u0027all\u0027: True}}\nskipping invalid table line: {\u0027system\u0027: {\u0027all\u0027: True}}\nskipping invalid table line: {\u0027system\u0027: {\u0027all\u0027: True}}\n{0} openstackclient.tests.functional.identity.v3.test_role_assignment.RoleAssignmentTests.test_role_assignment_list_inherited [7.388896s] ... ok\n```\nIt looks like the filtering is not actually working, which is the \"failure\" that should be happening.","commit_id":"72eee3c883e0fb714ba9ae26df22598404e1459f"}],"openstackclient/tests/unit/identity/v3/test_role_assignment.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"def5e187ea71ecb45f6a843fbdee1e4cc8c0d1f3","unresolved":true,"context_lines":[{"line_number":47,"context_line":"                    identity_fakes.ASSIGNMENT_WITH_PROJECT_ID_AND_GROUP_ID"},{"line_number":48,"context_line":"                ),"},{"line_number":49,"context_line":"                loaded\u003dTrue,"},{"line_number":50,"context_line":"            ),"},{"line_number":51,"context_line":"        ]"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        # Get the command object to test"}],"source_content_type":"text/x-python","patch_set":10,"id":"40050b55_95ef1d4f","line":50,"updated":"2024-04-12 16:23:51.000000000","message":"You shouldn\u0027t be returning `FakeResource` objects here. Instead, you should be returning fake `RoleAssignment` objects. You can use the `openstack.test.fakes.generate_fake_resources` helper to generate these, if you\u0027d like.","commit_id":"11a00f148375250030306d2fe881f003439d1bca"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"217c97be8d8e139f1bb6e3feefe6698b5ab4a004","unresolved":false,"context_lines":[{"line_number":47,"context_line":"                    identity_fakes.ASSIGNMENT_WITH_PROJECT_ID_AND_GROUP_ID"},{"line_number":48,"context_line":"                ),"},{"line_number":49,"context_line":"                loaded\u003dTrue,"},{"line_number":50,"context_line":"            ),"},{"line_number":51,"context_line":"        ]"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        # Get the command object to test"}],"source_content_type":"text/x-python","patch_set":10,"id":"296910c9_3283eac3","line":50,"in_reply_to":"40050b55_95ef1d4f","updated":"2024-04-22 21:29:37.000000000","message":"Done","commit_id":"11a00f148375250030306d2fe881f003439d1bca"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"def5e187ea71ecb45f6a843fbdee1e4cc8c0d1f3","unresolved":true,"context_lines":[{"line_number":126,"context_line":"        columns, data \u003d self.cmd.take_action(parsed_args)"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        self.identity_sdk_client.role_assignments.assert_called_with("},{"line_number":129,"context_line":"            user_id\u003dself.identity_sdk_client.find_user().id,"},{"line_number":130,"context_line":"        )"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        self.assertEqual(self.columns, columns)"}],"source_content_type":"text/x-python","patch_set":10,"id":"6e9dc409_c481468f","line":129,"updated":"2024-04-12 16:23:51.000000000","message":"This is a bit unusual, even if it\u0027s technically fine and what was being done before. Because `self.identity_sdk_client` is an auto-mock of the identity v3 proxy API, a call to `find_user` will return a mock object. We should really be testing with the same kind of object we\u0027re going to see in production, so I\u0027d like to see us testing with a `User` object instead. You can do this by setting the `return_value` for the `find_user` call like you do for `role_assignments` at the top of the test:\n\n```\nfake_user \u003d fakes.generate_fake_resource(_users.User)\nself.identity_sdk_client.find_user.return_value \u003d fake_user\n```\n\nthen here you can simply do:\n\n```\nself.identity_sdk_client.role_assignments.assert_called_with(\n    user_id\u003dfake_user.id,\n)\n```","commit_id":"11a00f148375250030306d2fe881f003439d1bca"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"217c97be8d8e139f1bb6e3feefe6698b5ab4a004","unresolved":false,"context_lines":[{"line_number":126,"context_line":"        columns, data \u003d self.cmd.take_action(parsed_args)"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        self.identity_sdk_client.role_assignments.assert_called_with("},{"line_number":129,"context_line":"            user_id\u003dself.identity_sdk_client.find_user().id,"},{"line_number":130,"context_line":"        )"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        self.assertEqual(self.columns, columns)"}],"source_content_type":"text/x-python","patch_set":10,"id":"0d34fecd_e7b6fe3a","line":129,"in_reply_to":"6e9dc409_c481468f","updated":"2024-04-22 21:29:37.000000000","message":"Done","commit_id":"11a00f148375250030306d2fe881f003439d1bca"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"def5e187ea71ecb45f6a843fbdee1e4cc8c0d1f3","unresolved":true,"context_lines":[{"line_number":168,"context_line":"                ),"},{"line_number":169,"context_line":"                loaded\u003dTrue,"},{"line_number":170,"context_line":"            ),"},{"line_number":171,"context_line":"        ]"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"        arglist \u003d [\u0027--group\u0027, identity_fakes.group_name]"},{"line_number":174,"context_line":"        verifylist \u003d ["}],"source_content_type":"text/x-python","patch_set":10,"id":"0d36d60f_0c47f85c","line":171,"updated":"2024-04-12 16:23:51.000000000","message":"As above, we want to use fake `RoleAssignment` objects here.","commit_id":"11a00f148375250030306d2fe881f003439d1bca"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"217c97be8d8e139f1bb6e3feefe6698b5ab4a004","unresolved":false,"context_lines":[{"line_number":168,"context_line":"                ),"},{"line_number":169,"context_line":"                loaded\u003dTrue,"},{"line_number":170,"context_line":"            ),"},{"line_number":171,"context_line":"        ]"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"        arglist \u003d [\u0027--group\u0027, identity_fakes.group_name]"},{"line_number":174,"context_line":"        verifylist \u003d ["}],"source_content_type":"text/x-python","patch_set":10,"id":"19634d0d_0bc5c0b6","line":171,"in_reply_to":"0d36d60f_0c47f85c","updated":"2024-04-22 21:29:37.000000000","message":"Done","commit_id":"11a00f148375250030306d2fe881f003439d1bca"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"def5e187ea71ecb45f6a843fbdee1e4cc8c0d1f3","unresolved":true,"context_lines":[{"line_number":190,"context_line":"        columns, data \u003d self.cmd.take_action(parsed_args)"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"        self.identity_sdk_client.role_assignments.assert_called_with("},{"line_number":193,"context_line":"            group_id\u003dself.identity_sdk_client.find_group().id,"},{"line_number":194,"context_line":"        )"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"        self.assertEqual(self.columns, columns)"}],"source_content_type":"text/x-python","patch_set":10,"id":"b516e126_5e63dcde","line":193,"updated":"2024-04-12 16:23:51.000000000","message":"...and a fake `Group` object here.\n\nSame comments all the way down.","commit_id":"11a00f148375250030306d2fe881f003439d1bca"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"217c97be8d8e139f1bb6e3feefe6698b5ab4a004","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        columns, data \u003d self.cmd.take_action(parsed_args)"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"        self.identity_sdk_client.role_assignments.assert_called_with("},{"line_number":193,"context_line":"            group_id\u003dself.identity_sdk_client.find_group().id,"},{"line_number":194,"context_line":"        )"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"        self.assertEqual(self.columns, columns)"}],"source_content_type":"text/x-python","patch_set":10,"id":"79bdaab6_a3c97683","line":193,"in_reply_to":"b516e126_5e63dcde","updated":"2024-04-22 21:29:37.000000000","message":"Done","commit_id":"11a00f148375250030306d2fe881f003439d1bca"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"b3886900822a470de876a06d6081241706e0e327","unresolved":false,"context_lines":[{"line_number":355,"context_line":"        )"},{"line_number":356,"context_line":"        self.assertEqual(datalist, tuple(data))"},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"    def test_role_assignment_list_def_creds(self):"},{"line_number":359,"context_line":"        auth_ref \u003d self.app.client_manager.auth_ref \u003d mock.Mock()"},{"line_number":360,"context_line":"        auth_ref.project_id.return_value \u003d self.project.id"},{"line_number":361,"context_line":"        auth_ref.user_id.return_value \u003d self.user.id"}],"source_content_type":"text/x-python","patch_set":11,"id":"5b96b042_3813ada2","line":358,"updated":"2024-04-22 21:32:51.000000000","message":"I\u0027m still working on fixing the tests above, so the tests below here are intentionally not fixed yet.","commit_id":"ff4b9a1dc40f16b772322d8a5e29b6b9fc780ad2"},{"author":{"_account_id":36482,"name":"Oria Weng","display_name":"0weng","email":"oweng@osuosl.org","username":"0weng"},"change_message_id":"5f5836fe99d55acf7a270ca5169c9609a8a62470","unresolved":false,"context_lines":[{"line_number":637,"context_line":"        role_2 \u003d sdk_fakes.generate_fake_resource("},{"line_number":638,"context_line":"            resource_type\u003d_role.Role,"},{"line_number":639,"context_line":"            domain_id\u003ddomain_2.id,"},{"line_number":640,"context_line":"            name\u003dself.role.name,"},{"line_number":641,"context_line":"        )"},{"line_number":642,"context_line":"        assignment_with_role_domain_2 \u003d sdk_fakes.generate_fake_resource("},{"line_number":643,"context_line":"            resource_type\u003d_role_assignment.RoleAssignment,"}],"source_content_type":"text/x-python","patch_set":12,"id":"4e8b0fdd_04fb83d9","line":640,"updated":"2024-04-25 19:27:41.000000000","message":"This test used to use two roles in the same domain with different names, but that didn\u0027t seem to actually test for what `--role-domain` is used for, so I changed it to two roles with the same name in different domains.","commit_id":"487346378c778ba6ce11f019a7bf9b51993c994b"}]}
