Statistics
| Branch: | Tag: | Revision:

root / lib / errors.py @ c0631c06

History | View | Annotate | Download (10.4 kB)

1 2f31098c Iustin Pop
#
2 a8083063 Iustin Pop
#
3 a8083063 Iustin Pop
4 98dfcaff Iustin Pop
# Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 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 df156277 Michael Hanselmann
#: List of all failure types
47 df156277 Michael Hanselmann
ECODE_ALL = frozenset([
48 df156277 Michael Hanselmann
  ECODE_RESOLVER,
49 df156277 Michael Hanselmann
  ECODE_NORES,
50 df156277 Michael Hanselmann
  ECODE_INVAL,
51 df156277 Michael Hanselmann
  ECODE_STATE,
52 df156277 Michael Hanselmann
  ECODE_NOENT,
53 df156277 Michael Hanselmann
  ECODE_EXISTS,
54 df156277 Michael Hanselmann
  ECODE_NOTUNIQUE,
55 df156277 Michael Hanselmann
  ECODE_FAULT,
56 df156277 Michael Hanselmann
  ECODE_ENVIRON,
57 df156277 Michael Hanselmann
  ])
58 df156277 Michael Hanselmann
59 5c983ee5 Iustin Pop
60 a8083063 Iustin Pop
class GenericError(Exception):
61 a8083063 Iustin Pop
  """Base exception for Ganeti.
62 a8083063 Iustin Pop

63 a8083063 Iustin Pop
  """
64 a8083063 Iustin Pop
65 a8083063 Iustin Pop
66 a8083063 Iustin Pop
class LockError(GenericError):
67 a8083063 Iustin Pop
  """Lock error exception.
68 a8083063 Iustin Pop

69 a8083063 Iustin Pop
  This signifies problems in the locking subsystem.
70 a8083063 Iustin Pop

71 a8083063 Iustin Pop
  """
72 a8083063 Iustin Pop
73 a8083063 Iustin Pop
74 b6522276 Michael Hanselmann
class PidFileLockError(LockError):
75 b6522276 Michael Hanselmann
  """PID file is already locked by another process.
76 b6522276 Michael Hanselmann

77 b6522276 Michael Hanselmann
  """
78 b6522276 Michael Hanselmann
79 b6522276 Michael Hanselmann
80 a8083063 Iustin Pop
class HypervisorError(GenericError):
81 a8083063 Iustin Pop
  """Hypervisor-related exception.
82 a8083063 Iustin Pop

83 a8083063 Iustin Pop
  This is raised in case we can't communicate with the hypervisor
84 a8083063 Iustin Pop
  properly.
85 a8083063 Iustin Pop

86 a8083063 Iustin Pop
  """
87 a8083063 Iustin Pop
88 a8083063 Iustin Pop
89 a8083063 Iustin Pop
class ProgrammerError(GenericError):
90 a8083063 Iustin Pop
  """Programming-related error.
91 a8083063 Iustin Pop

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

96 a8083063 Iustin Pop
  """
97 a8083063 Iustin Pop
98 a8083063 Iustin Pop
99 a8083063 Iustin Pop
class BlockDeviceError(GenericError):
100 a8083063 Iustin Pop
  """Block-device related exception.
101 a8083063 Iustin Pop

102 a8083063 Iustin Pop
  This is raised in case we can't setup the instance's block devices
103 a8083063 Iustin Pop
  properly.
104 a8083063 Iustin Pop

105 a8083063 Iustin Pop
  """
106 a8083063 Iustin Pop
107 a8083063 Iustin Pop
108 a8083063 Iustin Pop
class ConfigurationError(GenericError):
109 a8083063 Iustin Pop
  """Configuration related exception.
110 a8083063 Iustin Pop

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

114 a8083063 Iustin Pop
  """
115 a8083063 Iustin Pop
116 a8083063 Iustin Pop
117 4b63dc7a Iustin Pop
class ConfigVersionMismatch(ConfigurationError):
118 4b63dc7a Iustin Pop
  """Version mismatch in the configuration file.
119 4b63dc7a Iustin Pop

120 4b63dc7a Iustin Pop
  The error has two arguments: the expected and the actual found
121 4b63dc7a Iustin Pop
  version.
122 4b63dc7a Iustin Pop

123 4b63dc7a Iustin Pop
  """
