Statistics
| Branch: | Tag: | Revision:

root / lib / errors.py @ 69f0340a

History | View | Annotate | Download (10.3 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 a8083063 Iustin Pop
class HypervisorError(GenericError):
86 a8083063 Iustin Pop
  """Hypervisor-related exception.
87 a8083063 Iustin Pop

88 a8083063 Iustin Pop
  This is raised in case we can't communicate with the hypervisor
89 a8083063 Iustin Pop
  properly.
90 a8083063 Iustin Pop

91 a8083063 Iustin Pop
  """
92 a8083063 Iustin Pop
  pass
93 a8083063 Iustin Pop
94 a8083063 Iustin Pop
95 a8083063 Iustin Pop
class ProgrammerError(GenericError):
96 a8083063 Iustin Pop
  """Programming-related error.
97 a8083063 Iustin Pop

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

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

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

112 a8083063 Iustin Pop
  """
113 a8083063 Iustin Pop
  pass
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
  pass
124 a8083063 Iustin Pop
125 a8083063 Iustin Pop
126 4b63dc7a Iustin Pop
class ConfigVersionMismatch(ConfigurationError):
127 4b63dc7a Iustin Pop
  """Version mismatch in the configuration file.
128 4b63dc7a Iustin Pop

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

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

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

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

148 a8083063 Iustin Pop
  """
149 a8083063 Iustin Pop
  pass
150 a8083063 Iustin Pop
151 a8083063 Iustin Pop
152 f4a2f532 Guido Trotter
class SignatureError(GenericError):
153 f4a2f532 Guido Trotter
  """Error authenticating a remote message.
154 f4a2f532 Guido Trotter

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

159 f4a2f532 Guido Trotter
  """
160 f4a2f532 Guido Trotter
  pass
161 f4a2f532 Guido Trotter
162 f4a2f532 Guido Trotter
163 a8083063 Iustin Pop
class ParameterError(GenericError):
164 a8083063 Iustin Pop
  """A passed parameter to a command is invalid.
165 a8083063 Iustin Pop

166 a8083063 Iustin Pop
  This is raised when the parameter passed to a request function is
167 a8083063 Iustin Pop
  invalid. Correct code should have verified this before passing the
168 a8083063 Iustin Pop
  request structure.
169 a8083063 Iustin Pop

170 a8083063 Iustin Pop
  The argument to this exception should be the parameter name.
171 a8083063 Iustin Pop

172 a8083063 Iustin Pop
  """
173 a8083063 Iustin Pop
  pass
174 a8083063 Iustin Pop
175 a8083063 Iustin Pop
176 a8083063 Iustin Pop
class OpPrereqError(GenericError):
177 a8083063 Iustin Pop
  """Prerequisites for the OpCode are not fulfilled.
178 a8083063 Iustin Pop

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

326 c41eea6e Iustin Pop
  Examples::
327 c41eea6e Iustin Pop

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

432 6797ec29 Iustin Pop
  Given the class name, return the class itself.
433 6797ec29 Iustin Pop

434 6797ec29 Iustin Pop
  @type name: str
435 6797ec29 Iustin Pop
  @param name: the exception name
436 6797ec29 Iustin Pop
  @rtype: class
437 6797ec29 Iustin Pop
  @return: the actual class, or None if not found
438 6797ec29 Iustin Pop

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

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

454 6956e9cd Iustin Pop
  @type err: GenericError child
455 6956e9cd Iustin Pop
  @param err: usually a child of GenericError (but any exception
456 6956e9cd Iustin Pop
      will be accepted)
457 6956e9cd Iustin Pop
  @rtype: tuple
458 6956e9cd Iustin Pop
  @return: tuple of (exception name, exception arguments)
459 6956e9cd Iustin Pop

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

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

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

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

489 84f790e6 Michael Hanselmann
  """
490 84f790e6 Michael Hanselmann
  error = GetEncodedError(result)
491 84f790e6 Michael Hanselmann
  if error:
492 84f790e6 Michael Hanselmann
    (errcls, args) = error
493 e687ec01 Michael Hanselmann
    raise errcls(args)