)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":18600,"name":"Ferenc Horváth","email":"hferenc@inf.u-szeged.hu","username":"hferenc"},"change_message_id":"5ae31b5c3cfadfa88356151aa2034fb9d49fa6f0","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add skip if public_network_id is not specified"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If public_network_id is not specified in tempest.conf,"},{"line_number":10,"context_line":"the testcases using it should be skipped, othersize we will"},{"line_number":11,"context_line":"get errors like:"},{"line_number":12,"context_line":"    BadRequest: Bad request"},{"line_number":13,"context_line":"    Details: {u\u0027message\u0027: u\"Invalid input for external_gateway_info."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"1a430d35_84ae01e4","line":10,"range":{"start_line":10,"start_character":42,"end_line":10,"end_character":51},"updated":"2017-02-08 10:43:46.000000000","message":"otherwise","commit_id":"326f54ecf255203986ca9e4d0e696fa7915a48fb"},{"author":{"_account_id":20190,"name":"zhufl","email":"zhu.fanglei@zte.com.cn","username":"zhufl"},"change_message_id":"fbddf5970217053ade98f84f86470488b4a9ca5f","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add skip if public_network_id is not specified"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If public_network_id is not specified in tempest.conf,"},{"line_number":10,"context_line":"the testcases using it should be skipped, othersize we will"},{"line_number":11,"context_line":"get errors like:"},{"line_number":12,"context_line":"    BadRequest: Bad request"},{"line_number":13,"context_line":"    Details: {u\u0027message\u0027: u\"Invalid input for external_gateway_info."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"1a430d35_23e7d9ac","line":10,"range":{"start_line":10,"start_character":42,"end_line":10,"end_character":51},"in_reply_to":"1a430d35_84ae01e4","updated":"2017-02-09 03:18:37.000000000","message":"done","commit_id":"326f54ecf255203986ca9e4d0e696fa7915a48fb"},{"author":{"_account_id":18600,"name":"Ferenc Horváth","email":"hferenc@inf.u-szeged.hu","username":"hferenc"},"change_message_id":"5ae31b5c3cfadfa88356151aa2034fb9d49fa6f0","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Testcases in scenario will create network resources by default unless"},{"line_number":22,"context_line":"cls.set_network_resources() is called, so this is to add calling"},{"line_number":23,"context_line":"cls.prepare_instance_network for thoses testcases that will use"},{"line_number":24,"context_line":"floating ip, and skip in prepare_instance_network if public_network_id"},{"line_number":25,"context_line":"is not set."},{"line_number":26,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"1a430d35_c48ba966","line":23,"range":{"start_line":23,"start_character":33,"end_line":23,"end_character":39},"updated":"2017-02-08 10:43:46.000000000","message":"those","commit_id":"326f54ecf255203986ca9e4d0e696fa7915a48fb"},{"author":{"_account_id":20190,"name":"zhufl","email":"zhu.fanglei@zte.com.cn","username":"zhufl"},"change_message_id":"fbddf5970217053ade98f84f86470488b4a9ca5f","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Testcases in scenario will create network resources by default unless"},{"line_number":22,"context_line":"cls.set_network_resources() is called, so this is to add calling"},{"line_number":23,"context_line":"cls.prepare_instance_network for thoses testcases that will use"},{"line_number":24,"context_line":"floating ip, and skip in prepare_instance_network if public_network_id"},{"line_number":25,"context_line":"is not set."},{"line_number":26,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"1a430d35_43ea2575","line":23,"range":{"start_line":23,"start_character":33,"end_line":23,"end_character":39},"in_reply_to":"1a430d35_c48ba966","updated":"2017-02-09 03:18:37.000000000","message":"done","commit_id":"326f54ecf255203986ca9e4d0e696fa7915a48fb"}],"tempest/api/network/admin/test_external_networks_negative.py":[{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"489a63ef5c6c40eb10042ef8792b66477d88bd24","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from tempest.lib.common.utils import test_utils"},{"line_number":19,"context_line":"from tempest.lib import exceptions as lib_exc"},{"line_number":20,"context_line":"from tempest import test"},{"line_number":21,"context_line":"import testtools"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"CONF \u003d config.CONF"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5a3905b3_2f25cfaa","line":21,"updated":"2017-01-19 10:44:30.000000000","message":"This import is not grouped as per http://docs.openstack.org/developer/hacking/#imports","commit_id":"8a7d1f0d923e4c696f2ba9ea60d881194b94775b"},{"author":{"_account_id":20190,"name":"zhufl","email":"zhu.fanglei@zte.com.cn","username":"zhufl"},"change_message_id":"bf72385491b41de282771e697916f511fcfb5d05","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from tempest.lib.common.utils import test_utils"},{"line_number":19,"context_line":"from tempest.lib import exceptions as lib_exc"},{"line_number":20,"context_line":"from tempest import test"},{"line_number":21,"context_line":"import testtools"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"CONF \u003d config.CONF"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5a3905b3_85303a03","line":21,"in_reply_to":"5a3905b3_2f25cfaa","updated":"2017-01-20 00:45:04.000000000","message":"Thanks, done","commit_id":"8a7d1f0d923e4c696f2ba9ea60d881194b94775b"}],"tempest/api/network/admin/test_floating_ips_admin_actions.py":[{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"489a63ef5c6c40eb10042ef8792b66477d88bd24","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    @classmethod"},{"line_number":40,"context_line":"    def resource_setup(cls):"},{"line_number":41,"context_line":"        super(FloatingIPAdminTestJSON, cls).resource_setup()"},{"line_number":42,"context_line":"        if not CONF.network.public_network_id:"},{"line_number":43,"context_line":"            raise cls.skipException(\u0027public_network_id must be defined.\u0027)"},{"line_number":44,"context_line":"        cls.ext_net_id \u003d CONF.network.public_network_id"},{"line_number":45,"context_line":"        cls.floating_ip \u003d cls.create_floatingip(cls.ext_net_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a3905b3_cf9a8bc5","line":42,"updated":"2017-01-19 10:44:30.000000000","message":"This check should be in the skip_checks() method (L28)","commit_id":"8a7d1f0d923e4c696f2ba9ea60d881194b94775b"},{"author":{"_account_id":20190,"name":"zhufl","email":"zhu.fanglei@zte.com.cn","username":"zhufl"},"change_message_id":"bf72385491b41de282771e697916f511fcfb5d05","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    @classmethod"},{"line_number":40,"context_line":"    def resource_setup(cls):"},{"line_number":41,"context_line":"        super(FloatingIPAdminTestJSON, cls).resource_setup()"},{"line_number":42,"context_line":"        if not CONF.network.public_network_id:"},{"line_number":43,"context_line":"            raise cls.skipException(\u0027public_network_id must be defined.\u0027)"},{"line_number":44,"context_line":"        cls.ext_net_id \u003d CONF.network.public_network_id"},{"line_number":45,"context_line":"        cls.floating_ip \u003d cls.create_floatingip(cls.ext_net_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a3905b3_080a9f21","line":42,"in_reply_to":"5a3905b3_cf9a8bc5","updated":"2017-01-20 00:45:04.000000000","message":"Thanks, it is hear because in resource_setup public_network_id is used, which is ahead of skip_checks:)","commit_id":"8a7d1f0d923e4c696f2ba9ea60d881194b94775b"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"18ffa88ff27fdf3df55fc6996579f726a88185c0","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    def resource_setup(cls):"},{"line_number":41,"context_line":"        super(FloatingIPAdminTestJSON, cls).resource_setup()"},{"line_number":42,"context_line":"        if not CONF.network.public_network_id:"},{"line_number":43,"context_line":"            raise cls.skipException(\u0027public_network_id must be defined.\u0027)"},{"line_number":44,"context_line":"        cls.ext_net_id \u003d CONF.network.public_network_id"},{"line_number":45,"context_line":"        cls.floating_ip \u003d cls.create_floatingip(cls.ext_net_id)"},{"line_number":46,"context_line":"        cls.network \u003d cls.create_network()"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a3905b3_a0193b8a","line":43,"updated":"2017-01-23 10:23:20.000000000","message":"Tempest coding convention is that you should group all the logic that decides whether a test class is going to be skipped in the skip_check() method. You can read the definition of the skip_checks() method in tempest/test.py","commit_id":"97ed5b454b28005b4b085577640fdf14da9cb9b1"}],"tempest/api/network/test_floating_ips.py":[{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"489a63ef5c6c40eb10042ef8792b66477d88bd24","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    @classmethod"},{"line_number":50,"context_line":"    def resource_setup(cls):"},{"line_number":51,"context_line":"        super(FloatingIPTestJSON, cls).resource_setup()"},{"line_number":52,"context_line":"        if not CONF.network.public_network_id:"},{"line_number":53,"context_line":"            raise cls.skipException(\u0027public_network_id must be defined.\u0027)"},{"line_number":54,"context_line":"        cls.ext_net_id \u003d CONF.network.public_network_id"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5a3905b3_0fa57303","line":52,"updated":"2017-01-19 10:44:30.000000000","message":"same","commit_id":"8a7d1f0d923e4c696f2ba9ea60d881194b94775b"}],"tempest/api/network/test_floating_ips_negative.py":[{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"489a63ef5c6c40eb10042ef8792b66477d88bd24","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    @classmethod"},{"line_number":41,"context_line":"    def resource_setup(cls):"},{"line_number":42,"context_line":"        super(FloatingIPNegativeTestJSON, cls).resource_setup()"},{"line_number":43,"context_line":"        if not CONF.network.public_network_id:"},{"line_number":44,"context_line":"            raise cls.skipException(\u0027public_network_id must be defined.\u0027)"},{"line_number":45,"context_line":"        cls.ext_net_id \u003d CONF.network.public_network_id"},{"line_number":46,"context_line":"        # Create a network with a subnet connected to a router."}],"source_content_type":"text/x-python","patch_set":2,"id":"5a3905b3_4faf7be3","line":43,"updated":"2017-01-19 10:44:30.000000000","message":"same","commit_id":"8a7d1f0d923e4c696f2ba9ea60d881194b94775b"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"55e339b72e93b81cbccdcab57e21cfabaa046a60","unresolved":false,"context_lines":[{"line_number":38,"context_line":"            msg \u003d \"router extension not enabled.\""},{"line_number":39,"context_line":"            raise cls.skipException(msg)"},{"line_number":40,"context_line":"        if not CONF.network.public_network_id:"},{"line_number":41,"context_line":"            msg \u003d \"public_network_id must be defined.\""},{"line_number":42,"context_line":"            raise cls.skipException(msg)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a430d35_3fa8f4da","line":41,"updated":"2017-02-08 11:08:13.000000000","message":"\"The public_network_id option must be specified.\" is clearer.","commit_id":"326f54ecf255203986ca9e4d0e696fa7915a48fb"},{"author":{"_account_id":20190,"name":"zhufl","email":"zhu.fanglei@zte.com.cn","username":"zhufl"},"change_message_id":"fbddf5970217053ade98f84f86470488b4a9ca5f","unresolved":false,"context_lines":[{"line_number":38,"context_line":"            msg \u003d \"router extension not enabled.\""},{"line_number":39,"context_line":"            raise cls.skipException(msg)"},{"line_number":40,"context_line":"        if not CONF.network.public_network_id:"},{"line_number":41,"context_line":"            msg \u003d \"public_network_id must be defined.\""},{"line_number":42,"context_line":"            raise cls.skipException(msg)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a430d35_c348d5b5","line":41,"in_reply_to":"1a430d35_3fa8f4da","updated":"2017-02-09 03:18:37.000000000","message":"Done","commit_id":"326f54ecf255203986ca9e4d0e696fa7915a48fb"}],"tempest/api/network/test_routers.py":[{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"489a63ef5c6c40eb10042ef8792b66477d88bd24","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from tempest.common.utils import data_utils"},{"line_number":20,"context_line":"from tempest import config"},{"line_number":21,"context_line":"from tempest import test"},{"line_number":22,"context_line":"import testtools"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"CONF \u003d config.CONF"},{"line_number":25,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5a3905b3_afb61f3b","line":22,"updated":"2017-01-19 10:44:30.000000000","message":"This import should be right after L16","commit_id":"8a7d1f0d923e4c696f2ba9ea60d881194b94775b"},{"author":{"_account_id":20190,"name":"zhufl","email":"zhu.fanglei@zte.com.cn","username":"zhufl"},"change_message_id":"bf72385491b41de282771e697916f511fcfb5d05","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from tempest.common.utils import data_utils"},{"line_number":20,"context_line":"from tempest import config"},{"line_number":21,"context_line":"from tempest import test"},{"line_number":22,"context_line":"import testtools"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"CONF \u003d config.CONF"},{"line_number":25,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5a3905b3_e5349efc","line":22,"in_reply_to":"5a3905b3_afb61f3b","updated":"2017-01-20 00:45:04.000000000","message":"Thanks, done","commit_id":"8a7d1f0d923e4c696f2ba9ea60d881194b94775b"}],"tempest/common/dynamic_creds.py":[{"author":{"_account_id":17716,"name":"Luz Cazares","email":"luz.cazares@intel.com","username":"luzcazares"},"change_message_id":"17c890b1be1fe739c91a218d7649ac280966eda7","unresolved":false,"context_lines":[{"line_number":296,"context_line":"        kwargs \u003d {\u0027name\u0027: router_name,"},{"line_number":297,"context_line":"                  \u0027tenant_id\u0027: tenant_id}"},{"line_number":298,"context_line":"        if self.public_network_id:"},{"line_number":299,"context_line":"            external_net_id \u003d dict("},{"line_number":300,"context_line":"                network_id\u003dself.public_network_id)"},{"line_number":301,"context_line":"            kwargs[\u0027external_gateway_info\u0027] \u003d external_net_id"},{"line_number":302,"context_line":"        resp_body \u003d self.routers_admin_client.create_router(**kwargs)"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa31d9ce_fd004c68","line":299,"range":{"start_line":299,"start_character":12,"end_line":299,"end_character":29},"updated":"2017-02-14 15:23:16.000000000","message":"nit: this var can be omitted,assigning dict to kwargs directly","commit_id":"a3e245000b31eb27059e6fc0a53f978879147be7"}],"tempest/scenario/manager.py":[{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"55e339b72e93b81cbccdcab57e21cfabaa046a60","unresolved":false,"context_lines":[{"line_number":90,"context_line":"    @classmethod"},{"line_number":91,"context_line":"    def prepare_instance_network(cls):"},{"line_number":92,"context_line":"        if not CONF.network.public_network_id:"},{"line_number":93,"context_line":"            raise cls.skipException(\"public_network_id must be defined to \""},{"line_number":94,"context_line":"                                    \"use floating ip.\")"},{"line_number":95,"context_line":"        cls.set_network_resources(network\u003dTrue, subnet\u003dTrue, router\u003dTrue,"},{"line_number":96,"context_line":"                                  dhcp\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a430d35_1ff17801","line":93,"updated":"2017-02-08 11:08:13.000000000","message":"You should add the word \u0027option\u0027 or \u0027config option\u0027 here to male this message clearer.","commit_id":"326f54ecf255203986ca9e4d0e696fa7915a48fb"},{"author":{"_account_id":20190,"name":"zhufl","email":"zhu.fanglei@zte.com.cn","username":"zhufl"},"change_message_id":"fbddf5970217053ade98f84f86470488b4a9ca5f","unresolved":false,"context_lines":[{"line_number":90,"context_line":"    @classmethod"},{"line_number":91,"context_line":"    def prepare_instance_network(cls):"},{"line_number":92,"context_line":"        if not CONF.network.public_network_id:"},{"line_number":93,"context_line":"            raise cls.skipException(\"public_network_id must be defined to \""},{"line_number":94,"context_line":"                                    \"use floating ip.\")"},{"line_number":95,"context_line":"        cls.set_network_resources(network\u003dTrue, subnet\u003dTrue, router\u003dTrue,"},{"line_number":96,"context_line":"                                  dhcp\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a430d35_c3dff5d3","line":93,"in_reply_to":"1a430d35_1ff17801","updated":"2017-02-09 03:18:37.000000000","message":"Done. (now this is removed)","commit_id":"326f54ecf255203986ca9e4d0e696fa7915a48fb"}],"tempest/test.py":[{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"1c7759bf23a1c8ecd990c8df1f9da803da0b8238","unresolved":false,"context_lines":[{"line_number":336,"context_line":"            elif cls.identity_version \u003d\u003d \u0027v3\u0027:"},{"line_number":337,"context_line":"                if not CONF.identity_feature_enabled.api_v3:"},{"line_number":338,"context_line":"                    raise cls.skipException(\"Identity api v3 is not enabled\")"},{"line_number":339,"context_line":"        if ((not CONF.network.public_network_id) and"},{"line_number":340,"context_line":"            CONF.auth.use_dynamic_credentials and"},{"line_number":341,"context_line":"            CONF.auth.create_isolated_networks):"},{"line_number":342,"context_line":"            raise cls.skipException(\"public_network_id must be defined to \""},{"line_number":343,"context_line":"                                    \"create router.\")"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"    @classmethod"},{"line_number":346,"context_line":"    def setup_credentials(cls):"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a430d35_bce7363f","line":343,"range":{"start_line":339,"start_character":0,"end_line":343,"end_character":53},"updated":"2017-02-03 14:11:09.000000000","message":"I think I see where you\u0027re coming from, but I don\u0027t think this is a good idea.\n\nFirst of all the provisioning of network resources is defined on a per test class basis. So this would skip tests that do not even request a router to be provisioned at all.\n\nThe other issue here is that it\u0027s not necessarily true that requiring a router means requiring external access. A router can be created without an external network defined (http://developer.openstack.org/api-ref/networking/v2/?expanded\u003dcreate-router-detail#routers-routers).\n\nSo I think we should have a skip on public_network_id only in test that actually require external access.\n\nIt is true though that this _create_router (http://git.openstack.org/cgit/openstack/tempest/tree/tempest/common/dynamic_creds.py#n295) might be problematic, as it assumes the public_network_id is available. There are two ways we could address that:\n\n- only pass ext nw to the request if one is configured\n- or else if we want to assume that requesting a router for a test implies requesting external connectivity, than we could raise an exception in _create_router if case no public network is configured, and catch the exception here, and skip accordingly","commit_id":"f8b8a462712797241d0737f9a40c38404ec92916"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"55e339b72e93b81cbccdcab57e21cfabaa046a60","unresolved":false,"context_lines":[{"line_number":599,"context_line":"        # a chain of overloaded methods, the attribute is set only"},{"line_number":600,"context_line":"        # in the leaf class"},{"line_number":601,"context_line":"        if not cls.network_resources:"},{"line_number":602,"context_line":"            if router and not CONF.network.public_network_id:"},{"line_number":603,"context_line":"                raise cls.skipException(\"public_network_id must be defined to \""},{"line_number":604,"context_line":"                                        \"use floating ip.\")"},{"line_number":605,"context_line":"            cls.network_resources \u003d {"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a430d35_ff502c34","line":602,"updated":"2017-02-08 11:08:13.000000000","message":"As Andrea said, requesting a router doesn\u0027t necessarily mean requesting external access. But it\u0027s true that the current _create_router() in dynamic_creds.py assumes so. Maybe we can fix the _create_router() method and don\u0027t pass the external_gateway_info param if public_network_id is not set.","commit_id":"326f54ecf255203986ca9e4d0e696fa7915a48fb"},{"author":{"_account_id":20190,"name":"zhufl","email":"zhu.fanglei@zte.com.cn","username":"zhufl"},"change_message_id":"fbddf5970217053ade98f84f86470488b4a9ca5f","unresolved":false,"context_lines":[{"line_number":599,"context_line":"        # a chain of overloaded methods, the attribute is set only"},{"line_number":600,"context_line":"        # in the leaf class"},{"line_number":601,"context_line":"        if not cls.network_resources:"},{"line_number":602,"context_line":"            if router and not CONF.network.public_network_id:"},{"line_number":603,"context_line":"                raise cls.skipException(\"public_network_id must be defined to \""},{"line_number":604,"context_line":"                                        \"use floating ip.\")"},{"line_number":605,"context_line":"            cls.network_resources \u003d {"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a430d35_63572158","line":602,"in_reply_to":"1a430d35_ff502c34","updated":"2017-02-09 03:18:37.000000000","message":"yes if modifying _create_router can work, the code logic will be much simpler. \nI am only not sure what will happen if we don\u0027t pass external_gateway_info to create_router.\nbut anyway, let me try:)","commit_id":"326f54ecf255203986ca9e4d0e696fa7915a48fb"}]}
