deeper pass on xmlrpclib vs xmlrpc.client as well as configparser
[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 from sfa.util.genicode import GENICODE
28 from sfa.util.py23 import xmlrpc_client
29
30 class SfaFault(xmlrpc_client.Fault):
31     def __init__(self, faultCode, faultString, extra = None):
32         if extra:
33             faultString += ": " + str(extra)
34         xmlrpc_client.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 BadArgs(SfaFault):
42     def __init__(self,  extra = None):
43         faultString = "BADARGS"
44         SfaFault.__init__(self, GENICODE.BADARGS, faultString, extra)
45
46
47 class CredentialMismatch(SfaFault):
48     def __init__(self,  extra = None):
49         faultString = "Credential mismatch"
50         SfaFault.__init__(self, GENICODE.CREDENTIAL_MISMATCH, faultString, extra) 
51
52 class SfaInvalidAPIMethod(SfaFault):
53     def __init__(self, method, interface = None, extra = None):
54         faultString = "Invalid method " + method
55         if interface:
56             faultString += " for interface " + interface
57         SfaFault.__init__(self, GENICODE.UNSUPPORTED, faultString, extra)
58
59 class SfaInvalidArgumentCount(SfaFault):
60     def __init__(self, got, min, max = min, extra = None):
61         if min != max:
62             expected = "%d-%d" % (min, max)
63         else:
64             expected = "%d" % min
65         faultString = "Expected %s arguments, got %d" % \
66                       (expected, got)
67         SfaFault.__init__(self, GENICODE.BADARGS, faultString, extra)
68
69 class SfaInvalidArgument(SfaFault):
70     def __init__(self, extra = None, name = None):
71         if name is not None:
72             faultString = "Invalid %s value" % name
73         else:
74             faultString = "Invalid argument"
75         SfaFault.__init__(self, GENICODE.BADARGS, faultString, extra)
76
77 class SfaAuthenticationFailure(SfaFault):
78     def __init__(self, extra = None):
79         faultString = "Failed to authenticate call"
80         SfaFault.__init__(self, GENICODE.ERROR, faultString, extra)
81
82 class SfaDBError(SfaFault):
83     def __init__(self, extra = None):
84         faultString = "Database error"
85         SfaFault.__init__(self, GENICODE.DBERROR, faultString, extra)
86
87 class SfaPermissionDenied(SfaFault):
88     def __init__(self, extra = None):
89         faultString = "Permission denied"
90         SfaFault.__init__(self, GENICODE.FORBIDDEN, faultString, extra)
91
92 class SfaNotImplemented(SfaFault):
93     def __init__(self, interface=None, extra = None):
94         faultString = "Not implemented"
95         if interface:
96             faultString += " at interface " + interface 
97         SfaFault.__init__(self, GENICODE.UNSUPPORTED, faultString, extra)
98
99 class SfaAPIError(SfaFault):
100     def __init__(self, extra = None):
101         faultString = "Internal SFA API error"
102         SfaFault.__init__(self, GENICODE.SERVERERROR, faultString, extra)
103
104 class MalformedHrnException(SfaFault):
105     def __init__(self, value, extra = None):
106         self.value = value
107         faultString = "Malformed HRN: %(value)s" % locals()
108         SfaFault.__init__(self, GENICODE.ERROR, extra)
109     def __str__(self):
110         return repr(self.value)
111
112 class TreeException(SfaFault):
113     def __init__(self, value, extra = None):
114         self.value = value
115         faultString = "Tree Exception: %(value)s, " % locals()
116         SfaFault.__init__(self, GENICODE.ERROR, faultString, extra)
117     def __str__(self):
118         return repr(self.value)
119
120 class SearchFailed(SfaFault):
121     def __init__(self, value, extra = None):
122         self.value = value
123         faultString = "%s does not exist here " % self.value
124         SfaFault.__init__(self, GENICODE.SEARCHFAILED, faultString, extra)
125     def __str__(self):
126         return repr(self.value)
127
128 class NonExistingRecord(SfaFault):
129     def __init__(self, value, extra = None):
130         self.value = value
131         faultString = "Non exsiting record %(value)s, " % locals()
132         SfaFault.__init__(self, GENICODE.SEARCHFAILED, faultString, extra)
133     def __str__(self):
134         return repr(self.value)
135
136 class ExistingRecord(SfaFault):
137     def __init__(self, value, extra = None):
138         self.value = value
139         faultString = "Existing record: %(value)s, " % locals()
140         SfaFault.__init__(self, GENICODE.REFUSED, faultString, extra)
141     def __str__(self):
142         return repr(self.value)
143
144     
145 class InvalidRPCParams(SfaFault):
146     def __init__(self, value, extra = None):
147         self.value = value
148         faultString = "Invalid RPC Params: %(value)s, " % locals()
149         SfaFault.__init__(self, GENICODE.RPCERROR, faultString, extra)
150     def __str__(self):
151         return repr(self.value)
152
153 # SMBAKER exceptions follow
154
155 class ConnectionKeyGIDMismatch(SfaFault):
156     def __init__(self, value, extra = None):
157         self.value = value
158         faultString = "Connection Key GID mismatch: %(value)s" % locals()
159         SfaFault.__init__(self, GENICODE.ERROR, faultString, extra) 
160     def __str__(self):
161         return repr(self.value)
162
163 class MissingCallerGID(SfaFault):
164     def __init__(self, value, extra = None):
165         self.value = value
166         faultString = "Missing Caller GID: %(value)s" % locals()
167         SfaFault.__init__(self, GENICODE.ERROR, faultString, extra) 
168     def __str__(self):
169         return repr(self.value)
170
171 class RecordNotFound(SfaFault):
172     def __init__(self, value, extra = None):
173         self.value = value
174         faultString = "Record not found: %(value)s" % locals()
175         SfaFault.__init__(self, GENICODE.ERROR, faultString, extra)
176     def __str__(self):
177         return repr(self.value)
178
179 class UnknownSfaType(SfaFault):
180     def __init__(self, value, extra = None):
181         self.value = value
182         faultString = "Unknown SFA Type: %(value)s" % locals()
183         SfaFault.__init__(self, GENICODE.ERROR, faultString, extra)
184     def __str__(self):
185         return repr(self.value)
186
187 class MissingAuthority(SfaFault):
188     def __init__(self, value, extra = None):
189         self.value = value
190         faultString = "Missing authority: %(value)s" % locals()
191         SfaFault.__init__(self, GENICODE.ERROR, faultString, extra)
192     def __str__(self):
193         return repr(self.value)
194
195 class PlanetLabRecordDoesNotExist(SfaFault):
196     def __init__(self, value, extra = None):
197         self.value = value
198         faultString = "PlanetLab record does not exist : %(value)s" % locals()
199         SfaFault.__init__(self, GENICODE.ERROR, faultString, extra)
200     def __str__(self):
201         return repr(self.value)
202
203 class PermissionError(SfaFault):
204     def __init__(self, value, extra = None):
205         self.value = value
206         faultString = "Permission error: %(value)s" % locals()
207         SfaFault.__init__(self, GENICODE.FORBIDDEN, faultString, extra)
208     def __str__(self):
209         return repr(self.value)
210
211 class InsufficientRights(SfaFault):
212     def __init__(self, value, extra = None):
213         self.value = value
214         faultString = "Insufficient rights: %(value)s" % locals()
215         SfaFault.__init__(self, GENICODE.FORBIDDEN, faultString, extra)
216     def __str__(self):
217         return repr(self.value)
218
219 class MissingDelegateBit(SfaFault):
220     def __init__(self, value, extra = None):
221         self.value = value
222         faultString = "Missing delegate bit: %(value)s" % locals()
223         SfaFault.__init__(self, GENICODE.FORBIDDEN, faultString, extra)
224     def __str__(self):
225         return repr(self.value)
226
227 class ChildRightsNotSubsetOfParent(SfaFault):
228     def __init__(self, value, extra = None):
229         self.value = value
230         faultString = "Child rights not subset of parent: %(value)s" % locals()
231         SfaFault.__init__(self, GENICODE.FORBIDDEN, faultString, extra)
232     def __str__(self):
233         return repr(self.value)
234
235 class CertMissingParent(SfaFault):
236     def __init__(self, value, extra = None):
237         self.value = value
238         faultString = "Cert missing parent: %(value)s" % locals()
239         SfaFault.__init__(self, GENICODE.ERROR, faultString, extra)
240     def __str__(self):
241         return repr(self.value)
242
243 class CertNotSignedByParent(SfaFault):
244     def __init__(self, value, extra = None):
245         self.value = value
246         faultString = "Cert not signed by parent: %(value)s" % locals()
247         SfaFault.__init__(self, GENICODE.ERROR, faultString, extra)
248     def __str__(self):
249         return repr(self.value)
250     
251 class GidParentHrn(SfaFault):
252     def __init__(self, value, extra = None):
253         self.value = value
254         faultString = "Cert URN is not an extension of its parent: %(value)s" % locals()
255         SfaFault.__init__(self, GENICODE.ERROR, faultString, extra)
256     def __str__(self):
257         return repr(self.value)
258         
259 class GidInvalidParentHrn(SfaFault):
260     def __init__(self, value, extra = None):
261         self.value = value
262         faultString = "GID invalid parent hrn: %(value)s" % locals()
263         SfaFault.__init__(self, GENICODE.ERROR, faultString, extra)
264     def __str__(self):
265         return repr(self.value)
266
267 class SliverDoesNotExist(SfaFault):
268     def __init__(self, value, extra = None):
269         self.value = value
270         faultString = "Sliver does not exist : %(value)s" % locals()
271         SfaFault.__init__(self, GENICODE.ERROR, faultString, extra)
272     def __str__(self):
273         return repr(self.value)
274
275 class BadRequestHash(xmlrpc_client.Fault):
276     def __init__(self, hash = None, extra = None):
277         faultString = "bad request hash: " + str(hash)
278         xmlrpc_client.Fault.__init__(self, GENICODE.ERROR, faultString)
279
280 class MissingTrustedRoots(SfaFault):
281     def __init__(self, value, extra = None):
282         self.value = value
283         faultString = "Trusted root directory does not exist: %(value)s" % locals()
284         SfaFault.__init__(self, GENICODE.SERVERERROR, faultString, extra) 
285     def __str__(self):
286         return repr(self.value)
287
288 class MissingSfaInfo(SfaFault):
289     def __init__(self, value, extra = None):
290         self.value = value
291         faultString = "Missing information: %(value)s" % locals()
292         SfaFault.__init__(self, GENICODE.ERROR, faultString, extra) 
293     def __str__(self):
294         return repr(self.value)
295
296 class InvalidRSpec(SfaFault):
297     def __init__(self, value, extra = None):
298         self.value = value
299         faultString = "Invalid RSpec: %(value)s" % locals()
300         SfaFault.__init__(self, GENICODE.ERROR, faultString, extra)
301     def __str__(self):
302         return repr(self.value)
303
304 class InvalidRSpecVersion(SfaFault):
305     def __init__(self, value, extra = None):
306         self.value = value
307         faultString = "Invalid RSpec version: %(value)s" % locals()
308         SfaFault.__init__(self, GENICODE.BADVERSION, faultString, extra)
309     def __str__(self):
310         return repr(self.value)
311
312 class UnsupportedRSpecVersion(SfaFault):
313     def __init__(self, value, extra = None):
314         self.value = value
315         faultString = "Unsupported RSpec version: %(value)s" % locals()
316         SfaFault.__init__(self, GENICODE.UNSUPPORTED, faultString, extra)
317     def __str__(self):
318         return repr(self.value)
319
320 class InvalidRSpecElement(SfaFault):
321     def __init__(self, value, extra = None):
322         self.value = value
323         faultString = "Invalid RSpec Element: %(value)s" % locals()
324         SfaFault.__init__(self, GENICODE.ERROR, faultString, extra)
325     def __str__(self):
326         return repr(self.value)
327
328 class InvalidXML(SfaFault):
329     def __init__(self, value, extra = None):
330         self.value = value
331         faultString = "Invalid XML Document: %(value)s" % locals()
332         SfaFault.__init__(self, GENICODE.BADARGS, faultString, extra)
333     def __str__(self):
334         return repr(self.value)
335
336 class AccountNotEnabled(SfaFault):
337     def __init__(self,  extra = None):
338         faultString = "Account Disabled"
339         SfaFault.__init__(self, GENICODE.ERROR, faultString, extra)
340     def __str__(self):
341         return repr(self.value)
342
343 class CredentialNotVerifiable(SfaFault):
344     def __init__(self, value=None, extra = None):
345         self.value = value
346         faultString = "Unable to verify credential" %locals()
347         if value:
348             faultString += ": %s" % value
349         faultString += ", " 
350         SfaFault.__init__(self, GENICODE.BADARGS, faultString, extra)
351     def __str__(self):
352         return repr(self.value)
353
354 class CertExpired(SfaFault):
355     def __init__(self, value, extra=None):
356         self.value = value
357         faultString = "%s cert is expired" % value
358         SfaFault.__init__(self, GENICODE.ERROR, faultString, extra)
359   
360 class SfatablesRejected(SfaFault):
361     def __init__(self, value, extra=None):
362         self.value =value
363         faultString = "%s rejected by sfatables"
364         SfaFault.__init__(self, GENICODE.FORBIDDEN, faultString, extra) 
365
366 class UnsupportedOperation(SfaFault):
367     def __init__(self, value, extra=None):
368         self.value = value
369         faultString = "Unsupported operation: %s" % value
370         SfaFault.__init__(self, GENICODE.UNSUPPORTED, faultString, extra) 
371