Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / tests / api.py @ d29f0371

History | View | Annotate | Download (21.6 kB)

1 bd1f667b Giorgos Korfiatis
# Copyright 2011, 2012, 2013 GRNET S.A. All rights reserved.
2 1ac3349d Kostas Papadimitriou
#
3 1ac3349d Kostas Papadimitriou
# Redistribution and use in source and binary forms, with or
4 1ac3349d Kostas Papadimitriou
# without modification, are permitted provided that the following
5 1ac3349d Kostas Papadimitriou
# conditions are met:
6 1ac3349d Kostas Papadimitriou
#
7 1ac3349d Kostas Papadimitriou
#   1. Redistributions of source code must retain the above
8 1ac3349d Kostas Papadimitriou
#      copyright notice, this list of conditions and the following
9 1ac3349d Kostas Papadimitriou
#      disclaimer.
10 1ac3349d Kostas Papadimitriou
#
11 1ac3349d Kostas Papadimitriou
#   2. Redistributions in binary form must reproduce the above
12 1ac3349d Kostas Papadimitriou
#      copyright notice, this list of conditions and the following
13 1ac3349d Kostas Papadimitriou
#      disclaimer in the documentation and/or other materials
14 1ac3349d Kostas Papadimitriou
#      provided with the distribution.
15 1ac3349d Kostas Papadimitriou
#
16 1ac3349d Kostas Papadimitriou
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 1ac3349d Kostas Papadimitriou
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 1ac3349d Kostas Papadimitriou
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 1ac3349d Kostas Papadimitriou
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 1ac3349d Kostas Papadimitriou
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 1ac3349d Kostas Papadimitriou
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 1ac3349d Kostas Papadimitriou
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 1ac3349d Kostas Papadimitriou
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 1ac3349d Kostas Papadimitriou
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 1ac3349d Kostas Papadimitriou
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 1ac3349d Kostas Papadimitriou
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 1ac3349d Kostas Papadimitriou
# POSSIBILITY OF SUCH DAMAGE.
28 1ac3349d Kostas Papadimitriou
#
29 1ac3349d Kostas Papadimitriou
# The views and conclusions contained in the software and
30 1ac3349d Kostas Papadimitriou
# documentation are those of the authors and should not be
31 1ac3349d Kostas Papadimitriou
# interpreted as representing official policies, either expressed
32 1ac3349d Kostas Papadimitriou
# or implied, of GRNET S.A.
33 1ac3349d Kostas Papadimitriou
34 1ac3349d Kostas Papadimitriou
from astakos.im.tests.common import *
35 7ac2131c Sofia Papagiannaki
36 baa9073a Kostas Papadimitriou
from django.test import TestCase
37 8cb96389 Sofia Papagiannaki
from django.core.urlresolvers import reverse
38 8cb96389 Sofia Papagiannaki
39 8cb96389 Sofia Papagiannaki
#from xml.dom import minidom
40 7ac2131c Sofia Papagiannaki
41 7ac2131c Sofia Papagiannaki
import json
42 7ac2131c Sofia Papagiannaki
43 a248ebbb Kostas Papadimitriou
ROOT = "/%s/%s/%s/" % (
44 a248ebbb Kostas Papadimitriou
    astakos_settings.BASE_PATH, astakos_settings.ACCOUNTS_PREFIX, 'v1.0')
45 1ac3349d Kostas Papadimitriou
u = lambda url: ROOT + url
46 1ac3349d Kostas Papadimitriou
47 1ac3349d Kostas Papadimitriou
48 1ac3349d Kostas Papadimitriou
class QuotaAPITest(TestCase):
49 1ac3349d Kostas Papadimitriou
    def test_0(self):
50 1ac3349d Kostas Papadimitriou
        client = Client()
51 bd1f667b Giorgos Korfiatis
52 bd1f667b Giorgos Korfiatis
        component1 = Component.objects.create(name="comp1")
53 bd1f667b Giorgos Korfiatis
        register.add_service(component1, "service1", "type1", [])
54 1ac3349d Kostas Papadimitriou
        # custom service resources
55 1ac3349d Kostas Papadimitriou
        resource11 = {"name": "service1.resource11",
56 1ac3349d Kostas Papadimitriou
                      "desc": "resource11 desc",
57 bd1f667b Giorgos Korfiatis
                      "service_type": "type1",
58 a248ebbb Kostas Papadimitriou
                      "service_origin": "service1",
59 1ac3349d Kostas Papadimitriou
                      "allow_in_projects": True}
60 bd1f667b Giorgos Korfiatis
        r, _ = register.add_resource(resource11)
