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

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. 

16 

17""" 

18Tests for manila.api.v2.quota_class_sets.py 

19""" 

20 

21import copy 

22from unittest import mock 

23 

24import ddt 

25from oslo_config import cfg 

26import webob.exc 

27import webob.response 

28 

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 

36 

37CONF = cfg.CONF 

38 

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' 

44 

45REQ_MEMBER = copy.deepcopy(REQ) 

46REQ_MEMBER.environ['manila.context'].is_admin = False 

47 

48 

49@ddt.ddt 

50class QuotaSetsControllerTest(test.TestCase): 

51 

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)) 

59 

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 } 

81 

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') 

94 

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 

108 

109 result = controller().show(req, self.class_name) 

110 

111 self.assertEqual(expected, result) 

112 self.mock_policy_check.assert_called_once_with( 

113 req.environ['manila.context'], self.resource_name, 'show') 

114 

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) 

119 

120 self.mock_object( 

121 quota_class_sets.db, 

122 'authorize_quota_class_context', 

123 mock.Mock(side_effect=exception.NotAuthorized)) 

124 

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') 

131 

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 

175 

176 update_result = controller().update( 

177 req, self.class_name, body=body) 

178 

179 self.assertEqual(expected, update_result) 

180 

181 show_result = controller().show(req, self.class_name) 

182 

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')]) 

188 

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 } 

196 

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') 

203 

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) 

218 

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)