Statistics
| Branch: | Tag: | Revision:

root / lib / errors.py @ 89b70f39

History | View | Annotate | Download (8.8 kB)

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

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

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

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

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

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

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

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

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

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

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

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

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

109 a8083063 Iustin Pop
  """
110 a8083063 Iustin Pop
  pass
111 a8083063 Iustin Pop
112 a8083063 Iustin Pop
113 2c8a5690 Guido Trotter
class ReservationError(GenericError):
114 2c8a5690 Guido Trotter
  """Errors reserving a resource.
115 2c8a5690 Guido Trotter

116 2c8a5690 Guido Trotter
  """
117 2c8a5690 Guido Trotter
118 2c8a5690 Guido Trotter
119 a8083063 Iustin Pop
class RemoteError(GenericError):
120 a8083063 Iustin Pop
  """Programming-related error on remote call.
121 a8083063 Iustin Pop

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

125 a8083063 Iustin Pop
  """
126 a8083063 Iustin Pop
  pass
127 a8083063 Iustin Pop
128 a8083063 Iustin Pop
129 f4a2f532 Guido Trotter
class SignatureError(GenericError):
130 f4a2f532 Guido Trotter
  """Error authenticating a remote message.
131 f4a2f532 Guido Trotter

132 f4a2f532 Guido Trotter
  This is raised when the hmac signature on a message doesn't verify correctly
133 f4a2f532 Guido Trotter
  to the message itself. It can happen because of network unreliability or
134 f4a2f532 Guido Trotter
  because of spurious traffic.
135 f4a2f532 Guido Trotter

136 f4a2f532 Guido Trotter
  """
137 f4a2f532 Guido Trotter
  pass
138 f4a2f532 Guido Trotter
139 f4a2f532 Guido Trotter
140 a8083063 Iustin Pop
class ParameterError(GenericError):
141 a8083063 Iustin Pop
  """A passed parameter to a command is invalid.
142 a8083063 Iustin Pop

143 a8083063 Iustin Pop
  This is raised when the parameter passed to a request function is
144 a8083063 Iustin Pop
  invalid. Correct code should have verified this before passing the
145 a8083063 Iustin Pop
  request structure.
146 a8083063 Iustin Pop

147 a8083063 Iustin Pop
  The argument to this exception should be the parameter name.
148 a8083063 Iustin Pop

149 a8083063 Iustin Pop
  """
150 a8083063 Iustin Pop
  pass
151 a8083063 Iustin Pop
152 a8083063 Iustin Pop
153 a8083063 Iustin Pop
class OpPrereqError(GenericError):
154 a8083063 Iustin Pop
  """Prerequisites for the OpCode are not fulfilled.
155 a8083063 Iustin Pop

156 5c983ee5 Iustin Pop
  This exception will have either one or two arguments. For the
157 5c983ee5 Iustin Pop
  two-argument construction, the second argument should be one of the
158 5c983ee5 Iustin Pop
  ECODE_* codes.
159 5c983ee5 Iustin Pop

160 a8083063 Iustin Pop
  """
161 a8083063 Iustin Pop
162 098c0958 Michael Hanselmann
163 a8083063 Iustin Pop
class OpExecError(GenericError):
164 a8083063 Iustin Pop
  """Error during OpCode execution.
165 a8083063 Iustin Pop

166 a8083063 Iustin Pop
  """
167 a8083063 Iustin Pop
168 098c0958 Michael Hanselmann
169 a8083063 Iustin Pop
class OpCodeUnknown(GenericError):
170 a8083063 Iustin Pop
  """Unknown opcode submitted.
171 a8083063 Iustin Pop

172 a8083063 Iustin Pop
  This signifies a mismatch between the definitions on the client and
173 a8083063 Iustin Pop
  server side.
174 a8083063 Iustin Pop

175 a8083063 Iustin Pop
  """
176 a8083063 Iustin Pop
177 098c0958 Michael Hanselmann
178 685ee993 Iustin Pop
class JobLost(GenericError):
179 685ee993 Iustin Pop
  """Submitted job lost.
