root / api / handlers.py @ ec06b07c
History | View | Annotate | Download (7.9 kB)
1 | 00b4f1be | Faidon Liambotis | # vim: ts=4 sts=4 et ai sw=4 fileencoding=utf-8
|
---|---|---|---|
2 | 00b4f1be | Faidon Liambotis | #
|
3 | 00b4f1be | Faidon Liambotis | # Copyright © 2010 Greek Research and Technology Network
|
4 | 00b4f1be | Faidon Liambotis | #
|
5 | 00b4f1be | Faidon Liambotis | |
6 | 2c089b77 | Faidon Liambotis | from django.conf import settings |
7 | 00b4f1be | Faidon Liambotis | from piston.handler import BaseHandler, AnonymousBaseHandler |
8 | 635cfd6e | Faidon Liambotis | from synnefo.api.faults import fault, noContent, accepted, created |
9 | 2c089b77 | Faidon Liambotis | from synnefo.api.helpers import instance_to_server, paginator |
10 | 909f415b | Faidon Liambotis | from synnefo.util.rapi import GanetiRapiClient, GanetiApiError |
11 | ec06b07c | Dimitris Moraitis | from synnefo.vocabs import MOCK_SERVERS, MOCK_IMAGES |
12 | 253f0c82 | Faidon Liambotis | |
13 | ec06b07c | Dimitris Moraitis | if settings.GANETI_CLUSTER_INFO:
|
14 | ec06b07c | Dimitris Moraitis | rapi = GanetiRapiClient(*settings.GANETI_CLUSTER_INFO) |
15 | ec06b07c | Dimitris Moraitis | else:
|
16 | ec06b07c | Dimitris Moraitis | rapi = None
|
17 | 00b4f1be | Faidon Liambotis | |
18 | 00b4f1be | Faidon Liambotis | VERSIONS = [ |
19 | 00b4f1be | Faidon Liambotis | { |
20 | 00b4f1be | Faidon Liambotis | "status": "CURRENT", |
21 | 00b4f1be | Faidon Liambotis | "id": "v1.0", |
22 | 00b4f1be | Faidon Liambotis | "docURL" : "http://docs.rackspacecloud.com/servers/api/v1.0/cs-devguide-20090714.pdf ", |
23 | 00b4f1be | Faidon Liambotis | "wadl" : "http://docs.rackspacecloud.com/servers/api/v1.0/application.wadl" |
24 | 00b4f1be | Faidon Liambotis | }, |
25 | 00b4f1be | Faidon Liambotis | ] |
26 | 00b4f1be | Faidon Liambotis | |
27 | 00b4f1be | Faidon Liambotis | class VersionHandler(AnonymousBaseHandler): |
28 | 00b4f1be | Faidon Liambotis | allowed_methods = ('GET',)
|
29 | 00b4f1be | Faidon Liambotis | |
30 | 00b4f1be | Faidon Liambotis | def read(self, request, number=None): |
31 | 00b4f1be | Faidon Liambotis | if number is None: |
32 | 00b4f1be | Faidon Liambotis | versions = map(lambda v: { |
33 | 00b4f1be | Faidon Liambotis | "status": v["status"], |
34 | 00b4f1be | Faidon Liambotis | "id": v["id"], |
35 | 00b4f1be | Faidon Liambotis | }, VERSIONS) |
36 | 00b4f1be | Faidon Liambotis | return { "versions": versions } |
37 | 00b4f1be | Faidon Liambotis | else:
|
38 | 00b4f1be | Faidon Liambotis | for version in VERSIONS: |
39 | 00b4f1be | Faidon Liambotis | if version["id"] == number: |
40 | 00b4f1be | Faidon Liambotis | return { "version": version } |
41 | 635cfd6e | Faidon Liambotis | raise fault.itemNotFound
|
42 | 00b4f1be | Faidon Liambotis | |
43 | 00b4f1be | Faidon Liambotis | |
44 | 00b4f1be | Faidon Liambotis | class ServerHandler(BaseHandler): |
45 | fd4828ce | Faidon Liambotis | allowed_methods = ('GET', 'POST', 'PUT', 'DELETE') |
46 | fd4828ce | Faidon Liambotis | |
47 | 00b4f1be | Faidon Liambotis | def read(self, request, id=None): |
48 | 00b4f1be | Faidon Liambotis | if id is None: |
49 | 00b4f1be | Faidon Liambotis | return self.read_all(request) |
50 | 253f0c82 | Faidon Liambotis | elif id == "detail": |
51 | 00b4f1be | Faidon Liambotis | return self.read_all(request, detail=True) |
52 | 00b4f1be | Faidon Liambotis | else:
|
53 | 00b4f1be | Faidon Liambotis | return self.read_one(request, id) |
54 | 00b4f1be | Faidon Liambotis | |
55 | 00b4f1be | Faidon Liambotis | def read_one(self, request, id): |
56 | ec06b07c | Dimitris Moraitis | if not rapi: # No ganeti backend. Return mock objects |
57 | ec06b07c | Dimitris Moraitis | return { "server": MOCK_SERVERS[0] } |
58 | 909f415b | Faidon Liambotis | try:
|
59 | 909f415b | Faidon Liambotis | instance = rapi.GetInstance(id)
|
60 | 909f415b | Faidon Liambotis | return { "server": instance_to_server(instance) } |
61 | 909f415b | Faidon Liambotis | except GanetiApiError:
|
62 | 909f415b | Faidon Liambotis | raise fault.itemNotFound
|
63 | 00b4f1be | Faidon Liambotis | |
64 | 2c089b77 | Faidon Liambotis | @paginator
|
65 | 00b4f1be | Faidon Liambotis | def read_all(self, request, detail=False): |
66 | ec06b07c | Dimitris Moraitis | if not rapi: # No ganeti backend. Return mock objects |
67 | ec06b07c | Dimitris Moraitis | if detail:
|
68 | ec06b07c | Dimitris Moraitis | return { "servers": MOCK_SERVERS } |
69 | ec06b07c | Dimitris Moraitis | else:
|
70 | ec06b07c | Dimitris Moraitis | return { "servers": [ { "id": s['id'], "name": s['name'] } for s in MOCK_SERVERS ] } |
71 | ec06b07c | Dimitris Moraitis | |
72 | 00b4f1be | Faidon Liambotis | if not detail: |
73 | 253f0c82 | Faidon Liambotis | instances = rapi.GetInstances(bulk=False)
|
74 | 253f0c82 | Faidon Liambotis | servers = [ { "id": id, "name": id } for id in instances ] |
75 | 00b4f1be | Faidon Liambotis | else:
|
76 | 253f0c82 | Faidon Liambotis | instances = rapi.GetInstances(bulk=True)
|
77 | 253f0c82 | Faidon Liambotis | servers = [] |
78 | 253f0c82 | Faidon Liambotis | for instance in instances: |
79 | 253f0c82 | Faidon Liambotis | servers.append(instance_to_server(instance)) |
80 | 253f0c82 | Faidon Liambotis | return { "servers": servers } |
81 | 00b4f1be | Faidon Liambotis | |
82 | 00b4f1be | Faidon Liambotis | def create(self, request): |
83 | 00b4f1be | Faidon Liambotis | return accepted
|
84 | 00b4f1be | Faidon Liambotis | |
85 | 00b4f1be | Faidon Liambotis | def update(self, request, id): |
86 | 00b4f1be | Faidon Liambotis | return noContent
|
87 | 00b4f1be | Faidon Liambotis | |
88 | 00b4f1be | Faidon Liambotis | def delete(self, request, id): |
89 | 00b4f1be | Faidon Liambotis | return accepted
|
90 | 00b4f1be | Faidon Liambotis | |
91 | 00b4f1be | Faidon Liambotis | |
92 | 00b4f1be | Faidon Liambotis | class ServerAddressHandler(BaseHandler): |
93 | 00b4f1be | Faidon Liambotis | allowed_methods = ('GET', 'PUT', 'DELETE') |
94 | 00b4f1be | Faidon Liambotis | |
95 | 00b4f1be | Faidon Liambotis | def read(self, request, id, type=None): |
96 | 00b4f1be | Faidon Liambotis | """List IP addresses for a server"""
|
97 | 00b4f1be | Faidon Liambotis | if type is None: |
98 | 00b4f1be | Faidon Liambotis | pass
|
99 | 00b4f1be | Faidon Liambotis | elif type == "private": |
100 | 00b4f1be | Faidon Liambotis | pass
|
101 | 00b4f1be | Faidon Liambotis | elif type == "public": |
102 | 00b4f1be | Faidon Liambotis | pass
|
103 | 00b4f1be | Faidon Liambotis | return {}
|
104 | 00b4f1be | Faidon Liambotis | |
105 | 00b4f1be | Faidon Liambotis | def update(self, request, id, address): |
106 | 00b4f1be | Faidon Liambotis | """Share an IP address to another in the group"""
|
107 | 00b4f1be | Faidon Liambotis | return accepted
|
108 | 00b4f1be | Faidon Liambotis | |
109 | 00b4f1be | Faidon Liambotis | def delete(self, request, id, address): |
110 | 00b4f1be | Faidon Liambotis | """Unshare an IP address"""
|
111 | 00b4f1be | Faidon Liambotis | return accepted
|
112 | 00b4f1be | Faidon Liambotis | |
113 | 00b4f1be | Faidon Liambotis | |
114 | 00b4f1be | Faidon Liambotis | class ServerActionHandler(BaseHandler): |
115 | 00b4f1be | Faidon Liambotis | allowed_methods = ('POST',)
|
116 | 00b4f1be | Faidon Liambotis | |
117 | 00b4f1be | Faidon Liambotis | def create(self, request, id): |
118 | 00b4f1be | Faidon Liambotis | """Reboot, rebuild, resize, confirm resized, revert resized"""
|
119 | 00b4f1be | Faidon Liambotis | print ("server action %s" % id) |
120 | 00b4f1be | Faidon Liambotis | return accepted
|
121 | 427a9220 | Faidon Liambotis | |
122 | 427a9220 | Faidon Liambotis | |
123 | c99adc90 | Faidon Liambotis | class ServerBackupHandler(BaseHandler): |
124 | c99adc90 | Faidon Liambotis | """ Backup Schedules are not implemented yet, return notImplemented """
|
125 | c99adc90 | Faidon Liambotis | allowed_methods = ('GET', 'POST', 'DELETE') |
126 | c99adc90 | Faidon Liambotis | |
127 | c99adc90 | Faidon Liambotis | def read(self, request, id): |
128 | 635cfd6e | Faidon Liambotis | raise fault.notImplemented
|
129 | c99adc90 | Faidon Liambotis | |
130 | c99adc90 | Faidon Liambotis | def create(self, request, id): |
131 | 635cfd6e | Faidon Liambotis | raise fault.notImplemented
|
132 | c99adc90 | Faidon Liambotis | |
133 | c99adc90 | Faidon Liambotis | def delete(self, request, id): |
134 | 635cfd6e | Faidon Liambotis | raise fault.notImplemented
|
135 | c99adc90 | Faidon Liambotis | |
136 | c99adc90 | Faidon Liambotis | |
137 | 427a9220 | Faidon Liambotis | class FlavorHandler(BaseHandler): |
138 | 427a9220 | Faidon Liambotis | allowed_methods = ('GET',)
|
139 | 427a9220 | Faidon Liambotis | flavors = [ |
140 | 427a9220 | Faidon Liambotis | { |
141 | 427a9220 | Faidon Liambotis | "id" : 1, |
142 | 427a9220 | Faidon Liambotis | "name" : "256 MB Server", |
143 | 427a9220 | Faidon Liambotis | "ram" : 256, |
144 | 427a9220 | Faidon Liambotis | "disk" : 10 |
145 | 427a9220 | Faidon Liambotis | }, |
146 | 427a9220 | Faidon Liambotis | { |
147 | 427a9220 | Faidon Liambotis | "id" : 2, |
148 | 427a9220 | Faidon Liambotis | "name" : "512 MB Server", |
149 | 427a9220 | Faidon Liambotis | "ram" : 512, |
150 | 427a9220 | Faidon Liambotis | "disk" : 20 |
151 | 427a9220 | Faidon Liambotis | } |
152 | 427a9220 | Faidon Liambotis | ] |
153 | 427a9220 | Faidon Liambotis | |
154 | 427a9220 | Faidon Liambotis | def read(self, request, id=None): |
155 | dcc6a862 | Faidon Liambotis | """
|
156 | dcc6a862 | Faidon Liambotis | List flavors or retrieve one
|
157 | 427a9220 | Faidon Liambotis |
|
158 | 427a9220 | Faidon Liambotis | Returns: OK
|
159 | dcc6a862 | Faidon Liambotis | Faults: cloudServersFault, serviceUnavailable, unauthorized,
|
160 | dcc6a862 | Faidon Liambotis | badRequest, itemNotFound
|
161 | 427a9220 | Faidon Liambotis | """
|
162 | 427a9220 | Faidon Liambotis | if id is None: |
163 | 427a9220 | Faidon Liambotis | simple = map(lambda v: { |
164 | 427a9220 | Faidon Liambotis | "id": v["id"], |
165 | 427a9220 | Faidon Liambotis | "name": v["name"], |
166 | 427a9220 | Faidon Liambotis | }, self.flavors)
|
167 | 427a9220 | Faidon Liambotis | return { "flavors": simple } |
168 | 427a9220 | Faidon Liambotis | elif id == "detail": |
169 | 427a9220 | Faidon Liambotis | return { "flavors": self.flavors } |
170 | 427a9220 | Faidon Liambotis | else:
|
171 | 427a9220 | Faidon Liambotis | for flavor in self.flavors: |
172 | 427a9220 | Faidon Liambotis | if str(flavor["id"]) == id: |
173 | 427a9220 | Faidon Liambotis | return { "flavor": flavor } |
174 | 635cfd6e | Faidon Liambotis | raise fault.itemNotFound
|
175 | dcc6a862 | Faidon Liambotis | |
176 | dcc6a862 | Faidon Liambotis | |
177 | dcc6a862 | Faidon Liambotis | class ImageHandler(BaseHandler): |
178 | dcc6a862 | Faidon Liambotis | allowed_methods = ('GET', 'POST') |
179 | dcc6a862 | Faidon Liambotis | |
180 | dcc6a862 | Faidon Liambotis | def read(self, request, id=None): |
181 | dcc6a862 | Faidon Liambotis | """
|
182 | dcc6a862 | Faidon Liambotis | List images or retrieve one
|
183 | dcc6a862 | Faidon Liambotis |
|
184 | dcc6a862 | Faidon Liambotis | Returns: OK
|
185 | dcc6a862 | Faidon Liambotis | Faults: cloudServersFault, serviceUnavailable, unauthorized,
|
186 | dcc6a862 | Faidon Liambotis | badRequest, itemNotFound
|
187 | dcc6a862 | Faidon Liambotis | """
|
188 | ec06b07c | Dimitris Moraitis | if not rapi: # No ganeti backend. Return mock objects |
189 | ec06b07c | Dimitris Moraitis | if id == "detail": |
190 | ec06b07c | Dimitris Moraitis | return { "images": MOCK_IMAGES } |
191 | ec06b07c | Dimitris Moraitis | elif id is None: |
192 | ec06b07c | Dimitris Moraitis | return { "images": [ { "id": s['id'], "name": s['name'] } for s in MOCK_IMAGES ] } |
193 | ec06b07c | Dimitris Moraitis | else:
|
194 | ec06b07c | Dimitris Moraitis | return { "image": MOCK_IMAGES[0] } |
195 | dcc6a862 | Faidon Liambotis | if id is None: |
196 | dcc6a862 | Faidon Liambotis | return {}
|
197 | dcc6a862 | Faidon Liambotis | elif id == "detail": |
198 | dcc6a862 | Faidon Liambotis | return {}
|
199 | dcc6a862 | Faidon Liambotis | else:
|
200 | 635cfd6e | Faidon Liambotis | raise fault.itemNotFound
|
201 | dcc6a862 | Faidon Liambotis | |
202 | dcc6a862 | Faidon Liambotis | def create(self, request): |
203 | dcc6a862 | Faidon Liambotis | """Create a new image"""
|
204 | dcc6a862 | Faidon Liambotis | return accepted
|
205 | ed66d976 | Faidon Liambotis | |
206 | ed66d976 | Faidon Liambotis | |
207 | ed66d976 | Faidon Liambotis | class SharedIPGroupHandler(BaseHandler): |
208 | ed66d976 | Faidon Liambotis | allowed_methods = ('GET', 'POST', 'DELETE') |
209 | ed66d976 | Faidon Liambotis | |
210 | ed66d976 | Faidon Liambotis | def read(self, request, id=None): |
211 | ed66d976 | Faidon Liambotis | """List Shared IP Groups"""
|
212 | ed66d976 | Faidon Liambotis | if id is None: |
213 | ed66d976 | Faidon Liambotis | return {}
|
214 | ed66d976 | Faidon Liambotis | elif id == "detail": |
215 | ed66d976 | Faidon Liambotis | return {}
|
216 | ed66d976 | Faidon Liambotis | else:
|
217 | 635cfd6e | Faidon Liambotis | raise fault.itemNotFound
|
218 | ed66d976 | Faidon Liambotis | |
219 | ed66d976 | Faidon Liambotis | def create(self, request, id): |
220 | ed66d976 | Faidon Liambotis | """Creates a new Shared IP Group"""
|
221 | ed66d976 | Faidon Liambotis | return created
|
222 | ed66d976 | Faidon Liambotis | |
223 | ed66d976 | Faidon Liambotis | def delete(self, request, id): |
224 | ed66d976 | Faidon Liambotis | """Deletes a Shared IP Group"""
|
225 | ed66d976 | Faidon Liambotis | return noContent
|
226 | beb79c95 | Faidon Liambotis | |
227 | beb79c95 | Faidon Liambotis | |
228 | beb79c95 | Faidon Liambotis | class LimitHandler(BaseHandler): |
229 | beb79c95 | Faidon Liambotis | allowed_methods = ('GET',)
|
230 | beb79c95 | Faidon Liambotis | |
231 | beb79c95 | Faidon Liambotis | # XXX: hookup with @throttle
|
232 | beb79c95 | Faidon Liambotis | |
233 | beb79c95 | Faidon Liambotis | rate = [ |
234 | beb79c95 | Faidon Liambotis | { |
235 | beb79c95 | Faidon Liambotis | "verb" : "POST", |
236 | beb79c95 | Faidon Liambotis | "URI" : "*", |
237 | beb79c95 | Faidon Liambotis | "regex" : ".*", |
238 | beb79c95 | Faidon Liambotis | "value" : 10, |
239 | beb79c95 | Faidon Liambotis | "remaining" : 2, |
240 | beb79c95 | Faidon Liambotis | "unit" : "MINUTE", |
241 | beb79c95 | Faidon Liambotis | "resetTime" : 1244425439 |
242 | beb79c95 | Faidon Liambotis | }, |
243 | beb79c95 | Faidon Liambotis | { |
244 | beb79c95 | Faidon Liambotis | "verb" : "POST", |
245 | beb79c95 | Faidon Liambotis | "URI" : "*/servers", |
246 | beb79c95 | Faidon Liambotis | "regex" : "^/servers", |
247 | beb79c95 | Faidon Liambotis | "value" : 25, |
248 | beb79c95 | Faidon Liambotis | "remaining" : 24, |
249 | beb79c95 | Faidon Liambotis | "unit" : "DAY", |
250 | beb79c95 | Faidon Liambotis | "resetTime" : 1244511839 |
251 | beb79c95 | Faidon Liambotis | }, |
252 | beb79c95 | Faidon Liambotis | { |
253 | beb79c95 | Faidon Liambotis | "verb" : "PUT", |
254 | beb79c95 | Faidon Liambotis | "URI" : "*", |
255 | beb79c95 | Faidon Liambotis | "regex" : ".*", |
256 | beb79c95 | Faidon Liambotis | "value" : 10, |
257 | beb79c95 | Faidon Liambotis | "remaining" : 2, |
258 | beb79c95 | Faidon Liambotis | "unit" : "MINUTE", |
259 | beb79c95 | Faidon Liambotis | "resetTime" : 1244425439 |
260 | beb79c95 | Faidon Liambotis | }, |
261 | beb79c95 | Faidon Liambotis | { |
262 | beb79c95 | Faidon Liambotis | "verb" : "GET", |
263 | beb79c95 | Faidon Liambotis | "URI" : "*", |
264 | beb79c95 | Faidon Liambotis | "regex" : ".*", |
265 | beb79c95 | Faidon Liambotis | "value" : 3, |
266 | beb79c95 | Faidon Liambotis | "remaining" : 3, |
267 | beb79c95 | Faidon Liambotis | "unit" : "MINUTE", |
268 | beb79c95 | Faidon Liambotis | "resetTime" : 1244425439 |
269 | beb79c95 | Faidon Liambotis | }, |
270 | beb79c95 | Faidon Liambotis | { |
271 | beb79c95 | Faidon Liambotis | "verb" : "DELETE", |
272 | beb79c95 | Faidon Liambotis | "URI" : "*", |
273 | beb79c95 | Faidon Liambotis | "regex" : ".*", |
274 | beb79c95 | Faidon Liambotis | "value" : 100, |
275 | beb79c95 | Faidon Liambotis | "remaining" : 100, |
276 | beb79c95 | Faidon Liambotis | "unit" : "MINUTE", |
277 | beb79c95 | Faidon Liambotis | "resetTime" : 1244425439 |
278 | beb79c95 | Faidon Liambotis | } |
279 | beb79c95 | Faidon Liambotis | ] |
280 | beb79c95 | Faidon Liambotis | |
281 | beb79c95 | Faidon Liambotis | absolute = { |
282 | beb79c95 | Faidon Liambotis | "maxTotalRAMSize" : 51200, |
283 | beb79c95 | Faidon Liambotis | "maxIPGroups" : 50, |
284 | beb79c95 | Faidon Liambotis | "maxIPGroupMembers" : 25 |
285 | beb79c95 | Faidon Liambotis | } |
286 | beb79c95 | Faidon Liambotis | |
287 | beb79c95 | Faidon Liambotis | def read(self, request): |
288 | beb79c95 | Faidon Liambotis | return { "limits": { |
289 | beb79c95 | Faidon Liambotis | "rate": self.rate, |
290 | beb79c95 | Faidon Liambotis | "absolute": self.absolute, |
291 | beb79c95 | Faidon Liambotis | } |
292 | beb79c95 | Faidon Liambotis | } |