added Forbidden exception
[sfa.git] / sfa / util / faults.py
1 #----------------------------------------------------------------------
2 # Copyright (c) 2008 Board of Trustees, Princeton University
3 #
4 # Permission is hereby granted, free of charge, to any person obtaining
5 # a copy of this software and/or hardware specification (the "Work") to
6 # deal in the Work without restriction, including without limitation the
7 # rights to use, copy, modify, merge, publish, distribute, sublicense,
8 # and/or sell copies of the Work, and to permit persons to whom the Work
9 # is furnished to do so, subject to the following conditions:
10 #
11 # The above copyright notice and this permission notice shall be
12 # included in all copies or substantial portions of the Work.
13 #
14 # THE WORK IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 
15 # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
16 # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
17 # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 
18 # HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 
19 # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
20 # OUT OF OR IN CONNECTION WITH THE WORK OR THE USE OR OTHER DEALINGS 
21 # IN THE WORK.
22 #----------------------------------------------------------------------
23 #
24 # SFA API faults
25 #
26
27 import xmlrpclib
28 from sfa.util.genicode import GENICODE
29
30 class SfaFault(xmlrpclib.Fault):
31     def __init__(self, faultCode, faultString, extra = None):
32         if extra:
33             faultString += ": " + str(extra)
34         xmlrpclib.Fault.__init__(self, faultCode, faultString)
35
36 class Forbidden(SfaFault):
37     def __init__(self,  extra = None):
38         faultString = "FORBIDDEN:" 
39         SfaFault.__init__(self, GENICODE.FORBIDDEN, faultString, extra)   
40
41 class CredentialMismatch(SfaFault):
42     def __init__(self,  extra = None):
43         faultString = "Credential mismatch"
44         SfaFault.__init__(self, GENICODE.CREDENTIAL_MISMATCH, faultString, extra) 
45
46 class SfaInvalidAPIMethod(SfaFault):
47     def __init__(self, method, interface = None, extra = None):
48         faultString = "Invalid method " + method
49         if interface:
50             faultString += " for interface " + interface
51         SfaFault.__init__(self, GENICODE.UNSUPPORTED, faultString, extra)
52
53 class SfaInvalidArgumentCount(SfaFault):
54     def __init__(self, got, min, max = min, extra = None):
55         if min != max:
56             expected = "%d-%d" % (min, max)
57         else:
58             expected = "%d" % min
59         faultString = "Expected %s arguments, got %d" % \
60                       (expected, got)
61         SfaFault.__init__(self, GENICODE.BADARGS, faultString, extra)
62
63 class SfaInvalidArgument(SfaFault):
64     def __init__(self, extra = None, name = None):
65         if name is not None:
66             faultString = "Invalid %s value" % name
67         else:
68             faultString = "Invalid argument"
69         SfaFault.__init__(self, GENICODE.BADARGS, faultString, extra)
70
71 class SfaAuthenticationFailure(SfaFault):
72     def __init__(self, extra = None):
73         faultString = "Failed to authenticate call"
74         SfaFault.__init__(self, GENICODE.ERROR, faultString, extra)
75
76 class SfaDBError(SfaFault):
77     def __init__(self, extra = None):
78         faultString = "Database error"
79         SfaFault.__init__(self, GENICODE.DBERROR, faultString, extra)
80
81 class SfaPermissionDenied(SfaFault):
82     def __init__(self, extra = None):
83         faultString = "Permission denied"
84         SfaFault.__init__(self, GENICODE.FORBIDDEN, faultString, extra)
85
86 class SfaNotImplemented(SfaFault):
87     def __init__(self, interface=None, extra = None):
88         faultString = "Not implemented"
89         if interface:
90             faultString += " at interface " + interface 
91         SfaFault.__init__(self, GENICODE.UNSUPPORTED, faultString, extra)
92
93 class SfaAPIError(SfaFault):
94     def __init__(self, extra = None):
95         faultString = "Internal API error"
96         SfaFault.__init__(self, GENICODE.SERVERERROR, faultString, extra)
97
98 class MalformedHrnException(SfaFault):
99     def __init__(self, value, extra = None):
100         self.value = value
101         faultString = "Malformed HRN: %(value)s" % locals()
102         SfaFault.__init__(self, GENICODE.ERROR, extra)
103     def __str__(self):
104         return repr(self.value)
105
106 class TreeException(SfaFault):
107     def __init__(self, value, extra = None):
108         self.value = value
109         faultString = "Tree Exception: %(value)s, " % locals()
110         SfaFault.__init__(self, GENICODE.ERROR, faultString, extra)
111     def __str__(self):
112         return repr(self.value)
113
114 class SearchFailed(SfaFault):
115     def __init__(self, value, extra = None):
116         self.value = value
117         faultString = "%s does not exist here " % self.value
118         SfaFault.__init__(self, GENICODE.SEARCHFAILED, faultString, extra)
119     def __str__(self):
120         return repr(self.value)
121
122 class NonExistingRecord(SfaFault):
123     def __init__(self, value, extra = None):
124         self.value = value
125         faultString = "Non exsiting record %(value)s, " % locals()
126         SfaFault.__init__(self, GENICODE.SEARCHFAILED, faultString, extra)
127     def __str__(self):
128         return repr(self.value)
129
130 class ExistingRecord(SfaFault):
131     def __init__(self, value, extra = None):
132         self.value = value
133         faultString = "Existing record: %(value)s, " % locals()
134         SfaFault.__init__(self, GENICODE.REFUSED, faultString, extra)
135     def __str__(self):
136         return repr(self.value)
137
138     
139 class InvalidRPCParams(SfaFault):
140     def __init__(self, value, extra = None):
141         self.value = value
142         faultString = "Invalid RPC Params: %(value)s, " % locals()
143         SfaFault.__init__(self, GENICODE.RPCERROR, faultString, extra)
144     def __str__(self):
145         return repr(self.value)
146
147 # SMBAKER exceptions follow
148
149 class ConnectionKeyGIDMismatch(SfaFault):
150     def __init__(self, value, extra = None):
151         self.value = value
152         faultString = "Connection Key GID mismatch: %(value)s" % locals()
153         SfaFault.__init__(self, GENICODE.ERROR, faultString, extra) 
154     def __str__(self):
155         return repr(self.value)
156
157 class MissingCallerGID(SfaFault):
158     def __init__(self, value, extra = None):
159         self.value = value
160         faultString = "Missing Caller GID: %(value)s" % locals()
161         SfaFault.__init__(self, GENICODE.ERROR, faultString, extra) 
162     def __str__(self):
163         return repr(self.value)
164
165 class RecordNotFound(SfaFault):
166     def __init__(self, value, extra = None):
167         self.value = value
168         faultString = "Record not found: %(value)s" % locals()
169         SfaFault.__init__(self, GENICODE.ERROR, faultString, extra)
170     def __str__(self):
171         return repr(self.value)
172
173 class UnknownSfaType(SfaFault):
174     def __init__(self, value, extra = None):
175         self.value = value
176         faultString = "Unknown SFA Type: %(value)s" % locals()
177         SfaFault.__init__(self, GENICODE.ERROR, faultString, extra)
178     def __str__(self):
179         return repr(self.value)
180
181 class MissingAuthority(SfaFault):
182     def __init__(self, value, extra = None):
183         self.value = value
184         faultString = "Missing authority: %(value)s" % locals()
185         SfaFault.__init__(self, GENICODE.ERROR, faultString, extra)
186     def __str__(self):
187         return repr(self.value)
188
189 class PlanetLabRecordDoesNotExist(SfaFault):
190     def __init__(self, value, extra = None):
191         self.value = value
192         faultString = "PlanetLab record does not exist : %(value)s" % locals()
193         SfaFault.__init__(self, GENICODE.ERROR, faultString, extra)
194     def __str__(self):
195         return repr(self.value)
196
197 class PermissionError(SfaFault):
198     def __init__(self, value, extra = None):
199         self.value = value
200         faultString = "Permission error: %(value)s" % locals()
201         SfaFault.__init__(self, GENICODE.FORBIDDEN, faultString, extra)
202     def __str__(self):
203         return repr(self.value)
204
205 class InsufficientRights(SfaFault):
206     def __init__(self, value, extra = None):
207         self.value = value
208         faultString = "Insufficient rights: %(value)s" % locals()
209         SfaFault.__init__(self, GENICODE.FORBIDDEN, faultString, extra)
210     def __str__(self):
211         return repr(self.value)
212
213 class MissingDelegateBit(SfaFault):
214     def __init__(self, value, extra = None):
215         self.value = value
216         faultString = "Missing delegate bit: %(value)s" % locals()
217         SfaFault.__init__(self, GENICODE.FORBIDDEN, faultString, extra)
218     def __str__(self):
219         return repr(self.value)
220
221 class ChildRightsNotSubsetOfParent(SfaFault):
222     def __init__(self, value, extra = None):
223         self.value = value
224         faultString = "Child rights not subset of parent: %(value)s" % locals()
225         SfaFault.__init__(self, GENICODE.FORBIDDEN, faultString, extra)
226     def __str__(self):
227         return repr(self.value)
228
229 class CertMissingParent(SfaFault):
230     def __init__(self, value, extra = None):
231         self.value = value
232         faultString = "Cert missing parent: %(value)s" % locals()
233         SfaFault.__init__(self, GENICODE.ERROR, faultString, extra)
234     def __str__(self):
235         return repr(self.value)
236
237 class CertNotSignedByParent(SfaFault):
238     def __init__(self, value, extra = None):
239         self.value = value
240         faultString = "Cert not signed by parent: %(value)s" % locals()
241         SfaFault.__init__(self, GENICODE.ERROR, faultString, extra)
242     def __str__(self):
243         return repr(self.value)
244     
245 class GidParentHrn(SfaFault):
246     def __init__(self, value, extra = None):
247         self.value = value
248         faultString = "Cert URN is not an extension of its parent: %(value)s" % locals()
249         SfaFault.__init__(self, GENICODE.ERROR, faultString, extra)
250     def __str__(self):
251         return repr(self.value)
252         
253 class GidInvalidParentHrn(SfaFault):
254     def __init__(self, value, extra = None):
255         self.value = value
256         faultString = "GID invalid parent hrn: %(value)s" % locals()
257         SfaFault.__init__(self, GENICODE.ERROR, faultString, extra)
258     def __str__(self):
259         return repr(self.value)
260
261 class SliverDoesNotExist(SfaFault):
262     def __init__(self, value, extra = None):
263         self.value = value
264         faultString = "Sliver does not exist : %(value)s" % locals()
265         SfaFault.__init__(self, GENICODE.ERROR, faultString, extra)
266     def __str__(self):
267         return repr(self.value)
268
269 class BadRequestHash(xmlrpclib.Fault):
270     def __init__(self, hash = None, extra = None):
271         faultString = "bad request hash: " + str(hash)
272         xmlrpclib.Fault.__init__(self, GENICODE.ERROR, faultString)
273
274 class MissingTrustedRoots(SfaFault):
275     def __init__(self, value, extra = None):
276         self.value = value
277         faultString = "Trusted root directory does not exist: %(value)s" % locals()
278         SfaFault.__init__(self, GENICODE.SERVERERROR, faultString, extra) 
279     def __str__(self):
280         return repr(self.value)
281
282 class MissingSfaInfo(SfaFault):
283     def __init__(self, value, extra = None):
284         self.value = value
285         faultString = "Missing information: %(value)s" % locals()
286         SfaFault.__init__(self, GENICODE.ERROR, faultString, extra) 
287     def __str__(self):
288         return repr(self.value)
289
290 class InvalidRSpec(SfaFault):
291     def __init__(self, value, extra = None):
292         self.value = value
293         faultString = "Invalid RSpec: %(value)s" % locals()
294         SfaFault.__init__(self, GENICODE.ERROR, faultString, extra)
295     def __str__(self):
296         return repr(self.value)
297
298 class InvalidRSpecVersion(SfaFault):
299     def __init__(self, value, extra = None):
300         self.value = value
301         faultString = "Invalid RSpec version: %(value)s" % locals()
302         SfaFault.__init__(self, GENICODE.BADVERSION, faultString, extra)
303     def __str__(self):
304         return repr(self.value)
305
306 class UnsupportedRSpecVersion(SfaFault):
307     def __init__(self, value, extra = None):
308         self.value = value
309         faultString = "Unsupported RSpec version: %(value)s" % locals()
310         SfaFault.__init__(self, GENICODE.UNSUPPORTED, faultString, extra)
311     def __str__(self):
312         return repr(self.value)
313
314 class InvalidRSpecElement(SfaFault):
315     def __init__(self, value, extra = None):
316         self.value = value
317         faultString = "Invalid RSpec Element: %(value)s" % locals()
318         SfaFault.__init__(self, GENICODE.ERROR, faultString, extra)
319     def __str__(self):
320         return repr(self.value)
321
322 class InvalidXML(SfaFault):
323     def __init__(self, value, extra = None):
324         self.value = value
325         faultString = "Invalid XML Document: %(value)s" % locals()
326         SfaFault.__init__(self, GENICODE.ERROR, faultString, extra)
327     def __str__(self):
328         return repr(self.value)
329
330 class AccountNotEnabled(SfaFault):
331     def __init__(self,  extra = None):
332         faultString = "Account Disabled"
333         SfaFault.__init__(self, GENICODE.ERROR, faultString, extra)
334     def __str__(self):
335         return repr(self.value)
336
337 class CredentialNotVerifiable(SfaFault):
338     def __init__(self, value, extra = None):
339         self.value = value
340         faultString = "Unable to verify credential: %(value)s, " %locals()
341         SfaFault.__init__(self, GENICODE.ERROR, faultString, extra)
342     def __str__(self):
343         return repr(self.value)
344
345 class CertExpired(SfaFault):
346     def __init__(self, value, extra=None):
347         self.value = value
348         faultString = "%s cert is expired" % value
349         SfaFault.__init__(self, GENICODE.ERROR, faultString, extra)
350   
351 class SfatablesRejected(SfaFault):
352     def __init__(self, value, extra=None):
353         self.value =value
354         faultString = "%s rejected by sfatables"
355         SfaFault.__init__(self, GENICODE.FORBIDDEN, faultString, extra) 
356
357 class UnsupportedOperation(SfaFault):
358     def __init__(self, value, extra=None):
359         self.value = value
360         faultString = "Unsupported operation: %s" % value
361         SfaFault.__init__(self, GENICODE.UNSUPPORTED, faultString, extra) 
362