blob: d552c70b1c0d8d7010060ee5efcfd95fd81191de [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
Masayuki Igawa259c1132013-10-31 17:48:44 +090019from tempest.common.utils import data_utils
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):
raiesmh0867698322013-08-20 13:09:01 +053027 _interface = 'json'
nayna-patel197c0122013-07-11 10:18:00 +000028
29 @classmethod
30 def setUpClass(cls):
31 super(RoutersTest, cls).setUpClass()
Yoshihiro Kaneko05670262014-01-18 19:22:44 +090032 if not test.is_extension_enabled('router', 'network'):
33 msg = "router extension not enabled."
34 raise cls.skipException(msg)
nayna-patel197c0122013-07-11 10:18:00 +000035
armando-migliaccio89e5b962013-12-16 06:12:16 -080036 @test.attr(type='smoke')
nayna-patel197c0122013-07-11 10:18:00 +000037 def test_create_show_list_update_delete_router(self):
38 # Create a router
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -070039 # NOTE(salv-orlando): Do not invoke self.create_router
40 # as we need to check the response code
Masayuki Igawa259c1132013-10-31 17:48:44 +090041 name = data_utils.rand_name('router-')
nayna-patel197c0122013-07-11 10:18:00 +000042 resp, create_body = self.client.create_router(
43 name, external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +000044 "network_id": CONF.network.public_network_id},
nayna-patel197c0122013-07-11 10:18:00 +000045 admin_state_up=False)
46 self.assertEqual('201', resp['status'])
47 self.addCleanup(self._delete_router, create_body['router']['id'])
48 self.assertEqual(create_body['router']['name'], name)
49 self.assertEqual(
50 create_body['router']['external_gateway_info']['network_id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +000051 CONF.network.public_network_id)
nayna-patel197c0122013-07-11 10:18:00 +000052 self.assertEqual(create_body['router']['admin_state_up'], False)
53 # Show details of the created router
54 resp, show_body = self.client.show_router(
55 create_body['router']['id'])
56 self.assertEqual('200', resp['status'])
57 self.assertEqual(show_body['router']['name'], name)
58 self.assertEqual(
59 show_body['router']['external_gateway_info']['network_id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +000060 CONF.network.public_network_id)
nayna-patel197c0122013-07-11 10:18:00 +000061 self.assertEqual(show_body['router']['admin_state_up'], False)
62 # List routers and verify if created router is there in response
63 resp, list_body = self.client.list_routers()
64 self.assertEqual('200', resp['status'])
65 routers_list = list()
66 for router in list_body['routers']:
67 routers_list.append(router['id'])
68 self.assertIn(create_body['router']['id'], routers_list)
69 # Update the name of router and verify if it is updated
70 updated_name = 'updated ' + name
71 resp, update_body = self.client.update_router(
72 create_body['router']['id'], name=updated_name)
73 self.assertEqual('200', resp['status'])
74 self.assertEqual(update_body['router']['name'], updated_name)
75 resp, show_body = self.client.show_router(
76 create_body['router']['id'])
77 self.assertEqual(show_body['router']['name'], updated_name)
78
armando-migliaccio89e5b962013-12-16 06:12:16 -080079 @test.attr(type='smoke')
nayna-patel197c0122013-07-11 10:18:00 +000080 def test_add_remove_router_interface_with_subnet_id(self):
81 network = self.create_network()
82 subnet = self.create_subnet(network)
Masayuki Igawa259c1132013-10-31 17:48:44 +090083 router = self.create_router(data_utils.rand_name('router-'))
Chang Bo Guof099f802013-09-13 19:01:46 -070084 # Add router interface with subnet id
nayna-patel197c0122013-07-11 10:18:00 +000085 resp, interface = self.client.add_router_interface_with_subnet_id(
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -070086 router['id'], subnet['id'])
nayna-patel197c0122013-07-11 10:18:00 +000087 self.assertEqual('200', resp['status'])
88 self.addCleanup(self._remove_router_interface_with_subnet_id,
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -070089 router['id'], subnet['id'])
Attila Fazekas4b8b0082013-10-25 14:24:32 +020090 self.assertIn('subnet_id', interface.keys())
91 self.assertIn('port_id', interface.keys())
nayna-patel197c0122013-07-11 10:18:00 +000092 # Verify router id is equal to device id in port details
93 resp, show_port_body = self.client.show_port(
94 interface['port_id'])
95 self.assertEqual(show_port_body['port']['device_id'],
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -070096 router['id'])
nayna-patel197c0122013-07-11 10:18:00 +000097
armando-migliaccio89e5b962013-12-16 06:12:16 -080098 @test.attr(type='smoke')
nayna-patel197c0122013-07-11 10:18:00 +000099 def test_add_remove_router_interface_with_port_id(self):
100 network = self.create_network()
101 self.create_subnet(network)
Masayuki Igawa259c1132013-10-31 17:48:44 +0900102 router = self.create_router(data_utils.rand_name('router-'))
Eugene Nikanorove9d255a2013-12-18 16:31:42 +0400103 resp, port_body = self.client.create_port(
104 network_id=network['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000105 # add router interface to port created above
106 resp, interface = self.client.add_router_interface_with_port_id(
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700107 router['id'], port_body['port']['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000108 self.assertEqual('200', resp['status'])
109 self.addCleanup(self._remove_router_interface_with_port_id,
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700110 router['id'], port_body['port']['id'])
Attila Fazekas4b8b0082013-10-25 14:24:32 +0200111 self.assertIn('subnet_id', interface.keys())
112 self.assertIn('port_id', interface.keys())
nayna-patel197c0122013-07-11 10:18:00 +0000113 # Verify router id is equal to device id in port details
114 resp, show_port_body = self.client.show_port(
115 interface['port_id'])
116 self.assertEqual(show_port_body['port']['device_id'],
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700117 router['id'])
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700118
119 def _verify_router_gateway(self, router_id, exp_ext_gw_info=None):
120 resp, show_body = self.client.show_router(router_id)
121 self.assertEqual('200', resp['status'])
122 actual_ext_gw_info = show_body['router']['external_gateway_info']
123 if exp_ext_gw_info is None:
124 self.assertIsNone(actual_ext_gw_info)
125 return
126 # Verify only keys passed in exp_ext_gw_info
127 for k, v in exp_ext_gw_info.iteritems():
128 self.assertEqual(v, actual_ext_gw_info[k])
129
130 def _verify_gateway_port(self, router_id):
131 resp, list_body = self.admin_client.list_ports(
Matthew Treinish03b48df2014-01-29 16:59:49 +0000132 network_id=CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700133 device_id=router_id)
134 self.assertEqual(len(list_body['ports']), 1)
135 gw_port = list_body['ports'][0]
136 fixed_ips = gw_port['fixed_ips']
137 self.assertEqual(len(fixed_ips), 1)
138 resp, public_net_body = self.admin_client.show_network(
Matthew Treinish03b48df2014-01-29 16:59:49 +0000139 CONF.network.public_network_id)
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700140 public_subnet_id = public_net_body['network']['subnets'][0]
141 self.assertEqual(fixed_ips[0]['subnet_id'], public_subnet_id)
142
armando-migliaccio89e5b962013-12-16 06:12:16 -0800143 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700144 def test_update_router_set_gateway(self):
Masayuki Igawa259c1132013-10-31 17:48:44 +0900145 router = self.create_router(data_utils.rand_name('router-'))
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700146 self.client.update_router(
147 router['id'],
148 external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +0000149 'network_id': CONF.network.public_network_id})
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700150 # Verify operation - router
151 resp, show_body = self.client.show_router(router['id'])
152 self.assertEqual('200', resp['status'])
153 self._verify_router_gateway(
154 router['id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +0000155 {'network_id': CONF.network.public_network_id})
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700156 self._verify_gateway_port(router['id'])
157
ronak79f17932014-01-27 17:56:21 -0800158 @test.requires_ext(extension='ext-gw-mode', service='network')
armando-migliaccio89e5b962013-12-16 06:12:16 -0800159 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700160 def test_update_router_set_gateway_with_snat_explicit(self):
Masayuki Igawa259c1132013-10-31 17:48:44 +0900161 router = self.create_router(data_utils.rand_name('router-'))
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700162 self.admin_client.update_router_with_snat_gw_info(
163 router['id'],
164 external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +0000165 'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700166 'enable_snat': True})
167 self._verify_router_gateway(
168 router['id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +0000169 {'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700170 'enable_snat': True})
171 self._verify_gateway_port(router['id'])
172
ronak79f17932014-01-27 17:56:21 -0800173 @test.requires_ext(extension='ext-gw-mode', service='network')
armando-migliaccio89e5b962013-12-16 06:12:16 -0800174 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700175 def test_update_router_set_gateway_without_snat(self):
Masayuki Igawa259c1132013-10-31 17:48:44 +0900176 router = self.create_router(data_utils.rand_name('router-'))
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700177 self.admin_client.update_router_with_snat_gw_info(
178 router['id'],
179 external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +0000180 'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700181 'enable_snat': False})
182 self._verify_router_gateway(
183 router['id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +0000184 {'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700185 'enable_snat': False})
186 self._verify_gateway_port(router['id'])
187
armando-migliaccio89e5b962013-12-16 06:12:16 -0800188 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700189 def test_update_router_unset_gateway(self):
190 router = self.create_router(
Masayuki Igawa259c1132013-10-31 17:48:44 +0900191 data_utils.rand_name('router-'),
Matthew Treinish03b48df2014-01-29 16:59:49 +0000192 external_network_id=CONF.network.public_network_id)
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700193 self.client.update_router(router['id'], external_gateway_info={})
194 self._verify_router_gateway(router['id'])
195 # No gateway port expected
196 resp, list_body = self.admin_client.list_ports(
Matthew Treinish03b48df2014-01-29 16:59:49 +0000197 network_id=CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700198 device_id=router['id'])
199 self.assertFalse(list_body['ports'])
200
ronak79f17932014-01-27 17:56:21 -0800201 @test.requires_ext(extension='ext-gw-mode', service='network')
armando-migliaccio89e5b962013-12-16 06:12:16 -0800202 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700203 def test_update_router_reset_gateway_without_snat(self):
204 router = self.create_router(
Masayuki Igawa259c1132013-10-31 17:48:44 +0900205 data_utils.rand_name('router-'),
Matthew Treinish03b48df2014-01-29 16:59:49 +0000206 external_network_id=CONF.network.public_network_id)
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700207 self.admin_client.update_router_with_snat_gw_info(
208 router['id'],
209 external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +0000210 'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700211 'enable_snat': False})
212 self._verify_router_gateway(
213 router['id'],
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_gateway_port(router['id'])
ChenZheng04ac6942013-12-09 16:42:52 +0800217
armando-migliaccio89e5b962013-12-16 06:12:16 -0800218 @test.requires_ext(extension='extraroute', service='network')
219 @test.attr(type='smoke')
ChenZheng04ac6942013-12-09 16:42:52 +0800220 def test_update_extra_route(self):
221 self.network = self.create_network()
222 self.name = self.network['name']
223 self.subnet = self.create_subnet(self.network)
224 # Add router interface with subnet id
225 self.router = self.create_router(data_utils.rand_name('router-'), True)
226 self.create_router_interface(self.router['id'], self.subnet['id'])
227 self.addCleanup(
228 self._delete_extra_routes,
229 self.router['id'])
230 # Update router extra route
231 cidr = netaddr.IPNetwork(self.subnet['cidr'])
232 resp, extra_route = self.client.update_extra_routes(
233 self.router['id'], str(cidr[0]), str(self.subnet['cidr']))
234
235 def _delete_extra_routes(self, router_id):
236 resp, _ = self.client.delete_extra_routes(router_id)