blob: a7355f33891f580535c7b4ff068fe94198bbdd0f [file] [log] [blame]
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -07001# 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
16import testtools
17
18from tempest.api.network import base
Andrea Frittolie1ed6952017-09-14 06:31:52 -060019from tempest.common import identity
Andrea Frittolicd368412017-08-14 21:37:56 +010020from tempest.common import utils
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -070021from tempest import config
22from tempest.lib.common.utils import data_utils
23from tempest.lib import decorators
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -070024
25CONF = config.CONF
26
27
28class RoutersAdminTest(base.BaseAdminNetworkTest):
29 # NOTE(salv-orlando): This class inherits from BaseAdminNetworkTest
30 # as some router operations, such as enabling or disabling SNAT
31 # require admin credentials by default
32
33 def _cleanup_router(self, router):
34 self.delete_router(router)
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -070035
36 def _create_router(self, name=None, admin_state_up=False,
37 external_network_id=None, enable_snat=None):
38 # associate a cleanup with created routers to avoid quota limits
39 router = self.create_router(name, admin_state_up,
40 external_network_id, enable_snat)
41 self.addCleanup(self._cleanup_router, router)
42 return router
43
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -070044 @classmethod
45 def skip_checks(cls):
46 super(RoutersAdminTest, cls).skip_checks()
Andrea Frittolicd368412017-08-14 21:37:56 +010047 if not utils.is_extension_enabled('router', 'network'):
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -070048 msg = "router extension not enabled."
49 raise cls.skipException(msg)
50
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -070051 @decorators.idempotent_id('e54dd3a3-4352-4921-b09d-44369ae17397')
52 def test_create_router_setting_project_id(self):
53 # Test creating router from admin user setting project_id.
54 project = data_utils.rand_name('test_tenant_')
55 description = data_utils.rand_name('desc_')
Andrea Frittolie1ed6952017-09-14 06:31:52 -060056 project = identity.identity_utils(self.os_admin).create_project(
57 name=project, description=description)
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -070058 project_id = project['id']
Andrea Frittolie1ed6952017-09-14 06:31:52 -060059 self.addCleanup(identity.identity_utils(self.os_admin).delete_project,
60 project_id)
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -070061
62 name = data_utils.rand_name('router-')
63 create_body = self.admin_routers_client.create_router(
64 name=name, tenant_id=project_id)
65 self.addCleanup(self.admin_routers_client.delete_router,
66 create_body['router']['id'])
67 self.assertEqual(project_id, create_body['router']['tenant_id'])
68
69 @decorators.idempotent_id('847257cc-6afd-4154-b8fb-af49f5670ce8')
Andrea Frittolicd368412017-08-14 21:37:56 +010070 @utils.requires_ext(extension='ext-gw-mode', service='network')
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -070071 @testtools.skipUnless(CONF.network.public_network_id,
72 'The public_network_id option must be specified.')
73 def test_create_router_with_default_snat_value(self):
74 # Create a router with default snat rule
75 router = self._create_router(
76 external_network_id=CONF.network.public_network_id)
77 self._verify_router_gateway(
78 router['id'], {'network_id': CONF.network.public_network_id,
79 'enable_snat': True})
80
81 @decorators.idempotent_id('ea74068d-09e9-4fd7-8995-9b6a1ace920f')
Andrea Frittolicd368412017-08-14 21:37:56 +010082 @utils.requires_ext(extension='ext-gw-mode', service='network')
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -070083 @testtools.skipUnless(CONF.network.public_network_id,
84 'The public_network_id option must be specified.')
85 def test_create_router_with_snat_explicit(self):
86 name = data_utils.rand_name('snat-router')
87 # Create a router enabling snat attributes
88 enable_snat_states = [False, True]
89 for enable_snat in enable_snat_states:
90 external_gateway_info = {
91 'network_id': CONF.network.public_network_id,
92 'enable_snat': enable_snat}
93 create_body = self.admin_routers_client.create_router(
94 name=name, external_gateway_info=external_gateway_info)
95 self.addCleanup(self.admin_routers_client.delete_router,
96 create_body['router']['id'])
97 # Verify snat attributes after router creation
98 self._verify_router_gateway(create_body['router']['id'],
99 exp_ext_gw_info=external_gateway_info)
100
101 def _verify_router_gateway(self, router_id, exp_ext_gw_info=None):
102 show_body = self.admin_routers_client.show_router(router_id)
103 actual_ext_gw_info = show_body['router']['external_gateway_info']
104 if exp_ext_gw_info is None:
105 self.assertIsNone(actual_ext_gw_info)
106 return
107 # Verify only keys passed in exp_ext_gw_info
108 for k, v in exp_ext_gw_info.items():
109 self.assertEqual(v, actual_ext_gw_info[k])
110
111 def _verify_gateway_port(self, router_id):
112 list_body = self.admin_ports_client.list_ports(
113 network_id=CONF.network.public_network_id,
114 device_id=router_id)
115 self.assertEqual(len(list_body['ports']), 1)
116 gw_port = list_body['ports'][0]
117 fixed_ips = gw_port['fixed_ips']
Ferenc Horváth268ccce2017-06-08 12:39:02 +0200118 self.assertNotEmpty(fixed_ips)
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -0700119 # Assert that all of the IPs from the router gateway port
120 # are allocated from a valid public subnet.
121 public_net_body = self.admin_networks_client.show_network(
122 CONF.network.public_network_id)
123 public_subnet_ids = public_net_body['network']['subnets']
124 for fixed_ip in fixed_ips:
125 subnet_id = fixed_ip['subnet_id']
126 self.assertIn(subnet_id, public_subnet_ids)
127
128 @decorators.idempotent_id('6cc285d8-46bf-4f36-9b1a-783e3008ba79')
129 @testtools.skipUnless(CONF.network.public_network_id,
130 'The public_network_id option must be specified.')
131 def test_update_router_set_gateway(self):
132 router = self._create_router()
133 self.routers_client.update_router(
134 router['id'],
135 external_gateway_info={
136 'network_id': CONF.network.public_network_id})
137 # Verify operation - router
138 self._verify_router_gateway(
139 router['id'],
140 {'network_id': CONF.network.public_network_id})
141 self._verify_gateway_port(router['id'])
142
143 @decorators.idempotent_id('b386c111-3b21-466d-880c-5e72b01e1a33')
Andrea Frittolicd368412017-08-14 21:37:56 +0100144 @utils.requires_ext(extension='ext-gw-mode', service='network')
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -0700145 @testtools.skipUnless(CONF.network.public_network_id,
146 'The public_network_id option must be specified.')
147 def test_update_router_set_gateway_with_snat_explicit(self):
148 router = self._create_router()
149 self.admin_routers_client.update_router(
150 router['id'],
151 external_gateway_info={
152 'network_id': CONF.network.public_network_id,
153 'enable_snat': True})
154 self._verify_router_gateway(
155 router['id'],
156 {'network_id': CONF.network.public_network_id,
157 'enable_snat': True})
158 self._verify_gateway_port(router['id'])
159
160 @decorators.idempotent_id('96536bc7-8262-4fb2-9967-5c46940fa279')
Andrea Frittolicd368412017-08-14 21:37:56 +0100161 @utils.requires_ext(extension='ext-gw-mode', service='network')
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -0700162 @testtools.skipUnless(CONF.network.public_network_id,
163 'The public_network_id option must be specified.')
164 def test_update_router_set_gateway_without_snat(self):
165 router = self._create_router()
166 self.admin_routers_client.update_router(
167 router['id'],
168 external_gateway_info={
169 'network_id': CONF.network.public_network_id,
170 'enable_snat': False})
171 self._verify_router_gateway(
172 router['id'],
173 {'network_id': CONF.network.public_network_id,
174 'enable_snat': False})
175 self._verify_gateway_port(router['id'])
176
177 @decorators.idempotent_id('ad81b7ee-4f81-407b-a19c-17e623f763e8')
178 @testtools.skipUnless(CONF.network.public_network_id,
179 'The public_network_id option must be specified.')
180 def test_update_router_unset_gateway(self):
181 router = self._create_router(
182 external_network_id=CONF.network.public_network_id)
183 self.routers_client.update_router(router['id'],
184 external_gateway_info={})
185 self._verify_router_gateway(router['id'])
186 # No gateway port expected
187 list_body = self.admin_ports_client.list_ports(
188 network_id=CONF.network.public_network_id,
189 device_id=router['id'])
190 self.assertFalse(list_body['ports'])
191
192 @decorators.idempotent_id('f2faf994-97f4-410b-a831-9bc977b64374')
Andrea Frittolicd368412017-08-14 21:37:56 +0100193 @utils.requires_ext(extension='ext-gw-mode', service='network')
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -0700194 @testtools.skipUnless(CONF.network.public_network_id,
195 'The public_network_id option must be specified.')
196 def test_update_router_reset_gateway_without_snat(self):
197 router = self._create_router(
198 external_network_id=CONF.network.public_network_id)
199 self.admin_routers_client.update_router(
200 router['id'],
201 external_gateway_info={
202 'network_id': CONF.network.public_network_id,
203 'enable_snat': False})
204 self._verify_router_gateway(
205 router['id'],
206 {'network_id': CONF.network.public_network_id,
207 'enable_snat': False})
208 self._verify_gateway_port(router['id'])
209
210
211class RoutersIpV6AdminTest(RoutersAdminTest):
212 _ip_version = 6