Statistics
| Branch: | Tag: | Revision:

root / api / images.py @ 92c53da1

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