Statistics
| Branch: | Tag: | Revision:

root / lib / errors.py @ 8e70b181

History | View | Annotate | Download (5.9 kB)

1
#
2
#
3

    
4
# Copyright (C) 2006, 2007 Google Inc.
5
#
6
# This program is free software; you can redistribute it and/or modify
7
# it under the terms of the GNU General Public License as published by
8
# the Free Software Foundation; either version 2 of the License, or
9
# (at your option) any later version.
10
#
11
# This program is distributed in the hope that it will be useful, but
12
# WITHOUT ANY WARRANTY; without even the implied warranty of
13
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
# General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License
17
# along with this program; if not, write to the Free Software
18
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19
# 02110-1301, USA.
20

    
21

    
22
"""Ganeti exception handling"""
23

    
24

    
25
class GenericError(Exception):
26
  """Base exception for Ganeti.
27

28
  """
29
  pass
30

    
31

    
32
class LVMError(GenericError):
33
  """LVM-related exception.
34

35
  This exception codifies problems with LVM setup.
36

37
  """
38
  pass
39

    
40

    
41
class LockError(GenericError):
42
  """Lock error exception.
43

44
  This signifies problems in the locking subsystem.
45

46
  """
47
  pass
48

    
49

    
50
class HypervisorError(GenericError):
51
  """Hypervisor-related exception.
52

53
  This is raised in case we can't communicate with the hypervisor
54
  properly.
55

56
  """
57
  pass
58

    
59

    
60
class ProgrammerError(GenericError):
61
  """Programming-related error.
62

63
  This is raised in cases we determine that the calling conventions
64
  have been violated, meaning we got some desynchronisation between
65
  parts of our code. It signifies a real programming bug.
66

67
  """
68
  pass
69

    
70

    
71
class BlockDeviceError(GenericError):
72
  """Block-device related exception.
73

74
  This is raised in case we can't setup the instance's block devices
75
  properly.
76

77
  """
78
  pass
79

    
80

    
81
class ConfigurationError(GenericError):
82
  """Configuration related exception.
83

84
  Things like having an instance with a primary node that doesn't
85
  exist in the config or such raise this exception.
86

87
  """
88
  pass
89

    
90

    
91
class RemoteError(GenericError):
92
  """Programming-related error on remote call.
93

94
  This is raised when an unhandled error occurs in a call to a
95
  remote node.  It usually signifies a real programming bug.
96

97
  """
98
  pass
99

    
100

    
101
class ParameterError(GenericError):
102
  """A passed parameter to a command is invalid.
103

104
  This is raised when the parameter passed to a request function is
105
  invalid. Correct code should have verified this before passing the
106
  request structure.
107

108
  The argument to this exception should be the parameter name.
109

110
  """
111
  pass
112

    
113

    
114
class OpPrereqError(GenericError):
115
  """Prerequisites for the OpCode are not fulfilled.
116

117
  """
118

    
119

    
120
class OpExecError(GenericError):
121
  """Error during OpCode execution.
122

123
  """
124

    
125

    
126
class OpRetryError(OpExecError):
127
  """Error during OpCode execution, action can be retried.
128

129
  """
130

    
131

    
132
class OpCodeUnknown(GenericError):
133
  """Unknown opcode submitted.
134

135
  This signifies a mismatch between the definitions on the client and
136
  server side.
137

138
  """
139

    
140

    
141
class JobLost(GenericError):
142
  """Submitted job lost.
143

144
  The job was submitted but it cannot be found in the current job
145
  list.
146

147
  """
148

    
149

    
150
class ResolverError(GenericError):
151
  """Host name cannot be resolved.
152

153
  This is not a normal situation for Ganeti, as we rely on having a
154
  working resolver.
155

156
  The non-resolvable hostname is available as the first element of the
157
  args tuple; the other two elements of the tuple are the first two
158
  args of the socket.gaierror exception (error code and description).
159

160
  """
161

    
162

    
163
class HooksFailure(GenericError):
164
  """A generic hook failure.
165

166
  This signifies usually a setup misconfiguration.
167

168
  """
169

    
170

    
171
class HooksAbort(HooksFailure):
172
  """A required hook has failed.
173

174
  This caused an abort of the operation in the initial phase. This
175
  exception always has an attribute args which is a list of tuples of:
176
    - node: the source node on which this hooks has failed
177
    - script: the name of the script which aborted the run
178

179
  """
180

    
181

    
182
class UnitParseError(GenericError):
183
  """Unable to parse size unit.
184

185
  """
186

    
187
class TypeEnforcementError(GenericError):
188
  """Unable to enforce data type.
189

190
  """
191

    
192
class SshKeyError(GenericError):
193
  """Invalid SSH key.
194

195
  """
196

    
197

    
198
class TagError(GenericError):
199
  """Generic tag error.
200

201
  The argument to this exception will show the exact error.
202

203
  """
204

    
205

    
206
class CommandError(GenericError):
207
  """External command error.
208

209
  """
210

    
211

    
212
class QuitGanetiException(Exception):
213
  """Signal that Ganeti that it must quit.
214

215
  This is not necessarily an error (and thus not a subclass of
216
  GenericError), but it's an exceptional circumstance and it is thus
217
  treated. This instance should be instantiated with two values. The
218
  first one will specify the return code to the caller, and the second
219
  one will be the returned result (either as an error or as a normal
220
  result). Usually only the leave cluster rpc call should return
221
  status True (as there it's expected we quit), every other call will
222
  return status False (as a critical error was encountered).
223

224
  Examples::
225

226
    # Return a result of "True" to the caller, but quit ganeti afterwards
227
    raise QuitGanetiException(True, None)
228
    # Send an error to the caller, and quit ganeti
229
    raise QuitGanetiException(False, "Fatal safety violation, shutting down")
230

231
  """
232

    
233

    
234
class JobQueueError(GenericError):
235
  """Job queue error.
236

237
  """
238

    
239

    
240
class JobQueueDrainError(JobQueueError):
241
  """Job queue is marked for drain error.
242

243
  This is raised when a job submission attempt is made but the queue
244
  is marked for drain.
245

246
  """
247

    
248

    
249
class JobQueueFull(JobQueueError):
250
  """Job queue full error.
251

252
  Raised when job queue size reached its hard limit.
253

254
  """
255

    
256

    
257
# errors should be added above
258

    
259

    
260
def GetErrorClass(name):
261
  """Return the class of an exception.
262

263
  Given the class name, return the class itself.
264

265
  @type name: str
266
  @param name: the exception name
267
  @rtype: class
268
  @return: the actual class, or None if not found
269

270
  """
271
  item = globals().get(name, None)
272
  if item is not None:
273
    if not (isinstance(item, type(Exception)) and
274
            issubclass(item, GenericError)):
275
      item = None
276
  return item