)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"a3a31b69b42d99a5058d5db01fffa30acf16d8b7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"6a57a90b_5b34facb","updated":"2024-09-12 10:40:33.000000000","message":"Looks pretty good, but can you add functional tests, docs and a release note for this?","commit_id":"dee35a2d237c4b6e0f9d22dc9ab3d15c18cc14f0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6e526bf115dd567e4a7e2fbeaff299b19dac7197","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"11df70ad_e7bef9c8","updated":"2024-12-18 16:23:23.000000000","message":"Pending CI","commit_id":"ff9c87f47704781529133890bb99499b750472f3"},{"author":{"_account_id":37212,"name":"CHOIDONGHAE","display_name":"bada","email":"choieastsea@gmail.com","username":"bada"},"change_message_id":"2e7d39b5bbfd509049322dce35fe2dfbfa29dc4b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"926ad43e_25bf2e5a","updated":"2025-08-10 12:04:03.000000000","message":"Ready for review.\n\nChanges since initial review:\n- Added functional tests using create_temporary_project for quota operations\n- Implemented cross-project header support (x-auth-sudo-project-id) to resolve permission issues when managing quotas across different projects and modified `fetch` method in resource\n- Cleaned up and fixed issues in relational chain code\n\nPlease feel free to review and provide feedback. Thanks!","commit_id":"ac1b9859befa529305ea655cb95ff36bfeacfa4e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cee9719bcdfb025eae12904f2757268068410201","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":23,"id":"c2d4b89d_ee0bafa4","updated":"2025-08-19 17:09:44.000000000","message":"Failures are unrelated and will be fixed by https://review.opendev.org/c/openstack/ironic/+/957960","commit_id":"0d99cc6eb22a2f9bf3b967cac9788ac859e465f2"},{"author":{"_account_id":35119,"name":"jihyun huh","email":"huhji.elha@gmail.com","username":"jhhuh"},"change_message_id":"cfecee5a359e64b026e9bc29fa6e768291ae229a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":23,"id":"11fdb80f_36737a1e","updated":"2025-08-23 04:39:42.000000000","message":"recheck","commit_id":"0d99cc6eb22a2f9bf3b967cac9788ac859e465f2"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3ebb2b6eb19665e41190a06eff80e34e2ce1b342","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":23,"id":"6e84a879_8689fc70","updated":"2025-09-09 21:04:39.000000000","message":"recheck","commit_id":"0d99cc6eb22a2f9bf3b967cac9788ac859e465f2"},{"author":{"_account_id":31664,"name":"Omer Schwartz","email":"oschwart@redhat.com","username":"oschwart"},"change_message_id":"6d24143b9ddeafa6abec07b211637deef7dee135","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":23,"id":"f7eb51f6_2762127d","updated":"2025-09-08 12:49:08.000000000","message":"recheck https://review.opendev.org/c/openstack/ironic/+/957960 is merged","commit_id":"0d99cc6eb22a2f9bf3b967cac9788ac859e465f2"},{"author":{"_account_id":35119,"name":"jihyun huh","email":"huhji.elha@gmail.com","username":"jhhuh"},"change_message_id":"8fc53eacb6184fc4e34502f4ccb26776028a6823","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":23,"id":"a6ea76bf_11e4876a","updated":"2025-08-23 04:38:23.000000000","message":"retest","commit_id":"0d99cc6eb22a2f9bf3b967cac9788ac859e465f2"}],"doc/source/user/resources/dns/index.rst":[{"author":{"_account_id":31664,"name":"Omer Schwartz","email":"oschwart@redhat.com","username":"oschwart"},"change_message_id":"eaff92e5e94178b20c17f2f94a4d5c76b6385560","unresolved":true,"context_lines":[{"line_number":14,"context_line":"   v2/recordset"},{"line_number":15,"context_line":"   v2/limit"},{"line_number":16,"context_line":"   v2/service_status"},{"line_number":17,"context_line":"   v2/pool"},{"line_number":18,"context_line":"   v2/quota"}],"source_content_type":"text/x-rst","patch_set":13,"id":"501e277f_b8cb6500","line":17,"updated":"2025-04-04 14:04:43.000000000","message":"nit: we can probably remove this line","commit_id":"fc2f0789e5dbfaddfa9b9b80dfd0fd4f9129f182"},{"author":{"_account_id":37212,"name":"CHOIDONGHAE","display_name":"bada","email":"choieastsea@gmail.com","username":"bada"},"change_message_id":"77b5c31bc298618fbc96ed068699cc6e86223d0c","unresolved":false,"context_lines":[{"line_number":14,"context_line":"   v2/recordset"},{"line_number":15,"context_line":"   v2/limit"},{"line_number":16,"context_line":"   v2/service_status"},{"line_number":17,"context_line":"   v2/pool"},{"line_number":18,"context_line":"   v2/quota"}],"source_content_type":"text/x-rst","patch_set":13,"id":"2e34a08b_308d442c","line":17,"in_reply_to":"501e277f_b8cb6500","updated":"2025-04-21 12:41:36.000000000","message":"Done","commit_id":"fc2f0789e5dbfaddfa9b9b80dfd0fd4f9129f182"}],"openstack/tests/functional/dns/v2/test_quota.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d9795aa6c79b546680dbbea622da34cd6ffa5ad9","unresolved":true,"context_lines":[{"line_number":16,"context_line":"    def setUp(self):"},{"line_number":17,"context_line":"        super().setUp()"},{"line_number":18,"context_line":"        self.require_service(\u0027dns\u0027)"},{"line_number":19,"context_line":"        self.PROJECT_ID \u003d self.conn.session.get_project_id()"},{"line_number":20,"context_line":"        # Reset project\u0027s quota to default"},{"line_number":21,"context_line":"        self.conn.dns.delete_quota(self.PROJECT_ID)"},{"line_number":22,"context_line":"        self.DEFAULT_QUOTA \u003d self.conn.dns.get_quota(self.PROJECT_ID)"}],"source_content_type":"text/x-python","patch_set":4,"id":"0928f9a7_396a99ae","line":19,"updated":"2024-09-16 14:35:59.000000000","message":"I would be *very* wary of using the current project to do this: since this project is used across multiple tests, you can end up introducing non-deterministic race conditions. Instead, you should create a new project. I\u0027ve proposed a new patch [here](TODO) which you could base this patch on, if it\u0027s helpful?","commit_id":"874d747974f1d26b4e043a6a29ea7ade4def11b2"},{"author":{"_account_id":37212,"name":"CHOIDONGHAE","display_name":"bada","email":"choieastsea@gmail.com","username":"bada"},"change_message_id":"f6b7c60153271b0ad1b7eadcc370a7958573e852","unresolved":true,"context_lines":[{"line_number":16,"context_line":"    def setUp(self):"},{"line_number":17,"context_line":"        super().setUp()"},{"line_number":18,"context_line":"        self.require_service(\u0027dns\u0027)"},{"line_number":19,"context_line":"        self.PROJECT_ID \u003d self.conn.session.get_project_id()"},{"line_number":20,"context_line":"        # Reset project\u0027s quota to default"},{"line_number":21,"context_line":"        self.conn.dns.delete_quota(self.PROJECT_ID)"},{"line_number":22,"context_line":"        self.DEFAULT_QUOTA \u003d self.conn.dns.get_quota(self.PROJECT_ID)"}],"source_content_type":"text/x-python","patch_set":4,"id":"f934efe8_8137d03f","line":19,"in_reply_to":"0928f9a7_396a99ae","updated":"2024-09-17 03:44:19.000000000","message":"Thanks for ur feedback. I didn\u0027t expect that, so I\u0027ll update it.\n\nBut could you edit a link for patch that I can refer?","commit_id":"874d747974f1d26b4e043a6a29ea7ade4def11b2"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"b38e545ece7e26323b862c1c562d0a7a113c8a82","unresolved":false,"context_lines":[{"line_number":16,"context_line":"    def setUp(self):"},{"line_number":17,"context_line":"        super().setUp()"},{"line_number":18,"context_line":"        self.require_service(\u0027dns\u0027)"},{"line_number":19,"context_line":"        self.PROJECT_ID \u003d self.conn.session.get_project_id()"},{"line_number":20,"context_line":"        # Reset project\u0027s quota to default"},{"line_number":21,"context_line":"        self.conn.dns.delete_quota(self.PROJECT_ID)"},{"line_number":22,"context_line":"        self.DEFAULT_QUOTA \u003d self.conn.dns.get_quota(self.PROJECT_ID)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5c33dda7_32f84dd0","line":19,"in_reply_to":"f934efe8_8137d03f","updated":"2024-12-18 16:23:00.000000000","message":"Done","commit_id":"874d747974f1d26b4e043a6a29ea7ade4def11b2"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d9795aa6c79b546680dbbea622da34cd6ffa5ad9","unresolved":true,"context_lines":[{"line_number":21,"context_line":"        self.conn.dns.delete_quota(self.PROJECT_ID)"},{"line_number":22,"context_line":"        self.DEFAULT_QUOTA \u003d self.conn.dns.get_quota(self.PROJECT_ID)"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    def test_list(self):"},{"line_number":25,"context_line":"        test_quotas \u003d list(self.conn.dns.quotas())"},{"line_number":26,"context_line":"        self.assertEqual(1, len(test_quotas))"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def test_get(self):"},{"line_number":29,"context_line":"        expected_keys \u003d ["},{"line_number":30,"context_line":"            \"id\","},{"line_number":31,"context_line":"            \"api_export_size\","},{"line_number":32,"context_line":"            \"recordset_records\","},{"line_number":33,"context_line":"            \"zone_records\","},{"line_number":34,"context_line":"            \"zone_recordsets\","},{"line_number":35,"context_line":"            \"zones\","},{"line_number":36,"context_line":"        ]"},{"line_number":37,"context_line":"        test_quota \u003d self.conn.dns.get_quota(self.PROJECT_ID)"},{"line_number":38,"context_line":"        for actual_key in test_quota._body.attributes.keys():"},{"line_number":39,"context_line":"            self.assertIn(actual_key, expected_keys)"},{"line_number":40,"context_line":"        self.assertEqual(self.PROJECT_ID, test_quota.id)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def test_update(self):"},{"line_number":43,"context_line":"        attrs \u003d {"},{"line_number":44,"context_line":"            \"api_export_size\": 1,"},{"line_number":45,"context_line":"            \"recordset_records\": 2,"},{"line_number":46,"context_line":"            \"zone_records\": 3,"},{"line_number":47,"context_line":"            \"zone_recordsets\": 4,"},{"line_number":48,"context_line":"            \"zones\": 5,"},{"line_number":49,"context_line":"        }"},{"line_number":50,"context_line":"        new_quota \u003d self.conn.dns.update_quota(self.PROJECT_ID, **attrs)"},{"line_number":51,"context_line":"        self.assertEqual(attrs[\"api_export_size\"], new_quota.api_export_size)"},{"line_number":52,"context_line":"        self.assertEqual("},{"line_number":53,"context_line":"            attrs[\"recordset_records\"], new_quota.recordset_records"},{"line_number":54,"context_line":"        )"},{"line_number":55,"context_line":"        self.assertEqual(attrs[\"zone_records\"], new_quota.zone_records)"},{"line_number":56,"context_line":"        self.assertEqual(attrs[\"zone_recordsets\"], new_quota.zone_recordsets)"},{"line_number":57,"context_line":"        self.assertEqual(attrs[\"zones\"], new_quota.zones)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def test_delete(self):"},{"line_number":60,"context_line":"        self.conn.dns.delete_quota(self.PROJECT_ID)"},{"line_number":61,"context_line":"        quota_after_reset \u003d self.conn.dns.get_quota(self.PROJECT_ID)"},{"line_number":62,"context_line":"        self.assertEqual(self.DEFAULT_QUOTA, quota_after_reset)"}],"source_content_type":"text/x-python","patch_set":4,"id":"6c19feeb_9f90a1f1","line":62,"range":{"start_line":24,"start_character":0,"end_line":62,"end_character":63},"updated":"2024-09-16 14:35:59.000000000","message":"Rather than having separate tests, could you combine these into a single test called e.g. `test_quota`? While what you\u0027re doing would be correct for unit tests, functional tests are much slower and having separate tests like this can be much slower than doing them in one single test. For an example (albeit, one for a different service), look `openstack/tests/functional/identity/v3/test_domain_config.py`.","commit_id":"874d747974f1d26b4e043a6a29ea7ade4def11b2"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"b38e545ece7e26323b862c1c562d0a7a113c8a82","unresolved":false,"context_lines":[{"line_number":21,"context_line":"        self.conn.dns.delete_quota(self.PROJECT_ID)"},{"line_number":22,"context_line":"        self.DEFAULT_QUOTA \u003d self.conn.dns.get_quota(self.PROJECT_ID)"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    def test_list(self):"},{"line_number":25,"context_line":"        test_quotas \u003d list(self.conn.dns.quotas())"},{"line_number":26,"context_line":"        self.assertEqual(1, len(test_quotas))"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def test_get(self):"},{"line_number":29,"context_line":"        expected_keys \u003d ["},{"line_number":30,"context_line":"            \"id\","},{"line_number":31,"context_line":"            \"api_export_size\","},{"line_number":32,"context_line":"            \"recordset_records\","},{"line_number":33,"context_line":"            \"zone_records\","},{"line_number":34,"context_line":"            \"zone_recordsets\","},{"line_number":35,"context_line":"            \"zones\","},{"line_number":36,"context_line":"        ]"},{"line_number":37,"context_line":"        test_quota \u003d self.conn.dns.get_quota(self.PROJECT_ID)"},{"line_number":38,"context_line":"        for actual_key in test_quota._body.attributes.keys():"},{"line_number":39,"context_line":"            self.assertIn(actual_key, expected_keys)"},{"line_number":40,"context_line":"        self.assertEqual(self.PROJECT_ID, test_quota.id)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def test_update(self):"},{"line_number":43,"context_line":"        attrs \u003d {"},{"line_number":44,"context_line":"            \"api_export_size\": 1,"},{"line_number":45,"context_line":"            \"recordset_records\": 2,"},{"line_number":46,"context_line":"            \"zone_records\": 3,"},{"line_number":47,"context_line":"            \"zone_recordsets\": 4,"},{"line_number":48,"context_line":"            \"zones\": 5,"},{"line_number":49,"context_line":"        }"},{"line_number":50,"context_line":"        new_quota \u003d self.conn.dns.update_quota(self.PROJECT_ID, **attrs)"},{"line_number":51,"context_line":"        self.assertEqual(attrs[\"api_export_size\"], new_quota.api_export_size)"},{"line_number":52,"context_line":"        self.assertEqual("},{"line_number":53,"context_line":"            attrs[\"recordset_records\"], new_quota.recordset_records"},{"line_number":54,"context_line":"        )"},{"line_number":55,"context_line":"        self.assertEqual(attrs[\"zone_records\"], new_quota.zone_records)"},{"line_number":56,"context_line":"        self.assertEqual(attrs[\"zone_recordsets\"], new_quota.zone_recordsets)"},{"line_number":57,"context_line":"        self.assertEqual(attrs[\"zones\"], new_quota.zones)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def test_delete(self):"},{"line_number":60,"context_line":"        self.conn.dns.delete_quota(self.PROJECT_ID)"},{"line_number":61,"context_line":"        quota_after_reset \u003d self.conn.dns.get_quota(self.PROJECT_ID)"},{"line_number":62,"context_line":"        self.assertEqual(self.DEFAULT_QUOTA, quota_after_reset)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ae735bf4_87a52eb5","line":62,"range":{"start_line":24,"start_character":0,"end_line":62,"end_character":63},"in_reply_to":"6c19feeb_9f90a1f1","updated":"2024-12-18 16:23:00.000000000","message":"Done","commit_id":"874d747974f1d26b4e043a6a29ea7ade4def11b2"}]}
