blob: 878335d36820e245e8446d58cbaeec35ee13a2ee [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
varun yadavfaa3c8d2014-07-18 05:44:03 -0700113 @test.requires_ext(extension='ext-gw-mode', service='network')
114 @test.attr(type='smoke')
115 def test_create_router_with_default_snat_value(self):
116 # Create a router with default snat rule
117 name = data_utils.rand_name('router')
Matthew Treinish1d14c542014-06-17 20:25:40 -0400118 router = self._create_router(
119 name, external_network_id=CONF.network.public_network_id)
120 self._verify_router_gateway(
121 router['id'], {'network_id': CONF.network.public_network_id,
122 'enable_snat': True})
varun yadavfaa3c8d2014-07-18 05:44:03 -0700123
124 @test.requires_ext(extension='ext-gw-mode', service='network')
125 @test.attr(type='smoke')
126 def test_create_router_with_snat_explicit(self):
127 name = data_utils.rand_name('snat-router')
128 # Create a router enabling snat attributes
129 enable_snat_states = [False, True]
130 for enable_snat in enable_snat_states:
131 external_gateway_info = {
132 'network_id': CONF.network.public_network_id,
133 'enable_snat': enable_snat}
134 resp, create_body = self.admin_client.create_router(
135 name, external_gateway_info=external_gateway_info)
136 self.assertEqual('201', resp['status'])
137 self.addCleanup(self.admin_client.delete_router,
Matthew Treinish1d14c542014-06-17 20:25:40 -0400138 create_body['router']['id'])
varun yadavfaa3c8d2014-07-18 05:44:03 -0700139 # Verify snat attributes after router creation
140 self._verify_router_gateway(create_body['router']['id'],
Matthew Treinish1d14c542014-06-17 20:25:40 -0400141 exp_ext_gw_info=external_gateway_info)
varun yadavfaa3c8d2014-07-18 05:44:03 -0700142
jun xie82fbc582014-02-19 23:07:59 +0800143 @test.attr(type='smoke')
nayna-patel197c0122013-07-11 10:18:00 +0000144 def test_add_remove_router_interface_with_subnet_id(self):
145 network = self.create_network()
146 subnet = self.create_subnet(network)
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700147 router = self._create_router(data_utils.rand_name('router-'))
Chang Bo Guof099f802013-09-13 19:01:46 -0700148 # Add router interface with subnet id
nayna-patel197c0122013-07-11 10:18:00 +0000149 resp, interface = self.client.add_router_interface_with_subnet_id(
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700150 router['id'], subnet['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000151 self.assertEqual('200', resp['status'])
152 self.addCleanup(self._remove_router_interface_with_subnet_id,
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700153 router['id'], subnet['id'])
Attila Fazekas4b8b0082013-10-25 14:24:32 +0200154 self.assertIn('subnet_id', interface.keys())
155 self.assertIn('port_id', interface.keys())
nayna-patel197c0122013-07-11 10:18:00 +0000156 # Verify router id is equal to device id in port details
157 resp, show_port_body = self.client.show_port(
158 interface['port_id'])
159 self.assertEqual(show_port_body['port']['device_id'],
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700160 router['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000161
armando-migliaccio89e5b962013-12-16 06:12:16 -0800162 @test.attr(type='smoke')
nayna-patel197c0122013-07-11 10:18:00 +0000163 def test_add_remove_router_interface_with_port_id(self):
164 network = self.create_network()
165 self.create_subnet(network)
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700166 router = self._create_router(data_utils.rand_name('router-'))
Eugene Nikanorove9d255a2013-12-18 16:31:42 +0400167 resp, port_body = self.client.create_port(
168 network_id=network['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000169 # add router interface to port created above
170 resp, interface = self.client.add_router_interface_with_port_id(
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700171 router['id'], port_body['port']['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000172 self.assertEqual('200', resp['status'])
173 self.addCleanup(self._remove_router_interface_with_port_id,
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700174 router['id'], port_body['port']['id'])
Attila Fazekas4b8b0082013-10-25 14:24:32 +0200175 self.assertIn('subnet_id', interface.keys())
176 self.assertIn('port_id', interface.keys())
nayna-patel197c0122013-07-11 10:18:00 +0000177 # Verify router id is equal to device id in port details
178 resp, show_port_body = self.client.show_port(
179 interface['port_id'])
180 self.assertEqual(show_port_body['port']['device_id'],
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700181 router['id'])
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700182
183 def _verify_router_gateway(self, router_id, exp_ext_gw_info=None):
varun yadavfaa3c8d2014-07-18 05:44:03 -0700184 resp, show_body = self.admin_client.show_router(router_id)
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700185 self.assertEqual('200', resp['status'])
186 actual_ext_gw_info = show_body['router']['external_gateway_info']
187 if exp_ext_gw_info is None:
188 self.assertIsNone(actual_ext_gw_info)
189 return
190 # Verify only keys passed in exp_ext_gw_info
191 for k, v in exp_ext_gw_info.iteritems():
192 self.assertEqual(v, actual_ext_gw_info[k])
193
194 def _verify_gateway_port(self, router_id):
195 resp, list_body = self.admin_client.list_ports(
Matthew Treinish03b48df2014-01-29 16:59:49 +0000196 network_id=CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700197 device_id=router_id)
198 self.assertEqual(len(list_body['ports']), 1)
199 gw_port = list_body['ports'][0]
200 fixed_ips = gw_port['fixed_ips']
201 self.assertEqual(len(fixed_ips), 1)
202 resp, public_net_body = self.admin_client.show_network(
Matthew Treinish03b48df2014-01-29 16:59:49 +0000203 CONF.network.public_network_id)
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700204 public_subnet_id = public_net_body['network']['subnets'][0]
205 self.assertEqual(fixed_ips[0]['subnet_id'], public_subnet_id)
206
armando-migliaccio89e5b962013-12-16 06:12:16 -0800207 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700208 def test_update_router_set_gateway(self):
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700209 router = self._create_router(data_utils.rand_name('router-'))
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700210 self.client.update_router(
211 router['id'],
212 external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +0000213 'network_id': CONF.network.public_network_id})
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700214 # Verify operation - router
215 resp, show_body = self.client.show_router(router['id'])
216 self.assertEqual('200', resp['status'])
217 self._verify_router_gateway(
218 router['id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +0000219 {'network_id': CONF.network.public_network_id})
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700220 self._verify_gateway_port(router['id'])
221
ronak79f17932014-01-27 17:56:21 -0800222 @test.requires_ext(extension='ext-gw-mode', service='network')
armando-migliaccio89e5b962013-12-16 06:12:16 -0800223 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700224 def test_update_router_set_gateway_with_snat_explicit(self):
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700225 router = self._create_router(data_utils.rand_name('router-'))
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700226 self.admin_client.update_router_with_snat_gw_info(
227 router['id'],
228 external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +0000229 'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700230 'enable_snat': True})
231 self._verify_router_gateway(
232 router['id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +0000233 {'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700234 'enable_snat': True})
235 self._verify_gateway_port(router['id'])
236
ronak79f17932014-01-27 17:56:21 -0800237 @test.requires_ext(extension='ext-gw-mode', service='network')
armando-migliaccio89e5b962013-12-16 06:12:16 -0800238 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700239 def test_update_router_set_gateway_without_snat(self):
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700240 router = self._create_router(data_utils.rand_name('router-'))
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'])
251
armando-migliaccio89e5b962013-12-16 06:12:16 -0800252 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700253 def test_update_router_unset_gateway(self):
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700254 router = self._create_router(
Masayuki Igawa259c1132013-10-31 17:48:44 +0900255 data_utils.rand_name('router-'),
Matthew Treinish03b48df2014-01-29 16:59:49 +0000256 external_network_id=CONF.network.public_network_id)
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700257 self.client.update_router(router['id'], external_gateway_info={})
258 self._verify_router_gateway(router['id'])
259 # No gateway port expected
260 resp, list_body = self.admin_client.list_ports(
Matthew Treinish03b48df2014-01-29 16:59:49 +0000261 network_id=CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700262 device_id=router['id'])
263 self.assertFalse(list_body['ports'])
264
ronak79f17932014-01-27 17:56:21 -0800265 @test.requires_ext(extension='ext-gw-mode', service='network')
armando-migliaccio89e5b962013-12-16 06:12:16 -0800266 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700267 def test_update_router_reset_gateway_without_snat(self):
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700268 router = self._create_router(
Masayuki Igawa259c1132013-10-31 17:48:44 +0900269 data_utils.rand_name('router-'),
Matthew Treinish03b48df2014-01-29 16:59:49 +0000270 external_network_id=CONF.network.public_network_id)
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700271 self.admin_client.update_router_with_snat_gw_info(
272 router['id'],
273 external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +0000274 'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700275 'enable_snat': False})
276 self._verify_router_gateway(
277 router['id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +0000278 {'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700279 'enable_snat': False})
280 self._verify_gateway_port(router['id'])
ChenZheng04ac6942013-12-09 16:42:52 +0800281
armando-migliaccio89e5b962013-12-16 06:12:16 -0800282 @test.requires_ext(extension='extraroute', service='network')
283 @test.attr(type='smoke')
ChenZheng04ac6942013-12-09 16:42:52 +0800284 def test_update_extra_route(self):
285 self.network = self.create_network()
286 self.name = self.network['name']
287 self.subnet = self.create_subnet(self.network)
288 # Add router interface with subnet id
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700289 self.router = self._create_router(
290 data_utils.rand_name('router-'), True)
ChenZheng04ac6942013-12-09 16:42:52 +0800291 self.create_router_interface(self.router['id'], self.subnet['id'])
292 self.addCleanup(
293 self._delete_extra_routes,
294 self.router['id'])
Sylvain Afchain85c1e542014-01-11 08:23:16 +0100295 # Update router extra route, second ip of the range is
296 # used as next hop
ChenZheng04ac6942013-12-09 16:42:52 +0800297 cidr = netaddr.IPNetwork(self.subnet['cidr'])
Sylvain Afchain85c1e542014-01-11 08:23:16 +0100298 next_hop = str(cidr[2])
299 destination = str(self.subnet['cidr'])
ChenZheng04ac6942013-12-09 16:42:52 +0800300 resp, extra_route = self.client.update_extra_routes(
Sylvain Afchain85c1e542014-01-11 08:23:16 +0100301 self.router['id'], next_hop, destination)
302 self.assertEqual('200', resp['status'])
303 self.assertEqual(1, len(extra_route['router']['routes']))
304 self.assertEqual(destination,
305 extra_route['router']['routes'][0]['destination'])
306 self.assertEqual(next_hop,
307 extra_route['router']['routes'][0]['nexthop'])
308 resp, show_body = self.client.show_router(self.router['id'])
309 self.assertEqual('200', resp['status'])
310 self.assertEqual(destination,
311 show_body['router']['routes'][0]['destination'])
312 self.assertEqual(next_hop,
313 show_body['router']['routes'][0]['nexthop'])
ChenZheng04ac6942013-12-09 16:42:52 +0800314
315 def _delete_extra_routes(self, router_id):
316 resp, _ = self.client.delete_extra_routes(router_id)
liudongfbdfc7e2014-02-15 10:52:17 +0800317
318 @test.attr(type='smoke')
319 def test_update_router_admin_state(self):
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700320 self.router = self._create_router(data_utils.rand_name('router-'))
liudongfbdfc7e2014-02-15 10:52:17 +0800321 self.assertFalse(self.router['admin_state_up'])
322 # Update router admin state
323 resp, update_body = self.client.update_router(self.router['id'],
324 admin_state_up=True)
325 self.assertEqual('200', resp['status'])
326 self.assertTrue(update_body['router']['admin_state_up'])
327 resp, show_body = self.client.show_router(self.router['id'])
328 self.assertEqual('200', resp['status'])
329 self.assertTrue(show_body['router']['admin_state_up'])
330
331 @test.attr(type='smoke')
332 def test_add_multiple_router_interfaces(self):
armando-migliaccioee90a4d2014-05-06 11:54:07 -0700333 network01 = self.create_network(
334 network_name=data_utils.rand_name('router-network01-'))
335 network02 = self.create_network(
336 network_name=data_utils.rand_name('router-network02-'))
337 subnet01 = self.create_subnet(network01)
338 sub02_cidr = netaddr.IPNetwork(CONF.network.tenant_network_cidr).next()
339 subnet02 = self.create_subnet(network02, cidr=sub02_cidr)
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700340 router = self._create_router(data_utils.rand_name('router-'))
liudongfbdfc7e2014-02-15 10:52:17 +0800341 interface01 = self._add_router_interface_with_subnet_id(router['id'],
342 subnet01['id'])
343 self._verify_router_interface(router['id'], subnet01['id'],
344 interface01['port_id'])
345 interface02 = self._add_router_interface_with_subnet_id(router['id'],
346 subnet02['id'])
347 self._verify_router_interface(router['id'], subnet02['id'],
348 interface02['port_id'])
349
liudongfbdfc7e2014-02-15 10:52:17 +0800350 def _verify_router_interface(self, router_id, subnet_id, port_id):
351 resp, show_port_body = self.client.show_port(port_id)
352 self.assertEqual('200', resp['status'])
353 interface_port = show_port_body['port']
354 self.assertEqual(router_id, interface_port['device_id'])
355 self.assertEqual(subnet_id,
356 interface_port['fixed_ips'][0]['subnet_id'])