Statistics
| Branch: | Tag: | Revision:

root / api / images.py @ 29a59bc1

History | View | Annotate | Download (5.1 kB)

1
#
2
# Copyright (c) 2010 Greek Research and Technology Network
3
#
4

    
5
from synnefo.api.util import *
6
from synnefo.db.models import Image
7

    
8
from django.conf.urls.defaults import *
9
from django.http import HttpResponse
10
from django.template.loader import render_to_string
11
from django.utils import simplejson as json
12

    
13

    
14
urlpatterns = patterns('synnefo.api.images',
15
    (r'^(?:/|.json|.xml)?$', 'demux'),
16
    (r'^/detail(?:.json|.xml)?$', 'list_images', {'detail': True}),
17
    (r'^/(\d+)(?:.json|.xml)?$', 'image_demux'),
18
)
19

    
20
def demux(request):
21
    if request.method == 'GET':
22
        return list_images(request)
23
    elif request.method == 'POST':
24
        return create_image(request)
25
    else:
26
        fault = BadRequest()
27
        return render_fault(request, fault)
28

    
29
def image_demux(request, image_id):
30
    if request.method == 'GET':
31
        return get_image_details(request, image_id)
32
    elif request.method == 'DELETE':
33
        return delete_image(request, image_id)
34
    else:
35
        fault = BadRequest()
36
        return render_fault(request, fault)
37

    
38

    
39
def image_to_dict(image, detail=True):
40
    d = {'id': image.id, 'name': image.name}
41
    if detail:
42
        d['updated'] = image.updated.isoformat()
43
        d['created'] = image.created.isoformat()
44
        d['status'] = image.state
45
        d['progress'] = 100 if image.state == 'ACTIVE' else 0
46
        d['description'] = image.description
47
        if image.sourcevm:
48
            d['serverRef'] = image.sourcevm.id
49
        
50
        metadata = {}
51
        for meta in ImageMetadata.objects.filter(image=image):
52
            metadata[meta.meta_key] = meta.meta_value
53
        
54
        if metadata:
55
            d['metadata'] = {'values': metadata}
56
    
57
    return d
58

    
59

    
60
@api_method('GET')
61
def list_images(request, detail=False):
62
    # Normal Response Codes: 200, 203
63
    # Error Response Codes: computeFault (400, 500),
64
    #                       serviceUnavailable (503),
65
    #                       unauthorized (401),
66
    #                       badRequest (400),
67
    #                       overLimit (413)
68
    
69
    all_images = Image.objects.all()
70
    images = [image_to_dict(image, detail) for image in all_images]
71
    
72
    if request.type == 'xml':
73
        mimetype = 'application/xml'
74
        data = render_to_string('list_images.xml', {'images': images, 'detail': detail})
75
    else:
76
        mimetype = 'application/json'
77
        data = json.dumps({'images': {'values': images}})
78
    
79
    return HttpResponse(data, mimetype=mimetype, status=200)
80

    
81
@api_method('POST')
82
def create_image(request):
83
    # Normal Response Code: 202
84
    # Error Response Codes: computeFault (400, 500),
85
    #                       serviceUnavailable (503),
86
    #                       unauthorized (401),
87
    #                       badMediaType(415),
88
    #                       itemNotFound (404),
89
    #                       badRequest (400),
90
    #                       serverCapacityUnavailable (503),
91
    #                       buildInProgress (409),
92
    #                       resizeNotAllowed (403),
93
    #                       backupOrResizeInProgress (409),
94
    #                       overLimit (413)
95
    
96
    req = get_request_dict(request)
97
    owner = get_user()
98
    
99
    try:
100
        d = req['image']
101
        server_id = int(d['serverRef'])
102
        vm = VirtualMachine.objects.get(id=server_id)
103
        image = Image.objects.create(name=d['name'], size=0, owner=owner, sourcevm=vm)
104
        image.save()
105
    except KeyError:
106
        raise BadRequest
107
    except ValueError:
108
        raise BadRequest
109
    except VirtualMachine.DoesNotExist:
110
        raise ItemNotFound
111
    
112
    imagedict = image_to_dict(image)
113
    if request.type == 'xml':
114
        data = render_to_string('image.xml', {'image': imagedict})
115
    else:
116
        data = json.dumps({'image': imagedict})
117
    
118
    return HttpResponse(data, status=202)
119

    
120
@api_method('GET')
121
def get_image_details(request, image_id):
122
    # Normal Response Codes: 200, 203
123
    # Error Response Codes: computeFault (400, 500),
124
    #                       serviceUnavailable (503),
125
    #                       unauthorized (401),
126
    #                       badRequest (400),
127
    #                       itemNotFound (404),
128
    #                       overLimit (413)
129
    
130
    try:
131
        image_id = int(image_id)
132
        imagedict = image_to_dict(Image.objects.get(id=image_id))
133
    except Image.DoesNotExist:
134
        raise ItemNotFound
135
    
136
    if request.type == 'xml':
137
        data = render_to_string('image.xml', {'image': imagedict})
138
    else:
139
        data = json.dumps({'image': imagedict})
140
    
141
    return HttpResponse(data, status=200)
142

    
143
@api_method('DELETE')
144
def delete_image(request, image_id):
145
    # Normal Response Code: 204
146
    # Error Response Codes: computeFault (400, 500),
147
    #                       serviceUnavailable (503),
148
    #                       unauthorized (401),
149
    #                       itemNotFound (404),
150
    #                       overLimit (413)
151
    
152
    try:
153
        image_id = int(image_id)
154
        image = Image.objects.get(id=image_id)
155
    except Image.DoesNotExist:
156
        raise ItemNotFound
157
    
158
    if image.owner != get_user():
159
        raise Unauthorized()
160
    image.delete()
161
    return HttpResponse(status=204)