Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / api / quotas.py @ 5afce44d

History | View | Annotate | Download (7.8 kB)

1 18f21257 Giorgos Korfiatis
# Copyright 2013 GRNET S.A. All rights reserved.
2 18f21257 Giorgos Korfiatis
#
3 18f21257 Giorgos Korfiatis
# Redistribution and use in source and binary forms, with or
4 18f21257 Giorgos Korfiatis
# without modification, are permitted provided that the following
5 18f21257 Giorgos Korfiatis
# conditions are met:
6 18f21257 Giorgos Korfiatis
#
7 18f21257 Giorgos Korfiatis
#   1. Redistributions of source code must retain the above
8 18f21257 Giorgos Korfiatis
#      copyright notice, this list of conditions and the following
9 18f21257 Giorgos Korfiatis
#      disclaimer.
10 18f21257 Giorgos Korfiatis
#
11 18f21257 Giorgos Korfiatis
#   2. Redistributions in binary form must reproduce the above
12 18f21257 Giorgos Korfiatis
#      copyright notice, this list of conditions and the following
13 18f21257 Giorgos Korfiatis
#      disclaimer in the documentation and/or other materials
14 18f21257 Giorgos Korfiatis
#      provided with the distribution.
15 18f21257 Giorgos Korfiatis
#
16 18f21257 Giorgos Korfiatis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 18f21257 Giorgos Korfiatis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 18f21257 Giorgos Korfiatis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 18f21257 Giorgos Korfiatis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 18f21257 Giorgos Korfiatis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 18f21257 Giorgos Korfiatis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 18f21257 Giorgos Korfiatis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 18f21257 Giorgos Korfiatis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 18f21257 Giorgos Korfiatis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 18f21257 Giorgos Korfiatis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 18f21257 Giorgos Korfiatis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 18f21257 Giorgos Korfiatis
# POSSIBILITY OF SUCH DAMAGE.
28 18f21257 Giorgos Korfiatis
#
29 18f21257 Giorgos Korfiatis
# The views and conclusions contained in the software and
30 18f21257 Giorgos Korfiatis
# documentation are those of the authors and should not be
31 18f21257 Giorgos Korfiatis
# interpreted as representing official policies, either expressed
32 18f21257 Giorgos Korfiatis
# or implied, of GRNET S.A.
33 18f21257 Giorgos Korfiatis
34 18f21257 Giorgos Korfiatis
from django.utils import simplejson as json
35 18f21257 Giorgos Korfiatis
from django.views.decorators.csrf import csrf_exempt
36 18f21257 Giorgos Korfiatis
from django.http import HttpResponse
37 18f21257 Giorgos Korfiatis
38 b830f774 Giorgos Korfiatis
from snf_django.lib.db.transaction import commit_on_success_strict
39 18f21257 Giorgos Korfiatis
from astakos.api.util import json_response
40 befa5997 Giorgos Korfiatis
41 befa5997 Giorgos Korfiatis
from snf_django.lib import api
42 befa5997 Giorgos Korfiatis
from snf_django.lib.api.faults import BadRequest, InternalServerError
43 befa5997 Giorgos Korfiatis
44 1028e568 Giorgos Korfiatis
from astakos.im.api import api_method as generic_api_method
45 befa5997 Giorgos Korfiatis
from astakos.im.api.user import user_from_token
46 befa5997 Giorgos Korfiatis
from astakos.im.api.service import service_from_token
47 befa5997 Giorgos Korfiatis
48 bb005bc2 Giorgos Korfiatis
from astakos.im.quotas import (get_user_quotas, get_resources,
49 bb005bc2 Giorgos Korfiatis
                               get_service_quotas)
50 18f21257 Giorgos Korfiatis
51 18f21257 Giorgos Korfiatis
import astakos.quotaholder.exception as qh_exception
52 18f21257 Giorgos Korfiatis
from astakos.quotaholder.callpoint import QuotaholderDjangoDBCallpoint
53 18f21257 Giorgos Korfiatis
qh = QuotaholderDjangoDBCallpoint()
54 18f21257 Giorgos Korfiatis
55 18f21257 Giorgos Korfiatis
56 befa5997 Giorgos Korfiatis
@api.api_method(http_method='GET', token_required=True, user_required=False)
57 befa5997 Giorgos Korfiatis
@user_from_token
58 18f21257 Giorgos Korfiatis
def quotas(request, user=None):
59 18f21257 Giorgos Korfiatis
    result = get_user_quotas(user)
