1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 """Ganeti exception handling"""
23
24
25
26
27
28 ECODE_RESOLVER = "resolver_error"
29
30 ECODE_NORES = "insufficient_resources"
31
32 ECODE_INVAL = "wrong_input"
33
34 ECODE_STATE = "wrong_state"
35
36 ECODE_NOENT = "unknown_entity"
37
38 ECODE_EXISTS = "already_exists"
39
40 ECODE_NOTUNIQUE = "resource_not_unique"
41
42 ECODE_FAULT = "internal_error"
43
44 ECODE_ENVIRON = "environment_error"
45
46
48 """Base exception for Ganeti.
49
50 """
51 pass
52
53
55 """LVM-related exception.
56
57 This exception codifies problems with LVM setup.
58
59 """
60 pass
61
62
64 """Lock error exception.
65
66 This signifies problems in the locking subsystem.
67
68 """
69 pass
70
71
73 """Hypervisor-related exception.
74
75 This is raised in case we can't communicate with the hypervisor
76 properly.
77
78 """
79 pass
80
81
83 """Programming-related error.
84
85 This is raised in cases we determine that the calling conventions
86 have been violated, meaning we got some desynchronisation between
87 parts of our code. It signifies a real programming bug.
88
89 """
90 pass
91
92
94 """Block-device related exception.
95
96 This is raised in case we can't setup the instance's block devices
97 properly.
98
99 """
100 pass
101
102
104 """Configuration related exception.
105
106 Things like having an instance with a primary node that doesn't
107 exist in the config or such raise this exception.
108
109 """
110 pass
111
112
114 """Errors reserving a resource.
115
116 """
117
118
120 """Programming-related error on remote call.
121
122 This is raised when an unhandled error occurs in a call to a
123 remote node. It usually signifies a real programming bug.
124
125 """
126 pass
127
128
130 """Error authenticating a remote message.
131
132 This is raised when the hmac signature on a message doesn't verify correctly
133 to the message itself. It can happen because of network unreliability or
134 because of spurious traffic.
135
136 """
137 pass
138
139
141 """A passed parameter to a command is invalid.
142
143 This is raised when the parameter passed to a request function is
144 invalid. Correct code should have verified this before passing the
145 request structure.
146
147 The argument to this exception should be the parameter name.
148
149 """
150 pass
151
152
154 """Prerequisites for the OpCode are not fulfilled.
155
156 This exception will have either one or two arguments. For the
157 two-argument construction, the second argument should be one of the
158 ECODE_* codes.
159
160 """
161
162
164 """Error during OpCode execution.
165
166 """
167
168
170 """Unknown opcode submitted.
171
172 This signifies a mismatch between the definitions on the client and
173 server side.
174
175 """
176
177
179 """Submitted job lost.
180
181 The job was submitted but it cannot be found in the current job
182 list.
183
184 """
185
186
188 """Host name cannot be resolved.
189
190 This is not a normal situation for Ganeti, as we rely on having a
191 working resolver.
192
193 The non-resolvable hostname is available as the first element of the
194 args tuple; the other two elements of the tuple are the first two
195 args of the socket.gaierror exception (error code and description).
196
197 """
198
199
201 """A generic hook failure.
202
203 This signifies usually a setup misconfiguration.
204
205 """
206
207
209 """A required hook has failed.
210
211 This caused an abort of the operation in the initial phase. This
212 exception always has an attribute args which is a list of tuples of:
213 - node: the source node on which this hooks has failed
214 - script: the name of the script which aborted the run
215
216 """
217
218
220 """Unable to parse size unit.
221
222 """
223
224
226 """Unable to enforce data type.
227
228 """
229
230
232 """Invalid SSH key.
233
234 """
235
236
238 """Generic tag error.
239
240 The argument to this exception will show the exact error.
241
242 """
243
244
246 """External command error.
247
248 """
249
250
252 """Storage-related exception.
253
254 """
255
256
258 """Error raised when there is a failure setting up an inotify watcher.
259
260 """
261
262
264 """Signal that Ganeti that it must quit.
265
266 This is not necessarily an error (and thus not a subclass of
267 GenericError), but it's an exceptional circumstance and it is thus
268 treated. This instance should be instantiated with two values. The
269 first one will specify the return code to the caller, and the second
270 one will be the returned result (either as an error or as a normal
271 result). Usually only the leave cluster rpc call should return
272 status True (as there it's expected we quit), every other call will
273 return status False (as a critical error was encountered).
274
275 Examples::
276
277 # Return a result of "True" to the caller, but quit ganeti afterwards
278 raise QuitGanetiException(True, None)
279 # Send an error to the caller, and quit ganeti
280 raise QuitGanetiException(False, "Fatal safety violation, shutting down")
281
282 """
283
284
286 """Job queue error.
287
288 """
289
290
292 """Job queue is marked for drain error.
293
294 This is raised when a job submission attempt is made but the queue
295 is marked for drain.
296
297 """
298
299
301 """Job queue full error.
302
303 Raised when job queue size reached its hard limit.
304
305 """
306
307
309 """A request error in Ganeti confd.
310
311 Events that should make confd abort the current request and proceed serving
312 different ones.
313
314 """
315
316
318 """A magic fourcc error in Ganeti confd.
319
320 Errors processing the fourcc in ganeti confd datagrams.
321
322 """
323
324
326 """A magic fourcc error in Ganeti confd.
327
328 Errors in the confd client library.
329
330 """
331
332
334 """UDP payload too big.
335
336 """
337
338
340 """python ctypes module is not found in the system.
341
342 """
343
344
345
346
347
349 """Return the class of an exception.
350
351 Given the class name, return the class itself.
352
353 @type name: str
354 @param name: the exception name
355 @rtype: class
356 @return: the actual class, or None if not found
357
358 """
359 item = globals().get(name, None)
360 if item is not None:
361 if not (isinstance(item, type(Exception)) and
362 issubclass(item, GenericError)):
363 item = None
364 return item
365
366
368 """Encodes an exception into a format that L{MaybeRaise} will recognise.
369
370 The passed L{err} argument will be formatted as a tuple (exception
371 name, arguments) that the MaybeRaise function will recognise.
372
373 @type err: GenericError child
374 @param err: usually a child of GenericError (but any exception
375 will be accepted)
376 @rtype: tuple
377 @return: tuple of (exception name, exception arguments)
378
379 """
380 return (err.__class__.__name__, err.args)
381
382
384 """If this looks like an encoded Ganeti exception, raise it.
385
386 This function tries to parse the passed argument and if it looks
387 like an encoding done by EncodeException, it will re-raise it.
388
389 """
390 tlt = (tuple, list)
391 if (isinstance(result, tlt) and len(result) == 2 and
392 isinstance(result[1], tlt)):
393
394 err_class = GetErrorClass(result[0])
395 if err_class is not None:
396 raise err_class, tuple(result[1])
397