+
+ """
+
+
+class TagError(GenericError):
+ """Generic tag error.
+
+ The argument to this exception will show the exact error.
+
+ """
+
+
+class CommandError(GenericError):
+ """External command error.
+
+ """
+
+
+class StorageError(GenericError):
+ """Storage-related exception.
+
+ """
+
+
+class InotifyError(GenericError):
+ """Error raised when there is a failure setting up an inotify watcher.
+
+ """
+
+
+class QuitGanetiException(Exception):
+ """Signal that Ganeti that it must quit.
+
+ This is not necessarily an error (and thus not a subclass of
+ GenericError), but it's an exceptional circumstance and it is thus
+ treated. This instance should be instantiated with two values. The
+ first one will specify the return code to the caller, and the second
+ one will be the returned result (either as an error or as a normal
+ result). Usually only the leave cluster rpc call should return
+ status True (as there it's expected we quit), every other call will
+ return status False (as a critical error was encountered).
+
+ Examples::
+
+ # Return a result of "True" to the caller, but quit ganeti afterwards
+ raise QuitGanetiException(True, None)
+ # Send an error to the caller, and quit ganeti
+ raise QuitGanetiException(False, "Fatal safety violation, shutting down")
+
+ """
+
+
+class JobQueueError(GenericError):
+ """Job queue error.
+
+ """
+
+
+class JobQueueDrainError(JobQueueError):
+ """Job queue is marked for drain error.
+
+ This is raised when a job submission attempt is made but the queue
+ is marked for drain.
+
+ """
+
+
+class JobQueueFull(JobQueueError):
+ """Job queue full error.
+
+ Raised when job queue size reached its hard limit.
+
+ """
+
+
+class ConfdFatalError(GenericError):
+ """A fatal failure in Ganeti confd.
+
+ Events that compromise the ability of confd to proceed further.
+ (for example: inability to load the config file)
+
+ """
+
+
+class ConfdRequestError(GenericError):
+ """A request error in Ganeti confd.
+
+ Events that should make confd abort the current request and proceed serving
+ different ones.
+
+ """
+
+
+class ConfdMagicError(GenericError):
+ """A magic fourcc error in Ganeti confd.
+
+ Errors processing the fourcc in ganeti confd datagrams.
+
+ """
+
+
+class ConfdClientError(GenericError):
+ """A magic fourcc error in Ganeti confd.
+
+ Errors in the confd client library.
+
+ """
+
+
+class UdpDataSizeError(GenericError):
+ """UDP payload too big.
+
+ """
+
+
+# errors should be added above
+
+
+def GetErrorClass(name):
+ """Return the class of an exception.
+
+ Given the class name, return the class itself.
+
+ @type name: str
+ @param name: the exception name
+ @rtype: class
+ @return: the actual class, or None if not found
+
+ """
+ item = globals().get(name, None)
+ if item is not None:
+ if not (isinstance(item, type(Exception)) and
+ issubclass(item, GenericError)):
+ item = None
+ return item
+
+
+def EncodeException(err):
+ """Encodes an exception into a format that L{MaybeRaise} will recognise.
+
+ The passed L{err} argument will be formatted as a tuple (exception
+ name, arguments) that the MaybeRaise function will recognise.
+
+ @type err: GenericError child
+ @param err: usually a child of GenericError (but any exception
+ will be accepted)
+ @rtype: tuple
+ @return: tuple of (exception name, exception arguments)
+
+ """
+ return (err.__class__.__name__, err.args)
+
+
+def MaybeRaise(result):
+ """Is this looks like an encoded Ganeti exception, raise it.
+
+ This function tries to parse the passed argument and if it looks
+ like an encoding done by EncodeException, it will re-raise it.
+