blob: 8cdb41e06d3b88bb488bf5bc6ed2d04d0eb7dc8e [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)
35 self.routers.remove(router)
36
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)
42 self.addCleanup(self._cleanup_router, router)
43 return router
44
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -070045 @classmethod
46 def skip_checks(cls):
47 super(RoutersAdminTest, cls).skip_checks()
Andrea Frittolicd368412017-08-14 21:37:56 +010048 if not utils.is_extension_enabled('router', 'network'):
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -070049 msg = "router extension not enabled."
50 raise cls.skipException(msg)
51
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -070052 @decorators.idempotent_id('e54dd3a3-4352-4921-b09d-44369ae17397')
53 def test_create_router_setting_project_id(self):
54 # Test creating router from admin user setting project_id.
55 project = data_utils.rand_name('test_tenant_')
56 description = data_utils.rand_name('desc_')
Andrea Frittolie1ed6952017-09-14 06:31:52 -060057 project = identity.identity_utils(self.os_admin).create_project(
58 name=project, description=description)
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -070059 project_id = project['id']
Andrea Frittolie1ed6952017-09-14 06:31:52 -060060 self.addCleanup(identity.identity_utils(self.os_admin).delete_project,
61 project_id)
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -070062
63 name = data_utils.rand_name('router-')
64 create_body = self.admin_routers_client.create_router(
65 name=name, tenant_id=project_id)
66 self.addCleanup(self.admin_routers_client.delete_router,
67 create_body['router']['id'])
68 self.assertEqual(project_id, create_body['router']['tenant_id'])
69
70 @decorators.idempotent_id('847257cc-6afd-4154-b8fb-af49f5670ce8')
Andrea Frittolicd368412017-08-14 21:37:56 +010071 @utils.requires_ext(extension='ext-gw-mode', service='network')
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -070072 @testtools.skipUnless(CONF.network.public_network_id,
73 'The public_network_id option must be specified.')
74 def test_create_router_with_default_snat_value(self):
75 # Create a router with default snat rule
76 router = self._create_router(
77 external_network_id=CONF.network.public_network_id)
78 self._verify_router_gateway(
79 router['id'], {'network_id': CONF.network.public_network_id,
80 'enable_snat': True})
81
82 @decorators.idempotent_id('ea74068d-09e9-4fd7-8995-9b6a1ace920f')
Andrea Frittolicd368412017-08-14 21:37:56 +010083 @utils.requires_ext(extension='ext-gw-mode', service='network')
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -070084 @testtools.skipUnless(CONF.network.public_network_id,
85 'The public_network_id option must be specified.')
86 def test_create_router_with_snat_explicit(self):
87 name = data_utils.rand_name('snat-router')
88 # Create a router enabling snat attributes
89 enable_snat_states = [False, True]
90 for enable_snat in enable_snat_states:
91 external_gateway_info = {
92 'network_id': CONF.network.public_network_id,
93 'enable_snat': enable_snat}
94 create_body = self.admin_routers_client.create_router(
95 name=name, external_gateway_info=external_gateway_info)
96 self.addCleanup(self.admin_routers_client.delete_router,
97 create_body['router']['id'])
98 # Verify snat attributes after router creation
99 self._verify_router_gateway(create_body['router']['id'],
100 exp_ext_gw_info=external_gateway_info)
101
102 def _verify_router_gateway(self, router_id, exp_ext_gw_info=None):
103 show_body = self.admin_routers_client.show_router(router_id)
104 actual_ext_gw_info = show_body['router']['external_gateway_info']
105 if exp_ext_gw_info is None:
106 self.assertIsNone(actual_ext_gw_info)
107 return
108 # Verify only keys passed in exp_ext_gw_info
109 for k, v in exp_ext_gw_info.items():
110 self.assertEqual(v, actual_ext_gw_info[k])
111
112 def _verify_gateway_port(self, router_id):
113 list_body = self.admin_ports_client.list_ports(
114 network_id=CONF.network.public_network_id,
115 device_id=router_id)
116 self.assertEqual(len(list_body['ports']), 1)
117 gw_port = list_body['ports'][0]
118 fixed_ips = gw_port['fixed_ips']
Ferenc Horváth268ccce2017-06-08 12:39:02 +0200119 self.assertNotEmpty(fixed_ips)
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -0700120 # Assert that all of the IPs from the router gateway port
121 # are allocated from a valid public subnet.
122 public_net_body = self.admin_networks_client.show_network(
123 CONF.network.public_network_id)
124 public_subnet_ids = public_net_body['network']['subnets']
125 for fixed_ip in fixed_ips:
126 subnet_id = fixed_ip['subnet_id']
127 self.assertIn(subnet_id, public_subnet_ids)
128
129 @decorators.idempotent_id('6cc285d8-46bf-4f36-9b1a-783e3008ba79')
130 @testtools.skipUnless(CONF.network.public_network_id,
131 'The public_network_id option must be specified.')
132 def test_update_router_set_gateway(self):
133 router = self._create_router()
134 self.routers_client.update_router(
135 router['id'],
136 external_gateway_info={
137 'network_id': CONF.network.public_network_id})
138 # Verify operation - router
139 self._verify_router_gateway(
140 router['id'],
141 {'network_id': CONF.network.public_network_id})
142 self._verify_gateway_port(router['id'])
143
144 @decorators.idempotent_id('b386c111-3b21-466d-880c-5e72b01e1a33')
Andrea Frittolicd368412017-08-14 21:37:56 +0100145 @utils.requires_ext(extension='ext-gw-mode', service='network')
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -0700146 @testtools.skipUnless(CONF.network.public_network_id,
147 'The public_network_id option must be specified.')
148 def test_update_router_set_gateway_with_snat_explicit(self):
149 router = self._create_router()
150 self.admin_routers_client.update_router(
151 router['id'],
152 external_gateway_info={
153 'network_id': CONF.network.public_network_id,
154 'enable_snat': True})
155 self._verify_router_gateway(
156 router['id'],
157 {'network_id': CONF.network.public_network_id,
158 'enable_snat': True})
159 self._verify_gateway_port(router['id'])
160
161 @decorators.idempotent_id('96536bc7-8262-4fb2-9967-5c46940fa279')
Andrea Frittolicd368412017-08-14 21:37:56 +0100162 @utils.requires_ext(extension='ext-gw-mode', service='network')
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -0700163 @testtools.skipUnless(CONF.network.public_network_id,
164 'The public_network_id option must be specified.')
165 def test_update_router_set_gateway_without_snat(self):
166 router = self._create_router()
167 self.admin_routers_client.update_router(
168 router['id'],
169 external_gateway_info={
170 'network_id': CONF.network.public_network_id,
171 'enable_snat': False})
172 self._verify_router_gateway(
173 router['id'],
174 {'network_id': CONF.network.public_network_id,
175 'enable_snat': False})
176 self._verify_gateway_port(router['id'])
177
178 @decorators.idempotent_id('ad81b7ee-4f81-407b-a19c-17e623f763e8')
179 @testtools.skipUnless(CONF.network.public_network_id,
180 'The public_network_id option must be specified.')
181 def test_update_router_unset_gateway(self):
182 router = self._create_router(
183 external_network_id=CONF.network.public_network_id)
184 self.routers_client.update_router(router['id'],
185 external_gateway_info={})
186 self._verify_router_gateway(router['id'])
187 # No gateway port expected
188 list_body = self.admin_ports_client.list_ports(
189 network_id=CONF.network.public_network_id,
190 device_id=router['id'])
191 self.assertFalse(list_body['ports'])
192
193 @decorators.idempotent_id('f2faf994-97f4-410b-a831-9bc977b64374')
Andrea Frittolicd368412017-08-14 21:37:56 +0100194 @utils.requires_ext(extension='ext-gw-mode', service='network')
Ken'ichi Ohmichi3204a0e2017-05-04 18:44:28 -0700195 @testtools.skipUnless(CONF.network.public_network_id,
196 'The public_network_id option must be specified.')
197 def test_update_router_reset_gateway_without_snat(self):
198 router = self._create_router(
199 external_network_id=CONF.network.public_network_id)
200 self.admin_routers_client.update_router(
201 router['id'],
202 external_gateway_info={
203 'network_id': CONF.network.public_network_id,
204 'enable_snat': False})
205 self._verify_router_gateway(
206 router['id'],
207 {'network_id': CONF.network.public_network_id,
208 'enable_snat': False})
209 self._verify_gateway_port(router['id'])
210
211
212class RoutersIpV6AdminTest(RoutersAdminTest):
213 _ip_version = 6