180 685ee993 Iustin Pop

181 685ee993 Iustin Pop
  The job was submitted but it cannot be found in the current job
182 685ee993 Iustin Pop
  list.
183 685ee993 Iustin Pop

184 685ee993 Iustin Pop
  """
185 685ee993 Iustin Pop
186 685ee993 Iustin Pop
187 89e1fc26 Iustin Pop
class ResolverError(GenericError):
188 89e1fc26 Iustin Pop
  """Host name cannot be resolved.
189 89e1fc26 Iustin Pop

190 89e1fc26 Iustin Pop
  This is not a normal situation for Ganeti, as we rely on having a
191 89e1fc26 Iustin Pop
  working resolver.
192 89e1fc26 Iustin Pop

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

197 89e1fc26 Iustin Pop
  """
198 89e1fc26 Iustin Pop
199 89e1fc26 Iustin Pop
200 a8083063 Iustin Pop
class HooksFailure(GenericError):
201 a8083063 Iustin Pop
  """A generic hook failure.
202 a8083063 Iustin Pop

203 a8083063 Iustin Pop
  This signifies usually a setup misconfiguration.
204 a8083063 Iustin Pop

205 a8083063 Iustin Pop
  """
206 a8083063 Iustin Pop
207 098c0958 Michael Hanselmann
208 a8083063 Iustin Pop
class HooksAbort(HooksFailure):
209 a8083063 Iustin Pop
  """A required hook has failed.
210 a8083063 Iustin Pop

211 a8083063 Iustin Pop
  This caused an abort of the operation in the initial phase. This
212 a8083063 Iustin Pop
  exception always has an attribute args which is a list of tuples of:
213 a8083063 Iustin Pop
    - node: the source node on which this hooks has failed
214 a8083063 Iustin Pop
    - script: the name of the script which aborted the run
215 a8083063 Iustin Pop

216 a8083063 Iustin Pop
  """
217 a8083063 Iustin Pop
218 098c0958 Michael Hanselmann
219 a8083063 Iustin Pop
class UnitParseError(GenericError):
220 a8083063 Iustin Pop
  """Unable to parse size unit.
221 a8083063 Iustin Pop

222 a8083063 Iustin Pop
  """
223 a8083063 Iustin Pop
224 ac2d0fe4 Michael Hanselmann
225 a5728081 Guido Trotter
class TypeEnforcementError(GenericError):
226 a5728081 Guido Trotter
  """Unable to enforce data type.
227 a5728081 Guido Trotter

228 a5728081 Guido Trotter
  """
229 a8083063 Iustin Pop
230 ac2d0fe4 Michael Hanselmann
231 a8083063 Iustin Pop
class SshKeyError(GenericError):
232 a8083063 Iustin Pop
  """Invalid SSH key.
233 b0059682 Guido Trotter

234 a8083063 Iustin Pop
  """
235 5c947f38 Iustin Pop
236 5c947f38 Iustin Pop
237 5c947f38 Iustin Pop
class TagError(GenericError):
238 5c947f38 Iustin Pop
  """Generic tag error.
239 5c947f38 Iustin Pop

240 5c947f38 Iustin Pop
  The argument to this exception will show the exact error.
241 5c947f38 Iustin Pop

242 5c947f38 Iustin Pop
  """
243 7bca53e4 Michael Hanselmann
244 7bca53e4 Michael Hanselmann
245 7bca53e4 Michael Hanselmann
class CommandError(GenericError):
246 7bca53e4 Michael Hanselmann
  """External command error.
247 7bca53e4 Michael Hanselmann

248 7bca53e4 Michael Hanselmann
  """
249 e50bdd68 Guido Trotter
250 e50bdd68 Guido Trotter
251 ac2d0fe4 Michael Hanselmann
class StorageError(GenericError):
252 ac2d0fe4 Michael Hanselmann
  """Storage-related exception.
253 ac2d0fe4 Michael Hanselmann

