)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":20190,"name":"zhufl","email":"zhu.fanglei@zte.com.cn","username":"zhufl"},"change_message_id":"1a623065a7b7165887a94e083c313e4c622aee7a","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Optimize and enhance the code of \"test_routers.py\""},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Most of test cases under \"test_routers.py\" are not using base network"},{"line_number":10,"context_line":"class method but instead of that creating their own methods."},{"line_number":11,"context_line":"So this patch will enhance the code and will use the base network class"},{"line_number":12,"context_line":"methods."},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"3f79a3b5_ed3b7fc5","line":10,"range":{"start_line":9,"start_character":43,"end_line":10,"end_character":59},"updated":"2018-08-30 06:32:07.000000000","message":"sorry I don\u0027t catch it, _create_router is base.create_helper + addCleanup, so if you remove _create_router, you will have to add addCleanup after every calling of base.create_router.","commit_id":"902ae979aeba4dd4f774740e878a7ffa100e1293"}],"tempest/api/network/test_routers.py":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"d18974b69271ce727b48b37d0ddf9de5aeed0621","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        self.delete_router(router)"},{"line_number":32,"context_line":"        self.routers.remove(router)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def _create_network(self):"},{"line_number":35,"context_line":"        network_name \u003d data_utils.rand_name(self.__class__.__name__)"},{"line_number":36,"context_line":"        network \u003d self.networks_client.create_network("},{"line_number":37,"context_line":"            name\u003dnetwork_name)[\u0027network\u0027]"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_0106321c","line":34,"updated":"2018-07-19 05:12:52.000000000","message":"We can use create_network helper in base network class instead: https://github.com/openstack/tempest/blob/b286ad402e6bd60f33dfd8251d6cf1ed1ceae69d/tempest/api/network/base.py#L103","commit_id":"ad8cd42ac55196c76caeae991601aca2062dfb55"},{"author":{"_account_id":27078,"name":"Manik Bindlish","email":"manikbindlish19@gmail.com","username":"manik"},"change_message_id":"d16c08bbf79b5808b932fc43c7c6c2fb345add08","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        self.delete_router(router)"},{"line_number":32,"context_line":"        self.routers.remove(router)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def _create_network(self):"},{"line_number":35,"context_line":"        network_name \u003d data_utils.rand_name(self.__class__.__name__)"},{"line_number":36,"context_line":"        network \u003d self.networks_client.create_network("},{"line_number":37,"context_line":"            name\u003dnetwork_name)[\u0027network\u0027]"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_e1553653","line":34,"in_reply_to":"5f7c97a3_0106321c","updated":"2018-07-19 05:38:19.000000000","message":"yeah we can use that.\nIs it also fine to use create_router, create_subnet from base class?","commit_id":"ad8cd42ac55196c76caeae991601aca2062dfb55"},{"author":{"_account_id":27078,"name":"Manik Bindlish","email":"manikbindlish19@gmail.com","username":"manik"},"change_message_id":"f92929c6a8c8e02e014987c0a80fee4f635682e8","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        self.delete_router(router)"},{"line_number":32,"context_line":"        self.routers.remove(router)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def _create_network(self):"},{"line_number":35,"context_line":"        network_name \u003d data_utils.rand_name(self.__class__.__name__)"},{"line_number":36,"context_line":"        network \u003d self.networks_client.create_network("},{"line_number":37,"context_line":"            name\u003dnetwork_name)[\u0027network\u0027]"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_2c931e02","line":34,"in_reply_to":"5f7c97a3_81fc820d","updated":"2018-07-19 10:32:10.000000000","message":"I just checked:\nwe are calling create_network, create_subnet and create_router of base class and adding \"addCleanup\" here in test_routers.py\n\nI think we cann\u0027t add \"addCleanup\" in base network class for these: create_network, create_subnet and create_router. It can fail at other places where we don\u0027t have need of \"addCleanup\n\"\nCase1:\nIf we can add \"addCleanup\" in base network class then you recommendation is fine.\n\nCase2: \nIf we cann\u0027t add \"addCleanup\" in base network class:\nIn this test_routers.py file, I can directly call these base network class methods and will add \"addCleanup\" in each test wherever is required.\nBut again it will create much of repeated code. \nSo the solution is creating new method in test file(test_routers.py) and use them in tests which is already done in this patch.\n\nPlease suggest on this?","commit_id":"ad8cd42ac55196c76caeae991601aca2062dfb55"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"47167127025f0c5961cffba3cfba763cfba62461","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        self.delete_router(router)"},{"line_number":32,"context_line":"        self.routers.remove(router)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def _create_network(self):"},{"line_number":35,"context_line":"        network_name \u003d data_utils.rand_name(self.__class__.__name__)"},{"line_number":36,"context_line":"        network \u003d self.networks_client.create_network("},{"line_number":37,"context_line":"            name\u003dnetwork_name)[\u0027network\u0027]"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_81fc820d","line":34,"in_reply_to":"5f7c97a3_e1553653","updated":"2018-07-19 05:43:07.000000000","message":"Yes, I think that would be good too, so long as it works. It looks like the implementations in the base class are more robust anyway.","commit_id":"ad8cd42ac55196c76caeae991601aca2062dfb55"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"1d208d1f6d119cd577d1ada2333767b48fe69068","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    @decorators.attr(type\u003d\u0027smoke\u0027)"},{"line_number":103,"context_line":"    @decorators.idempotent_id(\u0027b42e6e39-2e37-49cc-a6f4-8467e940900a\u0027)"},{"line_number":104,"context_line":"    def test_add_remove_router_interface_with_subnet_id(self):"},{"line_number":105,"context_line":"        network_name \u003d data_utils.rand_name(self.__class__.__name__)"},{"line_number":106,"context_line":"        network \u003d self.networks_client.create_network("},{"line_number":107,"context_line":"            name\u003dnetwork_name)[\u0027network\u0027]"},{"line_number":108,"context_line":"        self.addCleanup(self.networks_client.delete_network,"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_3dd22161","side":"PARENT","line":105,"range":{"start_line":105,"start_character":8,"end_line":105,"end_character":68},"updated":"2018-08-03 07:26:24.000000000","message":"ou","commit_id":"8f6f0c5e5569ce8a2b211839235aecc8177eaf11"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"1d208d1f6d119cd577d1ada2333767b48fe69068","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    @decorators.attr(type\u003d\u0027smoke\u0027)"},{"line_number":126,"context_line":"    @decorators.idempotent_id(\u00272b7d2f37-6748-4d78-92e5-1d590234f0d5\u0027)"},{"line_number":127,"context_line":"    def test_add_remove_router_interface_with_port_id(self):"},{"line_number":128,"context_line":"        network_name \u003d data_utils.rand_name(self.__class__.__name__)"},{"line_number":129,"context_line":"        network \u003d self.networks_client.create_network("},{"line_number":130,"context_line":"            name\u003dnetwork_name)[\u0027network\u0027]"},{"line_number":131,"context_line":"        self.addCleanup(self.networks_client.delete_network,"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_9de1f534","side":"PARENT","line":128,"range":{"start_line":128,"start_character":8,"end_line":128,"end_character":68},"updated":"2018-08-03 07:26:24.000000000","message":"we should not remove the name param which is being used for debug purpose","commit_id":"8f6f0c5e5569ce8a2b211839235aecc8177eaf11"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"1d497021012b808db7af99cf84c58a92cf4506e4","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    @decorators.attr(type\u003d\u0027smoke\u0027)"},{"line_number":126,"context_line":"    @decorators.idempotent_id(\u00272b7d2f37-6748-4d78-92e5-1d590234f0d5\u0027)"},{"line_number":127,"context_line":"    def test_add_remove_router_interface_with_port_id(self):"},{"line_number":128,"context_line":"        network_name \u003d data_utils.rand_name(self.__class__.__name__)"},{"line_number":129,"context_line":"        network \u003d self.networks_client.create_network("},{"line_number":130,"context_line":"            name\u003dnetwork_name)[\u0027network\u0027]"},{"line_number":131,"context_line":"        self.addCleanup(self.networks_client.delete_network,"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_e5288bee","side":"PARENT","line":128,"range":{"start_line":128,"start_character":8,"end_line":128,"end_character":68},"in_reply_to":"5f7c97a3_8cf8e47e","updated":"2018-08-03 12:47:21.000000000","message":"there should not be in service client method. here we use self.__class__.__name__ which helps to identify which test class resource this is","commit_id":"8f6f0c5e5569ce8a2b211839235aecc8177eaf11"},{"author":{"_account_id":27078,"name":"Manik Bindlish","email":"manikbindlish19@gmail.com","username":"manik"},"change_message_id":"e72a211672c5e951022b1f695eda432cf42bafca","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    @decorators.attr(type\u003d\u0027smoke\u0027)"},{"line_number":126,"context_line":"    @decorators.idempotent_id(\u00272b7d2f37-6748-4d78-92e5-1d590234f0d5\u0027)"},{"line_number":127,"context_line":"    def test_add_remove_router_interface_with_port_id(self):"},{"line_number":128,"context_line":"        network_name \u003d data_utils.rand_name(self.__class__.__name__)"},{"line_number":129,"context_line":"        network \u003d self.networks_client.create_network("},{"line_number":130,"context_line":"            name\u003dnetwork_name)[\u0027network\u0027]"},{"line_number":131,"context_line":"        self.addCleanup(self.networks_client.delete_network,"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_8cf8e47e","side":"PARENT","line":128,"range":{"start_line":128,"start_character":8,"end_line":128,"end_character":68},"in_reply_to":"5f7c97a3_9de1f534","updated":"2018-08-03 09:48:05.000000000","message":"I remove because: rand_name is already used in create_network method.\nGot your point, I will re-use rand_name here too","commit_id":"8f6f0c5e5569ce8a2b211839235aecc8177eaf11"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"51e5c78c3e6db141b3d59018f08a57170f10ff02","unresolved":false,"context_lines":[{"line_number":58,"context_line":"            router_name,"},{"line_number":59,"context_line":"            admin_state_up\u003dFalse,"},{"line_number":60,"context_line":"            external_network_id\u003dCONF.network.public_network_id)"},{"line_number":61,"context_line":"        self.addCleanup(self.routers_client.delete_router, router[\u0027id\u0027])"},{"line_number":62,"context_line":"        self.assertEqual(router[\u0027name\u0027], router_name)"},{"line_number":63,"context_line":"        self.assertEqual(router[\u0027admin_state_up\u0027], False)"},{"line_number":64,"context_line":"        self.assertEqual("}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_2063d1ad","line":61,"range":{"start_line":61,"start_character":69,"end_line":61,"end_character":72},"updated":"2018-08-03 13:21:15.000000000","message":"here we should remove created router from self.routers base variable. \n\nBut those variable are confusing. i am removing them in this[1], you can rebase your patch on top of mine. \n\n[1] https://review.openstack.org/#/c/588548/","commit_id":"ea02e544e8f7985ef3c950cab92336e46ad04275"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"9d641d621edc97310192f92e05020a468c398211","unresolved":false,"context_lines":[{"line_number":58,"context_line":"            router_name,"},{"line_number":59,"context_line":"            admin_state_up\u003dFalse,"},{"line_number":60,"context_line":"            external_network_id\u003dCONF.network.public_network_id)"},{"line_number":61,"context_line":"        self.addCleanup(self.routers_client.delete_router, router[\u0027id\u0027])"},{"line_number":62,"context_line":"        self.assertEqual(router[\u0027name\u0027], router_name)"},{"line_number":63,"context_line":"        self.assertEqual(router[\u0027admin_state_up\u0027], False)"},{"line_number":64,"context_line":"        self.assertEqual("}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_0ec44390","line":61,"range":{"start_line":61,"start_character":69,"end_line":61,"end_character":72},"in_reply_to":"3f79a3b5_a931c9ee","updated":"2018-08-12 09:31:25.000000000","message":"but you have ignored the self.routers.remove(router) from L32 which will cause issue of keeping router on self.routers and deleting it directly on neutron. and self.routers are used by other tests to check the existing router. \n\nSo if you remove the class level created resources at test level then you need to take care of those class level variable also which hold the information about those created resource. \n\nWhich i am fixing to get rid of those class level variable so that you patch of removing them at test level will be no issue.","commit_id":"ea02e544e8f7985ef3c950cab92336e46ad04275"},{"author":{"_account_id":27078,"name":"Manik Bindlish","email":"manikbindlish19@gmail.com","username":"manik"},"change_message_id":"5f00d37106e30a043349cfcd123c5762f9ef5db0","unresolved":false,"context_lines":[{"line_number":58,"context_line":"            router_name,"},{"line_number":59,"context_line":"            admin_state_up\u003dFalse,"},{"line_number":60,"context_line":"            external_network_id\u003dCONF.network.public_network_id)"},{"line_number":61,"context_line":"        self.addCleanup(self.routers_client.delete_router, router[\u0027id\u0027])"},{"line_number":62,"context_line":"        self.assertEqual(router[\u0027name\u0027], router_name)"},{"line_number":63,"context_line":"        self.assertEqual(router[\u0027admin_state_up\u0027], False)"},{"line_number":64,"context_line":"        self.assertEqual("}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_a931c9ee","line":61,"range":{"start_line":61,"start_character":69,"end_line":61,"end_character":72},"in_reply_to":"5f7c97a3_2063d1ad","updated":"2018-08-09 07:37:28.000000000","message":"In my patch set, I am removing \"_cleanup_router\", \"_create_router\" and \"_create_subnet\".\nSo re-basing on \"https://review.openstack.org/#/c/588548/\" will not have advantage. Whatever changed in this patch will be removed from my patch.","commit_id":"ea02e544e8f7985ef3c950cab92336e46ad04275"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"1d208d1f6d119cd577d1ada2333767b48fe69068","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        # Update router extra route, second ip of the range is"},{"line_number":182,"context_line":"        # used as next hop"},{"line_number":183,"context_line":"        for i in range(routes_num):"},{"line_number":184,"context_line":"            network \u003d self.networks_client.create_network()[\u0027network\u0027]"},{"line_number":185,"context_line":"            self.addCleanup(self.networks_client.delete_network,"},{"line_number":186,"context_line":"                            network[\u0027id\u0027])"},{"line_number":187,"context_line":"            subnet \u003d self.create_subnet(network, cidr\u003dnext_cidr)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_bde63149","line":184,"range":{"start_line":184,"start_character":12,"end_line":184,"end_character":70},"updated":"2018-08-03 07:26:24.000000000","message":"ditto","commit_id":"ea02e544e8f7985ef3c950cab92336e46ad04275"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"1d208d1f6d119cd577d1ada2333767b48fe69068","unresolved":false,"context_lines":[{"line_number":245,"context_line":"    @decorators.attr(type\u003d\u0027smoke\u0027)"},{"line_number":246,"context_line":"    @decorators.idempotent_id(\u0027802c73c9-c937-4cef-824b-2191e24a6aab\u0027)"},{"line_number":247,"context_line":"    def test_add_multiple_router_interfaces(self):"},{"line_number":248,"context_line":"        network01 \u003d self.networks_client.create_network()[\u0027network\u0027]"},{"line_number":249,"context_line":"        self.addCleanup(self.networks_client.delete_network,"},{"line_number":250,"context_line":"                        network01[\u0027id\u0027])"},{"line_number":251,"context_line":"        network02 \u003d self.networks_client.create_network()[\u0027network\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_5deb5d10","line":248,"range":{"start_line":248,"start_character":63,"end_line":248,"end_character":68},"updated":"2018-08-03 07:26:24.000000000","message":"ditto","commit_id":"ea02e544e8f7985ef3c950cab92336e46ad04275"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"1d208d1f6d119cd577d1ada2333767b48fe69068","unresolved":false,"context_lines":[{"line_number":269,"context_line":""},{"line_number":270,"context_line":"    @decorators.idempotent_id(\u002796522edf-b4b5-45d9-8443-fa11c26e6eff\u0027)"},{"line_number":271,"context_line":"    def test_router_interface_port_update_with_fixed_ip(self):"},{"line_number":272,"context_line":"        network \u003d self.networks_client.create_network()[\u0027network\u0027]"},{"line_number":273,"context_line":"        self.addCleanup(self.networks_client.delete_network,"},{"line_number":274,"context_line":"                        network[\u0027id\u0027])"},{"line_number":275,"context_line":"        subnet \u003d self.create_subnet(network)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_1dd5e548","line":272,"range":{"start_line":272,"start_character":0,"end_line":272,"end_character":66},"updated":"2018-08-03 07:26:24.000000000","message":"ditto","commit_id":"ea02e544e8f7985ef3c950cab92336e46ad04275"},{"author":{"_account_id":20190,"name":"zhufl","email":"zhu.fanglei@zte.com.cn","username":"zhufl"},"change_message_id":"1a623065a7b7165887a94e083c313e4c622aee7a","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class RoutersTest(base.BaseNetworkTest):"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def _cleanup_router(self, router):"},{"line_number":31,"context_line":"        self.delete_router(router)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def _create_router(self, name\u003dNone, admin_state_up\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_6d9e8fb9","side":"PARENT","line":30,"range":{"start_line":30,"start_character":8,"end_line":30,"end_character":23},"updated":"2018-08-30 06:32:07.000000000","message":"ok to remove this oneline helper","commit_id":"fe84ecb51695fd22c3469da1c11b1c0e3d5cba02"},{"author":{"_account_id":20190,"name":"zhufl","email":"zhu.fanglei@zte.com.cn","username":"zhufl"},"change_message_id":"1a623065a7b7165887a94e083c313e4c622aee7a","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    def _cleanup_router(self, router):"},{"line_number":31,"context_line":"        self.delete_router(router)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def _create_router(self, name\u003dNone, admin_state_up\u003dFalse,"},{"line_number":34,"context_line":"                       external_network_id\u003dNone, enable_snat\u003dNone):"},{"line_number":35,"context_line":"        # associate a cleanup with created routers to avoid quota limits"},{"line_number":36,"context_line":"        router \u003d self.create_router(name, admin_state_up,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_0d7cbb70","side":"PARENT","line":33,"range":{"start_line":33,"start_character":8,"end_line":33,"end_character":22},"updated":"2018-08-30 06:32:07.000000000","message":"this is base.create_router + addCleanup, so if you remove this, you will have to add addCleanup  after every calling of base.create_router.","commit_id":"fe84ecb51695fd22c3469da1c11b1c0e3d5cba02"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"f4e1b52ac41c456a9a413caca9899bbc56282884","unresolved":false,"context_lines":[{"line_number":58,"context_line":"            router_name,"},{"line_number":59,"context_line":"            admin_state_up\u003dFalse,"},{"line_number":60,"context_line":"            external_network_id\u003dCONF.network.public_network_id)"},{"line_number":61,"context_line":"        self.addCleanup(self.routers_client.delete_router, router[\u0027id\u0027])"},{"line_number":62,"context_line":"        self.assertEqual(router[\u0027name\u0027], router_name)"},{"line_number":63,"context_line":"        self.assertEqual(router[\u0027admin_state_up\u0027], False)"},{"line_number":64,"context_line":"        self.assertEqual("}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_45d59f42","line":61,"range":{"start_line":61,"start_character":24,"end_line":61,"end_character":71},"updated":"2018-08-30 14:31:18.000000000","message":"This isn\u0027t the same logic as L31. self.delete_router is this: https://github.com/openstack/tempest/blob/693515dd63b54a563bb6a5c2f0d7ee92f3324d2c/tempest/api/network/base.py#L213\n\nI think it would be safer to maintain the current helper function call so that we don\u0027t miss cleaning up an interface.","commit_id":"902ae979aeba4dd4f774740e878a7ffa100e1293"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"f4e1b52ac41c456a9a413caca9899bbc56282884","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        subnet \u003d self.create_subnet(network)"},{"line_number":95,"context_line":"        self.addCleanup(self.subnets_client.delete_subnet, subnet[\u0027id\u0027])"},{"line_number":96,"context_line":"        router \u003d self.create_router()"},{"line_number":97,"context_line":"        self.addCleanup(self.routers_client.delete_router, router[\u0027id\u0027])"},{"line_number":98,"context_line":"        # Add router interface with subnet id"},{"line_number":99,"context_line":"        interface \u003d self.routers_client.add_router_interface("},{"line_number":100,"context_line":"            router[\u0027id\u0027], subnet_id\u003dsubnet[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_e525cb5d","line":97,"updated":"2018-08-30 14:31:18.000000000","message":"Ditto here and below as well.","commit_id":"902ae979aeba4dd4f774740e878a7ffa100e1293"}]}