61 bd1f667b Giorgos Korfiatis
        register.update_resource(r, 100)
62 1ac3349d Kostas Papadimitriou
        resource12 = {"name": "service1.resource12",
63 1ac3349d Kostas Papadimitriou
                      "desc": "resource11 desc",
64 bd1f667b Giorgos Korfiatis
                      "service_type": "type1",
65 a248ebbb Kostas Papadimitriou
                      "service_origin": "service1",
66 1ac3349d Kostas Papadimitriou
                      "unit": "bytes"}
67 bd1f667b Giorgos Korfiatis
        r, _ = register.add_resource(resource12)
68 bd1f667b Giorgos Korfiatis
        register.update_resource(r, 1024)
69 1ac3349d Kostas Papadimitriou
70 1ac3349d Kostas Papadimitriou
        # create user
71 1ac3349d Kostas Papadimitriou
        user = get_local_user('test@grnet.gr')
72 1ac3349d Kostas Papadimitriou
        quotas.qh_sync_user(user)
73 1ac3349d Kostas Papadimitriou
74 bd1f667b Giorgos Korfiatis
        component2 = Component.objects.create(name="comp2")
75 bd1f667b Giorgos Korfiatis
        register.add_service(component2, "service2", "type2", [])
76 1ac3349d Kostas Papadimitriou
        # create another service
77 1ac3349d Kostas Papadimitriou
        resource21 = {"name": "service2.resource21",
78 1ac3349d Kostas Papadimitriou
                      "desc": "resource11 desc",
79 bd1f667b Giorgos Korfiatis
                      "service_type": "type2",
80 a248ebbb Kostas Papadimitriou
                      "service_origin": "service2",
81 1ac3349d Kostas Papadimitriou
                      "allow_in_projects": False}
82 bd1f667b Giorgos Korfiatis
        r, _ = register.add_resource(resource21)
83 bd1f667b Giorgos Korfiatis
        register.update_resource(r, 3)
84 1ac3349d Kostas Papadimitriou
85 1ac3349d Kostas Papadimitriou
        resource_names = [r['name'] for r in
86 1ac3349d Kostas Papadimitriou
                          [resource11, resource12, resource21]]
87 1ac3349d Kostas Papadimitriou
88 1ac3349d Kostas Papadimitriou
        # get resources
89 1ac3349d Kostas Papadimitriou
        r = client.get(u('resources'))
90 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
91 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
92 1ac3349d Kostas Papadimitriou
        for name in resource_names:
93 1ac3349d Kostas Papadimitriou
            assertIn(name, body)
94 1ac3349d Kostas Papadimitriou
95 1ac3349d Kostas Papadimitriou
        # get quota
96 1ac3349d Kostas Papadimitriou
        r = client.get(u('quotas'))
97 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 401)
98 1ac3349d Kostas Papadimitriou
99 1ac3349d Kostas Papadimitriou
        headers = {'HTTP_X_AUTH_TOKEN': user.auth_token}
100 1ac3349d Kostas Papadimitriou
        r = client.get(u('quotas/'), **headers)
101 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
102 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
103 1ac3349d Kostas Papadimitriou
        system_quota = body['system']
104 1ac3349d Kostas Papadimitriou
        assertIn('system', body)
105 1ac3349d Kostas Papadimitriou
        for name in resource_names:
106 1ac3349d Kostas Papadimitriou
            assertIn(name, system_quota)
107 1ac3349d Kostas Papadimitriou
108 1ac3349d Kostas Papadimitriou
        r = client.get(u('service_quotas'))
109 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 401)
110 1ac3349d Kostas Papadimitriou
111 bd1f667b Giorgos Korfiatis
        s1_headers = {'HTTP_X_AUTH_TOKEN': component1.auth_token}
112 1ac3349d Kostas Papadimitriou
        r = client.get(u('service_quotas'), **s1_headers)
113 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
114 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
115 1ac3349d Kostas Papadimitriou
        assertIn(user.uuid, body)
116 1ac3349d Kostas Papadimitriou
117 1ac3349d Kostas Papadimitriou
        r = client.get(u('commissions'), **s1_headers)
118 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
119 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
120 1ac3349d Kostas Papadimitriou
        self.assertEqual(body, [])
121 1ac3349d Kostas Papadimitriou
122 1ac3349d Kostas Papadimitriou
        # issue some commissions
