blob: 7cabb639a8ce7b7bed175d33b346ff378be1178c [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
armando-migliaccio89e5b962013-12-16 06:12:16 -080020from tempest import test
nayna-patel197c0122013-07-11 10:18:00 +000021
22
rossellae02431e2013-11-15 17:58:29 +010023class RoutersTest(base.BaseRouterTest):
raiesmh0867698322013-08-20 13:09:01 +053024 _interface = 'json'
nayna-patel197c0122013-07-11 10:18:00 +000025
26 @classmethod
27 def setUpClass(cls):
28 super(RoutersTest, cls).setUpClass()
29
armando-migliaccio89e5b962013-12-16 06:12:16 -080030 @test.attr(type='smoke')
nayna-patel197c0122013-07-11 10:18:00 +000031 def test_create_show_list_update_delete_router(self):
32 # Create a router
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -070033 # NOTE(salv-orlando): Do not invoke self.create_router
34 # as we need to check the response code
Masayuki Igawa259c1132013-10-31 17:48:44 +090035 name = data_utils.rand_name('router-')
nayna-patel197c0122013-07-11 10:18:00 +000036 resp, create_body = self.client.create_router(
37 name, external_gateway_info={
38 "network_id": self.network_cfg.public_network_id},
39 admin_state_up=False)
40 self.assertEqual('201', resp['status'])
41 self.addCleanup(self._delete_router, create_body['router']['id'])
42 self.assertEqual(create_body['router']['name'], name)
43 self.assertEqual(
44 create_body['router']['external_gateway_info']['network_id'],
45 self.network_cfg.public_network_id)
46 self.assertEqual(create_body['router']['admin_state_up'], False)
47 # Show details of the created router
48 resp, show_body = self.client.show_router(
49 create_body['router']['id'])
50 self.assertEqual('200', resp['status'])
51 self.assertEqual(show_body['router']['name'], name)
52 self.assertEqual(
53 show_body['router']['external_gateway_info']['network_id'],
54 self.network_cfg.public_network_id)
55 self.assertEqual(show_body['router']['admin_state_up'], False)
56 # List routers and verify if created router is there in response
57 resp, list_body = self.client.list_routers()
58 self.assertEqual('200', resp['status'])
59 routers_list = list()
60 for router in list_body['routers']:
61 routers_list.append(router['id'])
62 self.assertIn(create_body['router']['id'], routers_list)
63 # Update the name of router and verify if it is updated
64 updated_name = 'updated ' + name
65 resp, update_body = self.client.update_router(
66 create_body['router']['id'], name=updated_name)
67 self.assertEqual('200', resp['status'])
68 self.assertEqual(update_body['router']['name'], updated_name)
69 resp, show_body = self.client.show_router(
70 create_body['router']['id'])
71 self.assertEqual(show_body['router']['name'], updated_name)
72
armando-migliaccio89e5b962013-12-16 06:12:16 -080073 @test.attr(type='smoke')
nayna-patel197c0122013-07-11 10:18:00 +000074 def test_add_remove_router_interface_with_subnet_id(self):
75 network = self.create_network()
76 subnet = self.create_subnet(network)
Masayuki Igawa259c1132013-10-31 17:48:44 +090077 router = self.create_router(data_utils.rand_name('router-'))
Chang Bo Guof099f802013-09-13 19:01:46 -070078 # Add router interface with subnet id
nayna-patel197c0122013-07-11 10:18:00 +000079 resp, interface = self.client.add_router_interface_with_subnet_id(
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -070080 router['id'], subnet['id'])
nayna-patel197c0122013-07-11 10:18:00 +000081 self.assertEqual('200', resp['status'])
82 self.addCleanup(self._remove_router_interface_with_subnet_id,
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -070083 router['id'], subnet['id'])
Attila Fazekas4b8b0082013-10-25 14:24:32 +020084 self.assertIn('subnet_id', interface.keys())
85 self.assertIn('port_id', interface.keys())
nayna-patel197c0122013-07-11 10:18:00 +000086 # Verify router id is equal to device id in port details
87 resp, show_port_body = self.client.show_port(
88 interface['port_id'])
89 self.assertEqual(show_port_body['port']['device_id'],
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -070090 router['id'])
nayna-patel197c0122013-07-11 10:18:00 +000091
armando-migliaccio89e5b962013-12-16 06:12:16 -080092 @test.attr(type='smoke')
nayna-patel197c0122013-07-11 10:18:00 +000093 def test_add_remove_router_interface_with_port_id(self):
94 network = self.create_network()
95 self.create_subnet(network)
Masayuki Igawa259c1132013-10-31 17:48:44 +090096 router = self.create_router(data_utils.rand_name('router-'))
Eugene Nikanorove9d255a2013-12-18 16:31:42 +040097 resp, port_body = self.client.create_port(
98 network_id=network['id'])
nayna-patel197c0122013-07-11 10:18:00 +000099 # add router interface to port created above
100 resp, interface = self.client.add_router_interface_with_port_id(
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700101 router['id'], port_body['port']['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000102 self.assertEqual('200', resp['status'])
103 self.addCleanup(self._remove_router_interface_with_port_id,
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700104 router['id'], port_body['port']['id'])
Attila Fazekas4b8b0082013-10-25 14:24:32 +0200105 self.assertIn('subnet_id', interface.keys())
106 self.assertIn('port_id', interface.keys())
nayna-patel197c0122013-07-11 10:18:00 +0000107 # Verify router id is equal to device id in port details
108 resp, show_port_body = self.client.show_port(
109 interface['port_id'])
110 self.assertEqual(show_port_body['port']['device_id'],
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700111 router['id'])
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700112
113 def _verify_router_gateway(self, router_id, exp_ext_gw_info=None):
114 resp, show_body = self.client.show_router(router_id)
115 self.assertEqual('200', resp['status'])
116 actual_ext_gw_info = show_body['router']['external_gateway_info']
117 if exp_ext_gw_info is None:
118 self.assertIsNone(actual_ext_gw_info)
119 return
120 # Verify only keys passed in exp_ext_gw_info
121 for k, v in exp_ext_gw_info.iteritems():
122 self.assertEqual(v, actual_ext_gw_info[k])
123
124 def _verify_gateway_port(self, router_id):
125 resp, list_body = self.admin_client.list_ports(
126 network_id=self.network_cfg.public_network_id,
127 device_id=router_id)
128 self.assertEqual(len(list_body['ports']), 1)
129 gw_port = list_body['ports'][0]
130 fixed_ips = gw_port['fixed_ips']
131 self.assertEqual(len(fixed_ips), 1)
132 resp, public_net_body = self.admin_client.show_network(
133 self.network_cfg.public_network_id)
134 public_subnet_id = public_net_body['network']['subnets'][0]
135 self.assertEqual(fixed_ips[0]['subnet_id'], public_subnet_id)
136
armando-migliaccio89e5b962013-12-16 06:12:16 -0800137 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700138 def test_update_router_set_gateway(self):
Masayuki Igawa259c1132013-10-31 17:48:44 +0900139 router = self.create_router(data_utils.rand_name('router-'))
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700140 self.client.update_router(
141 router['id'],
142 external_gateway_info={
143 'network_id': self.network_cfg.public_network_id})
144 # Verify operation - router
145 resp, show_body = self.client.show_router(router['id'])
146 self.assertEqual('200', resp['status'])
147 self._verify_router_gateway(
148 router['id'],
149 {'network_id': self.network_cfg.public_network_id})
150 self._verify_gateway_port(router['id'])
151
ronak79f17932014-01-27 17:56:21 -0800152 @test.requires_ext(extension='ext-gw-mode', service='network')
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
ronak79f17932014-01-27 17:56:21 -0800167 @test.requires_ext(extension='ext-gw-mode', service='network')
armando-migliaccio89e5b962013-12-16 06:12:16 -0800168 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700169 def test_update_router_set_gateway_without_snat(self):
Masayuki Igawa259c1132013-10-31 17:48:44 +0900170 router = self.create_router(data_utils.rand_name('router-'))
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700171 self.admin_client.update_router_with_snat_gw_info(
172 router['id'],
173 external_gateway_info={
174 'network_id': self.network_cfg.public_network_id,
175 'enable_snat': False})
176 self._verify_router_gateway(
177 router['id'],
178 {'network_id': self.network_cfg.public_network_id,
179 'enable_snat': False})
180 self._verify_gateway_port(router['id'])
181
armando-migliaccio89e5b962013-12-16 06:12:16 -0800182 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700183 def test_update_router_unset_gateway(self):
184 router = self.create_router(
Masayuki Igawa259c1132013-10-31 17:48:44 +0900185 data_utils.rand_name('router-'),
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700186 external_network_id=self.network_cfg.public_network_id)
187 self.client.update_router(router['id'], external_gateway_info={})
188 self._verify_router_gateway(router['id'])
189 # No gateway port expected
190 resp, list_body = self.admin_client.list_ports(
191 network_id=self.network_cfg.public_network_id,
192 device_id=router['id'])
193 self.assertFalse(list_body['ports'])
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_reset_gateway_without_snat(self):
198 router = self.create_router(
Masayuki Igawa259c1132013-10-31 17:48:44 +0900199 data_utils.rand_name('router-'),
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700200 external_network_id=self.network_cfg.public_network_id)
201 self.admin_client.update_router_with_snat_gw_info(
202 router['id'],
203 external_gateway_info={
204 'network_id': self.network_cfg.public_network_id,
205 'enable_snat': False})
206 self._verify_router_gateway(
207 router['id'],
208 {'network_id': self.network_cfg.public_network_id,
209 'enable_snat': False})
210 self._verify_gateway_port(router['id'])
ChenZheng04ac6942013-12-09 16:42:52 +0800211
armando-migliaccio89e5b962013-12-16 06:12:16 -0800212 @test.requires_ext(extension='extraroute', service='network')
213 @test.attr(type='smoke')
ChenZheng04ac6942013-12-09 16:42:52 +0800214 def test_update_extra_route(self):
215 self.network = self.create_network()
216 self.name = self.network['name']
217 self.subnet = self.create_subnet(self.network)
218 # Add router interface with subnet id
219 self.router = self.create_router(data_utils.rand_name('router-'), True)
220 self.create_router_interface(self.router['id'], self.subnet['id'])
221 self.addCleanup(
222 self._delete_extra_routes,
223 self.router['id'])
224 # Update router extra route
225 cidr = netaddr.IPNetwork(self.subnet['cidr'])
226 resp, extra_route = self.client.update_extra_routes(
227 self.router['id'], str(cidr[0]), str(self.subnet['cidr']))
228
229 def _delete_extra_routes(self, router_id):
230 resp, _ = self.client.delete_extra_routes(router_id)