Statistics
| Branch: | Tag: | Revision:

root / lib / errors.py @ 82599b3e

History | View | Annotate | Download (9.6 kB)

1 2f31098c Iustin Pop
#
2 a8083063 Iustin Pop
#
3 a8083063 Iustin Pop
4 4b63dc7a Iustin Pop
# Copyright (C) 2006, 2007, 2008, 2009, 2010 Google Inc.
5 a8083063 Iustin Pop
#
6 a8083063 Iustin Pop
# This program is free software; you can redistribute it and/or modify
7 a8083063 Iustin Pop
# it under the terms of the GNU General Public License as published by
8 a8083063 Iustin Pop
# the Free Software Foundation; either version 2 of the License, or
9 a8083063 Iustin Pop
# (at your option) any later version.
10 a8083063 Iustin Pop
#
11 a8083063 Iustin Pop
# This program is distributed in the hope that it will be useful, but
12 a8083063 Iustin Pop
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 a8083063 Iustin Pop
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 a8083063 Iustin Pop
# General Public License for more details.
15 a8083063 Iustin Pop
#
16 a8083063 Iustin Pop
# You should have received a copy of the GNU General Public License
17 a8083063 Iustin Pop
# along with this program; if not, write to the Free Software
18 a8083063 Iustin Pop
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 a8083063 Iustin Pop
# 02110-1301, USA.
20 a8083063 Iustin Pop
21 a8083063 Iustin Pop
22 a8083063 Iustin Pop
"""Ganeti exception handling"""
23 a8083063 Iustin Pop
24 a8083063 Iustin Pop
25 5c983ee5 Iustin Pop
# OpPrereqError failure types
26 5c983ee5 Iustin Pop
27 104f4ca1 Iustin Pop
# resolver errors
28 104f4ca1 Iustin Pop
ECODE_RESOLVER = "resolver_error"
29 5c983ee5 Iustin Pop
# not enough resources (iallocator failure, disk space, memory, etc.)
30 5c983ee5 Iustin Pop
ECODE_NORES = "insufficient_resources"
31 5c983ee5 Iustin Pop
# wrong arguments (at syntax level)
32 5c983ee5 Iustin Pop
ECODE_INVAL = "wrong_input"
33 5c983ee5 Iustin Pop
# wrong entity state
34 5c983ee5 Iustin Pop
ECODE_STATE = "wrong_state"
35 5c983ee5 Iustin Pop
# entity not found
36 5c983ee5 Iustin Pop
ECODE_NOENT = "unknown_entity"
37 5c983ee5 Iustin Pop
# entity already exists
38 5c983ee5 Iustin Pop
ECODE_EXISTS = "already_exists"
39 5c983ee5 Iustin Pop
# resource not unique (e.g. MAC or IP duplication)
40 5c983ee5 Iustin Pop
ECODE_NOTUNIQUE = "resource_not_unique"
41 5c983ee5 Iustin Pop
# internal cluster error
42 5c983ee5 Iustin Pop
ECODE_FAULT = "internal_error"
43 5c983ee5 Iustin Pop
# environment error (e.g. node disk error)
44 5c983ee5 Iustin Pop
ECODE_ENVIRON = "environment_error"
45 5c983ee5 Iustin Pop
46 5c983ee5 Iustin Pop
47 a8083063 Iustin Pop
class GenericError(Exception):
48 a8083063 Iustin Pop
  """Base exception for Ganeti.
49 a8083063 Iustin Pop

50 a8083063 Iustin Pop
  """
51 a8083063 Iustin Pop
  pass
52 a8083063 Iustin Pop
53 a8083063 Iustin Pop
54 a8083063 Iustin Pop
class LVMError(GenericError):
55 a8083063 Iustin Pop
  """LVM-related exception.
56 a8083063 Iustin Pop

57 a8083063 Iustin Pop
  This exception codifies problems with LVM setup.
58 a8083063 Iustin Pop

59 a8083063 Iustin Pop
  """
60 a8083063 Iustin Pop
  pass
61 a8083063 Iustin Pop
62 a8083063 Iustin Pop
63 a8083063 Iustin Pop
class LockError(GenericError):
64 a8083063 Iustin Pop
  """Lock error exception.
65 a8083063 Iustin Pop

66 a8083063 Iustin Pop
  This signifies problems in the locking subsystem.
67 a8083063 Iustin Pop

68 a8083063 Iustin Pop
  """
69 a8083063 Iustin Pop
  pass
