blob: 06e07bbdc306336ef1908951c3f2e9d2e95da4a8 [file] [log] [blame]
nayna-patel197c0122013-07-11 10:18:00 +00001# vim: tabstop=4 shiftwidth=4 softtabstop=4
2
3# Copyright 2013 OpenStack Foundation
4# All Rights Reserved.
5#
6# Licensed under the Apache License, Version 2.0 (the "License"); you may
7# not use this file except in compliance with the License. You may obtain
8# a copy of the License at
9#
10# http://www.apache.org/licenses/LICENSE-2.0
11#
12# Unless required by applicable law or agreed to in writing, software
13# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
14# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
15# License for the specific language governing permissions and limitations
16# under the License.
17
ChenZheng04ac6942013-12-09 16:42:52 +080018import netaddr
19
nayna-patel197c0122013-07-11 10:18:00 +000020from tempest.api.network import base
Masayuki Igawa259c1132013-10-31 17:48:44 +090021from tempest.common.utils import data_utils
nayna-patel197c0122013-07-11 10:18:00 +000022from tempest.test import attr
23
24
Salvatore Orlandoce22b492013-09-20 04:04:11 -070025class RoutersTest(base.BaseAdminNetworkTest):
26 # NOTE(salv-orlando): This class inherits from BaseAdminNetworkTest
27 # as some router operations, such as enabling or disabling SNAT
28 # require admin credentials by default
raiesmh0867698322013-08-20 13:09:01 +053029 _interface = 'json'
nayna-patel197c0122013-07-11 10:18:00 +000030
31 @classmethod
32 def setUpClass(cls):
33 super(RoutersTest, cls).setUpClass()
34
35 def _delete_router(self, router_id):
36 resp, _ = self.client.delete_router(router_id)
37 self.assertEqual(204, resp.status)
38 # Asserting that the router is not found in the list
39 # after deletion
40 resp, list_body = self.client.list_routers()
41 self.assertEqual('200', resp['status'])
42 routers_list = list()
43 for router in list_body['routers']:
44 routers_list.append(router['id'])
45 self.assertNotIn(router_id, routers_list)
46
47 def _remove_router_interface_with_subnet_id(self, router_id, subnet_id):
48 resp, _ = self.client.remove_router_interface_with_subnet_id(
49 router_id, subnet_id)
50 self.assertEqual('200', resp['status'])
51
52 def _remove_router_interface_with_port_id(self, router_id, port_id):
53 resp, _ = self.client.remove_router_interface_with_port_id(
54 router_id, port_id)
55 self.assertEqual('200', resp['status'])
56
Attila Fazekas71834a22013-08-18 06:56:21 +020057 @attr(type='smoke')
nayna-patel197c0122013-07-11 10:18:00 +000058 def test_create_show_list_update_delete_router(self):
59 # Create a router
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -070060 # NOTE(salv-orlando): Do not invoke self.create_router
61 # as we need to check the response code
Masayuki Igawa259c1132013-10-31 17:48:44 +090062 name = data_utils.rand_name('router-')
nayna-patel197c0122013-07-11 10:18:00 +000063 resp, create_body = self.client.create_router(
64 name, external_gateway_info={
65 "network_id": self.network_cfg.public_network_id},
66 admin_state_up=False)
67 self.assertEqual('201', resp['status'])
68 self.addCleanup(self._delete_router, create_body['router']['id'])
69 self.assertEqual(create_body['router']['name'], name)
70 self.assertEqual(
71 create_body['router']['external_gateway_info']['network_id'],
72 self.network_cfg.public_network_id)
73 self.assertEqual(create_body['router']['admin_state_up'], False)
74 # Show details of the created router
75 resp, show_body = self.client.show_router(
76 create_body['router']['id'])
77 self.assertEqual('200', resp['status'])
78 self.assertEqual(show_body['router']['name'], name)
79 self.assertEqual(
80 show_body['router']['external_gateway_info']['network_id'],
81 self.network_cfg.public_network_id)
82 self.assertEqual(show_body['router']['admin_state_up'], False)
83 # List routers and verify if created router is there in response
84 resp, list_body = self.client.list_routers()
85 self.assertEqual('200', resp['status'])
86 routers_list = list()
87 for router in list_body['routers']:
88 routers_list.append(router['id'])
89 self.assertIn(create_body['router']['id'], routers_list)
90 # Update the name of router and verify if it is updated
91 updated_name = 'updated ' + name
92 resp, update_body = self.client.update_router(
93 create_body['router']['id'], name=updated_name)
94 self.assertEqual('200', resp['status'])
95 self.assertEqual(update_body['router']['name'], updated_name)
96 resp, show_body = self.client.show_router(
97 create_body['router']['id'])
98 self.assertEqual(show_body['router']['name'], updated_name)
99
Attila Fazekas71834a22013-08-18 06:56:21 +0200100 @attr(type='smoke')
nayna-patel197c0122013-07-11 10:18:00 +0000101 def test_add_remove_router_interface_with_subnet_id(self):
102 network = self.create_network()
103 subnet = self.create_subnet(network)
Masayuki Igawa259c1132013-10-31 17:48:44 +0900104 router = self.create_router(data_utils.rand_name('router-'))
Chang Bo Guof099f802013-09-13 19:01:46 -0700105 # Add router interface with subnet id
nayna-patel197c0122013-07-11 10:18:00 +0000106 resp, interface = self.client.add_router_interface_with_subnet_id(
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700107 router['id'], subnet['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000108 self.assertEqual('200', resp['status'])
109 self.addCleanup(self._remove_router_interface_with_subnet_id,
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700110 router['id'], subnet['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'])
nayna-patel197c0122013-07-11 10:18:00 +0000118
Attila Fazekas71834a22013-08-18 06:56:21 +0200119 @attr(type='smoke')
nayna-patel197c0122013-07-11 10:18:00 +0000120 def test_add_remove_router_interface_with_port_id(self):
121 network = self.create_network()
122 self.create_subnet(network)
Masayuki Igawa259c1132013-10-31 17:48:44 +0900123 router = self.create_router(data_utils.rand_name('router-'))
nayna-patel197c0122013-07-11 10:18:00 +0000124 resp, port_body = self.client.create_port(network['id'])
125 # add router interface to port created above
126 resp, interface = self.client.add_router_interface_with_port_id(
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700127 router['id'], port_body['port']['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000128 self.assertEqual('200', resp['status'])
129 self.addCleanup(self._remove_router_interface_with_port_id,
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700130 router['id'], port_body['port']['id'])
Attila Fazekas4b8b0082013-10-25 14:24:32 +0200131 self.assertIn('subnet_id', interface.keys())
132 self.assertIn('port_id', interface.keys())
nayna-patel197c0122013-07-11 10:18:00 +0000133 # Verify router id is equal to device id in port details
134 resp, show_port_body = self.client.show_port(
135 interface['port_id'])
136 self.assertEqual(show_port_body['port']['device_id'],
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700137 router['id'])
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700138
139 def _verify_router_gateway(self, router_id, exp_ext_gw_info=None):
140 resp, show_body = self.client.show_router(router_id)
141 self.assertEqual('200', resp['status'])
142 actual_ext_gw_info = show_body['router']['external_gateway_info']
143 if exp_ext_gw_info is None:
144 self.assertIsNone(actual_ext_gw_info)
145 return
146 # Verify only keys passed in exp_ext_gw_info
147 for k, v in exp_ext_gw_info.iteritems():
148 self.assertEqual(v, actual_ext_gw_info[k])
149
150 def _verify_gateway_port(self, router_id):
151 resp, list_body = self.admin_client.list_ports(
152 network_id=self.network_cfg.public_network_id,
153 device_id=router_id)
154 self.assertEqual(len(list_body['ports']), 1)
155 gw_port = list_body['ports'][0]
156 fixed_ips = gw_port['fixed_ips']
157 self.assertEqual(len(fixed_ips), 1)
158 resp, public_net_body = self.admin_client.show_network(
159 self.network_cfg.public_network_id)
160 public_subnet_id = public_net_body['network']['subnets'][0]
161 self.assertEqual(fixed_ips[0]['subnet_id'], public_subnet_id)
162
163 @attr(type='smoke')
164 def test_update_router_set_gateway(self):
Masayuki Igawa259c1132013-10-31 17:48:44 +0900165 router = self.create_router(data_utils.rand_name('router-'))
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700166 self.client.update_router(
167 router['id'],
168 external_gateway_info={
169 'network_id': self.network_cfg.public_network_id})
170 # Verify operation - router
171 resp, show_body = self.client.show_router(router['id'])
172 self.assertEqual('200', resp['status'])
173 self._verify_router_gateway(
174 router['id'],
175 {'network_id': self.network_cfg.public_network_id})
176 self._verify_gateway_port(router['id'])
177
178 @attr(type='smoke')
179 def test_update_router_set_gateway_with_snat_explicit(self):
Masayuki Igawa259c1132013-10-31 17:48:44 +0900180 router = self.create_router(data_utils.rand_name('router-'))
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700181 self.admin_client.update_router_with_snat_gw_info(
182 router['id'],
183 external_gateway_info={
184 'network_id': self.network_cfg.public_network_id,
185 'enable_snat': True})
186 self._verify_router_gateway(
187 router['id'],
188 {'network_id': self.network_cfg.public_network_id,
189 'enable_snat': True})
190 self._verify_gateway_port(router['id'])
191
192 @attr(type='smoke')
193 def test_update_router_set_gateway_without_snat(self):
Masayuki Igawa259c1132013-10-31 17:48:44 +0900194 router = self.create_router(data_utils.rand_name('router-'))
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700195 self.admin_client.update_router_with_snat_gw_info(
196 router['id'],
197 external_gateway_info={
198 'network_id': self.network_cfg.public_network_id,
199 'enable_snat': False})
200 self._verify_router_gateway(
201 router['id'],
202 {'network_id': self.network_cfg.public_network_id,
203 'enable_snat': False})
204 self._verify_gateway_port(router['id'])
205
206 @attr(type='smoke')
207 def test_update_router_unset_gateway(self):
208 router = self.create_router(
Masayuki Igawa259c1132013-10-31 17:48:44 +0900209 data_utils.rand_name('router-'),
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700210 external_network_id=self.network_cfg.public_network_id)
211 self.client.update_router(router['id'], external_gateway_info={})
212 self._verify_router_gateway(router['id'])
213 # No gateway port expected
214 resp, list_body = self.admin_client.list_ports(
215 network_id=self.network_cfg.public_network_id,
216 device_id=router['id'])
217 self.assertFalse(list_body['ports'])
218
219 @attr(type='smoke')
220 def test_update_router_reset_gateway_without_snat(self):
221 router = self.create_router(
Masayuki Igawa259c1132013-10-31 17:48:44 +0900222 data_utils.rand_name('router-'),
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700223 external_network_id=self.network_cfg.public_network_id)
224 self.admin_client.update_router_with_snat_gw_info(
225 router['id'],
226 external_gateway_info={
227 'network_id': self.network_cfg.public_network_id,
228 'enable_snat': False})
229 self._verify_router_gateway(
230 router['id'],
231 {'network_id': self.network_cfg.public_network_id,
232 'enable_snat': False})
233 self._verify_gateway_port(router['id'])
ChenZheng04ac6942013-12-09 16:42:52 +0800234
235 @attr(type='smoke')
236 def test_update_extra_route(self):
237 self.network = self.create_network()
238 self.name = self.network['name']
239 self.subnet = self.create_subnet(self.network)
240 # Add router interface with subnet id
241 self.router = self.create_router(data_utils.rand_name('router-'), True)
242 self.create_router_interface(self.router['id'], self.subnet['id'])
243 self.addCleanup(
244 self._delete_extra_routes,
245 self.router['id'])
246 # Update router extra route
247 cidr = netaddr.IPNetwork(self.subnet['cidr'])
248 resp, extra_route = self.client.update_extra_routes(
249 self.router['id'], str(cidr[0]), str(self.subnet['cidr']))
250
251 def _delete_extra_routes(self, router_id):
252 resp, _ = self.client.delete_extra_routes(router_id)