X-Git-Url: https://code.grnet.gr/git/ganeti-local/blobdiff_plain/a8083063386109da1f7d95cb441152cad79bc15f..82d9caef3459e6e428b33d444e970b29ccd97cc9:/lib/errors.py diff --git a/lib/errors.py b/lib/errors.py index 7bcd564..6efd9aa 100644 --- a/lib/errors.py +++ b/lib/errors.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +# # # Copyright (C) 2006, 2007 Google Inc. @@ -104,8 +104,9 @@ class InvalidOS(GenericError): This is raised when an OS exists on the master (or is otherwise requested to the code) but not on the target node. - This exception has two arguments: + This exception has three arguments: - the name of the os + - the source directory, if any - the reason why we consider this an invalid OS (text of error message) """ @@ -129,11 +130,19 @@ class OpPrereqError(GenericError): """ + class OpExecError(GenericError): """Error during OpCode execution. """ + +class OpRetryError(OpExecError): + """Error during OpCode execution, action can be retried. + + """ + + class OpCodeUnknown(GenericError): """Unknown opcode submitted. @@ -142,6 +151,29 @@ class OpCodeUnknown(GenericError): """ + +class JobLost(GenericError): + """Submitted job lost. + + The job was submitted but it cannot be found in the current job + list. + + """ + + +class ResolverError(GenericError): + """Host name cannot be resolved. + + This is not a normal situation for Ganeti, as we rely on having a + working resolver. + + The non-resolvable hostname is available as the first element of the + args tuple; the other two elements of the tuple are the first two + args of the socket.gaierror exception (error code and description). + + """ + + class HooksFailure(GenericError): """A generic hook failure. @@ -149,6 +181,7 @@ class HooksFailure(GenericError): """ + class HooksAbort(HooksFailure): """A required hook has failed. @@ -159,6 +192,7 @@ class HooksAbort(HooksFailure): """ + class UnitParseError(GenericError): """Unable to parse size unit. @@ -167,4 +201,74 @@ class UnitParseError(GenericError): class SshKeyError(GenericError): """Invalid SSH key. + + """ + + +class TagError(GenericError): + """Generic tag error. + + The argument to this exception will show the exact error. + + """ + + +class CommandError(GenericError): + """External command error. + + """ + + +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 whether an + error should returned to the caller, and the second one will be the returned + result (either as an error or as a normal result). + + Examples: + # Return a result of "True" to the caller, but quit ganeti afterwards + raise QuitGanetiException(False, True) + # Send an error to the caller, and quit ganeti + raise QuitGanetiException(True, "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. + + """ + + +# 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