blob: fedf2f446e96d0403bfff2498fed70dac7e13c51 [file] [log] [blame]
nayna-patel197c0122013-07-11 10:18:00 +00001# Copyright 2013 OpenStack Foundation
2# All Rights Reserved.
3#
4# Licensed under the Apache License, Version 2.0 (the "License"); you may
5# not use this file except in compliance with the License. You may obtain
6# a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13# License for the specific language governing permissions and limitations
14# under the License.
15
ChenZheng04ac6942013-12-09 16:42:52 +080016import netaddr
zhufl6b7040a2017-01-18 16:38:34 +080017import testtools
ChenZheng04ac6942013-12-09 16:42:52 +080018
Ken'ichi Ohmichi3fd5f0e2017-05-04 18:40:36 -070019from tempest.api.network import base
Andrea Frittolicd368412017-08-14 21:37:56 +010020from tempest.common import utils
Matthew Treinish03b48df2014-01-29 16:59:49 +000021from tempest import config
Ken'ichi Ohmichif50e4df2017-03-10 10:52:53 -080022from tempest.lib.common.utils import data_utils
Slawek Kaplonski748dd8d2019-04-16 23:38:35 +020023from tempest.lib.common.utils import test_utils
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -080024from tempest.lib import decorators
nayna-patel197c0122013-07-11 10:18:00 +000025
Matthew Treinish03b48df2014-01-29 16:59:49 +000026CONF = config.CONF
27
nayna-patel197c0122013-07-11 10:18:00 +000028
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -070029class RoutersTest(base.BaseNetworkTest):
zhufl05fc4f72020-04-26 09:13:54 +080030 """Test routers"""
Ken'ichi Ohmichi3fd5f0e2017-05-04 18:40:36 -070031
Ken'ichi Ohmichi3fd5f0e2017-05-04 18:40:36 -070032 def _add_router_interface_with_subnet_id(self, router_id, subnet_id):
33 interface = self.routers_client.add_router_interface(
34 router_id, subnet_id=subnet_id)
Rodolfo Alonso Hernandezf2aa1582024-11-27 09:56:05 +000035 self.addCleanup(self.remove_router_interface,
36 router_id, interface['port_id'], subnet_id=subnet_id)
Ken'ichi Ohmichi3fd5f0e2017-05-04 18:40:36 -070037 self.assertEqual(subnet_id, interface['subnet_id'])
38 return interface
39
nayna-patel197c0122013-07-11 10:18:00 +000040 @classmethod
Rohan Kanadea565e452015-01-27 14:00:13 +053041 def skip_checks(cls):
42 super(RoutersTest, cls).skip_checks()
Andrea Frittolicd368412017-08-14 21:37:56 +010043 if not utils.is_extension_enabled('router', 'network'):
Yoshihiro Kaneko05670262014-01-18 19:22:44 +090044 msg = "router extension not enabled."
45 raise cls.skipException(msg)
Rohan Kanadea565e452015-01-27 14:00:13 +053046
Jordan Pittier3b46d272017-04-12 16:17:28 +020047 @decorators.attr(type='smoke')
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -080048 @decorators.idempotent_id('f64403e2-8483-4b34-8ccd-b09a87bcc68c')
zhufl6b7040a2017-01-18 16:38:34 +080049 @testtools.skipUnless(CONF.network.public_network_id,
50 'The public_network_id option must be specified.')
nayna-patel197c0122013-07-11 10:18:00 +000051 def test_create_show_list_update_delete_router(self):
zhufl05fc4f72020-04-26 09:13:54 +080052 """Test create/show/list/update/delete of a router"""
nayna-patel197c0122013-07-11 10:18:00 +000053 # Create a router
Martin Kopec213d0a42023-11-30 10:28:14 +010054 router_name = data_utils.rand_name(
55 self.__class__.__name__ + '-router',
56 prefix=CONF.resource_name_prefix)
Manik Bindlish27ecc302018-07-16 05:10:57 +000057 router = self.create_router(
58 router_name,
Tianbiao Qi83158912016-11-03 10:37:30 +080059 admin_state_up=False,
60 external_network_id=CONF.network.public_network_id)
Manik Bindlish27ecc302018-07-16 05:10:57 +000061 self.addCleanup(self.delete_router, router)
deepak_mouryab4fb4382018-06-04 10:11:32 +053062 self.assertEqual(router['name'], router_name)
Tianbiao Qi83158912016-11-03 10:37:30 +080063 self.assertEqual(router['admin_state_up'], False)
nayna-patel197c0122013-07-11 10:18:00 +000064 self.assertEqual(
Tianbiao Qi83158912016-11-03 10:37:30 +080065 router['external_gateway_info']['network_id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +000066 CONF.network.public_network_id)
nayna-patel197c0122013-07-11 10:18:00 +000067 # Show details of the created router
Tianbiao Qi83158912016-11-03 10:37:30 +080068 router_show = self.routers_client.show_router(
69 router['id'])['router']
70 self.assertEqual(router_show['name'], router['name'])
nayna-patel197c0122013-07-11 10:18:00 +000071 self.assertEqual(
Tianbiao Qi83158912016-11-03 10:37:30 +080072 router_show['external_gateway_info']['network_id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +000073 CONF.network.public_network_id)
nayna-patel197c0122013-07-11 10:18:00 +000074 # List routers and verify if created router is there in response
Tianbiao Qi83158912016-11-03 10:37:30 +080075 routers = self.routers_client.list_routers()['routers']
76 self.assertIn(router['id'], map(lambda x: x['id'], routers))
nayna-patel197c0122013-07-11 10:18:00 +000077 # Update the name of router and verify if it is updated
Tianbiao Qi83158912016-11-03 10:37:30 +080078 updated_name = 'updated' + router['name']
79 router_update = self.routers_client.update_router(
80 router['id'], name=updated_name)['router']
81 self.assertEqual(router_update['name'], updated_name)
82 router_show = self.routers_client.show_router(
83 router['id'])['router']
84 self.assertEqual(router_show['name'], updated_name)
nayna-patel197c0122013-07-11 10:18:00 +000085
Jordan Pittier3b46d272017-04-12 16:17:28 +020086 @decorators.attr(type='smoke')
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -080087 @decorators.idempotent_id('b42e6e39-2e37-49cc-a6f4-8467e940900a')
nayna-patel197c0122013-07-11 10:18:00 +000088 def test_add_remove_router_interface_with_subnet_id(self):
zhufl05fc4f72020-04-26 09:13:54 +080089 """Test adding and removing router interface with subnet id"""
Martin Kopec213d0a42023-11-30 10:28:14 +010090 network_name = data_utils.rand_name(
91 self.__class__.__name__, prefix=CONF.resource_name_prefix)
deepak_mouryab4fb4382018-06-04 10:11:32 +053092 network = self.networks_client.create_network(
93 name=network_name)['network']
Slawek Kaplonski748dd8d2019-04-16 23:38:35 +020094 self.addCleanup(test_utils.call_and_ignore_notfound_exc,
95 self.networks_client.delete_network, network['id'])
Manik Bindlish27ecc302018-07-16 05:10:57 +000096 subnet = self.create_subnet(network)
Slawek Kaplonski748dd8d2019-04-16 23:38:35 +020097 self.addCleanup(test_utils.call_and_ignore_notfound_exc,
98 self.subnets_client.delete_subnet, subnet['id'])
Manik Bindlish27ecc302018-07-16 05:10:57 +000099 router = self.create_router()
100 self.addCleanup(self.delete_router, router)
Chang Bo Guof099f802013-09-13 19:01:46 -0700101 # Add router interface with subnet id
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000102 interface = self.routers_client.add_router_interface(
103 router['id'], subnet_id=subnet['id'])
Rodolfo Alonso Hernandezf2aa1582024-11-27 09:56:05 +0000104 self.addCleanup(self.remove_router_interface,
105 router['id'], interface['port_id'],
106 subnet_id=subnet['id'])
Attila Fazekas4b8b0082013-10-25 14:24:32 +0200107 self.assertIn('subnet_id', interface.keys())
108 self.assertIn('port_id', interface.keys())
nayna-patel197c0122013-07-11 10:18:00 +0000109 # Verify router id is equal to device id in port details
John Warren49c0fe52015-10-22 12:35:54 -0400110 show_port_body = self.ports_client.show_port(
nayna-patel197c0122013-07-11 10:18:00 +0000111 interface['port_id'])
112 self.assertEqual(show_port_body['port']['device_id'],
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700113 router['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000114
Jordan Pittier3b46d272017-04-12 16:17:28 +0200115 @decorators.attr(type='smoke')
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -0800116 @decorators.idempotent_id('2b7d2f37-6748-4d78-92e5-1d590234f0d5')
nayna-patel197c0122013-07-11 10:18:00 +0000117 def test_add_remove_router_interface_with_port_id(self):
zhufl05fc4f72020-04-26 09:13:54 +0800118 """Test adding and removing router interface with port id"""
Martin Kopec213d0a42023-11-30 10:28:14 +0100119 network_name = data_utils.rand_name(
120 self.__class__.__name__, prefix=CONF.resource_name_prefix)
deepak_mouryab4fb4382018-06-04 10:11:32 +0530121 network = self.networks_client.create_network(
122 name=network_name)['network']
Slawek Kaplonski748dd8d2019-04-16 23:38:35 +0200123 self.addCleanup(test_utils.call_and_ignore_notfound_exc,
124 self.networks_client.delete_network, network['id'])
Manik Bindlish27ecc302018-07-16 05:10:57 +0000125 subnet = self.create_subnet(network)
126 self.addCleanup(self.subnets_client.delete_subnet, subnet['id'])
127 router = self.create_router()
128 self.addCleanup(self.delete_router, router)
John Warren49c0fe52015-10-22 12:35:54 -0400129 port_body = self.ports_client.create_port(
Doug Schveninger24675aa2019-08-16 22:28:39 -0500130 network_id=network['id'],
Martin Kopec213d0a42023-11-30 10:28:14 +0100131 name=data_utils.rand_name(
132 self.__class__.__name__, prefix=CONF.resource_name_prefix))
nayna-patel197c0122013-07-11 10:18:00 +0000133 # add router interface to port created above
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000134 interface = self.routers_client.add_router_interface(
piyush11078694aca952015-12-17 12:54:44 +0530135 router['id'],
136 port_id=port_body['port']['id'])
Slawek Kaplonski748dd8d2019-04-16 23:38:35 +0200137 self.addCleanup(test_utils.call_and_ignore_notfound_exc,
138 self.routers_client.remove_router_interface,
Ken'ichi Ohmichiea2a31a2017-05-04 14:08:07 -0700139 router['id'], port_id=port_body['port']['id'])
Attila Fazekas4b8b0082013-10-25 14:24:32 +0200140 self.assertIn('subnet_id', interface.keys())
141 self.assertIn('port_id', interface.keys())
nayna-patel197c0122013-07-11 10:18:00 +0000142 # Verify router id is equal to device id in port details
John Warren49c0fe52015-10-22 12:35:54 -0400143 show_port_body = self.ports_client.show_port(
nayna-patel197c0122013-07-11 10:18:00 +0000144 interface['port_id'])
145 self.assertEqual(show_port_body['port']['device_id'],
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700146 router['id'])
Slawek Kaplonski748dd8d2019-04-16 23:38:35 +0200147 self.routers_client.remove_router_interface(
148 router['id'], port_id=port_body['port']['id'])
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700149
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -0800150 @decorators.idempotent_id('c86ac3a8-50bd-4b00-a6b8-62af84a0765c')
Andrea Frittolicd368412017-08-14 21:37:56 +0100151 @utils.requires_ext(extension='extraroute', service='network')
Abhishek6707b5e2016-01-14 15:49:11 +0530152 def test_update_delete_extra_route(self):
zhufl05fc4f72020-04-26 09:13:54 +0800153 """Test updating and deleting router with extra route"""
Shuquan Huangde79d262015-06-26 02:48:22 +0000154 # Create different cidr for each subnet to avoid cidr duplicate
Sean Dagueed6e5862016-04-04 10:49:13 -0400155 # The cidr starts from project_cidr
zhuflb0dbe4b2017-09-11 16:45:17 +0800156 next_cidr = self.cidr
Shuquan Huangde79d262015-06-26 02:48:22 +0000157 # Prepare to build several routes
158 test_routes = []
David Kranz4d06ebb2015-07-31 15:18:08 -0400159 routes_num = 4
Shuquan Huangde79d262015-06-26 02:48:22 +0000160 # Create a router
Manik Bindlish27ecc302018-07-16 05:10:57 +0000161 router = self.create_router(admin_state_up=True)
162 self.addCleanup(self.delete_router, router)
ChenZheng04ac6942013-12-09 16:42:52 +0800163 self.addCleanup(
164 self._delete_extra_routes,
Brandon Palmf35aa8b2015-08-07 14:56:59 -0500165 router['id'])
Sylvain Afchain85c1e542014-01-11 08:23:16 +0100166 # Update router extra route, second ip of the range is
167 # used as next hop
Shuquan Huangde79d262015-06-26 02:48:22 +0000168 for i in range(routes_num):
Martin Kopec213d0a42023-11-30 10:28:14 +0100169 network_name = data_utils.rand_name(
170 self.__class__.__name__, prefix=CONF.resource_name_prefix)
deepak_mouryab4fb4382018-06-04 10:11:32 +0530171 network = self.networks_client.create_network(
172 name=network_name)['network']
Slawek Kaplonski748dd8d2019-04-16 23:38:35 +0200173 self.addCleanup(test_utils.call_and_ignore_notfound_exc,
174 self.networks_client.delete_network,
deepak_mouryab4fb4382018-06-04 10:11:32 +0530175 network['id'])
Shuquan Huangde79d262015-06-26 02:48:22 +0000176 subnet = self.create_subnet(network, cidr=next_cidr)
Slawek Kaplonski748dd8d2019-04-16 23:38:35 +0200177 self.addCleanup(test_utils.call_and_ignore_notfound_exc,
178 self.subnets_client.delete_subnet, subnet['id'])
Shuquan Huangde79d262015-06-26 02:48:22 +0000179 next_cidr = next_cidr.next()
180
181 # Add router interface with subnet id
Rodolfo Alonso Hernandez6ad37f22024-10-08 10:53:38 +0000182 interface = self.create_router_interface(router['id'],
183 subnet['id'])
Rodolfo Alonso Hernandezf2aa1582024-11-27 09:56:05 +0000184 self.addCleanup(self.remove_router_interface,
185 router['id'], interface['port_id'],
186 subnet_id=subnet['id'])
Shuquan Huangde79d262015-06-26 02:48:22 +0000187 cidr = netaddr.IPNetwork(subnet['cidr'])
188 next_hop = str(cidr[2])
189 destination = str(subnet['cidr'])
190 test_routes.append(
191 {'nexthop': next_hop, 'destination': destination}
192 )
193
194 test_routes.sort(key=lambda x: x['destination'])
Ken'ichi Ohmichi50fc7842016-05-30 11:21:08 -0700195 extra_route = self.routers_client.update_router(
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000196 router['id'], routes=test_routes)
197 show_body = self.routers_client.show_router(router['id'])
Shuquan Huangde79d262015-06-26 02:48:22 +0000198 # Assert the number of routes
199 self.assertEqual(routes_num, len(extra_route['router']['routes']))
200 self.assertEqual(routes_num, len(show_body['router']['routes']))
201
202 routes = extra_route['router']['routes']
203 routes.sort(key=lambda x: x['destination'])
204 # Assert the nexthops & destination
205 for i in range(routes_num):
206 self.assertEqual(test_routes[i]['destination'],
207 routes[i]['destination'])
208 self.assertEqual(test_routes[i]['nexthop'], routes[i]['nexthop'])
209
210 routes = show_body['router']['routes']
211 routes.sort(key=lambda x: x['destination'])
212 for i in range(routes_num):
213 self.assertEqual(test_routes[i]['destination'],
214 routes[i]['destination'])
215 self.assertEqual(test_routes[i]['nexthop'], routes[i]['nexthop'])
ChenZheng04ac6942013-12-09 16:42:52 +0800216
Ken'ichi Ohmichi1f387612016-05-30 11:28:06 -0700217 self._delete_extra_routes(router['id'])
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000218 show_body_after_deletion = self.routers_client.show_router(
219 router['id'])
Abhishek6707b5e2016-01-14 15:49:11 +0530220 self.assertEmpty(show_body_after_deletion['router']['routes'])
221
ChenZheng04ac6942013-12-09 16:42:52 +0800222 def _delete_extra_routes(self, router_id):
Ken'ichi Ohmichi1f387612016-05-30 11:28:06 -0700223 self.routers_client.update_router(router_id, routes=None)
liudongfbdfc7e2014-02-15 10:52:17 +0800224
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -0800225 @decorators.idempotent_id('a8902683-c788-4246-95c7-ad9c6d63a4d9')
liudongfbdfc7e2014-02-15 10:52:17 +0800226 def test_update_router_admin_state(self):
zhufl05fc4f72020-04-26 09:13:54 +0800227 """Test updating router's admin state"""
Manik Bindlish27ecc302018-07-16 05:10:57 +0000228 router = self.create_router()
229 self.addCleanup(self.delete_router, router)
Brandon Palmf35aa8b2015-08-07 14:56:59 -0500230 self.assertFalse(router['admin_state_up'])
liudongfbdfc7e2014-02-15 10:52:17 +0800231 # Update router admin state
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000232 update_body = self.routers_client.update_router(router['id'],
233 admin_state_up=True)
liudongfbdfc7e2014-02-15 10:52:17 +0800234 self.assertTrue(update_body['router']['admin_state_up'])
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000235 show_body = self.routers_client.show_router(router['id'])
liudongfbdfc7e2014-02-15 10:52:17 +0800236 self.assertTrue(show_body['router']['admin_state_up'])
237
Jordan Pittier3b46d272017-04-12 16:17:28 +0200238 @decorators.attr(type='smoke')
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -0800239 @decorators.idempotent_id('802c73c9-c937-4cef-824b-2191e24a6aab')
liudongfbdfc7e2014-02-15 10:52:17 +0800240 def test_add_multiple_router_interfaces(self):
zhufl05fc4f72020-04-26 09:13:54 +0800241 """Test adding multiple router interfaces"""
Martin Kopec213d0a42023-11-30 10:28:14 +0100242 network_name = data_utils.rand_name(
243 self.__class__.__name__, prefix=CONF.resource_name_prefix)
deepak_mouryab4fb4382018-06-04 10:11:32 +0530244 network01 = self.networks_client.create_network(
245 name=network_name)['network']
Slawek Kaplonski748dd8d2019-04-16 23:38:35 +0200246 self.addCleanup(test_utils.call_and_ignore_notfound_exc,
247 self.networks_client.delete_network, network01['id'])
Martin Kopec213d0a42023-11-30 10:28:14 +0100248 network_name = data_utils.rand_name(
249 self.__class__.__name__, prefix=CONF.resource_name_prefix)
deepak_mouryab4fb4382018-06-04 10:11:32 +0530250 network02 = self.networks_client.create_network(
Manik Bindlish27ecc302018-07-16 05:10:57 +0000251 name=network_name)['network']
Slawek Kaplonski748dd8d2019-04-16 23:38:35 +0200252 self.addCleanup(test_utils.call_and_ignore_notfound_exc,
253 self.networks_client.delete_network, network02['id'])
Manik Bindlish27ecc302018-07-16 05:10:57 +0000254 subnet01 = self.create_subnet(network01)
Slawek Kaplonski748dd8d2019-04-16 23:38:35 +0200255 self.addCleanup(test_utils.call_and_ignore_notfound_exc,
256 self.subnets_client.delete_subnet, subnet01['id'])
zhuflb0dbe4b2017-09-11 16:45:17 +0800257 sub02_cidr = self.cidr.next()
Manik Bindlish27ecc302018-07-16 05:10:57 +0000258 subnet02 = self.create_subnet(network02, cidr=sub02_cidr)
Slawek Kaplonski748dd8d2019-04-16 23:38:35 +0200259 self.addCleanup(test_utils.call_and_ignore_notfound_exc,
260 self.subnets_client.delete_subnet, subnet02['id'])
Manik Bindlish27ecc302018-07-16 05:10:57 +0000261 router = self.create_router()
262 self.addCleanup(self.delete_router, router)
liudongfbdfc7e2014-02-15 10:52:17 +0800263 interface01 = self._add_router_interface_with_subnet_id(router['id'],
264 subnet01['id'])
265 self._verify_router_interface(router['id'], subnet01['id'],
266 interface01['port_id'])
267 interface02 = self._add_router_interface_with_subnet_id(router['id'],
268 subnet02['id'])
269 self._verify_router_interface(router['id'], subnet02['id'],
270 interface02['port_id'])
271
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -0800272 @decorators.idempotent_id('96522edf-b4b5-45d9-8443-fa11c26e6eff')
Hardik Italiae1a17072015-07-15 17:58:24 -0700273 def test_router_interface_port_update_with_fixed_ip(self):
zhufl05fc4f72020-04-26 09:13:54 +0800274 """Test updating router interface port's fixed ip"""
Martin Kopec213d0a42023-11-30 10:28:14 +0100275 network_name = data_utils.rand_name(
276 self.__class__.__name__, prefix=CONF.resource_name_prefix)
deepak_mouryab4fb4382018-06-04 10:11:32 +0530277 network = self.networks_client.create_network(
278 name=network_name)['network']
Slawek Kaplonski748dd8d2019-04-16 23:38:35 +0200279 self.addCleanup(test_utils.call_and_ignore_notfound_exc,
280 self.networks_client.delete_network, network['id'])
Manik Bindlish27ecc302018-07-16 05:10:57 +0000281 subnet = self.create_subnet(network)
Slawek Kaplonski748dd8d2019-04-16 23:38:35 +0200282 self.addCleanup(test_utils.call_and_ignore_notfound_exc,
283 self.subnets_client.delete_subnet, subnet['id'])
Manik Bindlish27ecc302018-07-16 05:10:57 +0000284 router = self.create_router()
285 self.addCleanup(self.delete_router, router)
Hardik Italiae1a17072015-07-15 17:58:24 -0700286 fixed_ip = [{'subnet_id': subnet['id']}]
287 interface = self._add_router_interface_with_subnet_id(router['id'],
288 subnet['id'])
289 self.assertIn('port_id', interface)
290 self.assertIn('subnet_id', interface)
291 port = self.ports_client.show_port(interface['port_id'])
292 self.assertEqual(port['port']['id'], interface['port_id'])
293 router_port = self.ports_client.update_port(port['port']['id'],
294 fixed_ips=fixed_ip)
295 self.assertEqual(subnet['id'],
296 router_port['port']['fixed_ips'][0]['subnet_id'])
297
liudongfbdfc7e2014-02-15 10:52:17 +0800298 def _verify_router_interface(self, router_id, subnet_id, port_id):
John Warren49c0fe52015-10-22 12:35:54 -0400299 show_port_body = self.ports_client.show_port(port_id)
liudongfbdfc7e2014-02-15 10:52:17 +0800300 interface_port = show_port_body['port']
301 self.assertEqual(router_id, interface_port['device_id'])
302 self.assertEqual(subnet_id,
303 interface_port['fixed_ips'][0]['subnet_id'])
Sergey Shnaidman97e6a0f2014-11-12 20:00:53 +0300304
305
306class RoutersIpV6Test(RoutersTest):
307 _ip_version = 6