blob: 3654b2e3dbf0687687b0337b7c1c15f57a07b212 [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
Matthew Treinish71426682015-04-23 11:19:38 -040017import six
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
armando-migliaccio89e5b962013-12-16 06:12:16 -080022from tempest import test
nayna-patel197c0122013-07-11 10:18:00 +000023
Matthew Treinish03b48df2014-01-29 16:59:49 +000024CONF = config.CONF
25
nayna-patel197c0122013-07-11 10:18:00 +000026
rossellae02431e2013-11-15 17:58:29 +010027class RoutersTest(base.BaseRouterTest):
nayna-patel197c0122013-07-11 10:18:00 +000028
29 @classmethod
Rohan Kanadea565e452015-01-27 14:00:13 +053030 def skip_checks(cls):
31 super(RoutersTest, cls).skip_checks()
Yoshihiro Kaneko05670262014-01-18 19:22:44 +090032 if not test.is_extension_enabled('router', 'network'):
33 msg = "router extension not enabled."
34 raise cls.skipException(msg)
Rohan Kanadea565e452015-01-27 14:00:13 +053035
36 @classmethod
37 def setup_clients(cls):
38 super(RoutersTest, cls).setup_clients()
39 cls.identity_admin_client = cls.os_adm.identity_client
40
41 @classmethod
42 def resource_setup(cls):
43 super(RoutersTest, cls).resource_setup()
Sean Dagueed6e5862016-04-04 10:49:13 -040044 cls.tenant_cidr = (CONF.network.project_network_cidr
Sergey Shnaidman97e6a0f2014-11-12 20:00:53 +030045 if cls._ip_version == 4 else
Sean Dagueed6e5862016-04-04 10:49:13 -040046 CONF.network.project_network_v6_cidr)
nayna-patel197c0122013-07-11 10:18:00 +000047
armando-migliaccio89e5b962013-12-16 06:12:16 -080048 @test.attr(type='smoke')
Chris Hoge7579c1a2015-02-26 14:12:15 -080049 @test.idempotent_id('f64403e2-8483-4b34-8ccd-b09a87bcc68c')
nayna-patel197c0122013-07-11 10:18:00 +000050 def test_create_show_list_update_delete_router(self):
51 # Create a router
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -070052 # NOTE(salv-orlando): Do not invoke self.create_router
53 # as we need to check the response code
Masayuki Igawa259c1132013-10-31 17:48:44 +090054 name = data_utils.rand_name('router-')
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +000055 create_body = self.routers_client.create_router(
Ken'ichi Ohmichi6665c972016-02-24 13:09:09 -080056 name=name, external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +000057 "network_id": CONF.network.public_network_id},
nayna-patel197c0122013-07-11 10:18:00 +000058 admin_state_up=False)
nayna-patel197c0122013-07-11 10:18:00 +000059 self.addCleanup(self._delete_router, create_body['router']['id'])
60 self.assertEqual(create_body['router']['name'], name)
61 self.assertEqual(
62 create_body['router']['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 self.assertEqual(create_body['router']['admin_state_up'], False)
65 # Show details of the created router
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +000066 show_body = self.routers_client.show_router(
67 create_body['router']['id'])
nayna-patel197c0122013-07-11 10:18:00 +000068 self.assertEqual(show_body['router']['name'], name)
69 self.assertEqual(
70 show_body['router']['external_gateway_info']['network_id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +000071 CONF.network.public_network_id)
nayna-patel197c0122013-07-11 10:18:00 +000072 self.assertEqual(show_body['router']['admin_state_up'], False)
73 # List routers and verify if created router is there in response
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +000074 list_body = self.routers_client.list_routers()
nayna-patel197c0122013-07-11 10:18:00 +000075 routers_list = list()
76 for router in list_body['routers']:
77 routers_list.append(router['id'])
78 self.assertIn(create_body['router']['id'], routers_list)
79 # Update the name of router and verify if it is updated
80 updated_name = 'updated ' + name
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +000081 update_body = self.routers_client.update_router(
82 create_body['router']['id'], name=updated_name)
nayna-patel197c0122013-07-11 10:18:00 +000083 self.assertEqual(update_body['router']['name'], updated_name)
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +000084 show_body = self.routers_client.show_router(
nayna-patel197c0122013-07-11 10:18:00 +000085 create_body['router']['id'])
86 self.assertEqual(show_body['router']['name'], updated_name)
87
Chris Hoge7579c1a2015-02-26 14:12:15 -080088 @test.idempotent_id('e54dd3a3-4352-4921-b09d-44369ae17397')
Jamie Lennox15350172015-08-17 10:54:25 +100089 def test_create_router_setting_project_id(self):
90 # Test creating router from admin user setting project_id.
91 project = data_utils.rand_name('test_tenant_')
92 description = data_utils.rand_name('desc_')
93 project = self.identity_utils.create_project(name=project,
94 description=description)
95 project_id = project['id']
96 self.addCleanup(self.identity_utils.delete_project, project_id)
jun xie82fbc582014-02-19 23:07:59 +080097
98 name = data_utils.rand_name('router-')
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +000099 create_body = self.admin_routers_client.create_router(
Ken'ichi Ohmichi6665c972016-02-24 13:09:09 -0800100 name=name, tenant_id=project_id)
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000101 self.addCleanup(self.admin_routers_client.delete_router,
jun xie82fbc582014-02-19 23:07:59 +0800102 create_body['router']['id'])
Jamie Lennox15350172015-08-17 10:54:25 +1000103 self.assertEqual(project_id, create_body['router']['tenant_id'])
jun xie82fbc582014-02-19 23:07:59 +0800104
Chris Hoge7579c1a2015-02-26 14:12:15 -0800105 @test.idempotent_id('847257cc-6afd-4154-b8fb-af49f5670ce8')
varun yadavfaa3c8d2014-07-18 05:44:03 -0700106 @test.requires_ext(extension='ext-gw-mode', service='network')
varun yadavfaa3c8d2014-07-18 05:44:03 -0700107 def test_create_router_with_default_snat_value(self):
108 # Create a router with default snat rule
109 name = data_utils.rand_name('router')
Matthew Treinish1d14c542014-06-17 20:25:40 -0400110 router = self._create_router(
111 name, external_network_id=CONF.network.public_network_id)
112 self._verify_router_gateway(
113 router['id'], {'network_id': CONF.network.public_network_id,
114 'enable_snat': True})
varun yadavfaa3c8d2014-07-18 05:44:03 -0700115
Chris Hoge7579c1a2015-02-26 14:12:15 -0800116 @test.idempotent_id('ea74068d-09e9-4fd7-8995-9b6a1ace920f')
varun yadavfaa3c8d2014-07-18 05:44:03 -0700117 @test.requires_ext(extension='ext-gw-mode', service='network')
varun yadavfaa3c8d2014-07-18 05:44:03 -0700118 def test_create_router_with_snat_explicit(self):
119 name = data_utils.rand_name('snat-router')
120 # Create a router enabling snat attributes
121 enable_snat_states = [False, True]
122 for enable_snat in enable_snat_states:
123 external_gateway_info = {
124 'network_id': CONF.network.public_network_id,
125 'enable_snat': enable_snat}
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000126 create_body = self.admin_routers_client.create_router(
Ken'ichi Ohmichi6665c972016-02-24 13:09:09 -0800127 name=name, external_gateway_info=external_gateway_info)
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000128 self.addCleanup(self.admin_routers_client.delete_router,
Matthew Treinish1d14c542014-06-17 20:25:40 -0400129 create_body['router']['id'])
varun yadavfaa3c8d2014-07-18 05:44:03 -0700130 # Verify snat attributes after router creation
131 self._verify_router_gateway(create_body['router']['id'],
Matthew Treinish1d14c542014-06-17 20:25:40 -0400132 exp_ext_gw_info=external_gateway_info)
varun yadavfaa3c8d2014-07-18 05:44:03 -0700133
jun xie82fbc582014-02-19 23:07:59 +0800134 @test.attr(type='smoke')
Chris Hoge7579c1a2015-02-26 14:12:15 -0800135 @test.idempotent_id('b42e6e39-2e37-49cc-a6f4-8467e940900a')
nayna-patel197c0122013-07-11 10:18:00 +0000136 def test_add_remove_router_interface_with_subnet_id(self):
137 network = self.create_network()
138 subnet = self.create_subnet(network)
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700139 router = self._create_router(data_utils.rand_name('router-'))
Chang Bo Guof099f802013-09-13 19:01:46 -0700140 # Add router interface with subnet id
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000141 interface = self.routers_client.add_router_interface(
142 router['id'], subnet_id=subnet['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000143 self.addCleanup(self._remove_router_interface_with_subnet_id,
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700144 router['id'], subnet['id'])
Attila Fazekas4b8b0082013-10-25 14:24:32 +0200145 self.assertIn('subnet_id', interface.keys())
146 self.assertIn('port_id', interface.keys())
nayna-patel197c0122013-07-11 10:18:00 +0000147 # Verify router id is equal to device id in port details
John Warren49c0fe52015-10-22 12:35:54 -0400148 show_port_body = self.ports_client.show_port(
nayna-patel197c0122013-07-11 10:18:00 +0000149 interface['port_id'])
150 self.assertEqual(show_port_body['port']['device_id'],
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700151 router['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000152
armando-migliaccio89e5b962013-12-16 06:12:16 -0800153 @test.attr(type='smoke')
Chris Hoge7579c1a2015-02-26 14:12:15 -0800154 @test.idempotent_id('2b7d2f37-6748-4d78-92e5-1d590234f0d5')
nayna-patel197c0122013-07-11 10:18:00 +0000155 def test_add_remove_router_interface_with_port_id(self):
156 network = self.create_network()
157 self.create_subnet(network)
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700158 router = self._create_router(data_utils.rand_name('router-'))
John Warren49c0fe52015-10-22 12:35:54 -0400159 port_body = self.ports_client.create_port(
Eugene Nikanorove9d255a2013-12-18 16:31:42 +0400160 network_id=network['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000161 # add router interface to port created above
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000162 interface = self.routers_client.add_router_interface(
piyush11078694aca952015-12-17 12:54:44 +0530163 router['id'],
164 port_id=port_body['port']['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000165 self.addCleanup(self._remove_router_interface_with_port_id,
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700166 router['id'], port_body['port']['id'])
Attila Fazekas4b8b0082013-10-25 14:24:32 +0200167 self.assertIn('subnet_id', interface.keys())
168 self.assertIn('port_id', interface.keys())
nayna-patel197c0122013-07-11 10:18:00 +0000169 # Verify router id is equal to device id in port details
John Warren49c0fe52015-10-22 12:35:54 -0400170 show_port_body = self.ports_client.show_port(
nayna-patel197c0122013-07-11 10:18:00 +0000171 interface['port_id'])
172 self.assertEqual(show_port_body['port']['device_id'],
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700173 router['id'])
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700174
175 def _verify_router_gateway(self, router_id, exp_ext_gw_info=None):
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000176 show_body = self.admin_routers_client.show_router(router_id)
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700177 actual_ext_gw_info = show_body['router']['external_gateway_info']
178 if exp_ext_gw_info is None:
179 self.assertIsNone(actual_ext_gw_info)
180 return
181 # Verify only keys passed in exp_ext_gw_info
Matthew Treinish71426682015-04-23 11:19:38 -0400182 for k, v in six.iteritems(exp_ext_gw_info):
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700183 self.assertEqual(v, actual_ext_gw_info[k])
184
185 def _verify_gateway_port(self, router_id):
John Warren49c0fe52015-10-22 12:35:54 -0400186 list_body = self.admin_ports_client.list_ports(
Matthew Treinish03b48df2014-01-29 16:59:49 +0000187 network_id=CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700188 device_id=router_id)
189 self.assertEqual(len(list_body['ports']), 1)
190 gw_port = list_body['ports'][0]
191 fixed_ips = gw_port['fixed_ips']
Sean M. Collins08803f62014-12-09 16:41:01 -0700192 self.assertGreaterEqual(len(fixed_ips), 1)
John Warren94d8faf2015-09-15 12:22:24 -0400193 public_net_body = self.admin_networks_client.show_network(
Matthew Treinish03b48df2014-01-29 16:59:49 +0000194 CONF.network.public_network_id)
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700195 public_subnet_id = public_net_body['network']['subnets'][0]
Sean M. Collins2bc293e2014-12-10 10:37:57 -0700196 self.assertIn(public_subnet_id,
197 map(lambda x: x['subnet_id'], fixed_ips))
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700198
Chris Hoge7579c1a2015-02-26 14:12:15 -0800199 @test.idempotent_id('6cc285d8-46bf-4f36-9b1a-783e3008ba79')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700200 def test_update_router_set_gateway(self):
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700201 router = self._create_router(data_utils.rand_name('router-'))
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000202 self.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 # Verify operation - router
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700207 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 self._verify_gateway_port(router['id'])
211
Chris Hoge7579c1a2015-02-26 14:12:15 -0800212 @test.idempotent_id('b386c111-3b21-466d-880c-5e72b01e1a33')
ronak79f17932014-01-27 17:56:21 -0800213 @test.requires_ext(extension='ext-gw-mode', service='network')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700214 def test_update_router_set_gateway_with_snat_explicit(self):
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700215 router = self._create_router(data_utils.rand_name('router-'))
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000216 self.admin_routers_client.update_router_with_snat_gw_info(
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700217 router['id'],
218 external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +0000219 'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700220 'enable_snat': True})
221 self._verify_router_gateway(
222 router['id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +0000223 {'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700224 'enable_snat': True})
225 self._verify_gateway_port(router['id'])
226
Chris Hoge7579c1a2015-02-26 14:12:15 -0800227 @test.idempotent_id('96536bc7-8262-4fb2-9967-5c46940fa279')
ronak79f17932014-01-27 17:56:21 -0800228 @test.requires_ext(extension='ext-gw-mode', service='network')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700229 def test_update_router_set_gateway_without_snat(self):
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700230 router = self._create_router(data_utils.rand_name('router-'))
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000231 self.admin_routers_client.update_router_with_snat_gw_info(
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
Chris Hoge7579c1a2015-02-26 14:12:15 -0800242 @test.idempotent_id('ad81b7ee-4f81-407b-a19c-17e623f763e8')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700243 def test_update_router_unset_gateway(self):
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700244 router = self._create_router(
Masayuki Igawa259c1132013-10-31 17:48:44 +0900245 data_utils.rand_name('router-'),
Matthew Treinish03b48df2014-01-29 16:59:49 +0000246 external_network_id=CONF.network.public_network_id)
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000247 self.routers_client.update_router(router['id'],
248 external_gateway_info={})
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700249 self._verify_router_gateway(router['id'])
250 # No gateway port expected
John Warren49c0fe52015-10-22 12:35:54 -0400251 list_body = self.admin_ports_client.list_ports(
Matthew Treinish03b48df2014-01-29 16:59:49 +0000252 network_id=CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700253 device_id=router['id'])
254 self.assertFalse(list_body['ports'])
255
Chris Hoge7579c1a2015-02-26 14:12:15 -0800256 @test.idempotent_id('f2faf994-97f4-410b-a831-9bc977b64374')
ronak79f17932014-01-27 17:56:21 -0800257 @test.requires_ext(extension='ext-gw-mode', service='network')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700258 def test_update_router_reset_gateway_without_snat(self):
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700259 router = self._create_router(
Masayuki Igawa259c1132013-10-31 17:48:44 +0900260 data_utils.rand_name('router-'),
Matthew Treinish03b48df2014-01-29 16:59:49 +0000261 external_network_id=CONF.network.public_network_id)
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000262 self.admin_routers_client.update_router_with_snat_gw_info(
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700263 router['id'],
264 external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +0000265 'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700266 'enable_snat': False})
267 self._verify_router_gateway(
268 router['id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +0000269 {'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700270 'enable_snat': False})
271 self._verify_gateway_port(router['id'])
ChenZheng04ac6942013-12-09 16:42:52 +0800272
Chris Hoge7579c1a2015-02-26 14:12:15 -0800273 @test.idempotent_id('c86ac3a8-50bd-4b00-a6b8-62af84a0765c')
armando-migliaccio89e5b962013-12-16 06:12:16 -0800274 @test.requires_ext(extension='extraroute', service='network')
Abhishek6707b5e2016-01-14 15:49:11 +0530275 def test_update_delete_extra_route(self):
Shuquan Huangde79d262015-06-26 02:48:22 +0000276 # Create different cidr for each subnet to avoid cidr duplicate
Sean Dagueed6e5862016-04-04 10:49:13 -0400277 # The cidr starts from project_cidr
Shuquan Huangde79d262015-06-26 02:48:22 +0000278 next_cidr = netaddr.IPNetwork(self.tenant_cidr)
279 # Prepare to build several routes
280 test_routes = []
David Kranz4d06ebb2015-07-31 15:18:08 -0400281 routes_num = 4
Shuquan Huangde79d262015-06-26 02:48:22 +0000282 # Create a router
Brandon Palmf35aa8b2015-08-07 14:56:59 -0500283 router = self._create_router(
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700284 data_utils.rand_name('router-'), True)
ChenZheng04ac6942013-12-09 16:42:52 +0800285 self.addCleanup(
286 self._delete_extra_routes,
Brandon Palmf35aa8b2015-08-07 14:56:59 -0500287 router['id'])
Sylvain Afchain85c1e542014-01-11 08:23:16 +0100288 # Update router extra route, second ip of the range is
289 # used as next hop
Shuquan Huangde79d262015-06-26 02:48:22 +0000290 for i in range(routes_num):
291 network = self.create_network()
292 subnet = self.create_subnet(network, cidr=next_cidr)
293 next_cidr = next_cidr.next()
294
295 # Add router interface with subnet id
Brandon Palmf35aa8b2015-08-07 14:56:59 -0500296 self.create_router_interface(router['id'], subnet['id'])
Shuquan Huangde79d262015-06-26 02:48:22 +0000297
298 cidr = netaddr.IPNetwork(subnet['cidr'])
299 next_hop = str(cidr[2])
300 destination = str(subnet['cidr'])
301 test_routes.append(
302 {'nexthop': next_hop, 'destination': destination}
303 )
304
305 test_routes.sort(key=lambda x: x['destination'])
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000306 extra_route = self.routers_client.update_extra_routes(
307 router['id'], routes=test_routes)
308 show_body = self.routers_client.show_router(router['id'])
Shuquan Huangde79d262015-06-26 02:48:22 +0000309 # Assert the number of routes
310 self.assertEqual(routes_num, len(extra_route['router']['routes']))
311 self.assertEqual(routes_num, len(show_body['router']['routes']))
312
313 routes = extra_route['router']['routes']
314 routes.sort(key=lambda x: x['destination'])
315 # Assert the nexthops & destination
316 for i in range(routes_num):
317 self.assertEqual(test_routes[i]['destination'],
318 routes[i]['destination'])
319 self.assertEqual(test_routes[i]['nexthop'], routes[i]['nexthop'])
320
321 routes = show_body['router']['routes']
322 routes.sort(key=lambda x: x['destination'])
323 for i in range(routes_num):
324 self.assertEqual(test_routes[i]['destination'],
325 routes[i]['destination'])
326 self.assertEqual(test_routes[i]['nexthop'], routes[i]['nexthop'])
ChenZheng04ac6942013-12-09 16:42:52 +0800327
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000328 self.routers_client.delete_extra_routes(router['id'])
329 show_body_after_deletion = self.routers_client.show_router(
330 router['id'])
Abhishek6707b5e2016-01-14 15:49:11 +0530331 self.assertEmpty(show_body_after_deletion['router']['routes'])
332
ChenZheng04ac6942013-12-09 16:42:52 +0800333 def _delete_extra_routes(self, router_id):
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000334 self.routers_client.delete_extra_routes(router_id)
liudongfbdfc7e2014-02-15 10:52:17 +0800335
Chris Hoge7579c1a2015-02-26 14:12:15 -0800336 @test.idempotent_id('a8902683-c788-4246-95c7-ad9c6d63a4d9')
liudongfbdfc7e2014-02-15 10:52:17 +0800337 def test_update_router_admin_state(self):
Brandon Palmf35aa8b2015-08-07 14:56:59 -0500338 router = self._create_router(data_utils.rand_name('router-'))
339 self.assertFalse(router['admin_state_up'])
liudongfbdfc7e2014-02-15 10:52:17 +0800340 # Update router admin state
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000341 update_body = self.routers_client.update_router(router['id'],
342 admin_state_up=True)
liudongfbdfc7e2014-02-15 10:52:17 +0800343 self.assertTrue(update_body['router']['admin_state_up'])
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000344 show_body = self.routers_client.show_router(router['id'])
liudongfbdfc7e2014-02-15 10:52:17 +0800345 self.assertTrue(show_body['router']['admin_state_up'])
346
347 @test.attr(type='smoke')
Chris Hoge7579c1a2015-02-26 14:12:15 -0800348 @test.idempotent_id('802c73c9-c937-4cef-824b-2191e24a6aab')
liudongfbdfc7e2014-02-15 10:52:17 +0800349 def test_add_multiple_router_interfaces(self):
armando-migliaccioee90a4d2014-05-06 11:54:07 -0700350 network01 = self.create_network(
351 network_name=data_utils.rand_name('router-network01-'))
352 network02 = self.create_network(
353 network_name=data_utils.rand_name('router-network02-'))
354 subnet01 = self.create_subnet(network01)
Sergey Shnaidman97e6a0f2014-11-12 20:00:53 +0300355 sub02_cidr = netaddr.IPNetwork(self.tenant_cidr).next()
armando-migliaccioee90a4d2014-05-06 11:54:07 -0700356 subnet02 = self.create_subnet(network02, cidr=sub02_cidr)
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700357 router = self._create_router(data_utils.rand_name('router-'))
liudongfbdfc7e2014-02-15 10:52:17 +0800358 interface01 = self._add_router_interface_with_subnet_id(router['id'],
359 subnet01['id'])
360 self._verify_router_interface(router['id'], subnet01['id'],
361 interface01['port_id'])
362 interface02 = self._add_router_interface_with_subnet_id(router['id'],
363 subnet02['id'])
364 self._verify_router_interface(router['id'], subnet02['id'],
365 interface02['port_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
armando-migliaccio88f7b702014-06-05 12:59:09 -0700377
378
379class DvrRoutersTest(base.BaseRouterTest):
380
381 @classmethod
382 def skip_checks(cls):
383 super(DvrRoutersTest, cls).skip_checks()
384 if not test.is_extension_enabled('dvr', 'network'):
385 msg = "DVR extension not enabled."
386 raise cls.skipException(msg)
387
armando-migliaccio88f7b702014-06-05 12:59:09 -0700388 @test.idempotent_id('141297aa-3424-455d-aa8d-f2d95731e00a')
389 def test_create_distributed_router(self):
390 name = data_utils.rand_name('router')
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000391 create_body = self.admin_routers_client.create_router(
Ken'ichi Ohmichi6665c972016-02-24 13:09:09 -0800392 name=name, distributed=True)
armando-migliaccio88f7b702014-06-05 12:59:09 -0700393 self.addCleanup(self._delete_router,
394 create_body['router']['id'],
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000395 self.admin_routers_client)
armando-migliaccio88f7b702014-06-05 12:59:09 -0700396 self.assertTrue(create_body['router']['distributed'])
397
armando-migliaccio88f7b702014-06-05 12:59:09 -0700398 @test.idempotent_id('644d7a4a-01a1-4b68-bb8d-0c0042cb1729')
399 def test_convert_centralized_router(self):
400 router = self._create_router(data_utils.rand_name('router'))
401 self.assertNotIn('distributed', router)
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000402 update_body = self.admin_routers_client.update_router(router['id'],
403 distributed=True)
armando-migliaccio88f7b702014-06-05 12:59:09 -0700404 self.assertTrue(update_body['router']['distributed'])
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000405 show_body = self.admin_routers_client.show_router(router['id'])
armando-migliaccio88f7b702014-06-05 12:59:09 -0700406 self.assertTrue(show_body['router']['distributed'])
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000407 show_body = self.routers_client.show_router(router['id'])
armando-migliaccio88f7b702014-06-05 12:59:09 -0700408 self.assertNotIn('distributed', show_body['router'])