123 1ac3349d Kostas Papadimitriou
        commission_request = {
124 1ac3349d Kostas Papadimitriou
            "force": False,
125 1ac3349d Kostas Papadimitriou
            "auto_accept": False,
126 1ac3349d Kostas Papadimitriou
            "name": "my commission",
127 1ac3349d Kostas Papadimitriou
            "provisions": [
128 1ac3349d Kostas Papadimitriou
                {
129 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
130 1ac3349d Kostas Papadimitriou
                    "source": "system",
131 1ac3349d Kostas Papadimitriou
                    "resource": resource11['name'],
132 1ac3349d Kostas Papadimitriou
                    "quantity": 1
133 1ac3349d Kostas Papadimitriou
                },
134 1ac3349d Kostas Papadimitriou
                {
135 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
136 1ac3349d Kostas Papadimitriou
                    "source": "system",
137 1ac3349d Kostas Papadimitriou
                    "resource": resource12['name'],
138 1ac3349d Kostas Papadimitriou
                    "quantity": 30000
139 1ac3349d Kostas Papadimitriou
                }]}
140 1ac3349d Kostas Papadimitriou
141 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
142 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
143 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
144 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 413)
145 1ac3349d Kostas Papadimitriou
146 1ac3349d Kostas Papadimitriou
        commission_request = {
147 1ac3349d Kostas Papadimitriou
            "force": False,
148 1ac3349d Kostas Papadimitriou
            "auto_accept": False,
149 1ac3349d Kostas Papadimitriou
            "name": "my commission",
150 1ac3349d Kostas Papadimitriou
            "provisions": [
151 1ac3349d Kostas Papadimitriou
                {
152 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
153 1ac3349d Kostas Papadimitriou
                    "source": "system",
154 1ac3349d Kostas Papadimitriou
                    "resource": resource11['name'],
155 1ac3349d Kostas Papadimitriou
                    "quantity": 1
156 1ac3349d Kostas Papadimitriou
                },
157 1ac3349d Kostas Papadimitriou
                {
158 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
159 1ac3349d Kostas Papadimitriou
                    "source": "system",
160 1ac3349d Kostas Papadimitriou
                    "resource": resource12['name'],
161 1ac3349d Kostas Papadimitriou
                    "quantity": 100
162 1ac3349d Kostas Papadimitriou
                }]}
163 1ac3349d Kostas Papadimitriou
164 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
165 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
166 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
167 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 201)
168 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
169 1ac3349d Kostas Papadimitriou
        serial = body['serial']
170 1ac3349d Kostas Papadimitriou
        self.assertEqual(serial, 1)
171 1ac3349d Kostas Papadimitriou
172 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
173 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
174 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
175 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 201)
176 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
177 1ac3349d Kostas Papadimitriou
        self.assertEqual(body['serial'], 2)
178 1ac3349d Kostas Papadimitriou
179 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
180 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
181 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
182 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 201)
183 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
184 1ac3349d Kostas Papadimitriou
        self.assertEqual(body['serial'], 3)
185 1ac3349d Kostas Papadimitriou
186 1ac3349d Kostas Papadimitriou
        r = client.get(u('commissions'), **s1_headers)
187 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
188 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
189 1ac3349d Kostas Papadimitriou
        self.assertEqual(body, [1, 2, 3])
190 1ac3349d Kostas Papadimitriou
191 1ac3349d Kostas Papadimitriou
        r = client.get(u('commissions/' + str(serial)), **s1_headers)
192 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
193 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
194 1ac3349d Kostas Papadimitriou
        self.assertEqual(body['serial'], serial)
195 1ac3349d Kostas Papadimitriou
        assertIn('issue_time', body)
196 1ac3349d Kostas Papadimitriou
        self.assertEqual(body['provisions'], commission_request['provisions'])
197 1ac3349d Kostas Papadimitriou
        self.assertEqual(body['name'], commission_request['name'])
198 1ac3349d Kostas Papadimitriou
199 1ac3349d Kostas Papadimitriou
        r = client.get(u('service_quotas?user=' + user.uuid), **s1_headers)
200 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
201 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
202 1ac3349d Kostas Papadimitriou
        user_quota = body[user.uuid]
203 1ac3349d Kostas Papadimitriou
        system_quota = user_quota['system']
204 1ac3349d Kostas Papadimitriou
        r11 = system_quota[resource11['name']]
205 1ac3349d Kostas Papadimitriou
        self.assertEqual(r11['usage'], 3)
206 1ac3349d Kostas Papadimitriou
        self.assertEqual(r11['pending'], 3)
207 1ac3349d Kostas Papadimitriou
208 1ac3349d Kostas Papadimitriou
        # resolve pending commissions
209 1ac3349d Kostas Papadimitriou
        resolve_data = {
210 1ac3349d Kostas Papadimitriou
            "accept": [1, 3],
211 1ac3349d Kostas Papadimitriou
            "reject": [2, 3, 4],
212 1ac3349d Kostas Papadimitriou
        }
