Statistics
| Branch: | Tag: | Revision:

root / api / images.py @ 29a59bc1

History | View | Annotate | Download (5.1 kB)

1 c36934a7 Giorgos Verigakis
#
2 c36934a7 Giorgos Verigakis
# Copyright (c) 2010 Greek Research and Technology Network
3 c36934a7 Giorgos Verigakis
#
4 c36934a7 Giorgos Verigakis
5 c36934a7 Giorgos Verigakis
from synnefo.api.util import *
6 c36934a7 Giorgos Verigakis
from synnefo.db.models import Image
7 c36934a7 Giorgos Verigakis
8 c36934a7 Giorgos Verigakis
from django.conf.urls.defaults import *
9 c36934a7 Giorgos Verigakis
from django.http import HttpResponse
10 c36934a7 Giorgos Verigakis
from django.template.loader import render_to_string
11 29a59bc1 Giorgos Verigakis
from django.utils import simplejson as json
12 c36934a7 Giorgos Verigakis
13 c36934a7 Giorgos Verigakis
14 c36934a7 Giorgos Verigakis
urlpatterns = patterns('synnefo.api.images',
15 c36934a7 Giorgos Verigakis
    (r'^(?:/|.json|.xml)?$', 'demux'),
16 c36934a7 Giorgos Verigakis
    (r'^/detail(?:.json|.xml)?$', 'list_images', {'detail': True}),
17 c36934a7 Giorgos Verigakis
    (r'^/(\d+)(?:.json|.xml)?$', 'image_demux'),
18 c36934a7 Giorgos Verigakis
)
19 c36934a7 Giorgos Verigakis
20 c36934a7 Giorgos Verigakis
def demux(request):
21 c36934a7 Giorgos Verigakis
    if request.method == 'GET':
22 c36934a7 Giorgos Verigakis
        return list_images(request)
23 c36934a7 Giorgos Verigakis
    elif request.method == 'POST':
24 c36934a7 Giorgos Verigakis
        return create_image(request)
25 c36934a7 Giorgos Verigakis
    else:
26 c36934a7 Giorgos Verigakis
        fault = BadRequest()
27 c36934a7 Giorgos Verigakis
        return render_fault(request, fault)
28 c36934a7 Giorgos Verigakis
29 c36934a7 Giorgos Verigakis
def image_demux(request, image_id):
30 c36934a7 Giorgos Verigakis
    if request.method == 'GET':
31 c36934a7 Giorgos Verigakis
        return get_image_details(request, image_id)
32 c36934a7 Giorgos Verigakis
    elif request.method == 'DELETE':
33 c36934a7 Giorgos Verigakis
        return delete_image(request, image_id)
34 c36934a7 Giorgos Verigakis
    else:
35 c36934a7 Giorgos Verigakis
        fault = BadRequest()
36 c36934a7 Giorgos Verigakis
        return render_fault(request, fault)
37 c36934a7 Giorgos Verigakis
38 c36934a7 Giorgos Verigakis
39 c36934a7 Giorgos Verigakis
def image_to_dict(image, detail=True):
40 c36934a7 Giorgos Verigakis
    d = {'id': image.id, 'name': image.name}
41 c36934a7 Giorgos Verigakis
    if detail:
42 c36934a7 Giorgos Verigakis
        d['updated'] = image.updated.isoformat()
43 c36934a7 Giorgos Verigakis
        d['created'] = image.created.isoformat()
44 c36934a7 Giorgos Verigakis
        d['status'] = image.state
45 c36934a7 Giorgos Verigakis
        d['progress'] = 100 if image.state == 'ACTIVE' else 0
46 c36934a7 Giorgos Verigakis
        d['description'] = image.description
47 c36934a7 Giorgos Verigakis
        if image.sourcevm:
48 c36934a7 Giorgos Verigakis
            d['serverRef'] = image.sourcevm.id
49 a62a4d20 Giorgos Verigakis
        
50 a62a4d20 Giorgos Verigakis
        metadata = {}
51 a62a4d20 Giorgos Verigakis
        for meta in ImageMetadata.objects.filter(image=image):
52 a62a4d20 Giorgos Verigakis
            metadata[meta.meta_key] = meta.meta_value
