blob: 426273c3637690a34a45cf7d66bbb08c9cec424f [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
armando-migliaccio89e5b962013-12-16 06:12:16 -0800152 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700153 def test_update_router_set_gateway_with_snat_explicit(self):
Masayuki Igawa259c1132013-10-31 17:48:44 +0900154 router = self.create_router(data_utils.rand_name('router-'))
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700155 self.admin_client.update_router_with_snat_gw_info(
156 router['id'],
157 external_gateway_info={
158 'network_id': self.network_cfg.public_network_id,
159 'enable_snat': True})
160 self._verify_router_gateway(
161 router['id'],
162 {'network_id': self.network_cfg.public_network_id,
163 'enable_snat': True})
164 self._verify_gateway_port(router['id'])
165
armando-migliaccio89e5b962013-12-16 06:12:16 -0800166 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700167 def test_update_router_set_gateway_without_snat(self):
Masayuki Igawa259c1132013-10-31 17:48:44 +0900168 router = self.create_router(data_utils.rand_name('router-'))
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700169 self.admin_client.update_router_with_snat_gw_info(
170 router['id'],
171 external_gateway_info={
172 'network_id': self.network_cfg.public_network_id,
173 'enable_snat': False})
174 self._verify_router_gateway(
175 router['id'],
176 {'network_id': self.network_cfg.public_network_id,
177 'enable_snat': False})
178 self._verify_gateway_port(router['id'])
179
armando-migliaccio89e5b962013-12-16 06:12:16 -0800180 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700181 def test_update_router_unset_gateway(self):
182 router = self.create_router(
Masayuki Igawa259c1132013-10-31 17:48:44 +0900183 data_utils.rand_name('router-'),
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700184 external_network_id=self.network_cfg.public_network_id)
185 self.client.update_router(router['id'], external_gateway_info={})
186 self._verify_router_gateway(router['id'])
187 # No gateway port expected
188 resp, list_body = self.admin_client.list_ports(
189 network_id=self.network_cfg.public_network_id,
190 device_id=router['id'])
191 self.assertFalse(list_body['ports'])
192
armando-migliaccio89e5b962013-12-16 06:12:16 -0800193 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700194 def test_update_router_reset_gateway_without_snat(self):
195 router = self.create_router(
Masayuki Igawa259c1132013-10-31 17:48:44 +0900196 data_utils.rand_name('router-'),
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700197 external_network_id=self.network_cfg.public_network_id)
198 self.admin_client.update_router_with_snat_gw_info(
199 router['id'],
200 external_gateway_info={
201 'network_id': self.network_cfg.public_network_id,
202 'enable_snat': False})
203 self._verify_router_gateway(
204 router['id'],
205 {'network_id': self.network_cfg.public_network_id,
206 'enable_snat': False})
207 self._verify_gateway_port(router['id'])
ChenZheng04ac6942013-12-09 16:42:52 +0800208
armando-migliaccio89e5b962013-12-16 06:12:16 -0800209 @test.requires_ext(extension='extraroute', service='network')
210 @test.attr(type='smoke')
ChenZheng04ac6942013-12-09 16:42:52 +0800211 def test_update_extra_route(self):
212 self.network = self.create_network()
213 self.name = self.network['name']
214 self.subnet = self.create_subnet(self.network)
215 # Add router interface with subnet id
216 self.router = self.create_router(data_utils.rand_name('router-'), True)
217 self.create_router_interface(self.router['id'], self.subnet['id'])
218 self.addCleanup(
219 self._delete_extra_routes,
220 self.router['id'])
221 # Update router extra route
222 cidr = netaddr.IPNetwork(self.subnet['cidr'])
223 resp, extra_route = self.client.update_extra_routes(
224 self.router['id'], str(cidr[0]), str(self.subnet['cidr']))
225
226 def _delete_extra_routes(self, router_id):
227 resp, _ = self.client.delete_extra_routes(router_id)