213 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(resolve_data)
214 1ac3349d Kostas Papadimitriou
215 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions/action'), post_data,
216 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
217 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
218 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
219 1ac3349d Kostas Papadimitriou
        self.assertEqual(body['accepted'], [1])
220 1ac3349d Kostas Papadimitriou
        self.assertEqual(body['rejected'], [2])
221 1ac3349d Kostas Papadimitriou
        failed = body['failed']
222 1ac3349d Kostas Papadimitriou
        self.assertEqual(len(failed), 2)
223 1ac3349d Kostas Papadimitriou
224 1ac3349d Kostas Papadimitriou
        r = client.get(u('commissions/' + str(serial)), **s1_headers)
225 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 404)
226 1ac3349d Kostas Papadimitriou
227 1ac3349d Kostas Papadimitriou
        # auto accept
228 1ac3349d Kostas Papadimitriou
        commission_request = {
229 1ac3349d Kostas Papadimitriou
            "auto_accept": True,
230 1ac3349d Kostas Papadimitriou
            "name": "my commission",
231 1ac3349d Kostas Papadimitriou
            "provisions": [
232 1ac3349d Kostas Papadimitriou
                {
233 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
234 1ac3349d Kostas Papadimitriou
                    "source": "system",
235 1ac3349d Kostas Papadimitriou
                    "resource": resource11['name'],
236 1ac3349d Kostas Papadimitriou
                    "quantity": 1
237 1ac3349d Kostas Papadimitriou
                },
238 1ac3349d Kostas Papadimitriou
                {
239 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
240 1ac3349d Kostas Papadimitriou
                    "source": "system",
241 1ac3349d Kostas Papadimitriou
                    "resource": resource12['name'],
242 1ac3349d Kostas Papadimitriou
                    "quantity": 100
243 1ac3349d Kostas Papadimitriou
                }]}
244 1ac3349d Kostas Papadimitriou
245 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
246 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
247 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
248 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 201)
249 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
250 1ac3349d Kostas Papadimitriou
        serial = body['serial']
251 1ac3349d Kostas Papadimitriou
        self.assertEqual(serial, 4)
252 1ac3349d Kostas Papadimitriou
253 1ac3349d Kostas Papadimitriou
        r = client.get(u('commissions/' + str(serial)), **s1_headers)
254 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 404)
255 1ac3349d Kostas Papadimitriou
256 1ac3349d Kostas Papadimitriou
        # malformed
257 1ac3349d Kostas Papadimitriou
        commission_request = {
258 1ac3349d Kostas Papadimitriou
            "auto_accept": True,
259 1ac3349d Kostas Papadimitriou
            "name": "my commission",
260 1ac3349d Kostas Papadimitriou
            "provisions": [
261 1ac3349d Kostas Papadimitriou
                {
262 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
263 1ac3349d Kostas Papadimitriou
                    "source": "system",
264 1ac3349d Kostas Papadimitriou
                    "resource": resource11['name'],
265 1ac3349d Kostas Papadimitriou
                }
266 1ac3349d Kostas Papadimitriou
            ]}
267 1ac3349d Kostas Papadimitriou
268 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
269 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
270 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
271 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 400)
272 1ac3349d Kostas Papadimitriou
273 1ac3349d Kostas Papadimitriou
        commission_request = {
274 1ac3349d Kostas Papadimitriou
            "auto_accept": True,
275 1ac3349d Kostas Papadimitriou
            "name": "my commission",
276 1ac3349d Kostas Papadimitriou
            "provisions": "dummy"}
277 1ac3349d Kostas Papadimitriou
278 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
279 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
280 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
281 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 400)
282 1ac3349d Kostas Papadimitriou
283 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), commission_request,
284 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
285 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 400)
286 1ac3349d Kostas Papadimitriou
287 1ac3349d Kostas Papadimitriou
        # no holding
288 1ac3349d Kostas Papadimitriou
        commission_request = {
289 1ac3349d Kostas Papadimitriou
            "auto_accept": True,
290 1ac3349d Kostas Papadimitriou
            "name": "my commission",
291 1ac3349d Kostas Papadimitriou
            "provisions": [
292 1ac3349d Kostas Papadimitriou
                {
293 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
294 1ac3349d Kostas Papadimitriou
                    "source": "system",
295 1ac3349d Kostas Papadimitriou
                    "resource": "non existent",
296 1ac3349d Kostas Papadimitriou
                    "quantity": 1
297 1ac3349d Kostas Papadimitriou
                },
298 1ac3349d Kostas Papadimitriou
                {
299 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
300 1ac3349d Kostas Papadimitriou
                    "source": "system",
301 1ac3349d Kostas Papadimitriou
                    "resource": resource12['name'],
302 1ac3349d Kostas Papadimitriou
                    "quantity": 100
303 1ac3349d Kostas Papadimitriou
                }]}
