Statistics
| Branch: | Tag: | Revision:

root / api / handlers.py @ beb79c95

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
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
            return 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
        return fault.notImplemented
104

    
105
    def create(self, request, id):
106
        return fault.notImplemented
107

    
108
    def delete(self, request, id):
109
        return 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
            return 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
            return 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
            return 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
            }