Coverage for manila/tests/api/v2/test_quota_class_sets.py: 100%
99 statements
« prev ^ index » next coverage.py v7.11.0, created at 2026-02-18 22:19 +0000
« prev ^ index » next coverage.py v7.11.0, created at 2026-02-18 22:19 +0000
1# Copyright 2013 OpenStack Foundation
2# Copyright (c) 2015 Mirantis inc.
3# All Rights Reserved.
4#
5# Licensed under the Apache License, Version 2.0 (the "License"); you may
6# not use this file except in compliance with the License. You may obtain
7# a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
14# License for the specific language governing permissions and limitations
15# under the License.
17"""
18Tests for manila.api.v2.quota_class_sets.py
19"""
21import copy
22from unittest import mock
24import ddt
25from oslo_config import cfg
26import webob.exc
27import webob.response
29from manila.api.openstack import api_version_request as api_version
30from manila.api.v2 import quota_class_sets
31from manila import context
32from manila import exception
33from manila import policy
34from manila import test
35from manila.tests.api import fakes
37CONF = cfg.CONF
39REQ = mock.MagicMock()
40REQ.environ = {'manila.context': context.get_admin_context()}
41REQ.environ['manila.context'].is_admin = True
42REQ.environ['manila.context'].auth_token = 'foo_auth_token'
43REQ.environ['manila.context'].project_id = 'foo_project_id'
45REQ_MEMBER = copy.deepcopy(REQ)
46REQ_MEMBER.environ['manila.context'].is_admin = False
49@ddt.ddt
50class QuotaSetsControllerTest(test.TestCase):
52 def setUp(self):
53 super(QuotaSetsControllerTest, self).setUp()
54 self.controller = quota_class_sets.QuotaClassSetsController()
55 self.resource_name = self.controller.resource_name
56 self.class_name = 'foo_class_name'
57 self.mock_policy_check = self.mock_object(
58 policy, 'check_policy', mock.Mock(return_value=True))
60 @ddt.data(
61 ('os-', '1.0', quota_class_sets.QuotaClassSetsControllerLegacy),
62 ('os-', '2.6', quota_class_sets.QuotaClassSetsControllerLegacy),
63 ('', '2.7', quota_class_sets.QuotaClassSetsController),
64 ('', '2.53', quota_class_sets.QuotaClassSetsController),
65 ('', '2.62', quota_class_sets.QuotaClassSetsController),
66 ('', '2.80', quota_class_sets.QuotaClassSetsController),
67 ('', '2.90', quota_class_sets.QuotaClassSetsController),
68 )
69 @ddt.unpack
70 def test_show_quota(self, url, version, controller):
71 req = fakes.HTTPRequest.blank(
72 '/fooproject/%squota-class-sets' % url,
73 version=version, use_admin_context=True)
74 quotas = {
75 "shares": 23,
76 "snapshots": 34,
77 "gigabytes": 45,
78 "snapshot_gigabytes": 56,
79 "share_networks": 67,
80 }
82 expected = {
83 'quota_class_set': {
84 'id': self.class_name,
85 'shares': quotas.get('shares', 50),
86 'gigabytes': quotas.get('gigabytes', 1000),
87 'snapshots': quotas.get('snapshots', 50),
88 'snapshot_gigabytes': quotas.get('snapshot_gigabytes', 1000),
89 'share_networks': quotas.get('share_networks', 10),
90 }
91 }
92 for k, v in quotas.items():
93 CONF.set_default(k, v, 'quota')
95 if req.api_version_request >= api_version.APIVersionRequest("2.40"):
96 expected['quota_class_set']['share_groups'] = 50
97 expected['quota_class_set']['share_group_snapshots'] = 50
98 if req.api_version_request >= api_version.APIVersionRequest("2.53"):
99 expected['quota_class_set']['share_replicas'] = 100
100 expected['quota_class_set']['replica_gigabytes'] = 1000
101 if req.api_version_request >= api_version.APIVersionRequest("2.62"):
102 expected['quota_class_set']['per_share_gigabytes'] = -1
103 if req.api_version_request >= api_version.APIVersionRequest("2.80"):
104 expected['quota_class_set']['backups'] = 10
105 expected['quota_class_set']['backup_gigabytes'] = 1000
106 if req.api_version_request >= api_version.APIVersionRequest("2.90"):
107 expected['quota_class_set']['encryption_keys'] = 100
109 result = controller().show(req, self.class_name)
111 self.assertEqual(expected, result)
112 self.mock_policy_check.assert_called_once_with(
113 req.environ['manila.context'], self.resource_name, 'show')
115 def test_show_quota_not_authorized(self):
116 req = fakes.HTTPRequest.blank(
117 '/fooproject/quota-class-sets',
118 version='2.62', use_admin_context=True)
120 self.mock_object(
121 quota_class_sets.db,
122 'authorize_quota_class_context',
123 mock.Mock(side_effect=exception.NotAuthorized))
125 self.assertRaises(
126 webob.exc.HTTPForbidden,
127 self.controller.show,
128 req, self.class_name)
129 self.mock_policy_check.assert_called_once_with(
130 req.environ['manila.context'], self.resource_name, 'show')
132 @ddt.data(
133 ('os-', '1.0', quota_class_sets.QuotaClassSetsControllerLegacy),
134 ('os-', '2.6', quota_class_sets.QuotaClassSetsControllerLegacy),
135 ('', '2.7', quota_class_sets.QuotaClassSetsController),
136 ('', '2.53', quota_class_sets.QuotaClassSetsController),
137 ('', '2.62', quota_class_sets.QuotaClassSetsController),
138 ('', '2.80', quota_class_sets.QuotaClassSetsController),
139 ('', '2.90', quota_class_sets.QuotaClassSetsController),
140 )
141 @ddt.unpack
142 def test_update_quota(self, url, version, controller):
143 req = fakes.HTTPRequest.blank(
144 '/fooproject/%squota-class-sets' % url,
145 version=version, use_admin_context=True)
146 CONF.set_default('shares', 789, 'quota')
147 body = {
148 'quota_class_set': {
149 'class_name': self.class_name,
150 'shares': 788,
151 }
152 }
153 expected = {
154 'quota_class_set': {
155 'shares': body['quota_class_set']['shares'],
156 'gigabytes': 1000,
157 'snapshots': 50,
158 'snapshot_gigabytes': 1000,
159 'share_networks': 10,
160 }
161 }
162 if req.api_version_request >= api_version.APIVersionRequest("2.40"):
163 expected['quota_class_set']['share_groups'] = 50
164 expected['quota_class_set']['share_group_snapshots'] = 50
165 if req.api_version_request >= api_version.APIVersionRequest("2.53"):
166 expected['quota_class_set']['share_replicas'] = 100
167 expected['quota_class_set']['replica_gigabytes'] = 1000
168 if req.api_version_request >= api_version.APIVersionRequest("2.62"):
169 expected['quota_class_set']['per_share_gigabytes'] = -1
170 if req.api_version_request >= api_version.APIVersionRequest("2.80"):
171 expected['quota_class_set']['backups'] = 10
172 expected['quota_class_set']['backup_gigabytes'] = 1000
173 if req.api_version_request >= api_version.APIVersionRequest("2.90"):
174 expected['quota_class_set']['encryption_keys'] = 100
176 update_result = controller().update(
177 req, self.class_name, body=body)
179 self.assertEqual(expected, update_result)
181 show_result = controller().show(req, self.class_name)
183 expected['quota_class_set']['id'] = self.class_name
184 self.assertEqual(expected, show_result)
185 self.mock_policy_check.assert_has_calls([mock.call(
186 req.environ['manila.context'], self.resource_name, action_name)
187 for action_name in ('update', 'show')])
189 def test_update_quota_not_authorized(self):
190 body = {
191 'quota_class_set': {
192 'class_name': self.class_name,
193 'shares': 13,
194 }
195 }
197 self.assertRaises(
198 webob.exc.HTTPForbidden,
199 self.controller.update,
200 REQ_MEMBER, self.class_name, body=body)
201 self.mock_policy_check.assert_called_once_with(
202 REQ_MEMBER.environ['manila.context'], self.resource_name, 'update')
204 @ddt.data(
205 ('os-', '2.7', quota_class_sets.QuotaClassSetsControllerLegacy),
206 ('', '2.6', quota_class_sets.QuotaClassSetsController),
207 ('', '2.0', quota_class_sets.QuotaClassSetsController),
208 )
209 @ddt.unpack
210 def test_api_not_found(self, url, version, controller):
211 req = fakes.HTTPRequest.blank(
212 '/fooproject/%squota-class-sets' % url, version=version)
213 for method_name in ('show', 'update'):
214 self.assertRaises(
215 exception.VersionNotFoundForAPIMethod,
216 getattr(controller(), method_name),
217 req, self.class_name)
219 @ddt.data(
220 ('os-', '2.7', quota_class_sets.QuotaClassSetsControllerLegacy),
221 ('', '2.6', quota_class_sets.QuotaClassSetsController),
222 ('', '2.0', quota_class_sets.QuotaClassSetsController),
223 )
224 @ddt.unpack
225 def test_update_api_not_found(self, url, version, controller):
226 req = fakes.HTTPRequest.blank(
227 '/fooproject/%squota-class-sets' % url, version=version)
228 self.assertRaises(
229 exception.VersionNotFoundForAPIMethod,
230 controller().update,
231 req, self.class_name)