70 a8083063 Iustin Pop
71 a8083063 Iustin Pop
72 a8083063 Iustin Pop
class HypervisorError(GenericError):
73 a8083063 Iustin Pop
  """Hypervisor-related exception.
74 a8083063 Iustin Pop

75 a8083063 Iustin Pop
  This is raised in case we can't communicate with the hypervisor
76 a8083063 Iustin Pop
  properly.
77 a8083063 Iustin Pop

78 a8083063 Iustin Pop
  """
79 a8083063 Iustin Pop
  pass
80 a8083063 Iustin Pop
81 a8083063 Iustin Pop
82 a8083063 Iustin Pop
class ProgrammerError(GenericError):
83 a8083063 Iustin Pop
  """Programming-related error.
84 a8083063 Iustin Pop

85 a8083063 Iustin Pop
  This is raised in cases we determine that the calling conventions
86 a8083063 Iustin Pop
  have been violated, meaning we got some desynchronisation between
87 a8083063 Iustin Pop
  parts of our code. It signifies a real programming bug.
88 a8083063 Iustin Pop

89 a8083063 Iustin Pop
  """
90 a8083063 Iustin Pop
  pass
91 a8083063 Iustin Pop
92 a8083063 Iustin Pop
93 a8083063 Iustin Pop
class BlockDeviceError(GenericError):
94 a8083063 Iustin Pop
  """Block-device related exception.
95 a8083063 Iustin Pop

96 a8083063 Iustin Pop
  This is raised in case we can't setup the instance's block devices
97 a8083063 Iustin Pop
  properly.
98 a8083063 Iustin Pop

99 a8083063 Iustin Pop
  """
100 a8083063 Iustin Pop
  pass
101 a8083063 Iustin Pop
102 a8083063 Iustin Pop
103 a8083063 Iustin Pop
class ConfigurationError(GenericError):
104 a8083063 Iustin Pop
  """Configuration related exception.
105 a8083063 Iustin Pop

106 a8083063 Iustin Pop
  Things like having an instance with a primary node that doesn't
107 a8083063 Iustin Pop
  exist in the config or such raise this exception.
108 a8083063 Iustin Pop

109 a8083063 Iustin Pop
  """
110 a8083063 Iustin Pop
  pass
111 a8083063 Iustin Pop
112 a8083063 Iustin Pop
113 4b63dc7a Iustin Pop
class ConfigVersionMismatch(ConfigurationError):
114 4b63dc7a Iustin Pop
  """Version mismatch in the configuration file.
115 4b63dc7a Iustin Pop

116 4b63dc7a Iustin Pop
  The error has two arguments: the expected and the actual found
117 4b63dc7a Iustin Pop
  version.
118 4b63dc7a Iustin Pop

119 4b63dc7a Iustin Pop
  """
120 4b63dc7a Iustin Pop
  pass
121 4b63dc7a Iustin Pop
122 4b63dc7a Iustin Pop
123 2c8a5690 Guido Trotter
class ReservationError(GenericError):
124 2c8a5690 Guido Trotter
  """Errors reserving a resource.
125 2c8a5690 Guido Trotter

126 2c8a5690 Guido Trotter
  """
127 2c8a5690 Guido Trotter
128 2c8a5690 Guido Trotter
129 a8083063 Iustin Pop
class RemoteError(GenericError):
130 a8083063 Iustin Pop
  """Programming-related error on remote call.
131 a8083063 Iustin Pop

132 a8083063 Iustin Pop
  This is raised when an unhandled error occurs in a call to a
133 a8083063 Iustin Pop
  remote node.  It usually signifies a real programming bug.
134 a8083063 Iustin Pop

135 a8083063 Iustin Pop
  """
136 a8083063 Iustin Pop
  pass
137 a8083063 Iustin Pop
138 a8083063 Iustin Pop
139 f4a2f532 Guido Trotter
class SignatureError(GenericError):
140 f4a2f532 Guido Trotter
  """Error authenticating a remote message.
141 f4a2f532 Guido Trotter

142 f4a2f532 Guido Trotter
  This is raised when the hmac signature on a message doesn't verify correctly
143 f4a2f532 Guido Trotter
  to the message itself. It can happen because of network unreliability or
144 f4a2f532 Guido Trotter
  because of spurious traffic.
145 f4a2f532 Guido Trotter

146 f4a2f532 Guido Trotter
  """
147 f4a2f532 Guido Trotter
  pass
