X-Git-Url: https://code.grnet.gr/git/ganeti-local/blobdiff_plain/b125e3b361b62f619f7c3b54e6abb6ecf0adc88d..c260fa25a3aa5817417aab8adff96b714cb5f234:/lib/errors.py diff --git a/lib/errors.py b/lib/errors.py index 82018c3..9f609d2 100644 --- a/lib/errors.py +++ b/lib/errors.py @@ -1,7 +1,7 @@ # # -# Copyright (C) 2006, 2007 Google Inc. +# Copyright (C) 2006, 2007, 2008, 2009, 2010 Google Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -22,6 +22,28 @@ """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. @@ -88,6 +110,22 @@ class ConfigurationError(GenericError): pass +class ConfigVersionMismatch(ConfigurationError): + """Version mismatch in the configuration file. + + The error has two arguments: the expected and the actual found + version. + + """ + pass + + +class ReservationError(GenericError): + """Errors reserving a resource. + + """ + + class RemoteError(GenericError): """Programming-related error on remote call. @@ -125,6 +163,10 @@ class ParameterError(GenericError): 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. + """ @@ -134,12 +176,6 @@ class OpExecError(GenericError): """ -class OpRetryError(OpExecError): - """Error during OpCode execution, action can be retried. - - """ - - class OpCodeUnknown(GenericError): """Unknown opcode submitted. @@ -158,6 +194,12 @@ class JobLost(GenericError): """ +class JobFileCorrupted(GenericError): + """Job file could not be properly decoded/restored. + + """ + + class ResolverError(GenericError): """Host name cannot be resolved. @@ -196,6 +238,14 @@ class UnitParseError(GenericError): """ +class ParseError(GenericError): + """Generic parse error. + + Raised when unable to parse user input. + + """ + + class TypeEnforcementError(GenericError): """Unable to enforce data type. @@ -228,8 +278,14 @@ class StorageError(GenericError): """ +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. + """Signal 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 @@ -273,20 +329,51 @@ class JobQueueFull(JobQueueError): """ -class ConfdFatalError(GenericError): - """A fatal failure in Ganeti confd. +class ConfdRequestError(GenericError): + """A request error in Ganeti confd. - Events that compromise the ability of confd to proceed further. - (for example: inability to load the config file) + Events that should make confd abort the current request and proceed serving + different ones. """ -class ConfdRequestError(GenericError): - """A request error in Ganeti confd. +class ConfdMagicError(GenericError): + """A magic fourcc error in Ganeti confd. - Events that should make confd abort the current request and proceed serving - different ones. + 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. + + """ + + +class NoCtypesError(GenericError): + """python ctypes module is not found in the system. + + """ + + +class IPAddressError(GenericError): + """Generic IP address error. + + """ + + +class LuxiError(GenericError): + """LUXI error. """ @@ -311,3 +398,51 @@ def GetErrorClass(name): 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 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 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 + 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