Statistics
| Branch: | Tag: | Revision:

root / api / images.py @ a62a4d20

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

    
12

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

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

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

    
37

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

    
58

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

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

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

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