148 f4a2f532 Guido Trotter
149 f4a2f532 Guido Trotter
150 a8083063 Iustin Pop
class ParameterError(GenericError):
151 a8083063 Iustin Pop
  """A passed parameter to a command is invalid.
152 a8083063 Iustin Pop

153 a8083063 Iustin Pop
  This is raised when the parameter passed to a request function is
154 a8083063 Iustin Pop
  invalid. Correct code should have verified this before passing the
155 a8083063 Iustin Pop
  request structure.
156 a8083063 Iustin Pop

157 a8083063 Iustin Pop
  The argument to this exception should be the parameter name.
158 a8083063 Iustin Pop

159 a8083063 Iustin Pop
  """
160 a8083063 Iustin Pop
  pass
161 a8083063 Iustin Pop
162 a8083063 Iustin Pop
163 a8083063 Iustin Pop
class OpPrereqError(GenericError):
164 a8083063 Iustin Pop
  """Prerequisites for the OpCode are not fulfilled.
165 a8083063 Iustin Pop

166 5c983ee5 Iustin Pop
  This exception will have either one or two arguments. For the
167 5c983ee5 Iustin Pop
  two-argument construction, the second argument should be one of the
168 5c983ee5 Iustin Pop
  ECODE_* codes.
169 5c983ee5 Iustin Pop

170 a8083063 Iustin Pop
  """
171 a8083063 Iustin Pop
172 098c0958 Michael Hanselmann
173 a8083063 Iustin Pop
class OpExecError(GenericError):
174 a8083063 Iustin Pop
  """Error during OpCode execution.
175 a8083063 Iustin Pop

176 a8083063 Iustin Pop
  """
177 a8083063 Iustin Pop
178 098c0958 Michael Hanselmann
179 a8083063 Iustin Pop
class OpCodeUnknown(GenericError):
180 a8083063 Iustin Pop
  """Unknown opcode submitted.
181 a8083063 Iustin Pop

182 a8083063 Iustin Pop
  This signifies a mismatch between the definitions on the client and
183 a8083063 Iustin Pop
  server side.
184 a8083063 Iustin Pop

185 a8083063 Iustin Pop
  """
186 a8083063 Iustin Pop
187 098c0958 Michael Hanselmann
188 685ee993 Iustin Pop
class JobLost(GenericError):
189 685ee993 Iustin Pop
  """Submitted job lost.
190 685ee993 Iustin Pop

191 685ee993 Iustin Pop
  The job was submitted but it cannot be found in the current job
192 685ee993 Iustin Pop
  list.
193 685ee993 Iustin Pop

194 685ee993 Iustin Pop
  """
195 685ee993 Iustin Pop
196 685ee993 Iustin Pop
197 3d6c5566 Guido Trotter
class JobFileCorrupted(GenericError):
198 3d6c5566 Guido Trotter
  """Job file could not be properly decoded/restored.
199 3d6c5566 Guido Trotter

200 3d6c5566 Guido Trotter
  """
201 3d6c5566 Guido Trotter
202 3d6c5566 Guido Trotter
203 89e1fc26 Iustin Pop
class ResolverError(GenericError):
204 89e1fc26 Iustin Pop
  """Host name cannot be resolved.
205 89e1fc26 Iustin Pop

206 89e1fc26 Iustin Pop
  This is not a normal situation for Ganeti, as we rely on having a
207 89e1fc26 Iustin Pop
  working resolver.
208 89e1fc26 Iustin Pop

209 89e1fc26 Iustin Pop
  The non-resolvable hostname is available as the first element of the
210 89e1fc26 Iustin Pop
  args tuple; the other two elements of the tuple are the first two
211 89e1fc26 Iustin Pop
  args of the socket.gaierror exception (error code and description).
212 89e1fc26 Iustin Pop

213 89e1fc26 Iustin Pop
  """
214 89e1fc26 Iustin Pop
215 89e1fc26 Iustin Pop
216 a8083063 Iustin Pop
class HooksFailure(GenericError):
217 a8083063 Iustin Pop
  """A generic hook failure.
218 a8083063 Iustin Pop

219 a8083063 Iustin Pop
  This signifies usually a setup misconfiguration.
220 a8083063 Iustin Pop

221 a8083063 Iustin Pop
  """
222 a8083063 Iustin Pop
223 098c0958 Michael Hanselmann
224 a8083063 Iustin Pop
class HooksAbort(HooksFailure):
225 a8083063 Iustin Pop
  """A required hook has failed.
226 a8083063 Iustin Pop

227 a8083063 Iustin Pop
  This caused an abort of the operation in the initial phase. This
228 a8083063 Iustin Pop
  exception always has an attribute args which is a list of tuples of:
229 a8083063 Iustin Pop
    - node: the source node on which this hooks has failed
230 a8083063 Iustin Pop
    - script: the name of the script which aborted the run
231 a8083063 Iustin Pop

232 a8083063 Iustin Pop
  """
