)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"41b9deacefdbbf70598777f5ba8c13aaf95f764d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"43e90486_cd573509","updated":"2025-09-09 21:20:50.000000000","message":"Couple of comments inline but this looks great","commit_id":"2d1e79eae442b739bbedb0fb6bac51b31e850201"},{"author":{"_account_id":38254,"name":"Mincheol Kang","display_name":"Mincheol Kang","email":"platanus.kr@gmail.com","username":"mincheolkang"},"change_message_id":"890d6432c3633b714ee26042ba19f4e1cac90447","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"67f58627_33328d8b","in_reply_to":"43e90486_cd573509","updated":"2025-09-10 03:59:44.000000000","message":"Hello! Nice to meet you. Thank you for your feedback.\n\nI\u0027ve updated patchset 6 with the scope adjustments, sequence adjustments, and duplicate test removal you suggested. If there are any further modifications needed, please let me know.","commit_id":"2d1e79eae442b739bbedb0fb6bac51b31e850201"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5e774cb9ff7fd221353b461a6492917db6aeab17","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"c0f12c1d_910fae36","updated":"2025-09-25 10:22:06.000000000","message":"I have one further request (and a nitpick)","commit_id":"2aa0fc56742c87a7f8ac8d01e9342762832290b2"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"13908784dcbb602cea22b2baae4affd382ca7914","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"dda922de_90dc6a06","updated":"2025-11-12 12:24:50.000000000","message":"Great work here, @platanus.kr@gmail.com","commit_id":"e864c1fe759c465f8df3143b3c5abe66d8963260"}],"openstack/tests/functional/identity/v3/test_group.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"41b9deacefdbbf70598777f5ba8c13aaf95f764d","unresolved":true,"context_lines":[{"line_number":31,"context_line":"        self.addCleanup(self._delete_user, self.user)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def _delete_group(self, group):"},{"line_number":34,"context_line":"        ret \u003d self.system_admin_cloud.identity.delete_group(group)"},{"line_number":35,"context_line":"        self.assertIsNone(ret)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def _delete_user(self, user):"}],"source_content_type":"text/x-python","patch_set":5,"id":"6071f9d2_88168733","line":34,"updated":"2025-09-09 21:20:50.000000000","message":"Why `system_admin_cloud`? That will use system-scoped which would be pretty atypical. I would suggest using `operator_cloud` which is project-scoped.","commit_id":"2d1e79eae442b739bbedb0fb6bac51b31e850201"},{"author":{"_account_id":38254,"name":"Mincheol Kang","display_name":"Mincheol Kang","email":"platanus.kr@gmail.com","username":"mincheolkang"},"change_message_id":"890d6432c3633b714ee26042ba19f4e1cac90447","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        self.addCleanup(self._delete_user, self.user)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def _delete_group(self, group):"},{"line_number":34,"context_line":"        ret \u003d self.system_admin_cloud.identity.delete_group(group)"},{"line_number":35,"context_line":"        self.assertIsNone(ret)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def _delete_user(self, user):"}],"source_content_type":"text/x-python","patch_set":5,"id":"d0f33013_4afe9072","line":34,"in_reply_to":"6071f9d2_88168733","updated":"2025-09-10 03:59:44.000000000","message":"Done","commit_id":"2d1e79eae442b739bbedb0fb6bac51b31e850201"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"41b9deacefdbbf70598777f5ba8c13aaf95f764d","unresolved":true,"context_lines":[{"line_number":41,"context_line":"    def test_group(self):"},{"line_number":42,"context_line":"        # create the group"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        group \u003d self.system_admin_cloud.identity.create_group("},{"line_number":45,"context_line":"            name\u003dself.group_name,"},{"line_number":46,"context_line":"        )"},{"line_number":47,"context_line":"        self.assertIsInstance(group, _group.Group)"},{"line_number":48,"context_line":"        self.assertEqual(\u0027\u0027, group.description)"},{"line_number":49,"context_line":"        self.addCleanup(self._delete_group, group)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        # update the group"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"58429298_68d7c6b1","line":49,"range":{"start_line":44,"start_character":0,"end_line":49,"end_character":50},"updated":"2025-09-09 21:20:50.000000000","message":"You should add the cleanup immediately after creation to prevent resource leaks in the event that any of these assertions fail.\n\n\n```suggestion\n        group \u003d self.system_admin_cloud.identity.create_group(\n            name\u003dself.group_name,\n        )\n        self.addCleanup(self._delete_group, group)\n        self.assertIsInstance(group, _group.Group)\n        self.assertEqual(\u0027\u0027, group.description)\n```\n\nIf there is code already in-tree where we are doing this in the wrong way, please feel free to submit a patch to address that.","commit_id":"2d1e79eae442b739bbedb0fb6bac51b31e850201"},{"author":{"_account_id":38254,"name":"Mincheol Kang","display_name":"Mincheol Kang","email":"platanus.kr@gmail.com","username":"mincheolkang"},"change_message_id":"890d6432c3633b714ee26042ba19f4e1cac90447","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    def test_group(self):"},{"line_number":42,"context_line":"        # create the group"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        group \u003d self.system_admin_cloud.identity.create_group("},{"line_number":45,"context_line":"            name\u003dself.group_name,"},{"line_number":46,"context_line":"        )"},{"line_number":47,"context_line":"        self.assertIsInstance(group, _group.Group)"},{"line_number":48,"context_line":"        self.assertEqual(\u0027\u0027, group.description)"},{"line_number":49,"context_line":"        self.addCleanup(self._delete_group, group)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        # update the group"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"c10b2f81_dcf6e25a","line":49,"range":{"start_line":44,"start_character":0,"end_line":49,"end_character":50},"in_reply_to":"58429298_68d7c6b1","updated":"2025-09-10 03:59:44.000000000","message":"Done","commit_id":"2d1e79eae442b739bbedb0fb6bac51b31e850201"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"41b9deacefdbbf70598777f5ba8c13aaf95f764d","unresolved":true,"context_lines":[{"line_number":105,"context_line":"        is_in_group \u003d self.system_admin_cloud.identity.check_user_in_group("},{"line_number":106,"context_line":"            self.user, group"},{"line_number":107,"context_line":"        )"},{"line_number":108,"context_line":"        self.assertFalse(is_in_group)"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        # retrieve groups for user"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        self.system_admin_cloud.identity.add_user_to_group(self.user, group)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        all_groups \u003d list(self.system_admin_cloud.identity.groups())"},{"line_number":115,"context_line":"        member_groups \u003d ["},{"line_number":116,"context_line":"            g"},{"line_number":117,"context_line":"            for g in all_groups"},{"line_number":118,"context_line":"            if self.system_admin_cloud.identity.check_user_in_group("},{"line_number":119,"context_line":"                self.user, g"},{"line_number":120,"context_line":"            )"},{"line_number":121,"context_line":"        ]"},{"line_number":122,"context_line":"        self.assertIn("},{"line_number":123,"context_line":"            self.group_name,"},{"line_number":124,"context_line":"            {x.name for x in member_groups},"},{"line_number":125,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":5,"id":"86f6add1_9cfeb083","line":125,"range":{"start_line":108,"start_character":37,"end_line":125,"end_character":9},"updated":"2025-09-09 21:20:50.000000000","message":"I think you\u0027re already testing this above on lines 80-97, so this shouldn\u0027t be necessary. Can you remove it?","commit_id":"2d1e79eae442b739bbedb0fb6bac51b31e850201"},{"author":{"_account_id":38254,"name":"Mincheol Kang","display_name":"Mincheol Kang","email":"platanus.kr@gmail.com","username":"mincheolkang"},"change_message_id":"890d6432c3633b714ee26042ba19f4e1cac90447","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        is_in_group \u003d self.system_admin_cloud.identity.check_user_in_group("},{"line_number":106,"context_line":"            self.user, group"},{"line_number":107,"context_line":"        )"},{"line_number":108,"context_line":"        self.assertFalse(is_in_group)"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        # retrieve groups for user"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        self.system_admin_cloud.identity.add_user_to_group(self.user, group)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        all_groups \u003d list(self.system_admin_cloud.identity.groups())"},{"line_number":115,"context_line":"        member_groups \u003d ["},{"line_number":116,"context_line":"            g"},{"line_number":117,"context_line":"            for g in all_groups"},{"line_number":118,"context_line":"            if self.system_admin_cloud.identity.check_user_in_group("},{"line_number":119,"context_line":"                self.user, g"},{"line_number":120,"context_line":"            )"},{"line_number":121,"context_line":"        ]"},{"line_number":122,"context_line":"        self.assertIn("},{"line_number":123,"context_line":"            self.group_name,"},{"line_number":124,"context_line":"            {x.name for x in member_groups},"},{"line_number":125,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":5,"id":"6198b22f_faf2b5a6","line":125,"range":{"start_line":108,"start_character":37,"end_line":125,"end_character":9},"in_reply_to":"86f6add1_9cfeb083","updated":"2025-09-10 03:59:44.000000000","message":"Done","commit_id":"2d1e79eae442b739bbedb0fb6bac51b31e850201"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5e774cb9ff7fd221353b461a6492917db6aeab17","unresolved":true,"context_lines":[{"line_number":85,"context_line":"        )"},{"line_number":86,"context_line":"        self.assertTrue(is_in_group)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        group_users \u003d list("},{"line_number":89,"context_line":"            self.operator_cloud.identity.group_users("},{"line_number":90,"context_line":"                group,"},{"line_number":91,"context_line":"            ),"},{"line_number":92,"context_line":"        )"},{"line_number":93,"context_line":"        self.assertIsInstance(group_users[0], _user.User)"},{"line_number":94,"context_line":"        self.assertIn("}],"source_content_type":"text/x-python","patch_set":6,"id":"fbdc0168_dff91bb9","line":91,"range":{"start_line":88,"start_character":27,"end_line":91,"end_character":14},"updated":"2025-09-25 10:22:06.000000000","message":"I initially thought this was wrong because of the trailing comma, since that that makes an implicit tuple. However it seems not:\n\n```\n\u003e\u003e\u003e list({1, 2, 3},)\n[1, 2, 3]\n\u003e\u003e\u003e list({1, 2, 3})\n[1, 2, 3]\n```\n\nTo be safe though, can you remove this?\n\n\n```suggestion\n        group_users \u003d list(\n            self.operator_cloud.identity.group_users(group)\n```","commit_id":"2aa0fc56742c87a7f8ac8d01e9342762832290b2"},{"author":{"_account_id":38254,"name":"Mincheol Kang","display_name":"Mincheol Kang","email":"platanus.kr@gmail.com","username":"mincheolkang"},"change_message_id":"a2e044893ccdd88c7b1a55506ebf3b6bb9c750a2","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        )"},{"line_number":86,"context_line":"        self.assertTrue(is_in_group)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        group_users \u003d list("},{"line_number":89,"context_line":"            self.operator_cloud.identity.group_users("},{"line_number":90,"context_line":"                group,"},{"line_number":91,"context_line":"            ),"},{"line_number":92,"context_line":"        )"},{"line_number":93,"context_line":"        self.assertIsInstance(group_users[0], _user.User)"},{"line_number":94,"context_line":"        self.assertIn("}],"source_content_type":"text/x-python","patch_set":6,"id":"19702d18_2ae1c896","line":91,"range":{"start_line":88,"start_character":27,"end_line":91,"end_character":14},"in_reply_to":"fbdc0168_dff91bb9","updated":"2025-10-15 07:53:50.000000000","message":"Done","commit_id":"2aa0fc56742c87a7f8ac8d01e9342762832290b2"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5e774cb9ff7fd221353b461a6492917db6aeab17","unresolved":true,"context_lines":[{"line_number":91,"context_line":"            ),"},{"line_number":92,"context_line":"        )"},{"line_number":93,"context_line":"        self.assertIsInstance(group_users[0], _user.User)"},{"line_number":94,"context_line":"        self.assertIn("},{"line_number":95,"context_line":"            self.user_name,"},{"line_number":96,"context_line":"            {x.name for x in group_users},"},{"line_number":97,"context_line":"        )"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        # remove user from group"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"8a2b4bc2_4a5e32ad","line":97,"range":{"start_line":94,"start_character":0,"end_line":97,"end_character":9},"updated":"2025-09-25 10:22:06.000000000","message":"nit:\n\n```suggestion\n        self.assertIn(self.user_name, {x.name for x in group_users})\n```","commit_id":"2aa0fc56742c87a7f8ac8d01e9342762832290b2"},{"author":{"_account_id":38254,"name":"Mincheol Kang","display_name":"Mincheol Kang","email":"platanus.kr@gmail.com","username":"mincheolkang"},"change_message_id":"a2e044893ccdd88c7b1a55506ebf3b6bb9c750a2","unresolved":false,"context_lines":[{"line_number":91,"context_line":"            ),"},{"line_number":92,"context_line":"        )"},{"line_number":93,"context_line":"        self.assertIsInstance(group_users[0], _user.User)"},{"line_number":94,"context_line":"        self.assertIn("},{"line_number":95,"context_line":"            self.user_name,"},{"line_number":96,"context_line":"            {x.name for x in group_users},"},{"line_number":97,"context_line":"        )"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        # remove user from group"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"d5f175c7_22e412df","line":97,"range":{"start_line":94,"start_character":0,"end_line":97,"end_character":9},"in_reply_to":"8a2b4bc2_4a5e32ad","updated":"2025-10-15 07:53:50.000000000","message":"Done","commit_id":"2aa0fc56742c87a7f8ac8d01e9342762832290b2"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"13908784dcbb602cea22b2baae4affd382ca7914","unresolved":true,"context_lines":[{"line_number":77,"context_line":"            {x.name for x in groups},"},{"line_number":78,"context_line":"        )"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        # add user to group"},{"line_number":81,"context_line":"        self.operator_cloud.identity.add_user_to_group(self.user, group)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        is_in_group \u003d self.operator_cloud.identity.check_user_in_group("}],"source_content_type":"text/x-python","patch_set":8,"id":"be13ad34_14e7c64b","line":80,"updated":"2025-11-12 12:24:50.000000000","message":"nit\n\n```suggestion\n        # add user to group\n\n```","commit_id":"e864c1fe759c465f8df3143b3c5abe66d8963260"}]}
