root / snf-astakos-app / astakos / im / tests / api.py @ baa9073a
History | View | Annotate | Download (13.1 kB)
1 |
# Copyright 2011 GRNET S.A. All rights reserved.
|
---|---|
2 |
#
|
3 |
# Redistribution and use in source and binary forms, with or
|
4 |
# without modification, are permitted provided that the following
|
5 |
# conditions are met:
|
6 |
#
|
7 |
# 1. Redistributions of source code must retain the above
|
8 |
# copyright notice, this list of conditions and the following
|
9 |
# disclaimer.
|
10 |
#
|
11 |
# 2. Redistributions in binary form must reproduce the above
|
12 |
# copyright notice, this list of conditions and the following
|
13 |
# disclaimer in the documentation and/or other materials
|
14 |
# provided with the distribution.
|
15 |
#
|
16 |
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
|
17 |
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
18 |
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
19 |
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
|
20 |
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
21 |
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
22 |
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
23 |
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
24 |
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
25 |
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
26 |
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
27 |
# POSSIBILITY OF SUCH DAMAGE.
|
28 |
#
|
29 |
# The views and conclusions contained in the software and
|
30 |
# documentation are those of the authors and should not be
|
31 |
# interpreted as representing official policies, either expressed
|
32 |
# or implied, of GRNET S.A.
|
33 |
|
34 |
from astakos.im.tests.common import * |
35 |
from django.test import TestCase |
36 |
|
37 |
ROOT = '/astakos/api/'
|
38 |
u = lambda url: ROOT + url
|
39 |
|
40 |
|
41 |
class QuotaAPITest(TestCase): |
42 |
def test_0(self): |
43 |
client = Client() |
44 |
# custom service resources
|
45 |
service1 = Service.objects.create( |
46 |
name="service1", api_url="http://service1.api") |
47 |
resource11 = {"name": "service1.resource11", |
48 |
"desc": "resource11 desc", |
49 |
"allow_in_projects": True} |
50 |
r, _ = resources.add_resource(service1, resource11) |
51 |
resources.update_resource(r, 100)
|
52 |
resource12 = {"name": "service1.resource12", |
53 |
"desc": "resource11 desc", |
54 |
"unit": "bytes"} |
55 |
r, _ = resources.add_resource(service1, resource12) |
56 |
resources.update_resource(r, 1024)
|
57 |
|
58 |
# create user
|
59 |
user = get_local_user('test@grnet.gr')
|
60 |
quotas.qh_sync_user(user) |
61 |
|
62 |
# create another service
|
63 |
service2 = Service.objects.create( |
64 |
name="service2", api_url="http://service2.api") |
65 |
resource21 = {"name": "service2.resource21", |
66 |
"desc": "resource11 desc", |
67 |
"allow_in_projects": False} |
68 |
r, _ = resources.add_resource(service2, resource21) |
69 |
resources.update_resource(r, 3)
|
70 |
|
71 |
resource_names = [r['name'] for r in |
72 |
[resource11, resource12, resource21]] |
73 |
|
74 |
# get resources
|
75 |
r = client.get(u('resources'))
|
76 |
self.assertEqual(r.status_code, 200) |
77 |
body = json.loads(r.content) |
78 |
for name in resource_names: |
79 |
assertIn(name, body) |
80 |
|
81 |
# get quota
|
82 |
r = client.get(u('quotas'))
|
83 |
self.assertEqual(r.status_code, 401) |
84 |
|
85 |
headers = {'HTTP_X_AUTH_TOKEN': user.auth_token}
|
86 |
r = client.get(u('quotas/'), **headers)
|
87 |
self.assertEqual(r.status_code, 200) |
88 |
body = json.loads(r.content) |
89 |
system_quota = body['system']
|
90 |
assertIn('system', body)
|
91 |
for name in resource_names: |
92 |
assertIn(name, system_quota) |
93 |
|
94 |
r = client.get(u('service_quotas'))
|
95 |
self.assertEqual(r.status_code, 401) |
96 |
|
97 |
s1_headers = {'HTTP_X_AUTH_TOKEN': service1.auth_token}
|
98 |
r = client.get(u('service_quotas'), **s1_headers)
|
99 |
self.assertEqual(r.status_code, 200) |
100 |
body = json.loads(r.content) |
101 |
assertIn(user.uuid, body) |
102 |
|
103 |
r = client.get(u('commissions'), **s1_headers)
|
104 |
self.assertEqual(r.status_code, 200) |
105 |
body = json.loads(r.content) |
106 |
self.assertEqual(body, [])
|
107 |
|
108 |
# issue some commissions
|
109 |
commission_request = { |
110 |
"force": False, |
111 |
"auto_accept": False, |
112 |
"name": "my commission", |
113 |
"provisions": [
|
114 |
{ |
115 |
"holder": user.uuid,
|
116 |
"source": "system", |
117 |
"resource": resource11['name'], |
118 |
"quantity": 1 |
119 |
}, |
120 |
{ |
121 |
"holder": user.uuid,
|
122 |
"source": "system", |
123 |
"resource": resource12['name'], |
124 |
"quantity": 30000 |
125 |
}]} |
126 |
|
127 |
post_data = json.dumps(commission_request) |
128 |
r = client.post(u('commissions'), post_data,
|
129 |
content_type='application/json', **s1_headers)
|
130 |
self.assertEqual(r.status_code, 413) |
131 |
|
132 |
commission_request = { |
133 |
"force": False, |
134 |
"auto_accept": False, |
135 |
"name": "my commission", |
136 |
"provisions": [
|
137 |
{ |
138 |
"holder": user.uuid,
|
139 |
"source": "system", |
140 |
"resource": resource11['name'], |
141 |
"quantity": 1 |
142 |
}, |
143 |
{ |
144 |
"holder": user.uuid,
|
145 |
"source": "system", |
146 |
"resource": resource12['name'], |
147 |
"quantity": 100 |
148 |
}]} |
149 |
|
150 |
post_data = json.dumps(commission_request) |
151 |
r = client.post(u('commissions'), post_data,
|
152 |
content_type='application/json', **s1_headers)
|
153 |
self.assertEqual(r.status_code, 201) |
154 |
body = json.loads(r.content) |
155 |
serial = body['serial']
|
156 |
self.assertEqual(serial, 1) |
157 |
|
158 |
post_data = json.dumps(commission_request) |
159 |
r = client.post(u('commissions'), post_data,
|
160 |
content_type='application/json', **s1_headers)
|
161 |
self.assertEqual(r.status_code, 201) |
162 |
body = json.loads(r.content) |
163 |
self.assertEqual(body['serial'], 2) |
164 |
|
165 |
post_data = json.dumps(commission_request) |
166 |
r = client.post(u('commissions'), post_data,
|
167 |
content_type='application/json', **s1_headers)
|
168 |
self.assertEqual(r.status_code, 201) |
169 |
body = json.loads(r.content) |
170 |
self.assertEqual(body['serial'], 3) |
171 |
|
172 |
r = client.get(u('commissions'), **s1_headers)
|
173 |
self.assertEqual(r.status_code, 200) |
174 |
body = json.loads(r.content) |
175 |
self.assertEqual(body, [1, 2, 3]) |
176 |
|
177 |
r = client.get(u('commissions/' + str(serial)), **s1_headers) |
178 |
self.assertEqual(r.status_code, 200) |
179 |
body = json.loads(r.content) |
180 |
self.assertEqual(body['serial'], serial) |
181 |
assertIn('issue_time', body)
|
182 |
self.assertEqual(body['provisions'], commission_request['provisions']) |
183 |
self.assertEqual(body['name'], commission_request['name']) |
184 |
|
185 |
r = client.get(u('service_quotas?user=' + user.uuid), **s1_headers)
|
186 |
self.assertEqual(r.status_code, 200) |
187 |
body = json.loads(r.content) |
188 |
user_quota = body[user.uuid] |
189 |
system_quota = user_quota['system']
|
190 |
r11 = system_quota[resource11['name']]
|
191 |
self.assertEqual(r11['usage'], 3) |
192 |
self.assertEqual(r11['pending'], 3) |
193 |
|
194 |
# resolve pending commissions
|
195 |
resolve_data = { |
196 |
"accept": [1, 3], |
197 |
"reject": [2, 3, 4], |
198 |
} |
199 |
post_data = json.dumps(resolve_data) |
200 |
|
201 |
r = client.post(u('commissions/action'), post_data,
|
202 |
content_type='application/json', **s1_headers)
|
203 |
self.assertEqual(r.status_code, 200) |
204 |
body = json.loads(r.content) |
205 |
self.assertEqual(body['accepted'], [1]) |
206 |
self.assertEqual(body['rejected'], [2]) |
207 |
failed = body['failed']
|
208 |
self.assertEqual(len(failed), 2) |
209 |
|
210 |
r = client.get(u('commissions/' + str(serial)), **s1_headers) |
211 |
self.assertEqual(r.status_code, 404) |
212 |
|
213 |
# auto accept
|
214 |
commission_request = { |
215 |
"auto_accept": True, |
216 |
"name": "my commission", |
217 |
"provisions": [
|
218 |
{ |
219 |
"holder": user.uuid,
|
220 |
"source": "system", |
221 |
"resource": resource11['name'], |
222 |
"quantity": 1 |
223 |
}, |
224 |
{ |
225 |
"holder": user.uuid,
|
226 |
"source": "system", |
227 |
"resource": resource12['name'], |
228 |
"quantity": 100 |
229 |
}]} |
230 |
|
231 |
post_data = json.dumps(commission_request) |
232 |
r = client.post(u('commissions'), post_data,
|
233 |
content_type='application/json', **s1_headers)
|
234 |
self.assertEqual(r.status_code, 201) |
235 |
body = json.loads(r.content) |
236 |
serial = body['serial']
|
237 |
self.assertEqual(serial, 4) |
238 |
|
239 |
r = client.get(u('commissions/' + str(serial)), **s1_headers) |
240 |
self.assertEqual(r.status_code, 404) |
241 |
|
242 |
# malformed
|
243 |
commission_request = { |
244 |
"auto_accept": True, |
245 |
"name": "my commission", |
246 |
"provisions": [
|
247 |
{ |
248 |
"holder": user.uuid,
|
249 |
"source": "system", |
250 |
"resource": resource11['name'], |
251 |
} |
252 |
]} |
253 |
|
254 |
post_data = json.dumps(commission_request) |
255 |
r = client.post(u('commissions'), post_data,
|
256 |
content_type='application/json', **s1_headers)
|
257 |
self.assertEqual(r.status_code, 400) |
258 |
|
259 |
commission_request = { |
260 |
"auto_accept": True, |
261 |
"name": "my commission", |
262 |
"provisions": "dummy"} |
263 |
|
264 |
post_data = json.dumps(commission_request) |
265 |
r = client.post(u('commissions'), post_data,
|
266 |
content_type='application/json', **s1_headers)
|
267 |
self.assertEqual(r.status_code, 400) |
268 |
|
269 |
r = client.post(u('commissions'), commission_request,
|
270 |
content_type='application/json', **s1_headers)
|
271 |
self.assertEqual(r.status_code, 400) |
272 |
|
273 |
# no holding
|
274 |
commission_request = { |
275 |
"auto_accept": True, |
276 |
"name": "my commission", |
277 |
"provisions": [
|
278 |
{ |
279 |
"holder": user.uuid,
|
280 |
"source": "system", |
281 |
"resource": "non existent", |
282 |
"quantity": 1 |
283 |
}, |
284 |
{ |
285 |
"holder": user.uuid,
|
286 |
"source": "system", |
287 |
"resource": resource12['name'], |
288 |
"quantity": 100 |
289 |
}]} |
290 |
|
291 |
post_data = json.dumps(commission_request) |
292 |
r = client.post(u('commissions'), post_data,
|
293 |
content_type='application/json', **s1_headers)
|
294 |
self.assertEqual(r.status_code, 404) |
295 |
|
296 |
# release
|
297 |
commission_request = { |
298 |
"provisions": [
|
299 |
{ |
300 |
"holder": user.uuid,
|
301 |
"source": "system", |
302 |
"resource": resource11['name'], |
303 |
"quantity": -1 |
304 |
} |
305 |
]} |
306 |
|
307 |
post_data = json.dumps(commission_request) |
308 |
r = client.post(u('commissions'), post_data,
|
309 |
content_type='application/json', **s1_headers)
|
310 |
self.assertEqual(r.status_code, 201) |
311 |
body = json.loads(r.content) |
312 |
serial = body['serial']
|
313 |
|
314 |
accept_data = {'accept': ""} |
315 |
post_data = json.dumps(accept_data) |
316 |
r = client.post(u('commissions/' + str(serial) + '/action'), post_data, |
317 |
content_type='application/json', **s1_headers)
|
318 |
self.assertEqual(r.status_code, 200) |
319 |
|
320 |
reject_data = {'reject': ""} |
321 |
post_data = json.dumps(accept_data) |
322 |
r = client.post(u('commissions/' + str(serial) + '/action'), post_data, |
323 |
content_type='application/json', **s1_headers)
|
324 |
self.assertEqual(r.status_code, 404) |
325 |
|
326 |
# force
|
327 |
commission_request = { |
328 |
"force": True, |
329 |
"provisions": [
|
330 |
{ |
331 |
"holder": user.uuid,
|
332 |
"source": "system", |
333 |
"resource": resource11['name'], |
334 |
"quantity": 100 |
335 |
}]} |
336 |
|
337 |
post_data = json.dumps(commission_request) |
338 |
r = client.post(u('commissions'), post_data,
|
339 |
content_type='application/json', **s1_headers)
|
340 |
self.assertEqual(r.status_code, 201) |
341 |
|
342 |
commission_request = { |
343 |
"force": True, |
344 |
"provisions": [
|
345 |
{ |
346 |
"holder": user.uuid,
|
347 |
"source": "system", |
348 |
"resource": resource11['name'], |
349 |
"quantity": -200 |
350 |
}]} |
351 |
|
352 |
post_data = json.dumps(commission_request) |
353 |
r = client.post(u('commissions'), post_data,
|
354 |
content_type='application/json', **s1_headers)
|
355 |
self.assertEqual(r.status_code, 413) |
356 |
|
357 |
r = client.get(u('quotas'), **headers)
|
358 |
self.assertEqual(r.status_code, 200) |
359 |
body = json.loads(r.content) |
360 |
system_quota = body['system']
|
361 |
r11 = system_quota[resource11['name']]
|
362 |
self.assertEqual(r11['usage'], 102) |
363 |
self.assertEqual(r11['pending'], 101) |