1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 """Ganeti exception handling.
32
33 """
34
35 from ganeti import constants
36
37
38 ECODE_RESOLVER = constants.ERRORS_ECODE_RESOLVER
39 ECODE_NORES = constants.ERRORS_ECODE_NORES
40 ECODE_TEMP_NORES = constants.ERRORS_ECODE_TEMP_NORES
41 ECODE_INVAL = constants.ERRORS_ECODE_INVAL
42 ECODE_STATE = constants.ERRORS_ECODE_STATE
43 ECODE_NOENT = constants.ERRORS_ECODE_NOENT
44 ECODE_EXISTS = constants.ERRORS_ECODE_EXISTS
45 ECODE_NOTUNIQUE = constants.ERRORS_ECODE_NOTUNIQUE
46 ECODE_FAULT = constants.ERRORS_ECODE_FAULT
47 ECODE_ENVIRON = constants.ERRORS_ECODE_ENVIRON
48 ECODE_ALL = constants.ERRORS_ECODE_ALL
49
50
52 """Base exception for Ganeti.
53
54 """
55
56
58 """Lock error exception.
59
60 This signifies problems in the locking subsystem.
61
62 """
63
64
66 """PID file is already locked by another process.
67
68 """
69
70
72 """Hypervisor-related exception.
73
74 This is raised in case we can't communicate with the hypervisor
75 properly.
76
77 """
78
79
81 """Hotplug-related exception.
82
83 This is raised in case a hotplug action fails or is not supported.
84 It is currently used only by KVM hypervisor.
85
86 """
87
88
90 """Programming-related error.
91
92 This is raised in cases we determine that the calling conventions
93 have been violated, meaning we got some desynchronisation between
94 parts of our code. It signifies a real programming bug.
95
96 """
97
98
100 """Block-device related exception.
101
102 This is raised in case we can't setup the instance's block devices
103 properly.
104
105 """
106
107
109 """Configuration related exception.
110
111 Things like having an instance with a primary node that doesn't
112 exist in the config or such raise this exception.
113
114 """
115
116
118 """Version mismatch in the configuration file.
119
120 The error has two arguments: the expected and the actual found
121 version.
122
123 """
124
125
127 """Error reported by configuration verification
128
129 The error has two arguments: the main error message and a list of errors
130 found.
131
132 """
133
134
136 """Errors related to IP address pools.
137
138 """
139
140
142 """Errors reserving a resource.
143
144 """
145
146
148 """Programming-related error on remote call.
149
150 This is raised when an unhandled error occurs in a call to a
151 remote node. It usually signifies a real programming bug.
152
153 """
154
155
157 """Error authenticating a remote message.
158
159 This is raised when the hmac signature on a message doesn't verify correctly
160 to the message itself. It can happen because of network unreliability or
161 because of spurious traffic.
162
163 """
164
165
167 """A passed parameter to a command is invalid.
168
169 This is raised when the parameter passed to a request function is
170 invalid. Correct code should have verified this before passing the
171 request structure.
172
173 The argument to this exception should be the parameter name.
174
175 """
176
177
179 """The iallocation results fails validation.
180
181 """
182
183
185 """Prerequisites for the OpCode are not fulfilled.
186
187 This exception has two arguments: an error message, and one of the
188 ECODE_* codes.
189
190 """
191
192
194 """Error during OpCode execution.
195
196 """
197
198
200 """Issue with OpCode result.
201
202 """
203
204
206 """Error during the creation of a device.
207
208 This exception should contain the list of the devices actually created
209 up to now, in the form of pairs (node, device)
210
211 """
212 - def __init__(self, message, created_devices):
216
219
220
222 """Unknown opcode submitted.
223
224 This signifies a mismatch between the definitions on the client and
225 server side.
226
227 """
228
229
231 """Submitted job lost.
232
233 The job was submitted but it cannot be found in the current job
234 list.
235
236 """
237
238
240 """Job file could not be properly decoded/restored.
241
242 """
243
244
246 """Host name cannot be resolved.
247
248 This is not a normal situation for Ganeti, as we rely on having a
249 working resolver.
250
251 The non-resolvable hostname is available as the first element of the
252 args tuple; the other two elements of the tuple are the first two
253 args of the socket.gaierror exception (error code and description).
254
255 """
256
257
259 """A generic hook failure.
260
261 This signifies usually a setup misconfiguration.
262
263 """
264
265
267 """A required hook has failed.
268
269 This caused an abort of the operation in the initial phase. This
270 exception always has an attribute args which is a list of tuples of:
271 - node: the source node on which this hooks has failed
272 - script: the name of the script which aborted the run
273
274 """
275
276
278 """Unable to parse size unit.
279
280 """
281
282
284 """Generic parse error.
285
286 Raised when unable to parse user input.
287
288 """
289
290
292 """Unable to enforce data type.
293
294 """
295
296
298 """Invalid X509 certificate.
299
300 This error has two arguments: the certificate filename and the error cause.
301
302 """
303
304
306 """Generic tag error.
307
308 The argument to this exception will show the exact error.
309
310 """
311
312
314 """External command error.
315
316 """
317
318
320 """Storage-related exception.
321
322 """
323
324
326 """Error raised when there is a failure setting up an inotify watcher.
327
328 """
329
330
332 """Signal Ganeti that it must quit.
333
334 This is not necessarily an error (and thus not a subclass of
335 GenericError), but it's an exceptional circumstance and it is thus
336 treated. This exception should be instantiated with two values. The
337 first one will specify the return code to the caller, and the second
338 one will be the returned result (either as an error or as a normal
339 result). Usually only the leave cluster rpc call should return
340 status True (as there it's expected we quit), every other call will
341 return status False (as a critical error was encountered).
342
343 Examples::
344
345 # Return a result of "True" to the caller, but quit ganeti afterwards
346 raise QuitGanetiException(True, None)
347 # Send an error to the caller, and quit ganeti
348 raise QuitGanetiException(False, "Fatal safety violation, shutting down")
349
350 """
351
352
354 """Job queue error.
355
356 """
357
358
360 """Job queue is marked for drain error.
361
362 This is raised when a job submission attempt is made but the queue
363 is marked for drain.
364
365 """
366
367
369 """Job queue full error.
370
371 Raised when job queue size reached its hard limit.
372
373 """
374
375
377 """A magic fourcc error in Ganeti confd.
378
379 Errors processing the fourcc in ganeti confd datagrams.
380
381 """
382
383
385 """A magic fourcc error in Ganeti confd.
386
387 Errors in the confd client library.
388
389 """
390
391
393 """UDP payload too big.
394
395 """
396
397
399 """python ctypes module is not found in the system.
400
401 """
402
403
405 """Generic IP address error.
406
407 """
408
409
411 """LUXI error.
412
413 """
414
415
417 """Error while parsing query filter.
418
419 This exception must be instantiated with two values. The first one is a
420 string with an error description, the second one is an instance of a subclass
421 of C{pyparsing.ParseBaseException} (used to display the exact error
422 location).
423
424 """
426 """Returns a list of strings with details about the error.
427
428 """
429 try:
430 (_, inner) = self.args
431 except IndexError:
432 return None
433
434 return [str(inner.line),
435 (" " * (inner.column - 1)) + "^",
436 str(inner)]
437
438
440 """Exception containing results from RAPI test utilities.
441
442 """
443
444
446 """Error from file storage path validation.
447
448 """
449
450
451
452
453
455 """Return the class of an exception.
456
457 Given the class name, return the class itself.
458
459 @type name: str
460 @param name: the exception name
461 @rtype: class
462 @return: the actual class, or None if not found
463
464 """
465 item = globals().get(name, None)
466 if item is not None:
467 if not (isinstance(item, type(Exception)) and
468 issubclass(item, GenericError)):
469 item = None
470 return item
471
472
474 """Encodes an exception into a format that L{MaybeRaise} will recognise.
475
476 The passed L{err} argument will be formatted as a tuple (exception
477 name, arguments) that the MaybeRaise function will recognise.
478
479 @type err: GenericError child
480 @param err: usually a child of GenericError (but any exception
481 will be accepted)
482 @rtype: tuple
483 @return: tuple of (exception name, exception arguments)
484
485 """
486 return (err.__class__.__name__, err.args)
487
488
490 """If this looks like an encoded Ganeti exception, return it.
491
492 This function tries to parse the passed argument and if it looks
493 like an encoding done by EncodeException, it will return the class
494 object and arguments.
495
496 """
497 tlt = (tuple, list)
498 if (isinstance(result, tlt) and len(result) == 2 and
499 isinstance(result[1], tlt)):
500
501 errcls = GetErrorClass(result[0])
502 if errcls:
503 return (errcls, tuple(result[1]))
504
505 return None
506
507
509 """If this looks like an encoded Ganeti exception, raise it.
510
511 This function tries to parse the passed argument and if it looks
512 like an encoding done by EncodeException, it will re-raise it.
513
514 """
515 error = GetEncodedError(result)
516 if error:
517 (errcls, args) = error
518
519 raise errcls(*args)
520