60 18f21257 Giorgos Korfiatis
    return json_response(result)
61 18f21257 Giorgos Korfiatis
62 18f21257 Giorgos Korfiatis
63 bb005bc2 Giorgos Korfiatis
@api.api_method(http_method='GET', token_required=True, user_required=False)
64 bb005bc2 Giorgos Korfiatis
@service_from_token
65 bb005bc2 Giorgos Korfiatis
def service_quotas(request):
66 5afce44d Giorgos Korfiatis
    user = request.GET.get('user')
67 5afce44d Giorgos Korfiatis
    users = [user] if user is not None else None
68 5afce44d Giorgos Korfiatis
    result = get_service_quotas(request.service_instance, users=users)
69 bb005bc2 Giorgos Korfiatis
    return json_response(result)
70 bb005bc2 Giorgos Korfiatis
71 bb005bc2 Giorgos Korfiatis
72 befa5997 Giorgos Korfiatis
@api.api_method(http_method='GET', token_required=False, user_required=False)
73 1028e568 Giorgos Korfiatis
def resources(request):
74 1028e568 Giorgos Korfiatis
    result = get_resources()
75 1028e568 Giorgos Korfiatis
    return json_response(result)
76 1028e568 Giorgos Korfiatis
77 1028e568 Giorgos Korfiatis
78 18f21257 Giorgos Korfiatis
@csrf_exempt
79 18f21257 Giorgos Korfiatis
def commissions(request):
80 18f21257 Giorgos Korfiatis
    method = request.method
81 18f21257 Giorgos Korfiatis
    if method == 'GET':
82 18f21257 Giorgos Korfiatis
        return get_pending_commissions(request)
83 18f21257 Giorgos Korfiatis
    elif method == 'POST':
84 18f21257 Giorgos Korfiatis
        return issue_commission(request)
85 18f21257 Giorgos Korfiatis
    else:
86 18f21257 Giorgos Korfiatis
        raise BadRequest('Method not allowed.')
87 18f21257 Giorgos Korfiatis
88 18f21257 Giorgos Korfiatis
89 befa5997 Giorgos Korfiatis
@api.api_method(http_method='GET', token_required=True, user_required=False)
90 befa5997 Giorgos Korfiatis
@service_from_token
91 18f21257 Giorgos Korfiatis
def get_pending_commissions(request):
92 18f21257 Giorgos Korfiatis
    data = request.GET
93 a4398c8c Giorgos Korfiatis
    client_key = str(request.service_instance)
94 18f21257 Giorgos Korfiatis
95 18f21257 Giorgos Korfiatis
    result = qh.get_pending_commissions(clientkey=client_key)
96 18f21257 Giorgos Korfiatis
    return json_response(result)
97 18f21257 Giorgos Korfiatis
98 18f21257 Giorgos Korfiatis
99 18f21257 Giorgos Korfiatis
@csrf_exempt
100 befa5997 Giorgos Korfiatis
@api.api_method(http_method='POST', token_required=True, user_required=False)
101 befa5997 Giorgos Korfiatis
@service_from_token
102 18f21257 Giorgos Korfiatis
def issue_commission(request):
103 18f21257 Giorgos Korfiatis
    data = request.raw_post_data
104 18f21257 Giorgos Korfiatis
    input_data = json.loads(data)
105 18f21257 Giorgos Korfiatis
106 a4398c8c Giorgos Korfiatis
    client_key = str(request.service_instance)
107 18f21257 Giorgos Korfiatis
    provisions = input_data['provisions']
108 18f21257 Giorgos Korfiatis
    force = input_data.get('force', False)
109 18f21257 Giorgos Korfiatis
    auto_accept = input_data.get('auto_accept', False)
110 18f21257 Giorgos Korfiatis
111 18f21257 Giorgos Korfiatis
    try:
112 18f21257 Giorgos Korfiatis
        result = _issue_commission(clientkey=client_key,
113 18f21257 Giorgos Korfiatis
                                   provisions=provisions,
114 18f21257 Giorgos Korfiatis
                                   force=force,
115 18f21257 Giorgos Korfiatis
                                   accept=auto_accept)
116 18f21257 Giorgos Korfiatis
        data = {"serial": result}
117 18f21257 Giorgos Korfiatis
        status_code = 201
118 18f21257 Giorgos Korfiatis
    except (qh_exception.NoCapacityError,
119 18f21257 Giorgos Korfiatis
            qh_exception.NoQuantityError) as e:
120 18f21257 Giorgos Korfiatis
        status_code = 413
121 18f21257 Giorgos Korfiatis
        body = {"message": e.message,
122 18f21257 Giorgos Korfiatis
                "code": status_code,
123 18f21257 Giorgos Korfiatis
                "data": e.data,
124 18f21257 Giorgos Korfiatis
                }
125 18f21257 Giorgos Korfiatis
        data = {"overLimit": body}
126 18f21257 Giorgos Korfiatis
    except qh_exception.NoHoldingError as e:
127 18f21257 Giorgos Korfiatis
        status_code = 404
128 18f21257 Giorgos Korfiatis
        body = {"message": e.message,
129 18f21257 Giorgos Korfiatis
                "code": status_code,
130 18f21257 Giorgos Korfiatis
                "data": e.data,
131 18f21257 Giorgos Korfiatis
                }
132 18f21257 Giorgos Korfiatis
        data = {"itemNotFound": body}
133 18f21257 Giorgos Korfiatis
    except qh_exception.InvalidDataError as e:
134 18f21257 Giorgos Korfiatis
        status_code = 400
135 18f21257 Giorgos Korfiatis
        body = {"message": e.message,
136 18f21257 Giorgos Korfiatis
                "code": status_code,
137 18f21257 Giorgos Korfiatis
                }
138 18f21257 Giorgos Korfiatis
        data = {"badRequest": body}
139 18f21257 Giorgos Korfiatis
140 18f21257 Giorgos Korfiatis
    return json_response(data, status_code=status_code)
141 18f21257 Giorgos Korfiatis
142 18f21257 Giorgos Korfiatis
143 18f21257 Giorgos Korfiatis
@commit_on_success_strict()
144 18f21257 Giorgos Korfiatis
def _issue_commission(clientkey, provisions, force, accept):
145 18f21257 Giorgos Korfiatis
    serial = qh.issue_commission(clientkey=clientkey,
146 18f21257 Giorgos Korfiatis
                                 provisions=provisions,
147 18f21257 Giorgos Korfiatis
                                 force=force)
148 18f21257 Giorgos Korfiatis
    if accept:
149 18f21257 Giorgos Korfiatis
        done = qh.accept_commission(clientkey=clientkey,
150 18f21257 Giorgos Korfiatis
                                    serial=serial)
151 18f21257 Giorgos Korfiatis
152 18f21257 Giorgos Korfiatis
    return serial
153 18f21257 Giorgos Korfiatis
154 18f21257 Giorgos Korfiatis
155 6c0f4562 Giorgos Korfiatis
def notFoundCF(serial):
156 6c0f4562 Giorgos Korfiatis
    body = {"code": 404,
157 6c0f4562 Giorgos Korfiatis
            "message": "serial %s does not exist" % serial,
158 6c0f4562 Giorgos Korfiatis
            }
159 6c0f4562 Giorgos Korfiatis
    return {"itemNotFound": body}
160 6c0f4562 Giorgos Korfiatis
161 6c0f4562 Giorgos Korfiatis
162 6c0f4562 Giorgos Korfiatis
def conflictingCF(serial):
163 6c0f4562 Giorgos Korfiatis
    body = {"code": 400,
164 6c0f4562 Giorgos Korfiatis
            "message": "cannot both accept and reject serial %s" % serial,
165 6c0f4562 Giorgos Korfiatis
            }
166 6c0f4562 Giorgos Korfiatis
    return {"badRequest": body}
167 18f21257 Giorgos Korfiatis
168 18f21257 Giorgos Korfiatis
169 18f21257 Giorgos Korfiatis
@csrf_exempt
170 befa5997 Giorgos Korfiatis
@api.api_method(http_method='POST', token_required=True, user_required=False)
171 befa5997 Giorgos Korfiatis
@service_from_token
172 18f21257 Giorgos Korfiatis
@commit_on_success_strict()
173 18f21257 Giorgos Korfiatis
def resolve_pending_commissions(request):
174 18f21257 Giorgos Korfiatis
    data = request.raw_post_data
175 18f21257 Giorgos Korfiatis
    input_data = json.loads(data)
176 18f21257 Giorgos Korfiatis
177 a4398c8c Giorgos Korfiatis
    client_key = str(request.service_instance)
178 18f21257 Giorgos Korfiatis
    accept = input_data.get('accept', [])