233 a8083063 Iustin Pop
234 098c0958 Michael Hanselmann
235 a8083063 Iustin Pop
class UnitParseError(GenericError):
236 a8083063 Iustin Pop
  """Unable to parse size unit.
237 a8083063 Iustin Pop

238 a8083063 Iustin Pop
  """
239 a8083063 Iustin Pop
240 ac2d0fe4 Michael Hanselmann
241 31155d60 Balazs Lecz
class ParseError(GenericError):
242 31155d60 Balazs Lecz
  """Generic parse error.
243 31155d60 Balazs Lecz

244 31155d60 Balazs Lecz
  Raised when unable to parse user input.
245 31155d60 Balazs Lecz

246 31155d60 Balazs Lecz
  """
247 31155d60 Balazs Lecz
248 31155d60 Balazs Lecz
249 a5728081 Guido Trotter
class TypeEnforcementError(GenericError):
250 a5728081 Guido Trotter
  """Unable to enforce data type.
251 a5728081 Guido Trotter

252 a5728081 Guido Trotter
  """
253 a8083063 Iustin Pop
254 ac2d0fe4 Michael Hanselmann
255 a8083063 Iustin Pop
class SshKeyError(GenericError):
256 a8083063 Iustin Pop
  """Invalid SSH key.
257 b0059682 Guido Trotter

258 a8083063 Iustin Pop
  """
259 5c947f38 Iustin Pop
260 5c947f38 Iustin Pop
261 5c947f38 Iustin Pop
class TagError(GenericError):
262 5c947f38 Iustin Pop
  """Generic tag error.
263 5c947f38 Iustin Pop

264 5c947f38 Iustin Pop
  The argument to this exception will show the exact error.
265 5c947f38 Iustin Pop

266 5c947f38 Iustin Pop
  """
267 7bca53e4 Michael Hanselmann
268 7bca53e4 Michael Hanselmann
269 7bca53e4 Michael Hanselmann
class CommandError(GenericError):
270 7bca53e4 Michael Hanselmann
  """External command error.
271 7bca53e4 Michael Hanselmann

272 7bca53e4 Michael Hanselmann
  """
273 e50bdd68 Guido Trotter
274 e50bdd68 Guido Trotter
275 ac2d0fe4 Michael Hanselmann
class StorageError(GenericError):
276 ac2d0fe4 Michael Hanselmann
  """Storage-related exception.
277 ac2d0fe4 Michael Hanselmann

278 ac2d0fe4 Michael Hanselmann
  """
279 ac2d0fe4 Michael Hanselmann
280 589dee9a Guido Trotter
281 589dee9a Guido Trotter
class InotifyError(GenericError):
282 589dee9a Guido Trotter
  """Error raised when there is a failure setting up an inotify watcher.
283 589dee9a Guido Trotter

284 589dee9a Guido Trotter
  """
285 589dee9a Guido Trotter
286 ac2d0fe4 Michael Hanselmann
287 e50bdd68 Guido Trotter
class QuitGanetiException(Exception):
288 e50bdd68 Guido Trotter
  """Signal that Ganeti that it must quit.
289 e50bdd68 Guido Trotter

290 0623d351 Iustin Pop
  This is not necessarily an error (and thus not a subclass of
291 0623d351 Iustin Pop
  GenericError), but it's an exceptional circumstance and it is thus
292 0623d351 Iustin Pop
  treated. This instance should be instantiated with two values. The
293 0623d351 Iustin Pop
  first one will specify the return code to the caller, and the second
294 0623d351 Iustin Pop
  one will be the returned result (either as an error or as a normal
295 0623d351 Iustin Pop
  result). Usually only the leave cluster rpc call should return
296 0623d351 Iustin Pop
  status True (as there it's expected we quit), every other call will
297 0623d351 Iustin Pop
  return status False (as a critical error was encountered).
298 e50bdd68 Guido Trotter

299 c41eea6e Iustin Pop
  Examples::
300 c41eea6e Iustin Pop

301 e50bdd68 Guido Trotter
    # Return a result of "True" to the caller, but quit ganeti afterwards
302 0623d351 Iustin Pop
    raise QuitGanetiException(True, None)
303 e50bdd68 Guido Trotter
    # Send an error to the caller, and quit ganeti
304 0623d351 Iustin Pop
    raise QuitGanetiException(False, "Fatal safety violation, shutting down")
305 e50bdd68 Guido Trotter

306 e50bdd68 Guido Trotter
  """