53 a62a4d20 Giorgos Verigakis
        
54 a62a4d20 Giorgos Verigakis
        if metadata:
55 a62a4d20 Giorgos Verigakis
            d['metadata'] = {'values': metadata}
56 a62a4d20 Giorgos Verigakis
    
57 c36934a7 Giorgos Verigakis
    return d
58 c36934a7 Giorgos Verigakis
59 c36934a7 Giorgos Verigakis
60 c36934a7 Giorgos Verigakis
@api_method('GET')
61 c36934a7 Giorgos Verigakis
def list_images(request, detail=False):
62 c36934a7 Giorgos Verigakis
    # Normal Response Codes: 200, 203
63 c36934a7 Giorgos Verigakis
    # Error Response Codes: computeFault (400, 500),
64 c36934a7 Giorgos Verigakis
    #                       serviceUnavailable (503),
65 c36934a7 Giorgos Verigakis
    #                       unauthorized (401),
66 c36934a7 Giorgos Verigakis
    #                       badRequest (400),
67 c36934a7 Giorgos Verigakis
    #                       overLimit (413)
68 c36934a7 Giorgos Verigakis
    
69 c36934a7 Giorgos Verigakis
    all_images = Image.objects.all()
70 c36934a7 Giorgos Verigakis
    images = [image_to_dict(image, detail) for image in all_images]
71 c36934a7 Giorgos Verigakis
    
72 c36934a7 Giorgos Verigakis
    if request.type == 'xml':
73 c36934a7 Giorgos Verigakis
        mimetype = 'application/xml'
74 c36934a7 Giorgos Verigakis
        data = render_to_string('list_images.xml', {'images': images, 'detail': detail})
75 c36934a7 Giorgos Verigakis
    else:
76 c36934a7 Giorgos Verigakis
        mimetype = 'application/json'
77 c36934a7 Giorgos Verigakis
        data = json.dumps({'images': {'values': images}})
78 c36934a7 Giorgos Verigakis
    
79 c36934a7 Giorgos Verigakis
    return HttpResponse(data, mimetype=mimetype, status=200)
80 c36934a7 Giorgos Verigakis
81 c36934a7 Giorgos Verigakis
@api_method('POST')
82 c36934a7 Giorgos Verigakis
def create_image(request):
83 c36934a7 Giorgos Verigakis
    # Normal Response Code: 202
84 c36934a7 Giorgos Verigakis
    # Error Response Codes: computeFault (400, 500),
85 c36934a7 Giorgos Verigakis
    #                       serviceUnavailable (503),
86 c36934a7 Giorgos Verigakis
    #                       unauthorized (401),
87 c36934a7 Giorgos Verigakis
    #                       badMediaType(415),
88 c36934a7 Giorgos Verigakis
    #                       itemNotFound (404),
89 c36934a7 Giorgos Verigakis
    #                       badRequest (400),
90 c36934a7 Giorgos Verigakis
    #                       serverCapacityUnavailable (503),
91 c36934a7 Giorgos Verigakis
    #                       buildInProgress (409),
92 c36934a7 Giorgos Verigakis
    #                       resizeNotAllowed (403),
93 c36934a7 Giorgos Verigakis
    #                       backupOrResizeInProgress (409),
94 c36934a7 Giorgos Verigakis
    #                       overLimit (413)
95 c36934a7 Giorgos Verigakis
    
96 c36934a7 Giorgos Verigakis
    req = get_request_dict(request)
97 c36934a7 Giorgos Verigakis
    owner = get_user()
98 c36934a7 Giorgos Verigakis
    
99 c36934a7 Giorgos Verigakis
    try:
100 c36934a7 Giorgos Verigakis
        d = req['image']
101 c36934a7 Giorgos Verigakis
        server_id = int(d['serverRef'])
102 c36934a7 Giorgos Verigakis
        vm = VirtualMachine.objects.get(id=server_id)
103 c36934a7 Giorgos Verigakis
        image = Image.objects.create(name=d['name'], size=0, owner=owner, sourcevm=vm)
104 c36934a7 Giorgos Verigakis
        image.save()
105 c36934a7 Giorgos Verigakis
    except KeyError:
106 c36934a7 Giorgos Verigakis
        raise BadRequest
