blob: a4a057c89513fc7b3c7af761b466b1c791274816 [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
Slawek Kaplonski748dd8d2019-04-16 23:38:35 +020023from tempest.lib.common.utils import test_utils
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -070024from tempest.lib import decorators
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -070025
26CONF = config.CONF
27
28
29class RoutersAdminTest(base.BaseAdminNetworkTest):
30 # NOTE(salv-orlando): This class inherits from BaseAdminNetworkTest
31 # as some router operations, such as enabling or disabling SNAT
32 # require admin credentials by default
33
34 def _cleanup_router(self, router):
35 self.delete_router(router)
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -070036
37 def _create_router(self, name=None, admin_state_up=False,
38 external_network_id=None, enable_snat=None):
39 # associate a cleanup with created routers to avoid quota limits
40 router = self.create_router(name, admin_state_up,
41 external_network_id, enable_snat)
Slawek Kaplonski748dd8d2019-04-16 23:38:35 +020042 self.addCleanup(test_utils.call_and_ignore_notfound_exc,
43 self._cleanup_router, router)
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -070044 return router
45
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -070046 @classmethod
47 def skip_checks(cls):
48 super(RoutersAdminTest, cls).skip_checks()
Andrea Frittolicd368412017-08-14 21:37:56 +010049 if not utils.is_extension_enabled('router', 'network'):
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -070050 msg = "router extension not enabled."
51 raise cls.skipException(msg)
52
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -070053 @decorators.idempotent_id('e54dd3a3-4352-4921-b09d-44369ae17397')
54 def test_create_router_setting_project_id(self):
55 # Test creating router from admin user setting project_id.
56 project = data_utils.rand_name('test_tenant_')
57 description = data_utils.rand_name('desc_')
Andrea Frittolie1ed6952017-09-14 06:31:52 -060058 project = identity.identity_utils(self.os_admin).create_project(
59 name=project, description=description)
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -070060 project_id = project['id']
Andrea Frittolie1ed6952017-09-14 06:31:52 -060061 self.addCleanup(identity.identity_utils(self.os_admin).delete_project,
62 project_id)
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -070063
64 name = data_utils.rand_name('router-')
65 create_body = self.admin_routers_client.create_router(
66 name=name, tenant_id=project_id)
Slawek Kaplonski748dd8d2019-04-16 23:38:35 +020067 self.addCleanup(test_utils.call_and_ignore_notfound_exc,
68 self.admin_routers_client.delete_router,
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -070069 create_body['router']['id'])
70 self.assertEqual(project_id, create_body['router']['tenant_id'])
71
72 @decorators.idempotent_id('847257cc-6afd-4154-b8fb-af49f5670ce8')
Andrea Frittolicd368412017-08-14 21:37:56 +010073 @utils.requires_ext(extension='ext-gw-mode', service='network')
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -070074 @testtools.skipUnless(CONF.network.public_network_id,
75 'The public_network_id option must be specified.')
76 def test_create_router_with_default_snat_value(self):
77 # Create a router with default snat rule
78 router = self._create_router(
79 external_network_id=CONF.network.public_network_id)
80 self._verify_router_gateway(
81 router['id'], {'network_id': CONF.network.public_network_id,
82 'enable_snat': True})
83
84 @decorators.idempotent_id('ea74068d-09e9-4fd7-8995-9b6a1ace920f')
Andrea Frittolicd368412017-08-14 21:37:56 +010085 @utils.requires_ext(extension='ext-gw-mode', service='network')
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -070086 @testtools.skipUnless(CONF.network.public_network_id,
87 'The public_network_id option must be specified.')
88 def test_create_router_with_snat_explicit(self):
89 name = data_utils.rand_name('snat-router')
90 # Create a router enabling snat attributes
91 enable_snat_states = [False, True]
92 for enable_snat in enable_snat_states:
93 external_gateway_info = {
94 'network_id': CONF.network.public_network_id,
95 'enable_snat': enable_snat}
96 create_body = self.admin_routers_client.create_router(
97 name=name, external_gateway_info=external_gateway_info)
Slawek Kaplonski748dd8d2019-04-16 23:38:35 +020098 self.addCleanup(test_utils.call_and_ignore_notfound_exc,
99 self.admin_routers_client.delete_router,
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -0700100 create_body['router']['id'])
101 # Verify snat attributes after router creation
102 self._verify_router_gateway(create_body['router']['id'],
103 exp_ext_gw_info=external_gateway_info)
104
105 def _verify_router_gateway(self, router_id, exp_ext_gw_info=None):
106 show_body = self.admin_routers_client.show_router(router_id)
107 actual_ext_gw_info = show_body['router']['external_gateway_info']
108 if exp_ext_gw_info is None:
109 self.assertIsNone(actual_ext_gw_info)
110 return
111 # Verify only keys passed in exp_ext_gw_info
112 for k, v in exp_ext_gw_info.items():
113 self.assertEqual(v, actual_ext_gw_info[k])
114
115 def _verify_gateway_port(self, router_id):
116 list_body = self.admin_ports_client.list_ports(
117 network_id=CONF.network.public_network_id,
Kamil Mankowskie973da92018-12-07 11:01:51 +0100118 device_id=router_id,
119 device_owner="network:router_gateway")
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -0700120 self.assertEqual(len(list_body['ports']), 1)
121 gw_port = list_body['ports'][0]
122 fixed_ips = gw_port['fixed_ips']
Ferenc Horváth268ccce2017-06-08 12:39:02 +0200123 self.assertNotEmpty(fixed_ips)
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -0700124 # Assert that all of the IPs from the router gateway port
125 # are allocated from a valid public subnet.
126 public_net_body = self.admin_networks_client.show_network(
127 CONF.network.public_network_id)
128 public_subnet_ids = public_net_body['network']['subnets']
129 for fixed_ip in fixed_ips:
130 subnet_id = fixed_ip['subnet_id']
131 self.assertIn(subnet_id, public_subnet_ids)
132
133 @decorators.idempotent_id('6cc285d8-46bf-4f36-9b1a-783e3008ba79')
134 @testtools.skipUnless(CONF.network.public_network_id,
135 'The public_network_id option must be specified.')
136 def test_update_router_set_gateway(self):
137 router = self._create_router()
138 self.routers_client.update_router(
139 router['id'],
140 external_gateway_info={
141 'network_id': CONF.network.public_network_id})
142 # Verify operation - router
143 self._verify_router_gateway(
144 router['id'],
145 {'network_id': CONF.network.public_network_id})
146 self._verify_gateway_port(router['id'])
147
148 @decorators.idempotent_id('b386c111-3b21-466d-880c-5e72b01e1a33')
Andrea Frittolicd368412017-08-14 21:37:56 +0100149 @utils.requires_ext(extension='ext-gw-mode', service='network')
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -0700150 @testtools.skipUnless(CONF.network.public_network_id,
151 'The public_network_id option must be specified.')
152 def test_update_router_set_gateway_with_snat_explicit(self):
153 router = self._create_router()
154 self.admin_routers_client.update_router(
155 router['id'],
156 external_gateway_info={
157 'network_id': CONF.network.public_network_id,
158 'enable_snat': True})
159 self._verify_router_gateway(
160 router['id'],
161 {'network_id': CONF.network.public_network_id,
162 'enable_snat': True})
163 self._verify_gateway_port(router['id'])
164
165 @decorators.idempotent_id('96536bc7-8262-4fb2-9967-5c46940fa279')
Andrea Frittolicd368412017-08-14 21:37:56 +0100166 @utils.requires_ext(extension='ext-gw-mode', service='network')
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -0700167 @testtools.skipUnless(CONF.network.public_network_id,
168 'The public_network_id option must be specified.')
169 def test_update_router_set_gateway_without_snat(self):
170 router = self._create_router()
171 self.admin_routers_client.update_router(
172 router['id'],
173 external_gateway_info={
174 'network_id': CONF.network.public_network_id,
175 'enable_snat': False})
176 self._verify_router_gateway(
177 router['id'],
178 {'network_id': CONF.network.public_network_id,
179 'enable_snat': False})
180 self._verify_gateway_port(router['id'])
181
182 @decorators.idempotent_id('ad81b7ee-4f81-407b-a19c-17e623f763e8')
183 @testtools.skipUnless(CONF.network.public_network_id,
184 'The public_network_id option must be specified.')
185 def test_update_router_unset_gateway(self):
186 router = self._create_router(
187 external_network_id=CONF.network.public_network_id)
188 self.routers_client.update_router(router['id'],
189 external_gateway_info={})
190 self._verify_router_gateway(router['id'])
191 # No gateway port expected
192 list_body = self.admin_ports_client.list_ports(
193 network_id=CONF.network.public_network_id,
194 device_id=router['id'])
195 self.assertFalse(list_body['ports'])
196
197 @decorators.idempotent_id('f2faf994-97f4-410b-a831-9bc977b64374')
Andrea Frittolicd368412017-08-14 21:37:56 +0100198 @utils.requires_ext(extension='ext-gw-mode', service='network')
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -0700199 @testtools.skipUnless(CONF.network.public_network_id,
200 'The public_network_id option must be specified.')
201 def test_update_router_reset_gateway_without_snat(self):
202 router = self._create_router(
203 external_network_id=CONF.network.public_network_id)
204 self.admin_routers_client.update_router(
205 router['id'],
206 external_gateway_info={
207 'network_id': CONF.network.public_network_id,
208 'enable_snat': False})
209 self._verify_router_gateway(
210 router['id'],
211 {'network_id': CONF.network.public_network_id,
212 'enable_snat': False})
213 self._verify_gateway_port(router['id'])
214
215
216class RoutersIpV6AdminTest(RoutersAdminTest):
217 _ip_version = 6