blob: 0466d3a9a10be06527025915435ed9bf3d65c7e0 [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
Matthew Treinish03b48df2014-01-29 16:59:49 +000020from tempest import config
Ken'ichi Ohmichif50e4df2017-03-10 10:52:53 -080021from tempest.lib.common.utils import data_utils
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -080022from tempest.lib import decorators
armando-migliaccio89e5b962013-12-16 06:12:16 -080023from tempest import test
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 Ohmichi3fd5f0e2017-05-04 18:40:36 -070028class RoutersTest(base.BaseAdminNetworkTest):
29 # NOTE(salv-orlando): This class inherits from BaseAdminNetworkTest
30 # as some router operations, such as enabling or disabling SNAT
31 # require admin credentials by default
32
33 def _cleanup_router(self, router):
34 self.delete_router(router)
35 self.routers.remove(router)
36
37 def _create_router(self, name=None, admin_state_up=False,
38 external_network_id=None, enable_snat=None):
39 # associate a cleanup with created routers to avoid quota limits
40 router = self.create_router(name, admin_state_up,
41 external_network_id, enable_snat)
42 self.addCleanup(self._cleanup_router, router)
43 return router
44
45 def _add_router_interface_with_subnet_id(self, router_id, subnet_id):
46 interface = self.routers_client.add_router_interface(
47 router_id, subnet_id=subnet_id)
48 self.addCleanup(self._remove_router_interface_with_subnet_id,
49 router_id, subnet_id)
50 self.assertEqual(subnet_id, interface['subnet_id'])
51 return interface
52
53 def _remove_router_interface_with_subnet_id(self, router_id, subnet_id):
54 body = self.routers_client.remove_router_interface(router_id,
55 subnet_id=subnet_id)
56 self.assertEqual(subnet_id, body['subnet_id'])
nayna-patel197c0122013-07-11 10:18:00 +000057
58 @classmethod
Rohan Kanadea565e452015-01-27 14:00:13 +053059 def skip_checks(cls):
60 super(RoutersTest, cls).skip_checks()
Yoshihiro Kaneko05670262014-01-18 19:22:44 +090061 if not test.is_extension_enabled('router', 'network'):
62 msg = "router extension not enabled."
63 raise cls.skipException(msg)
Rohan Kanadea565e452015-01-27 14:00:13 +053064
65 @classmethod
Rohan Kanadea565e452015-01-27 14:00:13 +053066 def resource_setup(cls):
67 super(RoutersTest, cls).resource_setup()
Sean Dagueed6e5862016-04-04 10:49:13 -040068 cls.tenant_cidr = (CONF.network.project_network_cidr
Sergey Shnaidman97e6a0f2014-11-12 20:00:53 +030069 if cls._ip_version == 4 else
Sean Dagueed6e5862016-04-04 10:49:13 -040070 CONF.network.project_network_v6_cidr)
nayna-patel197c0122013-07-11 10:18:00 +000071
Jordan Pittier3b46d272017-04-12 16:17:28 +020072 @decorators.attr(type='smoke')
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -080073 @decorators.idempotent_id('f64403e2-8483-4b34-8ccd-b09a87bcc68c')
zhufl6b7040a2017-01-18 16:38:34 +080074 @testtools.skipUnless(CONF.network.public_network_id,
75 'The public_network_id option must be specified.')
nayna-patel197c0122013-07-11 10:18:00 +000076 def test_create_show_list_update_delete_router(self):
77 # Create a router
Tianbiao Qi83158912016-11-03 10:37:30 +080078 router = self._create_router(
79 admin_state_up=False,
80 external_network_id=CONF.network.public_network_id)
81 self.assertEqual(router['admin_state_up'], False)
nayna-patel197c0122013-07-11 10:18:00 +000082 self.assertEqual(
Tianbiao Qi83158912016-11-03 10:37:30 +080083 router['external_gateway_info']['network_id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +000084 CONF.network.public_network_id)
nayna-patel197c0122013-07-11 10:18:00 +000085 # Show details of the created router
Tianbiao Qi83158912016-11-03 10:37:30 +080086 router_show = self.routers_client.show_router(
87 router['id'])['router']
88 self.assertEqual(router_show['name'], router['name'])
nayna-patel197c0122013-07-11 10:18:00 +000089 self.assertEqual(
Tianbiao Qi83158912016-11-03 10:37:30 +080090 router_show['external_gateway_info']['network_id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +000091 CONF.network.public_network_id)
nayna-patel197c0122013-07-11 10:18:00 +000092 # List routers and verify if created router is there in response
Tianbiao Qi83158912016-11-03 10:37:30 +080093 routers = self.routers_client.list_routers()['routers']
94 self.assertIn(router['id'], map(lambda x: x['id'], routers))
nayna-patel197c0122013-07-11 10:18:00 +000095 # Update the name of router and verify if it is updated
Tianbiao Qi83158912016-11-03 10:37:30 +080096 updated_name = 'updated' + router['name']
97 router_update = self.routers_client.update_router(
98 router['id'], name=updated_name)['router']
99 self.assertEqual(router_update['name'], updated_name)
100 router_show = self.routers_client.show_router(
101 router['id'])['router']
102 self.assertEqual(router_show['name'], updated_name)
nayna-patel197c0122013-07-11 10:18:00 +0000103
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -0800104 @decorators.idempotent_id('e54dd3a3-4352-4921-b09d-44369ae17397')
Jamie Lennox15350172015-08-17 10:54:25 +1000105 def test_create_router_setting_project_id(self):
106 # Test creating router from admin user setting project_id.
107 project = data_utils.rand_name('test_tenant_')
108 description = data_utils.rand_name('desc_')
109 project = self.identity_utils.create_project(name=project,
110 description=description)
111 project_id = project['id']
112 self.addCleanup(self.identity_utils.delete_project, project_id)
jun xie82fbc582014-02-19 23:07:59 +0800113
114 name = data_utils.rand_name('router-')
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000115 create_body = self.admin_routers_client.create_router(
Ken'ichi Ohmichi6665c972016-02-24 13:09:09 -0800116 name=name, tenant_id=project_id)
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000117 self.addCleanup(self.admin_routers_client.delete_router,
jun xie82fbc582014-02-19 23:07:59 +0800118 create_body['router']['id'])
Jamie Lennox15350172015-08-17 10:54:25 +1000119 self.assertEqual(project_id, create_body['router']['tenant_id'])
jun xie82fbc582014-02-19 23:07:59 +0800120
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -0800121 @decorators.idempotent_id('847257cc-6afd-4154-b8fb-af49f5670ce8')
varun yadavfaa3c8d2014-07-18 05:44:03 -0700122 @test.requires_ext(extension='ext-gw-mode', service='network')
zhufl6b7040a2017-01-18 16:38:34 +0800123 @testtools.skipUnless(CONF.network.public_network_id,
124 'The public_network_id option must be specified.')
varun yadavfaa3c8d2014-07-18 05:44:03 -0700125 def test_create_router_with_default_snat_value(self):
126 # Create a router with default snat rule
Matthew Treinish1d14c542014-06-17 20:25:40 -0400127 router = self._create_router(
zhufld2c40ca2016-10-18 17:03:07 +0800128 external_network_id=CONF.network.public_network_id)
Matthew Treinish1d14c542014-06-17 20:25:40 -0400129 self._verify_router_gateway(
130 router['id'], {'network_id': CONF.network.public_network_id,
131 'enable_snat': True})
varun yadavfaa3c8d2014-07-18 05:44:03 -0700132
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -0800133 @decorators.idempotent_id('ea74068d-09e9-4fd7-8995-9b6a1ace920f')
varun yadavfaa3c8d2014-07-18 05:44:03 -0700134 @test.requires_ext(extension='ext-gw-mode', service='network')
zhufl6b7040a2017-01-18 16:38:34 +0800135 @testtools.skipUnless(CONF.network.public_network_id,
136 'The public_network_id option must be specified.')
varun yadavfaa3c8d2014-07-18 05:44:03 -0700137 def test_create_router_with_snat_explicit(self):
138 name = data_utils.rand_name('snat-router')
139 # Create a router enabling snat attributes
140 enable_snat_states = [False, True]
141 for enable_snat in enable_snat_states:
142 external_gateway_info = {
143 'network_id': CONF.network.public_network_id,
144 'enable_snat': enable_snat}
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000145 create_body = self.admin_routers_client.create_router(
Ken'ichi Ohmichi6665c972016-02-24 13:09:09 -0800146 name=name, external_gateway_info=external_gateway_info)
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000147 self.addCleanup(self.admin_routers_client.delete_router,
Matthew Treinish1d14c542014-06-17 20:25:40 -0400148 create_body['router']['id'])
varun yadavfaa3c8d2014-07-18 05:44:03 -0700149 # Verify snat attributes after router creation
150 self._verify_router_gateway(create_body['router']['id'],
Matthew Treinish1d14c542014-06-17 20:25:40 -0400151 exp_ext_gw_info=external_gateway_info)
varun yadavfaa3c8d2014-07-18 05:44:03 -0700152
Jordan Pittier3b46d272017-04-12 16:17:28 +0200153 @decorators.attr(type='smoke')
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -0800154 @decorators.idempotent_id('b42e6e39-2e37-49cc-a6f4-8467e940900a')
nayna-patel197c0122013-07-11 10:18:00 +0000155 def test_add_remove_router_interface_with_subnet_id(self):
156 network = self.create_network()
157 subnet = self.create_subnet(network)
zhufld2c40ca2016-10-18 17:03:07 +0800158 router = self._create_router()
Chang Bo Guof099f802013-09-13 19:01:46 -0700159 # Add router interface with subnet id
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000160 interface = self.routers_client.add_router_interface(
161 router['id'], subnet_id=subnet['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000162 self.addCleanup(self._remove_router_interface_with_subnet_id,
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700163 router['id'], subnet['id'])
Attila Fazekas4b8b0082013-10-25 14:24:32 +0200164 self.assertIn('subnet_id', interface.keys())
165 self.assertIn('port_id', interface.keys())
nayna-patel197c0122013-07-11 10:18:00 +0000166 # Verify router id is equal to device id in port details
John Warren49c0fe52015-10-22 12:35:54 -0400167 show_port_body = self.ports_client.show_port(
nayna-patel197c0122013-07-11 10:18:00 +0000168 interface['port_id'])
169 self.assertEqual(show_port_body['port']['device_id'],
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700170 router['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000171
Jordan Pittier3b46d272017-04-12 16:17:28 +0200172 @decorators.attr(type='smoke')
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -0800173 @decorators.idempotent_id('2b7d2f37-6748-4d78-92e5-1d590234f0d5')
nayna-patel197c0122013-07-11 10:18:00 +0000174 def test_add_remove_router_interface_with_port_id(self):
175 network = self.create_network()
176 self.create_subnet(network)
zhufld2c40ca2016-10-18 17:03:07 +0800177 router = self._create_router()
John Warren49c0fe52015-10-22 12:35:54 -0400178 port_body = self.ports_client.create_port(
Eugene Nikanorove9d255a2013-12-18 16:31:42 +0400179 network_id=network['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000180 # add router interface to port created above
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000181 interface = self.routers_client.add_router_interface(
piyush11078694aca952015-12-17 12:54:44 +0530182 router['id'],
183 port_id=port_body['port']['id'])
Ken'ichi Ohmichiea2a31a2017-05-04 14:08:07 -0700184 self.addCleanup(self.routers_client.remove_router_interface,
185 router['id'], port_id=port_body['port']['id'])
Attila Fazekas4b8b0082013-10-25 14:24:32 +0200186 self.assertIn('subnet_id', interface.keys())
187 self.assertIn('port_id', interface.keys())
nayna-patel197c0122013-07-11 10:18:00 +0000188 # Verify router id is equal to device id in port details
John Warren49c0fe52015-10-22 12:35:54 -0400189 show_port_body = self.ports_client.show_port(
nayna-patel197c0122013-07-11 10:18:00 +0000190 interface['port_id'])
191 self.assertEqual(show_port_body['port']['device_id'],
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700192 router['id'])
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700193
194 def _verify_router_gateway(self, router_id, exp_ext_gw_info=None):
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000195 show_body = self.admin_routers_client.show_router(router_id)
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700196 actual_ext_gw_info = show_body['router']['external_gateway_info']
197 if exp_ext_gw_info is None:
198 self.assertIsNone(actual_ext_gw_info)
199 return
200 # Verify only keys passed in exp_ext_gw_info
guo yunxian7bbbec12016-08-21 20:03:10 +0800201 for k, v in exp_ext_gw_info.items():
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700202 self.assertEqual(v, actual_ext_gw_info[k])
203
204 def _verify_gateway_port(self, router_id):
John Warren49c0fe52015-10-22 12:35:54 -0400205 list_body = self.admin_ports_client.list_ports(
Matthew Treinish03b48df2014-01-29 16:59:49 +0000206 network_id=CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700207 device_id=router_id)
208 self.assertEqual(len(list_body['ports']), 1)
209 gw_port = list_body['ports'][0]
210 fixed_ips = gw_port['fixed_ips']
Sean M. Collins08803f62014-12-09 16:41:01 -0700211 self.assertGreaterEqual(len(fixed_ips), 1)
Kieran Spearc6cb1ec2016-09-15 19:49:35 +0200212 # Assert that all of the IPs from the router gateway port
213 # are allocated from a valid public subnet.
John Warren94d8faf2015-09-15 12:22:24 -0400214 public_net_body = self.admin_networks_client.show_network(
Matthew Treinish03b48df2014-01-29 16:59:49 +0000215 CONF.network.public_network_id)
Kieran Spearc6cb1ec2016-09-15 19:49:35 +0200216 public_subnet_ids = public_net_body['network']['subnets']
217 for fixed_ip in fixed_ips:
218 subnet_id = fixed_ip['subnet_id']
219 self.assertIn(subnet_id, public_subnet_ids)
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700220
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -0800221 @decorators.idempotent_id('6cc285d8-46bf-4f36-9b1a-783e3008ba79')
zhufl6b7040a2017-01-18 16:38:34 +0800222 @testtools.skipUnless(CONF.network.public_network_id,
223 'The public_network_id option must be specified.')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700224 def test_update_router_set_gateway(self):
zhufld2c40ca2016-10-18 17:03:07 +0800225 router = self._create_router()
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000226 self.routers_client.update_router(
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700227 router['id'],
228 external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +0000229 'network_id': CONF.network.public_network_id})
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700230 # Verify operation - router
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700231 self._verify_router_gateway(
232 router['id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +0000233 {'network_id': CONF.network.public_network_id})
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700234 self._verify_gateway_port(router['id'])
235
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -0800236 @decorators.idempotent_id('b386c111-3b21-466d-880c-5e72b01e1a33')
ronak79f17932014-01-27 17:56:21 -0800237 @test.requires_ext(extension='ext-gw-mode', service='network')
zhufl6b7040a2017-01-18 16:38:34 +0800238 @testtools.skipUnless(CONF.network.public_network_id,
239 'The public_network_id option must be specified.')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700240 def test_update_router_set_gateway_with_snat_explicit(self):
zhufld2c40ca2016-10-18 17:03:07 +0800241 router = self._create_router()
Ken'ichi Ohmichib7cdaae2016-05-04 15:41:07 -0700242 self.admin_routers_client.update_router(
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700243 router['id'],
244 external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +0000245 'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700246 'enable_snat': True})
247 self._verify_router_gateway(
248 router['id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +0000249 {'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700250 'enable_snat': True})
251 self._verify_gateway_port(router['id'])
252
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -0800253 @decorators.idempotent_id('96536bc7-8262-4fb2-9967-5c46940fa279')
ronak79f17932014-01-27 17:56:21 -0800254 @test.requires_ext(extension='ext-gw-mode', service='network')
zhufl6b7040a2017-01-18 16:38:34 +0800255 @testtools.skipUnless(CONF.network.public_network_id,
256 'The public_network_id option must be specified.')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700257 def test_update_router_set_gateway_without_snat(self):
zhufld2c40ca2016-10-18 17:03:07 +0800258 router = self._create_router()
Ken'ichi Ohmichib7cdaae2016-05-04 15:41:07 -0700259 self.admin_routers_client.update_router(
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700260 router['id'],
261 external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +0000262 'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700263 'enable_snat': False})
264 self._verify_router_gateway(
265 router['id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +0000266 {'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700267 'enable_snat': False})
268 self._verify_gateway_port(router['id'])
269
lianghao8c8074c2017-03-09 22:16:52 +0800270 @decorators.idempotent_id('cbe42f84-04c2-11e7-8adb-fa163e4fa634')
271 @test.requires_ext(extension='ext-gw-mode', service='network')
272 @testtools.skipUnless(CONF.network.public_network_id,
273 'The public_network_id option must be specified.')
Jordan Pittier7252ce02017-03-26 20:48:14 +0200274 @decorators.skip_because(bug='1676207')
lianghao8c8074c2017-03-09 22:16:52 +0800275 def test_create_router_set_gateway_with_fixed_ip(self):
276 # Don't know public_network_address, so at first create address
277 # from public_network and delete
278 port = self.admin_ports_client.create_port(
279 network_id=CONF.network.public_network_id)['port']
280 self.admin_ports_client.delete_port(port_id=port['id'])
281
282 fixed_ip = {
283 'subnet_id': port['fixed_ips'][0]['subnet_id'],
284 'ip_address': port['fixed_ips'][0]['ip_address']
285 }
286 external_gateway_info = {
287 'network_id': CONF.network.public_network_id,
288 'external_fixed_ips': [fixed_ip]
289 }
290
291 # Create a router and set gateway to fixed_ip
292 router = self.admin_routers_client.create_router(
293 external_gateway_info=external_gateway_info)['router']
294 self.addCleanup(self.admin_routers_client.delete_router,
295 router_id=router['id'])
296 # Examine router's gateway is equal to fixed_ip
297 self.assertEqual(router['external_gateway_info'][
298 'external_fixed_ips'][0]['ip_address'],
299 fixed_ip['ip_address'])
300
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -0800301 @decorators.idempotent_id('ad81b7ee-4f81-407b-a19c-17e623f763e8')
zhufl6b7040a2017-01-18 16:38:34 +0800302 @testtools.skipUnless(CONF.network.public_network_id,
303 'The public_network_id option must be specified.')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700304 def test_update_router_unset_gateway(self):
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700305 router = self._create_router(
Matthew Treinish03b48df2014-01-29 16:59:49 +0000306 external_network_id=CONF.network.public_network_id)
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000307 self.routers_client.update_router(router['id'],
308 external_gateway_info={})
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700309 self._verify_router_gateway(router['id'])
310 # No gateway port expected
John Warren49c0fe52015-10-22 12:35:54 -0400311 list_body = self.admin_ports_client.list_ports(
Matthew Treinish03b48df2014-01-29 16:59:49 +0000312 network_id=CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700313 device_id=router['id'])
314 self.assertFalse(list_body['ports'])
315
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -0800316 @decorators.idempotent_id('f2faf994-97f4-410b-a831-9bc977b64374')
ronak79f17932014-01-27 17:56:21 -0800317 @test.requires_ext(extension='ext-gw-mode', service='network')
zhufl6b7040a2017-01-18 16:38:34 +0800318 @testtools.skipUnless(CONF.network.public_network_id,
319 'The public_network_id option must be specified.')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700320 def test_update_router_reset_gateway_without_snat(self):
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700321 router = self._create_router(
Matthew Treinish03b48df2014-01-29 16:59:49 +0000322 external_network_id=CONF.network.public_network_id)
Ken'ichi Ohmichib7cdaae2016-05-04 15:41:07 -0700323 self.admin_routers_client.update_router(
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700324 router['id'],
325 external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +0000326 'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700327 'enable_snat': False})
328 self._verify_router_gateway(
329 router['id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +0000330 {'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700331 'enable_snat': False})
332 self._verify_gateway_port(router['id'])
ChenZheng04ac6942013-12-09 16:42:52 +0800333
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -0800334 @decorators.idempotent_id('c86ac3a8-50bd-4b00-a6b8-62af84a0765c')
armando-migliaccio89e5b962013-12-16 06:12:16 -0800335 @test.requires_ext(extension='extraroute', service='network')
Abhishek6707b5e2016-01-14 15:49:11 +0530336 def test_update_delete_extra_route(self):
Shuquan Huangde79d262015-06-26 02:48:22 +0000337 # Create different cidr for each subnet to avoid cidr duplicate
Sean Dagueed6e5862016-04-04 10:49:13 -0400338 # The cidr starts from project_cidr
Shuquan Huangde79d262015-06-26 02:48:22 +0000339 next_cidr = netaddr.IPNetwork(self.tenant_cidr)
340 # Prepare to build several routes
341 test_routes = []
David Kranz4d06ebb2015-07-31 15:18:08 -0400342 routes_num = 4
Shuquan Huangde79d262015-06-26 02:48:22 +0000343 # Create a router
zhufld2c40ca2016-10-18 17:03:07 +0800344 router = self._create_router(admin_state_up=True)
ChenZheng04ac6942013-12-09 16:42:52 +0800345 self.addCleanup(
346 self._delete_extra_routes,
Brandon Palmf35aa8b2015-08-07 14:56:59 -0500347 router['id'])
Sylvain Afchain85c1e542014-01-11 08:23:16 +0100348 # Update router extra route, second ip of the range is
349 # used as next hop
Shuquan Huangde79d262015-06-26 02:48:22 +0000350 for i in range(routes_num):
351 network = self.create_network()
352 subnet = self.create_subnet(network, cidr=next_cidr)
353 next_cidr = next_cidr.next()
354
355 # Add router interface with subnet id
Brandon Palmf35aa8b2015-08-07 14:56:59 -0500356 self.create_router_interface(router['id'], subnet['id'])
Shuquan Huangde79d262015-06-26 02:48:22 +0000357
358 cidr = netaddr.IPNetwork(subnet['cidr'])
359 next_hop = str(cidr[2])
360 destination = str(subnet['cidr'])
361 test_routes.append(
362 {'nexthop': next_hop, 'destination': destination}
363 )
364
365 test_routes.sort(key=lambda x: x['destination'])
Ken'ichi Ohmichi50fc7842016-05-30 11:21:08 -0700366 extra_route = self.routers_client.update_router(
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000367 router['id'], routes=test_routes)
368 show_body = self.routers_client.show_router(router['id'])
Shuquan Huangde79d262015-06-26 02:48:22 +0000369 # Assert the number of routes
370 self.assertEqual(routes_num, len(extra_route['router']['routes']))
371 self.assertEqual(routes_num, len(show_body['router']['routes']))
372
373 routes = extra_route['router']['routes']
374 routes.sort(key=lambda x: x['destination'])
375 # Assert the nexthops & destination
376 for i in range(routes_num):
377 self.assertEqual(test_routes[i]['destination'],
378 routes[i]['destination'])
379 self.assertEqual(test_routes[i]['nexthop'], routes[i]['nexthop'])
380
381 routes = show_body['router']['routes']
382 routes.sort(key=lambda x: x['destination'])
383 for i in range(routes_num):
384 self.assertEqual(test_routes[i]['destination'],
385 routes[i]['destination'])
386 self.assertEqual(test_routes[i]['nexthop'], routes[i]['nexthop'])
ChenZheng04ac6942013-12-09 16:42:52 +0800387
Ken'ichi Ohmichi1f387612016-05-30 11:28:06 -0700388 self._delete_extra_routes(router['id'])
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000389 show_body_after_deletion = self.routers_client.show_router(
390 router['id'])
Abhishek6707b5e2016-01-14 15:49:11 +0530391 self.assertEmpty(show_body_after_deletion['router']['routes'])
392
ChenZheng04ac6942013-12-09 16:42:52 +0800393 def _delete_extra_routes(self, router_id):
Ken'ichi Ohmichi1f387612016-05-30 11:28:06 -0700394 self.routers_client.update_router(router_id, routes=None)
liudongfbdfc7e2014-02-15 10:52:17 +0800395
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -0800396 @decorators.idempotent_id('a8902683-c788-4246-95c7-ad9c6d63a4d9')
liudongfbdfc7e2014-02-15 10:52:17 +0800397 def test_update_router_admin_state(self):
zhufld2c40ca2016-10-18 17:03:07 +0800398 router = self._create_router()
Brandon Palmf35aa8b2015-08-07 14:56:59 -0500399 self.assertFalse(router['admin_state_up'])
liudongfbdfc7e2014-02-15 10:52:17 +0800400 # Update router admin state
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000401 update_body = self.routers_client.update_router(router['id'],
402 admin_state_up=True)
liudongfbdfc7e2014-02-15 10:52:17 +0800403 self.assertTrue(update_body['router']['admin_state_up'])
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000404 show_body = self.routers_client.show_router(router['id'])
liudongfbdfc7e2014-02-15 10:52:17 +0800405 self.assertTrue(show_body['router']['admin_state_up'])
406
Jordan Pittier3b46d272017-04-12 16:17:28 +0200407 @decorators.attr(type='smoke')
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -0800408 @decorators.idempotent_id('802c73c9-c937-4cef-824b-2191e24a6aab')
liudongfbdfc7e2014-02-15 10:52:17 +0800409 def test_add_multiple_router_interfaces(self):
armando-migliaccioee90a4d2014-05-06 11:54:07 -0700410 network01 = self.create_network(
411 network_name=data_utils.rand_name('router-network01-'))
412 network02 = self.create_network(
413 network_name=data_utils.rand_name('router-network02-'))
414 subnet01 = self.create_subnet(network01)
Sergey Shnaidman97e6a0f2014-11-12 20:00:53 +0300415 sub02_cidr = netaddr.IPNetwork(self.tenant_cidr).next()
armando-migliaccioee90a4d2014-05-06 11:54:07 -0700416 subnet02 = self.create_subnet(network02, cidr=sub02_cidr)
zhufld2c40ca2016-10-18 17:03:07 +0800417 router = self._create_router()
liudongfbdfc7e2014-02-15 10:52:17 +0800418 interface01 = self._add_router_interface_with_subnet_id(router['id'],
419 subnet01['id'])
420 self._verify_router_interface(router['id'], subnet01['id'],
421 interface01['port_id'])
422 interface02 = self._add_router_interface_with_subnet_id(router['id'],
423 subnet02['id'])
424 self._verify_router_interface(router['id'], subnet02['id'],
425 interface02['port_id'])
426
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -0800427 @decorators.idempotent_id('96522edf-b4b5-45d9-8443-fa11c26e6eff')
Hardik Italiae1a17072015-07-15 17:58:24 -0700428 def test_router_interface_port_update_with_fixed_ip(self):
429 network = self.create_network()
430 subnet = self.create_subnet(network)
zhufld2c40ca2016-10-18 17:03:07 +0800431 router = self._create_router()
Hardik Italiae1a17072015-07-15 17:58:24 -0700432 fixed_ip = [{'subnet_id': subnet['id']}]
433 interface = self._add_router_interface_with_subnet_id(router['id'],
434 subnet['id'])
435 self.assertIn('port_id', interface)
436 self.assertIn('subnet_id', interface)
437 port = self.ports_client.show_port(interface['port_id'])
438 self.assertEqual(port['port']['id'], interface['port_id'])
439 router_port = self.ports_client.update_port(port['port']['id'],
440 fixed_ips=fixed_ip)
441 self.assertEqual(subnet['id'],
442 router_port['port']['fixed_ips'][0]['subnet_id'])
443
liudongfbdfc7e2014-02-15 10:52:17 +0800444 def _verify_router_interface(self, router_id, subnet_id, port_id):
John Warren49c0fe52015-10-22 12:35:54 -0400445 show_port_body = self.ports_client.show_port(port_id)
liudongfbdfc7e2014-02-15 10:52:17 +0800446 interface_port = show_port_body['port']
447 self.assertEqual(router_id, interface_port['device_id'])
448 self.assertEqual(subnet_id,
449 interface_port['fixed_ips'][0]['subnet_id'])
Sergey Shnaidman97e6a0f2014-11-12 20:00:53 +0300450
451
452class RoutersIpV6Test(RoutersTest):
453 _ip_version = 6