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