Statistics
| Branch: | Tag: | Revision:

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
            }