179 18f21257 Giorgos Korfiatis
    reject = input_data.get('reject', [])
180 18f21257 Giorgos Korfiatis
181 18f21257 Giorgos Korfiatis
    result = qh.resolve_pending_commissions(clientkey=client_key,
182 18f21257 Giorgos Korfiatis
                                            accept_set=accept,
183 18f21257 Giorgos Korfiatis
                                            reject_set=reject)
184 6c0f4562 Giorgos Korfiatis
    accepted, rejected, notFound, conflicting = result
185 6c0f4562 Giorgos Korfiatis
    notFound = [(serial, notFoundCF(serial)) for serial in notFound]
186 6c0f4562 Giorgos Korfiatis
    conflicting = [(serial, conflictingCF(serial)) for serial in conflicting]
187 6c0f4562 Giorgos Korfiatis
    cloudfaults = notFound + conflicting
188 18f21257 Giorgos Korfiatis
    data = {'accepted': accepted,
189 18f21257 Giorgos Korfiatis
            'rejected': rejected,
190 18f21257 Giorgos Korfiatis
            'failed': cloudfaults
191 18f21257 Giorgos Korfiatis
            }
192 18f21257 Giorgos Korfiatis
193 18f21257 Giorgos Korfiatis
    return json_response(data)
194 18f21257 Giorgos Korfiatis
195 18f21257 Giorgos Korfiatis
196 befa5997 Giorgos Korfiatis
@api.api_method(http_method='GET', token_required=True, user_required=False)
197 befa5997 Giorgos Korfiatis
@service_from_token
198 18f21257 Giorgos Korfiatis
def get_commission(request, serial):
199 18f21257 Giorgos Korfiatis
    data = request.GET
200 a4398c8c Giorgos Korfiatis
    client_key = str(request.service_instance)
201 18f21257 Giorgos Korfiatis
    serial = int(serial)
202 18f21257 Giorgos Korfiatis
203 18f21257 Giorgos Korfiatis
    try:
204 18f21257 Giorgos Korfiatis
        data = qh.get_commission(clientkey=client_key,
205 18f21257 Giorgos Korfiatis
                                 serial=serial)
206 18f21257 Giorgos Korfiatis
        status_code = 200
207 18f21257 Giorgos Korfiatis
        return json_response(data, status_code)
208 18f21257 Giorgos Korfiatis
    except qh_exception.NoCommissionError as e:
209 18f21257 Giorgos Korfiatis
        return HttpResponse(status=404)
210 18f21257 Giorgos Korfiatis
211 18f21257 Giorgos Korfiatis
212 18f21257 Giorgos Korfiatis
@csrf_exempt
213 befa5997 Giorgos Korfiatis
@api.api_method(http_method='POST', token_required=True, user_required=False)
214 befa5997 Giorgos Korfiatis
@service_from_token
215 18f21257 Giorgos Korfiatis
@commit_on_success_strict()
216 18f21257 Giorgos Korfiatis
def serial_action(request, serial):
217 18f21257 Giorgos Korfiatis
    data = request.raw_post_data
218 18f21257 Giorgos Korfiatis
    input_data = json.loads(data)
219 18f21257 Giorgos Korfiatis
    serial = int(serial)
220 18f21257 Giorgos Korfiatis
221 a4398c8c Giorgos Korfiatis
    client_key = str(request.service_instance)
222 18f21257 Giorgos Korfiatis
223 18f21257 Giorgos Korfiatis
    accept = 'accept' in input_data
224 18f21257 Giorgos Korfiatis
    reject = 'reject' in input_data
225 18f21257 Giorgos Korfiatis
226 18f21257 Giorgos Korfiatis
    if accept == reject:
227 18f21257 Giorgos Korfiatis
        raise BadRequest('Specify either accept or reject action.')
228 18f21257 Giorgos Korfiatis
229 6c0f4562 Giorgos Korfiatis
    result = qh.resolve_pending_commission(clientkey=client_key,
230 6c0f4562 Giorgos Korfiatis
                                           serial=serial,
231 6c0f4562 Giorgos Korfiatis
                                           accept=accept)
232 18f21257 Giorgos Korfiatis
    response = HttpResponse()
233 18f21257 Giorgos Korfiatis
    if not result:
234 18f21257 Giorgos Korfiatis
        response.status_code = 404
235 18f21257 Giorgos Korfiatis
236 18f21257 Giorgos Korfiatis
    return response