~allanlesage/uci-engine/coverage-extractor

« back to all changes in this revision

Viewing changes to gatekeeper/gatekeeper/resources/v1.py

  • Committer: Celso Providelo
  • Date: 2014-04-25 12:34:29 UTC
  • mto: (450.1.2 uci-engine-gatekeeper)
  • mto: This revision was merged to the branch mainline in revision 456.
  • Revision ID: celso.providelo@canonical.com-20140425123429-qcmfjm9wyptol4xi
Including gatekeeper component

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- coding: utf-8 -*-
 
2
"""Restish v1 API."""
 
3
from __future__ import unicode_literals
 
4
 
 
5
from restish import (
 
6
    http,
 
7
    resource,
 
8
    )
 
9
 
 
10
from gatekeeper.resources import GatekeeperResource
 
11
 
 
12
 
 
13
class SandboxAPI(GatekeeperResource):
 
14
    """Sandbox API
 
15
 
 
16
    - GET '' -> list sandbox objects
 
17
    - DELETE '' -> delete sandbox and its contents
 
18
    - GET '{object_name}' -> returns a tempurl for downloading the object
 
19
    - PUT '{object_name}' -> returns a tempurl for uploading the object
 
20
    """
 
21
 
 
22
    def __init__(self, identifier):
 
23
        super(SandboxAPI, self).__init__()
 
24
        self.identifier = identifier
 
25
 
 
26
    def _render_response(self, payload):
 
27
        headers = [
 
28
            (b'Content-Type', b'text/plain')
 
29
        ]
 
30
        return http.ok(headers, str(payload))
 
31
 
 
32
    @resource.GET()
 
33
    def contents(self, request):
 
34
        sandbox = self.datastore.get_sandbox(self.identifier)
 
35
        objects = [o.title for o in sandbox.objects]
 
36
        return self._render_response('\n'.join(objects))
 
37
 
 
38
    @resource.DELETE()
 
39
    def drop(self, request):
 
40
        sandbox = self.datastore.get_sandbox(self.identifier)
 
41
        sandbox.drop()
 
42
        self.logger.info(
 
43
            'Sandbox {} deleted.'.format(sandbox.identifier))
 
44
        return self._render_response('')
 
45
 
 
46
    def _get_temp_url(self, object_name, method):
 
47
        sandbox = self.datastore.get_sandbox(self.identifier)
 
48
        temp_url = sandbox.get_temp_url(object_name, method)
 
49
        return self._render_response(temp_url)
 
50
 
 
51
    @resource.child('{object_name}')
 
52
    def object_wrapper(self, request, segments, object_name):
 
53
        allow = ['GET', 'PUT']
 
54
        if request.method not in allow:
 
55
            return http.method_not_allowed(allow)
 
56
        return self._get_temp_url(object_name, request.method)
 
57
 
 
58
 
 
59
class API(GatekeeperResource):
 
60
    """Base Sandbox API provider.
 
61
 
 
62
    - GET '' -> greeting message
 
63
    - POST '' -> creates a sandbox
 
64
    - 'sandbox/{identifier}' -> traverse to `SandboxAPI`
 
65
    """
 
66
 
 
67
    PATH = '/api/v1'
 
68
    GREETINGS = b'CI-Airline gatekeeper.\n'
 
69
 
 
70
    @resource.child('')
 
71
    def root(self, request, segments):
 
72
        allow = ['GET', 'POST']
 
73
        if request.method not in allow:
 
74
            return http.method_not_allowed(allow)
 
75
        headers = [
 
76
            (b'Content-Type', b'text/plain'),
 
77
        ]
 
78
        if request.method == 'GET':
 
79
            return http.ok(headers, self.GREETINGS)
 
80
        sandbox = self.datastore.create_sandbox()
 
81
        location = b'{}/sandbox/{}'.format(self.PATH, sandbox.identifier)
 
82
        self.logger.info('Sandbox {} created.'.format(location))
 
83
        return http.created(location, headers, location)
 
84
 
 
85
    @resource.child('sandbox/{sandbox_identifier}')
 
86
    def object_wrapper(self, request, segments, sandbox_identifier):
 
87
        return SandboxAPI(sandbox_identifier)