)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"6af3d988bdd4bb97d6107199b725ed5622d32f6c","unresolved":true,"context_lines":[{"line_number":9,"context_line":"Replace all self.os_admin.cyborg_client references in API test"},{"line_number":10,"context_line":"files with the appropriate least-privilege alias from BaseAPITest:"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"  ARQ list/get       -\u003e cyborg_arq_read_client   (reader)"},{"line_number":13,"context_line":"  ARQ create/delete  -\u003e cyborg_arq_write_client   (member)"},{"line_number":14,"context_line":"  device/deployable  -\u003e cyborg_hw_read_client      (manager)"},{"line_number":15,"context_line":"  device profile r/o -\u003e cyborg_dp_read_client      (reader)"},{"line_number":16,"context_line":"  device profile w   -\u003e cyborg_dp_write_client     (admin)"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"When enforce_scope.cyborg is False (legacy), all aliases resolve"},{"line_number":19,"context_line":"to admin so existing jobs pass unchanged. When True, each test"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"0ab60cdb_e52bcba3","line":16,"range":{"start_line":12,"start_character":2,"end_line":16,"end_character":58},"updated":"2026-06-30 11:58:40.000000000","message":"Based on https://review.opendev.org/c/openstack/cyborg-tempest-plugin/+/992329/3/cyborg_tempest_plugin/tests/api/base.py\n\n  Persona-based aliases (use these in tests):\n    cyborg_admin_client   -- always admin\n    cyborg_manager_client -- manager (new) / admin (legacy)\n    cyborg_member_client  -- member (new) / admin (legacy)\n    cyborg_reader_client  -- reader (new) / admin (legacy)\n    cyborg_service_client -- service role\n\nBased on the changes in this tests,\nHere is the correct version\n\n\n```suggestion\n  ARQ list/get       -\u003e cyborg_reader_client   (reader)\n  ARQ create/delete  -\u003e cyborg_member_client   (member)\n  device/deployable  -\u003e cyborg_manager_client  (manager)\n  attribute          -\u003e cyborg_manager_client  (manager)\n  device profile r/o -\u003e cyborg_reader_client   (reader)\n  device profile w   -\u003e cyborg_admin_client    (admin)\n```\n\nSince we also added attribute test coverage. We should mention that in the commit message.","commit_id":"2e5cec5490e1f68ff629948fc193acfcf4bfc22d"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"019c9a96283e19dce3d06a96b5a47642f9621453","unresolved":true,"context_lines":[{"line_number":9,"context_line":"Replace all self.os_admin.cyborg_client references in API test"},{"line_number":10,"context_line":"files with the appropriate least-privilege alias from BaseAPITest:"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"  ARQ list/get       -\u003e cyborg_arq_read_client   (reader)"},{"line_number":13,"context_line":"  ARQ create/delete  -\u003e cyborg_arq_write_client   (member)"},{"line_number":14,"context_line":"  device/deployable  -\u003e cyborg_hw_read_client      (manager)"},{"line_number":15,"context_line":"  device profile r/o -\u003e cyborg_dp_read_client      (reader)"},{"line_number":16,"context_line":"  device profile w   -\u003e cyborg_dp_write_client     (admin)"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"When enforce_scope.cyborg is False (legacy), all aliases resolve"},{"line_number":19,"context_line":"to admin so existing jobs pass unchanged. When True, each test"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"d6bfe939_56142b32","line":16,"range":{"start_line":12,"start_character":2,"end_line":16,"end_character":58},"in_reply_to":"0ab60cdb_e52bcba3","updated":"2026-06-30 12:15:10.000000000","message":"oh i didn\u0027t update it after i changed the code to use the persona names","commit_id":"2e5cec5490e1f68ff629948fc193acfcf4bfc22d"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"4aca25bef5755be86b758546d41fedfb763916ac","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Replace all self.os_admin.cyborg_client references in API test"},{"line_number":10,"context_line":"files with the appropriate least-privilege alias from BaseAPITest:"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"  ARQ list/get       -\u003e cyborg_arq_read_client   (reader)"},{"line_number":13,"context_line":"  ARQ create/delete  -\u003e cyborg_arq_write_client   (member)"},{"line_number":14,"context_line":"  device/deployable  -\u003e cyborg_hw_read_client      (manager)"},{"line_number":15,"context_line":"  device profile r/o -\u003e cyborg_dp_read_client      (reader)"},{"line_number":16,"context_line":"  device profile w   -\u003e cyborg_dp_write_client     (admin)"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"When enforce_scope.cyborg is False (legacy), all aliases resolve"},{"line_number":19,"context_line":"to admin so existing jobs pass unchanged. When True, each test"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"d3055856_58e262cc","line":16,"range":{"start_line":12,"start_character":2,"end_line":16,"end_character":58},"in_reply_to":"d6bfe939_56142b32","updated":"2026-07-06 20:53:37.000000000","message":"Done","commit_id":"2e5cec5490e1f68ff629948fc193acfcf4bfc22d"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"6af3d988bdd4bb97d6107199b725ed5622d32f6c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"7b4c63fc_1de74c59","updated":"2026-06-30 11:58:40.000000000","message":"Commit message needs as update with proper alias names.","commit_id":"2e5cec5490e1f68ff629948fc193acfcf4bfc22d"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"07bf9e41f2e7e48283aac81fd0fd6cf5df8cda6b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"b940e58d_d40aa67d","updated":"2026-06-22 08:36:21.000000000","message":"teim-ci: auto","commit_id":"2e5cec5490e1f68ff629948fc193acfcf4bfc22d"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"29c192490fbde16061d59b04c83e15334709b6bb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"ec5d8046_3f1cb03a","updated":"2026-06-22 23:46:41.000000000","message":"teim-ci: auto","commit_id":"2e5cec5490e1f68ff629948fc193acfcf4bfc22d"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"40e3049a7f22cd34d61c6e64c04e1a7b138c3802","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"996c704a_ad48998d","updated":"2026-07-07 04:26:32.000000000","message":"thank you for updating the commit message,","commit_id":"7d0e63ef4aaa8290a98a1669c109184cfae518c9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"aad51dfc732f03ca3ba6dff6826486ca33861995","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"57b94f9e_0b38c0a0","updated":"2026-07-21 13:15:18.000000000","message":"recheck parent","commit_id":"7d8b767a37664a52d60f837a69c5f6ca40dbaef7"}],"cyborg_tempest_plugin/tests/api/test_accelerator_request.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"ecd6eb6755d5481e4124cd61716ee0d82f0aa420","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        super(TestAcceleratorRequestController, cls).skip_checks()"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def _create_dp(self, name):"},{"line_number":37,"context_line":"        \"\"\"Create a device profile and register cleanup.\"\"\""},{"line_number":38,"context_line":"        dp \u003d [{\"name\": name, \"groups\": _FAKE_DP_GROUPS}]"},{"line_number":39,"context_line":"        self.cyborg_admin_client.create_device_profile(dp)"}],"source_content_type":"text/x-python","patch_set":1,"id":"61c50576_9c1bb412","line":36,"updated":"2026-06-08 18:17:17.000000000","message":"pep8: E303 too many blank lines (2)","commit_id":"fe559cdd9881d98d7430f90d4aa72046b8e4ce1c"}],"cyborg_tempest_plugin/tests/api/test_accelerator_request_negative.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"ecd6eb6755d5481e4124cd61716ee0d82f0aa420","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        super(AcceleratorRequestNegativeTest, cls).skip_checks()"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    @decorators.attr(type\u003d[\u0027negative\u0027, \u0027gate\u0027])"},{"line_number":31,"context_line":"    @decorators.idempotent_id(\u0027a1e6dd06-c64f-49cd-ae4d-defde0b5e662\u0027)"},{"line_number":32,"context_line":"    def test_get_non_existent_accelerator_request(self):"},{"line_number":33,"context_line":"        # get the non-existent accelerator request"}],"source_content_type":"text/x-python","patch_set":1,"id":"ef686c59_ec7d6625","line":30,"updated":"2026-06-08 18:17:17.000000000","message":"pep8: E303 too many blank lines (2)","commit_id":"fe559cdd9881d98d7430f90d4aa72046b8e4ce1c"}],"cyborg_tempest_plugin/tests/api/test_deployable_negative.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"ecd6eb6755d5481e4124cd61716ee0d82f0aa420","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        super(DeployableNegativeTest, cls).skip_checks()"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    @decorators.attr(type\u003d[\u0027negative\u0027, \u0027gate\u0027])"},{"line_number":31,"context_line":"    @decorators.idempotent_id(\u00276c79a89c-bbdd-401a-b470-817c1aa8b9cf\u0027)"},{"line_number":32,"context_line":"    def test_get_non_existent_deployable(self):"},{"line_number":33,"context_line":"        # get the non-existent deployable"}],"source_content_type":"text/x-python","patch_set":1,"id":"12b99b52_833eec08","line":30,"updated":"2026-06-08 18:17:17.000000000","message":"pep8: E303 too many blank lines (2)","commit_id":"fe559cdd9881d98d7430f90d4aa72046b8e4ce1c"}],"cyborg_tempest_plugin/tests/api/test_deployables.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"ecd6eb6755d5481e4124cd61716ee0d82f0aa420","unresolved":false,"context_lines":[{"line_number":25,"context_line":"        super(TestDeployables, cls).skip_checks()"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    @decorators.idempotent_id(\u00276bc3d256-2c1e-4a72-a87d-66d7ab5688b5\u0027)"},{"line_number":29,"context_line":"    def test_list_deployables(self):"},{"line_number":30,"context_line":"        response \u003d self.cyborg_manager_client.list_deployables()"},{"line_number":31,"context_line":"        self.assertEqual(\u0027deployables\u0027, list(response.keys())[0])"}],"source_content_type":"text/x-python","patch_set":1,"id":"c6146ee2_7855d314","line":28,"updated":"2026-06-08 18:17:17.000000000","message":"pep8: E303 too many blank lines (2)","commit_id":"fe559cdd9881d98d7430f90d4aa72046b8e4ce1c"}],"cyborg_tempest_plugin/tests/api/test_device.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"ecd6eb6755d5481e4124cd61716ee0d82f0aa420","unresolved":false,"context_lines":[{"line_number":25,"context_line":"        super(TestDevice, cls).skip_checks()"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    @decorators.idempotent_id(\u00276f4bf672-1b8e-4e3e-8562-de64093bad52\u0027)"},{"line_number":29,"context_line":"    def test_list_get_device(self):"},{"line_number":30,"context_line":"        response \u003d self.cyborg_manager_client.list_devices()"},{"line_number":31,"context_line":"        self.assertEqual(\u0027devices\u0027, list(response.keys())[0])"}],"source_content_type":"text/x-python","patch_set":1,"id":"2931bf08_c1e8cf30","line":28,"updated":"2026-06-08 18:17:17.000000000","message":"pep8: E303 too many blank lines (2)","commit_id":"fe559cdd9881d98d7430f90d4aa72046b8e4ce1c"}],"cyborg_tempest_plugin/tests/api/test_device_negative.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"ecd6eb6755d5481e4124cd61716ee0d82f0aa420","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        super(DeviceNegativeTest, cls).skip_checks()"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    @decorators.attr(type\u003d[\u0027negative\u0027, \u0027gate\u0027])"},{"line_number":31,"context_line":"    @decorators.idempotent_id(\u0027d904a4c8-5fe0-4884-814f-2f8a0aecdf01\u0027)"},{"line_number":32,"context_line":"    def test_get_non_existent_device(self):"},{"line_number":33,"context_line":"        # get the non-existent device"}],"source_content_type":"text/x-python","patch_set":1,"id":"65310b96_f57c6b4d","line":30,"updated":"2026-06-08 18:17:17.000000000","message":"pep8: E303 too many blank lines (2)","commit_id":"fe559cdd9881d98d7430f90d4aa72046b8e4ce1c"}],"cyborg_tempest_plugin/tests/api/test_device_profile.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"ecd6eb6755d5481e4124cd61716ee0d82f0aa420","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        super(TestDeviceProfileController, cls).skip_checks()"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    @decorators.idempotent_id(\u002759bee5a9-1af3-42bd-8a51-d7b5ecb2049f\u0027)"},{"line_number":30,"context_line":"    def test_create_device_profile(self):"},{"line_number":31,"context_line":"        dp \u003d cyborg_data.NORMAL_DEVICE_PROFILE_DATA1"},{"line_number":32,"context_line":"        response \u003d self.cyborg_admin_client.create_device_profile(dp)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa0822f6_209e4fbf","line":29,"updated":"2026-06-08 18:17:17.000000000","message":"pep8: E303 too many blank lines (2)","commit_id":"fe559cdd9881d98d7430f90d4aa72046b8e4ce1c"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"dd9f05f77ae8d324010240d822f261d6c13f256d","unresolved":false,"context_lines":[{"line_number":60,"context_line":"                dp_two))"},{"line_number":61,"context_line":"        self.assertEqual(dp_one[0][\u0027name\u0027], dp_one_resp[\u0027name\u0027])"},{"line_number":62,"context_line":"        self.assertEqual(dp_two[0][\u0027name\u0027], dp_two_resp[\u0027name\u0027])"},{"line_number":63,"context_line":"        self.cyborg_admin_client \\"},{"line_number":64,"context_line":"            .delete_multiple_device_profile_by_names("},{"line_number":65,"context_line":"                dp_one[0][\u0027name\u0027], dp_two[0][\u0027name\u0027])"},{"line_number":66,"context_line":"        list_resp \u003d ("}],"source_content_type":"text/x-python","patch_set":4,"id":"adf9010e_6f86c8d8","line":63,"updated":"2026-07-06 21:32:05.000000000","message":"The refactor introduces a backslash line continuation where the method call fits within the 79-character limit without it. The OpenStack comprehensive style guide explicitly says to use parentheses rather than backslashes for line continuation.\n\n**Severity**: SUGGESTION | **Confidence**: 0.9\n\n**Benefit**: Minor maintainability concern. Backslash continuations are fragile (no whitespace allowed after the backslash) and discouraged in the project style guide. This does not affect correctness.\n\n**Recommendation**:\nRemove the backslash and put the method name on the same line as the client object: `self.cyborg_admin_client.delete_multiple_device_profile_by_names(\\n dp_one[0][\u0027name\u0027], dp_two[0][\u0027name\u0027])` which fits within 79 chars at 73 total.","commit_id":"d399cd3fbc152ed64400e091502e4ad3e739a34e"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"5eedab2d77cdd2648d851aa19f0fc321d354dd3e","unresolved":false,"context_lines":[{"line_number":60,"context_line":"                dp_two))"},{"line_number":61,"context_line":"        self.assertEqual(dp_one[0][\u0027name\u0027], dp_one_resp[\u0027name\u0027])"},{"line_number":62,"context_line":"        self.assertEqual(dp_two[0][\u0027name\u0027], dp_two_resp[\u0027name\u0027])"},{"line_number":63,"context_line":"        self.cyborg_admin_client \\"},{"line_number":64,"context_line":"            .delete_multiple_device_profile_by_names("},{"line_number":65,"context_line":"                dp_one[0][\u0027name\u0027], dp_two[0][\u0027name\u0027])"},{"line_number":66,"context_line":"        list_resp \u003d ("}],"source_content_type":"text/x-python","patch_set":5,"id":"3d892090_415d225e","line":63,"updated":"2026-07-06 22:21:54.000000000","message":"The diff introduces a backslash line continuation to break a long method call in test_delete_multiple_device_profile, which goes against the comprehensive guide recommendation to use parentheses for line continuation.\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Backslash continuations are fragile (no whitespace after backslash allowed) and considered an anti-pattern per the style guide. Minor maintainability and readability concern only; no functional impact.\n\n**Recommendation**:\nRewrite without backslash: self.cyborg_admin_client.delete_multiple_device_profile_by_names(\\n dp_one[0][\u0027name\u0027], dp_two[0][\u0027name\u0027])","commit_id":"7d0e63ef4aaa8290a98a1669c109184cfae518c9"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"2335c8290bacf756ea5f5d545af500b7f0d5ebe0","unresolved":false,"context_lines":[{"line_number":60,"context_line":"                dp_two))"},{"line_number":61,"context_line":"        self.assertEqual(dp_one[0][\u0027name\u0027], dp_one_resp[\u0027name\u0027])"},{"line_number":62,"context_line":"        self.assertEqual(dp_two[0][\u0027name\u0027], dp_two_resp[\u0027name\u0027])"},{"line_number":63,"context_line":"        self.cyborg_admin_client \\"},{"line_number":64,"context_line":"            .delete_multiple_device_profile_by_names("},{"line_number":65,"context_line":"                dp_one[0][\u0027name\u0027], dp_two[0][\u0027name\u0027])"},{"line_number":66,"context_line":"        list_resp \u003d ("}],"source_content_type":"text/x-python","patch_set":7,"id":"8eb1527b_001a95d1","line":63,"updated":"2026-07-21 13:23:03.000000000","message":"A backslash line continuation is used where a parenthesised call would fit within the 79-character limit. The comprehensive guide explicitly states to break long lines using parentheses, not backslashes.\n\n**Severity**: SUGGESTION | **Confidence**: 0.9\n\n**Benefit**: Backslash continuations are fragile: trailing whitespace after the backslash causes a syntax error. This is a low-risk maintainability concern that is directly actionable.\n\n**Recommendation**:\nReplace with a single-line call that fits within 79 chars: self.cyborg_admin_client.delete_multiple_device_profile_by_names( dp_one[0][\u0027name\u0027], dp_two[0][\u0027name\u0027])","commit_id":"7d8b767a37664a52d60f837a69c5f6ca40dbaef7"}],"cyborg_tempest_plugin/tests/api/test_device_profile_negative.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"ecd6eb6755d5481e4124cd61716ee0d82f0aa420","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        super(DeviceProfileNegativeTest, cls).skip_checks()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    @decorators.attr(type\u003d[\u0027negative\u0027, \u0027gate\u0027])"},{"line_number":33,"context_line":"    @decorators.idempotent_id(\u00272b4bcea3-af0f-4168-9d79-135aab333c7e\u0027)"},{"line_number":34,"context_line":"    def test_get_non_existent_device_profile(self):"},{"line_number":35,"context_line":"        # get the non-existent device_profile"}],"source_content_type":"text/x-python","patch_set":1,"id":"da27fbbe_5b376a80","line":32,"updated":"2026-06-08 18:17:17.000000000","message":"pep8: E303 too many blank lines (2)","commit_id":"fe559cdd9881d98d7430f90d4aa72046b8e4ce1c"}]}