124 4b63dc7a Iustin Pop
125 4b63dc7a Iustin Pop
126 488e1849 Apollon Oikonomopoulos
class AddressPoolError(GenericError):
127 488e1849 Apollon Oikonomopoulos
  """Errors related to IP address pools.
128 488e1849 Apollon Oikonomopoulos

129 488e1849 Apollon Oikonomopoulos
  """
130 488e1849 Apollon Oikonomopoulos
131 488e1849 Apollon Oikonomopoulos
132 2c8a5690 Guido Trotter
class ReservationError(GenericError):
133 2c8a5690 Guido Trotter
  """Errors reserving a resource.
134 2c8a5690 Guido Trotter

135 2c8a5690 Guido Trotter
  """
136 2c8a5690 Guido Trotter
137 2c8a5690 Guido Trotter
138 a8083063 Iustin Pop
class RemoteError(GenericError):
139 a8083063 Iustin Pop
  """Programming-related error on remote call.
140 a8083063 Iustin Pop

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

144 a8083063 Iustin Pop
  """
145 a8083063 Iustin Pop
146 a8083063 Iustin Pop
147 f4a2f532 Guido Trotter
class SignatureError(GenericError):
148 f4a2f532 Guido Trotter
  """Error authenticating a remote message.
149 f4a2f532 Guido Trotter

150 f4a2f532 Guido Trotter
  This is raised when the hmac signature on a message doesn't verify correctly
151 f4a2f532 Guido Trotter
  to the message itself. It can happen because of network unreliability or
152 f4a2f532 Guido Trotter
  because of spurious traffic.
153 f4a2f532 Guido Trotter

154 f4a2f532 Guido Trotter
  """
155 f4a2f532 Guido Trotter
156 f4a2f532 Guido Trotter
157 a8083063 Iustin Pop
class ParameterError(GenericError):
158 a8083063 Iustin Pop
  """A passed parameter to a command is invalid.
159 a8083063 Iustin Pop

160 a8083063 Iustin Pop
  This is raised when the parameter passed to a request function is
161 a8083063 Iustin Pop
  invalid. Correct code should have verified this before passing the
162 a8083063 Iustin Pop
  request structure.
163 a8083063 Iustin Pop

164 a8083063 Iustin Pop
  The argument to this exception should be the parameter name.
165 a8083063 Iustin Pop

166 a8083063 Iustin Pop
  """
167 a8083063 Iustin Pop
168 a8083063 Iustin Pop
169 776b6291 René Nussbaumer
class ResultValidationError(GenericError):
170 776b6291 René Nussbaumer
  """The iallocation results fails validation.
171 776b6291 René Nussbaumer

172 776b6291 René Nussbaumer
  """
173 776b6291 René Nussbaumer
174 776b6291 René Nussbaumer
175 a8083063 Iustin Pop
class OpPrereqError(GenericError):
176 a8083063 Iustin Pop
  """Prerequisites for the OpCode are not fulfilled.
177 a8083063 Iustin Pop

178 5c983ee5 Iustin Pop
  This exception will have either one or two arguments. For the
179 5c983ee5 Iustin Pop
  two-argument construction, the second argument should be one of the
180 5c983ee5 Iustin Pop
  ECODE_* codes.
181 5c983ee5 Iustin Pop

182 a8083063 Iustin Pop
  """
183 a8083063 Iustin Pop
184 098c0958 Michael Hanselmann
185 a8083063 Iustin Pop
class OpExecError(GenericError):
186 a8083063 Iustin Pop
  """Error during OpCode execution.
187 a8083063 Iustin Pop

188 a8083063 Iustin Pop
  """
189 a8083063 Iustin Pop
190 098c0958 Michael Hanselmann
191 1ce03fb1 Michael Hanselmann
class OpResultError(GenericError):
192 1ce03fb1 Michael Hanselmann
  """Issue with OpCode result.
193 1ce03fb1 Michael Hanselmann

194 1ce03fb1 Michael Hanselmann
  """
