blob: 101e4dd9b2514b74a408d4f65b0e521e1069a316 [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
17
rossellae02431e2013-11-15 17:58:29 +010018from tempest.api.network import base_routers as base
Fei Long Wangd39431f2015-05-14 11:30:48 +120019from tempest.common.utils import data_utils
Matthew Treinish03b48df2014-01-29 16:59:49 +000020from tempest import config
armando-migliaccio89e5b962013-12-16 06:12:16 -080021from tempest import test
nayna-patel197c0122013-07-11 10:18:00 +000022
Matthew Treinish03b48df2014-01-29 16:59:49 +000023CONF = config.CONF
24
nayna-patel197c0122013-07-11 10:18:00 +000025
rossellae02431e2013-11-15 17:58:29 +010026class RoutersTest(base.BaseRouterTest):
nayna-patel197c0122013-07-11 10:18:00 +000027
28 @classmethod
Rohan Kanadea565e452015-01-27 14:00:13 +053029 def skip_checks(cls):
30 super(RoutersTest, cls).skip_checks()
Yoshihiro Kaneko05670262014-01-18 19:22:44 +090031 if not test.is_extension_enabled('router', 'network'):
32 msg = "router extension not enabled."
33 raise cls.skipException(msg)
Rohan Kanadea565e452015-01-27 14:00:13 +053034
35 @classmethod
Rohan Kanadea565e452015-01-27 14:00:13 +053036 def resource_setup(cls):
37 super(RoutersTest, cls).resource_setup()
Sean Dagueed6e5862016-04-04 10:49:13 -040038 cls.tenant_cidr = (CONF.network.project_network_cidr
Sergey Shnaidman97e6a0f2014-11-12 20:00:53 +030039 if cls._ip_version == 4 else
Sean Dagueed6e5862016-04-04 10:49:13 -040040 CONF.network.project_network_v6_cidr)
nayna-patel197c0122013-07-11 10:18:00 +000041
armando-migliaccio89e5b962013-12-16 06:12:16 -080042 @test.attr(type='smoke')
Chris Hoge7579c1a2015-02-26 14:12:15 -080043 @test.idempotent_id('f64403e2-8483-4b34-8ccd-b09a87bcc68c')
nayna-patel197c0122013-07-11 10:18:00 +000044 def test_create_show_list_update_delete_router(self):
45 # Create a router
Tianbiao Qi83158912016-11-03 10:37:30 +080046 router = self._create_router(
47 admin_state_up=False,
48 external_network_id=CONF.network.public_network_id)
49 self.assertEqual(router['admin_state_up'], False)
nayna-patel197c0122013-07-11 10:18:00 +000050 self.assertEqual(
Tianbiao Qi83158912016-11-03 10:37:30 +080051 router['external_gateway_info']['network_id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +000052 CONF.network.public_network_id)
nayna-patel197c0122013-07-11 10:18:00 +000053 # Show details of the created router
Tianbiao Qi83158912016-11-03 10:37:30 +080054 router_show = self.routers_client.show_router(
55 router['id'])['router']
56 self.assertEqual(router_show['name'], router['name'])
nayna-patel197c0122013-07-11 10:18:00 +000057 self.assertEqual(
Tianbiao Qi83158912016-11-03 10:37:30 +080058 router_show['external_gateway_info']['network_id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +000059 CONF.network.public_network_id)
nayna-patel197c0122013-07-11 10:18:00 +000060 # List routers and verify if created router is there in response
Tianbiao Qi83158912016-11-03 10:37:30 +080061 routers = self.routers_client.list_routers()['routers']
62 self.assertIn(router['id'], map(lambda x: x['id'], routers))
nayna-patel197c0122013-07-11 10:18:00 +000063 # Update the name of router and verify if it is updated
Tianbiao Qi83158912016-11-03 10:37:30 +080064 updated_name = 'updated' + router['name']
65 router_update = self.routers_client.update_router(
66 router['id'], name=updated_name)['router']
67 self.assertEqual(router_update['name'], updated_name)
68 router_show = self.routers_client.show_router(
69 router['id'])['router']
70 self.assertEqual(router_show['name'], updated_name)
nayna-patel197c0122013-07-11 10:18:00 +000071
Chris Hoge7579c1a2015-02-26 14:12:15 -080072 @test.idempotent_id('e54dd3a3-4352-4921-b09d-44369ae17397')
Jamie Lennox15350172015-08-17 10:54:25 +100073 def test_create_router_setting_project_id(self):
74 # Test creating router from admin user setting project_id.
75 project = data_utils.rand_name('test_tenant_')
76 description = data_utils.rand_name('desc_')
77 project = self.identity_utils.create_project(name=project,
78 description=description)
79 project_id = project['id']
80 self.addCleanup(self.identity_utils.delete_project, project_id)
jun xie82fbc582014-02-19 23:07:59 +080081
82 name = data_utils.rand_name('router-')
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +000083 create_body = self.admin_routers_client.create_router(
Ken'ichi Ohmichi6665c972016-02-24 13:09:09 -080084 name=name, tenant_id=project_id)
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +000085 self.addCleanup(self.admin_routers_client.delete_router,
jun xie82fbc582014-02-19 23:07:59 +080086 create_body['router']['id'])
Jamie Lennox15350172015-08-17 10:54:25 +100087 self.assertEqual(project_id, create_body['router']['tenant_id'])
jun xie82fbc582014-02-19 23:07:59 +080088
Chris Hoge7579c1a2015-02-26 14:12:15 -080089 @test.idempotent_id('847257cc-6afd-4154-b8fb-af49f5670ce8')
varun yadavfaa3c8d2014-07-18 05:44:03 -070090 @test.requires_ext(extension='ext-gw-mode', service='network')
varun yadavfaa3c8d2014-07-18 05:44:03 -070091 def test_create_router_with_default_snat_value(self):
92 # Create a router with default snat rule
Matthew Treinish1d14c542014-06-17 20:25:40 -040093 router = self._create_router(
zhufld2c40ca2016-10-18 17:03:07 +080094 external_network_id=CONF.network.public_network_id)
Matthew Treinish1d14c542014-06-17 20:25:40 -040095 self._verify_router_gateway(
96 router['id'], {'network_id': CONF.network.public_network_id,
97 'enable_snat': True})
varun yadavfaa3c8d2014-07-18 05:44:03 -070098
Chris Hoge7579c1a2015-02-26 14:12:15 -080099 @test.idempotent_id('ea74068d-09e9-4fd7-8995-9b6a1ace920f')
varun yadavfaa3c8d2014-07-18 05:44:03 -0700100 @test.requires_ext(extension='ext-gw-mode', service='network')
varun yadavfaa3c8d2014-07-18 05:44:03 -0700101 def test_create_router_with_snat_explicit(self):
102 name = data_utils.rand_name('snat-router')
103 # Create a router enabling snat attributes
104 enable_snat_states = [False, True]
105 for enable_snat in enable_snat_states:
106 external_gateway_info = {
107 'network_id': CONF.network.public_network_id,
108 'enable_snat': enable_snat}
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000109 create_body = self.admin_routers_client.create_router(
Ken'ichi Ohmichi6665c972016-02-24 13:09:09 -0800110 name=name, external_gateway_info=external_gateway_info)
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000111 self.addCleanup(self.admin_routers_client.delete_router,
Matthew Treinish1d14c542014-06-17 20:25:40 -0400112 create_body['router']['id'])
varun yadavfaa3c8d2014-07-18 05:44:03 -0700113 # Verify snat attributes after router creation
114 self._verify_router_gateway(create_body['router']['id'],
Matthew Treinish1d14c542014-06-17 20:25:40 -0400115 exp_ext_gw_info=external_gateway_info)
varun yadavfaa3c8d2014-07-18 05:44:03 -0700116
jun xie82fbc582014-02-19 23:07:59 +0800117 @test.attr(type='smoke')
Chris Hoge7579c1a2015-02-26 14:12:15 -0800118 @test.idempotent_id('b42e6e39-2e37-49cc-a6f4-8467e940900a')
nayna-patel197c0122013-07-11 10:18:00 +0000119 def test_add_remove_router_interface_with_subnet_id(self):
120 network = self.create_network()
121 subnet = self.create_subnet(network)
zhufld2c40ca2016-10-18 17:03:07 +0800122 router = self._create_router()
Chang Bo Guof099f802013-09-13 19:01:46 -0700123 # Add router interface with subnet id
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000124 interface = self.routers_client.add_router_interface(
125 router['id'], subnet_id=subnet['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000126 self.addCleanup(self._remove_router_interface_with_subnet_id,
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700127 router['id'], subnet['id'])
Attila Fazekas4b8b0082013-10-25 14:24:32 +0200128 self.assertIn('subnet_id', interface.keys())
129 self.assertIn('port_id', interface.keys())
nayna-patel197c0122013-07-11 10:18:00 +0000130 # Verify router id is equal to device id in port details
John Warren49c0fe52015-10-22 12:35:54 -0400131 show_port_body = self.ports_client.show_port(
nayna-patel197c0122013-07-11 10:18:00 +0000132 interface['port_id'])
133 self.assertEqual(show_port_body['port']['device_id'],
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700134 router['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000135
armando-migliaccio89e5b962013-12-16 06:12:16 -0800136 @test.attr(type='smoke')
Chris Hoge7579c1a2015-02-26 14:12:15 -0800137 @test.idempotent_id('2b7d2f37-6748-4d78-92e5-1d590234f0d5')
nayna-patel197c0122013-07-11 10:18:00 +0000138 def test_add_remove_router_interface_with_port_id(self):
139 network = self.create_network()
140 self.create_subnet(network)
zhufld2c40ca2016-10-18 17:03:07 +0800141 router = self._create_router()
John Warren49c0fe52015-10-22 12:35:54 -0400142 port_body = self.ports_client.create_port(
Eugene Nikanorove9d255a2013-12-18 16:31:42 +0400143 network_id=network['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000144 # add router interface to port created above
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000145 interface = self.routers_client.add_router_interface(
piyush11078694aca952015-12-17 12:54:44 +0530146 router['id'],
147 port_id=port_body['port']['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000148 self.addCleanup(self._remove_router_interface_with_port_id,
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700149 router['id'], port_body['port']['id'])
Attila Fazekas4b8b0082013-10-25 14:24:32 +0200150 self.assertIn('subnet_id', interface.keys())
151 self.assertIn('port_id', interface.keys())
nayna-patel197c0122013-07-11 10:18:00 +0000152 # Verify router id is equal to device id in port details
John Warren49c0fe52015-10-22 12:35:54 -0400153 show_port_body = self.ports_client.show_port(
nayna-patel197c0122013-07-11 10:18:00 +0000154 interface['port_id'])
155 self.assertEqual(show_port_body['port']['device_id'],
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700156 router['id'])
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700157
158 def _verify_router_gateway(self, router_id, exp_ext_gw_info=None):
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000159 show_body = self.admin_routers_client.show_router(router_id)
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700160 actual_ext_gw_info = show_body['router']['external_gateway_info']
161 if exp_ext_gw_info is None:
162 self.assertIsNone(actual_ext_gw_info)
163 return
164 # Verify only keys passed in exp_ext_gw_info
guo yunxian7bbbec12016-08-21 20:03:10 +0800165 for k, v in exp_ext_gw_info.items():
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700166 self.assertEqual(v, actual_ext_gw_info[k])
167
168 def _verify_gateway_port(self, router_id):
John Warren49c0fe52015-10-22 12:35:54 -0400169 list_body = self.admin_ports_client.list_ports(
Matthew Treinish03b48df2014-01-29 16:59:49 +0000170 network_id=CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700171 device_id=router_id)
172 self.assertEqual(len(list_body['ports']), 1)
173 gw_port = list_body['ports'][0]
174 fixed_ips = gw_port['fixed_ips']
Sean M. Collins08803f62014-12-09 16:41:01 -0700175 self.assertGreaterEqual(len(fixed_ips), 1)
Kieran Spearc6cb1ec2016-09-15 19:49:35 +0200176 # Assert that all of the IPs from the router gateway port
177 # are allocated from a valid public subnet.
John Warren94d8faf2015-09-15 12:22:24 -0400178 public_net_body = self.admin_networks_client.show_network(
Matthew Treinish03b48df2014-01-29 16:59:49 +0000179 CONF.network.public_network_id)
Kieran Spearc6cb1ec2016-09-15 19:49:35 +0200180 public_subnet_ids = public_net_body['network']['subnets']
181 for fixed_ip in fixed_ips:
182 subnet_id = fixed_ip['subnet_id']
183 self.assertIn(subnet_id, public_subnet_ids)
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700184
Chris Hoge7579c1a2015-02-26 14:12:15 -0800185 @test.idempotent_id('6cc285d8-46bf-4f36-9b1a-783e3008ba79')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700186 def test_update_router_set_gateway(self):
zhufld2c40ca2016-10-18 17:03:07 +0800187 router = self._create_router()
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000188 self.routers_client.update_router(
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700189 router['id'],
190 external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +0000191 'network_id': CONF.network.public_network_id})
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700192 # Verify operation - router
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700193 self._verify_router_gateway(
194 router['id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +0000195 {'network_id': CONF.network.public_network_id})
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700196 self._verify_gateway_port(router['id'])
197
Chris Hoge7579c1a2015-02-26 14:12:15 -0800198 @test.idempotent_id('b386c111-3b21-466d-880c-5e72b01e1a33')
ronak79f17932014-01-27 17:56:21 -0800199 @test.requires_ext(extension='ext-gw-mode', service='network')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700200 def test_update_router_set_gateway_with_snat_explicit(self):
zhufld2c40ca2016-10-18 17:03:07 +0800201 router = self._create_router()
Ken'ichi Ohmichib7cdaae2016-05-04 15:41:07 -0700202 self.admin_routers_client.update_router(
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700203 router['id'],
204 external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +0000205 'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700206 'enable_snat': True})
207 self._verify_router_gateway(
208 router['id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +0000209 {'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700210 'enable_snat': True})
211 self._verify_gateway_port(router['id'])
212
Chris Hoge7579c1a2015-02-26 14:12:15 -0800213 @test.idempotent_id('96536bc7-8262-4fb2-9967-5c46940fa279')
ronak79f17932014-01-27 17:56:21 -0800214 @test.requires_ext(extension='ext-gw-mode', service='network')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700215 def test_update_router_set_gateway_without_snat(self):
zhufld2c40ca2016-10-18 17:03:07 +0800216 router = self._create_router()
Ken'ichi Ohmichib7cdaae2016-05-04 15:41:07 -0700217 self.admin_routers_client.update_router(
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700218 router['id'],
219 external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +0000220 'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700221 'enable_snat': False})
222 self._verify_router_gateway(
223 router['id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +0000224 {'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700225 'enable_snat': False})
226 self._verify_gateway_port(router['id'])
227
Chris Hoge7579c1a2015-02-26 14:12:15 -0800228 @test.idempotent_id('ad81b7ee-4f81-407b-a19c-17e623f763e8')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700229 def test_update_router_unset_gateway(self):
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700230 router = self._create_router(
Matthew Treinish03b48df2014-01-29 16:59:49 +0000231 external_network_id=CONF.network.public_network_id)
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000232 self.routers_client.update_router(router['id'],
233 external_gateway_info={})
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700234 self._verify_router_gateway(router['id'])
235 # No gateway port expected
John Warren49c0fe52015-10-22 12:35:54 -0400236 list_body = self.admin_ports_client.list_ports(
Matthew Treinish03b48df2014-01-29 16:59:49 +0000237 network_id=CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700238 device_id=router['id'])
239 self.assertFalse(list_body['ports'])
240
Chris Hoge7579c1a2015-02-26 14:12:15 -0800241 @test.idempotent_id('f2faf994-97f4-410b-a831-9bc977b64374')
ronak79f17932014-01-27 17:56:21 -0800242 @test.requires_ext(extension='ext-gw-mode', service='network')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700243 def test_update_router_reset_gateway_without_snat(self):
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700244 router = self._create_router(
Matthew Treinish03b48df2014-01-29 16:59:49 +0000245 external_network_id=CONF.network.public_network_id)
Ken'ichi Ohmichib7cdaae2016-05-04 15:41:07 -0700246 self.admin_routers_client.update_router(
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700247 router['id'],
248 external_gateway_info={
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': False})
251 self._verify_router_gateway(
252 router['id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +0000253 {'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700254 'enable_snat': False})
255 self._verify_gateway_port(router['id'])
ChenZheng04ac6942013-12-09 16:42:52 +0800256
Chris Hoge7579c1a2015-02-26 14:12:15 -0800257 @test.idempotent_id('c86ac3a8-50bd-4b00-a6b8-62af84a0765c')
armando-migliaccio89e5b962013-12-16 06:12:16 -0800258 @test.requires_ext(extension='extraroute', service='network')
Abhishek6707b5e2016-01-14 15:49:11 +0530259 def test_update_delete_extra_route(self):
Shuquan Huangde79d262015-06-26 02:48:22 +0000260 # Create different cidr for each subnet to avoid cidr duplicate
Sean Dagueed6e5862016-04-04 10:49:13 -0400261 # The cidr starts from project_cidr
Shuquan Huangde79d262015-06-26 02:48:22 +0000262 next_cidr = netaddr.IPNetwork(self.tenant_cidr)
263 # Prepare to build several routes
264 test_routes = []
David Kranz4d06ebb2015-07-31 15:18:08 -0400265 routes_num = 4
Shuquan Huangde79d262015-06-26 02:48:22 +0000266 # Create a router
zhufld2c40ca2016-10-18 17:03:07 +0800267 router = self._create_router(admin_state_up=True)
ChenZheng04ac6942013-12-09 16:42:52 +0800268 self.addCleanup(
269 self._delete_extra_routes,
Brandon Palmf35aa8b2015-08-07 14:56:59 -0500270 router['id'])
Sylvain Afchain85c1e542014-01-11 08:23:16 +0100271 # Update router extra route, second ip of the range is
272 # used as next hop
Shuquan Huangde79d262015-06-26 02:48:22 +0000273 for i in range(routes_num):
274 network = self.create_network()
275 subnet = self.create_subnet(network, cidr=next_cidr)
276 next_cidr = next_cidr.next()
277
278 # Add router interface with subnet id
Brandon Palmf35aa8b2015-08-07 14:56:59 -0500279 self.create_router_interface(router['id'], subnet['id'])
Shuquan Huangde79d262015-06-26 02:48:22 +0000280
281 cidr = netaddr.IPNetwork(subnet['cidr'])
282 next_hop = str(cidr[2])
283 destination = str(subnet['cidr'])
284 test_routes.append(
285 {'nexthop': next_hop, 'destination': destination}
286 )
287
288 test_routes.sort(key=lambda x: x['destination'])
Ken'ichi Ohmichi50fc7842016-05-30 11:21:08 -0700289 extra_route = self.routers_client.update_router(
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000290 router['id'], routes=test_routes)
291 show_body = self.routers_client.show_router(router['id'])
Shuquan Huangde79d262015-06-26 02:48:22 +0000292 # Assert the number of routes
293 self.assertEqual(routes_num, len(extra_route['router']['routes']))
294 self.assertEqual(routes_num, len(show_body['router']['routes']))
295
296 routes = extra_route['router']['routes']
297 routes.sort(key=lambda x: x['destination'])
298 # Assert the nexthops & destination
299 for i in range(routes_num):
300 self.assertEqual(test_routes[i]['destination'],
301 routes[i]['destination'])
302 self.assertEqual(test_routes[i]['nexthop'], routes[i]['nexthop'])
303
304 routes = show_body['router']['routes']
305 routes.sort(key=lambda x: x['destination'])
306 for i in range(routes_num):
307 self.assertEqual(test_routes[i]['destination'],
308 routes[i]['destination'])
309 self.assertEqual(test_routes[i]['nexthop'], routes[i]['nexthop'])
ChenZheng04ac6942013-12-09 16:42:52 +0800310
Ken'ichi Ohmichi1f387612016-05-30 11:28:06 -0700311 self._delete_extra_routes(router['id'])
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000312 show_body_after_deletion = self.routers_client.show_router(
313 router['id'])
Abhishek6707b5e2016-01-14 15:49:11 +0530314 self.assertEmpty(show_body_after_deletion['router']['routes'])
315
ChenZheng04ac6942013-12-09 16:42:52 +0800316 def _delete_extra_routes(self, router_id):
Ken'ichi Ohmichi1f387612016-05-30 11:28:06 -0700317 self.routers_client.update_router(router_id, routes=None)
liudongfbdfc7e2014-02-15 10:52:17 +0800318
Chris Hoge7579c1a2015-02-26 14:12:15 -0800319 @test.idempotent_id('a8902683-c788-4246-95c7-ad9c6d63a4d9')
liudongfbdfc7e2014-02-15 10:52:17 +0800320 def test_update_router_admin_state(self):
zhufld2c40ca2016-10-18 17:03:07 +0800321 router = self._create_router()
Brandon Palmf35aa8b2015-08-07 14:56:59 -0500322 self.assertFalse(router['admin_state_up'])
liudongfbdfc7e2014-02-15 10:52:17 +0800323 # Update router admin state
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000324 update_body = self.routers_client.update_router(router['id'],
325 admin_state_up=True)
liudongfbdfc7e2014-02-15 10:52:17 +0800326 self.assertTrue(update_body['router']['admin_state_up'])
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000327 show_body = self.routers_client.show_router(router['id'])
liudongfbdfc7e2014-02-15 10:52:17 +0800328 self.assertTrue(show_body['router']['admin_state_up'])
329
330 @test.attr(type='smoke')
Chris Hoge7579c1a2015-02-26 14:12:15 -0800331 @test.idempotent_id('802c73c9-c937-4cef-824b-2191e24a6aab')
liudongfbdfc7e2014-02-15 10:52:17 +0800332 def test_add_multiple_router_interfaces(self):
armando-migliaccioee90a4d2014-05-06 11:54:07 -0700333 network01 = self.create_network(
334 network_name=data_utils.rand_name('router-network01-'))
335 network02 = self.create_network(
336 network_name=data_utils.rand_name('router-network02-'))
337 subnet01 = self.create_subnet(network01)
Sergey Shnaidman97e6a0f2014-11-12 20:00:53 +0300338 sub02_cidr = netaddr.IPNetwork(self.tenant_cidr).next()
armando-migliaccioee90a4d2014-05-06 11:54:07 -0700339 subnet02 = self.create_subnet(network02, cidr=sub02_cidr)
zhufld2c40ca2016-10-18 17:03:07 +0800340 router = self._create_router()
liudongfbdfc7e2014-02-15 10:52:17 +0800341 interface01 = self._add_router_interface_with_subnet_id(router['id'],
342 subnet01['id'])
343 self._verify_router_interface(router['id'], subnet01['id'],
344 interface01['port_id'])
345 interface02 = self._add_router_interface_with_subnet_id(router['id'],
346 subnet02['id'])
347 self._verify_router_interface(router['id'], subnet02['id'],
348 interface02['port_id'])
349
Hardik Italiae1a17072015-07-15 17:58:24 -0700350 @test.idempotent_id('96522edf-b4b5-45d9-8443-fa11c26e6eff')
351 def test_router_interface_port_update_with_fixed_ip(self):
352 network = self.create_network()
353 subnet = self.create_subnet(network)
zhufld2c40ca2016-10-18 17:03:07 +0800354 router = self._create_router()
Hardik Italiae1a17072015-07-15 17:58:24 -0700355 fixed_ip = [{'subnet_id': subnet['id']}]
356 interface = self._add_router_interface_with_subnet_id(router['id'],
357 subnet['id'])
358 self.assertIn('port_id', interface)
359 self.assertIn('subnet_id', interface)
360 port = self.ports_client.show_port(interface['port_id'])
361 self.assertEqual(port['port']['id'], interface['port_id'])
362 router_port = self.ports_client.update_port(port['port']['id'],
363 fixed_ips=fixed_ip)
364 self.assertEqual(subnet['id'],
365 router_port['port']['fixed_ips'][0]['subnet_id'])
366
liudongfbdfc7e2014-02-15 10:52:17 +0800367 def _verify_router_interface(self, router_id, subnet_id, port_id):
John Warren49c0fe52015-10-22 12:35:54 -0400368 show_port_body = self.ports_client.show_port(port_id)
liudongfbdfc7e2014-02-15 10:52:17 +0800369 interface_port = show_port_body['port']
370 self.assertEqual(router_id, interface_port['device_id'])
371 self.assertEqual(subnet_id,
372 interface_port['fixed_ips'][0]['subnet_id'])
Sergey Shnaidman97e6a0f2014-11-12 20:00:53 +0300373
374
375class RoutersIpV6Test(RoutersTest):
376 _ip_version = 6