Statistics
| Branch: | Tag: | Revision:

root / lib / errors.py @ 7142485a

History | View | Annotate | Download (10.4 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 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
  pass
65 a8083063 Iustin Pop
66 a8083063 Iustin Pop
67 a8083063 Iustin Pop
class LVMError(GenericError):
68 a8083063 Iustin Pop
  """LVM-related exception.
69 a8083063 Iustin Pop

70 a8083063 Iustin Pop
  This exception codifies problems with LVM setup.
71 a8083063 Iustin Pop

72 a8083063 Iustin Pop
  """
73 a8083063 Iustin Pop
  pass
74 a8083063 Iustin Pop
75 a8083063 Iustin Pop
76 a8083063 Iustin Pop
class LockError(GenericError):
77 a8083063 Iustin Pop
  """Lock error exception.
78 a8083063 Iustin Pop

79 a8083063 Iustin Pop
  This signifies problems in the locking subsystem.
80 a8083063 Iustin Pop

81 a8083063 Iustin Pop
  """
82 a8083063 Iustin Pop
  pass
83 a8083063 Iustin Pop
84 a8083063 Iustin Pop
85 b6522276 Michael Hanselmann
class PidFileLockError(LockError):
86 b6522276 Michael Hanselmann
  """PID file is already locked by another process.
87 b6522276 Michael Hanselmann

88 b6522276 Michael Hanselmann
  """
89 b6522276 Michael Hanselmann
90 b6522276 Michael Hanselmann
91 a8083063 Iustin Pop
class HypervisorError(GenericError):
92 a8083063 Iustin Pop
  """Hypervisor-related exception.
93 a8083063 Iustin Pop

94 a8083063 Iustin Pop
  This is raised in case we can't communicate with the hypervisor
95 a8083063 Iustin Pop
  properly.
96 a8083063 Iustin Pop

97 a8083063 Iustin Pop
  """
98 a8083063 Iustin Pop
  pass
99 a8083063 Iustin Pop
100 a8083063 Iustin Pop
101 a8083063 Iustin Pop
class ProgrammerError(GenericError):
102 a8083063 Iustin Pop
  """Programming-related error.
103 a8083063 Iustin Pop

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

108 a8083063 Iustin Pop
  """
109 a8083063 Iustin Pop
  pass
110 a8083063 Iustin Pop
111 a8083063 Iustin Pop
112 a8083063 Iustin Pop
class BlockDeviceError(GenericError):
113 a8083063 Iustin Pop
  """Block-device related exception.
114 a8083063 Iustin Pop

115 a8083063 Iustin Pop
  This is raised in case we can't setup the instance's block devices
116 a8083063 Iustin Pop
  properly.
117 a8083063 Iustin Pop

118 a8083063 Iustin Pop
  """
119 a8083063 Iustin Pop
  pass
120 a8083063 Iustin Pop
121 a8083063 Iustin Pop
122 a8083063 Iustin Pop
class ConfigurationError(GenericError):
123 a8083063 Iustin Pop
  """Configuration related exception.
124 a8083063 Iustin Pop

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

128 a8083063 Iustin Pop
  """
129 a8083063 Iustin Pop
  pass
130 a8083063 Iustin Pop
131 a8083063 Iustin Pop
132 4b63dc7a Iustin Pop
class ConfigVersionMismatch(ConfigurationError):
133 4b63dc7a Iustin Pop
  """Version mismatch in the configuration file.
134 4b63dc7a Iustin Pop

135 4b63dc7a Iustin Pop
  The error has two arguments: the expected and the actual found
136 4b63dc7a Iustin Pop
  version.
137 4b63dc7a Iustin Pop

138 4b63dc7a Iustin Pop
  """
139 4b63dc7a Iustin Pop
  pass
140 4b63dc7a Iustin Pop
141 4b63dc7a Iustin Pop
142 2c8a5690 Guido Trotter
class ReservationError(GenericError):
143 2c8a5690 Guido Trotter
  """Errors reserving a resource.
144 2c8a5690 Guido Trotter

145 2c8a5690 Guido Trotter
  """
146 2c8a5690 Guido Trotter
147 2c8a5690 Guido Trotter
148 a8083063 Iustin Pop
class RemoteError(GenericError):
149 a8083063 Iustin Pop
  """Programming-related error on remote call.
150 a8083063 Iustin Pop

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

154 a8083063 Iustin Pop
  """
155 a8083063 Iustin Pop
  pass
156 a8083063 Iustin Pop
157 a8083063 Iustin Pop
158 f4a2f532 Guido Trotter
class SignatureError(GenericError):
159 f4a2f532 Guido Trotter
  """Error authenticating a remote message.
160 f4a2f532 Guido Trotter

161 f4a2f532 Guido Trotter
  This is raised when the hmac signature on a message doesn't verify correctly
162 f4a2f532 Guido Trotter
  to the message itself. It can happen because of network unreliability or
163 f4a2f532 Guido Trotter
  because of spurious traffic.
164 f4a2f532 Guido Trotter

165 f4a2f532 Guido Trotter
  """
166 f4a2f532 Guido Trotter
  pass
167 f4a2f532 Guido Trotter
168 f4a2f532 Guido Trotter
169 a8083063 Iustin Pop
class ParameterError(GenericError):
170 a8083063 Iustin Pop
  """A passed parameter to a command is invalid.
171 a8083063 Iustin Pop

172 a8083063 Iustin Pop
  This is raised when the parameter passed to a request function is
173 a8083063 Iustin Pop
  invalid. Correct code should have verified this before passing the
174 a8083063 Iustin Pop
  request structure.
175 a8083063 Iustin Pop

176 a8083063 Iustin Pop
  The argument to this exception should be the parameter name.
177 a8083063 Iustin Pop

178 a8083063 Iustin Pop
  """
179 a8083063 Iustin Pop
  pass
180 a8083063 Iustin Pop
181 a8083063 Iustin Pop
182 a8083063 Iustin Pop
class OpPrereqError(GenericError):
183 a8083063 Iustin Pop
  """Prerequisites for the OpCode are not fulfilled.
184 a8083063 Iustin Pop

185 5c983ee5 Iustin Pop
  This exception will have either one or two arguments. For the
186 5c983ee5 Iustin Pop
  two-argument construction, the second argument should be one of the
187 5c983ee5 Iustin Pop
  ECODE_* codes.
188 5c983ee5 Iustin Pop

189 a8083063 Iustin Pop
  """
190 a8083063 Iustin Pop
191 098c0958 Michael Hanselmann
192 a8083063 Iustin Pop
class OpExecError(GenericError):
193 a8083063 Iustin Pop
  """Error during OpCode execution.
194 a8083063 Iustin Pop

195 a8083063 Iustin Pop
  """
196 a8083063 Iustin Pop
197 098c0958 Michael Hanselmann
198 1ce03fb1 Michael Hanselmann
class OpResultError(GenericError):
199 1ce03fb1 Michael Hanselmann
  """Issue with OpCode result.
200 1ce03fb1 Michael Hanselmann

201 1ce03fb1 Michael Hanselmann
  """
202 1ce03fb1 Michael Hanselmann
203 1ce03fb1 Michael Hanselmann
204 a8083063 Iustin Pop
class OpCodeUnknown(GenericError):
205 a8083063 Iustin Pop
  """Unknown opcode submitted.
206 a8083063 Iustin Pop

207 a8083063 Iustin Pop
  This signifies a mismatch between the definitions on the client and
208 a8083063 Iustin Pop
  server side.
209 a8083063 Iustin Pop

210 a8083063 Iustin Pop
  """
211 a8083063 Iustin Pop
212 098c0958 Michael Hanselmann
213 685ee993 Iustin Pop
class JobLost(GenericError):
214 685ee993 Iustin Pop
  """Submitted job lost.
215 685ee993 Iustin Pop

216 685ee993 Iustin Pop
  The job was submitted but it cannot be found in the current job
217 685ee993 Iustin Pop
  list.
218 685ee993 Iustin Pop

219 685ee993 Iustin Pop
  """
220 685ee993 Iustin Pop
221 685ee993 Iustin Pop
222 3d6c5566 Guido Trotter
class JobFileCorrupted(GenericError):
223 3d6c5566 Guido Trotter
  """Job file could not be properly decoded/restored.
224 3d6c5566 Guido Trotter

225 3d6c5566 Guido Trotter
  """
226 3d6c5566 Guido Trotter
227 3d6c5566 Guido Trotter
228 89e1fc26 Iustin Pop
class ResolverError(GenericError):
229 89e1fc26 Iustin Pop
  """Host name cannot be resolved.
230 89e1fc26 Iustin Pop

231 89e1fc26 Iustin Pop
  This is not a normal situation for Ganeti, as we rely on having a
232 89e1fc26 Iustin Pop
  working resolver.
233 89e1fc26 Iustin Pop

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

238 89e1fc26 Iustin Pop
  """
239 89e1fc26 Iustin Pop
240 89e1fc26 Iustin Pop
241 a8083063 Iustin Pop
class HooksFailure(GenericError):
242 a8083063 Iustin Pop
  """A generic hook failure.
243 a8083063 Iustin Pop

244 a8083063 Iustin Pop
  This signifies usually a setup misconfiguration.
245 a8083063 Iustin Pop

246 a8083063 Iustin Pop
  """
247 a8083063 Iustin Pop
248 098c0958 Michael Hanselmann
249 a8083063 Iustin Pop
class HooksAbort(HooksFailure):
250 a8083063 Iustin Pop
  """A required hook has failed.
251 a8083063 Iustin Pop

252 a8083063 Iustin Pop
  This caused an abort of the operation in the initial phase. This
253 a8083063 Iustin Pop
  exception always has an attribute args which is a list of tuples of:
254 a8083063 Iustin Pop
    - node: the source node on which this hooks has failed
255 a8083063 Iustin Pop
    - script: the name of the script which aborted the run
256 a8083063 Iustin Pop

257 a8083063 Iustin Pop
  """
258 a8083063 Iustin Pop
259 098c0958 Michael Hanselmann
260 a8083063 Iustin Pop
class UnitParseError(GenericError):
261 a8083063 Iustin Pop
  """Unable to parse size unit.
262 a8083063 Iustin Pop

263 a8083063 Iustin Pop
  """
264 a8083063 Iustin Pop
265 ac2d0fe4 Michael Hanselmann
266 31155d60 Balazs Lecz
class ParseError(GenericError):
267 31155d60 Balazs Lecz
  """Generic parse error.
268 31155d60 Balazs Lecz

269 31155d60 Balazs Lecz
  Raised when unable to parse user input.
270 31155d60 Balazs Lecz

271 31155d60 Balazs Lecz
  """
272 31155d60 Balazs Lecz
273 31155d60 Balazs Lecz
274 a5728081 Guido Trotter
class TypeEnforcementError(GenericError):
275 a5728081 Guido Trotter
  """Unable to enforce data type.
276 a5728081 Guido Trotter

277 a5728081 Guido Trotter
  """
278 a8083063 Iustin Pop
279 ac2d0fe4 Michael Hanselmann
280 a8083063 Iustin Pop
class SshKeyError(GenericError):
281 a8083063 Iustin Pop
  """Invalid SSH key.
282 b0059682 Guido Trotter

283 a8083063 Iustin Pop
  """
284 5c947f38 Iustin Pop
285 5c947f38 Iustin Pop
286 b6267745 Andrea Spadaccini
class X509CertError(GenericError):
287 b6267745 Andrea Spadaccini
  """Invalid X509 certificate.
288 b6267745 Andrea Spadaccini

289 b6267745 Andrea Spadaccini
  This error has two arguments: the certificate filename and the error cause.
290 b6267745 Andrea Spadaccini

291 b6267745 Andrea Spadaccini
  """
292 b6267745 Andrea Spadaccini
293 b6267745 Andrea Spadaccini
294 5c947f38 Iustin Pop
class TagError(GenericError):
295 5c947f38 Iustin Pop
  """Generic tag error.
296 5c947f38 Iustin Pop

297 5c947f38 Iustin Pop
  The argument to this exception will show the exact error.
298 5c947f38 Iustin Pop

299 5c947f38 Iustin Pop
  """
300 7bca53e4 Michael Hanselmann
301 7bca53e4 Michael Hanselmann
302 7bca53e4 Michael Hanselmann
class CommandError(GenericError):
303 7bca53e4 Michael Hanselmann
  """External command error.
304 7bca53e4 Michael Hanselmann

305 7bca53e4 Michael Hanselmann
  """
306 e50bdd68 Guido Trotter
307 e50bdd68 Guido Trotter
308 ac2d0fe4 Michael Hanselmann
class StorageError(GenericError):
309 ac2d0fe4 Michael Hanselmann
  """Storage-related exception.
310 ac2d0fe4 Michael Hanselmann

311 ac2d0fe4 Michael Hanselmann
  """
312 ac2d0fe4 Michael Hanselmann
313 589dee9a Guido Trotter
314 589dee9a Guido Trotter
class InotifyError(GenericError):
315 589dee9a Guido Trotter
  """Error raised when there is a failure setting up an inotify watcher.
316 589dee9a Guido Trotter

317 589dee9a Guido Trotter
  """
318 589dee9a Guido Trotter
319 ac2d0fe4 Michael Hanselmann
320 e50bdd68 Guido Trotter
class QuitGanetiException(Exception):
321 7e975535 Stephen Shirley
  """Signal Ganeti that it must quit.
322 e50bdd68 Guido Trotter

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

332 c41eea6e Iustin Pop
  Examples::
333 c41eea6e Iustin Pop

334 e50bdd68 Guido Trotter
    # Return a result of "True" to the caller, but quit ganeti afterwards
335 0623d351 Iustin Pop
    raise QuitGanetiException(True, None)
336 e50bdd68 Guido Trotter
    # Send an error to the caller, and quit ganeti
337 0623d351 Iustin Pop
    raise QuitGanetiException(False, "Fatal safety violation, shutting down")
338 e50bdd68 Guido Trotter

339 e50bdd68 Guido Trotter
  """
340 e50bdd68 Guido Trotter
341 f1da30e6 Michael Hanselmann
342 d11bda8d Iustin Pop
class JobQueueError(GenericError):
343 f1da30e6 Michael Hanselmann
  """Job queue error.
344 f1da30e6 Michael Hanselmann

345 f1da30e6 Michael Hanselmann
  """
346 6797ec29 Iustin Pop
347 6797ec29 Iustin Pop
348 686d7433 Iustin Pop
class JobQueueDrainError(JobQueueError):
349 686d7433 Iustin Pop
  """Job queue is marked for drain error.
350 686d7433 Iustin Pop

351 686d7433 Iustin Pop
  This is raised when a job submission attempt is made but the queue
352 686d7433 Iustin Pop
  is marked for drain.
353 686d7433 Iustin Pop

354 686d7433 Iustin Pop
  """
355 686d7433 Iustin Pop
356 686d7433 Iustin Pop
357 f87b405e Michael Hanselmann
class JobQueueFull(JobQueueError):
358 f87b405e Michael Hanselmann
  """Job queue full error.
359 f87b405e Michael Hanselmann

360 f87b405e Michael Hanselmann
  Raised when job queue size reached its hard limit.
361 f87b405e Michael Hanselmann

362 f87b405e Michael Hanselmann
  """
363 f87b405e Michael Hanselmann
364 f87b405e Michael Hanselmann
365 b125e3b3 Guido Trotter
class ConfdRequestError(GenericError):
366 b125e3b3 Guido Trotter
  """A request error in Ganeti confd.
367 b125e3b3 Guido Trotter

368 b125e3b3 Guido Trotter
  Events that should make confd abort the current request and proceed serving
369 b125e3b3 Guido Trotter
  different ones.
370 b125e3b3 Guido Trotter

371 b125e3b3 Guido Trotter
  """
372 b125e3b3 Guido Trotter
373 b125e3b3 Guido Trotter
374 9748ab35 Guido Trotter
class ConfdMagicError(GenericError):
375 9748ab35 Guido Trotter
  """A magic fourcc error in Ganeti confd.
376 9748ab35 Guido Trotter

377 9748ab35 Guido Trotter
  Errors processing the fourcc in ganeti confd datagrams.
378 9748ab35 Guido Trotter

379 9748ab35 Guido Trotter
  """
380 9748ab35 Guido Trotter
381 9748ab35 Guido Trotter
382 e4ccf6cd Guido Trotter
class ConfdClientError(GenericError):
383 e4ccf6cd Guido Trotter
  """A magic fourcc error in Ganeti confd.
384 e4ccf6cd Guido Trotter

385 e4ccf6cd Guido Trotter
  Errors in the confd client library.
386 e4ccf6cd Guido Trotter

387 e4ccf6cd Guido Trotter
  """
388 e4ccf6cd Guido Trotter
389 e4ccf6cd Guido Trotter
390 c8eded0b Guido Trotter
class UdpDataSizeError(GenericError):
391 c8eded0b Guido Trotter
  """UDP payload too big.
392 c8eded0b Guido Trotter

393 c8eded0b Guido Trotter
  """
394 c8eded0b Guido Trotter
395 c8eded0b Guido Trotter
396 4c32a8bd Luca Bigliardi
class NoCtypesError(GenericError):
397 4c32a8bd Luca Bigliardi
  """python ctypes module is not found in the system.
398 4c32a8bd Luca Bigliardi

399 4c32a8bd Luca Bigliardi
  """
400 4c32a8bd Luca Bigliardi
401 4c32a8bd Luca Bigliardi
402 8b312c1d Manuel Franceschini
class IPAddressError(GenericError):
403 8b312c1d Manuel Franceschini
  """Generic IP address error.
404 8b312c1d Manuel Franceschini

405 8b312c1d Manuel Franceschini
  """
406 8b312c1d Manuel Franceschini
407 8b312c1d Manuel Franceschini
408 7a8bda3f Michael Hanselmann
class LuxiError(GenericError):
409 7a8bda3f Michael Hanselmann
  """LUXI error.
410 7a8bda3f Michael Hanselmann

411 7a8bda3f Michael Hanselmann
  """
412 7a8bda3f Michael Hanselmann
413 7a8bda3f Michael Hanselmann
414 7578ab0a Michael Hanselmann
class QueryFilterParseError(ParseError):
415 7578ab0a Michael Hanselmann
  """Error while parsing query filter.
416 7578ab0a Michael Hanselmann

417 7578ab0a Michael Hanselmann
  """
418 7578ab0a Michael Hanselmann
  def GetDetails(self):
419 7578ab0a Michael Hanselmann
    """Returns a list of strings with details about the error.
420 7578ab0a Michael Hanselmann

421 7578ab0a Michael Hanselmann
    """
422 7578ab0a Michael Hanselmann
    try:
423 7578ab0a Michael Hanselmann
      (_, inner) = self.args
424 7578ab0a Michael Hanselmann
    except IndexError:
425 7578ab0a Michael Hanselmann
      return None
426 7578ab0a Michael Hanselmann
427 7578ab0a Michael Hanselmann
    return [str(inner.line),
428 7578ab0a Michael Hanselmann
            (" " * (inner.column - 1)) + "^",
429 7578ab0a Michael Hanselmann
            str(inner)]
430 7578ab0a Michael Hanselmann
431 7578ab0a Michael Hanselmann
432 6797ec29 Iustin Pop
# errors should be added above
433 6797ec29 Iustin Pop
434 6797ec29 Iustin Pop
435 6797ec29 Iustin Pop
def GetErrorClass(name):
436 6797ec29 Iustin Pop
  """Return the class of an exception.
437 6797ec29 Iustin Pop

438 6797ec29 Iustin Pop
  Given the class name, return the class itself.
439 6797ec29 Iustin Pop

440 6797ec29 Iustin Pop
  @type name: str
441 6797ec29 Iustin Pop
  @param name: the exception name
442 6797ec29 Iustin Pop
  @rtype: class
443 6797ec29 Iustin Pop
  @return: the actual class, or None if not found
444 6797ec29 Iustin Pop

445 6797ec29 Iustin Pop
  """
446 6797ec29 Iustin Pop
  item = globals().get(name, None)
447 6797ec29 Iustin Pop
  if item is not None:
448 6797ec29 Iustin Pop
    if not (isinstance(item, type(Exception)) and
449 6797ec29 Iustin Pop
            issubclass(item, GenericError)):
450 6797ec29 Iustin Pop
      item = None
451 6797ec29 Iustin Pop
  return item
452 6956e9cd Iustin Pop
453 6956e9cd Iustin Pop
454 6956e9cd Iustin Pop
def EncodeException(err):
455 6956e9cd Iustin Pop
  """Encodes an exception into a format that L{MaybeRaise} will recognise.
456 6956e9cd Iustin Pop

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

460 6956e9cd Iustin Pop
  @type err: GenericError child
461 6956e9cd Iustin Pop
  @param err: usually a child of GenericError (but any exception
462 6956e9cd Iustin Pop
      will be accepted)
463 6956e9cd Iustin Pop
  @rtype: tuple
464 6956e9cd Iustin Pop
  @return: tuple of (exception name, exception arguments)
465 6956e9cd Iustin Pop

466 6956e9cd Iustin Pop
  """
467 6956e9cd Iustin Pop
  return (err.__class__.__name__, err.args)
468 6956e9cd Iustin Pop
469 6956e9cd Iustin Pop
470 84f790e6 Michael Hanselmann
def GetEncodedError(result):
471 84f790e6 Michael Hanselmann
  """If this looks like an encoded Ganeti exception, return it.
472 6956e9cd Iustin Pop

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

477 6956e9cd Iustin Pop
  """
478 6956e9cd Iustin Pop
  tlt = (tuple, list)
479 6956e9cd Iustin Pop
  if (isinstance(result, tlt) and len(result) == 2 and
480 6956e9cd Iustin Pop
      isinstance(result[1], tlt)):
481 6956e9cd Iustin Pop
    # custom ganeti errors
482 84f790e6 Michael Hanselmann
    errcls = GetErrorClass(result[0])
483 84f790e6 Michael Hanselmann
    if errcls:
484 84f790e6 Michael Hanselmann
      return (errcls, tuple(result[1]))
485 84f790e6 Michael Hanselmann
486 84f790e6 Michael Hanselmann
  return None
487 84f790e6 Michael Hanselmann
488 84f790e6 Michael Hanselmann
489 84f790e6 Michael Hanselmann
def MaybeRaise(result):
490 84f790e6 Michael Hanselmann
  """If this looks like an encoded Ganeti exception, raise it.
491 84f790e6 Michael Hanselmann

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

495 84f790e6 Michael Hanselmann
  """
496 84f790e6 Michael Hanselmann
  error = GetEncodedError(result)
497 84f790e6 Michael Hanselmann
  if error:
498 84f790e6 Michael Hanselmann
    (errcls, args) = error
499 e687ec01 Michael Hanselmann
    raise errcls(args)