)]}'
{"patrole_tempest_plugin/tests/api/network/test_networks_rbac.py":[{"author":{"_account_id":23140,"name":"Jess Egler","email":"jess.egler@gmail.com","username":"jessegler"},"change_message_id":"0c95689e6e793a1532f9ddc4cdd09358765d38c1","unresolved":false,"context_lines":[{"line_number":466,"context_line":"                                 rules\u003d[\"get_network_ip_availability\"],"},{"line_number":467,"context_line":"                                 expected_error_codes\u003d[404])"},{"line_number":468,"context_line":"    @decorators.idempotent_id(\u002793EDC5ED-385F-4A8E-9B15-4370EC608253\u0027)"},{"line_number":469,"context_line":"    def test_get_network_ip_availabilities(self):"},{"line_number":470,"context_line":"        \"\"\"Get network availability"},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"        RBAC test for the neutron get_network_ip_availabilities policy"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_24402935","line":469,"range":{"start_line":469,"start_character":8,"end_line":469,"end_character":42},"updated":"2018-09-05 23:24:46.000000000","message":"This should be test_get_network_ip_availability to match the policy being tested.","commit_id":"a93906f4cd31aada667e6c42981e4de1129c8d3f"},{"author":{"_account_id":16274,"name":"Mykola Yakovliev","email":"VegasQ@gmail.com","username":"vegasq"},"change_message_id":"12c692a13668b6939c86bc377367415d7a3de124","unresolved":false,"context_lines":[{"line_number":466,"context_line":"                                 rules\u003d[\"get_network_ip_availability\"],"},{"line_number":467,"context_line":"                                 expected_error_codes\u003d[404])"},{"line_number":468,"context_line":"    @decorators.idempotent_id(\u002793EDC5ED-385F-4A8E-9B15-4370EC608253\u0027)"},{"line_number":469,"context_line":"    def test_get_network_ip_availabilities(self):"},{"line_number":470,"context_line":"        \"\"\"Get network availability"},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"        RBAC test for the neutron get_network_ip_availabilities policy"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_9a2dd447","line":469,"range":{"start_line":469,"start_character":8,"end_line":469,"end_character":42},"in_reply_to":"3f79a3b5_24402935","updated":"2018-09-06 02:11:07.000000000","message":"Done","commit_id":"a93906f4cd31aada667e6c42981e4de1129c8d3f"},{"author":{"_account_id":23140,"name":"Jess Egler","email":"jess.egler@gmail.com","username":"jessegler"},"change_message_id":"0c95689e6e793a1532f9ddc4cdd09358765d38c1","unresolved":false,"context_lines":[{"line_number":484,"context_line":"                                 rules\u003d[\"get_network_ip_availabilities\"],"},{"line_number":485,"context_line":"                                 expected_error_codes\u003d[404])"},{"line_number":486,"context_line":"    @decorators.idempotent_id(\u0027D4CEB5F0-2342-4412-A617-4E1AAF7FCAF0\u0027)"},{"line_number":487,"context_line":"    def test_get_network_ip_availability(self):"},{"line_number":488,"context_line":"        \"\"\"List network ip availabilities"},{"line_number":489,"context_line":""},{"line_number":490,"context_line":"        RBAC test for the neutron get_network_ip_availabilities policy"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_8457bd01","line":487,"updated":"2018-09-05 23:24:46.000000000","message":"Similarly, this should be test_get_network_availabilities.","commit_id":"a93906f4cd31aada667e6c42981e4de1129c8d3f"},{"author":{"_account_id":16274,"name":"Mykola Yakovliev","email":"VegasQ@gmail.com","username":"vegasq"},"change_message_id":"12c692a13668b6939c86bc377367415d7a3de124","unresolved":false,"context_lines":[{"line_number":484,"context_line":"                                 rules\u003d[\"get_network_ip_availabilities\"],"},{"line_number":485,"context_line":"                                 expected_error_codes\u003d[404])"},{"line_number":486,"context_line":"    @decorators.idempotent_id(\u0027D4CEB5F0-2342-4412-A617-4E1AAF7FCAF0\u0027)"},{"line_number":487,"context_line":"    def test_get_network_ip_availability(self):"},{"line_number":488,"context_line":"        \"\"\"List network ip availabilities"},{"line_number":489,"context_line":""},{"line_number":490,"context_line":"        RBAC test for the neutron get_network_ip_availabilities policy"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_ba3210a6","line":487,"in_reply_to":"3f79a3b5_8457bd01","updated":"2018-09-06 02:11:07.000000000","message":"Done","commit_id":"a93906f4cd31aada667e6c42981e4de1129c8d3f"},{"author":{"_account_id":16274,"name":"Mykola Yakovliev","email":"VegasQ@gmail.com","username":"vegasq"},"change_message_id":"30a071f87dfb047760cbd15a713a4decaba1517b","unresolved":false,"context_lines":[{"line_number":490,"context_line":"        RBAC test for the neutron get_network_ip_availabilities policy"},{"line_number":491,"context_line":"        \"\"\""},{"line_number":492,"context_line":"        with self.rbac_utils.override_role(self):"},{"line_number":493,"context_line":"            self.ntp_client.list_network_ip_availabilities()"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_3f0ec73a","line":493,"range":{"start_line":493,"start_character":12,"end_line":493,"end_character":60},"updated":"2018-09-07 19:27:34.000000000","message":"Investigation:\n\nAPI hits neutron around here [0], on the next step, it goes one-by-one over every object, and check it against policy [2]. Policy works as expected, and policy.check() returns False, so all items are ignored and not included in the response.\n\nIn other words, for now, this API does not raise exceptions, but rather just filter outcome up to the just empty list.\n\n@Felipe, need your call here, do we want to start messing with neutron folks and change this behavior, or just drop this testcase from patrole?\n\n[0] https://github.com/openstack/neutron/blob/master/neutron/api/v2/base.py#L305\n[1] https://github.com/openstack/neutron/blob/master/neutron/api/v2/base.py#L314\n[2] https://github.com/openstack/neutron/blob/master/neutron/api/v2/base.py#L317","commit_id":"4217c6e2961cebe60cf4f334615cb3b331f14bcf"},{"author":{"_account_id":16274,"name":"Mykola Yakovliev","email":"VegasQ@gmail.com","username":"vegasq"},"change_message_id":"03e5724e07c422656b58cc05e5093e0e6388774c","unresolved":false,"context_lines":[{"line_number":490,"context_line":"        RBAC test for the neutron get_network_ip_availabilities policy"},{"line_number":491,"context_line":"        \"\"\""},{"line_number":492,"context_line":"        with self.rbac_utils.override_role(self):"},{"line_number":493,"context_line":"            self.ntp_client.list_network_ip_availabilities()"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_eb134000","line":493,"range":{"start_line":493,"start_character":12,"end_line":493,"end_character":60},"in_reply_to":"3f79a3b5_2b1f0d0a","updated":"2018-09-13 18:50:07.000000000","message":"Done with rbac_exceptions.MalformedRbacResponse,\n\nworth to mention this [0] patchset, that is trying to change this behavior.\n\n[0] https://review.openstack.org/#/c/601270/","commit_id":"4217c6e2961cebe60cf4f334615cb3b331f14bcf"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"765c121c373c9b31ba3d18e493e9b8f79acddeeb","unresolved":false,"context_lines":[{"line_number":490,"context_line":"        RBAC test for the neutron get_network_ip_availabilities policy"},{"line_number":491,"context_line":"        \"\"\""},{"line_number":492,"context_line":"        with self.rbac_utils.override_role(self):"},{"line_number":493,"context_line":"            self.ntp_client.list_network_ip_availabilities()"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_2b1f0d0a","line":493,"range":{"start_line":493,"start_character":12,"end_line":493,"end_character":60},"in_reply_to":"3f79a3b5_3f0ec73a","updated":"2018-09-12 21:23:19.000000000","message":"Neutron\u0027s behavior is correct.\n\nThe correct behavior Patrole side is basically this:\n\n    with self.rbac_utils.override_role(self):\n        result \u003d self.ntp_client.list_network_ip_availabilities()[...]\n    if not result:\n        raise rbac_exceptions.RbacMalformedException(empty\u003dTrue)\n\nThough I\u0027m not exactly sure how Neutron does the filtering. What I mean is that a non-authorized user may only be able to see SOME of the results but not ALL. Above I assume the non-authorized user can see NONE of the results.\n\nWhich means that we\u0027d need some additional logic to do something like:\n\nall_results \u003d self.os_admin.ntp_client.list_network_ip_availabilities()\nresults \u003d self.ntp_client.list_network_ip_availabilities()\n\nif set(all_results) !\u003d set(results):\n    raise rbac_exceptions.MalformedRbacException(...)\n\nBut this whole rbac_exceptions.MalformedRbacException(...) is a bit badly designed because it handles like 3 failure cases now, probably should be a discrete exception per failure case.","commit_id":"4217c6e2961cebe60cf4f334615cb3b331f14bcf"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"5f8ce2c85efd9e060428dd382255357ed8394956","unresolved":false,"context_lines":[{"line_number":498,"context_line":"        rbac_net_ids \u003d set(nipa[\u0027network_id\u0027]"},{"line_number":499,"context_line":"                           for nipa in results[\u0027network_ip_availabilities\u0027])"},{"line_number":500,"context_line":""},{"line_number":501,"context_line":"        if adm_net_ids !\u003d rbac_net_ids:"},{"line_number":502,"context_line":"            raise rbac_exceptions.RbacMalformedResponse(empty\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f79a3b5_6670ac41","line":501,"range":{"start_line":501,"start_character":8,"end_line":501,"end_character":39},"updated":"2018-09-14 22:56:10.000000000","message":"So this looks like it works since get_network_ip_availabilities is admin-only by default and this passes gates which tells me that rbac_net_ids is a subset of adm_net_ids.\n\nThough there is one edge case: If adm_net_ids is empty, then I think the test must be skipped because that means that we can\u0027t do the actual validation. So how about:\n\n    if not adm_net_ids:\n        raise cls.skipException(\u0027No available admin network IP availabilities in the system, so cannot validate RBAC policy for this test\u0027)\n    # I assume that len(adm_net_ids) \u003d\u003d 0 and len(rbac_net_ids) \u003e 0 doesn\u0027t need to check but we probably should as well: in that case it is also a test failure as that says that something is probably broken with RBAC.\n\nThis sort of behavior probably can be abstracted out into a generic method somewhere, but I need to go check whether this filtering of results is ubiquitous in Neutron for listing results w.r.t to RBAC. If so, that\u0027ll make it easier to write stuff like this for each test.","commit_id":"fb91a13b01d2c36fa8a191d4ac31ae016980fcc0"},{"author":{"_account_id":16274,"name":"Mykola Yakovliev","email":"VegasQ@gmail.com","username":"vegasq"},"change_message_id":"27180ebcd744c9efd10a055c007b425a151e1da8","unresolved":false,"context_lines":[{"line_number":498,"context_line":"        rbac_net_ids \u003d set(nipa[\u0027network_id\u0027]"},{"line_number":499,"context_line":"                           for nipa in results[\u0027network_ip_availabilities\u0027])"},{"line_number":500,"context_line":""},{"line_number":501,"context_line":"        if adm_net_ids !\u003d rbac_net_ids:"},{"line_number":502,"context_line":"            raise rbac_exceptions.RbacMalformedResponse(empty\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f79a3b5_8ce40910","line":501,"range":{"start_line":501,"start_character":8,"end_line":501,"end_character":39},"in_reply_to":"3f79a3b5_6670ac41","updated":"2018-09-15 02:19:30.000000000","message":"Done","commit_id":"fb91a13b01d2c36fa8a191d4ac31ae016980fcc0"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"24944493cc88123126381b8a1db68f84ab524330","unresolved":false,"context_lines":[{"line_number":469,"context_line":"    def test_get_network_ip_availability(self):"},{"line_number":470,"context_line":"        \"\"\"Get network availability"},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"        RBAC test for the neutron get_network_ip_availabilities policy"},{"line_number":473,"context_line":"        \"\"\""},{"line_number":474,"context_line":""},{"line_number":475,"context_line":"        network_name \u003d data_utils.rand_name("}],"source_content_type":"text/x-python","patch_set":7,"id":"3f79a3b5_646cc835","line":472,"range":{"start_line":472,"start_character":34,"end_line":472,"end_character":63},"updated":"2018-09-20 03:34:29.000000000","message":"get_network_ip_availability","commit_id":"d0095993086278f070b7d325107b43bbf7b76657"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"24944493cc88123126381b8a1db68f84ab524330","unresolved":false,"context_lines":[{"line_number":494,"context_line":"                          for nipa in adm_results[\u0027network_ip_availabilities\u0027])"},{"line_number":495,"context_line":"        if not adm_net_ids:"},{"line_number":496,"context_line":"            raise self.skipException("},{"line_number":497,"context_line":"                \u0027No available admin network IP availabilities in the system,\u0027"},{"line_number":498,"context_line":"                \u0027so cannot validate RBAC policy for this test\u0027)"},{"line_number":499,"context_line":""},{"line_number":500,"context_line":"        with self.rbac_utils.override_role(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3f79a3b5_24725013","line":497,"range":{"start_line":497,"start_character":76,"end_line":497,"end_character":77},"updated":"2018-09-20 03:34:29.000000000","message":"nit: missing space after comma","commit_id":"d0095993086278f070b7d325107b43bbf7b76657"},{"author":{"_account_id":16274,"name":"Mykola Yakovliev","email":"VegasQ@gmail.com","username":"vegasq"},"change_message_id":"9e09ddcc6d21b6dfbd8a969d309ccee0c486508a","unresolved":false,"context_lines":[{"line_number":503,"context_line":"        rbac_net_ids \u003d set(nipa[\u0027network_id\u0027]"},{"line_number":504,"context_line":"                           for nipa in results[\u0027network_ip_availabilities\u0027])"},{"line_number":505,"context_line":""},{"line_number":506,"context_line":"        if adm_net_ids !\u003d rbac_net_ids:"},{"line_number":507,"context_line":"            raise rbac_exceptions.RbacMalformedResponse(empty\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_1aae76e6","line":506,"range":{"start_line":506,"start_character":8,"end_line":506,"end_character":39},"updated":"2018-09-20 23:41:46.000000000","message":"list_network_ip_availabilities returns all pools available to the user.\n\nFor admin role, in case of parallel execution len(adm_net_ids) !\u003d len(rbac_net_ids) no guaranteed to be True. F.E. in this case zuul sees 3 networks at the beginning of the test, but when we hit this point we can see 4 networks (one extra, that created by test above).","commit_id":"911c0c52abb26e961c001f14cc3a19675256760e"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"25d8cedb9ef67e4571cfdb21194937c6439278d7","unresolved":false,"context_lines":[{"line_number":503,"context_line":"        rbac_net_ids \u003d set(nipa[\u0027network_id\u0027]"},{"line_number":504,"context_line":"                           for nipa in results[\u0027network_ip_availabilities\u0027])"},{"line_number":505,"context_line":""},{"line_number":506,"context_line":"        if adm_net_ids !\u003d rbac_net_ids:"},{"line_number":507,"context_line":"            raise rbac_exceptions.RbacMalformedResponse(empty\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_8dbd7269","line":506,"range":{"start_line":506,"start_character":8,"end_line":506,"end_character":39},"in_reply_to":"3f79a3b5_1aae76e6","updated":"2018-09-21 01:56:34.000000000","message":"Since these should be relatively slow tests, it should be possible to use: https://docs.openstack.org/oslo.concurrency/latest/reference/fixture.lockutils.html#oslo_concurrency.fixture.lockutils.LockFixture\n\nThe fixture is recommended to be the first line in a test method, like so:\n\ndef test_method(self):\n    self.useFixture(LockFixture(\u0027lock_name\u0027))\n        ...\nor the first line in setUp if all the test methods in the class are required to be serialized. Something like:\n\nclass TestCase(testtools.testcase):\n    def setUp(self):\n        self.useFixture(LockFixture(\u0027lock_name\u0027))\n        super(TestCase, self).setUp()\n            ...\n\nSo we need the 2nd case it seems like.","commit_id":"911c0c52abb26e961c001f14cc3a19675256760e"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"243a52647e6f13205ab11b04f9e430797e71d124","unresolved":false,"context_lines":[{"line_number":503,"context_line":"        rbac_net_ids \u003d set(nipa[\u0027network_id\u0027]"},{"line_number":504,"context_line":"                           for nipa in results[\u0027network_ip_availabilities\u0027])"},{"line_number":505,"context_line":""},{"line_number":506,"context_line":"        if adm_net_ids !\u003d rbac_net_ids:"},{"line_number":507,"context_line":"            raise rbac_exceptions.RbacMalformedResponse(empty\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_4db3da9a","line":506,"range":{"start_line":506,"start_character":8,"end_line":506,"end_character":39},"in_reply_to":"3f79a3b5_8dbd7269","updated":"2018-09-21 01:57:24.000000000","message":"I mean, these should be relatively quick tests, so serialization shouldn\u0027t matter much.","commit_id":"911c0c52abb26e961c001f14cc3a19675256760e"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"07c279ca4637b1057ddefcf3e600e81bc1e163e6","unresolved":false,"context_lines":[{"line_number":476,"context_line":"class NetworkIpAvailabilityPluginRbacTest(base.BaseNetworkPluginRbacTest):"},{"line_number":477,"context_line":""},{"line_number":478,"context_line":"    def setUp(self):"},{"line_number":479,"context_line":"        self.useFixture(fixtures.LockFixture(\u0027network_ip_availability\u0027))"},{"line_number":480,"context_line":"        super(NetworkIpAvailabilityPluginRbacTest, self).setUp()"},{"line_number":481,"context_line":""},{"line_number":482,"context_line":"    @utils.requires_ext(extension\u003d\u0027network-ip-availability\u0027, service\u003d\u0027network\u0027)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_8f04f81a","line":479,"range":{"start_line":479,"start_character":8,"end_line":479,"end_character":72},"updated":"2018-10-10 17:25:15.000000000","message":"Is this still needed with the validate list function below? I need to still review patch set.","commit_id":"c4f0ca1bdf6727c6fc7e9a33c5aec6cf66203599"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"f92b0c296189f47cd858e4c6428c7762fc30684d","unresolved":false,"context_lines":[{"line_number":460,"context_line":"                self.network[\u0027id\u0027])"},{"line_number":461,"context_line":""},{"line_number":462,"context_line":""},{"line_number":463,"context_line":"class NetworkIpAvailabilityExtRbacTest(base.BaseNetworkExtRbacTest):"},{"line_number":464,"context_line":""},{"line_number":465,"context_line":"    def setUp(self):"},{"line_number":466,"context_line":"        self.useFixture(fixtures.LockFixture(\u0027network_ip_availability\u0027))"}],"source_content_type":"text/x-python","patch_set":20,"id":"3f79a3b5_d5f64f2d","line":463,"range":{"start_line":463,"start_character":6,"end_line":463,"end_character":38},"updated":"2018-11-15 00:48:07.000000000","message":"nit: It would be better to move this into a separate module.","commit_id":"71cdfe43f3e89c9a4711a4c37c3247ed94b461bd"},{"author":{"_account_id":16274,"name":"Mykola Yakovliev","email":"VegasQ@gmail.com","username":"vegasq"},"change_message_id":"aa8c72760b0ecdac9787b59ea88f7ee9ba77ebaf","unresolved":false,"context_lines":[{"line_number":460,"context_line":"                self.network[\u0027id\u0027])"},{"line_number":461,"context_line":""},{"line_number":462,"context_line":""},{"line_number":463,"context_line":"class NetworkIpAvailabilityExtRbacTest(base.BaseNetworkExtRbacTest):"},{"line_number":464,"context_line":""},{"line_number":465,"context_line":"    def setUp(self):"},{"line_number":466,"context_line":"        self.useFixture(fixtures.LockFixture(\u0027network_ip_availability\u0027))"}],"source_content_type":"text/x-python","patch_set":20,"id":"3f79a3b5_11812dfb","line":463,"range":{"start_line":463,"start_character":6,"end_line":463,"end_character":38},"in_reply_to":"3f79a3b5_d5f64f2d","updated":"2018-11-15 20:41:27.000000000","message":"Done","commit_id":"71cdfe43f3e89c9a4711a4c37c3247ed94b461bd"},{"author":{"_account_id":8911,"name":"Sergey Vilgelm","email":"sergey@vilgelm.info","username":"sergey.vilgelm"},"change_message_id":"6b9b91d59ecbce277f23ed56c2207f4faa36cbff","unresolved":false,"context_lines":[{"line_number":466,"context_line":"        self.useFixture(fixtures.LockFixture(\u0027network_ip_availability\u0027))"},{"line_number":467,"context_line":"        super(NetworkIpAvailabilityExtRbacTest, self).setUp()"},{"line_number":468,"context_line":""},{"line_number":469,"context_line":"    @utils.requires_ext(extension\u003d\u0027network-ip-availability\u0027, service\u003d\u0027network\u0027)"},{"line_number":470,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":471,"context_line":"                                 rules\u003d[\"get_network_ip_availability\"],"},{"line_number":472,"context_line":"                                 expected_error_codes\u003d[404])"}],"source_content_type":"text/x-python","patch_set":20,"id":"3f79a3b5_102daefb","line":469,"updated":"2018-11-15 14:23:31.000000000","message":"nit: The NetworkIpAvailabilityExtRbacTest class has two tests and both of them are wrapped with this decorator. Can we move it into the skip_checks method?","commit_id":"71cdfe43f3e89c9a4711a4c37c3247ed94b461bd"},{"author":{"_account_id":16274,"name":"Mykola Yakovliev","email":"VegasQ@gmail.com","username":"vegasq"},"change_message_id":"aa8c72760b0ecdac9787b59ea88f7ee9ba77ebaf","unresolved":false,"context_lines":[{"line_number":466,"context_line":"        self.useFixture(fixtures.LockFixture(\u0027network_ip_availability\u0027))"},{"line_number":467,"context_line":"        super(NetworkIpAvailabilityExtRbacTest, self).setUp()"},{"line_number":468,"context_line":""},{"line_number":469,"context_line":"    @utils.requires_ext(extension\u003d\u0027network-ip-availability\u0027, service\u003d\u0027network\u0027)"},{"line_number":470,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":471,"context_line":"                                 rules\u003d[\"get_network_ip_availability\"],"},{"line_number":472,"context_line":"                                 expected_error_codes\u003d[404])"}],"source_content_type":"text/x-python","patch_set":20,"id":"3f79a3b5_b175d936","line":469,"in_reply_to":"3f79a3b5_102daefb","updated":"2018-11-15 20:41:27.000000000","message":"Done","commit_id":"71cdfe43f3e89c9a4711a4c37c3247ed94b461bd"}]}
