blob: 7c0ab7fc643b35969bee27a35b4e70efdffefafe [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 Treinish01472ff2015-02-20 17:26:52 -050017from tempest_lib.common.utils import data_utils
ChenZheng04ac6942013-12-09 16:42:52 +080018
rossellae02431e2013-11-15 17:58:29 +010019from tempest.api.network import base_routers as base
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
36 def setup_clients(cls):
37 super(RoutersTest, cls).setup_clients()
38 cls.identity_admin_client = cls.os_adm.identity_client
39
40 @classmethod
41 def resource_setup(cls):
42 super(RoutersTest, cls).resource_setup()
Sergey Shnaidman97e6a0f2014-11-12 20:00:53 +030043 cls.tenant_cidr = (CONF.network.tenant_network_cidr
44 if cls._ip_version == 4 else
45 CONF.network.tenant_network_v6_cidr)
nayna-patel197c0122013-07-11 10:18:00 +000046
armando-migliaccio89e5b962013-12-16 06:12:16 -080047 @test.attr(type='smoke')
Chris Hoge7579c1a2015-02-26 14:12:15 -080048 @test.idempotent_id('f64403e2-8483-4b34-8ccd-b09a87bcc68c')
nayna-patel197c0122013-07-11 10:18:00 +000049 def test_create_show_list_update_delete_router(self):
50 # Create a router
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -070051 # NOTE(salv-orlando): Do not invoke self.create_router
52 # as we need to check the response code
Masayuki Igawa259c1132013-10-31 17:48:44 +090053 name = data_utils.rand_name('router-')
David Kranz34e88122014-12-11 15:24:05 -050054 create_body = self.client.create_router(
nayna-patel197c0122013-07-11 10:18:00 +000055 name, external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +000056 "network_id": CONF.network.public_network_id},
nayna-patel197c0122013-07-11 10:18:00 +000057 admin_state_up=False)
nayna-patel197c0122013-07-11 10:18:00 +000058 self.addCleanup(self._delete_router, create_body['router']['id'])
59 self.assertEqual(create_body['router']['name'], name)
60 self.assertEqual(
61 create_body['router']['external_gateway_info']['network_id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +000062 CONF.network.public_network_id)
nayna-patel197c0122013-07-11 10:18:00 +000063 self.assertEqual(create_body['router']['admin_state_up'], False)
64 # Show details of the created router
David Kranz34e88122014-12-11 15:24:05 -050065 show_body = self.client.show_router(create_body['router']['id'])
nayna-patel197c0122013-07-11 10:18:00 +000066 self.assertEqual(show_body['router']['name'], name)
67 self.assertEqual(
68 show_body['router']['external_gateway_info']['network_id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +000069 CONF.network.public_network_id)
nayna-patel197c0122013-07-11 10:18:00 +000070 self.assertEqual(show_body['router']['admin_state_up'], False)
71 # List routers and verify if created router is there in response
David Kranz34e88122014-12-11 15:24:05 -050072 list_body = self.client.list_routers()
nayna-patel197c0122013-07-11 10:18:00 +000073 routers_list = list()
74 for router in list_body['routers']:
75 routers_list.append(router['id'])
76 self.assertIn(create_body['router']['id'], routers_list)
77 # Update the name of router and verify if it is updated
78 updated_name = 'updated ' + name
David Kranz34e88122014-12-11 15:24:05 -050079 update_body = self.client.update_router(create_body['router']['id'],
80 name=updated_name)
nayna-patel197c0122013-07-11 10:18:00 +000081 self.assertEqual(update_body['router']['name'], updated_name)
David Kranz34e88122014-12-11 15:24:05 -050082 show_body = self.client.show_router(
nayna-patel197c0122013-07-11 10:18:00 +000083 create_body['router']['id'])
84 self.assertEqual(show_body['router']['name'], updated_name)
85
armando-migliaccio89e5b962013-12-16 06:12:16 -080086 @test.attr(type='smoke')
Chris Hoge7579c1a2015-02-26 14:12:15 -080087 @test.idempotent_id('e54dd3a3-4352-4921-b09d-44369ae17397')
jun xie82fbc582014-02-19 23:07:59 +080088 def test_create_router_setting_tenant_id(self):
89 # Test creating router from admin user setting tenant_id.
90 test_tenant = data_utils.rand_name('test_tenant_')
91 test_description = data_utils.rand_name('desc_')
David Kranzb7afa922014-12-30 10:56:26 -050092 tenant = self.identity_admin_client.create_tenant(
Rohan Kanadeeeb21642014-08-14 12:00:26 +020093 name=test_tenant, description=test_description)
jun xie82fbc582014-02-19 23:07:59 +080094 tenant_id = tenant['id']
95 self.addCleanup(self.identity_admin_client.delete_tenant, tenant_id)
96
97 name = data_utils.rand_name('router-')
David Kranz34e88122014-12-11 15:24:05 -050098 create_body = self.admin_client.create_router(name,
99 tenant_id=tenant_id)
jun xie82fbc582014-02-19 23:07:59 +0800100 self.addCleanup(self.admin_client.delete_router,
101 create_body['router']['id'])
102 self.assertEqual(tenant_id, create_body['router']['tenant_id'])
103
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')
106 @test.attr(type='smoke')
107 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')
118 @test.attr(type='smoke')
119 def test_create_router_with_snat_explicit(self):
120 name = data_utils.rand_name('snat-router')
121 # Create a router enabling snat attributes
122 enable_snat_states = [False, True]
123 for enable_snat in enable_snat_states:
124 external_gateway_info = {
125 'network_id': CONF.network.public_network_id,
126 'enable_snat': enable_snat}
David Kranz34e88122014-12-11 15:24:05 -0500127 create_body = self.admin_client.create_router(
varun yadavfaa3c8d2014-07-18 05:44:03 -0700128 name, external_gateway_info=external_gateway_info)
varun yadavfaa3c8d2014-07-18 05:44:03 -0700129 self.addCleanup(self.admin_client.delete_router,
Matthew Treinish1d14c542014-06-17 20:25:40 -0400130 create_body['router']['id'])
varun yadavfaa3c8d2014-07-18 05:44:03 -0700131 # Verify snat attributes after router creation
132 self._verify_router_gateway(create_body['router']['id'],
Matthew Treinish1d14c542014-06-17 20:25:40 -0400133 exp_ext_gw_info=external_gateway_info)
varun yadavfaa3c8d2014-07-18 05:44:03 -0700134
jun xie82fbc582014-02-19 23:07:59 +0800135 @test.attr(type='smoke')
Chris Hoge7579c1a2015-02-26 14:12:15 -0800136 @test.idempotent_id('b42e6e39-2e37-49cc-a6f4-8467e940900a')
nayna-patel197c0122013-07-11 10:18:00 +0000137 def test_add_remove_router_interface_with_subnet_id(self):
138 network = self.create_network()
139 subnet = self.create_subnet(network)
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700140 router = self._create_router(data_utils.rand_name('router-'))
Chang Bo Guof099f802013-09-13 19:01:46 -0700141 # Add router interface with subnet id
David Kranz34e88122014-12-11 15:24:05 -0500142 interface = self.client.add_router_interface_with_subnet_id(
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700143 router['id'], subnet['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000144 self.addCleanup(self._remove_router_interface_with_subnet_id,
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700145 router['id'], subnet['id'])
Attila Fazekas4b8b0082013-10-25 14:24:32 +0200146 self.assertIn('subnet_id', interface.keys())
147 self.assertIn('port_id', interface.keys())
nayna-patel197c0122013-07-11 10:18:00 +0000148 # Verify router id is equal to device id in port details
David Kranz34e88122014-12-11 15:24:05 -0500149 show_port_body = self.client.show_port(
nayna-patel197c0122013-07-11 10:18:00 +0000150 interface['port_id'])
151 self.assertEqual(show_port_body['port']['device_id'],
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700152 router['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000153
armando-migliaccio89e5b962013-12-16 06:12:16 -0800154 @test.attr(type='smoke')
Chris Hoge7579c1a2015-02-26 14:12:15 -0800155 @test.idempotent_id('2b7d2f37-6748-4d78-92e5-1d590234f0d5')
nayna-patel197c0122013-07-11 10:18:00 +0000156 def test_add_remove_router_interface_with_port_id(self):
157 network = self.create_network()
158 self.create_subnet(network)
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700159 router = self._create_router(data_utils.rand_name('router-'))
David Kranz34e88122014-12-11 15:24:05 -0500160 port_body = self.client.create_port(
Eugene Nikanorove9d255a2013-12-18 16:31:42 +0400161 network_id=network['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000162 # add router interface to port created above
David Kranz34e88122014-12-11 15:24:05 -0500163 interface = self.client.add_router_interface_with_port_id(
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700164 router['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
David Kranz34e88122014-12-11 15:24:05 -0500170 show_port_body = self.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):
David Kranz34e88122014-12-11 15:24:05 -0500176 show_body = self.admin_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
182 for k, v in exp_ext_gw_info.iteritems():
183 self.assertEqual(v, actual_ext_gw_info[k])
184
185 def _verify_gateway_port(self, router_id):
David Kranz34e88122014-12-11 15:24:05 -0500186 list_body = self.admin_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)
David Kranz34e88122014-12-11 15:24:05 -0500193 public_net_body = self.admin_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
armando-migliaccio89e5b962013-12-16 06:12:16 -0800199 @test.attr(type='smoke')
Chris Hoge7579c1a2015-02-26 14:12:15 -0800200 @test.idempotent_id('6cc285d8-46bf-4f36-9b1a-783e3008ba79')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700201 def test_update_router_set_gateway(self):
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700202 router = self._create_router(data_utils.rand_name('router-'))
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700203 self.client.update_router(
204 router['id'],
205 external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +0000206 'network_id': CONF.network.public_network_id})
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700207 # Verify operation - router
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700208 self._verify_router_gateway(
209 router['id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +0000210 {'network_id': CONF.network.public_network_id})
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700211 self._verify_gateway_port(router['id'])
212
Chris Hoge7579c1a2015-02-26 14:12:15 -0800213 @test.idempotent_id('b386c111-3b21-466d-880c-5e72b01e1a33')
ronak79f17932014-01-27 17:56:21 -0800214 @test.requires_ext(extension='ext-gw-mode', service='network')
armando-migliaccio89e5b962013-12-16 06:12:16 -0800215 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700216 def test_update_router_set_gateway_with_snat_explicit(self):
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700217 router = self._create_router(data_utils.rand_name('router-'))
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700218 self.admin_client.update_router_with_snat_gw_info(
219 router['id'],
220 external_gateway_info={
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_router_gateway(
224 router['id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +0000225 {'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700226 'enable_snat': True})
227 self._verify_gateway_port(router['id'])
228
Chris Hoge7579c1a2015-02-26 14:12:15 -0800229 @test.idempotent_id('96536bc7-8262-4fb2-9967-5c46940fa279')
ronak79f17932014-01-27 17:56:21 -0800230 @test.requires_ext(extension='ext-gw-mode', service='network')
armando-migliaccio89e5b962013-12-16 06:12:16 -0800231 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700232 def test_update_router_set_gateway_without_snat(self):
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700233 router = self._create_router(data_utils.rand_name('router-'))
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700234 self.admin_client.update_router_with_snat_gw_info(
235 router['id'],
236 external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +0000237 'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700238 'enable_snat': False})
239 self._verify_router_gateway(
240 router['id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +0000241 {'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700242 'enable_snat': False})
243 self._verify_gateway_port(router['id'])
244
armando-migliaccio89e5b962013-12-16 06:12:16 -0800245 @test.attr(type='smoke')
Chris Hoge7579c1a2015-02-26 14:12:15 -0800246 @test.idempotent_id('ad81b7ee-4f81-407b-a19c-17e623f763e8')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700247 def test_update_router_unset_gateway(self):
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700248 router = self._create_router(
Masayuki Igawa259c1132013-10-31 17:48:44 +0900249 data_utils.rand_name('router-'),
Matthew Treinish03b48df2014-01-29 16:59:49 +0000250 external_network_id=CONF.network.public_network_id)
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700251 self.client.update_router(router['id'], external_gateway_info={})
252 self._verify_router_gateway(router['id'])
253 # No gateway port expected
David Kranz34e88122014-12-11 15:24:05 -0500254 list_body = self.admin_client.list_ports(
Matthew Treinish03b48df2014-01-29 16:59:49 +0000255 network_id=CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700256 device_id=router['id'])
257 self.assertFalse(list_body['ports'])
258
Chris Hoge7579c1a2015-02-26 14:12:15 -0800259 @test.idempotent_id('f2faf994-97f4-410b-a831-9bc977b64374')
ronak79f17932014-01-27 17:56:21 -0800260 @test.requires_ext(extension='ext-gw-mode', service='network')
armando-migliaccio89e5b962013-12-16 06:12:16 -0800261 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700262 def test_update_router_reset_gateway_without_snat(self):
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700263 router = self._create_router(
Masayuki Igawa259c1132013-10-31 17:48:44 +0900264 data_utils.rand_name('router-'),
Matthew Treinish03b48df2014-01-29 16:59:49 +0000265 external_network_id=CONF.network.public_network_id)
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700266 self.admin_client.update_router_with_snat_gw_info(
267 router['id'],
268 external_gateway_info={
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_router_gateway(
272 router['id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +0000273 {'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700274 'enable_snat': False})
275 self._verify_gateway_port(router['id'])
ChenZheng04ac6942013-12-09 16:42:52 +0800276
Chris Hoge7579c1a2015-02-26 14:12:15 -0800277 @test.idempotent_id('c86ac3a8-50bd-4b00-a6b8-62af84a0765c')
armando-migliaccio89e5b962013-12-16 06:12:16 -0800278 @test.requires_ext(extension='extraroute', service='network')
279 @test.attr(type='smoke')
ChenZheng04ac6942013-12-09 16:42:52 +0800280 def test_update_extra_route(self):
281 self.network = self.create_network()
282 self.name = self.network['name']
283 self.subnet = self.create_subnet(self.network)
284 # Add router interface with subnet id
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700285 self.router = self._create_router(
286 data_utils.rand_name('router-'), True)
ChenZheng04ac6942013-12-09 16:42:52 +0800287 self.create_router_interface(self.router['id'], self.subnet['id'])
288 self.addCleanup(
289 self._delete_extra_routes,
290 self.router['id'])
Sylvain Afchain85c1e542014-01-11 08:23:16 +0100291 # Update router extra route, second ip of the range is
292 # used as next hop
ChenZheng04ac6942013-12-09 16:42:52 +0800293 cidr = netaddr.IPNetwork(self.subnet['cidr'])
Sylvain Afchain85c1e542014-01-11 08:23:16 +0100294 next_hop = str(cidr[2])
295 destination = str(self.subnet['cidr'])
David Kranz34e88122014-12-11 15:24:05 -0500296 extra_route = self.client.update_extra_routes(self.router['id'],
297 next_hop, destination)
Sylvain Afchain85c1e542014-01-11 08:23:16 +0100298 self.assertEqual(1, len(extra_route['router']['routes']))
299 self.assertEqual(destination,
300 extra_route['router']['routes'][0]['destination'])
301 self.assertEqual(next_hop,
302 extra_route['router']['routes'][0]['nexthop'])
David Kranz34e88122014-12-11 15:24:05 -0500303 show_body = self.client.show_router(self.router['id'])
Sylvain Afchain85c1e542014-01-11 08:23:16 +0100304 self.assertEqual(destination,
305 show_body['router']['routes'][0]['destination'])
306 self.assertEqual(next_hop,
307 show_body['router']['routes'][0]['nexthop'])
ChenZheng04ac6942013-12-09 16:42:52 +0800308
309 def _delete_extra_routes(self, router_id):
David Kranz34e88122014-12-11 15:24:05 -0500310 self.client.delete_extra_routes(router_id)
liudongfbdfc7e2014-02-15 10:52:17 +0800311
312 @test.attr(type='smoke')
Chris Hoge7579c1a2015-02-26 14:12:15 -0800313 @test.idempotent_id('a8902683-c788-4246-95c7-ad9c6d63a4d9')
liudongfbdfc7e2014-02-15 10:52:17 +0800314 def test_update_router_admin_state(self):
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700315 self.router = self._create_router(data_utils.rand_name('router-'))
liudongfbdfc7e2014-02-15 10:52:17 +0800316 self.assertFalse(self.router['admin_state_up'])
317 # Update router admin state
David Kranz34e88122014-12-11 15:24:05 -0500318 update_body = self.client.update_router(self.router['id'],
319 admin_state_up=True)
liudongfbdfc7e2014-02-15 10:52:17 +0800320 self.assertTrue(update_body['router']['admin_state_up'])
David Kranz34e88122014-12-11 15:24:05 -0500321 show_body = self.client.show_router(self.router['id'])
liudongfbdfc7e2014-02-15 10:52:17 +0800322 self.assertTrue(show_body['router']['admin_state_up'])
323
324 @test.attr(type='smoke')
Chris Hoge7579c1a2015-02-26 14:12:15 -0800325 @test.idempotent_id('802c73c9-c937-4cef-824b-2191e24a6aab')
liudongfbdfc7e2014-02-15 10:52:17 +0800326 def test_add_multiple_router_interfaces(self):
armando-migliaccioee90a4d2014-05-06 11:54:07 -0700327 network01 = self.create_network(
328 network_name=data_utils.rand_name('router-network01-'))
329 network02 = self.create_network(
330 network_name=data_utils.rand_name('router-network02-'))
331 subnet01 = self.create_subnet(network01)
Sergey Shnaidman97e6a0f2014-11-12 20:00:53 +0300332 sub02_cidr = netaddr.IPNetwork(self.tenant_cidr).next()
armando-migliaccioee90a4d2014-05-06 11:54:07 -0700333 subnet02 = self.create_subnet(network02, cidr=sub02_cidr)
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700334 router = self._create_router(data_utils.rand_name('router-'))
liudongfbdfc7e2014-02-15 10:52:17 +0800335 interface01 = self._add_router_interface_with_subnet_id(router['id'],
336 subnet01['id'])
337 self._verify_router_interface(router['id'], subnet01['id'],
338 interface01['port_id'])
339 interface02 = self._add_router_interface_with_subnet_id(router['id'],
340 subnet02['id'])
341 self._verify_router_interface(router['id'], subnet02['id'],
342 interface02['port_id'])
343
liudongfbdfc7e2014-02-15 10:52:17 +0800344 def _verify_router_interface(self, router_id, subnet_id, port_id):
David Kranz34e88122014-12-11 15:24:05 -0500345 show_port_body = self.client.show_port(port_id)
liudongfbdfc7e2014-02-15 10:52:17 +0800346 interface_port = show_port_body['port']
347 self.assertEqual(router_id, interface_port['device_id'])
348 self.assertEqual(subnet_id,
349 interface_port['fixed_ips'][0]['subnet_id'])
Sergey Shnaidman97e6a0f2014-11-12 20:00:53 +0300350
351
352class RoutersIpV6Test(RoutersTest):
353 _ip_version = 6
armando-migliaccio88f7b702014-06-05 12:59:09 -0700354
355
356class DvrRoutersTest(base.BaseRouterTest):
357
358 @classmethod
359 def skip_checks(cls):
360 super(DvrRoutersTest, cls).skip_checks()
361 if not test.is_extension_enabled('dvr', 'network'):
362 msg = "DVR extension not enabled."
363 raise cls.skipException(msg)
364
365 @test.attr(type='smoke')
366 @test.idempotent_id('141297aa-3424-455d-aa8d-f2d95731e00a')
367 def test_create_distributed_router(self):
368 name = data_utils.rand_name('router')
369 create_body = self.admin_client.create_router(
370 name, distributed=True)
371 self.addCleanup(self._delete_router,
372 create_body['router']['id'],
373 self.admin_client)
374 self.assertTrue(create_body['router']['distributed'])
375
376 @test.attr(type='smoke')
377 @test.idempotent_id('644d7a4a-01a1-4b68-bb8d-0c0042cb1729')
378 def test_convert_centralized_router(self):
379 router = self._create_router(data_utils.rand_name('router'))
380 self.assertNotIn('distributed', router)
381 update_body = self.admin_client.update_router(router['id'],
382 distributed=True)
383 self.assertTrue(update_body['router']['distributed'])
384 show_body = self.admin_client.show_router(router['id'])
385 self.assertTrue(show_body['router']['distributed'])
386 show_body = self.client.show_router(router['id'])
387 self.assertNotIn('distributed', show_body['router'])