107 c36934a7 Giorgos Verigakis
    except ValueError:
108 c36934a7 Giorgos Verigakis
        raise BadRequest
109 c36934a7 Giorgos Verigakis
    except VirtualMachine.DoesNotExist:
110 c36934a7 Giorgos Verigakis
        raise ItemNotFound
111 c36934a7 Giorgos Verigakis
    
112 c36934a7 Giorgos Verigakis
    imagedict = image_to_dict(image)
113 c36934a7 Giorgos Verigakis
    if request.type == 'xml':
114 c36934a7 Giorgos Verigakis
        data = render_to_string('image.xml', {'image': imagedict})
115 c36934a7 Giorgos Verigakis
    else:
116 c36934a7 Giorgos Verigakis
        data = json.dumps({'image': imagedict})
117 c36934a7 Giorgos Verigakis
    
118 c36934a7 Giorgos Verigakis
    return HttpResponse(data, status=202)
119 c36934a7 Giorgos Verigakis
120 c36934a7 Giorgos Verigakis
@api_method('GET')
121 c36934a7 Giorgos Verigakis
def get_image_details(request, image_id):
122 c36934a7 Giorgos Verigakis
    # Normal Response Codes: 200, 203
123 c36934a7 Giorgos Verigakis
    # Error Response Codes: computeFault (400, 500),
124 c36934a7 Giorgos Verigakis
    #                       serviceUnavailable (503),
125 c36934a7 Giorgos Verigakis
    #                       unauthorized (401),
126 c36934a7 Giorgos Verigakis
    #                       badRequest (400),
127 c36934a7 Giorgos Verigakis
    #                       itemNotFound (404),
128 c36934a7 Giorgos Verigakis
    #                       overLimit (413)
129 c36934a7 Giorgos Verigakis
    
130 c36934a7 Giorgos Verigakis
    try:
131 c36934a7 Giorgos Verigakis
        image_id = int(image_id)
132 c36934a7 Giorgos Verigakis
        imagedict = image_to_dict(Image.objects.get(id=image_id))
133 c36934a7 Giorgos Verigakis
    except Image.DoesNotExist:
134 c36934a7 Giorgos Verigakis
        raise ItemNotFound
135 c36934a7 Giorgos Verigakis
    
136 c36934a7 Giorgos Verigakis
    if request.type == 'xml':
137 c36934a7 Giorgos Verigakis
        data = render_to_string('image.xml', {'image': imagedict})
138 c36934a7 Giorgos Verigakis
    else:
139 c36934a7 Giorgos Verigakis
        data = json.dumps({'image': imagedict})
140 c36934a7 Giorgos Verigakis
    
141 c36934a7 Giorgos Verigakis
    return HttpResponse(data, status=200)
142 c36934a7 Giorgos Verigakis
143 c36934a7 Giorgos Verigakis
@api_method('DELETE')
144 c36934a7 Giorgos Verigakis
def delete_image(request, image_id):
145 c36934a7 Giorgos Verigakis
    # Normal Response Code: 204
146 c36934a7 Giorgos Verigakis
    # Error Response Codes: computeFault (400, 500),
147 c36934a7 Giorgos Verigakis
    #                       serviceUnavailable (503),
148 c36934a7 Giorgos Verigakis
    #                       unauthorized (401),
149 c36934a7 Giorgos Verigakis
    #                       itemNotFound (404),
150 c36934a7 Giorgos Verigakis
    #                       overLimit (413)
151 c36934a7 Giorgos Verigakis
    
152 c36934a7 Giorgos Verigakis
    try:
153 c36934a7 Giorgos Verigakis
        image_id = int(image_id)
154 c36934a7 Giorgos Verigakis
        image = Image.objects.get(id=image_id)
155 c36934a7 Giorgos Verigakis
    except Image.DoesNotExist:
156 c36934a7 Giorgos Verigakis
        raise ItemNotFound
157 c36934a7 Giorgos Verigakis
    
158 c36934a7 Giorgos Verigakis
    if image.owner != get_user():
159 c36934a7 Giorgos Verigakis
        raise Unauthorized()
160 c36934a7 Giorgos Verigakis
    image.delete()
161 c36934a7 Giorgos Verigakis
    return HttpResponse(status=204)