blob: 694b86b3fff433c32d27bba732b78ea4311e32a5 [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
rossellae02431e2013-11-15 17:58:29 +010019from tempest.api.network import base_routers as base
Fei Long Wangd39431f2015-05-14 11:30:48 +120020from tempest.common.utils import data_utils
Matthew Treinish03b48df2014-01-29 16:59:49 +000021from tempest import config
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
rossellae02431e2013-11-15 17:58:29 +010028class RoutersTest(base.BaseRouterTest):
nayna-patel197c0122013-07-11 10:18:00 +000029
30 @classmethod
Rohan Kanadea565e452015-01-27 14:00:13 +053031 def skip_checks(cls):
32 super(RoutersTest, cls).skip_checks()
Yoshihiro Kaneko05670262014-01-18 19:22:44 +090033 if not test.is_extension_enabled('router', 'network'):
34 msg = "router extension not enabled."
35 raise cls.skipException(msg)
Rohan Kanadea565e452015-01-27 14:00:13 +053036
37 @classmethod
Rohan Kanadea565e452015-01-27 14:00:13 +053038 def resource_setup(cls):
39 super(RoutersTest, cls).resource_setup()
Sean Dagueed6e5862016-04-04 10:49:13 -040040 cls.tenant_cidr = (CONF.network.project_network_cidr
Sergey Shnaidman97e6a0f2014-11-12 20:00:53 +030041 if cls._ip_version == 4 else
Sean Dagueed6e5862016-04-04 10:49:13 -040042 CONF.network.project_network_v6_cidr)
nayna-patel197c0122013-07-11 10:18:00 +000043
armando-migliaccio89e5b962013-12-16 06:12:16 -080044 @test.attr(type='smoke')
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -080045 @decorators.idempotent_id('f64403e2-8483-4b34-8ccd-b09a87bcc68c')
zhufl6b7040a2017-01-18 16:38:34 +080046 @testtools.skipUnless(CONF.network.public_network_id,
47 'The public_network_id option must be specified.')
nayna-patel197c0122013-07-11 10:18:00 +000048 def test_create_show_list_update_delete_router(self):
49 # Create a router
Tianbiao Qi83158912016-11-03 10:37:30 +080050 router = self._create_router(
51 admin_state_up=False,
52 external_network_id=CONF.network.public_network_id)
53 self.assertEqual(router['admin_state_up'], False)
nayna-patel197c0122013-07-11 10:18:00 +000054 self.assertEqual(
Tianbiao Qi83158912016-11-03 10:37:30 +080055 router['external_gateway_info']['network_id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +000056 CONF.network.public_network_id)
nayna-patel197c0122013-07-11 10:18:00 +000057 # Show details of the created router
Tianbiao Qi83158912016-11-03 10:37:30 +080058 router_show = self.routers_client.show_router(
59 router['id'])['router']
60 self.assertEqual(router_show['name'], router['name'])
nayna-patel197c0122013-07-11 10:18:00 +000061 self.assertEqual(
Tianbiao Qi83158912016-11-03 10:37:30 +080062 router_show['external_gateway_info']['network_id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +000063 CONF.network.public_network_id)
nayna-patel197c0122013-07-11 10:18:00 +000064 # List routers and verify if created router is there in response
Tianbiao Qi83158912016-11-03 10:37:30 +080065 routers = self.routers_client.list_routers()['routers']
66 self.assertIn(router['id'], map(lambda x: x['id'], routers))
nayna-patel197c0122013-07-11 10:18:00 +000067 # Update the name of router and verify if it is updated
Tianbiao Qi83158912016-11-03 10:37:30 +080068 updated_name = 'updated' + router['name']
69 router_update = self.routers_client.update_router(
70 router['id'], name=updated_name)['router']
71 self.assertEqual(router_update['name'], updated_name)
72 router_show = self.routers_client.show_router(
73 router['id'])['router']
74 self.assertEqual(router_show['name'], updated_name)
nayna-patel197c0122013-07-11 10:18:00 +000075
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -080076 @decorators.idempotent_id('e54dd3a3-4352-4921-b09d-44369ae17397')
Jamie Lennox15350172015-08-17 10:54:25 +100077 def test_create_router_setting_project_id(self):
78 # Test creating router from admin user setting project_id.
79 project = data_utils.rand_name('test_tenant_')
80 description = data_utils.rand_name('desc_')
81 project = self.identity_utils.create_project(name=project,
82 description=description)
83 project_id = project['id']
84 self.addCleanup(self.identity_utils.delete_project, project_id)
jun xie82fbc582014-02-19 23:07:59 +080085
86 name = data_utils.rand_name('router-')
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +000087 create_body = self.admin_routers_client.create_router(
Ken'ichi Ohmichi6665c972016-02-24 13:09:09 -080088 name=name, tenant_id=project_id)
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +000089 self.addCleanup(self.admin_routers_client.delete_router,
jun xie82fbc582014-02-19 23:07:59 +080090 create_body['router']['id'])
Jamie Lennox15350172015-08-17 10:54:25 +100091 self.assertEqual(project_id, create_body['router']['tenant_id'])
jun xie82fbc582014-02-19 23:07:59 +080092
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -080093 @decorators.idempotent_id('847257cc-6afd-4154-b8fb-af49f5670ce8')
varun yadavfaa3c8d2014-07-18 05:44:03 -070094 @test.requires_ext(extension='ext-gw-mode', service='network')
zhufl6b7040a2017-01-18 16:38:34 +080095 @testtools.skipUnless(CONF.network.public_network_id,
96 'The public_network_id option must be specified.')
varun yadavfaa3c8d2014-07-18 05:44:03 -070097 def test_create_router_with_default_snat_value(self):
98 # Create a router with default snat rule
Matthew Treinish1d14c542014-06-17 20:25:40 -040099 router = self._create_router(
zhufld2c40ca2016-10-18 17:03:07 +0800100 external_network_id=CONF.network.public_network_id)
Matthew Treinish1d14c542014-06-17 20:25:40 -0400101 self._verify_router_gateway(
102 router['id'], {'network_id': CONF.network.public_network_id,
103 'enable_snat': True})
varun yadavfaa3c8d2014-07-18 05:44:03 -0700104
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -0800105 @decorators.idempotent_id('ea74068d-09e9-4fd7-8995-9b6a1ace920f')
varun yadavfaa3c8d2014-07-18 05:44:03 -0700106 @test.requires_ext(extension='ext-gw-mode', service='network')
zhufl6b7040a2017-01-18 16:38:34 +0800107 @testtools.skipUnless(CONF.network.public_network_id,
108 'The public_network_id option must be specified.')
varun yadavfaa3c8d2014-07-18 05:44:03 -0700109 def test_create_router_with_snat_explicit(self):
110 name = data_utils.rand_name('snat-router')
111 # Create a router enabling snat attributes
112 enable_snat_states = [False, True]
113 for enable_snat in enable_snat_states:
114 external_gateway_info = {
115 'network_id': CONF.network.public_network_id,
116 'enable_snat': enable_snat}
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000117 create_body = self.admin_routers_client.create_router(
Ken'ichi Ohmichi6665c972016-02-24 13:09:09 -0800118 name=name, external_gateway_info=external_gateway_info)
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000119 self.addCleanup(self.admin_routers_client.delete_router,
Matthew Treinish1d14c542014-06-17 20:25:40 -0400120 create_body['router']['id'])
varun yadavfaa3c8d2014-07-18 05:44:03 -0700121 # Verify snat attributes after router creation
122 self._verify_router_gateway(create_body['router']['id'],
Matthew Treinish1d14c542014-06-17 20:25:40 -0400123 exp_ext_gw_info=external_gateway_info)
varun yadavfaa3c8d2014-07-18 05:44:03 -0700124
jun xie82fbc582014-02-19 23:07:59 +0800125 @test.attr(type='smoke')
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -0800126 @decorators.idempotent_id('b42e6e39-2e37-49cc-a6f4-8467e940900a')
nayna-patel197c0122013-07-11 10:18:00 +0000127 def test_add_remove_router_interface_with_subnet_id(self):
128 network = self.create_network()
129 subnet = self.create_subnet(network)
zhufld2c40ca2016-10-18 17:03:07 +0800130 router = self._create_router()
Chang Bo Guof099f802013-09-13 19:01:46 -0700131 # Add router interface with subnet id
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000132 interface = self.routers_client.add_router_interface(
133 router['id'], subnet_id=subnet['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000134 self.addCleanup(self._remove_router_interface_with_subnet_id,
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700135 router['id'], subnet['id'])
Attila Fazekas4b8b0082013-10-25 14:24:32 +0200136 self.assertIn('subnet_id', interface.keys())
137 self.assertIn('port_id', interface.keys())
nayna-patel197c0122013-07-11 10:18:00 +0000138 # Verify router id is equal to device id in port details
John Warren49c0fe52015-10-22 12:35:54 -0400139 show_port_body = self.ports_client.show_port(
nayna-patel197c0122013-07-11 10:18:00 +0000140 interface['port_id'])
141 self.assertEqual(show_port_body['port']['device_id'],
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700142 router['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000143
armando-migliaccio89e5b962013-12-16 06:12:16 -0800144 @test.attr(type='smoke')
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -0800145 @decorators.idempotent_id('2b7d2f37-6748-4d78-92e5-1d590234f0d5')
nayna-patel197c0122013-07-11 10:18:00 +0000146 def test_add_remove_router_interface_with_port_id(self):
147 network = self.create_network()
148 self.create_subnet(network)
zhufld2c40ca2016-10-18 17:03:07 +0800149 router = self._create_router()
John Warren49c0fe52015-10-22 12:35:54 -0400150 port_body = self.ports_client.create_port(
Eugene Nikanorove9d255a2013-12-18 16:31:42 +0400151 network_id=network['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000152 # add router interface to port created above
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000153 interface = self.routers_client.add_router_interface(
piyush11078694aca952015-12-17 12:54:44 +0530154 router['id'],
155 port_id=port_body['port']['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000156 self.addCleanup(self._remove_router_interface_with_port_id,
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700157 router['id'], port_body['port']['id'])
Attila Fazekas4b8b0082013-10-25 14:24:32 +0200158 self.assertIn('subnet_id', interface.keys())
159 self.assertIn('port_id', interface.keys())
nayna-patel197c0122013-07-11 10:18:00 +0000160 # Verify router id is equal to device id in port details
John Warren49c0fe52015-10-22 12:35:54 -0400161 show_port_body = self.ports_client.show_port(
nayna-patel197c0122013-07-11 10:18:00 +0000162 interface['port_id'])
163 self.assertEqual(show_port_body['port']['device_id'],
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700164 router['id'])
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700165
166 def _verify_router_gateway(self, router_id, exp_ext_gw_info=None):
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000167 show_body = self.admin_routers_client.show_router(router_id)
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700168 actual_ext_gw_info = show_body['router']['external_gateway_info']
169 if exp_ext_gw_info is None:
170 self.assertIsNone(actual_ext_gw_info)
171 return
172 # Verify only keys passed in exp_ext_gw_info
guo yunxian7bbbec12016-08-21 20:03:10 +0800173 for k, v in exp_ext_gw_info.items():
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700174 self.assertEqual(v, actual_ext_gw_info[k])
175
176 def _verify_gateway_port(self, router_id):
John Warren49c0fe52015-10-22 12:35:54 -0400177 list_body = self.admin_ports_client.list_ports(
Matthew Treinish03b48df2014-01-29 16:59:49 +0000178 network_id=CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700179 device_id=router_id)
180 self.assertEqual(len(list_body['ports']), 1)
181 gw_port = list_body['ports'][0]
182 fixed_ips = gw_port['fixed_ips']
Sean M. Collins08803f62014-12-09 16:41:01 -0700183 self.assertGreaterEqual(len(fixed_ips), 1)
Kieran Spearc6cb1ec2016-09-15 19:49:35 +0200184 # Assert that all of the IPs from the router gateway port
185 # are allocated from a valid public subnet.
John Warren94d8faf2015-09-15 12:22:24 -0400186 public_net_body = self.admin_networks_client.show_network(
Matthew Treinish03b48df2014-01-29 16:59:49 +0000187 CONF.network.public_network_id)
Kieran Spearc6cb1ec2016-09-15 19:49:35 +0200188 public_subnet_ids = public_net_body['network']['subnets']
189 for fixed_ip in fixed_ips:
190 subnet_id = fixed_ip['subnet_id']
191 self.assertIn(subnet_id, public_subnet_ids)
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700192
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -0800193 @decorators.idempotent_id('6cc285d8-46bf-4f36-9b1a-783e3008ba79')
zhufl6b7040a2017-01-18 16:38:34 +0800194 @testtools.skipUnless(CONF.network.public_network_id,
195 'The public_network_id option must be specified.')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700196 def test_update_router_set_gateway(self):
zhufld2c40ca2016-10-18 17:03:07 +0800197 router = self._create_router()
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000198 self.routers_client.update_router(
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700199 router['id'],
200 external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +0000201 'network_id': CONF.network.public_network_id})
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700202 # Verify operation - router
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700203 self._verify_router_gateway(
204 router['id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +0000205 {'network_id': CONF.network.public_network_id})
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700206 self._verify_gateway_port(router['id'])
207
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -0800208 @decorators.idempotent_id('b386c111-3b21-466d-880c-5e72b01e1a33')
ronak79f17932014-01-27 17:56:21 -0800209 @test.requires_ext(extension='ext-gw-mode', service='network')
zhufl6b7040a2017-01-18 16:38:34 +0800210 @testtools.skipUnless(CONF.network.public_network_id,
211 'The public_network_id option must be specified.')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700212 def test_update_router_set_gateway_with_snat_explicit(self):
zhufld2c40ca2016-10-18 17:03:07 +0800213 router = self._create_router()
Ken'ichi Ohmichib7cdaae2016-05-04 15:41:07 -0700214 self.admin_routers_client.update_router(
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700215 router['id'],
216 external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +0000217 'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700218 'enable_snat': True})
219 self._verify_router_gateway(
220 router['id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +0000221 {'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700222 'enable_snat': True})
223 self._verify_gateway_port(router['id'])
224
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -0800225 @decorators.idempotent_id('96536bc7-8262-4fb2-9967-5c46940fa279')
ronak79f17932014-01-27 17:56:21 -0800226 @test.requires_ext(extension='ext-gw-mode', service='network')
zhufl6b7040a2017-01-18 16:38:34 +0800227 @testtools.skipUnless(CONF.network.public_network_id,
228 'The public_network_id option must be specified.')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700229 def test_update_router_set_gateway_without_snat(self):
zhufld2c40ca2016-10-18 17:03:07 +0800230 router = self._create_router()
Ken'ichi Ohmichib7cdaae2016-05-04 15:41:07 -0700231 self.admin_routers_client.update_router(
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700232 router['id'],
233 external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +0000234 'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700235 'enable_snat': False})
236 self._verify_router_gateway(
237 router['id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +0000238 {'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700239 'enable_snat': False})
240 self._verify_gateway_port(router['id'])
241
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -0800242 @decorators.idempotent_id('ad81b7ee-4f81-407b-a19c-17e623f763e8')
zhufl6b7040a2017-01-18 16:38:34 +0800243 @testtools.skipUnless(CONF.network.public_network_id,
244 'The public_network_id option must be specified.')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700245 def test_update_router_unset_gateway(self):
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700246 router = self._create_router(
Matthew Treinish03b48df2014-01-29 16:59:49 +0000247 external_network_id=CONF.network.public_network_id)
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000248 self.routers_client.update_router(router['id'],
249 external_gateway_info={})
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700250 self._verify_router_gateway(router['id'])
251 # No gateway port expected
John Warren49c0fe52015-10-22 12:35:54 -0400252 list_body = self.admin_ports_client.list_ports(
Matthew Treinish03b48df2014-01-29 16:59:49 +0000253 network_id=CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700254 device_id=router['id'])
255 self.assertFalse(list_body['ports'])
256
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -0800257 @decorators.idempotent_id('f2faf994-97f4-410b-a831-9bc977b64374')
ronak79f17932014-01-27 17:56:21 -0800258 @test.requires_ext(extension='ext-gw-mode', service='network')
zhufl6b7040a2017-01-18 16:38:34 +0800259 @testtools.skipUnless(CONF.network.public_network_id,
260 'The public_network_id option must be specified.')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700261 def test_update_router_reset_gateway_without_snat(self):
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700262 router = self._create_router(
Matthew Treinish03b48df2014-01-29 16:59:49 +0000263 external_network_id=CONF.network.public_network_id)
Ken'ichi Ohmichib7cdaae2016-05-04 15:41:07 -0700264 self.admin_routers_client.update_router(
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700265 router['id'],
266 external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +0000267 'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700268 'enable_snat': False})
269 self._verify_router_gateway(
270 router['id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +0000271 {'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700272 'enable_snat': False})
273 self._verify_gateway_port(router['id'])
ChenZheng04ac6942013-12-09 16:42:52 +0800274
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -0800275 @decorators.idempotent_id('c86ac3a8-50bd-4b00-a6b8-62af84a0765c')
armando-migliaccio89e5b962013-12-16 06:12:16 -0800276 @test.requires_ext(extension='extraroute', service='network')
Abhishek6707b5e2016-01-14 15:49:11 +0530277 def test_update_delete_extra_route(self):
Shuquan Huangde79d262015-06-26 02:48:22 +0000278 # Create different cidr for each subnet to avoid cidr duplicate
Sean Dagueed6e5862016-04-04 10:49:13 -0400279 # The cidr starts from project_cidr
Shuquan Huangde79d262015-06-26 02:48:22 +0000280 next_cidr = netaddr.IPNetwork(self.tenant_cidr)
281 # Prepare to build several routes
282 test_routes = []
David Kranz4d06ebb2015-07-31 15:18:08 -0400283 routes_num = 4
Shuquan Huangde79d262015-06-26 02:48:22 +0000284 # Create a router
zhufld2c40ca2016-10-18 17:03:07 +0800285 router = self._create_router(admin_state_up=True)
ChenZheng04ac6942013-12-09 16:42:52 +0800286 self.addCleanup(
287 self._delete_extra_routes,
Brandon Palmf35aa8b2015-08-07 14:56:59 -0500288 router['id'])
Sylvain Afchain85c1e542014-01-11 08:23:16 +0100289 # Update router extra route, second ip of the range is
290 # used as next hop
Shuquan Huangde79d262015-06-26 02:48:22 +0000291 for i in range(routes_num):
292 network = self.create_network()
293 subnet = self.create_subnet(network, cidr=next_cidr)
294 next_cidr = next_cidr.next()
295
296 # Add router interface with subnet id
Brandon Palmf35aa8b2015-08-07 14:56:59 -0500297 self.create_router_interface(router['id'], subnet['id'])
Shuquan Huangde79d262015-06-26 02:48:22 +0000298
299 cidr = netaddr.IPNetwork(subnet['cidr'])
300 next_hop = str(cidr[2])
301 destination = str(subnet['cidr'])
302 test_routes.append(
303 {'nexthop': next_hop, 'destination': destination}
304 )
305
306 test_routes.sort(key=lambda x: x['destination'])
Ken'ichi Ohmichi50fc7842016-05-30 11:21:08 -0700307 extra_route = self.routers_client.update_router(
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000308 router['id'], routes=test_routes)
309 show_body = self.routers_client.show_router(router['id'])
Shuquan Huangde79d262015-06-26 02:48:22 +0000310 # Assert the number of routes
311 self.assertEqual(routes_num, len(extra_route['router']['routes']))
312 self.assertEqual(routes_num, len(show_body['router']['routes']))
313
314 routes = extra_route['router']['routes']
315 routes.sort(key=lambda x: x['destination'])
316 # Assert the nexthops & destination
317 for i in range(routes_num):
318 self.assertEqual(test_routes[i]['destination'],
319 routes[i]['destination'])
320 self.assertEqual(test_routes[i]['nexthop'], routes[i]['nexthop'])
321
322 routes = show_body['router']['routes']
323 routes.sort(key=lambda x: x['destination'])
324 for i in range(routes_num):
325 self.assertEqual(test_routes[i]['destination'],
326 routes[i]['destination'])
327 self.assertEqual(test_routes[i]['nexthop'], routes[i]['nexthop'])
ChenZheng04ac6942013-12-09 16:42:52 +0800328
Ken'ichi Ohmichi1f387612016-05-30 11:28:06 -0700329 self._delete_extra_routes(router['id'])
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000330 show_body_after_deletion = self.routers_client.show_router(
331 router['id'])
Abhishek6707b5e2016-01-14 15:49:11 +0530332 self.assertEmpty(show_body_after_deletion['router']['routes'])
333
ChenZheng04ac6942013-12-09 16:42:52 +0800334 def _delete_extra_routes(self, router_id):
Ken'ichi Ohmichi1f387612016-05-30 11:28:06 -0700335 self.routers_client.update_router(router_id, routes=None)
liudongfbdfc7e2014-02-15 10:52:17 +0800336
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -0800337 @decorators.idempotent_id('a8902683-c788-4246-95c7-ad9c6d63a4d9')
liudongfbdfc7e2014-02-15 10:52:17 +0800338 def test_update_router_admin_state(self):
zhufld2c40ca2016-10-18 17:03:07 +0800339 router = self._create_router()
Brandon Palmf35aa8b2015-08-07 14:56:59 -0500340 self.assertFalse(router['admin_state_up'])
liudongfbdfc7e2014-02-15 10:52:17 +0800341 # Update router admin state
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000342 update_body = self.routers_client.update_router(router['id'],
343 admin_state_up=True)
liudongfbdfc7e2014-02-15 10:52:17 +0800344 self.assertTrue(update_body['router']['admin_state_up'])
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000345 show_body = self.routers_client.show_router(router['id'])
liudongfbdfc7e2014-02-15 10:52:17 +0800346 self.assertTrue(show_body['router']['admin_state_up'])
347
348 @test.attr(type='smoke')
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -0800349 @decorators.idempotent_id('802c73c9-c937-4cef-824b-2191e24a6aab')
liudongfbdfc7e2014-02-15 10:52:17 +0800350 def test_add_multiple_router_interfaces(self):
armando-migliaccioee90a4d2014-05-06 11:54:07 -0700351 network01 = self.create_network(
352 network_name=data_utils.rand_name('router-network01-'))
353 network02 = self.create_network(
354 network_name=data_utils.rand_name('router-network02-'))
355 subnet01 = self.create_subnet(network01)
Sergey Shnaidman97e6a0f2014-11-12 20:00:53 +0300356 sub02_cidr = netaddr.IPNetwork(self.tenant_cidr).next()
armando-migliaccioee90a4d2014-05-06 11:54:07 -0700357 subnet02 = self.create_subnet(network02, cidr=sub02_cidr)
zhufld2c40ca2016-10-18 17:03:07 +0800358 router = self._create_router()
liudongfbdfc7e2014-02-15 10:52:17 +0800359 interface01 = self._add_router_interface_with_subnet_id(router['id'],
360 subnet01['id'])
361 self._verify_router_interface(router['id'], subnet01['id'],
362 interface01['port_id'])
363 interface02 = self._add_router_interface_with_subnet_id(router['id'],
364 subnet02['id'])
365 self._verify_router_interface(router['id'], subnet02['id'],
366 interface02['port_id'])
367
Ken'ichi Ohmichi53b9a632017-01-27 18:04:39 -0800368 @decorators.idempotent_id('96522edf-b4b5-45d9-8443-fa11c26e6eff')
Hardik Italiae1a17072015-07-15 17:58:24 -0700369 def test_router_interface_port_update_with_fixed_ip(self):
370 network = self.create_network()
371 subnet = self.create_subnet(network)
zhufld2c40ca2016-10-18 17:03:07 +0800372 router = self._create_router()
Hardik Italiae1a17072015-07-15 17:58:24 -0700373 fixed_ip = [{'subnet_id': subnet['id']}]
374 interface = self._add_router_interface_with_subnet_id(router['id'],
375 subnet['id'])
376 self.assertIn('port_id', interface)
377 self.assertIn('subnet_id', interface)
378 port = self.ports_client.show_port(interface['port_id'])
379 self.assertEqual(port['port']['id'], interface['port_id'])
380 router_port = self.ports_client.update_port(port['port']['id'],
381 fixed_ips=fixed_ip)
382 self.assertEqual(subnet['id'],
383 router_port['port']['fixed_ips'][0]['subnet_id'])
384
liudongfbdfc7e2014-02-15 10:52:17 +0800385 def _verify_router_interface(self, router_id, subnet_id, port_id):
John Warren49c0fe52015-10-22 12:35:54 -0400386 show_port_body = self.ports_client.show_port(port_id)
liudongfbdfc7e2014-02-15 10:52:17 +0800387 interface_port = show_port_body['port']
388 self.assertEqual(router_id, interface_port['device_id'])
389 self.assertEqual(subnet_id,
390 interface_port['fixed_ips'][0]['subnet_id'])
Sergey Shnaidman97e6a0f2014-11-12 20:00:53 +0300391
392
393class RoutersIpV6Test(RoutersTest):
394 _ip_version = 6