"""Ganeti exception handling"""
+# OpPrereqError failure types
+
+# resolver errors
+ECODE_RESOLVER = "resolver_error"
+# not enough resources (iallocator failure, disk space, memory, etc.)
+ECODE_NORES = "insufficient_resources"
+# wrong arguments (at syntax level)
+ECODE_INVAL = "wrong_input"
+# wrong entity state
+ECODE_STATE = "wrong_state"
+# entity not found
+ECODE_NOENT = "unknown_entity"
+# entity already exists
+ECODE_EXISTS = "already_exists"
+# resource not unique (e.g. MAC or IP duplication)
+ECODE_NOTUNIQUE = "resource_not_unique"
+# internal cluster error
+ECODE_FAULT = "internal_error"
+# environment error (e.g. node disk error)
+ECODE_ENVIRON = "environment_error"
+
+
class GenericError(Exception):
"""Base exception for Ganeti.
pass
+class ReservationError(GenericError):
+ """Errors reserving a resource.
+
+ """
+
+
class RemoteError(GenericError):
"""Programming-related error on remote call.
class OpPrereqError(GenericError):
"""Prerequisites for the OpCode are not fulfilled.
+ This exception will have either one or two arguments. For the
+ two-argument construction, the second argument should be one of the
+ ECODE_* codes.
+
"""
"""
-class OpRetryError(OpExecError):
- """Error during OpCode execution, action can be retried.
-
- """
-
-
class OpCodeUnknown(GenericError):
"""Unknown opcode submitted.
"""
+class JobFileCorrupted(GenericError):
+ """Job file could not be properly decoded/restored.
+
+ """
+
+
class ResolverError(GenericError):
"""Host name cannot be resolved.
"""
+class ParseError(GenericError):
+ """Generic parse error.
+
+ Raised when unable to parse user input.
+
+ """
+
+
class TypeEnforcementError(GenericError):
"""Unable to enforce data type.
"""
+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.
"""
-class ConfdFatalError(GenericError):
- """A fatal failure in Ganeti confd.
+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.
- Events that compromise the ability of confd to proceed further.
- (for example: inability to load the config file)
+ Errors processing the fourcc in ganeti confd datagrams.
"""
-class ConfdRequestError(GenericError):
- """A request error in Ganeti confd.
+class ConfdClientError(GenericError):
+ """A magic fourcc error in Ganeti confd.
+
+ Errors in the confd client library.
+
+ """
+
+
+class UdpDataSizeError(GenericError):
+ """UDP payload too big.
+
+ """
- Events that should make confd abort the current request and proceed serving
- different ones.
+
+class NoCtypesError(GenericError):
+ """python ctypes module is not found in the system.
"""
return (err.__class__.__name__, err.args)
-def MaybeRaise(result):
- """Is this looks like an encoded Ganeti exception, raise it.
+def GetEncodedError(result):
+ """If this looks like an encoded Ganeti exception, return it.
This function tries to parse the passed argument and if it looks
- like an encoding done by EncodeException, it will re-raise it.
+ like an encoding done by EncodeException, it will return the class
+ object and arguments.
"""
tlt = (tuple, list)
if (isinstance(result, tlt) and len(result) == 2 and
isinstance(result[1], tlt)):
# custom ganeti errors
- err_class = GetErrorClass(result[0])
- if err_class is not None:
- raise err_class, tuple(result[1])
+ errcls = GetErrorClass(result[0])
+ if errcls:
+ return (errcls, tuple(result[1]))
+
+ return None
+
+
+def MaybeRaise(result):
+ """If 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.
+
+ """
+ error = GetEncodedError(result)
+ if error:
+ (errcls, args) = error
+ raise errcls, args