195 1ce03fb1 Michael Hanselmann
196 1ce03fb1 Michael Hanselmann
197 a8083063 Iustin Pop
class OpCodeUnknown(GenericError):
198 a8083063 Iustin Pop
  """Unknown opcode submitted.
199 a8083063 Iustin Pop

200 a8083063 Iustin Pop
  This signifies a mismatch between the definitions on the client and
201 a8083063 Iustin Pop
  server side.
202 a8083063 Iustin Pop

203 a8083063 Iustin Pop
  """
204 a8083063 Iustin Pop
205 098c0958 Michael Hanselmann
206 685ee993 Iustin Pop
class JobLost(GenericError):
207 685ee993 Iustin Pop
  """Submitted job lost.
208 685ee993 Iustin Pop

209 685ee993 Iustin Pop
  The job was submitted but it cannot be found in the current job
210 685ee993 Iustin Pop
  list.
211 685ee993 Iustin Pop

212 685ee993 Iustin Pop
  """
213 685ee993 Iustin Pop
214 685ee993 Iustin Pop
215 3d6c5566 Guido Trotter
class JobFileCorrupted(GenericError):
216 3d6c5566 Guido Trotter
  """Job file could not be properly decoded/restored.
217 3d6c5566 Guido Trotter

218 3d6c5566 Guido Trotter
  """
219 3d6c5566 Guido Trotter
220 3d6c5566 Guido Trotter
221 89e1fc26 Iustin Pop
class ResolverError(GenericError):
222 89e1fc26 Iustin Pop
  """Host name cannot be resolved.
223 89e1fc26 Iustin Pop

224 89e1fc26 Iustin Pop
  This is not a normal situation for Ganeti, as we rely on having a
225 89e1fc26 Iustin Pop
  working resolver.
226 89e1fc26 Iustin Pop

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

231 89e1fc26 Iustin Pop
  """
232 89e1fc26 Iustin Pop
233 89e1fc26 Iustin Pop
234 a8083063 Iustin Pop
class HooksFailure(GenericError):
235 a8083063 Iustin Pop
  """A generic hook failure.
236 a8083063 Iustin Pop

237 a8083063 Iustin Pop
  This signifies usually a setup misconfiguration.
238 a8083063 Iustin Pop

239 a8083063 Iustin Pop
  """
240 a8083063 Iustin Pop
241 098c0958 Michael Hanselmann
242 a8083063 Iustin Pop
class HooksAbort(HooksFailure):
243 a8083063 Iustin Pop
  """A required hook has failed.
244 a8083063 Iustin Pop

245 a8083063 Iustin Pop
  This caused an abort of the operation in the initial phase. This
246 a8083063 Iustin Pop
  exception always has an attribute args which is a list of tuples of:
247 a8083063 Iustin Pop
    - node: the source node on which this hooks has failed
248 a8083063 Iustin Pop
    - script: the name of the script which aborted the run
249 a8083063 Iustin Pop

250 a8083063 Iustin Pop
  """
251 a8083063 Iustin Pop
252 098c0958 Michael Hanselmann
253 a8083063 Iustin Pop
class UnitParseError(GenericError):
254 a8083063 Iustin Pop
  """Unable to parse size unit.
255 a8083063 Iustin Pop

256 a8083063 Iustin Pop
  """
257 a8083063 Iustin Pop
258 ac2d0fe4 Michael Hanselmann
259 31155d60 Balazs Lecz
class ParseError(GenericError):
260 31155d60 Balazs Lecz
  """Generic parse error.
261 31155d60 Balazs Lecz

262 31155d60 Balazs Lecz
  Raised when unable to parse user input.
263 31155d60 Balazs Lecz

264 31155d60 Balazs Lecz
  """
265 31155d60 Balazs Lecz
266 31155d60 Balazs Lecz
267 a5728081 Guido Trotter
class TypeEnforcementError(GenericError):
268 a5728081 Guido Trotter
  """Unable to enforce data type.
269 a5728081 Guido Trotter

270 a5728081 Guido Trotter
  """