307 e50bdd68 Guido Trotter
308 f1da30e6 Michael Hanselmann
309 d11bda8d Iustin Pop
class JobQueueError(GenericError):
310 f1da30e6 Michael Hanselmann
  """Job queue error.
311 f1da30e6 Michael Hanselmann

312 f1da30e6 Michael Hanselmann
  """
313 6797ec29 Iustin Pop
314 6797ec29 Iustin Pop
315 686d7433 Iustin Pop
class JobQueueDrainError(JobQueueError):
316 686d7433 Iustin Pop
  """Job queue is marked for drain error.
317 686d7433 Iustin Pop

318 686d7433 Iustin Pop
  This is raised when a job submission attempt is made but the queue
319 686d7433 Iustin Pop
  is marked for drain.
320 686d7433 Iustin Pop

321 686d7433 Iustin Pop
  """
322 686d7433 Iustin Pop
323 686d7433 Iustin Pop
324 f87b405e Michael Hanselmann
class JobQueueFull(JobQueueError):
325 f87b405e Michael Hanselmann
  """Job queue full error.
326 f87b405e Michael Hanselmann

327 f87b405e Michael Hanselmann
  Raised when job queue size reached its hard limit.
328 f87b405e Michael Hanselmann

329 f87b405e Michael Hanselmann
  """
330 f87b405e Michael Hanselmann
331 f87b405e Michael Hanselmann
332 b125e3b3 Guido Trotter
class ConfdRequestError(GenericError):
333 b125e3b3 Guido Trotter
  """A request error in Ganeti confd.
334 b125e3b3 Guido Trotter

335 b125e3b3 Guido Trotter
  Events that should make confd abort the current request and proceed serving
336 b125e3b3 Guido Trotter
  different ones.
337 b125e3b3 Guido Trotter

338 b125e3b3 Guido Trotter
  """
339 b125e3b3 Guido Trotter
340 b125e3b3 Guido Trotter
341 9748ab35 Guido Trotter
class ConfdMagicError(GenericError):
342 9748ab35 Guido Trotter
  """A magic fourcc error in Ganeti confd.
343 9748ab35 Guido Trotter

344 9748ab35 Guido Trotter
  Errors processing the fourcc in ganeti confd datagrams.
345 9748ab35 Guido Trotter

346 9748ab35 Guido Trotter
  """
347 9748ab35 Guido Trotter
348 9748ab35 Guido Trotter
349 e4ccf6cd Guido Trotter
class ConfdClientError(GenericError):
350 e4ccf6cd Guido Trotter
  """A magic fourcc error in Ganeti confd.
351 e4ccf6cd Guido Trotter

352 e4ccf6cd Guido Trotter
  Errors in the confd client library.
353 e4ccf6cd Guido Trotter

354 e4ccf6cd Guido Trotter
  """
355 e4ccf6cd Guido Trotter
356 e4ccf6cd Guido Trotter
357 c8eded0b Guido Trotter
class UdpDataSizeError(GenericError):
358 c8eded0b Guido Trotter
  """UDP payload too big.
359 c8eded0b Guido Trotter

360 c8eded0b Guido Trotter
  """
361 c8eded0b Guido Trotter
362 c8eded0b Guido Trotter
363 4c32a8bd Luca Bigliardi
class NoCtypesError(GenericError):
364 4c32a8bd Luca Bigliardi
  """python ctypes module is not found in the system.
365 4c32a8bd Luca Bigliardi

366 4c32a8bd Luca Bigliardi
  """
367 4c32a8bd Luca Bigliardi
368 4c32a8bd Luca Bigliardi
369 8b312c1d Manuel Franceschini
class IPAddressError(GenericError):
370 8b312c1d Manuel Franceschini
  """Generic IP address error.
371 8b312c1d Manuel Franceschini

372 8b312c1d Manuel Franceschini
  """
373 8b312c1d Manuel Franceschini
374 8b312c1d Manuel Franceschini
375 7a8bda3f Michael Hanselmann
class LuxiError(GenericError):
376 7a8bda3f Michael Hanselmann
  """LUXI error.
377 7a8bda3f Michael Hanselmann

378 7a8bda3f Michael Hanselmann
  """