304 1ac3349d Kostas Papadimitriou
305 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
306 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
307 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
308 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 404)
309 1ac3349d Kostas Papadimitriou
310 1ac3349d Kostas Papadimitriou
        # release
311 1ac3349d Kostas Papadimitriou
        commission_request = {
312 1ac3349d Kostas Papadimitriou
            "provisions": [
313 1ac3349d Kostas Papadimitriou
                {
314 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
315 1ac3349d Kostas Papadimitriou
                    "source": "system",
316 1ac3349d Kostas Papadimitriou
                    "resource": resource11['name'],
317 1ac3349d Kostas Papadimitriou
                    "quantity": -1
318 1ac3349d Kostas Papadimitriou
                }
319 1ac3349d Kostas Papadimitriou
            ]}
320 1ac3349d Kostas Papadimitriou
321 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
322 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
323 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
324 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 201)
325 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
326 1ac3349d Kostas Papadimitriou
        serial = body['serial']
327 1ac3349d Kostas Papadimitriou
328 1ac3349d Kostas Papadimitriou
        accept_data = {'accept': ""}
329 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(accept_data)
330 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions/' + str(serial) + '/action'), post_data,
331 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
332 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
333 1ac3349d Kostas Papadimitriou
334 1ac3349d Kostas Papadimitriou
        reject_data = {'reject': ""}
335 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(accept_data)
336 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions/' + str(serial) + '/action'), post_data,
337 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
338 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 404)
339 1ac3349d Kostas Papadimitriou
340 1ac3349d Kostas Papadimitriou
        # force
341 1ac3349d Kostas Papadimitriou
        commission_request = {
342 1ac3349d Kostas Papadimitriou
            "force": True,
343 1ac3349d Kostas Papadimitriou
            "provisions": [
344 1ac3349d Kostas Papadimitriou
                {
345 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
346 1ac3349d Kostas Papadimitriou
                    "source": "system",
347 1ac3349d Kostas Papadimitriou
                    "resource": resource11['name'],
348 1ac3349d Kostas Papadimitriou
                    "quantity": 100
349 1ac3349d Kostas Papadimitriou
                }]}
350 1ac3349d Kostas Papadimitriou
351 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
352 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
353 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
354 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 201)
355 1ac3349d Kostas Papadimitriou
356 1ac3349d Kostas Papadimitriou
        commission_request = {
357 1ac3349d Kostas Papadimitriou
            "force": True,
358 1ac3349d Kostas Papadimitriou
            "provisions": [
359 1ac3349d Kostas Papadimitriou
                {
360 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
361 1ac3349d Kostas Papadimitriou
                    "source": "system",
362 1ac3349d Kostas Papadimitriou
                    "resource": resource11['name'],
363 1ac3349d Kostas Papadimitriou
                    "quantity": -200
364 1ac3349d Kostas Papadimitriou
                }]}
365 1ac3349d Kostas Papadimitriou
366 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
367 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
368 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
369 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 413)
370 1ac3349d Kostas Papadimitriou
371 1ac3349d Kostas Papadimitriou
        r = client.get(u('quotas'), **headers)
372 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
373 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
374 1ac3349d Kostas Papadimitriou
        system_quota = body['system']
375 1ac3349d Kostas Papadimitriou
        r11 = system_quota[resource11['name']]
376 1ac3349d Kostas Papadimitriou
        self.assertEqual(r11['usage'], 102)
377 1ac3349d Kostas Papadimitriou
        self.assertEqual(r11['pending'], 101)
378 7ac2131c Sofia Papagiannaki
379 7ac2131c Sofia Papagiannaki
380 7ac2131c Sofia Papagiannaki
class TokensApiTest(TestCase):
381 7ac2131c Sofia Papagiannaki
    def setUp(self):
382 ab7ca50a Sofia Papagiannaki
        backend = activation_backends.get_backend()
383 ab7ca50a Sofia Papagiannaki
384 ab7ca50a Sofia Papagiannaki
        self.user1 = AstakosUser.objects.create(
385 ab7ca50a Sofia Papagiannaki
            email='test1', email_verified=True, moderated=True,
386 ab7ca50a Sofia Papagiannaki
            is_rejected=False)
387 ab7ca50a Sofia Papagiannaki
        backend.activate_user(self.user1)
388 ab7ca50a Sofia Papagiannaki
        assert self.user1.is_active is True