271 a8083063 Iustin Pop
272 ac2d0fe4 Michael Hanselmann
273 b6267745 Andrea Spadaccini
class X509CertError(GenericError):
274 b6267745 Andrea Spadaccini
  """Invalid X509 certificate.
275 b6267745 Andrea Spadaccini

276 b6267745 Andrea Spadaccini
  This error has two arguments: the certificate filename and the error cause.
277 b6267745 Andrea Spadaccini

278 b6267745 Andrea Spadaccini
  """
279 b6267745 Andrea Spadaccini
280 b6267745 Andrea Spadaccini
281 5c947f38 Iustin Pop
class TagError(GenericError):
282 5c947f38 Iustin Pop
  """Generic tag error.
283 5c947f38 Iustin Pop

284 5c947f38 Iustin Pop
  The argument to this exception will show the exact error.
285 5c947f38 Iustin Pop

286 5c947f38 Iustin Pop
  """
287 7bca53e4 Michael Hanselmann
288 7bca53e4 Michael Hanselmann
289 7bca53e4 Michael Hanselmann
class CommandError(GenericError):
290 7bca53e4 Michael Hanselmann
  """External command error.
291 7bca53e4 Michael Hanselmann

292 7bca53e4 Michael Hanselmann
  """
293 e50bdd68 Guido Trotter
294 e50bdd68 Guido Trotter
295 ac2d0fe4 Michael Hanselmann
class StorageError(GenericError):
296 ac2d0fe4 Michael Hanselmann
  """Storage-related exception.
297 ac2d0fe4 Michael Hanselmann

298 ac2d0fe4 Michael Hanselmann
  """
299 ac2d0fe4 Michael Hanselmann
300 589dee9a Guido Trotter
301 589dee9a Guido Trotter
class InotifyError(GenericError):
302 589dee9a Guido Trotter
  """Error raised when there is a failure setting up an inotify watcher.
303 589dee9a Guido Trotter

304 589dee9a Guido Trotter
  """
305 589dee9a Guido Trotter
306 ac2d0fe4 Michael Hanselmann
307 e50bdd68 Guido Trotter
class QuitGanetiException(Exception):
308 7e975535 Stephen Shirley
  """Signal Ganeti that it must quit.
309 e50bdd68 Guido Trotter

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

319 c41eea6e Iustin Pop
  Examples::
320 c41eea6e Iustin Pop

321 e50bdd68 Guido Trotter
    # Return a result of "True" to the caller, but quit ganeti afterwards
322 0623d351 Iustin Pop
    raise QuitGanetiException(True, None)
323 e50bdd68 Guido Trotter
    # Send an error to the caller, and quit ganeti
324 0623d351 Iustin Pop
    raise QuitGanetiException(False, "Fatal safety violation, shutting down")
325 e50bdd68 Guido Trotter

326 e50bdd68 Guido Trotter
  """
327 e50bdd68 Guido Trotter
328 f1da30e6 Michael Hanselmann
329 d11bda8d Iustin Pop
class JobQueueError(GenericError):
330 f1da30e6 Michael Hanselmann
  """Job queue error.
331 f1da30e6 Michael Hanselmann

332 f1da30e6 Michael Hanselmann
  """
333 6797ec29 Iustin Pop
334 6797ec29 Iustin Pop
335 686d7433 Iustin Pop
class JobQueueDrainError(JobQueueError):
336 686d7433 Iustin Pop
  """Job queue is marked for drain error.
337 686d7433 Iustin Pop

338 686d7433 Iustin Pop
  This is raised when a job submission attempt is made but the queue
339 686d7433 Iustin Pop
  is marked for drain.
340 686d7433 Iustin Pop

341 686d7433 Iustin Pop
  """
342 686d7433 Iustin Pop
343 686d7433 Iustin Pop
344 f87b405e Michael Hanselmann
class JobQueueFull(JobQueueError):
345 f87b405e Michael Hanselmann
  """Job queue full error.
346 f87b405e Michael Hanselmann

347 f87b405e Michael Hanselmann
  Raised when job queue size reached its hard limit.
348 f87b405e Michael Hanselmann

349 f87b405e Michael Hanselmann
  """