254 ac2d0fe4 Michael Hanselmann
  """
255 ac2d0fe4 Michael Hanselmann
256 589dee9a Guido Trotter
257 589dee9a Guido Trotter
class InotifyError(GenericError):
258 589dee9a Guido Trotter
  """Error raised when there is a failure setting up an inotify watcher.
259 589dee9a Guido Trotter

260 589dee9a Guido Trotter
  """
261 589dee9a Guido Trotter
262 ac2d0fe4 Michael Hanselmann
263 e50bdd68 Guido Trotter
class QuitGanetiException(Exception):
264 e50bdd68 Guido Trotter
  """Signal that Ganeti that it must quit.
265 e50bdd68 Guido Trotter

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

275 c41eea6e Iustin Pop
  Examples::
276 c41eea6e Iustin Pop

277 e50bdd68 Guido Trotter
    # Return a result of "True" to the caller, but quit ganeti afterwards
278 0623d351 Iustin Pop
    raise QuitGanetiException(True, None)
279 e50bdd68 Guido Trotter
    # Send an error to the caller, and quit ganeti
280 0623d351 Iustin Pop
    raise QuitGanetiException(False, "Fatal safety violation, shutting down")
281 e50bdd68 Guido Trotter

282 e50bdd68 Guido Trotter
  """
283 e50bdd68 Guido Trotter
284 f1da30e6 Michael Hanselmann
285 d11bda8d Iustin Pop
class JobQueueError(GenericError):
286 f1da30e6 Michael Hanselmann
  """Job queue error.
287 f1da30e6 Michael Hanselmann

288 f1da30e6 Michael Hanselmann
  """
289 6797ec29 Iustin Pop
290 6797ec29 Iustin Pop
291 686d7433 Iustin Pop
class JobQueueDrainError(JobQueueError):
292 686d7433 Iustin Pop
  """Job queue is marked for drain error.
293 686d7433 Iustin Pop

294 686d7433 Iustin Pop
  This is raised when a job submission attempt is made but the queue
295 686d7433 Iustin Pop
  is marked for drain.
296 686d7433 Iustin Pop

297 686d7433 Iustin Pop
  """
298 686d7433 Iustin Pop
299 686d7433 Iustin Pop
300 f87b405e Michael Hanselmann
class JobQueueFull(JobQueueError):
301 f87b405e Michael Hanselmann
  """Job queue full error.
302 f87b405e Michael Hanselmann

303 f87b405e Michael Hanselmann
  Raised when job queue size reached its hard limit.
304 f87b405e Michael Hanselmann

305 f87b405e Michael Hanselmann
  """
306 f87b405e Michael Hanselmann
307 f87b405e Michael Hanselmann
308 b125e3b3 Guido Trotter
class ConfdFatalError(GenericError):
309 b125e3b3 Guido Trotter
  """A fatal failure in Ganeti confd.
310 b125e3b3 Guido Trotter

311 b125e3b3 Guido Trotter
  Events that compromise the ability of confd to proceed further.
312 b125e3b3 Guido Trotter
  (for example: inability to load the config file)
313 b125e3b3 Guido Trotter

314 b125e3b3 Guido Trotter
  """
315 b125e3b3 Guido Trotter
316 b125e3b3 Guido Trotter
317 b125e3b3 Guido Trotter
class ConfdRequestError(GenericError):
318 b125e3b3 Guido Trotter
  """A request error in Ganeti confd.
319 b125e3b3 Guido Trotter

320 b125e3b3 Guido Trotter
  Events that should make confd abort the current request and proceed serving
321 b125e3b3 Guido Trotter
  different ones.
322 b125e3b3 Guido Trotter

323 b125e3b3 Guido Trotter
  """
324 b125e3b3 Guido Trotter
325 b125e3b3 Guido Trotter
326 9748ab35 Guido Trotter
class ConfdMagicError(GenericError):
327 9748ab35 Guido Trotter
  """A magic fourcc error in Ganeti confd.
328 9748ab35 Guido Trotter

329 9748ab35 Guido Trotter
  Errors processing the fourcc in ganeti confd datagrams.
330 9748ab35 Guido Trotter

