)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"2f7d2b6821cb710b65c9e71b38cf388e742c2b5c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"9eb64141_5a3707d0","updated":"2025-05-05 11:01:15.000000000","message":"thanks","commit_id":"6e94491c2c7bf69f9eff3b17e80f596564c5bc65"}],"neutron_taas/tests/unit/policies/test_tap_flow.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"3735259bd45a9fbcf5f939df198ad8fd6542b775","unresolved":true,"context_lines":[{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def setUp(self):"},{"line_number":93,"context_line":"        super().setUp()"},{"line_number":94,"context_line":"        self.context \u003d self.system_member_ctx"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"class AdminTest(TapFlowGroupAPITestCase):"}],"source_content_type":"text/x-python","patch_set":5,"id":"976492f8_addf1658","line":94,"updated":"2025-05-01 14:50:02.000000000","message":"Is this supposed to be self.system_reader_ctx like test_tap_mirror.py ?","commit_id":"0e6f078e258520f1761978153e017eb78f8bf0fd"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"f09dac7475c07df6732e4c7643725bfdab3381e0","unresolved":true,"context_lines":[{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def setUp(self):"},{"line_number":93,"context_line":"        super().setUp()"},{"line_number":94,"context_line":"        self.context \u003d self.system_member_ctx"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"class AdminTest(TapFlowGroupAPITestCase):"}],"source_content_type":"text/x-python","patch_set":5,"id":"e60a33f9_529369ef","line":94,"in_reply_to":"976492f8_addf1658","updated":"2025-05-02 18:53:20.000000000","message":"yes, good catch! thanks","commit_id":"0e6f078e258520f1761978153e017eb78f8bf0fd"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"f4ba248e30590e2271c0e8a98cd1a59ae4737704","unresolved":false,"context_lines":[{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def setUp(self):"},{"line_number":93,"context_line":"        super().setUp()"},{"line_number":94,"context_line":"        self.context \u003d self.system_member_ctx"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"class AdminTest(TapFlowGroupAPITestCase):"}],"source_content_type":"text/x-python","patch_set":5,"id":"6b70abc1_21581e17","line":94,"in_reply_to":"e60a33f9_529369ef","updated":"2025-05-02 19:28:51.000000000","message":"Done","commit_id":"0e6f078e258520f1761978153e017eb78f8bf0fd"}],"neutron_taas/tests/unit/policies/test_tap_mirror.py":[{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"566167cce1041f60b38355a50753d0b5c815af62","unresolved":true,"context_lines":[{"line_number":210,"context_line":"            self.alt_target)"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    def test_get_tap_mirror(self):"},{"line_number":213,"context_line":"        self.assertTrue("},{"line_number":214,"context_line":"            neutron_policy.enforce(self.context, \u0027get_tap_mirror\u0027,"},{"line_number":215,"context_line":"            self.target))"},{"line_number":216,"context_line":"        self.assertRaises("},{"line_number":217,"context_line":"            policy.PolicyNotAuthorized,"},{"line_number":218,"context_line":"            neutron_policy.enforce, self.context, \u0027get_tap_mirror\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"e3fc8d15_f136921e","line":215,"range":{"start_line":213,"start_character":0,"end_line":215,"end_character":25},"updated":"2025-05-01 13:55:53.000000000","message":"I want to highlight this test case. Notice that tap mirror is the only tap API which allows `reader` role to perform `get` operations. [1]\nWhile the `tap flow` and `tap service` do not, because they only allow `ADMIN_OR_PROJECT_MEMBER` (see tap_flow.py and tap_service.py in this patch)\n\nI think that this behavior makes sense, and maybe the `tap flow` and `tap service` should be updated to allow the reader role. A reader user should be able to `list` but not `create` or `update`\n\n[1] https://opendev.org/openstack/tap-as-a-service/src/commit/6ef9395531010fb27f364eca52474dd890db84af/neutron_taas/policies/tap_mirror.py#L48","commit_id":"eb8873dff19aed56eb96c9989b15ce1efc563a4d"}]}