350 f87b405e Michael Hanselmann
351 f87b405e Michael Hanselmann
352 9748ab35 Guido Trotter
class ConfdMagicError(GenericError):
353 9748ab35 Guido Trotter
  """A magic fourcc error in Ganeti confd.
354 9748ab35 Guido Trotter

355 9748ab35 Guido Trotter
  Errors processing the fourcc in ganeti confd datagrams.
356 9748ab35 Guido Trotter

357 9748ab35 Guido Trotter
  """
358 9748ab35 Guido Trotter
359 9748ab35 Guido Trotter
360 e4ccf6cd Guido Trotter
class ConfdClientError(GenericError):
361 e4ccf6cd Guido Trotter
  """A magic fourcc error in Ganeti confd.
362 e4ccf6cd Guido Trotter

363 e4ccf6cd Guido Trotter
  Errors in the confd client library.
364 e4ccf6cd Guido Trotter

365 e4ccf6cd Guido Trotter
  """
366 e4ccf6cd Guido Trotter
367 e4ccf6cd Guido Trotter
368 c8eded0b Guido Trotter
class UdpDataSizeError(GenericError):
369 c8eded0b Guido Trotter
  """UDP payload too big.
370 c8eded0b Guido Trotter

371 c8eded0b Guido Trotter
  """
372 c8eded0b Guido Trotter
373 c8eded0b Guido Trotter
374 4c32a8bd Luca Bigliardi
class NoCtypesError(GenericError):
375 4c32a8bd Luca Bigliardi
  """python ctypes module is not found in the system.
376 4c32a8bd Luca Bigliardi

377 4c32a8bd Luca Bigliardi
  """
378 4c32a8bd Luca Bigliardi
379 4c32a8bd Luca Bigliardi
380 8b312c1d Manuel Franceschini
class IPAddressError(GenericError):
381 8b312c1d Manuel Franceschini
  """Generic IP address error.
382 8b312c1d Manuel Franceschini

383 8b312c1d Manuel Franceschini
  """
384 8b312c1d Manuel Franceschini
385 8b312c1d Manuel Franceschini
386 7a8bda3f Michael Hanselmann
class LuxiError(GenericError):
387 7a8bda3f Michael Hanselmann
  """LUXI error.
388 7a8bda3f Michael Hanselmann

389 7a8bda3f Michael Hanselmann
  """
390 7a8bda3f Michael Hanselmann
391 7a8bda3f Michael Hanselmann
392 7578ab0a Michael Hanselmann
class QueryFilterParseError(ParseError):
393 7578ab0a Michael Hanselmann
  """Error while parsing query filter.
394 7578ab0a Michael Hanselmann

395 7578ab0a Michael Hanselmann
  """
396 7578ab0a Michael Hanselmann
  def GetDetails(self):
397 7578ab0a Michael Hanselmann
    """Returns a list of strings with details about the error.
398 7578ab0a Michael Hanselmann

399 7578ab0a Michael Hanselmann
    """
400 7578ab0a Michael Hanselmann
    try:
401 7578ab0a Michael Hanselmann
      (_, inner) = self.args
402 7578ab0a Michael Hanselmann
    except IndexError:
403 7578ab0a Michael Hanselmann
      return None
404 7578ab0a Michael Hanselmann
405 7578ab0a Michael Hanselmann
    return [str(inner.line),
406 7578ab0a Michael Hanselmann
            (" " * (inner.column - 1)) + "^",
407 7578ab0a Michael Hanselmann
            str(inner)]
408 7578ab0a Michael Hanselmann
409 7578ab0a Michael Hanselmann
410 352e1a26 Michael Hanselmann
class RapiTestResult(GenericError):
411 352e1a26 Michael Hanselmann
  """Exception containing results from RAPI test utilities.
412 352e1a26 Michael Hanselmann

413 352e1a26 Michael Hanselmann
  """