379 7a8bda3f Michael Hanselmann
380 7a8bda3f Michael Hanselmann
381 6797ec29 Iustin Pop
# errors should be added above
382 6797ec29 Iustin Pop
383 6797ec29 Iustin Pop
384 6797ec29 Iustin Pop
def GetErrorClass(name):
385 6797ec29 Iustin Pop
  """Return the class of an exception.
386 6797ec29 Iustin Pop

387 6797ec29 Iustin Pop
  Given the class name, return the class itself.
388 6797ec29 Iustin Pop

389 6797ec29 Iustin Pop
  @type name: str
390 6797ec29 Iustin Pop
  @param name: the exception name
391 6797ec29 Iustin Pop
  @rtype: class
392 6797ec29 Iustin Pop
  @return: the actual class, or None if not found
393 6797ec29 Iustin Pop

394 6797ec29 Iustin Pop
  """
395 6797ec29 Iustin Pop
  item = globals().get(name, None)
396 6797ec29 Iustin Pop
  if item is not None:
397 6797ec29 Iustin Pop
    if not (isinstance(item, type(Exception)) and
398 6797ec29 Iustin Pop
            issubclass(item, GenericError)):
399 6797ec29 Iustin Pop
      item = None
400 6797ec29 Iustin Pop
  return item
401 6956e9cd Iustin Pop
402 6956e9cd Iustin Pop
403 6956e9cd Iustin Pop
def EncodeException(err):
404 6956e9cd Iustin Pop
  """Encodes an exception into a format that L{MaybeRaise} will recognise.
405 6956e9cd Iustin Pop

406 6956e9cd Iustin Pop
  The passed L{err} argument will be formatted as a tuple (exception
407 6956e9cd Iustin Pop
  name, arguments) that the MaybeRaise function will recognise.
408 6956e9cd Iustin Pop

409 6956e9cd Iustin Pop
  @type err: GenericError child
410 6956e9cd Iustin Pop
  @param err: usually a child of GenericError (but any exception
411 6956e9cd Iustin Pop
      will be accepted)
412 6956e9cd Iustin Pop
  @rtype: tuple
413 6956e9cd Iustin Pop
  @return: tuple of (exception name, exception arguments)
414 6956e9cd Iustin Pop

415 6956e9cd Iustin Pop
  """
416 6956e9cd Iustin Pop
  return (err.__class__.__name__, err.args)
417 6956e9cd Iustin Pop
418 6956e9cd Iustin Pop
419 84f790e6 Michael Hanselmann
def GetEncodedError(result):
420 84f790e6 Michael Hanselmann
  """If this looks like an encoded Ganeti exception, return it.
421 6956e9cd Iustin Pop

422 6956e9cd Iustin Pop
  This function tries to parse the passed argument and if it looks
423 84f790e6 Michael Hanselmann
  like an encoding done by EncodeException, it will return the class
424 84f790e6 Michael Hanselmann
  object and arguments.
425 6956e9cd Iustin Pop

426 6956e9cd Iustin Pop
  """
427 6956e9cd Iustin Pop
  tlt = (tuple, list)
428 6956e9cd Iustin Pop
  if (isinstance(result, tlt) and len(result) == 2 and
429 6956e9cd Iustin Pop
      isinstance(result[1], tlt)):
430 6956e9cd Iustin Pop
    # custom ganeti errors
431 84f790e6 Michael Hanselmann
    errcls = GetErrorClass(result[0])
432 84f790e6 Michael Hanselmann
    if errcls:
433 84f790e6 Michael Hanselmann
      return (errcls, tuple(result[1]))
434 84f790e6 Michael Hanselmann
435 84f790e6 Michael Hanselmann
  return None
436 84f790e6 Michael Hanselmann
437 84f790e6 Michael Hanselmann
438 84f790e6 Michael Hanselmann
def MaybeRaise(result):
439 84f790e6 Michael Hanselmann
  """If this looks like an encoded Ganeti exception, raise it.
440 84f790e6 Michael Hanselmann

441 84f790e6 Michael Hanselmann
  This function tries to parse the passed argument and if it looks
442 84f790e6 Michael Hanselmann
  like an encoding done by EncodeException, it will re-raise it.
443 84f790e6 Michael Hanselmann

444 84f790e6 Michael Hanselmann
  """
445 84f790e6 Michael Hanselmann
  error = GetEncodedError(result)
446 84f790e6 Michael Hanselmann
  if error:
447 84f790e6 Michael Hanselmann
    (errcls, args) = error
448 84f790e6 Michael Hanselmann
    raise errcls, args