blob: 8b036315f84694ca2b39b4582b57448ae7d0e54f [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
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -080023from tempest.lib import decorators
nayna-patel197c0122013-07-11 10:18:00 +000024
Matthew Treinish03b48df2014-01-29 16:59:49 +000025CONF = config.CONF
26
nayna-patel197c0122013-07-11 10:18:00 +000027
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -070028class RoutersTest(base.BaseNetworkTest):
Ken'ichi Ohmichi3fd5f0e2017-05-04 18:40:36 -070029
30 def _cleanup_router(self, router):
31 self.delete_router(router)
Ken'ichi Ohmichi3fd5f0e2017-05-04 18:40:36 -070032
33 def _create_router(self, name=None, admin_state_up=False,
34 external_network_id=None, enable_snat=None):
35 # associate a cleanup with created routers to avoid quota limits
36 router = self.create_router(name, admin_state_up,
37 external_network_id, enable_snat)
38 self.addCleanup(self._cleanup_router, router)
39 return router
40
deepak_mouryab4fb4382018-06-04 10:11:32 +053041 def _create_subnet(self, network, gateway='', cidr=None):
42 subnet = self.create_subnet(network, gateway, cidr)
43 self.addCleanup(self.subnets_client.delete_subnet, subnet['id'])
44 return subnet
45
Ken'ichi Ohmichi3fd5f0e2017-05-04 18:40:36 -070046 def _add_router_interface_with_subnet_id(self, router_id, subnet_id):
47 interface = self.routers_client.add_router_interface(
48 router_id, subnet_id=subnet_id)
49 self.addCleanup(self._remove_router_interface_with_subnet_id,
50 router_id, subnet_id)
51 self.assertEqual(subnet_id, interface['subnet_id'])
52 return interface
53
54 def _remove_router_interface_with_subnet_id(self, router_id, subnet_id):
55 body = self.routers_client.remove_router_interface(router_id,
56 subnet_id=subnet_id)
57 self.assertEqual(subnet_id, body['subnet_id'])
nayna-patel197c0122013-07-11 10:18:00 +000058
59 @classmethod
Rohan Kanadea565e452015-01-27 14:00:13 +053060 def skip_checks(cls):
61 super(RoutersTest, cls).skip_checks()
Andrea Frittolicd368412017-08-14 21:37:56 +010062 if not utils.is_extension_enabled('router', 'network'):
Yoshihiro Kaneko05670262014-01-18 19:22:44 +090063 msg = "router extension not enabled."
64 raise cls.skipException(msg)
Rohan Kanadea565e452015-01-27 14:00:13 +053065
Jordan Pittier3b46d272017-04-12 16:17:28 +020066 @decorators.attr(type='smoke')
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -080067 @decorators.idempotent_id('f64403e2-8483-4b34-8ccd-b09a87bcc68c')
zhufl6b7040a2017-01-18 16:38:34 +080068 @testtools.skipUnless(CONF.network.public_network_id,
69 'The public_network_id option must be specified.')
nayna-patel197c0122013-07-11 10:18:00 +000070 def test_create_show_list_update_delete_router(self):
71 # Create a router
deepak_mouryab4fb4382018-06-04 10:11:32 +053072 router_name = data_utils.rand_name(self.__class__.__name__ + '-router')
Tianbiao Qi83158912016-11-03 10:37:30 +080073 router = self._create_router(
deepak_mouryab4fb4382018-06-04 10:11:32 +053074 name=router_name,
Tianbiao Qi83158912016-11-03 10:37:30 +080075 admin_state_up=False,
76 external_network_id=CONF.network.public_network_id)
deepak_mouryab4fb4382018-06-04 10:11:32 +053077 self.assertEqual(router['name'], router_name)
Tianbiao Qi83158912016-11-03 10:37:30 +080078 self.assertEqual(router['admin_state_up'], False)
nayna-patel197c0122013-07-11 10:18:00 +000079 self.assertEqual(
Tianbiao Qi83158912016-11-03 10:37:30 +080080 router['external_gateway_info']['network_id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +000081 CONF.network.public_network_id)
nayna-patel197c0122013-07-11 10:18:00 +000082 # Show details of the created router
Tianbiao Qi83158912016-11-03 10:37:30 +080083 router_show = self.routers_client.show_router(
84 router['id'])['router']
85 self.assertEqual(router_show['name'], router['name'])
nayna-patel197c0122013-07-11 10:18:00 +000086 self.assertEqual(
Tianbiao Qi83158912016-11-03 10:37:30 +080087 router_show['external_gateway_info']['network_id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +000088 CONF.network.public_network_id)
nayna-patel197c0122013-07-11 10:18:00 +000089 # List routers and verify if created router is there in response
Tianbiao Qi83158912016-11-03 10:37:30 +080090 routers = self.routers_client.list_routers()['routers']
91 self.assertIn(router['id'], map(lambda x: x['id'], routers))
nayna-patel197c0122013-07-11 10:18:00 +000092 # Update the name of router and verify if it is updated
Tianbiao Qi83158912016-11-03 10:37:30 +080093 updated_name = 'updated' + router['name']
94 router_update = self.routers_client.update_router(
95 router['id'], name=updated_name)['router']
96 self.assertEqual(router_update['name'], updated_name)
97 router_show = self.routers_client.show_router(
98 router['id'])['router']
99 self.assertEqual(router_show['name'], updated_name)
nayna-patel197c0122013-07-11 10:18:00 +0000100
Jordan Pittier3b46d272017-04-12 16:17:28 +0200101 @decorators.attr(type='smoke')
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -0800102 @decorators.idempotent_id('b42e6e39-2e37-49cc-a6f4-8467e940900a')
nayna-patel197c0122013-07-11 10:18:00 +0000103 def test_add_remove_router_interface_with_subnet_id(self):
deepak_mouryab4fb4382018-06-04 10:11:32 +0530104 network_name = data_utils.rand_name(self.__class__.__name__)
105 network = self.networks_client.create_network(
106 name=network_name)['network']
107 self.addCleanup(self.networks_client.delete_network,
108 network['id'])
109 subnet = self._create_subnet(network)
zhufld2c40ca2016-10-18 17:03:07 +0800110 router = self._create_router()
Chang Bo Guof099f802013-09-13 19:01:46 -0700111 # Add router interface with subnet id
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000112 interface = self.routers_client.add_router_interface(
113 router['id'], subnet_id=subnet['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000114 self.addCleanup(self._remove_router_interface_with_subnet_id,
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700115 router['id'], subnet['id'])
Attila Fazekas4b8b0082013-10-25 14:24:32 +0200116 self.assertIn('subnet_id', interface.keys())
117 self.assertIn('port_id', interface.keys())
nayna-patel197c0122013-07-11 10:18:00 +0000118 # Verify router id is equal to device id in port details
John Warren49c0fe52015-10-22 12:35:54 -0400119 show_port_body = self.ports_client.show_port(
nayna-patel197c0122013-07-11 10:18:00 +0000120 interface['port_id'])
121 self.assertEqual(show_port_body['port']['device_id'],
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700122 router['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000123
Jordan Pittier3b46d272017-04-12 16:17:28 +0200124 @decorators.attr(type='smoke')
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -0800125 @decorators.idempotent_id('2b7d2f37-6748-4d78-92e5-1d590234f0d5')
nayna-patel197c0122013-07-11 10:18:00 +0000126 def test_add_remove_router_interface_with_port_id(self):
deepak_mouryab4fb4382018-06-04 10:11:32 +0530127 network_name = data_utils.rand_name(self.__class__.__name__)
128 network = self.networks_client.create_network(
129 name=network_name)['network']
130 self.addCleanup(self.networks_client.delete_network,
131 network['id'])
132 self._create_subnet(network)
zhufld2c40ca2016-10-18 17:03:07 +0800133 router = self._create_router()
John Warren49c0fe52015-10-22 12:35:54 -0400134 port_body = self.ports_client.create_port(
Eugene Nikanorove9d255a2013-12-18 16:31:42 +0400135 network_id=network['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000136 # add router interface to port created above
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000137 interface = self.routers_client.add_router_interface(
piyush11078694aca952015-12-17 12:54:44 +0530138 router['id'],
139 port_id=port_body['port']['id'])
Ken'ichi Ohmichiea2a31a2017-05-04 14:08:07 -0700140 self.addCleanup(self.routers_client.remove_router_interface,
141 router['id'], port_id=port_body['port']['id'])
Attila Fazekas4b8b0082013-10-25 14:24:32 +0200142 self.assertIn('subnet_id', interface.keys())
143 self.assertIn('port_id', interface.keys())
nayna-patel197c0122013-07-11 10:18:00 +0000144 # Verify router id is equal to device id in port details
John Warren49c0fe52015-10-22 12:35:54 -0400145 show_port_body = self.ports_client.show_port(
nayna-patel197c0122013-07-11 10:18:00 +0000146 interface['port_id'])
147 self.assertEqual(show_port_body['port']['device_id'],
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700148 router['id'])
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700149
lianghao8c8074c2017-03-09 22:16:52 +0800150 @decorators.idempotent_id('cbe42f84-04c2-11e7-8adb-fa163e4fa634')
Andrea Frittolicd368412017-08-14 21:37:56 +0100151 @utils.requires_ext(extension='ext-gw-mode', service='network')
lianghao8c8074c2017-03-09 22:16:52 +0800152 @testtools.skipUnless(CONF.network.public_network_id,
153 'The public_network_id option must be specified.')
Jordan Pittier7252ce02017-03-26 20:48:14 +0200154 @decorators.skip_because(bug='1676207')
lianghao8c8074c2017-03-09 22:16:52 +0800155 def test_create_router_set_gateway_with_fixed_ip(self):
156 # Don't know public_network_address, so at first create address
157 # from public_network and delete
158 port = self.admin_ports_client.create_port(
159 network_id=CONF.network.public_network_id)['port']
160 self.admin_ports_client.delete_port(port_id=port['id'])
161
162 fixed_ip = {
163 'subnet_id': port['fixed_ips'][0]['subnet_id'],
164 'ip_address': port['fixed_ips'][0]['ip_address']
165 }
166 external_gateway_info = {
167 'network_id': CONF.network.public_network_id,
168 'external_fixed_ips': [fixed_ip]
169 }
170
171 # Create a router and set gateway to fixed_ip
172 router = self.admin_routers_client.create_router(
173 external_gateway_info=external_gateway_info)['router']
174 self.addCleanup(self.admin_routers_client.delete_router,
175 router_id=router['id'])
176 # Examine router's gateway is equal to fixed_ip
177 self.assertEqual(router['external_gateway_info'][
178 'external_fixed_ips'][0]['ip_address'],
179 fixed_ip['ip_address'])
180
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -0800181 @decorators.idempotent_id('c86ac3a8-50bd-4b00-a6b8-62af84a0765c')
Andrea Frittolicd368412017-08-14 21:37:56 +0100182 @utils.requires_ext(extension='extraroute', service='network')
Abhishek6707b5e2016-01-14 15:49:11 +0530183 def test_update_delete_extra_route(self):
Shuquan Huangde79d262015-06-26 02:48:22 +0000184 # Create different cidr for each subnet to avoid cidr duplicate
Sean Dagueed6e5862016-04-04 10:49:13 -0400185 # The cidr starts from project_cidr
zhuflb0dbe4b2017-09-11 16:45:17 +0800186 next_cidr = self.cidr
Shuquan Huangde79d262015-06-26 02:48:22 +0000187 # Prepare to build several routes
188 test_routes = []
David Kranz4d06ebb2015-07-31 15:18:08 -0400189 routes_num = 4
Shuquan Huangde79d262015-06-26 02:48:22 +0000190 # Create a router
zhufld2c40ca2016-10-18 17:03:07 +0800191 router = self._create_router(admin_state_up=True)
ChenZheng04ac6942013-12-09 16:42:52 +0800192 self.addCleanup(
193 self._delete_extra_routes,
Brandon Palmf35aa8b2015-08-07 14:56:59 -0500194 router['id'])
Sylvain Afchain85c1e542014-01-11 08:23:16 +0100195 # Update router extra route, second ip of the range is
196 # used as next hop
Shuquan Huangde79d262015-06-26 02:48:22 +0000197 for i in range(routes_num):
deepak_mouryab4fb4382018-06-04 10:11:32 +0530198 network_name = data_utils.rand_name(self.__class__.__name__)
199 network = self.networks_client.create_network(
200 name=network_name)['network']
201 self.addCleanup(self.networks_client.delete_network,
202 network['id'])
Shuquan Huangde79d262015-06-26 02:48:22 +0000203 subnet = self.create_subnet(network, cidr=next_cidr)
204 next_cidr = next_cidr.next()
205
206 # Add router interface with subnet id
Brandon Palmf35aa8b2015-08-07 14:56:59 -0500207 self.create_router_interface(router['id'], subnet['id'])
deepak_mouryab4fb4382018-06-04 10:11:32 +0530208 self.addCleanup(self._remove_router_interface_with_subnet_id,
209 router['id'], subnet['id'])
Shuquan Huangde79d262015-06-26 02:48:22 +0000210 cidr = netaddr.IPNetwork(subnet['cidr'])
211 next_hop = str(cidr[2])
212 destination = str(subnet['cidr'])
213 test_routes.append(
214 {'nexthop': next_hop, 'destination': destination}
215 )
216
217 test_routes.sort(key=lambda x: x['destination'])
Ken'ichi Ohmichi50fc7842016-05-30 11:21:08 -0700218 extra_route = self.routers_client.update_router(
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000219 router['id'], routes=test_routes)
220 show_body = self.routers_client.show_router(router['id'])
Shuquan Huangde79d262015-06-26 02:48:22 +0000221 # Assert the number of routes
222 self.assertEqual(routes_num, len(extra_route['router']['routes']))
223 self.assertEqual(routes_num, len(show_body['router']['routes']))
224
225 routes = extra_route['router']['routes']
226 routes.sort(key=lambda x: x['destination'])
227 # Assert the nexthops & destination
228 for i in range(routes_num):
229 self.assertEqual(test_routes[i]['destination'],
230 routes[i]['destination'])
231 self.assertEqual(test_routes[i]['nexthop'], routes[i]['nexthop'])
232
233 routes = show_body['router']['routes']
234 routes.sort(key=lambda x: x['destination'])
235 for i in range(routes_num):
236 self.assertEqual(test_routes[i]['destination'],
237 routes[i]['destination'])
238 self.assertEqual(test_routes[i]['nexthop'], routes[i]['nexthop'])
ChenZheng04ac6942013-12-09 16:42:52 +0800239
Ken'ichi Ohmichi1f387612016-05-30 11:28:06 -0700240 self._delete_extra_routes(router['id'])
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000241 show_body_after_deletion = self.routers_client.show_router(
242 router['id'])
Abhishek6707b5e2016-01-14 15:49:11 +0530243 self.assertEmpty(show_body_after_deletion['router']['routes'])
244
ChenZheng04ac6942013-12-09 16:42:52 +0800245 def _delete_extra_routes(self, router_id):
Ken'ichi Ohmichi1f387612016-05-30 11:28:06 -0700246 self.routers_client.update_router(router_id, routes=None)
liudongfbdfc7e2014-02-15 10:52:17 +0800247
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -0800248 @decorators.idempotent_id('a8902683-c788-4246-95c7-ad9c6d63a4d9')
liudongfbdfc7e2014-02-15 10:52:17 +0800249 def test_update_router_admin_state(self):
zhufld2c40ca2016-10-18 17:03:07 +0800250 router = self._create_router()
Brandon Palmf35aa8b2015-08-07 14:56:59 -0500251 self.assertFalse(router['admin_state_up'])
liudongfbdfc7e2014-02-15 10:52:17 +0800252 # Update router admin state
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000253 update_body = self.routers_client.update_router(router['id'],
254 admin_state_up=True)
liudongfbdfc7e2014-02-15 10:52:17 +0800255 self.assertTrue(update_body['router']['admin_state_up'])
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000256 show_body = self.routers_client.show_router(router['id'])
liudongfbdfc7e2014-02-15 10:52:17 +0800257 self.assertTrue(show_body['router']['admin_state_up'])
258
Jordan Pittier3b46d272017-04-12 16:17:28 +0200259 @decorators.attr(type='smoke')
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -0800260 @decorators.idempotent_id('802c73c9-c937-4cef-824b-2191e24a6aab')
liudongfbdfc7e2014-02-15 10:52:17 +0800261 def test_add_multiple_router_interfaces(self):
deepak_mouryab4fb4382018-06-04 10:11:32 +0530262 network_name = data_utils.rand_name(self.__class__.__name__)
263 network01 = self.networks_client.create_network(
264 name=network_name)['network']
265 self.addCleanup(self.networks_client.delete_network,
266 network01['id'])
267 network02 = self.networks_client.create_network(
268 name=data_utils.rand_name(self.__class__.__name__))['network']
269 self.addCleanup(self.networks_client.delete_network,
270 network02['id'])
271 subnet01 = self._create_subnet(network01)
zhuflb0dbe4b2017-09-11 16:45:17 +0800272 sub02_cidr = self.cidr.next()
deepak_mouryab4fb4382018-06-04 10:11:32 +0530273 subnet02 = self._create_subnet(network02, cidr=sub02_cidr)
zhufld2c40ca2016-10-18 17:03:07 +0800274 router = self._create_router()
liudongfbdfc7e2014-02-15 10:52:17 +0800275 interface01 = self._add_router_interface_with_subnet_id(router['id'],
276 subnet01['id'])
277 self._verify_router_interface(router['id'], subnet01['id'],
278 interface01['port_id'])
279 interface02 = self._add_router_interface_with_subnet_id(router['id'],
280 subnet02['id'])
281 self._verify_router_interface(router['id'], subnet02['id'],
282 interface02['port_id'])
283
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -0800284 @decorators.idempotent_id('96522edf-b4b5-45d9-8443-fa11c26e6eff')
Hardik Italiae1a17072015-07-15 17:58:24 -0700285 def test_router_interface_port_update_with_fixed_ip(self):
deepak_mouryab4fb4382018-06-04 10:11:32 +0530286 network_name = data_utils.rand_name(self.__class__.__name__)
287 network = self.networks_client.create_network(
288 name=network_name)['network']
289 self.addCleanup(self.networks_client.delete_network,
290 network['id'])
291 subnet = self._create_subnet(network)
zhufld2c40ca2016-10-18 17:03:07 +0800292 router = self._create_router()
Hardik Italiae1a17072015-07-15 17:58:24 -0700293 fixed_ip = [{'subnet_id': subnet['id']}]
294 interface = self._add_router_interface_with_subnet_id(router['id'],
295 subnet['id'])
296 self.assertIn('port_id', interface)
297 self.assertIn('subnet_id', interface)
298 port = self.ports_client.show_port(interface['port_id'])
299 self.assertEqual(port['port']['id'], interface['port_id'])
300 router_port = self.ports_client.update_port(port['port']['id'],
301 fixed_ips=fixed_ip)
302 self.assertEqual(subnet['id'],
303 router_port['port']['fixed_ips'][0]['subnet_id'])
304
liudongfbdfc7e2014-02-15 10:52:17 +0800305 def _verify_router_interface(self, router_id, subnet_id, port_id):
John Warren49c0fe52015-10-22 12:35:54 -0400306 show_port_body = self.ports_client.show_port(port_id)
liudongfbdfc7e2014-02-15 10:52:17 +0800307 interface_port = show_port_body['port']
308 self.assertEqual(router_id, interface_port['device_id'])
309 self.assertEqual(subnet_id,
310 interface_port['fixed_ips'][0]['subnet_id'])
Sergey Shnaidman97e6a0f2014-11-12 20:00:53 +0300311
312
313class RoutersIpV6Test(RoutersTest):
314 _ip_version = 6