blob: f3fac933103b6098c32a9e3abaf9a2db1d5e9f9c [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
Matthew Treinish03b48df2014-01-29 16:59:49 +000020from tempest import config
armando-migliaccio89e5b962013-12-16 06:12:16 -080021from tempest import test
nayna-patel197c0122013-07-11 10:18:00 +000022
Matthew Treinish03b48df2014-01-29 16:59:49 +000023CONF = config.CONF
24
nayna-patel197c0122013-07-11 10:18:00 +000025
rossellae02431e2013-11-15 17:58:29 +010026class RoutersTest(base.BaseRouterTest):
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
armando-migliaccio89e5b962013-12-16 06:12:16 -080033 @test.attr(type='smoke')
nayna-patel197c0122013-07-11 10:18:00 +000034 def test_create_show_list_update_delete_router(self):
35 # Create a router
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -070036 # NOTE(salv-orlando): Do not invoke self.create_router
37 # as we need to check the response code
Masayuki Igawa259c1132013-10-31 17:48:44 +090038 name = data_utils.rand_name('router-')
nayna-patel197c0122013-07-11 10:18:00 +000039 resp, create_body = self.client.create_router(
40 name, external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +000041 "network_id": CONF.network.public_network_id},
nayna-patel197c0122013-07-11 10:18:00 +000042 admin_state_up=False)
43 self.assertEqual('201', resp['status'])
44 self.addCleanup(self._delete_router, create_body['router']['id'])
45 self.assertEqual(create_body['router']['name'], name)
46 self.assertEqual(
47 create_body['router']['external_gateway_info']['network_id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +000048 CONF.network.public_network_id)
nayna-patel197c0122013-07-11 10:18:00 +000049 self.assertEqual(create_body['router']['admin_state_up'], False)
50 # Show details of the created router
51 resp, show_body = self.client.show_router(
52 create_body['router']['id'])
53 self.assertEqual('200', resp['status'])
54 self.assertEqual(show_body['router']['name'], name)
55 self.assertEqual(
56 show_body['router']['external_gateway_info']['network_id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +000057 CONF.network.public_network_id)
nayna-patel197c0122013-07-11 10:18:00 +000058 self.assertEqual(show_body['router']['admin_state_up'], False)
59 # List routers and verify if created router is there in response
60 resp, list_body = self.client.list_routers()
61 self.assertEqual('200', resp['status'])
62 routers_list = list()
63 for router in list_body['routers']:
64 routers_list.append(router['id'])
65 self.assertIn(create_body['router']['id'], routers_list)
66 # Update the name of router and verify if it is updated
67 updated_name = 'updated ' + name
68 resp, update_body = self.client.update_router(
69 create_body['router']['id'], name=updated_name)
70 self.assertEqual('200', resp['status'])
71 self.assertEqual(update_body['router']['name'], updated_name)
72 resp, show_body = self.client.show_router(
73 create_body['router']['id'])
74 self.assertEqual(show_body['router']['name'], updated_name)
75
armando-migliaccio89e5b962013-12-16 06:12:16 -080076 @test.attr(type='smoke')
nayna-patel197c0122013-07-11 10:18:00 +000077 def test_add_remove_router_interface_with_subnet_id(self):
78 network = self.create_network()
79 subnet = self.create_subnet(network)
Masayuki Igawa259c1132013-10-31 17:48:44 +090080 router = self.create_router(data_utils.rand_name('router-'))
Chang Bo Guof099f802013-09-13 19:01:46 -070081 # Add router interface with subnet id
nayna-patel197c0122013-07-11 10:18:00 +000082 resp, interface = self.client.add_router_interface_with_subnet_id(
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -070083 router['id'], subnet['id'])
nayna-patel197c0122013-07-11 10:18:00 +000084 self.assertEqual('200', resp['status'])
85 self.addCleanup(self._remove_router_interface_with_subnet_id,
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -070086 router['id'], subnet['id'])
Attila Fazekas4b8b0082013-10-25 14:24:32 +020087 self.assertIn('subnet_id', interface.keys())
88 self.assertIn('port_id', interface.keys())
nayna-patel197c0122013-07-11 10:18:00 +000089 # Verify router id is equal to device id in port details
90 resp, show_port_body = self.client.show_port(
91 interface['port_id'])
92 self.assertEqual(show_port_body['port']['device_id'],
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -070093 router['id'])
nayna-patel197c0122013-07-11 10:18:00 +000094
armando-migliaccio89e5b962013-12-16 06:12:16 -080095 @test.attr(type='smoke')
nayna-patel197c0122013-07-11 10:18:00 +000096 def test_add_remove_router_interface_with_port_id(self):
97 network = self.create_network()
98 self.create_subnet(network)
Masayuki Igawa259c1132013-10-31 17:48:44 +090099 router = self.create_router(data_utils.rand_name('router-'))
Eugene Nikanorove9d255a2013-12-18 16:31:42 +0400100 resp, port_body = self.client.create_port(
101 network_id=network['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000102 # add router interface to port created above
103 resp, interface = self.client.add_router_interface_with_port_id(
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700104 router['id'], port_body['port']['id'])
nayna-patel197c0122013-07-11 10:18:00 +0000105 self.assertEqual('200', resp['status'])
106 self.addCleanup(self._remove_router_interface_with_port_id,
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700107 router['id'], port_body['port']['id'])
Attila Fazekas4b8b0082013-10-25 14:24:32 +0200108 self.assertIn('subnet_id', interface.keys())
109 self.assertIn('port_id', interface.keys())
nayna-patel197c0122013-07-11 10:18:00 +0000110 # Verify router id is equal to device id in port details
111 resp, show_port_body = self.client.show_port(
112 interface['port_id'])
113 self.assertEqual(show_port_body['port']['device_id'],
Salvatore Orlandoa85e8fe2013-09-20 03:48:02 -0700114 router['id'])
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700115
116 def _verify_router_gateway(self, router_id, exp_ext_gw_info=None):
117 resp, show_body = self.client.show_router(router_id)
118 self.assertEqual('200', resp['status'])
119 actual_ext_gw_info = show_body['router']['external_gateway_info']
120 if exp_ext_gw_info is None:
121 self.assertIsNone(actual_ext_gw_info)
122 return
123 # Verify only keys passed in exp_ext_gw_info
124 for k, v in exp_ext_gw_info.iteritems():
125 self.assertEqual(v, actual_ext_gw_info[k])
126
127 def _verify_gateway_port(self, router_id):
128 resp, list_body = self.admin_client.list_ports(
Matthew Treinish03b48df2014-01-29 16:59:49 +0000129 network_id=CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700130 device_id=router_id)
131 self.assertEqual(len(list_body['ports']), 1)
132 gw_port = list_body['ports'][0]
133 fixed_ips = gw_port['fixed_ips']
134 self.assertEqual(len(fixed_ips), 1)
135 resp, public_net_body = self.admin_client.show_network(
Matthew Treinish03b48df2014-01-29 16:59:49 +0000136 CONF.network.public_network_id)
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700137 public_subnet_id = public_net_body['network']['subnets'][0]
138 self.assertEqual(fixed_ips[0]['subnet_id'], public_subnet_id)
139
armando-migliaccio89e5b962013-12-16 06:12:16 -0800140 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700141 def test_update_router_set_gateway(self):
Masayuki Igawa259c1132013-10-31 17:48:44 +0900142 router = self.create_router(data_utils.rand_name('router-'))
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700143 self.client.update_router(
144 router['id'],
145 external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +0000146 'network_id': CONF.network.public_network_id})
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700147 # Verify operation - router
148 resp, show_body = self.client.show_router(router['id'])
149 self.assertEqual('200', resp['status'])
150 self._verify_router_gateway(
151 router['id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +0000152 {'network_id': CONF.network.public_network_id})
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700153 self._verify_gateway_port(router['id'])
154
ronak79f17932014-01-27 17:56:21 -0800155 @test.requires_ext(extension='ext-gw-mode', service='network')
armando-migliaccio89e5b962013-12-16 06:12:16 -0800156 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700157 def test_update_router_set_gateway_with_snat_explicit(self):
Masayuki Igawa259c1132013-10-31 17:48:44 +0900158 router = self.create_router(data_utils.rand_name('router-'))
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700159 self.admin_client.update_router_with_snat_gw_info(
160 router['id'],
161 external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +0000162 'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700163 'enable_snat': True})
164 self._verify_router_gateway(
165 router['id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +0000166 {'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700167 'enable_snat': True})
168 self._verify_gateway_port(router['id'])
169
ronak79f17932014-01-27 17:56:21 -0800170 @test.requires_ext(extension='ext-gw-mode', service='network')
armando-migliaccio89e5b962013-12-16 06:12:16 -0800171 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700172 def test_update_router_set_gateway_without_snat(self):
Masayuki Igawa259c1132013-10-31 17:48:44 +0900173 router = self.create_router(data_utils.rand_name('router-'))
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700174 self.admin_client.update_router_with_snat_gw_info(
175 router['id'],
176 external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +0000177 'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700178 'enable_snat': False})
179 self._verify_router_gateway(
180 router['id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +0000181 {'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700182 'enable_snat': False})
183 self._verify_gateway_port(router['id'])
184
armando-migliaccio89e5b962013-12-16 06:12:16 -0800185 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700186 def test_update_router_unset_gateway(self):
187 router = self.create_router(
Masayuki Igawa259c1132013-10-31 17:48:44 +0900188 data_utils.rand_name('router-'),
Matthew Treinish03b48df2014-01-29 16:59:49 +0000189 external_network_id=CONF.network.public_network_id)
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700190 self.client.update_router(router['id'], external_gateway_info={})
191 self._verify_router_gateway(router['id'])
192 # No gateway port expected
193 resp, list_body = self.admin_client.list_ports(
Matthew Treinish03b48df2014-01-29 16:59:49 +0000194 network_id=CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700195 device_id=router['id'])
196 self.assertFalse(list_body['ports'])
197
ronak79f17932014-01-27 17:56:21 -0800198 @test.requires_ext(extension='ext-gw-mode', service='network')
armando-migliaccio89e5b962013-12-16 06:12:16 -0800199 @test.attr(type='smoke')
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700200 def test_update_router_reset_gateway_without_snat(self):
201 router = self.create_router(
Masayuki Igawa259c1132013-10-31 17:48:44 +0900202 data_utils.rand_name('router-'),
Matthew Treinish03b48df2014-01-29 16:59:49 +0000203 external_network_id=CONF.network.public_network_id)
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700204 self.admin_client.update_router_with_snat_gw_info(
205 router['id'],
206 external_gateway_info={
Matthew Treinish03b48df2014-01-29 16:59:49 +0000207 'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700208 'enable_snat': False})
209 self._verify_router_gateway(
210 router['id'],
Matthew Treinish03b48df2014-01-29 16:59:49 +0000211 {'network_id': CONF.network.public_network_id,
Salvatore Orlandoce22b492013-09-20 04:04:11 -0700212 'enable_snat': False})
213 self._verify_gateway_port(router['id'])
ChenZheng04ac6942013-12-09 16:42:52 +0800214
armando-migliaccio89e5b962013-12-16 06:12:16 -0800215 @test.requires_ext(extension='extraroute', service='network')
216 @test.attr(type='smoke')
ChenZheng04ac6942013-12-09 16:42:52 +0800217 def test_update_extra_route(self):
218 self.network = self.create_network()
219 self.name = self.network['name']
220 self.subnet = self.create_subnet(self.network)
221 # Add router interface with subnet id
222 self.router = self.create_router(data_utils.rand_name('router-'), True)
223 self.create_router_interface(self.router['id'], self.subnet['id'])
224 self.addCleanup(
225 self._delete_extra_routes,
226 self.router['id'])
227 # Update router extra route
228 cidr = netaddr.IPNetwork(self.subnet['cidr'])
229 resp, extra_route = self.client.update_extra_routes(
230 self.router['id'], str(cidr[0]), str(self.subnet['cidr']))
231
232 def _delete_extra_routes(self, router_id):
233 resp, _ = self.client.delete_extra_routes(router_id)