389 ab7ca50a Sofia Papagiannaki
390 ab7ca50a Sofia Papagiannaki
        self.user2 = AstakosUser.objects.create(
391 ab7ca50a Sofia Papagiannaki
            email='test2', email_verified=True, moderated=True,
392 ab7ca50a Sofia Papagiannaki
            is_rejected=False)
393 ab7ca50a Sofia Papagiannaki
        backend.activate_user(self.user2)
394 ab7ca50a Sofia Papagiannaki
        assert self.user2.is_active is True
395 7ac2131c Sofia Papagiannaki
396 8cb96389 Sofia Papagiannaki
        c1 = Component(name='component1', url='http://localhost/component1')
397 8cb96389 Sofia Papagiannaki
        c1.save()
398 8cb96389 Sofia Papagiannaki
        s1 = Service(component=c1, type='type1', name='service1')
399 8cb96389 Sofia Papagiannaki
        s1.save()
400 8cb96389 Sofia Papagiannaki
        e1 = Endpoint(service=s1)
401 8cb96389 Sofia Papagiannaki
        e1.save()
402 8cb96389 Sofia Papagiannaki
        e1.data.create(key='versionId', value='v1.0')
403 8cb96389 Sofia Papagiannaki
        e1.data.create(key='publicURL', value='http://localhost:8000/s1/v1.0')
404 8cb96389 Sofia Papagiannaki
405 8cb96389 Sofia Papagiannaki
        s2 = Service(component=c1, type='type2', name='service2')
406 8cb96389 Sofia Papagiannaki
        s2.save()
407 8cb96389 Sofia Papagiannaki
        e2 = Endpoint(service=s2)
408 8cb96389 Sofia Papagiannaki
        e2.save()
409 8cb96389 Sofia Papagiannaki
        e2.data.create(key='versionId', value='v1.0')
410 8cb96389 Sofia Papagiannaki
        e2.data.create(key='publicURL', value='http://localhost:8000/s2/v1.0')
411 8cb96389 Sofia Papagiannaki
412 8cb96389 Sofia Papagiannaki
        c2 = Component(name='component2', url='http://localhost/component2')
413 8cb96389 Sofia Papagiannaki
        c2.save()
414 8cb96389 Sofia Papagiannaki
        s3 = Service(component=c2, type='type3', name='service3')
415 8cb96389 Sofia Papagiannaki
        s3.save()
416 8cb96389 Sofia Papagiannaki
        e3 = Endpoint(service=s3)
417 8cb96389 Sofia Papagiannaki
        e3.save()
418 8cb96389 Sofia Papagiannaki
        e3.data.create(key='versionId', value='v2.0')
419 8cb96389 Sofia Papagiannaki
        e3.data.create(key='publicURL', value='http://localhost:8000/s3/v2.0')
420 7ac2131c Sofia Papagiannaki
421 f870efe2 Sofia Papagiannaki
    def test_authenticate(self):
422 7ac2131c Sofia Papagiannaki
        client = Client()
423 7ac2131c Sofia Papagiannaki
424 f870efe2 Sofia Papagiannaki
        # Check not allowed method
425 8cb96389 Sofia Papagiannaki
        url = reverse('astakos.api.tokens.authenticate')
426 f870efe2 Sofia Papagiannaki
        r = client.get(url, post_data={})
427 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 400)
428 f870efe2 Sofia Papagiannaki
429 d29f0371 Sofia Papagiannaki
        # check public mode
430 d29f0371 Sofia Papagiannaki
        r = client.post(url, CONTENT_LENGTH=0)
431 d29f0371 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
432 d29f0371 Sofia Papagiannaki
        self.assertTrue(r['Content-Type'].startswith('application/json'))
433 d29f0371 Sofia Papagiannaki
        try:
434 d29f0371 Sofia Papagiannaki
            body = json.loads(r.content)
435 d29f0371 Sofia Papagiannaki
        except Exception, e:
436 d29f0371 Sofia Papagiannaki
            self.fail(e)
437 d29f0371 Sofia Papagiannaki
        self.assertTrue('token' not in body.get('access'))
438 d29f0371 Sofia Papagiannaki
        self.assertTrue('user' not in body.get('access'))
439 d29f0371 Sofia Papagiannaki
        self.assertTrue('serviceCatalog' in body.get('access'))
440 f870efe2 Sofia Papagiannaki
441 f870efe2 Sofia Papagiannaki
        # Check unsupported xml input
442 8cb96389 Sofia Papagiannaki
        url = reverse('astakos.api.tokens.authenticate')
