blob: 7605b8ab0acf4beec5b072e4d1da1fbc13d69640 [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
jun xie82fbc582014-02-19 23:07:59 +080019from tempest import clients
Masayuki Igawa259c1132013-10-31 17:48:44 +090020from 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):
raiesmh0867698322013-08-20 13:09:01 +053028 _interface = 'json'
nayna-patel197c0122013-07-11 10:18:00 +000029
30 @classmethod
31 def setUpClass(cls):
32 super(RoutersTest, cls).setUpClass()
Yoshihiro Kaneko05670262014-01-18 19:22:44 +090033 if not test.is_extension_enabled('router', 'network'):
34 msg = "router extension not enabled."
35 raise cls.skipException(msg)
jun xie82fbc582014-02-19 23:07:59 +080036 admin_manager = clients.AdminManager()
37 cls.identity_admin_client = admin_manager.identity_client
nayna-patel197c0122013-07-11 10:18:00 +000038
Adam Gandelman3e9d12b2014-04-02 17:04:19 -070039 def _cleanup_router(self, router):
40 self.delete_router(router)
41 self.routers.remove(router)
42
43 def _create_router(self, name, admin_state_up=False,
44 external_network_id=None, enable_snat=None):
45 # associate a cleanup with created routers to avoid quota limits
46 router = self.create_router(name, admin_state_up,
47 external_network_id, enable_snat)
48 self.addCleanup(self._cleanup_router, router)
49 return router
50
armando-migliaccio89e5b962013-12-16 06:12:16 -080051 @test.attr(type='smoke')
nayna-patel197c0122013-07-11 10:18:00 +000052 def test_create_show_list_update_delete_router(self):
53 # Create a router
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -070054 # NOTE(salv-orlando): Do not invoke self.create_router
55 # as we need to check the response code
Masayuki Igawa259c1132013-10-31 17:48:44 +090056 name = data_utils.rand_name('router-')
nayna-patel197c0122013-07-11 10:18:00 +000057 resp, create_body = self.client.create_router(
58 name, external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +000059 "network_id": CONF.network.public_network_id},
nayna-patel197c0122013-07-11 10:18:00 +000060 admin_state_up=False)
61 self.assertEqual('201', resp['status'])
62 self.addCleanup(self._delete_router, create_body['router']['id'])
63 self.assertEqual(create_body['router']['name'], name)
64 self.assertEqual(
65 create_body['router']['external_gateway_info']['network_id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +000066 CONF.network.public_network_id)
nayna-patel197c0122013-07-11 10:18:00 +000067 self.assertEqual(create_body['router']['admin_state_up'], False)
68 # Show details of the created router
69 resp, show_body = self.client.show_router(
70 create_body['router']['id'])
71 self.assertEqual('200', resp['status'])
72 self.assertEqual(show_body['router']['name'], name)
73 self.assertEqual(
74 show_body['router']['external_gateway_info']['network_id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +000075 CONF.network.public_network_id)
nayna-patel197c0122013-07-11 10:18:00 +000076 self.assertEqual(show_body['router']['admin_state_up'], False)
77 # List routers and verify if created router is there in response
78 resp, list_body = self.client.list_routers()
79 self.assertEqual('200', resp['status'])
80 routers_list = list()
81 for router in list_body['routers']:
82 routers_list.append(router['id'])
83 self.assertIn(create_body['router']['id'], routers_list)
84 # Update the name of router and verify if it is updated
85 updated_name = 'updated ' + name
86 resp, update_body = self.client.update_router(
87 create_body['router']['id'], name=updated_name)
88 self.assertEqual('200', resp['status'])
89 self.assertEqual(update_body['router']['name'], updated_name)
90 resp, show_body = self.client.show_router(
91 create_body['router']['id'])
92 self.assertEqual(show_body['router']['name'], updated_name)
93
armando-migliaccio89e5b962013-12-16 06:12:16 -080094 @test.attr(type='smoke')
jun xie82fbc582014-02-19 23:07:59 +080095 def test_create_router_setting_tenant_id(self):
96 # Test creating router from admin user setting tenant_id.
97 test_tenant = data_utils.rand_name('test_tenant_')
98 test_description = data_utils.rand_name('desc_')
99 _, tenant = self.identity_admin_client.create_tenant(
100 name=test_tenant,
101 description=test_description)
102 tenant_id = tenant['id']
103 self.addCleanup(self.identity_admin_client.delete_tenant, tenant_id)
104
105 name = data_utils.rand_name('router-')
106 resp, create_body = self.admin_client.create_router(
107 name, tenant_id=tenant_id)
108 self.assertEqual('201', resp['status'])
109 self.addCleanup(self.admin_client.delete_router,
110 create_body['router']['id'])
111 self.assertEqual(tenant_id, create_body['router']['tenant_id'])
112
113 @test.attr(type='smoke')
nayna-patel197c0122013-07-11 10:18:00 +0000114 def test_add_remove_router_interface_with_subnet_id(self):
115 network = self.create_network()
116 subnet = self.create_subnet(network)
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700117 router = self._create_router(data_utils.rand_name('router-'))
Chang Bo Guof099f802013-09-13 19:01:46 -0700118 # Add router interface with subnet id
nayna-patel197c0122013-07-11 10:18:00 +0000119 resp, interface = self.client.add_router_interface_with_subnet_id(
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700120 router['id'], subnet['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000121 self.assertEqual('200', resp['status'])
122 self.addCleanup(self._remove_router_interface_with_subnet_id,
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700123 router['id'], subnet['id'])
Attila Fazekas4b8b0082013-10-25 14:24:32 +0200124 self.assertIn('subnet_id', interface.keys())
125 self.assertIn('port_id', interface.keys())
nayna-patel197c0122013-07-11 10:18:00 +0000126 # Verify router id is equal to device id in port details
127 resp, show_port_body = self.client.show_port(
128 interface['port_id'])
129 self.assertEqual(show_port_body['port']['device_id'],
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700130 router['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000131
armando-migliaccio89e5b962013-12-16 06:12:16 -0800132 @test.attr(type='smoke')
nayna-patel197c0122013-07-11 10:18:00 +0000133 def test_add_remove_router_interface_with_port_id(self):
134 network = self.create_network()
135 self.create_subnet(network)
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700136 router = self._create_router(data_utils.rand_name('router-'))
Eugene Nikanorove9d255a2013-12-18 16:31:42 +0400137 resp, port_body = self.client.create_port(
138 network_id=network['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000139 # add router interface to port created above
140 resp, interface = self.client.add_router_interface_with_port_id(
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700141 router['id'], port_body['port']['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000142 self.assertEqual('200', resp['status'])
143 self.addCleanup(self._remove_router_interface_with_port_id,
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700144 router['id'], port_body['port']['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
148 resp, show_port_body = self.client.show_port(
149 interface['port_id'])
150 self.assertEqual(show_port_body['port']['device_id'],
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700151 router['id'])
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700152
153 def _verify_router_gateway(self, router_id, exp_ext_gw_info=None):
154 resp, show_body = self.client.show_router(router_id)
155 self.assertEqual('200', resp['status'])
156 actual_ext_gw_info = show_body['router']['external_gateway_info']
157 if exp_ext_gw_info is None:
158 self.assertIsNone(actual_ext_gw_info)
159 return
160 # Verify only keys passed in exp_ext_gw_info
161 for k, v in exp_ext_gw_info.iteritems():
162 self.assertEqual(v, actual_ext_gw_info[k])
163
164 def _verify_gateway_port(self, router_id):
165 resp, list_body = self.admin_client.list_ports(
Matthew Treinish03b48df2014-01-29 16:59:49 +0000166 network_id=CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700167 device_id=router_id)
168 self.assertEqual(len(list_body['ports']), 1)
169 gw_port = list_body['ports'][0]
170 fixed_ips = gw_port['fixed_ips']
171 self.assertEqual(len(fixed_ips), 1)
172 resp, public_net_body = self.admin_client.show_network(
Matthew Treinish03b48df2014-01-29 16:59:49 +0000173 CONF.network.public_network_id)
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700174 public_subnet_id = public_net_body['network']['subnets'][0]
175 self.assertEqual(fixed_ips[0]['subnet_id'], public_subnet_id)
176
armando-migliaccio89e5b962013-12-16 06:12:16 -0800177 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700178 def test_update_router_set_gateway(self):
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700179 router = self._create_router(data_utils.rand_name('router-'))
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700180 self.client.update_router(
181 router['id'],
182 external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +0000183 'network_id': CONF.network.public_network_id})
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700184 # Verify operation - router
185 resp, show_body = self.client.show_router(router['id'])
186 self.assertEqual('200', resp['status'])
187 self._verify_router_gateway(
188 router['id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +0000189 {'network_id': CONF.network.public_network_id})
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700190 self._verify_gateway_port(router['id'])
191
ronak79f17932014-01-27 17:56:21 -0800192 @test.requires_ext(extension='ext-gw-mode', service='network')
armando-migliaccio89e5b962013-12-16 06:12:16 -0800193 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700194 def test_update_router_set_gateway_with_snat_explicit(self):
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700195 router = self._create_router(data_utils.rand_name('router-'))
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700196 self.admin_client.update_router_with_snat_gw_info(
197 router['id'],
198 external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +0000199 'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700200 'enable_snat': True})
201 self._verify_router_gateway(
202 router['id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +0000203 {'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700204 'enable_snat': True})
205 self._verify_gateway_port(router['id'])
206
ronak79f17932014-01-27 17:56:21 -0800207 @test.requires_ext(extension='ext-gw-mode', service='network')
armando-migliaccio89e5b962013-12-16 06:12:16 -0800208 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700209 def test_update_router_set_gateway_without_snat(self):
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700210 router = self._create_router(data_utils.rand_name('router-'))
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700211 self.admin_client.update_router_with_snat_gw_info(
212 router['id'],
213 external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +0000214 'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700215 'enable_snat': False})
216 self._verify_router_gateway(
217 router['id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +0000218 {'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700219 'enable_snat': False})
220 self._verify_gateway_port(router['id'])
221
armando-migliaccio89e5b962013-12-16 06:12:16 -0800222 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700223 def test_update_router_unset_gateway(self):
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700224 router = self._create_router(
Masayuki Igawa259c1132013-10-31 17:48:44 +0900225 data_utils.rand_name('router-'),
Matthew Treinish03b48df2014-01-29 16:59:49 +0000226 external_network_id=CONF.network.public_network_id)
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700227 self.client.update_router(router['id'], external_gateway_info={})
228 self._verify_router_gateway(router['id'])
229 # No gateway port expected
230 resp, list_body = self.admin_client.list_ports(
Matthew Treinish03b48df2014-01-29 16:59:49 +0000231 network_id=CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700232 device_id=router['id'])
233 self.assertFalse(list_body['ports'])
234
ronak79f17932014-01-27 17:56:21 -0800235 @test.requires_ext(extension='ext-gw-mode', service='network')
armando-migliaccio89e5b962013-12-16 06:12:16 -0800236 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700237 def test_update_router_reset_gateway_without_snat(self):
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700238 router = self._create_router(
Masayuki Igawa259c1132013-10-31 17:48:44 +0900239 data_utils.rand_name('router-'),
Matthew Treinish03b48df2014-01-29 16:59:49 +0000240 external_network_id=CONF.network.public_network_id)
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700241 self.admin_client.update_router_with_snat_gw_info(
242 router['id'],
243 external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +0000244 'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700245 'enable_snat': False})
246 self._verify_router_gateway(
247 router['id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +0000248 {'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700249 'enable_snat': False})
250 self._verify_gateway_port(router['id'])
ChenZheng04ac6942013-12-09 16:42:52 +0800251
armando-migliaccio89e5b962013-12-16 06:12:16 -0800252 @test.requires_ext(extension='extraroute', service='network')
253 @test.attr(type='smoke')
ChenZheng04ac6942013-12-09 16:42:52 +0800254 def test_update_extra_route(self):
255 self.network = self.create_network()
256 self.name = self.network['name']
257 self.subnet = self.create_subnet(self.network)
258 # Add router interface with subnet id
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700259 self.router = self._create_router(
260 data_utils.rand_name('router-'), True)
ChenZheng04ac6942013-12-09 16:42:52 +0800261 self.create_router_interface(self.router['id'], self.subnet['id'])
262 self.addCleanup(
263 self._delete_extra_routes,
264 self.router['id'])
Sylvain Afchain85c1e542014-01-11 08:23:16 +0100265 # Update router extra route, second ip of the range is
266 # used as next hop
ChenZheng04ac6942013-12-09 16:42:52 +0800267 cidr = netaddr.IPNetwork(self.subnet['cidr'])
Sylvain Afchain85c1e542014-01-11 08:23:16 +0100268 next_hop = str(cidr[2])
269 destination = str(self.subnet['cidr'])
ChenZheng04ac6942013-12-09 16:42:52 +0800270 resp, extra_route = self.client.update_extra_routes(
Sylvain Afchain85c1e542014-01-11 08:23:16 +0100271 self.router['id'], next_hop, destination)
272 self.assertEqual('200', resp['status'])
273 self.assertEqual(1, len(extra_route['router']['routes']))
274 self.assertEqual(destination,
275 extra_route['router']['routes'][0]['destination'])
276 self.assertEqual(next_hop,
277 extra_route['router']['routes'][0]['nexthop'])
278 resp, show_body = self.client.show_router(self.router['id'])
279 self.assertEqual('200', resp['status'])
280 self.assertEqual(destination,
281 show_body['router']['routes'][0]['destination'])
282 self.assertEqual(next_hop,
283 show_body['router']['routes'][0]['nexthop'])
ChenZheng04ac6942013-12-09 16:42:52 +0800284
285 def _delete_extra_routes(self, router_id):
286 resp, _ = self.client.delete_extra_routes(router_id)
liudongfbdfc7e2014-02-15 10:52:17 +0800287
288 @test.attr(type='smoke')
289 def test_update_router_admin_state(self):
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700290 self.router = self._create_router(data_utils.rand_name('router-'))
liudongfbdfc7e2014-02-15 10:52:17 +0800291 self.assertFalse(self.router['admin_state_up'])
292 # Update router admin state
293 resp, update_body = self.client.update_router(self.router['id'],
294 admin_state_up=True)
295 self.assertEqual('200', resp['status'])
296 self.assertTrue(update_body['router']['admin_state_up'])
297 resp, show_body = self.client.show_router(self.router['id'])
298 self.assertEqual('200', resp['status'])
299 self.assertTrue(show_body['router']['admin_state_up'])
300
301 @test.attr(type='smoke')
302 def test_add_multiple_router_interfaces(self):
303 network = self.create_network()
304 subnet01 = self.create_subnet(network)
305 subnet02 = self.create_subnet(network)
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700306 router = self._create_router(data_utils.rand_name('router-'))
liudongfbdfc7e2014-02-15 10:52:17 +0800307 interface01 = self._add_router_interface_with_subnet_id(router['id'],
308 subnet01['id'])
309 self._verify_router_interface(router['id'], subnet01['id'],
310 interface01['port_id'])
311 interface02 = self._add_router_interface_with_subnet_id(router['id'],
312 subnet02['id'])
313 self._verify_router_interface(router['id'], subnet02['id'],
314 interface02['port_id'])
315
316 def _add_router_interface_with_subnet_id(self, router_id, subnet_id):
317 resp, interface = self.client.add_router_interface_with_subnet_id(
318 router_id, subnet_id)
319 self.assertEqual('200', resp['status'])
320 self.addCleanup(self._remove_router_interface_with_subnet_id,
321 router_id, subnet_id)
322 self.assertEqual(subnet_id, interface['subnet_id'])
323 return interface
324
325 def _verify_router_interface(self, router_id, subnet_id, port_id):
326 resp, show_port_body = self.client.show_port(port_id)
327 self.assertEqual('200', resp['status'])
328 interface_port = show_port_body['port']
329 self.assertEqual(router_id, interface_port['device_id'])
330 self.assertEqual(subnet_id,
331 interface_port['fixed_ips'][0]['subnet_id'])