blob: a85a0374b15824a33c66c4e8a9073890af49b26f [file] [log] [blame]
Daniel Mellado3c0aeab2016-01-29 11:30:25 +00001# Copyright 2015 Red Hat, Inc.
2#
3# Licensed under the Apache License, Version 2.0 (the "License"); you may
4# not use this file except in compliance with the License. You may obtain
5# a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12# License for the specific language governing permissions and limitations
13# under the License.
14
Chandan Kumarc125fd12017-11-15 19:41:01 +053015from neutron_lib.api.definitions import qos as qos_apidef
nfridman23b44ad2019-09-05 09:46:50 -040016from neutron_lib import constants as n_constants
Chandan Kumarc125fd12017-11-15 19:41:01 +053017from neutron_lib.services.qos import constants as qos_consts
18from tempest.common import utils
Daniel Mellado3c0aeab2016-01-29 11:30:25 +000019from tempest.lib.common.utils import data_utils
zahlabut7ebb66e2021-09-01 22:39:49 +030020from tempest.lib.common.utils import test_utils
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +000021from tempest.lib import decorators
Daniel Mellado3c0aeab2016-01-29 11:30:25 +000022from tempest.lib import exceptions
Daniel Mellado3c0aeab2016-01-29 11:30:25 +000023
Sławek Kapłoński153f3452017-03-24 22:04:53 +000024import testscenarios
Daniel Mellado3c0aeab2016-01-29 11:30:25 +000025import testtools
26
Chandan Kumar667d3d32017-09-22 12:24:06 +053027from neutron_tempest_plugin.api import base
nfridman07f0e782019-11-04 09:12:58 -050028from neutron_tempest_plugin import config
Daniel Mellado3c0aeab2016-01-29 11:30:25 +000029
Sławek Kapłoński153f3452017-03-24 22:04:53 +000030load_tests = testscenarios.load_tests_apply_scenarios
nfridman07f0e782019-11-04 09:12:58 -050031CONF = config.CONF
Sławek Kapłoński153f3452017-03-24 22:04:53 +000032
33
Daniel Mellado3c0aeab2016-01-29 11:30:25 +000034class QosTestJSON(base.BaseAdminNetworkTest):
Jakub Libosvar1982aa12017-05-30 11:15:33 +000035
Chandan Kumarc125fd12017-11-15 19:41:01 +053036 required_extensions = [qos_apidef.ALIAS]
Daniel Mellado3c0aeab2016-01-29 11:30:25 +000037
zahlabut7ebb66e2021-09-01 22:39:49 +030038 @classmethod
39 def setup_clients(cls):
40 super(QosTestJSON, cls).setup_clients()
41 cls.qos_bw_limit_rule_client = \
42 cls.os_admin.qos_limit_bandwidth_rules_client
43
Sławek Kapłoński7aa3a352017-06-19 06:35:25 +000044 @staticmethod
45 def _get_driver_details(rule_type_details, driver_name):
46 for driver in rule_type_details['drivers']:
47 if driver['name'] == driver_name:
48 return driver
49
zahlabut7ebb66e2021-09-01 22:39:49 +030050 def _create_qos_bw_limit_rule(self, policy_id, rule_data):
51 rule = self.qos_bw_limit_rule_client.create_limit_bandwidth_rule(
52 qos_policy_id=policy_id,
53 **rule_data)['bandwidth_limit_rule']
54 self.addCleanup(
55 test_utils.call_and_ignore_notfound_exc,
56 self.qos_bw_limit_rule_client.delete_limit_bandwidth_rule,
57 policy_id, rule['id'])
58 return rule
59
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +000060 @decorators.idempotent_id('108fbdf7-3463-4e47-9871-d07f3dcf5bbb')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +000061 def test_create_policy(self):
62 policy = self.create_qos_policy(name='test-policy',
63 description='test policy desc1',
64 shared=False)
65
66 # Test 'show policy'
67 retrieved_policy = self.admin_client.show_qos_policy(policy['id'])
68 retrieved_policy = retrieved_policy['policy']
69 self.assertEqual('test-policy', retrieved_policy['name'])
70 self.assertEqual('test policy desc1', retrieved_policy['description'])
71 self.assertFalse(retrieved_policy['shared'])
72
73 # Test 'list policies'
74 policies = self.admin_client.list_qos_policies()['policies']
75 policies_ids = [p['id'] for p in policies]
76 self.assertIn(policy['id'], policies_ids)
77
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +000078 @decorators.idempotent_id('606a48e2-5403-4052-b40f-4d54b855af76')
Chandan Kumarc125fd12017-11-15 19:41:01 +053079 @utils.requires_ext(extension="project-id", service="network")
Henry Gessaufa6c78d2016-10-09 19:56:09 -040080 def test_show_policy_has_project_id(self):
81 policy = self.create_qos_policy(name='test-policy', shared=False)
82 body = self.admin_client.show_qos_policy(policy['id'])
83 show_policy = body['policy']
84 self.assertIn('project_id', show_policy)
Henry Gessaufa6c78d2016-10-09 19:56:09 -040085 self.assertEqual(self.admin_client.tenant_id,
86 show_policy['project_id'])
Henry Gessaufa6c78d2016-10-09 19:56:09 -040087
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +000088 @decorators.idempotent_id('f8d20e92-f06d-4805-b54f-230f77715815')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +000089 def test_list_policy_filter_by_name(self):
yatinkarel65fa2c02022-01-28 13:44:19 +053090 policy1 = 'test' + data_utils.rand_name("policy")
91 policy2 = 'test' + data_utils.rand_name("policy")
92 self.create_qos_policy(name=policy1, description='test policy',
Daniel Mellado3c0aeab2016-01-29 11:30:25 +000093 shared=False)
yatinkarel65fa2c02022-01-28 13:44:19 +053094 self.create_qos_policy(name=policy2, description='test policy',
Daniel Mellado3c0aeab2016-01-29 11:30:25 +000095 shared=False)
96
97 policies = (self.admin_client.
yatinkarel65fa2c02022-01-28 13:44:19 +053098 list_qos_policies(name=policy1)['policies'])
Daniel Mellado3c0aeab2016-01-29 11:30:25 +000099 self.assertEqual(1, len(policies))
100
101 retrieved_policy = policies[0]
yatinkarel65fa2c02022-01-28 13:44:19 +0530102 self.assertEqual(policy1, retrieved_policy['name'])
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000103
likangkang01afd73f72020-06-01 16:53:59 +0800104 @decorators.idempotent_id('dde0b449-a400-4a87-b5a5-4d1c413c917b')
105 def test_list_policy_sort_by_name(self):
106 policyA = 'A' + data_utils.rand_name("policy")
107 policyB = 'B' + data_utils.rand_name("policy")
108 self.create_qos_policy(name=policyA, description='test policy',
109 shared=False)
110 self.create_qos_policy(name=policyB, description='test policy',
111 shared=False)
112
113 param = {
114 'sort_key': 'name',
115 'sort_dir': 'asc'
116 }
117 policies = (self.admin_client.list_qos_policies(**param)['policies'])
118 policy_names = [p['name'] for p in policies]
119 self.assertLess(policy_names.index(policyA),
120 policy_names.index(policyB))
121
122 param = {
123 'sort_key': 'name',
124 'sort_dir': 'desc'
125 }
126 policies = (self.admin_client.list_qos_policies(**param)['policies'])
127 policy_names = [p['name'] for p in policies]
128 self.assertLess(policy_names.index(policyB),
129 policy_names.index(policyA))
130
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000131 @decorators.idempotent_id('8e88a54b-f0b2-4b7d-b061-a15d93c2c7d6')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000132 def test_policy_update(self):
133 policy = self.create_qos_policy(name='test-policy',
134 description='',
Rodolfo Alonso Hernandez1e9d1fe2017-02-01 15:15:16 +0000135 shared=False,
Rodolfo Alonso Hernandeze2d062f2020-01-14 17:11:42 +0000136 project_id=self.admin_client.tenant_id)
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000137 self.admin_client.update_qos_policy(policy['id'],
138 description='test policy desc2',
139 shared=True)
140
141 retrieved_policy = self.admin_client.show_qos_policy(policy['id'])
142 retrieved_policy = retrieved_policy['policy']
143 self.assertEqual('test policy desc2', retrieved_policy['description'])
144 self.assertTrue(retrieved_policy['shared'])
145 self.assertEqual([], retrieved_policy['rules'])
146
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000147 @decorators.idempotent_id('6e880e0f-bbfc-4e54-87c6-680f90e1b618')
Sławek Kapłoński0acecc62016-08-20 21:00:51 +0000148 def test_policy_update_forbidden_for_regular_tenants_own_policy(self):
149 policy = self.create_qos_policy(name='test-policy',
150 description='',
151 shared=False,
Rodolfo Alonso Hernandeze2d062f2020-01-14 17:11:42 +0000152 project_id=self.client.tenant_id)
Sławek Kapłoński0acecc62016-08-20 21:00:51 +0000153 self.assertRaises(
154 exceptions.Forbidden,
155 self.client.update_qos_policy,
156 policy['id'], description='test policy')
157
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000158 @decorators.idempotent_id('4ecfd7e7-47b6-4702-be38-be9235901a87')
Sławek Kapłoński0acecc62016-08-20 21:00:51 +0000159 def test_policy_update_forbidden_for_regular_tenants_foreign_policy(self):
160 policy = self.create_qos_policy(name='test-policy',
161 description='',
162 shared=False,
Rodolfo Alonso Hernandeze2d062f2020-01-14 17:11:42 +0000163 project_id=self.admin_client.tenant_id)
Sławek Kapłoński0acecc62016-08-20 21:00:51 +0000164 self.assertRaises(
165 exceptions.NotFound,
166 self.client.update_qos_policy,
167 policy['id'], description='test policy')
168
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000169 @decorators.idempotent_id('ee263db4-009a-4641-83e5-d0e83506ba4c')
Sławek Kapłoński6bfcc752016-06-05 09:49:27 +0000170 def test_shared_policy_update(self):
171 policy = self.create_qos_policy(name='test-policy',
172 description='',
Rodolfo Alonso Hernandez1e9d1fe2017-02-01 15:15:16 +0000173 shared=True,
Rodolfo Alonso Hernandeze2d062f2020-01-14 17:11:42 +0000174 project_id=self.admin_client.tenant_id)
Sławek Kapłoński6bfcc752016-06-05 09:49:27 +0000175
176 self.admin_client.update_qos_policy(policy['id'],
177 description='test policy desc2')
178 retrieved_policy = self.admin_client.show_qos_policy(policy['id'])
179 retrieved_policy = retrieved_policy['policy']
180 self.assertTrue(retrieved_policy['shared'])
181
182 self.admin_client.update_qos_policy(policy['id'],
183 shared=False)
184 retrieved_policy = self.admin_client.show_qos_policy(policy['id'])
185 retrieved_policy = retrieved_policy['policy']
186 self.assertFalse(retrieved_policy['shared'])
187
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000188 @decorators.idempotent_id('1cb42653-54bd-4a9a-b888-c55e18199201')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000189 def test_delete_policy(self):
190 policy = self.admin_client.create_qos_policy(
191 'test-policy', 'desc', True)['policy']
192
193 retrieved_policy = self.admin_client.show_qos_policy(policy['id'])
194 retrieved_policy = retrieved_policy['policy']
195 self.assertEqual('test-policy', retrieved_policy['name'])
196
197 self.admin_client.delete_qos_policy(policy['id'])
198 self.assertRaises(exceptions.NotFound,
199 self.admin_client.show_qos_policy, policy['id'])
200
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000201 @decorators.idempotent_id('cf776f77-8d3d-49f2-8572-12d6a1557224')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000202 def test_list_admin_rule_types(self):
203 self._test_list_rule_types(self.admin_client)
204
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000205 @decorators.idempotent_id('49c8ea35-83a9-453a-bd23-239cf3b13929')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000206 def test_list_regular_rule_types(self):
207 self._test_list_rule_types(self.client)
208
209 def _test_list_rule_types(self, client):
210 # List supported rule types
Sławek Kapłoński566ae692017-06-25 08:37:42 +0000211 # Since returned rule types depends on loaded backend drivers this test
212 # is checking only if returned keys are same as expected keys
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000213 #
214 # In theory, we could make the test conditional on which ml2 drivers
215 # are enabled in gate (or more specifically, on which supported qos
216 # rules are claimed by core plugin), but that option doesn't seem to be
karimbd4c68e72016-06-24 14:44:11 +0200217 # available through tempest.lib framework
Sławek Kapłoński566ae692017-06-25 08:37:42 +0000218 expected_rule_keys = ['type']
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000219
220 rule_types = client.list_qos_rule_types()
221 actual_list_rule_types = rule_types['rule_types']
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000222
223 # Verify that only required fields present in rule details
224 for rule in actual_list_rule_types:
Sławek Kapłoński566ae692017-06-25 08:37:42 +0000225 self.assertEqual(tuple(expected_rule_keys), tuple(rule.keys()))
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000226
Sławek Kapłoński7aa3a352017-06-19 06:35:25 +0000227 @decorators.idempotent_id('8ececa21-ef97-4904-a152-9f04c90f484d')
228 def test_show_rule_type_details_as_user(self):
229 self.assertRaises(
230 exceptions.Forbidden,
231 self.client.show_qos_rule_type,
232 qos_consts.RULE_TYPE_BANDWIDTH_LIMIT)
233
234 @decorators.idempotent_id('d0a2460b-7325-481f-a531-050bd96ab25e')
235 def test_show_rule_type_details_as_admin(self):
236 # Since returned rule types depend on loaded backend drivers this test
237 # is checking only if returned keys are same as expected keys
238
239 # In theory, we could make the test conditional on which ml2 drivers
240 # are enabled in gate, but that option doesn't seem to be
241 # available through tempest.lib framework
242 expected_rule_type_details_keys = ['type', 'drivers']
243
244 rule_type_details = self.admin_client.show_qos_rule_type(
245 qos_consts.RULE_TYPE_BANDWIDTH_LIMIT).get("rule_type")
246
247 # Verify that only required fields present in rule details
248 self.assertEqual(
249 sorted(tuple(expected_rule_type_details_keys)),
250 sorted(tuple(rule_type_details.keys())))
251
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000252 @decorators.idempotent_id('65b9ef75-1911-406a-bbdb-ca1d68d528b0')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000253 def test_policy_association_with_admin_network(self):
254 policy = self.create_qos_policy(name='test-policy',
255 description='test policy',
256 shared=False)
Federico Ressi2d7db2c2018-07-06 08:11:20 +0200257 network = self.create_network('test network', shared=True,
258 qos_policy_id=policy['id'])
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000259
260 retrieved_network = self.admin_client.show_network(network['id'])
261 self.assertEqual(
262 policy['id'], retrieved_network['network']['qos_policy_id'])
263
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000264 @decorators.idempotent_id('1738de5d-0476-4163-9022-5e1b548c208e')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000265 def test_policy_association_with_tenant_network(self):
266 policy = self.create_qos_policy(name='test-policy',
267 description='test policy',
268 shared=True)
269 network = self.create_network('test network',
270 qos_policy_id=policy['id'])
271
272 retrieved_network = self.admin_client.show_network(network['id'])
273 self.assertEqual(
274 policy['id'], retrieved_network['network']['qos_policy_id'])
275
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000276 @decorators.idempotent_id('9efe63d0-836f-4cc2-b00c-468e63aa614e')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000277 def test_policy_association_with_network_nonexistent_policy(self):
278 self.assertRaises(
279 exceptions.NotFound,
280 self.create_network,
281 'test network',
282 qos_policy_id='9efe63d0-836f-4cc2-b00c-468e63aa614e')
283
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000284 @decorators.idempotent_id('1aa55a79-324f-47d9-a076-894a8fc2448b')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000285 def test_policy_association_with_network_non_shared_policy(self):
286 policy = self.create_qos_policy(name='test-policy',
287 description='test policy',
288 shared=False)
289 self.assertRaises(
290 exceptions.NotFound,
291 self.create_network,
292 'test network', qos_policy_id=policy['id'])
293
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000294 @decorators.idempotent_id('09a9392c-1359-4cbb-989f-fb768e5834a8')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000295 def test_policy_update_association_with_admin_network(self):
296 policy = self.create_qos_policy(name='test-policy',
297 description='test policy',
298 shared=False)
Federico Ressi2d7db2c2018-07-06 08:11:20 +0200299 network = self.create_network('test network', shared=True)
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000300 retrieved_network = self.admin_client.show_network(network['id'])
301 self.assertIsNone(retrieved_network['network']['qos_policy_id'])
302
303 self.admin_client.update_network(network['id'],
304 qos_policy_id=policy['id'])
305 retrieved_network = self.admin_client.show_network(network['id'])
306 self.assertEqual(
307 policy['id'], retrieved_network['network']['qos_policy_id'])
308
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000309 @decorators.idempotent_id('98fcd95e-84cf-4746-860e-44692e674f2e')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000310 def test_policy_association_with_port_shared_policy(self):
311 policy = self.create_qos_policy(name='test-policy',
312 description='test policy',
313 shared=True)
Federico Ressi2d7db2c2018-07-06 08:11:20 +0200314 network = self.create_network('test network', shared=True)
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000315 port = self.create_port(network, qos_policy_id=policy['id'])
316
317 retrieved_port = self.admin_client.show_port(port['id'])
318 self.assertEqual(
319 policy['id'], retrieved_port['port']['qos_policy_id'])
320
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000321 @decorators.idempotent_id('49e02f5a-e1dd-41d5-9855-cfa37f2d195e')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000322 def test_policy_association_with_port_nonexistent_policy(self):
Federico Ressi2d7db2c2018-07-06 08:11:20 +0200323 network = self.create_network('test network', shared=True)
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000324 self.assertRaises(
325 exceptions.NotFound,
326 self.create_port,
327 network,
328 qos_policy_id='49e02f5a-e1dd-41d5-9855-cfa37f2d195e')
329
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000330 @decorators.idempotent_id('f53d961c-9fe5-4422-8b66-7add972c6031')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000331 def test_policy_association_with_port_non_shared_policy(self):
332 policy = self.create_qos_policy(name='test-policy',
333 description='test policy',
334 shared=False)
Federico Ressi2d7db2c2018-07-06 08:11:20 +0200335 network = self.create_network('test network', shared=True)
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000336 self.assertRaises(
337 exceptions.NotFound,
338 self.create_port,
339 network, qos_policy_id=policy['id'])
340
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000341 @decorators.idempotent_id('f8163237-fba9-4db5-9526-bad6d2343c76')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000342 def test_policy_update_association_with_port_shared_policy(self):
343 policy = self.create_qos_policy(name='test-policy',
344 description='test policy',
345 shared=True)
Federico Ressi2d7db2c2018-07-06 08:11:20 +0200346 network = self.create_network('test network', shared=True)
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000347 port = self.create_port(network)
348 retrieved_port = self.admin_client.show_port(port['id'])
349 self.assertIsNone(retrieved_port['port']['qos_policy_id'])
350
351 self.client.update_port(port['id'], qos_policy_id=policy['id'])
352 retrieved_port = self.admin_client.show_port(port['id'])
353 self.assertEqual(
354 policy['id'], retrieved_port['port']['qos_policy_id'])
355
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000356 @decorators.idempotent_id('18163237-8ba9-4db5-9525-bad6d2343c75')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000357 def test_delete_not_allowed_if_policy_in_use_by_network(self):
358 policy = self.create_qos_policy(name='test-policy',
359 description='test policy',
360 shared=True)
Federico Ressi2d7db2c2018-07-06 08:11:20 +0200361 self.create_network('test network', qos_policy_id=policy['id'],
362 shared=True)
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000363 self.assertRaises(
364 exceptions.Conflict,
365 self.admin_client.delete_qos_policy, policy['id'])
366
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000367 @decorators.idempotent_id('24153230-84a9-4dd5-9525-bad6d2343c75')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000368 def test_delete_not_allowed_if_policy_in_use_by_port(self):
369 policy = self.create_qos_policy(name='test-policy',
370 description='test policy',
371 shared=True)
Federico Ressi2d7db2c2018-07-06 08:11:20 +0200372 network = self.create_network('test network', shared=True)
Sławek Kapłońskie100c4d2017-08-23 21:18:34 +0000373 self.create_port(network, qos_policy_id=policy['id'])
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000374 self.assertRaises(
375 exceptions.Conflict,
376 self.admin_client.delete_qos_policy, policy['id'])
377
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000378 @decorators.idempotent_id('a2a5849b-dd06-4b18-9664-0b6828a1fc27')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000379 def test_qos_policy_delete_with_rules(self):
380 policy = self.create_qos_policy(name='test-policy',
381 description='test policy',
382 shared=False)
zahlabut7ebb66e2021-09-01 22:39:49 +0300383 self._create_qos_bw_limit_rule(
384 policy['id'], {'max_kbps': 200, 'max_burst_kbps': 1337})
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000385 self.admin_client.delete_qos_policy(policy['id'])
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000386 with testtools.ExpectedException(exceptions.NotFound):
387 self.admin_client.show_qos_policy(policy['id'])
388
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000389 @decorators.idempotent_id('fb384bde-a973-41c3-a542-6f77a092155f')
Jakub Libosvarab42ca82016-06-07 07:56:13 +0000390 def test_get_policy_that_is_shared(self):
391 policy = self.create_qos_policy(
392 name='test-policy-shared',
393 description='shared policy',
394 shared=True,
Rodolfo Alonso Hernandeze2d062f2020-01-14 17:11:42 +0000395 project_id=self.admin_client.tenant_id)
Jakub Libosvarab42ca82016-06-07 07:56:13 +0000396 obtained_policy = self.client.show_qos_policy(policy['id'])['policy']
397 self.assertEqual(obtained_policy, policy)
398
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000399 @decorators.idempotent_id('aed8e2a6-22da-421b-89b9-935a2c1a1b50')
Rodolfo Alonso Hernandeze4c099f2016-07-18 11:52:12 +0100400 def test_policy_create_forbidden_for_regular_tenants(self):
401 self.assertRaises(
402 exceptions.Forbidden,
403 self.client.create_qos_policy,
404 'test-policy', 'test policy', False)
405
Hirofumi Ichihara39a6ee12017-08-23 13:55:12 +0900406 @decorators.idempotent_id('18d94f22-b9d5-4390-af12-d30a0cfc4cd3')
407 def test_default_policy_creating_network_without_policy(self):
Chandan Kumarc125fd12017-11-15 19:41:01 +0530408 project_id = self.create_project()['id']
Hirofumi Ichihara39a6ee12017-08-23 13:55:12 +0900409 policy = self.create_qos_policy(name='test-policy',
Rodolfo Alonso Hernandeze2d062f2020-01-14 17:11:42 +0000410 project_id=project_id,
Hirofumi Ichihara39a6ee12017-08-23 13:55:12 +0900411 is_default=True)
412 network = self.create_network('test network', client=self.admin_client,
413 project_id=project_id)
Hirofumi Ichihara39a6ee12017-08-23 13:55:12 +0900414 retrieved_network = self.admin_client.show_network(network['id'])
415 self.assertEqual(
416 policy['id'], retrieved_network['network']['qos_policy_id'])
417
418 @decorators.idempotent_id('807cce45-38e5-482d-94db-36e1796aba73')
419 def test_default_policy_creating_network_with_policy(self):
Chandan Kumarc125fd12017-11-15 19:41:01 +0530420 project_id = self.create_project()['id']
Hirofumi Ichihara39a6ee12017-08-23 13:55:12 +0900421 self.create_qos_policy(name='test-policy',
Rodolfo Alonso Hernandeze2d062f2020-01-14 17:11:42 +0000422 project_id=project_id,
Hirofumi Ichihara39a6ee12017-08-23 13:55:12 +0900423 is_default=True)
424 policy = self.create_qos_policy(name='test-policy',
Rodolfo Alonso Hernandeze2d062f2020-01-14 17:11:42 +0000425 project_id=project_id)
Hirofumi Ichihara39a6ee12017-08-23 13:55:12 +0900426 network = self.create_network('test network', client=self.admin_client,
427 project_id=project_id,
428 qos_policy_id=policy['id'])
Hirofumi Ichihara39a6ee12017-08-23 13:55:12 +0900429 retrieved_network = self.admin_client.show_network(network['id'])
430 self.assertEqual(
431 policy['id'], retrieved_network['network']['qos_policy_id'])
432
Sławek Kapłoński508dd292018-02-22 13:41:01 +0100433 @decorators.idempotent_id('06060880-2956-4c16-9a63-f284c3879229')
434 def test_user_create_port_with_admin_qos_policy(self):
435 qos_policy = self.create_qos_policy(
436 name='test-policy',
Rodolfo Alonso Hernandeze2d062f2020-01-14 17:11:42 +0000437 project_id=self.admin_client.tenant_id,
Sławek Kapłoński508dd292018-02-22 13:41:01 +0100438 shared=False)
439 network = self.create_network(
440 'test network', client=self.admin_client,
441 project_id=self.client.tenant_id,
442 qos_policy_id=qos_policy['id'])
443 port = self.create_port(network)
444 self.assertEqual(network['id'], port['network_id'])
445
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000446
447class QosBandwidthLimitRuleTestJSON(base.BaseAdminNetworkTest):
Sławek Kapłoński153f3452017-03-24 22:04:53 +0000448
zahlabut7ebb66e2021-09-01 22:39:49 +0300449 credentials = ['primary', 'admin']
Sławek Kapłoński153f3452017-03-24 22:04:53 +0000450 direction = None
Chandan Kumarc125fd12017-11-15 19:41:01 +0530451 required_extensions = [qos_apidef.ALIAS]
Sławek Kapłoński153f3452017-03-24 22:04:53 +0000452
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000453 @classmethod
zahlabut7ebb66e2021-09-01 22:39:49 +0300454 def setup_clients(cls):
455 super(QosBandwidthLimitRuleTestJSON, cls).setup_clients()
456 cls.qos_bw_limit_rule_client = \
457 cls.os_admin.qos_limit_bandwidth_rules_client
458 cls.qos_bw_limit_rule_client_primary = \
459 cls.os_primary.qos_limit_bandwidth_rules_client
460
461 @classmethod
YAMAMOTO Takashi3bd3d0f2016-12-12 11:14:58 +0900462 @base.require_qos_rule_type(qos_consts.RULE_TYPE_BANDWIDTH_LIMIT)
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000463 def resource_setup(cls):
464 super(QosBandwidthLimitRuleTestJSON, cls).resource_setup()
465
zahlabut7ebb66e2021-09-01 22:39:49 +0300466 def _create_qos_bw_limit_rule(self, policy_id, rule_data):
467 rule = self.qos_bw_limit_rule_client.create_limit_bandwidth_rule(
468 qos_policy_id=policy_id,
469 **rule_data)['bandwidth_limit_rule']
470 self.addCleanup(
471 test_utils.call_and_ignore_notfound_exc,
472 self.qos_bw_limit_rule_client.delete_limit_bandwidth_rule,
473 policy_id, rule['id'])
474 return rule
475
Sławek Kapłoński153f3452017-03-24 22:04:53 +0000476 @property
477 def opposite_direction(self):
478 if self.direction == "ingress":
479 return "egress"
480 elif self.direction == "egress":
481 return "ingress"
482 else:
483 return None
484
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000485 @decorators.idempotent_id('8a59b00b-3e9c-4787-92f8-93a5cdf5e378')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000486 def test_rule_create(self):
487 policy = self.create_qos_policy(name='test-policy',
488 description='test policy',
489 shared=False)
zahlabut7ebb66e2021-09-01 22:39:49 +0300490 rule = self._create_qos_bw_limit_rule(
491 policy['id'],
492 {'max_kbps': 200, 'max_burst_kbps': 1337, 'direction': 'ingress'})
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000493
494 # Test 'show rule'
zahlabut7ebb66e2021-09-01 22:39:49 +0300495 retrieved_rule = \
496 self.qos_bw_limit_rule_client.show_limit_bandwidth_rule(
497 policy['id'], rule['id'])
498
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000499 retrieved_rule = retrieved_rule['bandwidth_limit_rule']
500 self.assertEqual(rule['id'], retrieved_rule['id'])
501 self.assertEqual(200, retrieved_rule['max_kbps'])
502 self.assertEqual(1337, retrieved_rule['max_burst_kbps'])
zahlabut7ebb66e2021-09-01 22:39:49 +0300503 self.assertEqual('ingress', retrieved_rule['direction'])
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000504
505 # Test 'list rules'
zahlabut7ebb66e2021-09-01 22:39:49 +0300506 rules = self.qos_bw_limit_rule_client.list_limit_bandwidth_rules(
507 policy['id'])
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000508 rules = rules['bandwidth_limit_rules']
509 rules_ids = [r['id'] for r in rules]
510 self.assertIn(rule['id'], rules_ids)
511
512 # Test 'show policy'
513 retrieved_policy = self.admin_client.show_qos_policy(policy['id'])
514 policy_rules = retrieved_policy['policy']['rules']
515 self.assertEqual(1, len(policy_rules))
516 self.assertEqual(rule['id'], policy_rules[0]['id'])
517 self.assertEqual(qos_consts.RULE_TYPE_BANDWIDTH_LIMIT,
518 policy_rules[0]['type'])
519
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000520 @decorators.idempotent_id('8a59b00b-ab01-4787-92f8-93a5cdf5e378')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000521 def test_rule_create_fail_for_the_same_type(self):
522 policy = self.create_qos_policy(name='test-policy',
523 description='test policy',
524 shared=False)
zahlabut7ebb66e2021-09-01 22:39:49 +0300525 self._create_qos_bw_limit_rule(
526 policy['id'], {'max_kbps': 200, 'max_burst_kbps': 1337})
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000527
zahlabut7ebb66e2021-09-01 22:39:49 +0300528 self.assertRaises(
529 exceptions.Conflict,
530 self._create_qos_bw_limit_rule,
531 policy['id'],
532 {'max_kbps': 201, 'max_burst_kbps': 1338})
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000533
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000534 @decorators.idempotent_id('149a6988-2568-47d2-931e-2dbc858943b3')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000535 def test_rule_update(self):
536 policy = self.create_qos_policy(name='test-policy',
537 description='test policy',
538 shared=False)
zahlabut7ebb66e2021-09-01 22:39:49 +0300539 rule = self._create_qos_bw_limit_rule(
540 policy['id'], {'max_kbps': 1, 'max_burst_kbps': 1})
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000541
zahlabut7ebb66e2021-09-01 22:39:49 +0300542 if self.opposite_direction:
543 self.qos_bw_limit_rule_client.update_limit_bandwidth_rule(
544 policy['id'], rule['id'],
545 **{'max_kbps': 200, 'max_burst_kbps': 1337,
546 'direction': self.opposite_direction})
547 else:
548 self.qos_bw_limit_rule_client.update_limit_bandwidth_rule(
549 policy['id'], rule['id'],
550 **{'max_kbps': 200, 'max_burst_kbps': 1337})
551 retrieved_policy = self.qos_bw_limit_rule_client.\
552 show_limit_bandwidth_rule(policy['id'], rule['id'])
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000553 retrieved_policy = retrieved_policy['bandwidth_limit_rule']
554 self.assertEqual(200, retrieved_policy['max_kbps'])
555 self.assertEqual(1337, retrieved_policy['max_burst_kbps'])
Sławek Kapłoński153f3452017-03-24 22:04:53 +0000556 if self.opposite_direction:
557 self.assertEqual(self.opposite_direction,
558 retrieved_policy['direction'])
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000559
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000560 @decorators.idempotent_id('67ee6efd-7b33-4a68-927d-275b4f8ba958')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000561 def test_rule_delete(self):
562 policy = self.create_qos_policy(name='test-policy',
563 description='test policy',
564 shared=False)
zahlabut7ebb66e2021-09-01 22:39:49 +0300565 rule = self._create_qos_bw_limit_rule(
566 policy['id'], {'max_kbps': 200, 'max_burst_kbps': 1337})
567 retrieved_policy = \
568 self.qos_bw_limit_rule_client.show_limit_bandwidth_rule(
569 policy['id'], rule['id'])
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000570 retrieved_policy = retrieved_policy['bandwidth_limit_rule']
571 self.assertEqual(rule['id'], retrieved_policy['id'])
zahlabut7ebb66e2021-09-01 22:39:49 +0300572 self.qos_bw_limit_rule_client.delete_limit_bandwidth_rule(
573 policy['id'], rule['id'])
574 self.assertRaises(
575 exceptions.NotFound,
576 self.qos_bw_limit_rule_client.show_limit_bandwidth_rule,
577 policy['id'], rule['id'])
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000578
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000579 @decorators.idempotent_id('f211222c-5808-46cb-a961-983bbab6b852')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000580 def test_rule_create_rule_nonexistent_policy(self):
581 self.assertRaises(
582 exceptions.NotFound,
zahlabut7ebb66e2021-09-01 22:39:49 +0300583 self._create_qos_bw_limit_rule,
584 'policy', {'max_kbps': 200, 'max_burst_kbps': 1337})
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000585
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000586 @decorators.idempotent_id('a4a2e7ad-786f-4927-a85a-e545a93bd274')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000587 def test_rule_create_forbidden_for_regular_tenants(self):
588 self.assertRaises(
589 exceptions.Forbidden,
zahlabut7ebb66e2021-09-01 22:39:49 +0300590 self.qos_bw_limit_rule_client_primary.create_limit_bandwidth_rule,
591 'policy', **{'max_kbps': 1, 'max_burst_kbps': 2})
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000592
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000593 @decorators.idempotent_id('1bfc55d9-6fd8-4293-ab3a-b1d69bf7cd2e')
Sławek Kapłoński0acecc62016-08-20 21:00:51 +0000594 def test_rule_update_forbidden_for_regular_tenants_own_policy(self):
595 policy = self.create_qos_policy(name='test-policy',
596 description='test policy',
597 shared=False,
Rodolfo Alonso Hernandeze2d062f2020-01-14 17:11:42 +0000598 project_id=self.client.tenant_id)
zahlabut7ebb66e2021-09-01 22:39:49 +0300599 rule = self._create_qos_bw_limit_rule(
600 policy['id'],
601 {'max_kbps': 1, 'max_burst_kbps': 1})
Sławek Kapłoński0acecc62016-08-20 21:00:51 +0000602 self.assertRaises(
Matthew Edmondsc13d3502017-04-14 08:22:43 -0400603 exceptions.Forbidden,
zahlabut7ebb66e2021-09-01 22:39:49 +0300604 self.qos_bw_limit_rule_client_primary.update_limit_bandwidth_rule,
605 policy['id'], rule['id'], **{'max_kbps': 2, 'max_burst_kbps': 4})
Sławek Kapłoński0acecc62016-08-20 21:00:51 +0000606
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000607 @decorators.idempotent_id('9a607936-4b6f-4c2f-ad21-bd5b3d4fc91f')
Sławek Kapłoński0acecc62016-08-20 21:00:51 +0000608 def test_rule_update_forbidden_for_regular_tenants_foreign_policy(self):
zahlabut7ebb66e2021-09-01 22:39:49 +0300609 policy = self.create_qos_policy(
610 name='test-policy',
611 description='test policy',
612 shared=False,
613 project_id=self.admin_client.tenant_id)
614 rule = self._create_qos_bw_limit_rule(
615 policy['id'], {'max_kbps': 1, 'max_burst_kbps': 1})
Sławek Kapłoński0acecc62016-08-20 21:00:51 +0000616 self.assertRaises(
617 exceptions.NotFound,
zahlabut7ebb66e2021-09-01 22:39:49 +0300618 self.qos_bw_limit_rule_client_primary.update_limit_bandwidth_rule,
619 policy['id'], rule['id'], **{'max_kbps': 2, 'max_burst_kbps': 4})
Sławek Kapłoński0acecc62016-08-20 21:00:51 +0000620
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000621 @decorators.idempotent_id('ce0bd0c2-54d9-4e29-85f1-cfb36ac3ebe2')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000622 def test_get_rules_by_policy(self):
zahlabut7ebb66e2021-09-01 22:39:49 +0300623 policy1 = self.create_qos_policy(
624 name='test-policy1',
625 description='test policy1',
626 shared=False)
627 rule1 = self._create_qos_bw_limit_rule(
628 policy1['id'], {'max_kbps': 200, 'max_burst_kbps': 1337})
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000629
zahlabut7ebb66e2021-09-01 22:39:49 +0300630 policy2 = self.create_qos_policy(
631 name='test-policy2',
632 description='test policy2',
633 shared=False)
634 rule2 = self._create_qos_bw_limit_rule(
635 policy2['id'], {'max_kbps': 5000, 'max_burst_kbps': 2523})
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000636
637 # Test 'list rules'
zahlabut7ebb66e2021-09-01 22:39:49 +0300638 rules = self.qos_bw_limit_rule_client.list_limit_bandwidth_rules(
639 policy1['id'])
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000640 rules = rules['bandwidth_limit_rules']
641 rules_ids = [r['id'] for r in rules]
642 self.assertIn(rule1['id'], rules_ids)
643 self.assertNotIn(rule2['id'], rules_ids)
644
nfridman07f0e782019-11-04 09:12:58 -0500645 @testtools.skipUnless(
646 CONF.neutron_plugin_options.create_shared_resources,
647 """Creation of shared resources should be allowed,
648 setting the create_shared_resources option as 'True' is needed""")
649 @decorators.idempotent_id('d911707e-fa2c-11e9-9553-5076af30bbf5')
650 def test_attach_and_detach_a_policy_by_a_tenant(self):
651 # As an admin create an non shared QoS policy,add a rule
652 # and associate it with a network
653 self.network = self.create_network()
654 policy = self.create_qos_policy(name='test-policy',
655 description='test policy for attach',
656 shared=False)
zahlabut7ebb66e2021-09-01 22:39:49 +0300657 self._create_qos_bw_limit_rule(
658 policy['id'], {'max_kbps': 1024, 'max_burst_kbps': 1024})
nfridman07f0e782019-11-04 09:12:58 -0500659
660 self.admin_client.update_network(
661 self.network['id'], qos_policy_id=policy['id'])
662
663 # As a tenant, try to detach the policy from the network
664 # The operation should be forbidden
665 self.assertRaises(
666 exceptions.Forbidden,
667 self.client.update_network,
668 self.network['id'], qos_policy_id=None)
669
670 # As an admin, make the policy shared
671 self.admin_client.update_qos_policy(policy['id'], shared=True)
672
673 # As a tenant, try to detach the policy from the network
674 # The operation should be allowed
675 self.client.update_network(self.network['id'],
676 qos_policy_id=None)
677
678 retrieved_network = self.admin_client.show_network(self.network['id'])
679 self.assertIsNone(retrieved_network['network']['qos_policy_id'])
680
681 # As a tenant, try to delete the policy from the network
682 # should be forbidden
683 self.assertRaises(
684 exceptions.Forbidden,
685 self.client.delete_qos_policy,
686 policy['id'])
687
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000688
Sławek Kapłoński153f3452017-03-24 22:04:53 +0000689class QosBandwidthLimitRuleWithDirectionTestJSON(
Brian Haley6767cec2018-04-10 15:30:23 -0400690 QosBandwidthLimitRuleTestJSON):
Jakub Libosvar1982aa12017-05-30 11:15:33 +0000691 required_extensions = (
692 QosBandwidthLimitRuleTestJSON.required_extensions +
693 ['qos-bw-limit-direction']
694 )
Sławek Kapłoński153f3452017-03-24 22:04:53 +0000695 scenarios = [
696 ('ingress', {'direction': 'ingress'}),
697 ('egress', {'direction': 'egress'}),
698 ]
699
nfridman7717d9c2019-11-25 08:58:04 -0500700 @classmethod
701 @base.require_qos_rule_type(qos_consts.RULE_TYPE_BANDWIDTH_LIMIT)
702 def resource_setup(cls):
703 super(QosBandwidthLimitRuleWithDirectionTestJSON, cls).resource_setup()
704
705 @decorators.idempotent_id('c8cbe502-0f7e-11ea-8d71-362b9e155667')
706 def test_create_policy_with_multiple_rules(self):
707 # Create a policy with multiple rules
708 policy = self.create_qos_policy(name='test-policy1',
709 description='test policy1',
710 shared=False)
711
zahlabut7ebb66e2021-09-01 22:39:49 +0300712 rule1 = self._create_qos_bw_limit_rule(
713 policy['id'], {'max_kbps': 1024, 'max_burst_kbps': 1024,
714 'direction': n_constants.EGRESS_DIRECTION})
715 rule2 = self._create_qos_bw_limit_rule(
716 policy['id'], {'max_kbps': 1024, 'max_burst_kbps': 1024,
717 'direction': n_constants.INGRESS_DIRECTION})
nfridman7717d9c2019-11-25 08:58:04 -0500718 # Check that the rules were added to the policy
zahlabut7ebb66e2021-09-01 22:39:49 +0300719 rules = self.qos_bw_limit_rule_client.list_limit_bandwidth_rules(
nfridman7717d9c2019-11-25 08:58:04 -0500720 policy['id'])['bandwidth_limit_rules']
zahlabut7ebb66e2021-09-01 22:39:49 +0300721
nfridman7717d9c2019-11-25 08:58:04 -0500722 rules_ids = [rule['id'] for rule in rules]
723 self.assertIn(rule1['id'], rules_ids)
724 self.assertIn(rule2['id'], rules_ids)
725
726 # Check that the rules creation fails for the same rule types
zahlabut7ebb66e2021-09-01 22:39:49 +0300727 self.assertRaises(
728 exceptions.Conflict,
729 self._create_qos_bw_limit_rule,
730 policy['id'],
731 {'max_kbps': 1025, 'max_burst_kbps': 1025,
732 'direction': n_constants.EGRESS_DIRECTION})
nfridman7717d9c2019-11-25 08:58:04 -0500733
zahlabut7ebb66e2021-09-01 22:39:49 +0300734 self.assertRaises(
735 exceptions.Conflict,
736 self._create_qos_bw_limit_rule,
737 policy['id'],
738 {'max_kbps': 1025, 'max_burst_kbps': 1025,
739 'direction': n_constants.INGRESS_DIRECTION})
nfridman7717d9c2019-11-25 08:58:04 -0500740
Sławek Kapłoński153f3452017-03-24 22:04:53 +0000741
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000742class RbacSharedQosPoliciesTest(base.BaseAdminNetworkTest):
743
744 force_tenant_isolation = True
745 credentials = ['primary', 'alt', 'admin']
Chandan Kumarc125fd12017-11-15 19:41:01 +0530746 required_extensions = [qos_apidef.ALIAS]
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000747
748 @classmethod
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000749 def resource_setup(cls):
750 super(RbacSharedQosPoliciesTest, cls).resource_setup()
rajat294495c042017-06-28 15:37:16 +0530751 cls.client2 = cls.os_alt.network_client
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000752
Rodolfo Alonso Hernandeze2d062f2020-01-14 17:11:42 +0000753 def _create_qos_policy(self, project_id=None):
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000754 args = {'name': data_utils.rand_name('test-policy'),
755 'description': 'test policy',
756 'shared': False,
Rodolfo Alonso Hernandeze2d062f2020-01-14 17:11:42 +0000757 'project_id': project_id}
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000758 qos_policy = self.admin_client.create_qos_policy(**args)['policy']
759 self.addCleanup(self.admin_client.delete_qos_policy, qos_policy['id'])
760
761 return qos_policy
762
Rodolfo Alonso Hernandeze2d062f2020-01-14 17:11:42 +0000763 def _make_admin_policy_shared_to_project_id(self, project_id):
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000764 policy = self._create_qos_policy()
765 rbac_policy = self.admin_client.create_rbac_policy(
766 object_type='qos_policy',
767 object_id=policy['id'],
768 action='access_as_shared',
Rodolfo Alonso Hernandeze2d062f2020-01-14 17:11:42 +0000769 target_tenant=project_id,
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000770 )['rbac_policy']
771
772 return {'policy': policy, 'rbac_policy': rbac_policy}
773
774 def _create_network(self, qos_policy_id, client, should_cleanup=True):
775 net = client.create_network(
776 name=data_utils.rand_name('test-network'),
777 qos_policy_id=qos_policy_id)['network']
778 if should_cleanup:
779 self.addCleanup(client.delete_network, net['id'])
780
781 return net
782
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000783 @decorators.idempotent_id('b9dcf582-d3b3-11e5-950a-54ee756c66df')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000784 def test_policy_sharing_with_wildcard(self):
785 qos_pol = self.create_qos_policy(
786 name=data_utils.rand_name('test-policy'),
Rodolfo Alonso Hernandez1e9d1fe2017-02-01 15:15:16 +0000787 description='test-shared-policy', shared=False,
Rodolfo Alonso Hernandeze2d062f2020-01-14 17:11:42 +0000788 project_id=self.admin_client.tenant_id)
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000789 self.assertNotIn(qos_pol, self.client2.list_qos_policies()['policies'])
790
791 # test update shared False -> True
792 self.admin_client.update_qos_policy(qos_pol['id'], shared=True)
793 qos_pol['shared'] = True
794 self.client2.show_qos_policy(qos_pol['id'])
795 rbac_pol = {'target_tenant': '*',
796 'tenant_id': self.admin_client.tenant_id,
Dariusz Smigielf5fb4c62016-08-19 15:41:17 +0000797 'project_id': self.admin_client.tenant_id,
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000798 'object_type': 'qos_policy',
799 'object_id': qos_pol['id'],
800 'action': 'access_as_shared'}
801
802 rbac_policies = self.admin_client.list_rbac_policies()['rbac_policies']
803 rbac_policies = [r for r in rbac_policies if r.pop('id')]
804 self.assertIn(rbac_pol, rbac_policies)
805
806 # update shared True -> False should fail because the policy is bound
807 # to a network
808 net = self._create_network(qos_pol['id'], self.admin_client, False)
809 with testtools.ExpectedException(exceptions.Conflict):
810 self.admin_client.update_qos_policy(qos_pol['id'], shared=False)
811
812 # delete the network, and update shared True -> False should pass now
813 self.admin_client.delete_network(net['id'])
814 self.admin_client.update_qos_policy(qos_pol['id'], shared=False)
815 qos_pol['shared'] = False
816 self.assertNotIn(qos_pol, self.client2.list_qos_policies()['policies'])
817
818 def _create_net_bound_qos_rbacs(self):
Rodolfo Alonso Hernandeze2d062f2020-01-14 17:11:42 +0000819 res = self._make_admin_policy_shared_to_project_id(
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000820 self.client.tenant_id)
821 qos_policy, rbac_for_client_tenant = res['policy'], res['rbac_policy']
822
823 # add a wildcard rbac rule - now the policy globally shared
824 rbac_wildcard = self.admin_client.create_rbac_policy(
825 object_type='qos_policy',
826 object_id=qos_policy['id'],
827 action='access_as_shared',
828 target_tenant='*',
829 )['rbac_policy']
830
831 # tenant1 now uses qos policy for net
832 self._create_network(qos_policy['id'], self.client)
833
834 return rbac_for_client_tenant, rbac_wildcard
835
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000836 @decorators.idempotent_id('328b1f70-d424-11e5-a57f-54ee756c66df')
Rodolfo Alonso Hernandeze2d062f2020-01-14 17:11:42 +0000837 def test_net_bound_shared_policy_wildcard_and_project_id_wild_remove(self):
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000838 client_rbac, wildcard_rbac = self._create_net_bound_qos_rbacs()
839 # globally unshare the qos-policy, the specific share should remain
840 self.admin_client.delete_rbac_policy(wildcard_rbac['id'])
841 self.client.list_rbac_policies(id=client_rbac['id'])
842
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000843 @decorators.idempotent_id('1997b00c-0c75-4e43-8ce2-999f9fa555ee')
Rodolfo Alonso Hernandeze2d062f2020-01-14 17:11:42 +0000844 def test_net_bound_shared_policy_wildcard_and_projectid_wild_remains(self):
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000845 client_rbac, wildcard_rbac = self._create_net_bound_qos_rbacs()
846 # remove client_rbac policy the wildcard share should remain
847 self.admin_client.delete_rbac_policy(client_rbac['id'])
848 self.client.list_rbac_policies(id=wildcard_rbac['id'])
849
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000850 @decorators.idempotent_id('2ace9adc-da6e-11e5-aafe-54ee756c66df')
Rodolfo Alonso Hernandeze2d062f2020-01-14 17:11:42 +0000851 def test_policy_sharing_with_wildcard_and_project_id(self):
852 res = self._make_admin_policy_shared_to_project_id(
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000853 self.client.tenant_id)
854 qos_policy, rbac = res['policy'], res['rbac_policy']
855 qos_pol = self.client.show_qos_policy(qos_policy['id'])['policy']
856 self.assertTrue(qos_pol['shared'])
857 with testtools.ExpectedException(exceptions.NotFound):
858 self.client2.show_qos_policy(qos_policy['id'])
859
860 # make the qos-policy globally shared
861 self.admin_client.update_qos_policy(qos_policy['id'], shared=True)
862 qos_pol = self.client2.show_qos_policy(qos_policy['id'])['policy']
863 self.assertTrue(qos_pol['shared'])
864
865 # globally unshare the qos-policy, the specific share should remain
866 self.admin_client.update_qos_policy(qos_policy['id'], shared=False)
867 self.client.show_qos_policy(qos_policy['id'])
868 with testtools.ExpectedException(exceptions.NotFound):
869 self.client2.show_qos_policy(qos_policy['id'])
870 self.assertIn(rbac,
871 self.admin_client.list_rbac_policies()['rbac_policies'])
872
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000873 @decorators.idempotent_id('9f85c76a-a350-11e5-8ae5-54ee756c66df')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000874 def test_policy_target_update(self):
Rodolfo Alonso Hernandeze2d062f2020-01-14 17:11:42 +0000875 res = self._make_admin_policy_shared_to_project_id(
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000876 self.client.tenant_id)
877 # change to client2
878 update_res = self.admin_client.update_rbac_policy(
879 res['rbac_policy']['id'], target_tenant=self.client2.tenant_id)
880 self.assertEqual(self.client2.tenant_id,
881 update_res['rbac_policy']['target_tenant'])
882 # make sure everything else stayed the same
883 res['rbac_policy'].pop('target_tenant')
884 update_res['rbac_policy'].pop('target_tenant')
885 self.assertEqual(res['rbac_policy'], update_res['rbac_policy'])
886
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000887 @decorators.idempotent_id('a9b39f46-a350-11e5-97c7-54ee756c66df')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000888 def test_network_presence_prevents_policy_rbac_policy_deletion(self):
Rodolfo Alonso Hernandeze2d062f2020-01-14 17:11:42 +0000889 res = self._make_admin_policy_shared_to_project_id(
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000890 self.client2.tenant_id)
891 qos_policy_id = res['policy']['id']
892 self._create_network(qos_policy_id, self.client2)
893 # a network with shared qos-policy should prevent the deletion of an
894 # rbac-policy required for it to be shared
895 with testtools.ExpectedException(exceptions.Conflict):
896 self.admin_client.delete_rbac_policy(res['rbac_policy']['id'])
897
898 # a wildcard policy should allow the specific policy to be deleted
899 # since it allows the remaining port
900 wild = self.admin_client.create_rbac_policy(
901 object_type='qos_policy', object_id=res['policy']['id'],
902 action='access_as_shared', target_tenant='*')['rbac_policy']
903 self.admin_client.delete_rbac_policy(res['rbac_policy']['id'])
904
905 # now that wildcard is the only remaining, it should be subjected to
906 # the same restriction
907 with testtools.ExpectedException(exceptions.Conflict):
908 self.admin_client.delete_rbac_policy(wild['id'])
909
910 # we can't update the policy to a different tenant
911 with testtools.ExpectedException(exceptions.Conflict):
912 self.admin_client.update_rbac_policy(
913 wild['id'], target_tenant=self.client2.tenant_id)
914
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000915 @decorators.idempotent_id('b0fe87e8-a350-11e5-9f08-54ee756c66df')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000916 def test_regular_client_shares_to_another_regular_client(self):
917 # owned by self.admin_client
918 policy = self._create_qos_policy()
919 with testtools.ExpectedException(exceptions.NotFound):
920 self.client.show_qos_policy(policy['id'])
921 rbac_policy = self.admin_client.create_rbac_policy(
922 object_type='qos_policy', object_id=policy['id'],
923 action='access_as_shared',
924 target_tenant=self.client.tenant_id)['rbac_policy']
925 self.client.show_qos_policy(policy['id'])
926
927 self.assertIn(rbac_policy,
928 self.admin_client.list_rbac_policies()['rbac_policies'])
929 # ensure that 'client2' can't see the rbac-policy sharing the
930 # qos-policy to it because the rbac-policy belongs to 'client'
931 self.assertNotIn(rbac_policy['id'], [p['id'] for p in
932 self.client2.list_rbac_policies()['rbac_policies']])
933
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000934 @decorators.idempotent_id('ba88d0ca-a350-11e5-a06f-54ee756c66df')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000935 def test_filter_fields(self):
936 policy = self._create_qos_policy()
937 self.admin_client.create_rbac_policy(
938 object_type='qos_policy', object_id=policy['id'],
939 action='access_as_shared', target_tenant=self.client2.tenant_id)
940 field_args = (('id',), ('id', 'action'), ('object_type', 'object_id'),
Rodolfo Alonso Hernandeze2d062f2020-01-14 17:11:42 +0000941 ('project_id', 'target_tenant'))
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000942 for fields in field_args:
943 res = self.admin_client.list_rbac_policies(fields=fields)
944 self.assertEqual(set(fields), set(res['rbac_policies'][0].keys()))
945
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000946 @decorators.idempotent_id('c10d993a-a350-11e5-9c7a-54ee756c66df')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000947 def test_rbac_policy_show(self):
Rodolfo Alonso Hernandeze2d062f2020-01-14 17:11:42 +0000948 res = self._make_admin_policy_shared_to_project_id(
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000949 self.client.tenant_id)
950 p1 = res['rbac_policy']
951 p2 = self.admin_client.create_rbac_policy(
952 object_type='qos_policy', object_id=res['policy']['id'],
953 action='access_as_shared',
954 target_tenant='*')['rbac_policy']
955
956 self.assertEqual(
957 p1, self.admin_client.show_rbac_policy(p1['id'])['rbac_policy'])
958 self.assertEqual(
959 p2, self.admin_client.show_rbac_policy(p2['id'])['rbac_policy'])
960
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000961 @decorators.idempotent_id('c7496f86-a350-11e5-b380-54ee756c66df')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000962 def test_filter_rbac_policies(self):
963 policy = self._create_qos_policy()
964 rbac_pol1 = self.admin_client.create_rbac_policy(
965 object_type='qos_policy', object_id=policy['id'],
966 action='access_as_shared',
967 target_tenant=self.client2.tenant_id)['rbac_policy']
968 rbac_pol2 = self.admin_client.create_rbac_policy(
969 object_type='qos_policy', object_id=policy['id'],
970 action='access_as_shared',
971 target_tenant=self.admin_client.tenant_id)['rbac_policy']
972 res1 = self.admin_client.list_rbac_policies(id=rbac_pol1['id'])[
973 'rbac_policies']
974 res2 = self.admin_client.list_rbac_policies(id=rbac_pol2['id'])[
975 'rbac_policies']
976 self.assertEqual(1, len(res1))
977 self.assertEqual(1, len(res2))
978 self.assertEqual(rbac_pol1['id'], res1[0]['id'])
979 self.assertEqual(rbac_pol2['id'], res2[0]['id'])
980
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000981 @decorators.idempotent_id('cd7d755a-a350-11e5-a344-54ee756c66df')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000982 def test_regular_client_blocked_from_sharing_anothers_policy(self):
Rodolfo Alonso Hernandeze2d062f2020-01-14 17:11:42 +0000983 qos_policy = self._make_admin_policy_shared_to_project_id(
Daniel Mellado3c0aeab2016-01-29 11:30:25 +0000984 self.client.tenant_id)['policy']
985 with testtools.ExpectedException(exceptions.BadRequest):
986 self.client.create_rbac_policy(
987 object_type='qos_policy', object_id=qos_policy['id'],
988 action='access_as_shared',
989 target_tenant=self.client2.tenant_id)
990
991 # make sure the rbac-policy is invisible to the tenant for which it's
992 # being shared
993 self.assertFalse(self.client.list_rbac_policies()['rbac_policies'])
994
995
996class QosDscpMarkingRuleTestJSON(base.BaseAdminNetworkTest):
997 VALID_DSCP_MARK1 = 56
998 VALID_DSCP_MARK2 = 48
999
Chandan Kumarc125fd12017-11-15 19:41:01 +05301000 required_extensions = [qos_apidef.ALIAS]
Jakub Libosvar1982aa12017-05-30 11:15:33 +00001001
Daniel Mellado3c0aeab2016-01-29 11:30:25 +00001002 @classmethod
YAMAMOTO Takashi3bd3d0f2016-12-12 11:14:58 +09001003 @base.require_qos_rule_type(qos_consts.RULE_TYPE_DSCP_MARKING)
Daniel Mellado3c0aeab2016-01-29 11:30:25 +00001004 def resource_setup(cls):
1005 super(QosDscpMarkingRuleTestJSON, cls).resource_setup()
1006
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +00001007 @decorators.idempotent_id('f5cbaceb-5829-497c-9c60-ad70969e9a08')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +00001008 def test_rule_create(self):
1009 policy = self.create_qos_policy(name='test-policy',
1010 description='test policy',
1011 shared=False)
1012 rule = self.admin_client.create_dscp_marking_rule(
1013 policy['id'], self.VALID_DSCP_MARK1)['dscp_marking_rule']
1014
1015 # Test 'show rule'
1016 retrieved_rule = self.admin_client.show_dscp_marking_rule(
1017 policy['id'], rule['id'])
1018 retrieved_rule = retrieved_rule['dscp_marking_rule']
1019 self.assertEqual(rule['id'], retrieved_rule['id'])
1020 self.assertEqual(self.VALID_DSCP_MARK1, retrieved_rule['dscp_mark'])
1021
1022 # Test 'list rules'
1023 rules = self.admin_client.list_dscp_marking_rules(policy['id'])
1024 rules = rules['dscp_marking_rules']
1025 rules_ids = [r['id'] for r in rules]
1026 self.assertIn(rule['id'], rules_ids)
1027
1028 # Test 'show policy'
1029 retrieved_policy = self.admin_client.show_qos_policy(policy['id'])
1030 policy_rules = retrieved_policy['policy']['rules']
1031 self.assertEqual(1, len(policy_rules))
1032 self.assertEqual(rule['id'], policy_rules[0]['id'])
David Shaughnessydbf24822016-03-14 16:27:54 +00001033 self.assertEqual(qos_consts.RULE_TYPE_DSCP_MARKING,
Daniel Mellado3c0aeab2016-01-29 11:30:25 +00001034 policy_rules[0]['type'])
1035
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +00001036 @decorators.idempotent_id('08553ffe-030f-4037-b486-7e0b8fb9385a')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +00001037 def test_rule_create_fail_for_the_same_type(self):
1038 policy = self.create_qos_policy(name='test-policy',
1039 description='test policy',
1040 shared=False)
1041 self.admin_client.create_dscp_marking_rule(
1042 policy['id'], self.VALID_DSCP_MARK1)['dscp_marking_rule']
1043
1044 self.assertRaises(exceptions.Conflict,
1045 self.admin_client.create_dscp_marking_rule,
1046 policy_id=policy['id'],
1047 dscp_mark=self.VALID_DSCP_MARK2)
1048
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +00001049 @decorators.idempotent_id('76f632e5-3175-4408-9a32-3625e599c8a2')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +00001050 def test_rule_update(self):
1051 policy = self.create_qos_policy(name='test-policy',
1052 description='test policy',
1053 shared=False)
1054 rule = self.admin_client.create_dscp_marking_rule(
1055 policy['id'], self.VALID_DSCP_MARK1)['dscp_marking_rule']
1056
1057 self.admin_client.update_dscp_marking_rule(
1058 policy['id'], rule['id'], dscp_mark=self.VALID_DSCP_MARK2)
1059
1060 retrieved_policy = self.admin_client.show_dscp_marking_rule(
1061 policy['id'], rule['id'])
1062 retrieved_policy = retrieved_policy['dscp_marking_rule']
1063 self.assertEqual(self.VALID_DSCP_MARK2, retrieved_policy['dscp_mark'])
1064
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +00001065 @decorators.idempotent_id('74f81904-c35f-48a3-adae-1f5424cb3c18')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +00001066 def test_rule_delete(self):
1067 policy = self.create_qos_policy(name='test-policy',
1068 description='test policy',
1069 shared=False)
1070 rule = self.admin_client.create_dscp_marking_rule(
1071 policy['id'], self.VALID_DSCP_MARK1)['dscp_marking_rule']
1072
1073 retrieved_policy = self.admin_client.show_dscp_marking_rule(
1074 policy['id'], rule['id'])
1075 retrieved_policy = retrieved_policy['dscp_marking_rule']
1076 self.assertEqual(rule['id'], retrieved_policy['id'])
1077
1078 self.admin_client.delete_dscp_marking_rule(policy['id'], rule['id'])
1079 self.assertRaises(exceptions.NotFound,
1080 self.admin_client.show_dscp_marking_rule,
1081 policy['id'], rule['id'])
1082
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +00001083 @decorators.idempotent_id('9cb8ef5c-96fc-4978-9ee0-e3b02bab628a')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +00001084 def test_rule_create_rule_nonexistent_policy(self):
1085 self.assertRaises(
1086 exceptions.NotFound,
1087 self.admin_client.create_dscp_marking_rule,
1088 'policy', self.VALID_DSCP_MARK1)
1089
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +00001090 @decorators.idempotent_id('bf6002ea-29de-486f-b65d-08aea6d4c4e2')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +00001091 def test_rule_create_forbidden_for_regular_tenants(self):
1092 self.assertRaises(
1093 exceptions.Forbidden,
1094 self.client.create_dscp_marking_rule,
1095 'policy', self.VALID_DSCP_MARK1)
1096
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +00001097 @decorators.idempotent_id('33646b08-4f05-4493-a48a-bde768a18533')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +00001098 def test_invalid_rule_create(self):
1099 policy = self.create_qos_policy(name='test-policy',
1100 description='test policy',
1101 shared=False)
1102 self.assertRaises(
1103 exceptions.BadRequest,
1104 self.admin_client.create_dscp_marking_rule,
1105 policy['id'], 58)
1106
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +00001107 @decorators.idempotent_id('c565131d-4c80-4231-b0f3-9ae2be4de129')
Daniel Mellado3c0aeab2016-01-29 11:30:25 +00001108 def test_get_rules_by_policy(self):
1109 policy1 = self.create_qos_policy(name='test-policy1',
1110 description='test policy1',
1111 shared=False)
1112 rule1 = self.admin_client.create_dscp_marking_rule(
1113 policy1['id'], self.VALID_DSCP_MARK1)['dscp_marking_rule']
1114
1115 policy2 = self.create_qos_policy(name='test-policy2',
1116 description='test policy2',
1117 shared=False)
1118 rule2 = self.admin_client.create_dscp_marking_rule(
1119 policy2['id'], self.VALID_DSCP_MARK2)['dscp_marking_rule']
1120
1121 # Test 'list rules'
1122 rules = self.admin_client.list_dscp_marking_rules(policy1['id'])
1123 rules = rules['dscp_marking_rules']
1124 rules_ids = [r['id'] for r in rules]
1125 self.assertIn(rule1['id'], rules_ids)
1126 self.assertNotIn(rule2['id'], rules_ids)
Ihar Hrachyshkab7940d92016-06-10 13:44:22 +02001127
nfridman23b44ad2019-09-05 09:46:50 -04001128 @decorators.idempotent_id('19ed2286-ccb1-11e9-87d7-525400d6f522')
1129 def test_qos_dscp_create_and_update(self):
1130 """This test covers:
1131
1132 1.Creating a basic QoS policy with DSCP marking rule.
1133 2.Updating QoS policy:
1134 Administrator should have the ability to update existing QoS policy.
1135 This test should verify that:
1136 It's possible to update the existing DSCP marking rule with all of
1137 the valid marks between 0-56, except of the invalid marks:
1138 2-6, 42, 44, and 50-54 (which should be forbidden)
1139 """
1140
1141 def _test_update_dscp_mark_values(self, dscp_policy_id, rule_id):
1142 for mark in range(n_constants.VALID_DSCP_MARKS[1],
1143 self.VALID_DSCP_MARK1 + 1):
1144 if mark in n_constants.VALID_DSCP_MARKS:
1145 self.admin_client.update_dscp_marking_rule(
1146 dscp_policy_id, rule_id, dscp_mark=mark)
1147
1148 retrieved_rule = self.admin_client.show_dscp_marking_rule(
1149 dscp_policy_id, rule_id)['dscp_marking_rule']
1150 self.assertEqual(mark, retrieved_rule['dscp_mark'],
1151 """current DSCP mark is incorrect:
1152 expected value {0} actual value {1}
1153 """.format(mark,
1154 retrieved_rule['dscp_mark']))
1155
1156 else:
1157 self.assertRaises(exceptions.BadRequest,
1158 self.admin_client.create_dscp_marking_rule,
1159 dscp_policy_id,
1160 mark)
1161 # Setup network
1162 self.network = self.create_network()
1163
1164 # Create QoS policy
1165 dscp_policy_id = self.create_qos_policy(
1166 name='test-policy',
1167 description='test-qos-policy',
1168 shared=True)['id']
1169
1170 # Associate QoS to the network
1171 self.admin_client.update_network(
1172 self.network['id'], qos_policy_id=dscp_policy_id)
1173
1174 # Set a new DSCP rule with the first mark in range
1175 rule_id = self.admin_client.create_dscp_marking_rule(
1176 dscp_policy_id,
1177 n_constants.VALID_DSCP_MARKS[0])[
1178 'dscp_marking_rule']['id']
1179
1180 # Validate that the rule was set up properly
1181 retrieved_rule = self.client.show_dscp_marking_rule(
1182 dscp_policy_id, rule_id)['dscp_marking_rule']
1183 self.assertEqual(n_constants.VALID_DSCP_MARKS[0],
1184 retrieved_rule['dscp_mark'],
1185 """current DSCP mark is incorrect:
1186 expected value {0} actual value {1}
1187 """.format(n_constants.VALID_DSCP_MARKS[0],
1188 retrieved_rule['dscp_mark']))
1189
1190 # Try to set marks in range 8:56 (invalid marks should raise an error)
1191 _test_update_dscp_mark_values(self, dscp_policy_id, rule_id)
1192
Ihar Hrachyshkab7940d92016-06-10 13:44:22 +02001193
Rodolfo Alonso Hernandeze4c099f2016-07-18 11:52:12 +01001194class QosMinimumBandwidthRuleTestJSON(base.BaseAdminNetworkTest):
1195 DIRECTION_EGRESS = "egress"
1196 DIRECTION_INGRESS = "ingress"
1197 RULE_NAME = qos_consts.RULE_TYPE_MINIMUM_BANDWIDTH + "_rule"
1198 RULES_NAME = RULE_NAME + "s"
Chandan Kumarc125fd12017-11-15 19:41:01 +05301199 required_extensions = [qos_apidef.ALIAS]
Rodolfo Alonso Hernandeze4c099f2016-07-18 11:52:12 +01001200
1201 @classmethod
YAMAMOTO Takashi3bd3d0f2016-12-12 11:14:58 +09001202 @base.require_qos_rule_type(qos_consts.RULE_TYPE_MINIMUM_BANDWIDTH)
Rodolfo Alonso Hernandeze4c099f2016-07-18 11:52:12 +01001203 def resource_setup(cls):
1204 super(QosMinimumBandwidthRuleTestJSON, cls).resource_setup()
1205
zahlabut7ebb66e2021-09-01 22:39:49 +03001206 @classmethod
1207 def setup_clients(cls):
1208 super(QosMinimumBandwidthRuleTestJSON, cls).setup_clients()
1209 cls.qos_min_bw_rules_client = \
1210 cls.os_admin.qos_minimum_bandwidth_rules_client
1211 cls.qos_min_bw_rules_client_primary = \
1212 cls.os_primary.qos_minimum_bandwidth_rules_client
1213
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +00001214 @decorators.idempotent_id('aa59b00b-3e9c-4787-92f8-93a5cdf5e378')
Rodolfo Alonso Hernandeze4c099f2016-07-18 11:52:12 +01001215 def test_rule_create(self):
1216 policy = self.create_qos_policy(name='test-policy',
1217 description='test policy',
1218 shared=False)
zahlabut7ebb66e2021-09-01 22:39:49 +03001219 rule = self.qos_min_bw_rules_client.create_minimum_bandwidth_rule(
1220 qos_policy_id=policy['id'],
1221 **{'direction': self.DIRECTION_EGRESS,
1222 'min_kbps': 1138})[self.RULE_NAME]
Rodolfo Alonso Hernandeze4c099f2016-07-18 11:52:12 +01001223
1224 # Test 'show rule'
zahlabut7ebb66e2021-09-01 22:39:49 +03001225 retrieved_rule = \
1226 self.qos_min_bw_rules_client.show_minimum_bandwidth_rule(
1227 policy['id'], rule['id'])
Rodolfo Alonso Hernandeze4c099f2016-07-18 11:52:12 +01001228 retrieved_rule = retrieved_rule[self.RULE_NAME]
1229 self.assertEqual(rule['id'], retrieved_rule['id'])
1230 self.assertEqual(1138, retrieved_rule['min_kbps'])
1231 self.assertEqual(self.DIRECTION_EGRESS, retrieved_rule['direction'])
1232
1233 # Test 'list rules'
zahlabut7ebb66e2021-09-01 22:39:49 +03001234 rules = self.qos_min_bw_rules_client.list_minimum_bandwidth_rules(
1235 policy['id'])
Rodolfo Alonso Hernandeze4c099f2016-07-18 11:52:12 +01001236 rules = rules[self.RULES_NAME]
1237 rules_ids = [r['id'] for r in rules]
1238 self.assertIn(rule['id'], rules_ids)
1239
1240 # Test 'show policy'
1241 retrieved_policy = self.admin_client.show_qos_policy(policy['id'])
1242 policy_rules = retrieved_policy['policy']['rules']
1243 self.assertEqual(1, len(policy_rules))
1244 self.assertEqual(rule['id'], policy_rules[0]['id'])
1245 self.assertEqual(qos_consts.RULE_TYPE_MINIMUM_BANDWIDTH,
1246 policy_rules[0]['type'])
1247
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +00001248 @decorators.idempotent_id('266d9b87-e51c-48bd-9aa7-8269573621be')
Ihar Hrachyshka33034bf2016-08-31 18:48:14 +00001249 def test_rule_create_fail_for_missing_min_kbps(self):
1250 policy = self.create_qos_policy(name='test-policy',
1251 description='test policy',
1252 shared=False)
zahlabut7ebb66e2021-09-01 22:39:49 +03001253 self.assertRaises(
1254 exceptions.BadRequest,
1255 self.qos_min_bw_rules_client.create_minimum_bandwidth_rule,
1256 qos_policy_id=policy['id'],
1257 **{'direction': self.DIRECTION_EGRESS})
Ihar Hrachyshka33034bf2016-08-31 18:48:14 +00001258
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +00001259 @decorators.idempotent_id('aa59b00b-ab01-4787-92f8-93a5cdf5e378')
Rodolfo Alonso Hernandeze4c099f2016-07-18 11:52:12 +01001260 def test_rule_create_fail_for_the_same_type(self):
1261 policy = self.create_qos_policy(name='test-policy',
1262 description='test policy',
1263 shared=False)
zahlabut7ebb66e2021-09-01 22:39:49 +03001264 self.qos_min_bw_rules_client.create_minimum_bandwidth_rule(
1265 qos_policy_id=policy['id'],
1266 **{'direction': self.DIRECTION_EGRESS,
1267 'min_kbps': 200})
Rodolfo Alonso Hernandeze4c099f2016-07-18 11:52:12 +01001268
zahlabut7ebb66e2021-09-01 22:39:49 +03001269 self.assertRaises(
1270 exceptions.Conflict,
1271 self.qos_min_bw_rules_client.create_minimum_bandwidth_rule,
1272 qos_policy_id=policy['id'],
1273 **{'direction': self.DIRECTION_EGRESS,
1274 'min_kbps': 201})
Rodolfo Alonso Hernandeze4c099f2016-07-18 11:52:12 +01001275
Lajos Katonadc9c6d62018-08-27 16:08:51 +02001276 @decorators.idempotent_id('35baf998-ae65-495c-9902-35a0d11e8936')
1277 @utils.requires_ext(extension="qos-bw-minimum-ingress",
1278 service="network")
1279 def test_rule_create_pass_for_direction_ingress(self):
1280 policy = self.create_qos_policy(name='test-policy',
1281 description='test policy',
1282 shared=False)
zahlabut7ebb66e2021-09-01 22:39:49 +03001283 self.qos_min_bw_rules_client.create_minimum_bandwidth_rule(
1284 qos_policy_id=policy['id'],
1285 **{'direction': self.DIRECTION_INGRESS,
1286 'min_kbps': 201})
Lajos Katonadc9c6d62018-08-27 16:08:51 +02001287
1288 retrieved_policy = self.admin_client.show_qos_policy(policy['id'])
1289 policy_rules = retrieved_policy['policy']['rules']
1290 self.assertEqual(1, len(policy_rules))
1291 self.assertEqual(qos_consts.RULE_TYPE_MINIMUM_BANDWIDTH,
1292 policy_rules[0]['type'])
1293 self.assertEqual(self.DIRECTION_INGRESS, policy_rules[0]['direction'])
1294
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +00001295 @decorators.idempotent_id('a49a6988-2568-47d2-931e-2dbc858943b3')
Rodolfo Alonso Hernandeze4c099f2016-07-18 11:52:12 +01001296 def test_rule_update(self):
1297 policy = self.create_qos_policy(name='test-policy',
1298 description='test policy',
1299 shared=False)
zahlabut7ebb66e2021-09-01 22:39:49 +03001300 rule = self.qos_min_bw_rules_client.create_minimum_bandwidth_rule(
1301 qos_policy_id=policy['id'],
1302 **{'direction': self.DIRECTION_EGRESS,
1303 'min_kbps': 300})[self.RULE_NAME]
Rodolfo Alonso Hernandeze4c099f2016-07-18 11:52:12 +01001304
zahlabut7ebb66e2021-09-01 22:39:49 +03001305 self.qos_min_bw_rules_client.update_minimum_bandwidth_rule(
1306 policy['id'], rule['id'],
1307 **{'min_kbps': 350, 'direction': self.DIRECTION_EGRESS})
Rodolfo Alonso Hernandeze4c099f2016-07-18 11:52:12 +01001308
zahlabut7ebb66e2021-09-01 22:39:49 +03001309 retrieved_policy = \
1310 self.qos_min_bw_rules_client.show_minimum_bandwidth_rule(
1311 policy['id'], rule['id'])
Rodolfo Alonso Hernandeze4c099f2016-07-18 11:52:12 +01001312 retrieved_policy = retrieved_policy[self.RULE_NAME]
1313 self.assertEqual(350, retrieved_policy['min_kbps'])
1314 self.assertEqual(self.DIRECTION_EGRESS, retrieved_policy['direction'])
1315
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +00001316 @decorators.idempotent_id('a7ee6efd-7b33-4a68-927d-275b4f8ba958')
Rodolfo Alonso Hernandeze4c099f2016-07-18 11:52:12 +01001317 def test_rule_delete(self):
1318 policy = self.create_qos_policy(name='test-policy',
1319 description='test policy',
1320 shared=False)
zahlabut7ebb66e2021-09-01 22:39:49 +03001321 rule = self.qos_min_bw_rules_client.create_minimum_bandwidth_rule(
1322 policy['id'],
1323 **{'direction': self.DIRECTION_EGRESS,
1324 'min_kbps': 200})[self.RULE_NAME]
Rodolfo Alonso Hernandeze4c099f2016-07-18 11:52:12 +01001325
zahlabut7ebb66e2021-09-01 22:39:49 +03001326 retrieved_policy = \
1327 self.qos_min_bw_rules_client.show_minimum_bandwidth_rule(
1328 policy['id'], rule['id'])
Rodolfo Alonso Hernandeze4c099f2016-07-18 11:52:12 +01001329 retrieved_policy = retrieved_policy[self.RULE_NAME]
1330 self.assertEqual(rule['id'], retrieved_policy['id'])
1331
zahlabut7ebb66e2021-09-01 22:39:49 +03001332 self.qos_min_bw_rules_client.delete_minimum_bandwidth_rule(
1333 policy['id'], rule['id'])
1334 self.assertRaises(
1335 exceptions.NotFound,
1336 self.qos_min_bw_rules_client.show_minimum_bandwidth_rule,
1337 policy['id'], rule['id'])
Rodolfo Alonso Hernandeze4c099f2016-07-18 11:52:12 +01001338
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +00001339 @decorators.idempotent_id('a211222c-5808-46cb-a961-983bbab6b852')
Rodolfo Alonso Hernandeze4c099f2016-07-18 11:52:12 +01001340 def test_rule_create_rule_nonexistent_policy(self):
1341 self.assertRaises(
1342 exceptions.NotFound,
zahlabut7ebb66e2021-09-01 22:39:49 +03001343 self.qos_min_bw_rules_client.create_minimum_bandwidth_rule,
1344 'policy',
1345 **{'direction': self.DIRECTION_EGRESS, 'min_kbps': 200})
Rodolfo Alonso Hernandeze4c099f2016-07-18 11:52:12 +01001346
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +00001347 @decorators.idempotent_id('b4a2e7ad-786f-4927-a85a-e545a93bd274')
Rodolfo Alonso Hernandeze4c099f2016-07-18 11:52:12 +01001348 def test_rule_create_forbidden_for_regular_tenants(self):
1349 self.assertRaises(
1350 exceptions.Forbidden,
zahlabut7ebb66e2021-09-01 22:39:49 +03001351 self.qos_min_bw_rules_client_primary.create_minimum_bandwidth_rule,
1352 'policy', **{'direction': self.DIRECTION_EGRESS, 'min_kbps': 300})
Rodolfo Alonso Hernandeze4c099f2016-07-18 11:52:12 +01001353
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +00001354 @decorators.idempotent_id('de0bd0c2-54d9-4e29-85f1-cfb36ac3ebe2')
Rodolfo Alonso Hernandeze4c099f2016-07-18 11:52:12 +01001355 def test_get_rules_by_policy(self):
1356 policy1 = self.create_qos_policy(name='test-policy1',
1357 description='test policy1',
1358 shared=False)
zahlabut7ebb66e2021-09-01 22:39:49 +03001359 rule1 = self.qos_min_bw_rules_client.create_minimum_bandwidth_rule(
1360 qos_policy_id=policy1['id'],
1361 **{'direction': self.DIRECTION_EGRESS,
1362 'min_kbps': 200})[self.RULE_NAME]
Rodolfo Alonso Hernandeze4c099f2016-07-18 11:52:12 +01001363
1364 policy2 = self.create_qos_policy(name='test-policy2',
1365 description='test policy2',
1366 shared=False)
zahlabut7ebb66e2021-09-01 22:39:49 +03001367 rule2 = self.qos_min_bw_rules_client.create_minimum_bandwidth_rule(
1368 qos_policy_id=policy2['id'],
1369 **{'direction': self.DIRECTION_EGRESS,
1370 'min_kbps': 5000})[self.RULE_NAME]
Rodolfo Alonso Hernandeze4c099f2016-07-18 11:52:12 +01001371
1372 # Test 'list rules'
zahlabut7ebb66e2021-09-01 22:39:49 +03001373 rules = self.qos_min_bw_rules_client.list_minimum_bandwidth_rules(
1374 policy1['id'])
Rodolfo Alonso Hernandeze4c099f2016-07-18 11:52:12 +01001375 rules = rules[self.RULES_NAME]
1376 rules_ids = [r['id'] for r in rules]
1377 self.assertIn(rule1['id'], rules_ids)
1378 self.assertNotIn(rule2['id'], rules_ids)
1379
1380
elajkat4a1357b2021-08-31 10:16:25 +02001381class QosMinimumPpsRuleTestJSON(base.BaseAdminNetworkTest):
1382 RULE_NAME = qos_consts.RULE_TYPE_MINIMUM_PACKET_RATE + "_rule"
1383 RULES_NAME = RULE_NAME + "s"
1384 required_extensions = [qos_apidef.ALIAS]
1385
1386 @classmethod
1387 @utils.requires_ext(service='network',
1388 extension='port-resource-request-groups')
1389 def resource_setup(cls):
1390 super(QosMinimumPpsRuleTestJSON, cls).resource_setup()
1391
1392 @classmethod
1393 def setup_clients(cls):
1394 super(QosMinimumPpsRuleTestJSON, cls).setup_clients()
1395 cls.min_pps_client = cls.os_admin.qos_minimum_packet_rate_rules_client
1396 cls.min_pps_client_primary = \
1397 cls.os_primary.qos_minimum_packet_rate_rules_client
1398
1399 def _create_qos_min_pps_rule(self, policy_id, rule_data):
1400 rule = self.min_pps_client.create_minimum_packet_rate_rule(
1401 policy_id, **rule_data)['minimum_packet_rate_rule']
1402 self.addCleanup(
1403 test_utils.call_and_ignore_notfound_exc,
1404 self.min_pps_client.delete_minimum_packet_rate_rule,
1405 policy_id, rule['id'])
1406 return rule
1407
1408 @decorators.idempotent_id('66a5b9b4-d4f9-4af8-b238-9e1881b78487')
1409 def test_rule_create(self):
1410 policy = self.create_qos_policy(name='test-policy',
1411 description='test policy',
1412 shared=False)
1413 rule = self._create_qos_min_pps_rule(
1414 policy['id'],
1415 {qos_consts.DIRECTION: n_constants.EGRESS_DIRECTION,
1416 qos_consts.MIN_KPPS: 1138})
1417
1418 # Test 'show rule'
1419 retrieved_rule = self.min_pps_client.show_minimum_packet_rate_rule(
1420 policy['id'], rule['id'])[self.RULE_NAME]
1421 self.assertEqual(rule['id'], retrieved_rule['id'])
1422 self.assertEqual(1138, retrieved_rule[qos_consts.MIN_KPPS])
1423 self.assertEqual(n_constants.EGRESS_DIRECTION,
1424 retrieved_rule[qos_consts.DIRECTION])
1425
1426 # Test 'list rules'
1427 rules = self.min_pps_client.list_minimum_packet_rate_rules(
1428 policy['id'])
1429 rules = rules[self.RULES_NAME]
1430 rules_ids = [r['id'] for r in rules]
1431 self.assertIn(rule['id'], rules_ids)
1432
1433 # Test 'show policy'
1434 retrieved_policy = self.admin_client.show_qos_policy(policy['id'])
1435 policy_rules = retrieved_policy['policy']['rules']
1436 self.assertEqual(1, len(policy_rules))
1437 self.assertEqual(rule['id'], policy_rules[0]['id'])
1438 self.assertEqual('minimum_packet_rate',
1439 policy_rules[0]['type'])
1440
1441 @decorators.idempotent_id('6b656b57-d2bf-47f9-89a9-1baad1bd5418')
1442 def test_rule_create_fail_for_missing_min_kpps(self):
1443 policy = self.create_qos_policy(name='test-policy',
1444 description='test policy',
1445 shared=False)
1446 self.assertRaises(exceptions.BadRequest,
1447 self._create_qos_min_pps_rule,
1448 policy['id'],
1449 {qos_consts.DIRECTION: n_constants.EGRESS_DIRECTION})
1450
1451 @decorators.idempotent_id('f41213e5-2ab8-4916-b106-38d2cac5e18c')
1452 def test_rule_create_fail_for_the_same_type(self):
1453 policy = self.create_qos_policy(name='test-policy',
1454 description='test policy',
1455 shared=False)
1456 self._create_qos_min_pps_rule(policy['id'],
1457 {qos_consts.DIRECTION: n_constants.EGRESS_DIRECTION,
1458 qos_consts.MIN_KPPS: 200})
1459
1460 self.assertRaises(exceptions.Conflict,
1461 self._create_qos_min_pps_rule,
1462 policy['id'],
1463 {qos_consts.DIRECTION: n_constants.EGRESS_DIRECTION,
1464 qos_consts.MIN_KPPS: 201})
1465
1466 @decorators.idempotent_id('ceb8e41e-3d72-11ec-a446-d7faae6daec2')
1467 def test_rule_create_any_direction_when_egress_direction_exists(self):
1468 policy = self.create_qos_policy(name='test-policy',
1469 description='test policy',
1470 shared=False)
1471 self._create_qos_min_pps_rule(policy['id'],
1472 {qos_consts.DIRECTION: n_constants.EGRESS_DIRECTION,
1473 qos_consts.MIN_KPPS: 200})
1474
1475 self.assertRaises(exceptions.Conflict,
1476 self._create_qos_min_pps_rule,
1477 policy['id'],
1478 {qos_consts.DIRECTION: n_constants.ANY_DIRECTION,
1479 qos_consts.MIN_KPPS: 201})
1480
1481 @decorators.idempotent_id('a147a71e-3d7b-11ec-8097-278b1afd5fa2')
1482 def test_rule_create_egress_direction_when_any_direction_exists(self):
1483 policy = self.create_qos_policy(name='test-policy',
1484 description='test policy',
1485 shared=False)
1486 self._create_qos_min_pps_rule(policy['id'],
1487 {qos_consts.DIRECTION: n_constants.ANY_DIRECTION,
1488 qos_consts.MIN_KPPS: 200})
1489
1490 self.assertRaises(exceptions.Conflict,
1491 self._create_qos_min_pps_rule,
1492 policy['id'],
1493 {qos_consts.DIRECTION: n_constants.EGRESS_DIRECTION,
1494 qos_consts.MIN_KPPS: 201})
1495
1496 @decorators.idempotent_id('522ed09a-1d7f-4c1b-9195-61f19caf916f')
1497 def test_rule_update(self):
1498 policy = self.create_qos_policy(name='test-policy',
1499 description='test policy',
1500 shared=False)
1501 rule = self._create_qos_min_pps_rule(
1502 policy['id'],
1503 {qos_consts.DIRECTION: n_constants.EGRESS_DIRECTION,
1504 qos_consts.MIN_KPPS: 300})
1505
1506 self.min_pps_client.update_minimum_packet_rate_rule(
1507 policy['id'], rule['id'],
1508 **{qos_consts.MIN_KPPS: 350,
1509 qos_consts.DIRECTION: n_constants.ANY_DIRECTION})
1510
1511 retrieved_rule = self.min_pps_client.show_minimum_packet_rate_rule(
1512 policy['id'], rule['id'])[self.RULE_NAME]
1513 self.assertEqual(350, retrieved_rule[qos_consts.MIN_KPPS])
1514 self.assertEqual(n_constants.ANY_DIRECTION,
1515 retrieved_rule[qos_consts.DIRECTION])
1516
1517 @decorators.idempotent_id('a020e186-3d60-11ec-88ca-d7f5eec22764')
1518 def test_rule_update_direction_conflict(self):
1519 policy = self.create_qos_policy(name='test-policy',
1520 description='test policy',
1521 shared=False)
1522 rule1 = self._create_qos_min_pps_rule(
1523 policy['id'],
1524 {qos_consts.DIRECTION: n_constants.EGRESS_DIRECTION,
1525 qos_consts.MIN_KPPS: 300})
1526
1527 rule2 = self._create_qos_min_pps_rule(
1528 policy['id'],
1529 {qos_consts.DIRECTION: n_constants.INGRESS_DIRECTION,
1530 qos_consts.MIN_KPPS: 300})
1531
1532 retrieved_rule1 = self.min_pps_client.show_minimum_packet_rate_rule(
1533 policy['id'], rule1['id'])[self.RULE_NAME]
1534 self.assertEqual(n_constants.EGRESS_DIRECTION,
1535 retrieved_rule1[qos_consts.DIRECTION])
1536 retrieved_rule2 = self.min_pps_client.show_minimum_packet_rate_rule(
1537 policy['id'], rule2['id'])[self.RULE_NAME]
1538 self.assertEqual(n_constants.INGRESS_DIRECTION,
1539 retrieved_rule2[qos_consts.DIRECTION])
1540
1541 self.assertRaises(exceptions.Conflict,
1542 self.min_pps_client.update_minimum_packet_rate_rule,
1543 policy['id'], rule2['id'],
1544 **{qos_consts.DIRECTION: n_constants.ANY_DIRECTION})
1545
1546 @decorators.idempotent_id('c49018b6-d358-49a1-a94b-d53224165045')
1547 def test_rule_delete(self):
1548 policy = self.create_qos_policy(name='test-policy',
1549 description='test policy',
1550 shared=False)
1551 rule = self._create_qos_min_pps_rule(
1552 policy['id'],
1553 {qos_consts.DIRECTION: n_constants.EGRESS_DIRECTION,
1554 qos_consts.MIN_KPPS: 200})
1555
1556 retrieved_rule = self.min_pps_client.show_minimum_packet_rate_rule(
1557 policy['id'], rule['id'])[self.RULE_NAME]
1558 self.assertEqual(rule['id'], retrieved_rule['id'])
1559
1560 self.min_pps_client.delete_minimum_packet_rate_rule(policy['id'],
1561 rule['id'])
1562 self.assertRaises(exceptions.NotFound,
1563 self.min_pps_client.show_minimum_packet_rate_rule,
1564 policy['id'], rule['id'])
1565
1566 @decorators.idempotent_id('1a6b6128-3d3e-11ec-bf49-57b326d417c0')
1567 def test_rule_create_forbidden_for_regular_tenants(self):
1568 self.assertRaises(
1569 exceptions.Forbidden,
1570 self.min_pps_client_primary.create_minimum_packet_rate_rule,
1571 'policy', **{qos_consts.DIRECTION: n_constants.EGRESS_DIRECTION,
1572 qos_consts.MIN_KPPS: 300})
1573
1574 @decorators.idempotent_id('1b94f4e2-3d3e-11ec-bb21-6f98e4044b8b')
1575 def test_get_rules_by_policy(self):
1576 policy1 = self.create_qos_policy(name='test-policy1',
1577 description='test policy1',
1578 shared=False)
1579 rule1 = self._create_qos_min_pps_rule(
1580 policy1['id'],
1581 {qos_consts.DIRECTION: n_constants.EGRESS_DIRECTION,
1582 qos_consts.MIN_KPPS: 200})
1583
1584 policy2 = self.create_qos_policy(name='test-policy2',
1585 description='test policy2',
1586 shared=False)
1587 rule2 = self._create_qos_min_pps_rule(
1588 policy2['id'],
1589 {qos_consts.DIRECTION: n_constants.EGRESS_DIRECTION,
1590 qos_consts.MIN_KPPS: 5000})
1591
1592 # Test 'list rules'
1593 rules = self.min_pps_client.list_minimum_packet_rate_rules(
1594 policy1['id'])
1595 rules = rules[self.RULES_NAME]
1596 rules_ids = [r['id'] for r in rules]
1597 self.assertIn(rule1['id'], rules_ids)
1598 self.assertNotIn(rule2['id'], rules_ids)
1599
1600
Ihar Hrachyshkab7940d92016-06-10 13:44:22 +02001601class QosSearchCriteriaTest(base.BaseSearchCriteriaTest,
1602 base.BaseAdminNetworkTest):
1603
1604 resource = 'policy'
1605 plural_name = 'policies'
1606
1607 # Use unique description to isolate the tests from other QoS tests
1608 list_kwargs = {'description': 'search-criteria-test'}
1609 list_as_admin = True
1610
Chandan Kumarc125fd12017-11-15 19:41:01 +05301611 required_extensions = [qos_apidef.ALIAS]
Jakub Libosvar1982aa12017-05-30 11:15:33 +00001612
Ihar Hrachyshkab7940d92016-06-10 13:44:22 +02001613 @classmethod
Ihar Hrachyshkab7940d92016-06-10 13:44:22 +02001614 def resource_setup(cls):
1615 super(QosSearchCriteriaTest, cls).resource_setup()
1616 for name in cls.resource_names:
1617 cls.create_qos_policy(
1618 name=name, description='search-criteria-test')
1619
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +00001620 @decorators.idempotent_id('55fc0103-fdc1-4d34-ab62-c579bb739a91')
Ihar Hrachyshkab7940d92016-06-10 13:44:22 +02001621 def test_list_sorts_asc(self):
1622 self._test_list_sorts_asc()
1623
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +00001624 @decorators.idempotent_id('13e08ac3-bfed-426b-892a-b3b158560c23')
Ihar Hrachyshkab7940d92016-06-10 13:44:22 +02001625 def test_list_sorts_desc(self):
1626 self._test_list_sorts_desc()
1627
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +00001628 @decorators.idempotent_id('719e61cc-e33c-4918-aa4d-1a791e6e0e86')
Ihar Hrachyshkab7940d92016-06-10 13:44:22 +02001629 def test_list_pagination(self):
1630 self._test_list_pagination()
1631
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +00001632 @decorators.idempotent_id('3bd8fb58-c0f8-4954-87fb-f286e1eb096a')
Ihar Hrachyshkab7940d92016-06-10 13:44:22 +02001633 def test_list_pagination_with_marker(self):
1634 self._test_list_pagination_with_marker()
1635
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +00001636 @decorators.idempotent_id('3bad0747-8082-46e9-be4d-c428a842db41')
Ihar Hrachyshkab7940d92016-06-10 13:44:22 +02001637 def test_list_pagination_with_href_links(self):
1638 self._test_list_pagination_with_href_links()
1639
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +00001640 @decorators.idempotent_id('d6a8bacd-d5e8-4ef3-bc55-23ca6998d208')
Ihar Hrachyshkab7940d92016-06-10 13:44:22 +02001641 def test_list_pagination_page_reverse_asc(self):
1642 self._test_list_pagination_page_reverse_asc()
1643
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +00001644 @decorators.idempotent_id('0b9aecdc-2b27-421b-b104-53d24e905ae8')
Ihar Hrachyshkab7940d92016-06-10 13:44:22 +02001645 def test_list_pagination_page_reverse_desc(self):
1646 self._test_list_pagination_page_reverse_desc()
1647
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +00001648 @decorators.idempotent_id('1a3dc257-dafd-4870-8c71-639ae7ddc6ea')
Ihar Hrachyshkab7940d92016-06-10 13:44:22 +02001649 def test_list_pagination_page_reverse_with_href_links(self):
1650 self._test_list_pagination_page_reverse_with_href_links()
1651
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +00001652 @decorators.idempotent_id('40e09b53-4eb8-4526-9181-d438c8005a20')
Ihar Hrachyshkab7940d92016-06-10 13:44:22 +02001653 def test_list_no_pagination_limit_0(self):
1654 self._test_list_no_pagination_limit_0()