Statistics
| Branch: | Tag: | Revision:

root / lib / errors.py @ 4fdedd09

History | View | Annotate | Download (10.7 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 LVMError(GenericError):
67 a8083063 Iustin Pop
  """LVM-related exception.
68 a8083063 Iustin Pop

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

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

77 a8083063 Iustin Pop
  This signifies problems in the locking subsystem.
78 a8083063 Iustin Pop

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

85 b6522276 Michael Hanselmann
  """
86 b6522276 Michael Hanselmann
87 b6522276 Michael Hanselmann
88 a8083063 Iustin Pop
class HypervisorError(GenericError):
89 a8083063 Iustin Pop
  """Hypervisor-related exception.
90 a8083063 Iustin Pop

91 a8083063 Iustin Pop
  This is raised in case we can't communicate with the hypervisor
92 a8083063 Iustin Pop
  properly.
93 a8083063 Iustin Pop

94 a8083063 Iustin Pop
  """
95 a8083063 Iustin Pop
96 a8083063 Iustin Pop
97 a8083063 Iustin Pop
class ProgrammerError(GenericError):
98 a8083063 Iustin Pop
  """Programming-related error.
99 a8083063 Iustin Pop

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

104 a8083063 Iustin Pop
  """
105 a8083063 Iustin Pop
106 a8083063 Iustin Pop
107 a8083063 Iustin Pop
class BlockDeviceError(GenericError):
108 a8083063 Iustin Pop
  """Block-device related exception.
109 a8083063 Iustin Pop

110 a8083063 Iustin Pop
  This is raised in case we can't setup the instance's block devices
111 a8083063 Iustin Pop
  properly.
112 a8083063 Iustin Pop

113 a8083063 Iustin Pop
  """
114 a8083063 Iustin Pop
115 a8083063 Iustin Pop
116 a8083063 Iustin Pop
class ConfigurationError(GenericError):
117 a8083063 Iustin Pop
  """Configuration related exception.
118 a8083063 Iustin Pop

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

122 a8083063 Iustin Pop
  """
123 a8083063 Iustin Pop
124 a8083063 Iustin Pop
125 4b63dc7a Iustin Pop
class ConfigVersionMismatch(ConfigurationError):
126 4b63dc7a Iustin Pop
  """Version mismatch in the configuration file.
127 4b63dc7a Iustin Pop

128 4b63dc7a Iustin Pop
  The error has two arguments: the expected and the actual found
129 4b63dc7a Iustin Pop
  version.
130 4b63dc7a Iustin Pop

131 4b63dc7a Iustin Pop
  """
132 4b63dc7a Iustin Pop
133 4b63dc7a Iustin Pop
134 2c8a5690 Guido Trotter
class ReservationError(GenericError):
135 2c8a5690 Guido Trotter
  """Errors reserving a resource.
136 2c8a5690 Guido Trotter

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

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

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

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

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

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

166 a8083063 Iustin Pop
  The argument to this exception should be the parameter name.
167 a8083063 Iustin Pop

168 a8083063 Iustin Pop
  """
169 a8083063 Iustin Pop
170 a8083063 Iustin Pop
171 776b6291 Renรฉ Nussbaumer
class ResultValidationError(GenericError):
172 776b6291 Renรฉ Nussbaumer
  """The iallocation results fails validation.
173 776b6291 Renรฉ Nussbaumer

174 776b6291 Renรฉ Nussbaumer
  """
175 776b6291 Renรฉ Nussbaumer
176 776b6291 Renรฉ Nussbaumer
177 a8083063 Iustin Pop
class OpPrereqError(GenericError):
178 a8083063 Iustin Pop
  """Prerequisites for the OpCode are not fulfilled.
179 a8083063 Iustin Pop

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

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

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

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

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

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

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

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

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

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

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

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

239 a8083063 Iustin Pop
  This signifies usually a setup misconfiguration.
240 a8083063 Iustin Pop

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

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

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

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

264 31155d60 Balazs Lecz
  Raised when unable to parse user input.
265 31155d60 Balazs Lecz

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

272 a5728081 Guido Trotter
  """
273 a8083063 Iustin Pop
274 ac2d0fe4 Michael Hanselmann
275 a8083063 Iustin Pop
class SshKeyError(GenericError):
276 a8083063 Iustin Pop
  """Invalid SSH key.
277 b0059682 Guido Trotter

278 a8083063 Iustin Pop
  """
279 5c947f38 Iustin Pop
280 5c947f38 Iustin Pop
281 b6267745 Andrea Spadaccini
class X509CertError(GenericError):
282 b6267745 Andrea Spadaccini
  """Invalid X509 certificate.
283 b6267745 Andrea Spadaccini

284 b6267745 Andrea Spadaccini
  This error has two arguments: the certificate filename and the error cause.
285 b6267745 Andrea Spadaccini

286 b6267745 Andrea Spadaccini
  """
287 b6267745 Andrea Spadaccini
288 b6267745 Andrea Spadaccini
289 5c947f38 Iustin Pop
class TagError(GenericError):
290 5c947f38 Iustin Pop
  """Generic tag error.
291 5c947f38 Iustin Pop

292 5c947f38 Iustin Pop
  The argument to this exception will show the exact error.
293 5c947f38 Iustin Pop

294 5c947f38 Iustin Pop
  """
295 7bca53e4 Michael Hanselmann
296 7bca53e4 Michael Hanselmann
297 7bca53e4 Michael Hanselmann
class CommandError(GenericError):
298 7bca53e4 Michael Hanselmann
  """External command error.
299 7bca53e4 Michael Hanselmann

300 7bca53e4 Michael Hanselmann
  """
301 e50bdd68 Guido Trotter
302 e50bdd68 Guido Trotter
303 ac2d0fe4 Michael Hanselmann
class StorageError(GenericError):
304 ac2d0fe4 Michael Hanselmann
  """Storage-related exception.
305 ac2d0fe4 Michael Hanselmann

306 ac2d0fe4 Michael Hanselmann
  """
307 ac2d0fe4 Michael Hanselmann
308 589dee9a Guido Trotter
309 589dee9a Guido Trotter
class InotifyError(GenericError):
310 589dee9a Guido Trotter
  """Error raised when there is a failure setting up an inotify watcher.
311 589dee9a Guido Trotter

312 589dee9a Guido Trotter
  """
313 589dee9a Guido Trotter
314 ac2d0fe4 Michael Hanselmann
315 e50bdd68 Guido Trotter
class QuitGanetiException(Exception):
316 7e975535 Stephen Shirley
  """Signal Ganeti that it must quit.
317 e50bdd68 Guido Trotter

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

327 c41eea6e Iustin Pop
  Examples::
328 c41eea6e Iustin Pop

329 e50bdd68 Guido Trotter
    # Return a result of "True" to the caller, but quit ganeti afterwards
330 0623d351 Iustin Pop
    raise QuitGanetiException(True, None)
331 e50bdd68 Guido Trotter
    # Send an error to the caller, and quit ganeti
332 0623d351 Iustin Pop
    raise QuitGanetiException(False, "Fatal safety violation, shutting down")
333 e50bdd68 Guido Trotter

334 e50bdd68 Guido Trotter
  """
335 e50bdd68 Guido Trotter
336 f1da30e6 Michael Hanselmann
337 d11bda8d Iustin Pop
class JobQueueError(GenericError):
338 f1da30e6 Michael Hanselmann
  """Job queue error.
339 f1da30e6 Michael Hanselmann

340 f1da30e6 Michael Hanselmann
  """
341 6797ec29 Iustin Pop
342 6797ec29 Iustin Pop
343 686d7433 Iustin Pop
class JobQueueDrainError(JobQueueError):
344 686d7433 Iustin Pop
  """Job queue is marked for drain error.
345 686d7433 Iustin Pop

346 686d7433 Iustin Pop
  This is raised when a job submission attempt is made but the queue
347 686d7433 Iustin Pop
  is marked for drain.
348 686d7433 Iustin Pop

349 686d7433 Iustin Pop
  """
350 686d7433 Iustin Pop
351 686d7433 Iustin Pop
352 f87b405e Michael Hanselmann
class JobQueueFull(JobQueueError):
353 f87b405e Michael Hanselmann
  """Job queue full error.
354 f87b405e Michael Hanselmann

355 f87b405e Michael Hanselmann
  Raised when job queue size reached its hard limit.
356 f87b405e Michael Hanselmann

357 f87b405e Michael Hanselmann
  """
358 f87b405e Michael Hanselmann
359 f87b405e Michael Hanselmann
360 b125e3b3 Guido Trotter
class ConfdRequestError(GenericError):
361 b125e3b3 Guido Trotter
  """A request error in Ganeti confd.
362 b125e3b3 Guido Trotter

363 b125e3b3 Guido Trotter
  Events that should make confd abort the current request and proceed serving
364 b125e3b3 Guido Trotter
  different ones.
365 b125e3b3 Guido Trotter

366 b125e3b3 Guido Trotter
  """
367 b125e3b3 Guido Trotter
368 b125e3b3 Guido Trotter
369 9748ab35 Guido Trotter
class ConfdMagicError(GenericError):
370 9748ab35 Guido Trotter
  """A magic fourcc error in Ganeti confd.
371 9748ab35 Guido Trotter

372 9748ab35 Guido Trotter
  Errors processing the fourcc in ganeti confd datagrams.
373 9748ab35 Guido Trotter

374 9748ab35 Guido Trotter
  """
375 9748ab35 Guido Trotter
376 9748ab35 Guido Trotter
377 e4ccf6cd Guido Trotter
class ConfdClientError(GenericError):
378 e4ccf6cd Guido Trotter
  """A magic fourcc error in Ganeti confd.
379 e4ccf6cd Guido Trotter

380 e4ccf6cd Guido Trotter
  Errors in the confd client library.
381 e4ccf6cd Guido Trotter

382 e4ccf6cd Guido Trotter
  """
383 e4ccf6cd Guido Trotter
384 e4ccf6cd Guido Trotter
385 c8eded0b Guido Trotter
class UdpDataSizeError(GenericError):
386 c8eded0b Guido Trotter
  """UDP payload too big.
387 c8eded0b Guido Trotter

388 c8eded0b Guido Trotter
  """
389 c8eded0b Guido Trotter
390 c8eded0b Guido Trotter
391 4c32a8bd Luca Bigliardi
class NoCtypesError(GenericError):
392 4c32a8bd Luca Bigliardi
  """python ctypes module is not found in the system.
393 4c32a8bd Luca Bigliardi

394 4c32a8bd Luca Bigliardi
  """
395 4c32a8bd Luca Bigliardi
396 4c32a8bd Luca Bigliardi
397 8b312c1d Manuel Franceschini
class IPAddressError(GenericError):
398 8b312c1d Manuel Franceschini
  """Generic IP address error.
399 8b312c1d Manuel Franceschini

400 8b312c1d Manuel Franceschini
  """
401 8b312c1d Manuel Franceschini
402 8b312c1d Manuel Franceschini
403 7a8bda3f Michael Hanselmann
class LuxiError(GenericError):
404 7a8bda3f Michael Hanselmann
  """LUXI error.
405 7a8bda3f Michael Hanselmann

406 7a8bda3f Michael Hanselmann
  """
407 7a8bda3f Michael Hanselmann
408 7a8bda3f Michael Hanselmann
409 7578ab0a Michael Hanselmann
class QueryFilterParseError(ParseError):
410 7578ab0a Michael Hanselmann
  """Error while parsing query filter.
411 7578ab0a Michael Hanselmann

412 7578ab0a Michael Hanselmann
  """
413 7578ab0a Michael Hanselmann
  def GetDetails(self):
414 7578ab0a Michael Hanselmann
    """Returns a list of strings with details about the error.
415 7578ab0a Michael Hanselmann

416 7578ab0a Michael Hanselmann
    """
417 7578ab0a Michael Hanselmann
    try:
418 7578ab0a Michael Hanselmann
      (_, inner) = self.args
419 7578ab0a Michael Hanselmann
    except IndexError:
420 7578ab0a Michael Hanselmann
      return None
421 7578ab0a Michael Hanselmann
422 7578ab0a Michael Hanselmann
    return [str(inner.line),
423 7578ab0a Michael Hanselmann
            (" " * (inner.column - 1)) + "^",
424 7578ab0a Michael Hanselmann
            str(inner)]
425 7578ab0a Michael Hanselmann
426 7578ab0a Michael Hanselmann
427 352e1a26 Michael Hanselmann
class RapiTestResult(GenericError):
428 352e1a26 Michael Hanselmann
  """Exception containing results from RAPI test utilities.
429 352e1a26 Michael Hanselmann

430 352e1a26 Michael Hanselmann
  """
431 352e1a26 Michael Hanselmann
432 352e1a26 Michael Hanselmann
433 fbdac0d9 Michael Hanselmann
class FileStoragePathError(GenericError):
434 fbdac0d9 Michael Hanselmann
  """Error from file storage path validation.
435 fbdac0d9 Michael Hanselmann

436 fbdac0d9 Michael Hanselmann
  """
437 fbdac0d9 Michael Hanselmann
438 fbdac0d9 Michael Hanselmann
439 6797ec29 Iustin Pop
# errors should be added above
440 6797ec29 Iustin Pop
441 6797ec29 Iustin Pop
442 6797ec29 Iustin Pop
def GetErrorClass(name):
443 6797ec29 Iustin Pop
  """Return the class of an exception.
444 6797ec29 Iustin Pop

445 6797ec29 Iustin Pop
  Given the class name, return the class itself.
446 6797ec29 Iustin Pop

447 6797ec29 Iustin Pop
  @type name: str
448 6797ec29 Iustin Pop
  @param name: the exception name
449 6797ec29 Iustin Pop
  @rtype: class
450 6797ec29 Iustin Pop
  @return: the actual class, or None if not found
451 6797ec29 Iustin Pop

452 6797ec29 Iustin Pop
  """
453 6797ec29 Iustin Pop
  item = globals().get(name, None)
454 6797ec29 Iustin Pop
  if item is not None:
455 6797ec29 Iustin Pop
    if not (isinstance(item, type(Exception)) and
456 6797ec29 Iustin Pop
            issubclass(item, GenericError)):
457 6797ec29 Iustin Pop
      item = None
458 6797ec29 Iustin Pop
  return item
459 6956e9cd Iustin Pop
460 6956e9cd Iustin Pop
461 6956e9cd Iustin Pop
def EncodeException(err):
462 6956e9cd Iustin Pop
  """Encodes an exception into a format that L{MaybeRaise} will recognise.
463 6956e9cd Iustin Pop

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

467 6956e9cd Iustin Pop
  @type err: GenericError child
468 6956e9cd Iustin Pop
  @param err: usually a child of GenericError (but any exception
469 6956e9cd Iustin Pop
      will be accepted)
470 6956e9cd Iustin Pop
  @rtype: tuple
471 6956e9cd Iustin Pop
  @return: tuple of (exception name, exception arguments)
472 6956e9cd Iustin Pop

473 6956e9cd Iustin Pop
  """
474 6956e9cd Iustin Pop
  return (err.__class__.__name__, err.args)
475 6956e9cd Iustin Pop
476 6956e9cd Iustin Pop
477 84f790e6 Michael Hanselmann
def GetEncodedError(result):
478 84f790e6 Michael Hanselmann
  """If this looks like an encoded Ganeti exception, return it.
479 6956e9cd Iustin Pop

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

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

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

502 84f790e6 Michael Hanselmann
  """
503 84f790e6 Michael Hanselmann
  error = GetEncodedError(result)
504 84f790e6 Michael Hanselmann
  if error:
505 84f790e6 Michael Hanselmann
    (errcls, args) = error
506 98dfcaff Iustin Pop
    # pylint: disable=W0142
507 98dfcaff Iustin Pop
    raise errcls(*args)