blob: bcd81137a389486da2ec7d14316658315c0e25c9 [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-')
Rohan Kanadeeeb21642014-08-14 12:00:26 +020057 _, create_body = self.client.create_router(
nayna-patel197c0122013-07-11 10:18:00 +000058 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)
nayna-patel197c0122013-07-11 10:18:00 +000061 self.addCleanup(self._delete_router, create_body['router']['id'])
62 self.assertEqual(create_body['router']['name'], name)
63 self.assertEqual(
64 create_body['router']['external_gateway_info']['network_id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +000065 CONF.network.public_network_id)
nayna-patel197c0122013-07-11 10:18:00 +000066 self.assertEqual(create_body['router']['admin_state_up'], False)
67 # Show details of the created router
Rohan Kanadeeeb21642014-08-14 12:00:26 +020068 _, show_body = self.client.show_router(create_body['router']['id'])
nayna-patel197c0122013-07-11 10:18:00 +000069 self.assertEqual(show_body['router']['name'], name)
70 self.assertEqual(
71 show_body['router']['external_gateway_info']['network_id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +000072 CONF.network.public_network_id)
nayna-patel197c0122013-07-11 10:18:00 +000073 self.assertEqual(show_body['router']['admin_state_up'], False)
74 # List routers and verify if created router is there in response
Rohan Kanadeeeb21642014-08-14 12:00:26 +020075 _, list_body = self.client.list_routers()
nayna-patel197c0122013-07-11 10:18:00 +000076 routers_list = list()
77 for router in list_body['routers']:
78 routers_list.append(router['id'])
79 self.assertIn(create_body['router']['id'], routers_list)
80 # Update the name of router and verify if it is updated
81 updated_name = 'updated ' + name
Rohan Kanadeeeb21642014-08-14 12:00:26 +020082 _, update_body = self.client.update_router(create_body['router']['id'],
83 name=updated_name)
nayna-patel197c0122013-07-11 10:18:00 +000084 self.assertEqual(update_body['router']['name'], updated_name)
85 resp, show_body = self.client.show_router(
86 create_body['router']['id'])
87 self.assertEqual(show_body['router']['name'], updated_name)
88
armando-migliaccio89e5b962013-12-16 06:12:16 -080089 @test.attr(type='smoke')
jun xie82fbc582014-02-19 23:07:59 +080090 def test_create_router_setting_tenant_id(self):
91 # Test creating router from admin user setting tenant_id.
92 test_tenant = data_utils.rand_name('test_tenant_')
93 test_description = data_utils.rand_name('desc_')
94 _, tenant = self.identity_admin_client.create_tenant(
Rohan Kanadeeeb21642014-08-14 12:00:26 +020095 name=test_tenant, description=test_description)
jun xie82fbc582014-02-19 23:07:59 +080096 tenant_id = tenant['id']
97 self.addCleanup(self.identity_admin_client.delete_tenant, tenant_id)
98
99 name = data_utils.rand_name('router-')
Rohan Kanadeeeb21642014-08-14 12:00:26 +0200100 _, create_body = self.admin_client.create_router(name,
101 tenant_id=tenant_id)
jun xie82fbc582014-02-19 23:07:59 +0800102 self.addCleanup(self.admin_client.delete_router,
103 create_body['router']['id'])
104 self.assertEqual(tenant_id, create_body['router']['tenant_id'])
105
varun yadavfaa3c8d2014-07-18 05:44:03 -0700106 @test.requires_ext(extension='ext-gw-mode', service='network')
107 @test.attr(type='smoke')
108 def test_create_router_with_default_snat_value(self):
109 # Create a router with default snat rule
110 name = data_utils.rand_name('router')
Matthew Treinish1d14c542014-06-17 20:25:40 -0400111 router = self._create_router(
112 name, external_network_id=CONF.network.public_network_id)
113 self._verify_router_gateway(
114 router['id'], {'network_id': CONF.network.public_network_id,
115 'enable_snat': True})
varun yadavfaa3c8d2014-07-18 05:44:03 -0700116
117 @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}
Rohan Kanadeeeb21642014-08-14 12:00:26 +0200127 _, 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')
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
Rohan Kanadeeeb21642014-08-14 12:00:26 +0200141 _, interface = self.client.add_router_interface_with_subnet_id(
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700142 router['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
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'])
nayna-patel197c0122013-07-11 10:18:00 +0000152
armando-migliaccio89e5b962013-12-16 06:12:16 -0800153 @test.attr(type='smoke')
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-'))
Eugene Nikanorove9d255a2013-12-18 16:31:42 +0400158 resp, port_body = self.client.create_port(
159 network_id=network['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000160 # add router interface to port created above
Rohan Kanadeeeb21642014-08-14 12:00:26 +0200161 _, 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
168 resp, show_port_body = self.client.show_port(
169 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):
Rohan Kanadeeeb21642014-08-14 12:00:26 +0200174 _, 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
180 for k, v in exp_ext_gw_info.iteritems():
181 self.assertEqual(v, actual_ext_gw_info[k])
182
183 def _verify_gateway_port(self, router_id):
184 resp, 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']
190 self.assertEqual(len(fixed_ips), 1)
191 resp, public_net_body = self.admin_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]
194 self.assertEqual(fixed_ips[0]['subnet_id'], public_subnet_id)
195
armando-migliaccio89e5b962013-12-16 06:12:16 -0800196 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700197 def test_update_router_set_gateway(self):
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700198 router = self._create_router(data_utils.rand_name('router-'))
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700199 self.client.update_router(
200 router['id'],
201 external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +0000202 'network_id': CONF.network.public_network_id})
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700203 # Verify operation - router
Rohan Kanadeeeb21642014-08-14 12:00:26 +0200204 _, show_body = self.client.show_router(router['id'])
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
ronak79f17932014-01-27 17:56:21 -0800210 @test.requires_ext(extension='ext-gw-mode', service='network')
armando-migliaccio89e5b962013-12-16 06:12:16 -0800211 @test.attr(type='smoke')
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
ronak79f17932014-01-27 17:56:21 -0800225 @test.requires_ext(extension='ext-gw-mode', service='network')
armando-migliaccio89e5b962013-12-16 06:12:16 -0800226 @test.attr(type='smoke')
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
armando-migliaccio89e5b962013-12-16 06:12:16 -0800240 @test.attr(type='smoke')
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
248 resp, 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
ronak79f17932014-01-27 17:56:21 -0800253 @test.requires_ext(extension='ext-gw-mode', service='network')
armando-migliaccio89e5b962013-12-16 06:12:16 -0800254 @test.attr(type='smoke')
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
armando-migliaccio89e5b962013-12-16 06:12:16 -0800270 @test.requires_ext(extension='extraroute', service='network')
271 @test.attr(type='smoke')
ChenZheng04ac6942013-12-09 16:42:52 +0800272 def test_update_extra_route(self):
273 self.network = self.create_network()
274 self.name = self.network['name']
275 self.subnet = self.create_subnet(self.network)
276 # Add router interface with subnet id
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700277 self.router = self._create_router(
278 data_utils.rand_name('router-'), True)
ChenZheng04ac6942013-12-09 16:42:52 +0800279 self.create_router_interface(self.router['id'], self.subnet['id'])
280 self.addCleanup(
281 self._delete_extra_routes,
282 self.router['id'])
Sylvain Afchain85c1e542014-01-11 08:23:16 +0100283 # Update router extra route, second ip of the range is
284 # used as next hop
ChenZheng04ac6942013-12-09 16:42:52 +0800285 cidr = netaddr.IPNetwork(self.subnet['cidr'])
Sylvain Afchain85c1e542014-01-11 08:23:16 +0100286 next_hop = str(cidr[2])
287 destination = str(self.subnet['cidr'])
Rohan Kanadeeeb21642014-08-14 12:00:26 +0200288 _, extra_route = self.client.update_extra_routes(self.router['id'],
289 next_hop, destination)
Sylvain Afchain85c1e542014-01-11 08:23:16 +0100290 self.assertEqual(1, len(extra_route['router']['routes']))
291 self.assertEqual(destination,
292 extra_route['router']['routes'][0]['destination'])
293 self.assertEqual(next_hop,
294 extra_route['router']['routes'][0]['nexthop'])
Rohan Kanadeeeb21642014-08-14 12:00:26 +0200295 _, show_body = self.client.show_router(self.router['id'])
Sylvain Afchain85c1e542014-01-11 08:23:16 +0100296 self.assertEqual(destination,
297 show_body['router']['routes'][0]['destination'])
298 self.assertEqual(next_hop,
299 show_body['router']['routes'][0]['nexthop'])
ChenZheng04ac6942013-12-09 16:42:52 +0800300
301 def _delete_extra_routes(self, router_id):
302 resp, _ = self.client.delete_extra_routes(router_id)
liudongfbdfc7e2014-02-15 10:52:17 +0800303
304 @test.attr(type='smoke')
305 def test_update_router_admin_state(self):
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700306 self.router = self._create_router(data_utils.rand_name('router-'))
liudongfbdfc7e2014-02-15 10:52:17 +0800307 self.assertFalse(self.router['admin_state_up'])
308 # Update router admin state
Rohan Kanadeeeb21642014-08-14 12:00:26 +0200309 _, update_body = self.client.update_router(self.router['id'],
310 admin_state_up=True)
liudongfbdfc7e2014-02-15 10:52:17 +0800311 self.assertTrue(update_body['router']['admin_state_up'])
Rohan Kanadeeeb21642014-08-14 12:00:26 +0200312 _, show_body = self.client.show_router(self.router['id'])
liudongfbdfc7e2014-02-15 10:52:17 +0800313 self.assertTrue(show_body['router']['admin_state_up'])
314
315 @test.attr(type='smoke')
316 def test_add_multiple_router_interfaces(self):
armando-migliaccioee90a4d2014-05-06 11:54:07 -0700317 network01 = self.create_network(
318 network_name=data_utils.rand_name('router-network01-'))
319 network02 = self.create_network(
320 network_name=data_utils.rand_name('router-network02-'))
321 subnet01 = self.create_subnet(network01)
322 sub02_cidr = netaddr.IPNetwork(CONF.network.tenant_network_cidr).next()
323 subnet02 = self.create_subnet(network02, cidr=sub02_cidr)
Adam Gandelman3e9d12b2014-04-02 17:04:19 -0700324 router = self._create_router(data_utils.rand_name('router-'))
liudongfbdfc7e2014-02-15 10:52:17 +0800325 interface01 = self._add_router_interface_with_subnet_id(router['id'],
326 subnet01['id'])
327 self._verify_router_interface(router['id'], subnet01['id'],
328 interface01['port_id'])
329 interface02 = self._add_router_interface_with_subnet_id(router['id'],
330 subnet02['id'])
331 self._verify_router_interface(router['id'], subnet02['id'],
332 interface02['port_id'])
333
liudongfbdfc7e2014-02-15 10:52:17 +0800334 def _verify_router_interface(self, router_id, subnet_id, port_id):
Rohan Kanadeeeb21642014-08-14 12:00:26 +0200335 _, show_port_body = self.client.show_port(port_id)
liudongfbdfc7e2014-02-15 10:52:17 +0800336 interface_port = show_port_body['port']
337 self.assertEqual(router_id, interface_port['device_id'])
338 self.assertEqual(subnet_id,
339 interface_port['fixed_ips'][0]['subnet_id'])