blob: b6022e81a28e9034b1cea17dec1b5897de26a347 [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
rossellae02431e2013-11-15 17:58:29 +010020from tempest.api.network import base_routers as base
Masayuki Igawa259c1132013-10-31 17:48:44 +090021from tempest.common.utils import data_utils
armando-migliaccio89e5b962013-12-16 06:12:16 -080022from tempest import test
nayna-patel197c0122013-07-11 10:18:00 +000023
24
rossellae02431e2013-11-15 17:58:29 +010025class RoutersTest(base.BaseRouterTest):
raiesmh0867698322013-08-20 13:09:01 +053026 _interface = 'json'
nayna-patel197c0122013-07-11 10:18:00 +000027
28 @classmethod
29 def setUpClass(cls):
30 super(RoutersTest, cls).setUpClass()
31
armando-migliaccio89e5b962013-12-16 06:12:16 -080032 @test.attr(type='smoke')
nayna-patel197c0122013-07-11 10:18:00 +000033 def test_create_show_list_update_delete_router(self):
34 # Create a router
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -070035 # NOTE(salv-orlando): Do not invoke self.create_router
36 # as we need to check the response code
Masayuki Igawa259c1132013-10-31 17:48:44 +090037 name = data_utils.rand_name('router-')
nayna-patel197c0122013-07-11 10:18:00 +000038 resp, create_body = self.client.create_router(
39 name, external_gateway_info={
40 "network_id": self.network_cfg.public_network_id},
41 admin_state_up=False)
42 self.assertEqual('201', resp['status'])
43 self.addCleanup(self._delete_router, create_body['router']['id'])
44 self.assertEqual(create_body['router']['name'], name)
45 self.assertEqual(
46 create_body['router']['external_gateway_info']['network_id'],
47 self.network_cfg.public_network_id)
48 self.assertEqual(create_body['router']['admin_state_up'], False)
49 # Show details of the created router
50 resp, show_body = self.client.show_router(
51 create_body['router']['id'])
52 self.assertEqual('200', resp['status'])
53 self.assertEqual(show_body['router']['name'], name)
54 self.assertEqual(
55 show_body['router']['external_gateway_info']['network_id'],
56 self.network_cfg.public_network_id)
57 self.assertEqual(show_body['router']['admin_state_up'], False)
58 # List routers and verify if created router is there in response
59 resp, list_body = self.client.list_routers()
60 self.assertEqual('200', resp['status'])
61 routers_list = list()
62 for router in list_body['routers']:
63 routers_list.append(router['id'])
64 self.assertIn(create_body['router']['id'], routers_list)
65 # Update the name of router and verify if it is updated
66 updated_name = 'updated ' + name
67 resp, update_body = self.client.update_router(
68 create_body['router']['id'], name=updated_name)
69 self.assertEqual('200', resp['status'])
70 self.assertEqual(update_body['router']['name'], updated_name)
71 resp, show_body = self.client.show_router(
72 create_body['router']['id'])
73 self.assertEqual(show_body['router']['name'], updated_name)
74
armando-migliaccio89e5b962013-12-16 06:12:16 -080075 @test.attr(type='smoke')
nayna-patel197c0122013-07-11 10:18:00 +000076 def test_add_remove_router_interface_with_subnet_id(self):
77 network = self.create_network()
78 subnet = self.create_subnet(network)
Masayuki Igawa259c1132013-10-31 17:48:44 +090079 router = self.create_router(data_utils.rand_name('router-'))
Chang Bo Guof099f802013-09-13 19:01:46 -070080 # Add router interface with subnet id
nayna-patel197c0122013-07-11 10:18:00 +000081 resp, interface = self.client.add_router_interface_with_subnet_id(
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -070082 router['id'], subnet['id'])
nayna-patel197c0122013-07-11 10:18:00 +000083 self.assertEqual('200', resp['status'])
84 self.addCleanup(self._remove_router_interface_with_subnet_id,
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -070085 router['id'], subnet['id'])
Attila Fazekas4b8b0082013-10-25 14:24:32 +020086 self.assertIn('subnet_id', interface.keys())
87 self.assertIn('port_id', interface.keys())
nayna-patel197c0122013-07-11 10:18:00 +000088 # Verify router id is equal to device id in port details
89 resp, show_port_body = self.client.show_port(
90 interface['port_id'])
91 self.assertEqual(show_port_body['port']['device_id'],
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -070092 router['id'])
nayna-patel197c0122013-07-11 10:18:00 +000093
armando-migliaccio89e5b962013-12-16 06:12:16 -080094 @test.attr(type='smoke')
nayna-patel197c0122013-07-11 10:18:00 +000095 def test_add_remove_router_interface_with_port_id(self):
96 network = self.create_network()
97 self.create_subnet(network)
Masayuki Igawa259c1132013-10-31 17:48:44 +090098 router = self.create_router(data_utils.rand_name('router-'))
nayna-patel197c0122013-07-11 10:18:00 +000099 resp, port_body = self.client.create_port(network['id'])
100 # add router interface to port created above
101 resp, interface = self.client.add_router_interface_with_port_id(
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700102 router['id'], port_body['port']['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000103 self.assertEqual('200', resp['status'])
104 self.addCleanup(self._remove_router_interface_with_port_id,
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700105 router['id'], port_body['port']['id'])
Attila Fazekas4b8b0082013-10-25 14:24:32 +0200106 self.assertIn('subnet_id', interface.keys())
107 self.assertIn('port_id', interface.keys())
nayna-patel197c0122013-07-11 10:18:00 +0000108 # Verify router id is equal to device id in port details
109 resp, show_port_body = self.client.show_port(
110 interface['port_id'])
111 self.assertEqual(show_port_body['port']['device_id'],
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700112 router['id'])
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700113
114 def _verify_router_gateway(self, router_id, exp_ext_gw_info=None):
115 resp, show_body = self.client.show_router(router_id)
116 self.assertEqual('200', resp['status'])
117 actual_ext_gw_info = show_body['router']['external_gateway_info']
118 if exp_ext_gw_info is None:
119 self.assertIsNone(actual_ext_gw_info)
120 return
121 # Verify only keys passed in exp_ext_gw_info
122 for k, v in exp_ext_gw_info.iteritems():
123 self.assertEqual(v, actual_ext_gw_info[k])
124
125 def _verify_gateway_port(self, router_id):
126 resp, list_body = self.admin_client.list_ports(
127 network_id=self.network_cfg.public_network_id,
128 device_id=router_id)
129 self.assertEqual(len(list_body['ports']), 1)
130 gw_port = list_body['ports'][0]
131 fixed_ips = gw_port['fixed_ips']
132 self.assertEqual(len(fixed_ips), 1)
133 resp, public_net_body = self.admin_client.show_network(
134 self.network_cfg.public_network_id)
135 public_subnet_id = public_net_body['network']['subnets'][0]
136 self.assertEqual(fixed_ips[0]['subnet_id'], public_subnet_id)
137
armando-migliaccio89e5b962013-12-16 06:12:16 -0800138 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700139 def test_update_router_set_gateway(self):
Masayuki Igawa259c1132013-10-31 17:48:44 +0900140 router = self.create_router(data_utils.rand_name('router-'))
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700141 self.client.update_router(
142 router['id'],
143 external_gateway_info={
144 'network_id': self.network_cfg.public_network_id})
145 # Verify operation - router
146 resp, show_body = self.client.show_router(router['id'])
147 self.assertEqual('200', resp['status'])
148 self._verify_router_gateway(
149 router['id'],
150 {'network_id': self.network_cfg.public_network_id})
151 self._verify_gateway_port(router['id'])
152
armando-migliaccio89e5b962013-12-16 06:12:16 -0800153 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700154 def test_update_router_set_gateway_with_snat_explicit(self):
Masayuki Igawa259c1132013-10-31 17:48:44 +0900155 router = self.create_router(data_utils.rand_name('router-'))
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700156 self.admin_client.update_router_with_snat_gw_info(
157 router['id'],
158 external_gateway_info={
159 'network_id': self.network_cfg.public_network_id,
160 'enable_snat': True})
161 self._verify_router_gateway(
162 router['id'],
163 {'network_id': self.network_cfg.public_network_id,
164 'enable_snat': True})
165 self._verify_gateway_port(router['id'])
166
armando-migliaccio89e5b962013-12-16 06:12:16 -0800167 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700168 def test_update_router_set_gateway_without_snat(self):
Masayuki Igawa259c1132013-10-31 17:48:44 +0900169 router = self.create_router(data_utils.rand_name('router-'))
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700170 self.admin_client.update_router_with_snat_gw_info(
171 router['id'],
172 external_gateway_info={
173 'network_id': self.network_cfg.public_network_id,
174 'enable_snat': False})
175 self._verify_router_gateway(
176 router['id'],
177 {'network_id': self.network_cfg.public_network_id,
178 'enable_snat': False})
179 self._verify_gateway_port(router['id'])
180
armando-migliaccio89e5b962013-12-16 06:12:16 -0800181 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700182 def test_update_router_unset_gateway(self):
183 router = self.create_router(
Masayuki Igawa259c1132013-10-31 17:48:44 +0900184 data_utils.rand_name('router-'),
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700185 external_network_id=self.network_cfg.public_network_id)
186 self.client.update_router(router['id'], external_gateway_info={})
187 self._verify_router_gateway(router['id'])
188 # No gateway port expected
189 resp, list_body = self.admin_client.list_ports(
190 network_id=self.network_cfg.public_network_id,
191 device_id=router['id'])
192 self.assertFalse(list_body['ports'])
193
armando-migliaccio89e5b962013-12-16 06:12:16 -0800194 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700195 def test_update_router_reset_gateway_without_snat(self):
196 router = self.create_router(
Masayuki Igawa259c1132013-10-31 17:48:44 +0900197 data_utils.rand_name('router-'),
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700198 external_network_id=self.network_cfg.public_network_id)
199 self.admin_client.update_router_with_snat_gw_info(
200 router['id'],
201 external_gateway_info={
202 'network_id': self.network_cfg.public_network_id,
203 'enable_snat': False})
204 self._verify_router_gateway(
205 router['id'],
206 {'network_id': self.network_cfg.public_network_id,
207 'enable_snat': False})
208 self._verify_gateway_port(router['id'])
ChenZheng04ac6942013-12-09 16:42:52 +0800209
armando-migliaccio89e5b962013-12-16 06:12:16 -0800210 @test.requires_ext(extension='extraroute', service='network')
211 @test.attr(type='smoke')
ChenZheng04ac6942013-12-09 16:42:52 +0800212 def test_update_extra_route(self):
213 self.network = self.create_network()
214 self.name = self.network['name']
215 self.subnet = self.create_subnet(self.network)
216 # Add router interface with subnet id
217 self.router = self.create_router(data_utils.rand_name('router-'), True)
218 self.create_router_interface(self.router['id'], self.subnet['id'])
219 self.addCleanup(
220 self._delete_extra_routes,
221 self.router['id'])
222 # Update router extra route
223 cidr = netaddr.IPNetwork(self.subnet['cidr'])
224 resp, extra_route = self.client.update_extra_routes(
225 self.router['id'], str(cidr[0]), str(self.subnet['cidr']))
226
227 def _delete_extra_routes(self, router_id):
228 resp, _ = self.client.delete_extra_routes(router_id)