Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / api / delegate.py @ eec66d97

History | View | Annotate | Download (4 kB)

1 e440e835 Christos Stavrakakis
# Copyright 2011, 2012, 2013 GRNET S.A. All rights reserved.
2 11bb4341 Kostas Papadimitriou
#
3 11bb4341 Kostas Papadimitriou
# Redistribution and use in source and binary forms, with or
4 11bb4341 Kostas Papadimitriou
# without modification, are permitted provided that the following
5 11bb4341 Kostas Papadimitriou
# conditions are met:
6 11bb4341 Kostas Papadimitriou
#
7 11bb4341 Kostas Papadimitriou
#   1. Redistributions of source code must retain the above
8 11bb4341 Kostas Papadimitriou
#      copyright notice, this list of conditions and the following
9 11bb4341 Kostas Papadimitriou
#      disclaimer.
10 11bb4341 Kostas Papadimitriou
#
11 11bb4341 Kostas Papadimitriou
#   2. Redistributions in binary form must reproduce the above
12 11bb4341 Kostas Papadimitriou
#      copyright notice, this list of conditions and the following
13 11bb4341 Kostas Papadimitriou
#      disclaimer in the documentation and/or other materials
14 11bb4341 Kostas Papadimitriou
#      provided with the distribution.
15 11bb4341 Kostas Papadimitriou
#
16 11bb4341 Kostas Papadimitriou
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 11bb4341 Kostas Papadimitriou
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 11bb4341 Kostas Papadimitriou
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 11bb4341 Kostas Papadimitriou
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 11bb4341 Kostas Papadimitriou
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 11bb4341 Kostas Papadimitriou
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 11bb4341 Kostas Papadimitriou
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 11bb4341 Kostas Papadimitriou
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 11bb4341 Kostas Papadimitriou
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 11bb4341 Kostas Papadimitriou
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 11bb4341 Kostas Papadimitriou
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 11bb4341 Kostas Papadimitriou
# POSSIBILITY OF SUCH DAMAGE.
28 11bb4341 Kostas Papadimitriou
#
29 11bb4341 Kostas Papadimitriou
# The views and conclusions contained in the software and
30 11bb4341 Kostas Papadimitriou
# documentation are those of the authors and should not be
31 11bb4341 Kostas Papadimitriou
# interpreted as representing official policies, either expressed
32 11bb4341 Kostas Papadimitriou
# or implied, of GRNET S.A.
33 11bb4341 Kostas Papadimitriou
34 11bb4341 Kostas Papadimitriou
import logging
35 11bb4341 Kostas Papadimitriou
36 2c2ccd2d Giorgos Korfiatis
import urlparse
37 e440e835 Christos Stavrakakis
from django.http import HttpResponse
38 11bb4341 Kostas Papadimitriou
from django.views.decorators.csrf import csrf_exempt
39 11bb4341 Kostas Papadimitriou
40 11bb4341 Kostas Papadimitriou
from django.conf import settings
41 11bb4341 Kostas Papadimitriou
42 d2c9adac Christos Stavrakakis
from synnefo.lib import join_urls
43 d2c9adac Christos Stavrakakis
44 6e27e449 Christos Stavrakakis
ASTAKOS_URL = getattr(settings, 'ASTAKOS_URL', None)
45 d2c9adac Christos Stavrakakis
USER_QUOTA_URL = join_urls(ASTAKOS_URL, "astakos/api/quotas")
46 d2c9adac Christos Stavrakakis
RESOURCES_URL = join_urls(ASTAKOS_URL, "astakos/api/resources")
47 d2c9adac Christos Stavrakakis
USER_CATALOG_URL = join_urls(ASTAKOS_URL, "astakos/api/user_catalogs")
48 d2c9adac Christos Stavrakakis
USER_FEEDBACK_URL = join_urls(ASTAKOS_URL, "astakos/api/feedback")
49 11bb4341 Kostas Papadimitriou
50 1a736ca8 Christos Stavrakakis
from objpool.http import PooledHTTPConnection
51 11bb4341 Kostas Papadimitriou
52 11bb4341 Kostas Papadimitriou
logger = logging.getLogger(__name__)
53 11bb4341 Kostas Papadimitriou
54 11bb4341 Kostas Papadimitriou
55 11bb4341 Kostas Papadimitriou
def proxy(request, url, headers={}, body=None):
56 2c2ccd2d Giorgos Korfiatis
    p = urlparse.urlparse(url)
