blob: 0ff91ab032efa221a3097daef93fe072e0842787 [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
armando-migliaccio89e5b962013-12-16 06:12:16 -080039 @test.attr(type='smoke')
nayna-patel197c0122013-07-11 10:18:00 +000040 def test_create_show_list_update_delete_router(self):
41 # Create a router
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -070042 # NOTE(salv-orlando): Do not invoke self.create_router
43 # as we need to check the response code
Masayuki Igawa259c1132013-10-31 17:48:44 +090044 name = data_utils.rand_name('router-')
nayna-patel197c0122013-07-11 10:18:00 +000045 resp, create_body = self.client.create_router(
46 name, external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +000047 "network_id": CONF.network.public_network_id},
nayna-patel197c0122013-07-11 10:18:00 +000048 admin_state_up=False)
49 self.assertEqual('201', resp['status'])
50 self.addCleanup(self._delete_router, create_body['router']['id'])
51 self.assertEqual(create_body['router']['name'], name)
52 self.assertEqual(
53 create_body['router']['external_gateway_info']['network_id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +000054 CONF.network.public_network_id)
nayna-patel197c0122013-07-11 10:18:00 +000055 self.assertEqual(create_body['router']['admin_state_up'], False)
56 # Show details of the created router
57 resp, show_body = self.client.show_router(
58 create_body['router']['id'])
59 self.assertEqual('200', resp['status'])
60 self.assertEqual(show_body['router']['name'], name)
61 self.assertEqual(
62 show_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(show_body['router']['admin_state_up'], False)
65 # List routers and verify if created router is there in response
66 resp, list_body = self.client.list_routers()
67 self.assertEqual('200', resp['status'])
68 routers_list = list()
69 for router in list_body['routers']:
70 routers_list.append(router['id'])
71 self.assertIn(create_body['router']['id'], routers_list)
72 # Update the name of router and verify if it is updated
73 updated_name = 'updated ' + name
74 resp, update_body = self.client.update_router(
75 create_body['router']['id'], name=updated_name)
76 self.assertEqual('200', resp['status'])
77 self.assertEqual(update_body['router']['name'], updated_name)
78 resp, show_body = self.client.show_router(
79 create_body['router']['id'])
80 self.assertEqual(show_body['router']['name'], updated_name)
81
armando-migliaccio89e5b962013-12-16 06:12:16 -080082 @test.attr(type='smoke')
jun xie82fbc582014-02-19 23:07:59 +080083 def test_create_router_setting_tenant_id(self):
84 # Test creating router from admin user setting tenant_id.
85 test_tenant = data_utils.rand_name('test_tenant_')
86 test_description = data_utils.rand_name('desc_')
87 _, tenant = self.identity_admin_client.create_tenant(
88 name=test_tenant,
89 description=test_description)
90 tenant_id = tenant['id']
91 self.addCleanup(self.identity_admin_client.delete_tenant, tenant_id)
92
93 name = data_utils.rand_name('router-')
94 resp, create_body = self.admin_client.create_router(
95 name, tenant_id=tenant_id)
96 self.assertEqual('201', resp['status'])
97 self.addCleanup(self.admin_client.delete_router,
98 create_body['router']['id'])
99 self.assertEqual(tenant_id, create_body['router']['tenant_id'])
100
101 @test.attr(type='smoke')
nayna-patel197c0122013-07-11 10:18:00 +0000102 def test_add_remove_router_interface_with_subnet_id(self):
103 network = self.create_network()
104 subnet = self.create_subnet(network)
Masayuki Igawa259c1132013-10-31 17:48:44 +0900105 router = self.create_router(data_utils.rand_name('router-'))
Chang Bo Guof099f802013-09-13 19:01:46 -0700106 # Add router interface with subnet id
nayna-patel197c0122013-07-11 10:18:00 +0000107 resp, interface = self.client.add_router_interface_with_subnet_id(
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700108 router['id'], subnet['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000109 self.assertEqual('200', resp['status'])
110 self.addCleanup(self._remove_router_interface_with_subnet_id,
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700111 router['id'], subnet['id'])
Attila Fazekas4b8b0082013-10-25 14:24:32 +0200112 self.assertIn('subnet_id', interface.keys())
113 self.assertIn('port_id', interface.keys())
nayna-patel197c0122013-07-11 10:18:00 +0000114 # Verify router id is equal to device id in port details
115 resp, show_port_body = self.client.show_port(
116 interface['port_id'])
117 self.assertEqual(show_port_body['port']['device_id'],
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700118 router['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000119
armando-migliaccio89e5b962013-12-16 06:12:16 -0800120 @test.attr(type='smoke')
nayna-patel197c0122013-07-11 10:18:00 +0000121 def test_add_remove_router_interface_with_port_id(self):
122 network = self.create_network()
123 self.create_subnet(network)
Masayuki Igawa259c1132013-10-31 17:48:44 +0900124 router = self.create_router(data_utils.rand_name('router-'))
Eugene Nikanorove9d255a2013-12-18 16:31:42 +0400125 resp, port_body = self.client.create_port(
126 network_id=network['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000127 # add router interface to port created above
128 resp, interface = self.client.add_router_interface_with_port_id(
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700129 router['id'], port_body['port']['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000130 self.assertEqual('200', resp['status'])
131 self.addCleanup(self._remove_router_interface_with_port_id,
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700132 router['id'], port_body['port']['id'])
Attila Fazekas4b8b0082013-10-25 14:24:32 +0200133 self.assertIn('subnet_id', interface.keys())
134 self.assertIn('port_id', interface.keys())
nayna-patel197c0122013-07-11 10:18:00 +0000135 # Verify router id is equal to device id in port details
136 resp, show_port_body = self.client.show_port(
137 interface['port_id'])
138 self.assertEqual(show_port_body['port']['device_id'],
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700139 router['id'])
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700140
141 def _verify_router_gateway(self, router_id, exp_ext_gw_info=None):
142 resp, show_body = self.client.show_router(router_id)
143 self.assertEqual('200', resp['status'])
144 actual_ext_gw_info = show_body['router']['external_gateway_info']
145 if exp_ext_gw_info is None:
146 self.assertIsNone(actual_ext_gw_info)
147 return
148 # Verify only keys passed in exp_ext_gw_info
149 for k, v in exp_ext_gw_info.iteritems():
150 self.assertEqual(v, actual_ext_gw_info[k])
151
152 def _verify_gateway_port(self, router_id):
153 resp, list_body = self.admin_client.list_ports(
Matthew Treinish03b48df2014-01-29 16:59:49 +0000154 network_id=CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700155 device_id=router_id)
156 self.assertEqual(len(list_body['ports']), 1)
157 gw_port = list_body['ports'][0]
158 fixed_ips = gw_port['fixed_ips']
159 self.assertEqual(len(fixed_ips), 1)
160 resp, public_net_body = self.admin_client.show_network(
Matthew Treinish03b48df2014-01-29 16:59:49 +0000161 CONF.network.public_network_id)
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700162 public_subnet_id = public_net_body['network']['subnets'][0]
163 self.assertEqual(fixed_ips[0]['subnet_id'], public_subnet_id)
164
armando-migliaccio89e5b962013-12-16 06:12:16 -0800165 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700166 def test_update_router_set_gateway(self):
Masayuki Igawa259c1132013-10-31 17:48:44 +0900167 router = self.create_router(data_utils.rand_name('router-'))
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700168 self.client.update_router(
169 router['id'],
170 external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +0000171 'network_id': CONF.network.public_network_id})
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700172 # Verify operation - router
173 resp, show_body = self.client.show_router(router['id'])
174 self.assertEqual('200', resp['status'])
175 self._verify_router_gateway(
176 router['id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +0000177 {'network_id': CONF.network.public_network_id})
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700178 self._verify_gateway_port(router['id'])
179
ronak79f17932014-01-27 17:56:21 -0800180 @test.requires_ext(extension='ext-gw-mode', service='network')
armando-migliaccio89e5b962013-12-16 06:12:16 -0800181 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700182 def test_update_router_set_gateway_with_snat_explicit(self):
Masayuki Igawa259c1132013-10-31 17:48:44 +0900183 router = self.create_router(data_utils.rand_name('router-'))
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700184 self.admin_client.update_router_with_snat_gw_info(
185 router['id'],
186 external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +0000187 'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700188 'enable_snat': True})
189 self._verify_router_gateway(
190 router['id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +0000191 {'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700192 'enable_snat': True})
193 self._verify_gateway_port(router['id'])
194
ronak79f17932014-01-27 17:56:21 -0800195 @test.requires_ext(extension='ext-gw-mode', service='network')
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_without_snat(self):
Masayuki Igawa259c1132013-10-31 17:48:44 +0900198 router = self.create_router(data_utils.rand_name('router-'))
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700199 self.admin_client.update_router_with_snat_gw_info(
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 'enable_snat': False})
204 self._verify_router_gateway(
205 router['id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +0000206 {'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700207 'enable_snat': False})
208 self._verify_gateway_port(router['id'])
209
armando-migliaccio89e5b962013-12-16 06:12:16 -0800210 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700211 def test_update_router_unset_gateway(self):
212 router = self.create_router(
Masayuki Igawa259c1132013-10-31 17:48:44 +0900213 data_utils.rand_name('router-'),
Matthew Treinish03b48df2014-01-29 16:59:49 +0000214 external_network_id=CONF.network.public_network_id)
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700215 self.client.update_router(router['id'], external_gateway_info={})
216 self._verify_router_gateway(router['id'])
217 # No gateway port expected
218 resp, list_body = self.admin_client.list_ports(
Matthew Treinish03b48df2014-01-29 16:59:49 +0000219 network_id=CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700220 device_id=router['id'])
221 self.assertFalse(list_body['ports'])
222
ronak79f17932014-01-27 17:56:21 -0800223 @test.requires_ext(extension='ext-gw-mode', service='network')
armando-migliaccio89e5b962013-12-16 06:12:16 -0800224 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700225 def test_update_router_reset_gateway_without_snat(self):
226 router = self.create_router(
Masayuki Igawa259c1132013-10-31 17:48:44 +0900227 data_utils.rand_name('router-'),
Matthew Treinish03b48df2014-01-29 16:59:49 +0000228 external_network_id=CONF.network.public_network_id)
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'])
ChenZheng04ac6942013-12-09 16:42:52 +0800239
armando-migliaccio89e5b962013-12-16 06:12:16 -0800240 @test.requires_ext(extension='extraroute', service='network')
241 @test.attr(type='smoke')
ChenZheng04ac6942013-12-09 16:42:52 +0800242 def test_update_extra_route(self):
243 self.network = self.create_network()
244 self.name = self.network['name']
245 self.subnet = self.create_subnet(self.network)
246 # Add router interface with subnet id
247 self.router = self.create_router(data_utils.rand_name('router-'), True)
248 self.create_router_interface(self.router['id'], self.subnet['id'])
249 self.addCleanup(
250 self._delete_extra_routes,
251 self.router['id'])
252 # Update router extra route
253 cidr = netaddr.IPNetwork(self.subnet['cidr'])
254 resp, extra_route = self.client.update_extra_routes(
255 self.router['id'], str(cidr[0]), str(self.subnet['cidr']))
256
257 def _delete_extra_routes(self, router_id):
258 resp, _ = self.client.delete_extra_routes(router_id)