443 f870efe2 Sofia Papagiannaki
        post_data = """
444 f870efe2 Sofia Papagiannaki
            <?xml version="1.0" encoding="UTF-8"?>
445 f870efe2 Sofia Papagiannaki
                <auth xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
446 f870efe2 Sofia Papagiannaki
                 xmlns="http://docs.openstack.org/identity/api/v2.0"
447 f870efe2 Sofia Papagiannaki
                 tenantName="%s">
448 f870efe2 Sofia Papagiannaki
                  <passwordCredentials username="%s" password="%s"/>
449 f870efe2 Sofia Papagiannaki
                </auth>""" % (self.user1.uuid, self.user1.uuid,
450 f870efe2 Sofia Papagiannaki
                              self.user1.auth_token)
451 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/xml')
452 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 400)
453 f870efe2 Sofia Papagiannaki
        body = json.loads(r.content)
454 f870efe2 Sofia Papagiannaki
        self.assertEqual(body['badRequest']['message'],
455 f870efe2 Sofia Papagiannaki
                         "Unsupported Content-type: 'application/xml'")
456 f870efe2 Sofia Papagiannaki
457 f870efe2 Sofia Papagiannaki
        # Check malformed request: missing password
458 8cb96389 Sofia Papagiannaki
        url = reverse('astakos.api.tokens.authenticate')
459 f870efe2 Sofia Papagiannaki
        post_data = """{"auth":{"passwordCredentials":{"username":"%s"},
460 f870efe2 Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
461 f870efe2 Sofia Papagiannaki
            self.user1.uuid, self.user1.uuid)
462 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
463 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 400)
464 f870efe2 Sofia Papagiannaki
        body = json.loads(r.content)
465 f870efe2 Sofia Papagiannaki
        self.assertEqual(body['badRequest']['message'],
466 f870efe2 Sofia Papagiannaki
                         'Malformed request')
467 f870efe2 Sofia Papagiannaki
468 f870efe2 Sofia Papagiannaki
        # Check malformed request: missing username
469 8cb96389 Sofia Papagiannaki
        url = reverse('astakos.api.tokens.authenticate')
470 f870efe2 Sofia Papagiannaki
        post_data = """{"auth":{"passwordCredentials":{"password":"%s"},
471 f870efe2 Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
472 f870efe2 Sofia Papagiannaki
            self.user1.auth_token, self.user1.uuid)
473 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
474 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 400)
475 f870efe2 Sofia Papagiannaki
        body = json.loads(r.content)
476 f870efe2 Sofia Papagiannaki
        self.assertEqual(body['badRequest']['message'],
477 f870efe2 Sofia Papagiannaki
                         'Malformed request')
478 f870efe2 Sofia Papagiannaki
479 f870efe2 Sofia Papagiannaki
        # Check invalid pass
480 8cb96389 Sofia Papagiannaki
        url = reverse('astakos.api.tokens.authenticate')
481 f870efe2 Sofia Papagiannaki
        post_data = """{"auth":{"passwordCredentials":{"username":"%s",
482 f870efe2 Sofia Papagiannaki
                                                       "password":"%s"},
483 f870efe2 Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
484 f870efe2 Sofia Papagiannaki
            self.user1.uuid, '', self.user1.uuid)
485 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
486 7ac2131c Sofia Papagiannaki
        self.assertEqual(r.status_code, 401)
487 f870efe2 Sofia Papagiannaki
        body = json.loads(r.content)
488 f870efe2 Sofia Papagiannaki
        self.assertEqual(body['unauthorized']['message'],
489 f870efe2 Sofia Papagiannaki
                         'Invalid token')
490 f870efe2 Sofia Papagiannaki
491 f870efe2 Sofia Papagiannaki
        # Check inconsistent pass
492 8cb96389 Sofia Papagiannaki
        url = reverse('astakos.api.tokens.authenticate')
493 f870efe2 Sofia Papagiannaki
        post_data = """{"auth":{"passwordCredentials":{"username":"%s",
494 f870efe2 Sofia Papagiannaki
                                                       "password":"%s"},
495 f870efe2 Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
496 49005665 Sofia Papagiannaki
            self.user1.uuid, self.user2.auth_token, self.user2.uuid)
497 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
498 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 401)
499 f870efe2 Sofia Papagiannaki
        body = json.loads(r.content)
500 f870efe2 Sofia Papagiannaki
        self.assertEqual(body['unauthorized']['message'],
501 f870efe2 Sofia Papagiannaki
                         'Invalid credentials')
502 f870efe2 Sofia Papagiannaki
503 f870efe2 Sofia Papagiannaki
        # Check invalid json data
504 8cb96389 Sofia Papagiannaki
        url = reverse('astakos.api.tokens.authenticate')