57 11bb4341 Kostas Papadimitriou
58 11bb4341 Kostas Papadimitriou
    kwargs = {}
59 11bb4341 Kostas Papadimitriou
    kwargs['headers'] = headers
60 11bb4341 Kostas Papadimitriou
    kwargs['headers'].update(request.META)
61 11bb4341 Kostas Papadimitriou
    kwargs['body'] = body
62 11bb4341 Kostas Papadimitriou
    kwargs['headers'].setdefault('content-type', 'application/json')
63 11bb4341 Kostas Papadimitriou
    kwargs['headers'].setdefault('content-length', len(body) if body else 0)
64 11bb4341 Kostas Papadimitriou
65 4ab1af1a Georgios D. Tsoukalas
    with PooledHTTPConnection(p.netloc, p.scheme) as conn:
66 11bb4341 Kostas Papadimitriou
        conn.request(request.method, p.path + '?' + p.query, **kwargs)
67 11bb4341 Kostas Papadimitriou
        response = conn.getresponse()
68 11bb4341 Kostas Papadimitriou
        length = response.getheader('content-length', None)
69 11bb4341 Kostas Papadimitriou
        data = response.read(length)
70 11bb4341 Kostas Papadimitriou
        status = int(response.status)
71 11bb4341 Kostas Papadimitriou
        return HttpResponse(data, status=status)
72 11bb4341 Kostas Papadimitriou
73 e440e835 Christos Stavrakakis
74 11bb4341 Kostas Papadimitriou
@csrf_exempt
75 426e1fb9 Kostas Papadimitriou
def delegate_to_resources_service(request):
76 426e1fb9 Kostas Papadimitriou
    logger.debug("Delegate resources request to %s" % RESOURCES_URL)
77 426e1fb9 Kostas Papadimitriou
    token = request.META.get('HTTP_X_AUTH_TOKEN')
78 426e1fb9 Kostas Papadimitriou
    headers = {'X-Auth-Token': token}
79 426e1fb9 Kostas Papadimitriou
    return proxy(request, RESOURCES_URL, headers=headers,
80 426e1fb9 Kostas Papadimitriou
                 body=request.raw_post_data)
81 426e1fb9 Kostas Papadimitriou
82 426e1fb9 Kostas Papadimitriou
83 426e1fb9 Kostas Papadimitriou
@csrf_exempt
84 426e1fb9 Kostas Papadimitriou
def delegate_to_user_quota_service(request):
85 426e1fb9 Kostas Papadimitriou
    logger.debug("Delegate quotas request to %s" % USER_QUOTA_URL)
86 426e1fb9 Kostas Papadimitriou
    token = request.META.get('HTTP_X_AUTH_TOKEN')
87 426e1fb9 Kostas Papadimitriou
    headers = {'X-Auth-Token': token}
88 426e1fb9 Kostas Papadimitriou
    return proxy(request, USER_QUOTA_URL, headers=headers,
89 426e1fb9 Kostas Papadimitriou
                 body=request.raw_post_data)
90 426e1fb9 Kostas Papadimitriou
91 426e1fb9 Kostas Papadimitriou
92 426e1fb9 Kostas Papadimitriou
@csrf_exempt
93 11bb4341 Kostas Papadimitriou
def delegate_to_feedback_service(request):
94 5af5920c Kostas Papadimitriou
    logger.debug("Delegate feedback request to %s" % USER_FEEDBACK_URL)
95 11bb4341 Kostas Papadimitriou
    token = request.META.get('HTTP_X_AUTH_TOKEN')
96 11bb4341 Kostas Papadimitriou
    headers = {'X-Auth-Token': token}
97 e440e835 Christos Stavrakakis
    return proxy(request, USER_FEEDBACK_URL, headers=headers,
98 e440e835 Christos Stavrakakis
                 body=request.raw_post_data)
99 e440e835 Christos Stavrakakis
100 11bb4341 Kostas Papadimitriou
101 11bb4341 Kostas Papadimitriou
@csrf_exempt
102 11bb4341 Kostas Papadimitriou
def delegate_to_user_catalogs_service(request):
103 11bb4341 Kostas Papadimitriou
    token = request.META.get('HTTP_X_AUTH_TOKEN')
104 11bb4341 Kostas Papadimitriou
    headers = {'X-Auth-Token': token, 'content-type': 'application/json'}
105 e440e835 Christos Stavrakakis
    return proxy(request, USER_CATALOG_URL, headers=headers,
106 e440e835 Christos Stavrakakis
                 body=request.raw_post_data)