)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"d4de15a64ac4b34bf7382586fa42912dbb59fa32","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change changes the test cases that require multi-policy and"},{"line_number":10,"context_line":"multiple error code handling."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I40df70f7cd7c7f30822010323c5dd02697d50d2b"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"5f7c97a3_eb4f3167","line":11,"updated":"2018-06-26 15:29:39.000000000","message":"We should also add:\n\nPartially Implements: story 2002620 \n\nhere to track this in storyboard, though not 100% sure how \"Partially Implements\" works with storyboard yet.","commit_id":"f2dbf88d70370b7e656489b8c6b25bfa57ea861a"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"2b5364e56754e59679afdb367dc59f365886cf81","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change changes the test cases that require multi-policy and"},{"line_number":10,"context_line":"multiple error code handling."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I40df70f7cd7c7f30822010323c5dd02697d50d2b"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"5f7c97a3_eb9df1ba","line":11,"in_reply_to":"5f7c97a3_eb4f3167","updated":"2018-06-26 15:30:58.000000000","message":"I think\n\nPartially Implements: bp rbac-testing-multiple-policies\nStory: 2002620\n\nShould do it.","commit_id":"f2dbf88d70370b7e656489b8c6b25bfa57ea861a"}],"patrole_tempest_plugin/tests/api/network/test_floating_ips_rbac.py":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"f5a502ce957fa2147b6e8aef148bcafc705d920e","unresolved":false,"context_lines":[{"line_number":119,"context_line":"            self.floating_ips_client.show_floatingip(floating_ip[\u0027id\u0027])"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":122,"context_line":"                                 rules\u003d[\"get_floatingip\", \"update_floatingip\"],"},{"line_number":123,"context_line":"                                 expected_error_codes\u003d[404, 403])"},{"line_number":124,"context_line":"    @decorators.idempotent_id(\u00272611b068-30d4-4241-a78f-1b801a14db7e\u0027)"},{"line_number":125,"context_line":"    def test_delete_floating_ip(self):"}],"source_content_type":"text/x-python","patch_set":17,"id":"5f7c97a3_0bde5f69","line":122,"range":{"start_line":122,"start_character":59,"end_line":122,"end_character":76},"updated":"2018-06-23 15:30:48.000000000","message":"Why this change? Any policy name changes like this need to be explained, particularly this one which is quite unintuitive and if this is the case this is most certainly a bug in Neutron.\n\nTests should not be modified to pass when bugs exist in code -- that defeats the purpose of having the test in the first place.\n\nIf this is indeed a Neutron bug, then the correct approach is the following:\n\n* file bug in Neutron\n* add decorators.skip_because(reason, bug #)","commit_id":"a177c1b4e021a98daa59469b9e9a4fd87ed241e7"},{"author":{"_account_id":22636,"name":"Cliff Parsons","email":"cliffhparsons@aol.com","username":"cliffparsons"},"change_message_id":"dd1c904f8d6a907c6dd4cb494901fa76a47c38f5","unresolved":false,"context_lines":[{"line_number":119,"context_line":"            self.floating_ips_client.show_floatingip(floating_ip[\u0027id\u0027])"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":122,"context_line":"                                 rules\u003d[\"get_floatingip\", \"update_floatingip\"],"},{"line_number":123,"context_line":"                                 expected_error_codes\u003d[404, 403])"},{"line_number":124,"context_line":"    @decorators.idempotent_id(\u00272611b068-30d4-4241-a78f-1b801a14db7e\u0027)"},{"line_number":125,"context_line":"    def test_delete_floating_ip(self):"}],"source_content_type":"text/x-python","patch_set":17,"id":"5f7c97a3_36ddb113","line":122,"range":{"start_line":122,"start_character":59,"end_line":122,"end_character":76},"in_reply_to":"5f7c97a3_0bde5f69","updated":"2018-06-25 14:45:46.000000000","message":"No, there is no change in policy.  This was a mistake on my part.  I must have changed this while debugging or something, or perhaps a careless typo or cut/paste error.  The two rules should be \"get_floatingip\" and \"delete_floatingip\". I\u0027ll correct it in my next PS.","commit_id":"a177c1b4e021a98daa59469b9e9a4fd87ed241e7"}],"patrole_tempest_plugin/tests/api/network/test_network_segments_rbac.py":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"a5e65d1aeebabfc340d3ebb237302c742c97d934","unresolved":false,"context_lines":[{"line_number":97,"context_line":"                                 rules\u003d[\"get_network\","},{"line_number":98,"context_line":"                                        \"get_network:router:external\","},{"line_number":99,"context_line":"                                        \"get_network:segments\"],"},{"line_number":100,"context_line":"                                 expected_error_codes\u003d[404, 403, 403])"},{"line_number":101,"context_line":"    @decorators.idempotent_id(\u0027094ff9b7-0c3b-4515-b19b-b9d2031337bd\u0027)"},{"line_number":102,"context_line":"    def test_show_network_segments(self):"},{"line_number":103,"context_line":"        \"\"\"Show network segments."}],"source_content_type":"text/x-python","patch_set":13,"id":"5f7c97a3_ecf04b94","line":100,"updated":"2018-06-18 21:29:10.000000000","message":"See comments here: https://review.openstack.org/#/c/575786/13/patrole_tempest_plugin/tests/api/network/test_ports_rbac.py","commit_id":"2f0b86257c08b4c840329fa72056cf346dd7a190"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"a5e65d1aeebabfc340d3ebb237302c742c97d934","unresolved":false,"context_lines":[{"line_number":118,"context_line":"            LOG.info(\"NotFound or Forbidden exception are not thrown when \""},{"line_number":119,"context_line":"                     \"role doesn\u0027t have access to the endpoint. Instead, \""},{"line_number":120,"context_line":"                     \"the response will have an empty network body.\")"},{"line_number":121,"context_line":"            raise rbac_exceptions.RbacMalformedResponse(True)"}],"source_content_type":"text/x-python","patch_set":13,"id":"5f7c97a3_ecd7ebed","line":121,"range":{"start_line":121,"start_character":56,"end_line":121,"end_character":60},"updated":"2018-06-18 21:29:10.000000000","message":"empty\u003dTrue","commit_id":"2f0b86257c08b4c840329fa72056cf346dd7a190"}],"patrole_tempest_plugin/tests/api/network/test_networks_rbac.py":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"a5e65d1aeebabfc340d3ebb237302c742c97d934","unresolved":false,"context_lines":[{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":198,"context_line":"                                 rule\u003d\"get_network\","},{"line_number":199,"context_line":"                                 expected_error_code\u003d404)"},{"line_number":200,"context_line":"    @decorators.idempotent_id(\u00270eb62d04-338a-4ff4-a8fa-534e52110534\u0027)"},{"line_number":201,"context_line":"    def test_show_network(self):"},{"line_number":202,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"5f7c97a3_ac3493ad","line":199,"range":{"start_line":199,"start_character":33,"end_line":199,"end_character":52},"updated":"2018-06-18 21:29:10.000000000","message":"nit: We should use the non-deprecated parameter instead. But we can fix later when we remove the param outright.","commit_id":"2f0b86257c08b4c840329fa72056cf346dd7a190"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"a5e65d1aeebabfc340d3ebb237302c742c97d934","unresolved":false,"context_lines":[{"line_number":211,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":212,"context_line":"                                 rules\u003d[\"get_network\","},{"line_number":213,"context_line":"                                        \"get_network:router:external\"],"},{"line_number":214,"context_line":"                                 expected_error_codes\u003d[404, 403])"},{"line_number":215,"context_line":"    @decorators.idempotent_id(\u0027529e4814-22e9-413f-af48-8fefcd637344\u0027)"},{"line_number":216,"context_line":"    def test_show_network_router_external(self):"},{"line_number":217,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"5f7c97a3_cc2b0fe8","line":214,"updated":"2018-06-18 21:29:10.000000000","message":"See comments here: https://review.openstack.org/#/c/575786/13/patrole_tempest_plugin/tests/api/network/test_ports_rbac.py","commit_id":"2f0b86257c08b4c840329fa72056cf346dd7a190"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"1b6a8961d75256a0fd7ed1f0dd8d88f9a2517eeb","unresolved":false,"context_lines":[{"line_number":211,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":212,"context_line":"                                 rules\u003d[\"get_network\","},{"line_number":213,"context_line":"                                        \"get_network:router:external\"],"},{"line_number":214,"context_line":"                                 expected_error_codes\u003d[404, 403])"},{"line_number":215,"context_line":"    @decorators.idempotent_id(\u0027529e4814-22e9-413f-af48-8fefcd637344\u0027)"},{"line_number":216,"context_line":"    def test_show_network_router_external(self):"},{"line_number":217,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"5f7c97a3_43a8178b","line":214,"in_reply_to":"5f7c97a3_0a3c742e","updated":"2018-06-19 16:01:59.000000000","message":"Well as I point out below this test is broken.\n\nConsider `test_show_network_provider_network_type` below. It has proper test behavior by using RbacMalformedResponse and yet also incorrectly states that a 403 is expected for \"get_network:provider:network_type\". I don\u0027t think we should remove \"get_network:provider:network_type\" from the list of rules as that is indeed enforced via oslo.policy (they just pass in do_raise\u003dFalse to the enforce() method in oslo.policy).","commit_id":"2f0b86257c08b4c840329fa72056cf346dd7a190"},{"author":{"_account_id":22636,"name":"Cliff Parsons","email":"cliffhparsons@aol.com","username":"cliffparsons"},"change_message_id":"d0a06502f99857ae33595e065c18f807e176e233","unresolved":false,"context_lines":[{"line_number":211,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":212,"context_line":"                                 rules\u003d[\"get_network\","},{"line_number":213,"context_line":"                                        \"get_network:router:external\"],"},{"line_number":214,"context_line":"                                 expected_error_codes\u003d[404, 403])"},{"line_number":215,"context_line":"    @decorators.idempotent_id(\u0027529e4814-22e9-413f-af48-8fefcd637344\u0027)"},{"line_number":216,"context_line":"    def test_show_network_router_external(self):"},{"line_number":217,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"5f7c97a3_0a3c742e","line":214,"in_reply_to":"5f7c97a3_cc2b0fe8","updated":"2018-06-19 14:31:11.000000000","message":"Agree for these cases...a 403 is not being returned if get_network:router:\u003cattr\u003e fails the check.  Maybe it should be handled like test_show_port_binding_vif_type, by throwing RbacMalformedException if the attribute is not present in the output, which gets translated to 403.  Or we can leave off the \"get_network:router:external\" from the rules list and the 403 from the expected_error_codes list.","commit_id":"2f0b86257c08b4c840329fa72056cf346dd7a190"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"a5e65d1aeebabfc340d3ebb237302c742c97d934","unresolved":false,"context_lines":[{"line_number":222,"context_line":"        kwargs \u003d {\u0027fields\u0027: \u0027router:external\u0027}"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"        with self.rbac_utils.override_role(self):"},{"line_number":225,"context_line":"            self.networks_client.show_network(self.network[\u0027id\u0027],"},{"line_number":226,"context_line":"                                              **kwargs)"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    @utils.requires_ext(extension\u003d\u0027provider\u0027, service\u003d\u0027network\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"5f7c97a3_ac60130f","line":225,"updated":"2018-06-18 21:29:10.000000000","message":"This test is broken currently. It\u0027s actually missing this (I suspect, after trying it out and seeing it break in my devstack):\n\n        kwargs \u003d {\u0027fields\u0027: \u0027router:external\u0027}\n\n        with self.rbac_utils.override_role(self):\n            retrieved_network \u003d self.networks_client.show_network(\n                self.network[\u0027id\u0027], **kwargs)[\u0027network\u0027]\n\n        if not retrieved_network:\n            raise rbac_exceptions.RbacMalformedResponse(empty\u003dTrue)\n\nWe can either fix in this PS or somewhere else as this was already broken.","commit_id":"2f0b86257c08b4c840329fa72056cf346dd7a190"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"a5e65d1aeebabfc340d3ebb237302c742c97d934","unresolved":false,"context_lines":[{"line_number":229,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":230,"context_line":"                                 rules\u003d[\"get_network\","},{"line_number":231,"context_line":"                                        \"get_network:provider:network_type\"],"},{"line_number":232,"context_line":"                                 expected_error_codes\u003d[404, 403])"},{"line_number":233,"context_line":"    @decorators.idempotent_id(\u00276521dd60-0950-458b-8491-09d3c84ac0f4\u0027)"},{"line_number":234,"context_line":"    def test_show_network_provider_network_type(self):"},{"line_number":235,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"5f7c97a3_cc146fa2","line":232,"updated":"2018-06-18 21:29:10.000000000","message":"Ditto","commit_id":"2f0b86257c08b4c840329fa72056cf346dd7a190"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"a5e65d1aeebabfc340d3ebb237302c742c97d934","unresolved":false,"context_lines":[{"line_number":244,"context_line":"                self.network[\u0027id\u0027], **kwargs)[\u0027network\u0027]"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"        if len(retrieved_network) \u003d\u003d 0:"},{"line_number":247,"context_line":"            raise rbac_exceptions.RbacMalformedResponse(True)"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"    @utils.requires_ext(extension\u003d\u0027provider\u0027, service\u003d\u0027network\u0027)"},{"line_number":250,"context_line":"    @rbac_rule_validation.action("}],"source_content_type":"text/x-python","patch_set":13,"id":"5f7c97a3_4c6ffff9","line":247,"range":{"start_line":247,"start_character":56,"end_line":247,"end_character":60},"updated":"2018-06-18 21:29:10.000000000","message":"empty\u003dTrue","commit_id":"2f0b86257c08b4c840329fa72056cf346dd7a190"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"a5e65d1aeebabfc340d3ebb237302c742c97d934","unresolved":false,"context_lines":[{"line_number":251,"context_line":"        service\u003d\"neutron\","},{"line_number":252,"context_line":"        rules\u003d[\"get_network\","},{"line_number":253,"context_line":"               \"get_network:provider:physical_network\"],"},{"line_number":254,"context_line":"        expected_error_codes\u003d[404, 403])"},{"line_number":255,"context_line":"    @decorators.idempotent_id(\u0027c049f11a-240c-4a85-ad43-a4d3fd0a5e39\u0027)"},{"line_number":256,"context_line":"    def test_show_network_provider_physical_network(self):"},{"line_number":257,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"5f7c97a3_8c0e778a","line":254,"updated":"2018-06-18 21:29:10.000000000","message":"Ditto","commit_id":"2f0b86257c08b4c840329fa72056cf346dd7a190"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"a5e65d1aeebabfc340d3ebb237302c742c97d934","unresolved":false,"context_lines":[{"line_number":273,"context_line":"        service\u003d\"neutron\","},{"line_number":274,"context_line":"        rules\u003d[\"get_network\","},{"line_number":275,"context_line":"               \"get_network:provider:segmentation_id\"],"},{"line_number":276,"context_line":"        expected_error_codes\u003d[404, 403])"},{"line_number":277,"context_line":"    @decorators.idempotent_id(\u002738d9f085-6365-4f81-bac9-c53c294d727e\u0027)"},{"line_number":278,"context_line":"    def test_show_network_provider_segmentation_id(self):"},{"line_number":279,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"5f7c97a3_2c25e30a","line":276,"updated":"2018-06-18 21:29:10.000000000","message":"Ditto","commit_id":"2f0b86257c08b4c840329fa72056cf346dd7a190"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"f5a502ce957fa2147b6e8aef148bcafc705d920e","unresolved":false,"context_lines":[{"line_number":308,"context_line":"        if len(retrieved_network) \u003d\u003d 0:"},{"line_number":309,"context_line":"            raise rbac_exceptions.RbacMalformedResponse(empty\u003dTrue)"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"        key \u003d retrieved_network.get(\u0027provider:segmentation_id\u0027, \"NotFound\")"},{"line_number":312,"context_line":"        self.assertNotEqual(key, \"NotFound\")"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":315,"context_line":"                                 rules\u003d[\"get_network\", \"delete_network\"],"}],"source_content_type":"text/x-python","patch_set":17,"id":"5f7c97a3_ab35eba9","line":312,"range":{"start_line":311,"start_character":0,"end_line":312,"end_character":44},"updated":"2018-06-23 15:30:48.000000000","message":"This is redundant with L308, we want to raise an exception instead","commit_id":"a177c1b4e021a98daa59469b9e9a4fd87ed241e7"},{"author":{"_account_id":22636,"name":"Cliff Parsons","email":"cliffhparsons@aol.com","username":"cliffparsons"},"change_message_id":"dd1c904f8d6a907c6dd4cb494901fa76a47c38f5","unresolved":false,"context_lines":[{"line_number":308,"context_line":"        if len(retrieved_network) \u003d\u003d 0:"},{"line_number":309,"context_line":"            raise rbac_exceptions.RbacMalformedResponse(empty\u003dTrue)"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"        key \u003d retrieved_network.get(\u0027provider:segmentation_id\u0027, \"NotFound\")"},{"line_number":312,"context_line":"        self.assertNotEqual(key, \"NotFound\")"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":315,"context_line":"                                 rules\u003d[\"get_network\", \"delete_network\"],"}],"source_content_type":"text/x-python","patch_set":17,"id":"5f7c97a3_56094d92","line":312,"range":{"start_line":311,"start_character":0,"end_line":312,"end_character":44},"in_reply_to":"5f7c97a3_ab35eba9","updated":"2018-06-25 14:45:46.000000000","message":"Ok.  I will correct in my next PS.","commit_id":"a177c1b4e021a98daa59469b9e9a4fd87ed241e7"}],"patrole_tempest_plugin/tests/api/network/test_ports_rbac.py":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"a5e65d1aeebabfc340d3ebb237302c742c97d934","unresolved":false,"context_lines":[{"line_number":163,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":164,"context_line":"                                 rules\u003d[\"get_port\","},{"line_number":165,"context_line":"                                        \"get_port:binding:vif_type\"],"},{"line_number":166,"context_line":"                                 expected_error_codes\u003d[404, 403])"},{"line_number":167,"context_line":"    @decorators.idempotent_id(\u0027125aff0b-8fed-4f8e-8410-338616594b06\u0027)"},{"line_number":168,"context_line":"    def test_show_port_binding_vif_type(self):"},{"line_number":169,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"5f7c97a3_4c761f42","line":166,"range":{"start_line":166,"start_character":60,"end_line":166,"end_character":63},"updated":"2018-06-18 21:29:10.000000000","message":"This actually isn\u0027t true since all this does is prevent the field from being added to the response body.\n\nWe have 2 options:\n\n1) Only use expected_error_codes\u003d[404]\n2) Use None to signify that it doesn\u0027t return any error which will require supporting documentation later. That is:\n\n    expected_error_codes\u003d[404, None]\n\nI suspect the latter will require an update to: https://github.com/openstack/patrole/blob/6962e8afa2de51821c6392df6ae08d8ebec64299/patrole_tempest_plugin/rbac_rule_validation.py#L137\n\nTo basically just skip the check if rule is None.","commit_id":"2f0b86257c08b4c840329fa72056cf346dd7a190"},{"author":{"_account_id":22636,"name":"Cliff Parsons","email":"cliffhparsons@aol.com","username":"cliffparsons"},"change_message_id":"d0a06502f99857ae33595e065c18f807e176e233","unresolved":false,"context_lines":[{"line_number":163,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":164,"context_line":"                                 rules\u003d[\"get_port\","},{"line_number":165,"context_line":"                                        \"get_port:binding:vif_type\"],"},{"line_number":166,"context_line":"                                 expected_error_codes\u003d[404, 403])"},{"line_number":167,"context_line":"    @decorators.idempotent_id(\u0027125aff0b-8fed-4f8e-8410-338616594b06\u0027)"},{"line_number":168,"context_line":"    def test_show_port_binding_vif_type(self):"},{"line_number":169,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"5f7c97a3_b7312d0d","line":166,"range":{"start_line":166,"start_character":60,"end_line":166,"end_character":63},"in_reply_to":"5f7c97a3_4c761f42","updated":"2018-06-19 14:31:11.000000000","message":"I get your point, but in these get_port:binding:xxx tests, the  result of the get_port:binding:vif_type check is an empty output, which gets translated to error code 403 by the framework because the test case throws the RbacMalformedResponse exception.  Same is true for test_routers_rbac.RouterRbacTest.test_show_distributed_router and test_routers_rbac.RouterRbacTest.test_show_high_availability_router.  In my opinion, these particular cases are handled ok. However, for the ones you highlighted in test_networks_rbac.py, those need to be changed.","commit_id":"2f0b86257c08b4c840329fa72056cf346dd7a190"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"1b6a8961d75256a0fd7ed1f0dd8d88f9a2517eeb","unresolved":false,"context_lines":[{"line_number":163,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":164,"context_line":"                                 rules\u003d[\"get_port\","},{"line_number":165,"context_line":"                                        \"get_port:binding:vif_type\"],"},{"line_number":166,"context_line":"                                 expected_error_codes\u003d[404, 403])"},{"line_number":167,"context_line":"    @decorators.idempotent_id(\u0027125aff0b-8fed-4f8e-8410-338616594b06\u0027)"},{"line_number":168,"context_line":"    def test_show_port_binding_vif_type(self):"},{"line_number":169,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"5f7c97a3_83038f76","line":166,"range":{"start_line":166,"start_character":60,"end_line":166,"end_character":63},"in_reply_to":"5f7c97a3_b7312d0d","updated":"2018-06-19 16:01:59.000000000","message":"There\u0027s a difference between expecting a 403 from the server and imitating a 403 within the testing framework.\n\nThat being said, I\u0027m inclined to agree since I think this implementation will work more cleanly with the existing code base and introducing None probably adds undue complexity as well as exposes some framework gaps. So I\u0027m OK to keep this.","commit_id":"2f0b86257c08b4c840329fa72056cf346dd7a190"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"a5e65d1aeebabfc340d3ebb237302c742c97d934","unresolved":false,"context_lines":[{"line_number":183,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":184,"context_line":"                                 rules\u003d[\"get_port\","},{"line_number":185,"context_line":"                                        \"get_port:binding:vif_details\"],"},{"line_number":186,"context_line":"                                 expected_error_codes\u003d[404, 403])"},{"line_number":187,"context_line":"    @decorators.idempotent_id(\u0027e42bfd77-fcce-45ee-9728-3424300f0d6f\u0027)"},{"line_number":188,"context_line":"    def test_show_port_binding_vif_details(self):"},{"line_number":189,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"5f7c97a3_ec74cb38","line":186,"updated":"2018-06-18 21:29:10.000000000","message":"Ditto","commit_id":"2f0b86257c08b4c840329fa72056cf346dd7a190"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"a5e65d1aeebabfc340d3ebb237302c742c97d934","unresolved":false,"context_lines":[{"line_number":203,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":204,"context_line":"                                 rules\u003d[\"get_port\","},{"line_number":205,"context_line":"                                        \"get_port:binding:host_id\"],"},{"line_number":206,"context_line":"                                 expected_error_codes\u003d[404, 403])"},{"line_number":207,"context_line":"    @decorators.idempotent_id(\u00278e61bcdc-6f81-443c-833e-44410266551e\u0027)"},{"line_number":208,"context_line":"    def test_show_port_binding_host_id(self):"},{"line_number":209,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"5f7c97a3_0c702740","line":206,"updated":"2018-06-18 21:29:10.000000000","message":"Ditto","commit_id":"2f0b86257c08b4c840329fa72056cf346dd7a190"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"a5e65d1aeebabfc340d3ebb237302c742c97d934","unresolved":false,"context_lines":[{"line_number":227,"context_line":"                                 rules\u003d[\"get_port\","},{"line_number":228,"context_line":"                                        \"get_port:binding:profile\"],"},{"line_number":229,"context_line":"                                 expected_error_codes\u003d[404, 403])"},{"line_number":230,"context_line":"    @decorators.idempotent_id(\u0027d497cea9-c4ad-42e0-acc9-8d257d6b01fc\u0027)"},{"line_number":231,"context_line":"    def test_show_port_binding_profile(self):"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"        # Verify specific fields of a port"}],"source_content_type":"text/x-python","patch_set":13,"id":"5f7c97a3_ac8c932e","line":230,"updated":"2018-06-18 21:29:10.000000000","message":"Ditto","commit_id":"2f0b86257c08b4c840329fa72056cf346dd7a190"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"7b0353f78a37123b38cd7854e8cfc39cfa04e374","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        \u0027\"create_port:fixed_ips:ip_address\" must be available in the cloud.\u0027)"},{"line_number":121,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":122,"context_line":"                                 rules\u003d[\"create_port\","},{"line_number":123,"context_line":"                                        \"create_port:fixed_ips\"],"},{"line_number":124,"context_line":"                                 expected_error_codes\u003d[403, 403])"},{"line_number":125,"context_line":"    @decorators.idempotent_id(\u00272551e10d-006a-413c-925a-8c6f834c09ac\u0027)"},{"line_number":126,"context_line":"    def test_create_port_fixed_ips_ip_address(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f7c97a3_4e20174a","line":123,"range":{"start_line":123,"start_character":41,"end_line":123,"end_character":63},"updated":"2018-06-21 02:08:40.000000000","message":"This policy was renamed to create_port:fixed_ips:ip_address in Ocata which is eol so is no longer supported upstream. https://github.com/openstack/neutron/commit/8236e83deced9af84ae0e5128c76acfa753093cc#diff-335462891f7178710c6ca7185f9f877c\n\nTo support this in Ocata, you\u0027ll have to support the change downstream.","commit_id":"6a44d04490dd707d5e7db16d83c2aad0e8953b36"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"69f6fd58b6cdb30bfd5edf0b197b715633a191de","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        \u0027\"create_port:fixed_ips:ip_address\" must be available in the cloud.\u0027)"},{"line_number":121,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":122,"context_line":"                                 rules\u003d[\"create_port\","},{"line_number":123,"context_line":"                                        \"create_port:fixed_ips\"],"},{"line_number":124,"context_line":"                                 expected_error_codes\u003d[403, 403])"},{"line_number":125,"context_line":"    @decorators.idempotent_id(\u00272551e10d-006a-413c-925a-8c6f834c09ac\u0027)"},{"line_number":126,"context_line":"    def test_create_port_fixed_ips_ip_address(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f7c97a3_d0c10f82","line":123,"range":{"start_line":123,"start_character":41,"end_line":123,"end_character":63},"in_reply_to":"5f7c97a3_2d358ff7","updated":"2018-06-22 00:41:23.000000000","message":"The reasoning is because if there is no entry for this in the policy file or policy in code (which doesn\u0027t exist for Neutron), then it\u0027s impossible to validate, so we fail the test automatically.\n\nAlso this kind of empiricism is error-prone and is why policy in code documentation is essential for this kind of work. Reading their documentation it definitely seems like \"create_port:fixed_ips:ip_address\" should be correct:\n\n\"For each attribute which has been explicitly specified in the request create a rule matching policy names in the form \u003coperation\u003e_\u003cresource\u003e:\u003cattribute\u003e rule, and link it with the previous rule with an ‘And’ relationship (using oslo_policy.AndCheck); this step will be performed only if the enforce_policy flag is set to True in the resource attribute descriptor (usually found in a data structure called RESOURCE_ATTRIBUTE_MAP);\"\n\nAnd what you see below is a \"create_port\" operation/resource followed by an explicit \"fixed_ips\" attribute in the request which in turn contains an explicit \"ip_address\" attribute. Neutron bug? Or incorrect test behavior?","commit_id":"6a44d04490dd707d5e7db16d83c2aad0e8953b36"},{"author":{"_account_id":22636,"name":"Cliff Parsons","email":"cliffhparsons@aol.com","username":"cliffparsons"},"change_message_id":"c740afa1551ddeb8e1e4826ef26204b301150323","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        \u0027\"create_port:fixed_ips:ip_address\" must be available in the cloud.\u0027)"},{"line_number":121,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":122,"context_line":"                                 rules\u003d[\"create_port\","},{"line_number":123,"context_line":"                                        \"create_port:fixed_ips\"],"},{"line_number":124,"context_line":"                                 expected_error_codes\u003d[403, 403])"},{"line_number":125,"context_line":"    @decorators.idempotent_id(\u00272551e10d-006a-413c-925a-8c6f834c09ac\u0027)"},{"line_number":126,"context_line":"    def test_create_port_fixed_ips_ip_address(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f7c97a3_5351972f","line":123,"range":{"start_line":123,"start_character":41,"end_line":123,"end_character":63},"in_reply_to":"5f7c97a3_4e20174a","updated":"2018-06-21 13:48:56.000000000","message":"The reason I removed the \"ip_address\" part is because it doesn\u0027t get checked by Neutron policy enforcement code. Only \"create_port\" and \"create_port:fixed_ips\" are checked in both Ocata and Rocky (latest upstream).","commit_id":"6a44d04490dd707d5e7db16d83c2aad0e8953b36"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"2f88ee7424f95ca297e8cfee7222fb240c69a711","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        \u0027\"create_port:fixed_ips:ip_address\" must be available in the cloud.\u0027)"},{"line_number":121,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":122,"context_line":"                                 rules\u003d[\"create_port\","},{"line_number":123,"context_line":"                                        \"create_port:fixed_ips\"],"},{"line_number":124,"context_line":"                                 expected_error_codes\u003d[403, 403])"},{"line_number":125,"context_line":"    @decorators.idempotent_id(\u00272551e10d-006a-413c-925a-8c6f834c09ac\u0027)"},{"line_number":126,"context_line":"    def test_create_port_fixed_ips_ip_address(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f7c97a3_2d358ff7","line":123,"range":{"start_line":123,"start_character":41,"end_line":123,"end_character":63},"in_reply_to":"5f7c97a3_5351972f","updated":"2018-06-21 18:51:19.000000000","message":"You\u0027ll find that Neutron doesn\u0027t like adding all their policies to their policy.json. I tried explaining that that is the only place where their policies are documented, but maybe can try again... As it stands, this isn\u0027t in their policy file so we can\u0027t use it.","commit_id":"6a44d04490dd707d5e7db16d83c2aad0e8953b36"},{"author":{"_account_id":22636,"name":"Cliff Parsons","email":"cliffhparsons@aol.com","username":"cliffparsons"},"change_message_id":"903b9ba25541747aaaf4899d8701944edbee58b3","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        \u0027\"create_port:fixed_ips:ip_address\" must be available in the cloud.\u0027)"},{"line_number":121,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":122,"context_line":"                                 rules\u003d[\"create_port\","},{"line_number":123,"context_line":"                                        \"create_port:fixed_ips\"],"},{"line_number":124,"context_line":"                                 expected_error_codes\u003d[403, 403])"},{"line_number":125,"context_line":"    @decorators.idempotent_id(\u00272551e10d-006a-413c-925a-8c6f834c09ac\u0027)"},{"line_number":126,"context_line":"    def test_create_port_fixed_ips_ip_address(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f7c97a3_bebf79a9","line":123,"range":{"start_line":123,"start_character":41,"end_line":123,"end_character":63},"in_reply_to":"5f7c97a3_d0c10f82","updated":"2018-06-22 13:58:50.000000000","message":"Ok, I get what you\u0027re saying. I think this test is correct when it has the three rules: \"create_port\",                         \"create_port:fixed_ips\", and \"create_port:fixed_ips:ip_address\". I think there is a bug in the Neutron code that\u0027s causing the third rule to not be evaluated as it should be. And \"create_port:fixed_ips\" should be added to the default neutron policy file because it is (rightfully) evaluated by neutron. Same problem with \"update_port:fixed_ips:ip_address\" as well.","commit_id":"6a44d04490dd707d5e7db16d83c2aad0e8953b36"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"f5a502ce957fa2147b6e8aef148bcafc705d920e","unresolved":false,"context_lines":[{"line_number":319,"context_line":"        with self.rbac_utils.override_role(self):"},{"line_number":320,"context_line":"            self.ports_client.update_port(port[\u0027id\u0027], fixed_ips\u003dfixed_ips)"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":323,"context_line":"                                 rules\u003d[\"get_port\", \"update_port\"],"},{"line_number":324,"context_line":"                                 expected_error_codes\u003d[404, 403])"},{"line_number":325,"context_line":"    @decorators.idempotent_id(\u0027795541af-6652-4e35-9581-fd58224f7545\u0027)"},{"line_number":326,"context_line":"    def test_update_port_security_enabled(self):"},{"line_number":327,"context_line":""},{"line_number":328,"context_line":"        # As of Rocky, update_port:port_security_enabled is not checked"},{"line_number":329,"context_line":"        # by the Neutron policy implementation. Only update_port and"},{"line_number":330,"context_line":"        # get_port are checked."},{"line_number":331,"context_line":"        with self.rbac_utils.override_role(self):"},{"line_number":332,"context_line":"            self.ports_client.update_port(self.port[\u0027id\u0027], security_groups\u003d[])"},{"line_number":333,"context_line":""},{"line_number":334,"context_line":"    @utils.requires_ext(extension\u003d\u0027binding\u0027, service\u003d\u0027network\u0027)"},{"line_number":335,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","}],"source_content_type":"text/x-python","patch_set":17,"id":"5f7c97a3_ab5e4be6","line":332,"range":{"start_line":322,"start_character":0,"end_line":332,"end_character":78},"updated":"2018-06-23 15:30:48.000000000","message":"I suspect this is the case because the test is passing in the wrong argument. This should be fixed separately.\n\nSee: https://developer.openstack.org/api-ref/network/v2/#update-port\n\nMostly likely need to pass port_security_enabled\u003dTrue instead of security_groups\u003d[] which has no relationship.","commit_id":"a177c1b4e021a98daa59469b9e9a4fd87ed241e7"},{"author":{"_account_id":22636,"name":"Cliff Parsons","email":"cliffhparsons@aol.com","username":"cliffparsons"},"change_message_id":"dd1c904f8d6a907c6dd4cb494901fa76a47c38f5","unresolved":false,"context_lines":[{"line_number":319,"context_line":"        with self.rbac_utils.override_role(self):"},{"line_number":320,"context_line":"            self.ports_client.update_port(port[\u0027id\u0027], fixed_ips\u003dfixed_ips)"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":323,"context_line":"                                 rules\u003d[\"get_port\", \"update_port\"],"},{"line_number":324,"context_line":"                                 expected_error_codes\u003d[404, 403])"},{"line_number":325,"context_line":"    @decorators.idempotent_id(\u0027795541af-6652-4e35-9581-fd58224f7545\u0027)"},{"line_number":326,"context_line":"    def test_update_port_security_enabled(self):"},{"line_number":327,"context_line":""},{"line_number":328,"context_line":"        # As of Rocky, update_port:port_security_enabled is not checked"},{"line_number":329,"context_line":"        # by the Neutron policy implementation. Only update_port and"},{"line_number":330,"context_line":"        # get_port are checked."},{"line_number":331,"context_line":"        with self.rbac_utils.override_role(self):"},{"line_number":332,"context_line":"            self.ports_client.update_port(self.port[\u0027id\u0027], security_groups\u003d[])"},{"line_number":333,"context_line":""},{"line_number":334,"context_line":"    @utils.requires_ext(extension\u003d\u0027binding\u0027, service\u003d\u0027network\u0027)"},{"line_number":335,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","}],"source_content_type":"text/x-python","patch_set":17,"id":"5f7c97a3_16ff5566","line":332,"range":{"start_line":322,"start_character":0,"end_line":332,"end_character":78},"in_reply_to":"5f7c97a3_ab5e4be6","updated":"2018-06-25 14:45:46.000000000","message":"I will investigate this further.","commit_id":"a177c1b4e021a98daa59469b9e9a4fd87ed241e7"}],"patrole_tempest_plugin/tests/api/network/test_routers_rbac.py":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"a5e65d1aeebabfc340d3ebb237302c742c97d934","unresolved":false,"context_lines":[{"line_number":160,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":161,"context_line":"                                 rules\u003d[\"get_router\","},{"line_number":162,"context_line":"                                        \"get_router:distributed\"],"},{"line_number":163,"context_line":"                                 expected_error_codes\u003d[404, 403])"},{"line_number":164,"context_line":"    def test_show_distributed_router(self):"},{"line_number":165,"context_line":"        \"\"\"Get distributed router"},{"line_number":166,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"5f7c97a3_4c9b7f63","line":163,"updated":"2018-06-18 21:29:10.000000000","message":"Ditto","commit_id":"2f0b86257c08b4c840329fa72056cf346dd7a190"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"a5e65d1aeebabfc340d3ebb237302c742c97d934","unresolved":false,"context_lines":[{"line_number":182,"context_line":"    @utils.requires_ext(extension\u003d\u0027l3-ha\u0027, service\u003d\u0027network\u0027)"},{"line_number":183,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":184,"context_line":"                                 rules\u003d[\"get_router\", \"get_router:ha\"],"},{"line_number":185,"context_line":"                                 expected_error_codes\u003d[404, 403])"},{"line_number":186,"context_line":"    def test_show_high_availability_router(self):"},{"line_number":187,"context_line":"        \"\"\"GET high-availability router"},{"line_number":188,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"5f7c97a3_eca92b7c","line":185,"updated":"2018-06-18 21:29:10.000000000","message":"Ditto","commit_id":"2f0b86257c08b4c840329fa72056cf346dd7a190"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"06c305724476d3be25b378db01d54ff789c43c5a","unresolved":false,"context_lines":[{"line_number":240,"context_line":"    @rbac_rule_validation.action("},{"line_number":241,"context_line":"        service\u003d\"neutron\","},{"line_number":242,"context_line":"        rules\u003d[\"get_router\", \"update_router\","},{"line_number":243,"context_line":"               \"update_router:external_gateway_info:network_id\"],"},{"line_number":244,"context_line":"        expected_error_codes\u003d[404, 403, 403])"},{"line_number":245,"context_line":"    @decorators.idempotent_id(\u0027f1fc5a23-e3d8-44f0-b7bc-47006ad9d3d4\u0027)"},{"line_number":246,"context_line":"    def test_update_router_external_gateway_info_network_id(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f7c97a3_ce618713","line":243,"updated":"2018-06-21 03:02:14.000000000","message":"It would not surprise me if \"update_router:external_gateway_info\" is also enforced here.","commit_id":"6a44d04490dd707d5e7db16d83c2aad0e8953b36"},{"author":{"_account_id":22636,"name":"Cliff Parsons","email":"cliffhparsons@aol.com","username":"cliffparsons"},"change_message_id":"c740afa1551ddeb8e1e4826ef26204b301150323","unresolved":false,"context_lines":[{"line_number":240,"context_line":"    @rbac_rule_validation.action("},{"line_number":241,"context_line":"        service\u003d\"neutron\","},{"line_number":242,"context_line":"        rules\u003d[\"get_router\", \"update_router\","},{"line_number":243,"context_line":"               \"update_router:external_gateway_info:network_id\"],"},{"line_number":244,"context_line":"        expected_error_codes\u003d[404, 403, 403])"},{"line_number":245,"context_line":"    @decorators.idempotent_id(\u0027f1fc5a23-e3d8-44f0-b7bc-47006ad9d3d4\u0027)"},{"line_number":246,"context_line":"    def test_update_router_external_gateway_info_network_id(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f7c97a3_13355ff7","line":243,"in_reply_to":"5f7c97a3_ce618713","updated":"2018-06-21 13:48:56.000000000","message":"Thanks, I\u0027ll check this today.","commit_id":"6a44d04490dd707d5e7db16d83c2aad0e8953b36"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"06c305724476d3be25b378db01d54ff789c43c5a","unresolved":false,"context_lines":[{"line_number":262,"context_line":"    @rbac_rule_validation.action("},{"line_number":263,"context_line":"        service\u003d\"neutron\","},{"line_number":264,"context_line":"        rules\u003d[\"get_router\", \"update_router\","},{"line_number":265,"context_line":"               \"update_router:external_gateway_info:enable_snat\"],"},{"line_number":266,"context_line":"        expected_error_codes\u003d[404, 403, 403])"},{"line_number":267,"context_line":"    @decorators.idempotent_id(\u0027515a2954-3d79-4695-aeb9-d1c222765840\u0027)"},{"line_number":268,"context_line":"    def test_update_router_enable_snat(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f7c97a3_ee66c329","line":265,"updated":"2018-06-21 03:02:14.000000000","message":"Ditto","commit_id":"6a44d04490dd707d5e7db16d83c2aad0e8953b36"},{"author":{"_account_id":22636,"name":"Cliff Parsons","email":"cliffhparsons@aol.com","username":"cliffparsons"},"change_message_id":"c740afa1551ddeb8e1e4826ef26204b301150323","unresolved":false,"context_lines":[{"line_number":262,"context_line":"    @rbac_rule_validation.action("},{"line_number":263,"context_line":"        service\u003d\"neutron\","},{"line_number":264,"context_line":"        rules\u003d[\"get_router\", \"update_router\","},{"line_number":265,"context_line":"               \"update_router:external_gateway_info:enable_snat\"],"},{"line_number":266,"context_line":"        expected_error_codes\u003d[404, 403, 403])"},{"line_number":267,"context_line":"    @decorators.idempotent_id(\u0027515a2954-3d79-4695-aeb9-d1c222765840\u0027)"},{"line_number":268,"context_line":"    def test_update_router_enable_snat(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f7c97a3_d33a87e4","line":265,"in_reply_to":"5f7c97a3_ee66c329","updated":"2018-06-21 13:48:56.000000000","message":"I\u0027ll check this today.","commit_id":"6a44d04490dd707d5e7db16d83c2aad0e8953b36"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"06c305724476d3be25b378db01d54ff789c43c5a","unresolved":false,"context_lines":[{"line_number":284,"context_line":"    @rbac_rule_validation.action("},{"line_number":285,"context_line":"        service\u003d\"neutron\","},{"line_number":286,"context_line":"        rules\u003d[\"get_router\", \"update_router\","},{"line_number":287,"context_line":"               \"update_router:external_gateway_info:external_fixed_ips\"],"},{"line_number":288,"context_line":"        expected_error_codes\u003d[404, 403, 403])"},{"line_number":289,"context_line":"    @decorators.idempotent_id(\u0027f429e5ee-8f0a-4667-963e-72dd95d5adee\u0027)"},{"line_number":290,"context_line":"    def test_update_router_external_fixed_ips(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f7c97a3_8e670f25","line":287,"updated":"2018-06-21 03:02:14.000000000","message":"Ditto","commit_id":"6a44d04490dd707d5e7db16d83c2aad0e8953b36"},{"author":{"_account_id":22636,"name":"Cliff Parsons","email":"cliffhparsons@aol.com","username":"cliffparsons"},"change_message_id":"c740afa1551ddeb8e1e4826ef26204b301150323","unresolved":false,"context_lines":[{"line_number":284,"context_line":"    @rbac_rule_validation.action("},{"line_number":285,"context_line":"        service\u003d\"neutron\","},{"line_number":286,"context_line":"        rules\u003d[\"get_router\", \"update_router\","},{"line_number":287,"context_line":"               \"update_router:external_gateway_info:external_fixed_ips\"],"},{"line_number":288,"context_line":"        expected_error_codes\u003d[404, 403, 403])"},{"line_number":289,"context_line":"    @decorators.idempotent_id(\u0027f429e5ee-8f0a-4667-963e-72dd95d5adee\u0027)"},{"line_number":290,"context_line":"    def test_update_router_external_fixed_ips(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f7c97a3_93208fb2","line":287,"in_reply_to":"5f7c97a3_8e670f25","updated":"2018-06-21 13:48:56.000000000","message":"I\u0027ll check this today.","commit_id":"6a44d04490dd707d5e7db16d83c2aad0e8953b36"}],"patrole_tempest_plugin/tests/api/network/test_security_groups_rbac.py":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"2c4edb8c08f16a52fbe39c8840436ecd59d2e4fd","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                                 rule\u003d\"get_security_group\","},{"line_number":82,"context_line":"                                 expected_error_code\u003d404)"},{"line_number":83,"context_line":"    @decorators.idempotent_id(\u002756335e77-aef2-4b54-86c7-7f772034b585\u0027)"},{"line_number":84,"context_line":"    def test_show_security_groups(self):"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        with self.rbac_utils.override_role(self):"},{"line_number":87,"context_line":"            self.security_groups_client.show_security_group("}],"source_content_type":"text/x-python","patch_set":10,"id":"5f7c97a3_a08c9c2e","line":84,"range":{"start_line":84,"start_character":32,"end_line":84,"end_character":33},"updated":"2018-06-18 18:45:43.000000000","message":"Unrelated, but can remove the \u0027s\u0027 here.","commit_id":"3b5f121c9746445be0a178ae87a1d76b76fb5907"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"2c4edb8c08f16a52fbe39c8840436ecd59d2e4fd","unresolved":false,"context_lines":[{"line_number":116,"context_line":"                description\u003d\"test description\")"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":119,"context_line":"                                 rule\u003d\"get_security_groups\")"},{"line_number":120,"context_line":"    @decorators.idempotent_id(\u0027fbaf8d96-ed3e-49af-b24c-5fb44f05bbb7\u0027)"},{"line_number":121,"context_line":"    def test_list_security_groups(self):"},{"line_number":122,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"5f7c97a3_40d348d4","line":119,"range":{"start_line":119,"start_character":39,"end_line":119,"end_character":58},"updated":"2018-06-18 18:45:43.000000000","message":"This test below only passes if \"get_security_group\" is included and the rule is admin_only.\n\nI can\u0027t find any information on RBAC in Neutron w.r.t. listing resources, but list appears to invoke show for each resource in the list retrieved from the DB.\n\nIf you set \"get_security_groups\" to \"admin_or_owner\" and \"get_security_group\" to \"admin_only\" then this test fails. Neutron\u0027s policy enforcement is so convoluted that I\u0027m not sure how to come up with a foolproof solution to this; we\u0027re clearly missing something.","commit_id":"3b5f121c9746445be0a178ae87a1d76b76fb5907"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"2c4edb8c08f16a52fbe39c8840436ecd59d2e4fd","unresolved":false,"context_lines":[{"line_number":124,"context_line":"            security_groups \u003d self.security_groups_client.\\"},{"line_number":125,"context_line":"                list_security_groups()"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        # Neutron may return an empty list if access is denied."},{"line_number":128,"context_line":"        if not security_groups[\u0027security_groups\u0027]:"},{"line_number":129,"context_line":"            raise rbac_exceptions.RbacMalformedResponse(empty\u003dTrue)"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":132,"context_line":"                                 rule\u003d\"create_security_group_rule\")"}],"source_content_type":"text/x-python","patch_set":10,"id":"5f7c97a3_206acc1a","line":129,"range":{"start_line":127,"start_character":0,"end_line":129,"end_character":67},"updated":"2018-06-18 18:45:43.000000000","message":"This is unrelated to the patchset in question so should be done separately as this doesn\u0027t related to multi-policy in Neutron.","commit_id":"3b5f121c9746445be0a178ae87a1d76b76fb5907"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"2c4edb8c08f16a52fbe39c8840436ecd59d2e4fd","unresolved":false,"context_lines":[{"line_number":169,"context_line":"                list_security_group_rules()"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        # Neutron may return an empty list if access is denied."},{"line_number":172,"context_line":"        if not security_rules[\u0027security_group_rules\u0027]:"},{"line_number":173,"context_line":"            raise rbac_exceptions.RbacMalformedResponse(empty\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":10,"id":"5f7c97a3_c08af818","line":173,"range":{"start_line":172,"start_character":8,"end_line":173,"end_character":67},"updated":"2018-06-18 18:45:43.000000000","message":"Ditto","commit_id":"3b5f121c9746445be0a178ae87a1d76b76fb5907"}],"patrole_tempest_plugin/tests/api/network/test_subnets_rbac.py":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"a5e65d1aeebabfc340d3ebb237302c742c97d934","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    @decorators.idempotent_id(\u0027c02618e7-bb20-4abd-83c8-6eec2af08752\u0027)"},{"line_number":51,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":52,"context_line":"                                 rule\u003d\"get_subnet\","},{"line_number":53,"context_line":"                                 expected_error_code\u003d404)"},{"line_number":54,"context_line":"    def test_show_subnet(self):"},{"line_number":55,"context_line":"        \"\"\"Show subnet."},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"5f7c97a3_8cb2f7e4","line":53,"updated":"2018-06-18 21:29:10.000000000","message":"Ditto, should use non-deprecated list","commit_id":"2f0b86257c08b4c840329fa72056cf346dd7a190"}]}