505 f870efe2 Sofia Papagiannaki
        r = client.post(url, "not json", content_type='application/json')
506 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 400)
507 f870efe2 Sofia Papagiannaki
        body = json.loads(r.content)
508 f870efe2 Sofia Papagiannaki
        self.assertEqual(body['badRequest']['message'], 'Invalid JSON data')
509 f870efe2 Sofia Papagiannaki
510 f870efe2 Sofia Papagiannaki
        # Check auth with token
511 8cb96389 Sofia Papagiannaki
        url = reverse('astakos.api.tokens.authenticate')
512 f870efe2 Sofia Papagiannaki
        post_data = """{"auth":{"token": {"id":"%s"},
513 f870efe2 Sofia Papagiannaki
                        "tenantName":"%s"}}""" % (
514 f870efe2 Sofia Papagiannaki
            self.user1.auth_token, self.user1.uuid)
515 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
516 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
517 f870efe2 Sofia Papagiannaki
        self.assertTrue(r['Content-Type'].startswith('application/json'))
518 f870efe2 Sofia Papagiannaki
        try:
519 f870efe2 Sofia Papagiannaki
            body = json.loads(r.content)
520 f870efe2 Sofia Papagiannaki
        except Exception, e:
521 f870efe2 Sofia Papagiannaki
            self.fail(e)
522 f870efe2 Sofia Papagiannaki
523 f870efe2 Sofia Papagiannaki
        # Check successful json response
524 8cb96389 Sofia Papagiannaki
        url = reverse('astakos.api.tokens.authenticate')
525 f870efe2 Sofia Papagiannaki
        post_data = """{"auth":{"passwordCredentials":{"username":"%s",
526 f870efe2 Sofia Papagiannaki
                                                       "password":"%s"},
527 f870efe2 Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
528 f870efe2 Sofia Papagiannaki
            self.user1.uuid, self.user1.auth_token, self.user1.uuid)
529 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
530 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
531 f870efe2 Sofia Papagiannaki
        self.assertTrue(r['Content-Type'].startswith('application/json'))
532 f870efe2 Sofia Papagiannaki
        try:
533 f870efe2 Sofia Papagiannaki
            body = json.loads(r.content)
534 f870efe2 Sofia Papagiannaki
        except Exception, e:
535 f870efe2 Sofia Papagiannaki
            self.fail(e)
536 f870efe2 Sofia Papagiannaki
537 f870efe2 Sofia Papagiannaki
        try:
538 8cb96389 Sofia Papagiannaki
            token = body['access']['token']['id']
539 8cb96389 Sofia Papagiannaki
            user = body['access']['user']['id']
540 8cb96389 Sofia Papagiannaki
            service_catalog = body['access']['serviceCatalog']
541 f870efe2 Sofia Papagiannaki
        except KeyError:
542 f870efe2 Sofia Papagiannaki
            self.fail('Invalid response')
543 f870efe2 Sofia Papagiannaki
544 f870efe2 Sofia Papagiannaki
        self.assertEqual(token, self.user1.auth_token)
545 f870efe2 Sofia Papagiannaki
        self.assertEqual(user, self.user1.uuid)
546 f870efe2 Sofia Papagiannaki
        self.assertEqual(len(service_catalog), 3)
547 f870efe2 Sofia Papagiannaki
548 f870efe2 Sofia Papagiannaki
        # Check successful xml response
549 8cb96389 Sofia Papagiannaki
        url = reverse('astakos.api.tokens.authenticate')
550 f870efe2 Sofia Papagiannaki
        headers = {'HTTP_ACCEPT': 'application/xml'}
551 f870efe2 Sofia Papagiannaki
        post_data = """{"auth":{"passwordCredentials":{"username":"%s",
552 f870efe2 Sofia Papagiannaki
                                                       "password":"%s"},
553 f870efe2 Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
554 f870efe2 Sofia Papagiannaki
            self.user1.uuid, self.user1.auth_token, self.user1.uuid)
555 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json',
556 f870efe2 Sofia Papagiannaki
                        **headers)
557 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
558 f870efe2 Sofia Papagiannaki
        self.assertTrue(r['Content-Type'].startswith('application/xml'))
559 49005665 Sofia Papagiannaki
#        try:
560 49005665 Sofia Papagiannaki
#            body = minidom.parseString(r.content)
561 49005665 Sofia Papagiannaki
#        except Exception, e:
562 49005665 Sofia Papagiannaki
#            self.fail(e)
563 d29f0371 Sofia Papagiannaki
564 d29f0371 Sofia Papagiannaki
        # test public mode: json response