blob: 512d065b999ee6bb31a4e75d8a92a787a191c41c [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
18from tempest.api.network import base
19from tempest.common.utils.data_utils import rand_name
20from tempest.test import attr
21
22
Salvatore Orlandoce22b492013-09-20 04:04:11 -070023class RoutersTest(base.BaseAdminNetworkTest):
24 # NOTE(salv-orlando): This class inherits from BaseAdminNetworkTest
25 # as some router operations, such as enabling or disabling SNAT
26 # require admin credentials by default
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()
32
33 def _delete_router(self, router_id):
34 resp, _ = self.client.delete_router(router_id)
35 self.assertEqual(204, resp.status)
36 # Asserting that the router is not found in the list
37 # after deletion
38 resp, list_body = self.client.list_routers()
39 self.assertEqual('200', resp['status'])
40 routers_list = list()
41 for router in list_body['routers']:
42 routers_list.append(router['id'])
43 self.assertNotIn(router_id, routers_list)
44
45 def _remove_router_interface_with_subnet_id(self, router_id, subnet_id):
46 resp, _ = self.client.remove_router_interface_with_subnet_id(
47 router_id, subnet_id)
48 self.assertEqual('200', resp['status'])
49
50 def _remove_router_interface_with_port_id(self, router_id, port_id):
51 resp, _ = self.client.remove_router_interface_with_port_id(
52 router_id, port_id)
53 self.assertEqual('200', resp['status'])
54
Attila Fazekas71834a22013-08-18 06:56:21 +020055 @attr(type='smoke')
nayna-patel197c0122013-07-11 10:18:00 +000056 def test_create_show_list_update_delete_router(self):
57 # Create a router
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -070058 # NOTE(salv-orlando): Do not invoke self.create_router
59 # as we need to check the response code
nayna-patel197c0122013-07-11 10:18:00 +000060 name = rand_name('router-')
61 resp, create_body = self.client.create_router(
62 name, external_gateway_info={
63 "network_id": self.network_cfg.public_network_id},
64 admin_state_up=False)
65 self.assertEqual('201', resp['status'])
66 self.addCleanup(self._delete_router, create_body['router']['id'])
67 self.assertEqual(create_body['router']['name'], name)
68 self.assertEqual(
69 create_body['router']['external_gateway_info']['network_id'],
70 self.network_cfg.public_network_id)
71 self.assertEqual(create_body['router']['admin_state_up'], False)
72 # Show details of the created router
73 resp, show_body = self.client.show_router(
74 create_body['router']['id'])
75 self.assertEqual('200', resp['status'])
76 self.assertEqual(show_body['router']['name'], name)
77 self.assertEqual(
78 show_body['router']['external_gateway_info']['network_id'],
79 self.network_cfg.public_network_id)
80 self.assertEqual(show_body['router']['admin_state_up'], False)
81 # List routers and verify if created router is there in response
82 resp, list_body = self.client.list_routers()
83 self.assertEqual('200', resp['status'])
84 routers_list = list()
85 for router in list_body['routers']:
86 routers_list.append(router['id'])
87 self.assertIn(create_body['router']['id'], routers_list)
88 # Update the name of router and verify if it is updated
89 updated_name = 'updated ' + name
90 resp, update_body = self.client.update_router(
91 create_body['router']['id'], name=updated_name)
92 self.assertEqual('200', resp['status'])
93 self.assertEqual(update_body['router']['name'], updated_name)
94 resp, show_body = self.client.show_router(
95 create_body['router']['id'])
96 self.assertEqual(show_body['router']['name'], updated_name)
97
Attila Fazekas71834a22013-08-18 06:56:21 +020098 @attr(type='smoke')
nayna-patel197c0122013-07-11 10:18:00 +000099 def test_add_remove_router_interface_with_subnet_id(self):
100 network = self.create_network()
101 subnet = self.create_subnet(network)
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700102 router = self.create_router(rand_name('router-'))
Chang Bo Guof099f802013-09-13 19:01:46 -0700103 # Add router interface with subnet id
nayna-patel197c0122013-07-11 10:18:00 +0000104 resp, interface = self.client.add_router_interface_with_subnet_id(
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700105 router['id'], subnet['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000106 self.assertEqual('200', resp['status'])
107 self.addCleanup(self._remove_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.assertTrue('subnet_id' in interface.keys())
110 self.assertTrue('port_id' in interface.keys())
111 # Verify router id is equal to device id in port details
112 resp, show_port_body = self.client.show_port(
113 interface['port_id'])
114 self.assertEqual(show_port_body['port']['device_id'],
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700115 router['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000116
Attila Fazekas71834a22013-08-18 06:56:21 +0200117 @attr(type='smoke')
nayna-patel197c0122013-07-11 10:18:00 +0000118 def test_add_remove_router_interface_with_port_id(self):
119 network = self.create_network()
120 self.create_subnet(network)
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700121 router = self.create_router(rand_name('router-'))
nayna-patel197c0122013-07-11 10:18:00 +0000122 resp, port_body = self.client.create_port(network['id'])
123 # add router interface to port created above
124 resp, interface = self.client.add_router_interface_with_port_id(
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700125 router['id'], port_body['port']['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000126 self.assertEqual('200', resp['status'])
127 self.addCleanup(self._remove_router_interface_with_port_id,
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700128 router['id'], port_body['port']['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000129 self.assertTrue('subnet_id' in interface.keys())
130 self.assertTrue('port_id' in interface.keys())
131 # Verify router id is equal to device id in port details
132 resp, show_port_body = self.client.show_port(
133 interface['port_id'])
134 self.assertEqual(show_port_body['port']['device_id'],
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700135 router['id'])
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700136
137 def _verify_router_gateway(self, router_id, exp_ext_gw_info=None):
138 resp, show_body = self.client.show_router(router_id)
139 self.assertEqual('200', resp['status'])
140 actual_ext_gw_info = show_body['router']['external_gateway_info']
141 if exp_ext_gw_info is None:
142 self.assertIsNone(actual_ext_gw_info)
143 return
144 # Verify only keys passed in exp_ext_gw_info
145 for k, v in exp_ext_gw_info.iteritems():
146 self.assertEqual(v, actual_ext_gw_info[k])
147
148 def _verify_gateway_port(self, router_id):
149 resp, list_body = self.admin_client.list_ports(
150 network_id=self.network_cfg.public_network_id,
151 device_id=router_id)
152 self.assertEqual(len(list_body['ports']), 1)
153 gw_port = list_body['ports'][0]
154 fixed_ips = gw_port['fixed_ips']
155 self.assertEqual(len(fixed_ips), 1)
156 resp, public_net_body = self.admin_client.show_network(
157 self.network_cfg.public_network_id)
158 public_subnet_id = public_net_body['network']['subnets'][0]
159 self.assertEqual(fixed_ips[0]['subnet_id'], public_subnet_id)
160
161 @attr(type='smoke')
162 def test_update_router_set_gateway(self):
163 router = self.create_router(rand_name('router-'))
164 self.client.update_router(
165 router['id'],
166 external_gateway_info={
167 'network_id': self.network_cfg.public_network_id})
168 # Verify operation - router
169 resp, show_body = self.client.show_router(router['id'])
170 self.assertEqual('200', resp['status'])
171 self._verify_router_gateway(
172 router['id'],
173 {'network_id': self.network_cfg.public_network_id})
174 self._verify_gateway_port(router['id'])
175
176 @attr(type='smoke')
177 def test_update_router_set_gateway_with_snat_explicit(self):
178 router = self.create_router(rand_name('router-'))
179 self.admin_client.update_router_with_snat_gw_info(
180 router['id'],
181 external_gateway_info={
182 'network_id': self.network_cfg.public_network_id,
183 'enable_snat': True})
184 self._verify_router_gateway(
185 router['id'],
186 {'network_id': self.network_cfg.public_network_id,
187 'enable_snat': True})
188 self._verify_gateway_port(router['id'])
189
190 @attr(type='smoke')
191 def test_update_router_set_gateway_without_snat(self):
192 router = self.create_router(rand_name('router-'))
193 self.admin_client.update_router_with_snat_gw_info(
194 router['id'],
195 external_gateway_info={
196 'network_id': self.network_cfg.public_network_id,
197 'enable_snat': False})
198 self._verify_router_gateway(
199 router['id'],
200 {'network_id': self.network_cfg.public_network_id,
201 'enable_snat': False})
202 self._verify_gateway_port(router['id'])
203
204 @attr(type='smoke')
205 def test_update_router_unset_gateway(self):
206 router = self.create_router(
207 rand_name('router-'),
208 external_network_id=self.network_cfg.public_network_id)
209 self.client.update_router(router['id'], external_gateway_info={})
210 self._verify_router_gateway(router['id'])
211 # No gateway port expected
212 resp, list_body = self.admin_client.list_ports(
213 network_id=self.network_cfg.public_network_id,
214 device_id=router['id'])
215 self.assertFalse(list_body['ports'])
216
217 @attr(type='smoke')
218 def test_update_router_reset_gateway_without_snat(self):
219 router = self.create_router(
220 rand_name('router-'),
221 external_network_id=self.network_cfg.public_network_id)
222 self.admin_client.update_router_with_snat_gw_info(
223 router['id'],
224 external_gateway_info={
225 'network_id': self.network_cfg.public_network_id,
226 'enable_snat': False})
227 self._verify_router_gateway(
228 router['id'],
229 {'network_id': self.network_cfg.public_network_id,
230 'enable_snat': False})
231 self._verify_gateway_port(router['id'])