414 352e1a26 Michael Hanselmann
415 352e1a26 Michael Hanselmann
416 fbdac0d9 Michael Hanselmann
class FileStoragePathError(GenericError):
417 fbdac0d9 Michael Hanselmann
  """Error from file storage path validation.
418 fbdac0d9 Michael Hanselmann

419 fbdac0d9 Michael Hanselmann
  """
420 fbdac0d9 Michael Hanselmann
421 fbdac0d9 Michael Hanselmann
422 6797ec29 Iustin Pop
# errors should be added above
423 6797ec29 Iustin Pop
424 6797ec29 Iustin Pop
425 6797ec29 Iustin Pop
def GetErrorClass(name):
426 6797ec29 Iustin Pop
  """Return the class of an exception.
427 6797ec29 Iustin Pop

428 6797ec29 Iustin Pop
  Given the class name, return the class itself.
429 6797ec29 Iustin Pop

430 6797ec29 Iustin Pop
  @type name: str
431 6797ec29 Iustin Pop
  @param name: the exception name
432 6797ec29 Iustin Pop
  @rtype: class
433 6797ec29 Iustin Pop
  @return: the actual class, or None if not found
434 6797ec29 Iustin Pop

435 6797ec29 Iustin Pop
  """
436 6797ec29 Iustin Pop
  item = globals().get(name, None)
437 6797ec29 Iustin Pop
  if item is not None:
438 6797ec29 Iustin Pop
    if not (isinstance(item, type(Exception)) and
439 6797ec29 Iustin Pop
            issubclass(item, GenericError)):
440 6797ec29 Iustin Pop
      item = None
441 6797ec29 Iustin Pop
  return item
442 6956e9cd Iustin Pop
443 6956e9cd Iustin Pop
444 6956e9cd Iustin Pop
def EncodeException(err):
445 6956e9cd Iustin Pop
  """Encodes an exception into a format that L{MaybeRaise} will recognise.
446 6956e9cd Iustin Pop

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

450 6956e9cd Iustin Pop
  @type err: GenericError child
451 6956e9cd Iustin Pop
  @param err: usually a child of GenericError (but any exception
452 6956e9cd Iustin Pop
      will be accepted)
453 6956e9cd Iustin Pop
  @rtype: tuple
454 6956e9cd Iustin Pop
  @return: tuple of (exception name, exception arguments)
455 6956e9cd Iustin Pop

456 6956e9cd Iustin Pop
  """
457 6956e9cd Iustin Pop
  return (err.__class__.__name__, err.args)
458 6956e9cd Iustin Pop
459 6956e9cd Iustin Pop
460 84f790e6 Michael Hanselmann
def GetEncodedError(result):
461 84f790e6 Michael Hanselmann
  """If this looks like an encoded Ganeti exception, return it.
462 6956e9cd Iustin Pop

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

467 6956e9cd Iustin Pop
  """
468 6956e9cd Iustin Pop
  tlt = (tuple, list)
469 6956e9cd Iustin Pop
  if (isinstance(result, tlt) and len(result) == 2 and
470 6956e9cd Iustin Pop
      isinstance(result[1], tlt)):
471 6956e9cd Iustin Pop
    # custom ganeti errors
472 84f790e6 Michael Hanselmann
    errcls = GetErrorClass(result[0])
473 84f790e6 Michael Hanselmann
    if errcls:
474 84f790e6 Michael Hanselmann
      return (errcls, tuple(result[1]))
475 84f790e6 Michael Hanselmann
476 84f790e6 Michael Hanselmann
  return None
477 84f790e6 Michael Hanselmann
478 84f790e6 Michael Hanselmann
479 84f790e6 Michael Hanselmann
def MaybeRaise(result):
480 84f790e6 Michael Hanselmann
  """If this looks like an encoded Ganeti exception, raise it.
481 84f790e6 Michael Hanselmann

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

485 84f790e6 Michael Hanselmann
  """
486 84f790e6 Michael Hanselmann
  error = GetEncodedError(result)
487 84f790e6 Michael Hanselmann
  if error:
488 84f790e6 Michael Hanselmann
    (errcls, args) = error
489 98dfcaff Iustin Pop
    # pylint: disable=W0142
490 98dfcaff Iustin Pop
    raise errcls(*args)