331 9748ab35 Guido Trotter
  """
332 9748ab35 Guido Trotter
333 9748ab35 Guido Trotter
334 e4ccf6cd Guido Trotter
class ConfdClientError(GenericError):
335 e4ccf6cd Guido Trotter
  """A magic fourcc error in Ganeti confd.
336 e4ccf6cd Guido Trotter

337 e4ccf6cd Guido Trotter
  Errors in the confd client library.
338 e4ccf6cd Guido Trotter

339 e4ccf6cd Guido Trotter
  """
340 e4ccf6cd Guido Trotter
341 e4ccf6cd Guido Trotter
342 c8eded0b Guido Trotter
class UdpDataSizeError(GenericError):
343 c8eded0b Guido Trotter
  """UDP payload too big.
344 c8eded0b Guido Trotter

345 c8eded0b Guido Trotter
  """
346 c8eded0b Guido Trotter
347 c8eded0b Guido Trotter
348 6797ec29 Iustin Pop
# errors should be added above
349 6797ec29 Iustin Pop
350 6797ec29 Iustin Pop
351 6797ec29 Iustin Pop
def GetErrorClass(name):
352 6797ec29 Iustin Pop
  """Return the class of an exception.
353 6797ec29 Iustin Pop

354 6797ec29 Iustin Pop
  Given the class name, return the class itself.
355 6797ec29 Iustin Pop

356 6797ec29 Iustin Pop
  @type name: str
357 6797ec29 Iustin Pop
  @param name: the exception name
358 6797ec29 Iustin Pop
  @rtype: class
359 6797ec29 Iustin Pop
  @return: the actual class, or None if not found
360 6797ec29 Iustin Pop

361 6797ec29 Iustin Pop
  """
362 6797ec29 Iustin Pop
  item = globals().get(name, None)
363 6797ec29 Iustin Pop
  if item is not None:
364 6797ec29 Iustin Pop
    if not (isinstance(item, type(Exception)) and
365 6797ec29 Iustin Pop
            issubclass(item, GenericError)):
366 6797ec29 Iustin Pop
      item = None
367 6797ec29 Iustin Pop
  return item
368 6956e9cd Iustin Pop
369 6956e9cd Iustin Pop
370 6956e9cd Iustin Pop
def EncodeException(err):
371 6956e9cd Iustin Pop
  """Encodes an exception into a format that L{MaybeRaise} will recognise.
372 6956e9cd Iustin Pop

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

376 6956e9cd Iustin Pop
  @type err: GenericError child
377 6956e9cd Iustin Pop
  @param err: usually a child of GenericError (but any exception
378 6956e9cd Iustin Pop
      will be accepted)
379 6956e9cd Iustin Pop
  @rtype: tuple
380 6956e9cd Iustin Pop
  @return: tuple of (exception name, exception arguments)
381 6956e9cd Iustin Pop

382 6956e9cd Iustin Pop
  """
383 6956e9cd Iustin Pop
  return (err.__class__.__name__, err.args)
384 6956e9cd Iustin Pop
385 6956e9cd Iustin Pop
386 6956e9cd Iustin Pop
def MaybeRaise(result):
387 1e57442a René Nussbaumer
  """If this looks like an encoded Ganeti exception, raise it.
388 6956e9cd Iustin Pop

389 6956e9cd Iustin Pop
  This function tries to parse the passed argument and if it looks
390 6956e9cd Iustin Pop
  like an encoding done by EncodeException, it will re-raise it.
391 6956e9cd Iustin Pop

392 6956e9cd Iustin Pop
  """
393 6956e9cd Iustin Pop
  tlt = (tuple, list)
394 6956e9cd Iustin Pop
  if (isinstance(result, tlt) and len(result) == 2 and
395 6956e9cd Iustin Pop
      isinstance(result[1], tlt)):
396 6956e9cd Iustin Pop
    # custom ganeti errors
397 6956e9cd Iustin Pop
    err_class = GetErrorClass(result[0])
398 6956e9cd Iustin Pop
    if err_class is not None:
399 6956e9cd Iustin Pop
      raise err_class, tuple(result[1])