blob: 29855e1527627e4819f8b9bbeed3888962889a0b [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()
Sergey Shnaidman97e6a0f2014-11-12 20:00:53 +030044 cls.tenant_cidr = (CONF.network.tenant_network_cidr
45 if cls._ip_version == 4 else
46 CONF.network.tenant_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-')
David Kranz34e88122014-12-11 15:24:05 -050055 create_body = self.client.create_router(
nayna-patel197c0122013-07-11 10:18:00 +000056 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
David Kranz34e88122014-12-11 15:24:05 -050066 show_body = self.client.show_router(create_body['router']['id'])
nayna-patel197c0122013-07-11 10:18:00 +000067 self.assertEqual(show_body['router']['name'], name)
68 self.assertEqual(
69 show_body['router']['external_gateway_info']['network_id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +000070 CONF.network.public_network_id)
nayna-patel197c0122013-07-11 10:18:00 +000071 self.assertEqual(show_body['router']['admin_state_up'], False)
72 # List routers and verify if created router is there in response
David Kranz34e88122014-12-11 15:24:05 -050073 list_body = self.client.list_routers()
nayna-patel197c0122013-07-11 10:18:00 +000074 routers_list = list()
75 for router in list_body['routers']:
76 routers_list.append(router['id'])
77 self.assertIn(create_body['router']['id'], routers_list)
78 # Update the name of router and verify if it is updated
79 updated_name = 'updated ' + name
David Kranz34e88122014-12-11 15:24:05 -050080 update_body = self.client.update_router(create_body['router']['id'],
81 name=updated_name)
nayna-patel197c0122013-07-11 10:18:00 +000082 self.assertEqual(update_body['router']['name'], updated_name)
David Kranz34e88122014-12-11 15:24:05 -050083 show_body = self.client.show_router(
nayna-patel197c0122013-07-11 10:18:00 +000084 create_body['router']['id'])
85 self.assertEqual(show_body['router']['name'], updated_name)
86
Chris Hoge7579c1a2015-02-26 14:12:15 -080087 @test.idempotent_id('e54dd3a3-4352-4921-b09d-44369ae17397')
Jamie Lennox15350172015-08-17 10:54:25 +100088 def test_create_router_setting_project_id(self):
89 # Test creating router from admin user setting project_id.
90 project = data_utils.rand_name('test_tenant_')
91 description = data_utils.rand_name('desc_')
92 project = self.identity_utils.create_project(name=project,
93 description=description)
94 project_id = project['id']
95 self.addCleanup(self.identity_utils.delete_project, project_id)
jun xie82fbc582014-02-19 23:07:59 +080096
97 name = data_utils.rand_name('router-')
David Kranz34e88122014-12-11 15:24:05 -050098 create_body = self.admin_client.create_router(name,
Jamie Lennox15350172015-08-17 10:54:25 +100099 tenant_id=project_id)
jun xie82fbc582014-02-19 23:07:59 +0800100 self.addCleanup(self.admin_client.delete_router,
101 create_body['router']['id'])
Jamie Lennox15350172015-08-17 10:54:25 +1000102 self.assertEqual(project_id, create_body['router']['tenant_id'])
jun xie82fbc582014-02-19 23:07:59 +0800103
Chris Hoge7579c1a2015-02-26 14:12:15 -0800104 @test.idempotent_id('847257cc-6afd-4154-b8fb-af49f5670ce8')
varun yadavfaa3c8d2014-07-18 05:44:03 -0700105 @test.requires_ext(extension='ext-gw-mode', service='network')
varun yadavfaa3c8d2014-07-18 05:44:03 -0700106 def test_create_router_with_default_snat_value(self):
107 # Create a router with default snat rule
108 name = data_utils.rand_name('router')
Matthew Treinish1d14c542014-06-17 20:25:40 -0400109 router = self._create_router(
110 name, external_network_id=CONF.network.public_network_id)
111 self._verify_router_gateway(
112 router['id'], {'network_id': CONF.network.public_network_id,
113 'enable_snat': True})
varun yadavfaa3c8d2014-07-18 05:44:03 -0700114
Chris Hoge7579c1a2015-02-26 14:12:15 -0800115 @test.idempotent_id('ea74068d-09e9-4fd7-8995-9b6a1ace920f')
varun yadavfaa3c8d2014-07-18 05:44:03 -0700116 @test.requires_ext(extension='ext-gw-mode', service='network')
varun yadavfaa3c8d2014-07-18 05:44:03 -0700117 def test_create_router_with_snat_explicit(self):
118 name = data_utils.rand_name('snat-router')
119 # Create a router enabling snat attributes
120 enable_snat_states = [False, True]
121 for enable_snat in enable_snat_states:
122 external_gateway_info = {
123 'network_id': CONF.network.public_network_id,
124 'enable_snat': enable_snat}
David Kranz34e88122014-12-11 15:24:05 -0500125 create_body = self.admin_client.create_router(
varun yadavfaa3c8d2014-07-18 05:44:03 -0700126 name, external_gateway_info=external_gateway_info)
varun yadavfaa3c8d2014-07-18 05:44:03 -0700127 self.addCleanup(self.admin_client.delete_router,
Matthew Treinish1d14c542014-06-17 20:25:40 -0400128 create_body['router']['id'])
varun yadavfaa3c8d2014-07-18 05:44:03 -0700129 # Verify snat attributes after router creation
130 self._verify_router_gateway(create_body['router']['id'],
Matthew Treinish1d14c542014-06-17 20:25:40 -0400131 exp_ext_gw_info=external_gateway_info)
varun yadavfaa3c8d2014-07-18 05:44:03 -0700132
jun xie82fbc582014-02-19 23:07:59 +0800133 @test.attr(type='smoke')
Chris Hoge7579c1a2015-02-26 14:12:15 -0800134 @test.idempotent_id('b42e6e39-2e37-49cc-a6f4-8467e940900a')
nayna-patel197c0122013-07-11 10:18:00 +0000135 def test_add_remove_router_interface_with_subnet_id(self):
136 network = self.create_network()
137 subnet = self.create_subnet(network)
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700138 router = self._create_router(data_utils.rand_name('router-'))
Chang Bo Guof099f802013-09-13 19:01:46 -0700139 # Add router interface with subnet id
David Kranz34e88122014-12-11 15:24:05 -0500140 interface = self.client.add_router_interface_with_subnet_id(
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700141 router['id'], subnet['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000142 self.addCleanup(self._remove_router_interface_with_subnet_id,
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700143 router['id'], subnet['id'])
Attila Fazekas4b8b0082013-10-25 14:24:32 +0200144 self.assertIn('subnet_id', interface.keys())
145 self.assertIn('port_id', interface.keys())
nayna-patel197c0122013-07-11 10:18:00 +0000146 # Verify router id is equal to device id in port details
David Kranz34e88122014-12-11 15:24:05 -0500147 show_port_body = self.client.show_port(
nayna-patel197c0122013-07-11 10:18:00 +0000148 interface['port_id'])
149 self.assertEqual(show_port_body['port']['device_id'],
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700150 router['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000151
armando-migliaccio89e5b962013-12-16 06:12:16 -0800152 @test.attr(type='smoke')
Chris Hoge7579c1a2015-02-26 14:12:15 -0800153 @test.idempotent_id('2b7d2f37-6748-4d78-92e5-1d590234f0d5')
nayna-patel197c0122013-07-11 10:18:00 +0000154 def test_add_remove_router_interface_with_port_id(self):
155 network = self.create_network()
156 self.create_subnet(network)
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700157 router = self._create_router(data_utils.rand_name('router-'))
David Kranz34e88122014-12-11 15:24:05 -0500158 port_body = self.client.create_port(
Eugene Nikanorove9d255a2013-12-18 16:31:42 +0400159 network_id=network['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000160 # add router interface to port created above
David Kranz34e88122014-12-11 15:24:05 -0500161 interface = self.client.add_router_interface_with_port_id(
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700162 router['id'], port_body['port']['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000163 self.addCleanup(self._remove_router_interface_with_port_id,
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700164 router['id'], port_body['port']['id'])
Attila Fazekas4b8b0082013-10-25 14:24:32 +0200165 self.assertIn('subnet_id', interface.keys())
166 self.assertIn('port_id', interface.keys())
nayna-patel197c0122013-07-11 10:18:00 +0000167 # Verify router id is equal to device id in port details
David Kranz34e88122014-12-11 15:24:05 -0500168 show_port_body = self.client.show_port(
nayna-patel197c0122013-07-11 10:18:00 +0000169 interface['port_id'])
170 self.assertEqual(show_port_body['port']['device_id'],
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700171 router['id'])
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700172
173 def _verify_router_gateway(self, router_id, exp_ext_gw_info=None):
David Kranz34e88122014-12-11 15:24:05 -0500174 show_body = self.admin_client.show_router(router_id)
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700175 actual_ext_gw_info = show_body['router']['external_gateway_info']
176 if exp_ext_gw_info is None:
177 self.assertIsNone(actual_ext_gw_info)
178 return
179 # Verify only keys passed in exp_ext_gw_info
Matthew Treinish71426682015-04-23 11:19:38 -0400180 for k, v in six.iteritems(exp_ext_gw_info):
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700181 self.assertEqual(v, actual_ext_gw_info[k])
182
183 def _verify_gateway_port(self, router_id):
David Kranz34e88122014-12-11 15:24:05 -0500184 list_body = self.admin_client.list_ports(
Matthew Treinish03b48df2014-01-29 16:59:49 +0000185 network_id=CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700186 device_id=router_id)
187 self.assertEqual(len(list_body['ports']), 1)
188 gw_port = list_body['ports'][0]
189 fixed_ips = gw_port['fixed_ips']
Sean M. Collins08803f62014-12-09 16:41:01 -0700190 self.assertGreaterEqual(len(fixed_ips), 1)
John Warren94d8faf2015-09-15 12:22:24 -0400191 public_net_body = self.admin_networks_client.show_network(
Matthew Treinish03b48df2014-01-29 16:59:49 +0000192 CONF.network.public_network_id)
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700193 public_subnet_id = public_net_body['network']['subnets'][0]
Sean M. Collins2bc293e2014-12-10 10:37:57 -0700194 self.assertIn(public_subnet_id,
195 map(lambda x: x['subnet_id'], fixed_ips))
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700196
Chris Hoge7579c1a2015-02-26 14:12:15 -0800197 @test.idempotent_id('6cc285d8-46bf-4f36-9b1a-783e3008ba79')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700198 def test_update_router_set_gateway(self):
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700199 router = self._create_router(data_utils.rand_name('router-'))
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700200 self.client.update_router(
201 router['id'],
202 external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +0000203 'network_id': CONF.network.public_network_id})
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700204 # Verify operation - router
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700205 self._verify_router_gateway(
206 router['id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +0000207 {'network_id': CONF.network.public_network_id})
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700208 self._verify_gateway_port(router['id'])
209
Chris Hoge7579c1a2015-02-26 14:12:15 -0800210 @test.idempotent_id('b386c111-3b21-466d-880c-5e72b01e1a33')
ronak79f17932014-01-27 17:56:21 -0800211 @test.requires_ext(extension='ext-gw-mode', service='network')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700212 def test_update_router_set_gateway_with_snat_explicit(self):
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700213 router = self._create_router(data_utils.rand_name('router-'))
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700214 self.admin_client.update_router_with_snat_gw_info(
215 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
Chris Hoge7579c1a2015-02-26 14:12:15 -0800225 @test.idempotent_id('96536bc7-8262-4fb2-9967-5c46940fa279')
ronak79f17932014-01-27 17:56:21 -0800226 @test.requires_ext(extension='ext-gw-mode', service='network')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700227 def test_update_router_set_gateway_without_snat(self):
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700228 router = self._create_router(data_utils.rand_name('router-'))
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700229 self.admin_client.update_router_with_snat_gw_info(
230 router['id'],
231 external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +0000232 'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700233 'enable_snat': False})
234 self._verify_router_gateway(
235 router['id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +0000236 {'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700237 'enable_snat': False})
238 self._verify_gateway_port(router['id'])
239
Chris Hoge7579c1a2015-02-26 14:12:15 -0800240 @test.idempotent_id('ad81b7ee-4f81-407b-a19c-17e623f763e8')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700241 def test_update_router_unset_gateway(self):
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700242 router = self._create_router(
Masayuki Igawa259c1132013-10-31 17:48:44 +0900243 data_utils.rand_name('router-'),
Matthew Treinish03b48df2014-01-29 16:59:49 +0000244 external_network_id=CONF.network.public_network_id)
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700245 self.client.update_router(router['id'], external_gateway_info={})
246 self._verify_router_gateway(router['id'])
247 # No gateway port expected
David Kranz34e88122014-12-11 15:24:05 -0500248 list_body = self.admin_client.list_ports(
Matthew Treinish03b48df2014-01-29 16:59:49 +0000249 network_id=CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700250 device_id=router['id'])
251 self.assertFalse(list_body['ports'])
252
Chris Hoge7579c1a2015-02-26 14:12:15 -0800253 @test.idempotent_id('f2faf994-97f4-410b-a831-9bc977b64374')
ronak79f17932014-01-27 17:56:21 -0800254 @test.requires_ext(extension='ext-gw-mode', service='network')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700255 def test_update_router_reset_gateway_without_snat(self):
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700256 router = self._create_router(
Masayuki Igawa259c1132013-10-31 17:48:44 +0900257 data_utils.rand_name('router-'),
Matthew Treinish03b48df2014-01-29 16:59:49 +0000258 external_network_id=CONF.network.public_network_id)
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700259 self.admin_client.update_router_with_snat_gw_info(
260 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'])
ChenZheng04ac6942013-12-09 16:42:52 +0800269
Chris Hoge7579c1a2015-02-26 14:12:15 -0800270 @test.idempotent_id('c86ac3a8-50bd-4b00-a6b8-62af84a0765c')
armando-migliaccio89e5b962013-12-16 06:12:16 -0800271 @test.requires_ext(extension='extraroute', service='network')
ChenZheng04ac6942013-12-09 16:42:52 +0800272 def test_update_extra_route(self):
Shuquan Huangde79d262015-06-26 02:48:22 +0000273 # Create different cidr for each subnet to avoid cidr duplicate
274 # The cidr starts from tenant_cidr
275 next_cidr = netaddr.IPNetwork(self.tenant_cidr)
276 # Prepare to build several routes
277 test_routes = []
David Kranz4d06ebb2015-07-31 15:18:08 -0400278 routes_num = 4
Shuquan Huangde79d262015-06-26 02:48:22 +0000279 # Create a router
Brandon Palmf35aa8b2015-08-07 14:56:59 -0500280 router = self._create_router(
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700281 data_utils.rand_name('router-'), True)
ChenZheng04ac6942013-12-09 16:42:52 +0800282 self.addCleanup(
283 self._delete_extra_routes,
Brandon Palmf35aa8b2015-08-07 14:56:59 -0500284 router['id'])
Sylvain Afchain85c1e542014-01-11 08:23:16 +0100285 # Update router extra route, second ip of the range is
286 # used as next hop
Shuquan Huangde79d262015-06-26 02:48:22 +0000287 for i in range(routes_num):
288 network = self.create_network()
289 subnet = self.create_subnet(network, cidr=next_cidr)
290 next_cidr = next_cidr.next()
291
292 # Add router interface with subnet id
Brandon Palmf35aa8b2015-08-07 14:56:59 -0500293 self.create_router_interface(router['id'], subnet['id'])
Shuquan Huangde79d262015-06-26 02:48:22 +0000294
295 cidr = netaddr.IPNetwork(subnet['cidr'])
296 next_hop = str(cidr[2])
297 destination = str(subnet['cidr'])
298 test_routes.append(
299 {'nexthop': next_hop, 'destination': destination}
300 )
301
302 test_routes.sort(key=lambda x: x['destination'])
Brandon Palmf35aa8b2015-08-07 14:56:59 -0500303 extra_route = self.client.update_extra_routes(router['id'],
Shuquan Huangde79d262015-06-26 02:48:22 +0000304 test_routes)
Brandon Palmf35aa8b2015-08-07 14:56:59 -0500305 show_body = self.client.show_router(router['id'])
Shuquan Huangde79d262015-06-26 02:48:22 +0000306 # Assert the number of routes
307 self.assertEqual(routes_num, len(extra_route['router']['routes']))
308 self.assertEqual(routes_num, len(show_body['router']['routes']))
309
310 routes = extra_route['router']['routes']
311 routes.sort(key=lambda x: x['destination'])
312 # Assert the nexthops & destination
313 for i in range(routes_num):
314 self.assertEqual(test_routes[i]['destination'],
315 routes[i]['destination'])
316 self.assertEqual(test_routes[i]['nexthop'], routes[i]['nexthop'])
317
318 routes = show_body['router']['routes']
319 routes.sort(key=lambda x: x['destination'])
320 for i in range(routes_num):
321 self.assertEqual(test_routes[i]['destination'],
322 routes[i]['destination'])
323 self.assertEqual(test_routes[i]['nexthop'], routes[i]['nexthop'])
ChenZheng04ac6942013-12-09 16:42:52 +0800324
325 def _delete_extra_routes(self, router_id):
David Kranz34e88122014-12-11 15:24:05 -0500326 self.client.delete_extra_routes(router_id)
liudongfbdfc7e2014-02-15 10:52:17 +0800327
Chris Hoge7579c1a2015-02-26 14:12:15 -0800328 @test.idempotent_id('a8902683-c788-4246-95c7-ad9c6d63a4d9')
liudongfbdfc7e2014-02-15 10:52:17 +0800329 def test_update_router_admin_state(self):
Brandon Palmf35aa8b2015-08-07 14:56:59 -0500330 router = self._create_router(data_utils.rand_name('router-'))
331 self.assertFalse(router['admin_state_up'])
liudongfbdfc7e2014-02-15 10:52:17 +0800332 # Update router admin state
Brandon Palmf35aa8b2015-08-07 14:56:59 -0500333 update_body = self.client.update_router(router['id'],
David Kranz34e88122014-12-11 15:24:05 -0500334 admin_state_up=True)
liudongfbdfc7e2014-02-15 10:52:17 +0800335 self.assertTrue(update_body['router']['admin_state_up'])
Brandon Palmf35aa8b2015-08-07 14:56:59 -0500336 show_body = self.client.show_router(router['id'])
liudongfbdfc7e2014-02-15 10:52:17 +0800337 self.assertTrue(show_body['router']['admin_state_up'])
338
339 @test.attr(type='smoke')
Chris Hoge7579c1a2015-02-26 14:12:15 -0800340 @test.idempotent_id('802c73c9-c937-4cef-824b-2191e24a6aab')
liudongfbdfc7e2014-02-15 10:52:17 +0800341 def test_add_multiple_router_interfaces(self):
armando-migliaccioee90a4d2014-05-06 11:54:07 -0700342 network01 = self.create_network(
343 network_name=data_utils.rand_name('router-network01-'))
344 network02 = self.create_network(
345 network_name=data_utils.rand_name('router-network02-'))
346 subnet01 = self.create_subnet(network01)
Sergey Shnaidman97e6a0f2014-11-12 20:00:53 +0300347 sub02_cidr = netaddr.IPNetwork(self.tenant_cidr).next()
armando-migliaccioee90a4d2014-05-06 11:54:07 -0700348 subnet02 = self.create_subnet(network02, cidr=sub02_cidr)
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700349 router = self._create_router(data_utils.rand_name('router-'))
liudongfbdfc7e2014-02-15 10:52:17 +0800350 interface01 = self._add_router_interface_with_subnet_id(router['id'],
351 subnet01['id'])
352 self._verify_router_interface(router['id'], subnet01['id'],
353 interface01['port_id'])
354 interface02 = self._add_router_interface_with_subnet_id(router['id'],
355 subnet02['id'])
356 self._verify_router_interface(router['id'], subnet02['id'],
357 interface02['port_id'])
358
liudongfbdfc7e2014-02-15 10:52:17 +0800359 def _verify_router_interface(self, router_id, subnet_id, port_id):
David Kranz34e88122014-12-11 15:24:05 -0500360 show_port_body = self.client.show_port(port_id)
liudongfbdfc7e2014-02-15 10:52:17 +0800361 interface_port = show_port_body['port']
362 self.assertEqual(router_id, interface_port['device_id'])
363 self.assertEqual(subnet_id,
364 interface_port['fixed_ips'][0]['subnet_id'])
Sergey Shnaidman97e6a0f2014-11-12 20:00:53 +0300365
366
367class RoutersIpV6Test(RoutersTest):
368 _ip_version = 6
armando-migliaccio88f7b702014-06-05 12:59:09 -0700369
370
371class DvrRoutersTest(base.BaseRouterTest):
372
373 @classmethod
374 def skip_checks(cls):
375 super(DvrRoutersTest, cls).skip_checks()
376 if not test.is_extension_enabled('dvr', 'network'):
377 msg = "DVR extension not enabled."
378 raise cls.skipException(msg)
379
armando-migliaccio88f7b702014-06-05 12:59:09 -0700380 @test.idempotent_id('141297aa-3424-455d-aa8d-f2d95731e00a')
381 def test_create_distributed_router(self):
382 name = data_utils.rand_name('router')
383 create_body = self.admin_client.create_router(
384 name, distributed=True)
385 self.addCleanup(self._delete_router,
386 create_body['router']['id'],
387 self.admin_client)
388 self.assertTrue(create_body['router']['distributed'])
389
armando-migliaccio88f7b702014-06-05 12:59:09 -0700390 @test.idempotent_id('644d7a4a-01a1-4b68-bb8d-0c0042cb1729')
391 def test_convert_centralized_router(self):
392 router = self._create_router(data_utils.rand_name('router'))
393 self.assertNotIn('distributed', router)
394 update_body = self.admin_client.update_router(router['id'],
395 distributed=True)
396 self.assertTrue(update_body['router']['distributed'])
397 show_body = self.admin_client.show_router(router['id'])
398 self.assertTrue(show_body['router']['distributed'])
399 show_body = self.client.show_router(router['id'])
400 self.assertNotIn('distributed', show_body['router'])