Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / api / versions.py @ f6ff4b40

History | View | Annotate | Download (4.2 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 datetime import datetime
35
from logging import getLogger
36

    
37
from django.conf import settings
38
from django.http import HttpResponse
39
from django.template.loader import render_to_string
40
from django.utils import simplejson as json
41

    
42
from synnefo.api.util import api_method, isoformat
43

    
44

    
45
log = getLogger('synnefo.api')
46

    
47

    
48
VERSION_1_1 = {
49
    'id': 'v1.1',
50
    'status': 'CURRENT',
51
    'updated': '2011-04-01',
52
    'links': [
53
        {
54
            'rel': 'self',
55
            'href': settings.API_ROOT_URL,
56
        }
57
    ]
58
}
59

    
60
VERSIONS = [VERSION_1_1]
61

    
62
MEDIA_TYPES = [
63
    {'base': 'application/xml', 'type': 'application/vnd.openstack.compute-v1.1+xml'},
64
    {'base': 'application/json', 'type': 'application/vnd.openstack.compute-v1.1+json'}
65
]
66

    
67
DESCRIBED_BY = [
68
    {
69
        'rel' : 'describedby',
70
        'type' : 'application/pdf',
71
        'href' : 'http://docs.rackspacecloud.com/servers/api/v1.1/cs-devguide-20110125.pdf'
72
    },
73
    {
74
        'rel' : 'describedby',
75
        'type' : 'application/vnd.sun.wadl+xml',
76
        'href' : 'http://docs.rackspacecloud.com/servers/api/v1.1/application.wadl'
77
    }
78
]
79

    
80
@api_method('GET', atom_allowed=True)
81
def versions_list(request):
82
    # Normal Response Codes: 200, 203
83
    # Error Response Codes: 400, 413, 500, 503
84

    
85
    if request.serialization == 'xml':
86
        data = render_to_string('versions_list.xml', {'versions': VERSIONS})
87
    elif request.serialization == 'atom':
88
        now = isoformat(datetime.now())
89
        data = render_to_string('versions_list.atom', {'now': now,'versions': VERSIONS})
90
    else:
91
        data = json.dumps({'versions': {'values': VERSIONS}})
92

    
93
    return HttpResponse(data)
94

    
95
@api_method('GET', atom_allowed=True)
96
def version_details(request, api_version):
97
    # Normal Response Codes: 200, 203
98
    # Error Response Codes: computeFault (400, 500),
99
    #                       serviceUnavailable (503),
100
    #                       unauthorized (401),
101
    #                       badRequest (400),
102
    #                       overLimit(413)
103

    
104
    log.debug('version_details %s', api_version)
105
    # We hardcode to v1.1 since it is the only one we support
106
    version = VERSION_1_1.copy()
107
    version['links'] = version['links'] + DESCRIBED_BY
108

    
109
    if request.serialization == 'xml':
110
        version['media_types'] = MEDIA_TYPES
111
        data = render_to_string('version_details.xml', {'version': version})
112
    elif request.serialization == 'atom':
113
        version['media_types'] = MEDIA_TYPES
114
        now = isoformat(datetime.now())
115
        data = render_to_string('version_details.atom', {'now': now,'version': version})
116
    else:
117
        version['media-types'] = MEDIA_TYPES
118
        data = json.dumps({'version': version})
119
    return HttpResponse(data)