Statistics
| Branch: | Tag: | Revision:

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)