xref: /aosp_15_r20/external/autotest/client/common_lib/error.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1*9c5db199SXin Li# Lint as: python2, python3
2*9c5db199SXin Li#pylint: disable-msg=C0111
3*9c5db199SXin Li
4*9c5db199SXin Li"""
5*9c5db199SXin LiInternal global error types
6*9c5db199SXin Li"""
7*9c5db199SXin Li
8*9c5db199SXin Lifrom __future__ import absolute_import
9*9c5db199SXin Lifrom __future__ import division
10*9c5db199SXin Lifrom __future__ import print_function
11*9c5db199SXin Li
12*9c5db199SXin Liimport six
13*9c5db199SXin Li
14*9c5db199SXin Liimport sys, traceback
15*9c5db199SXin Lifrom traceback import format_exception
16*9c5db199SXin Li
17*9c5db199SXin Li# Add names you want to be imported by 'from errors import *' to this list.
18*9c5db199SXin Li# This must be list not a tuple as we modify it to include all of our
19*9c5db199SXin Li# the Exception classes we define below at the end of this file.
20*9c5db199SXin Li__all__ = ['format_error']
21*9c5db199SXin Li
22*9c5db199SXin Li
23*9c5db199SXin Lidef format_error():
24*9c5db199SXin Li    t, o, tb = sys.exc_info()
25*9c5db199SXin Li    trace = format_exception(t, o, tb)
26*9c5db199SXin Li    # Clear the backtrace to prevent a circular reference
27*9c5db199SXin Li    # in the heap -- as per tutorial
28*9c5db199SXin Li    tb = ''
29*9c5db199SXin Li
30*9c5db199SXin Li    return ''.join(trace)
31*9c5db199SXin Li
32*9c5db199SXin Li
33*9c5db199SXin Liclass TimeoutException(Exception):
34*9c5db199SXin Li    """Generic exception raised on retry timeouts."""
35*9c5db199SXin Li
36*9c5db199SXin Li
37*9c5db199SXin Liclass JobContinue(SystemExit):
38*9c5db199SXin Li    """Allow us to bail out requesting continuance."""
39*9c5db199SXin Li
40*9c5db199SXin Li
41*9c5db199SXin Liclass JobComplete(SystemExit):
42*9c5db199SXin Li    """Allow us to bail out indicating continuation not required."""
43*9c5db199SXin Li
44*9c5db199SXin Li
45*9c5db199SXin Liclass AutotestError(Exception):
46*9c5db199SXin Li    """The parent of all errors deliberatly thrown within the client code."""
47*9c5db199SXin Li
48*9c5db199SXin Li
49*9c5db199SXin Liclass JobError(AutotestError):
50*9c5db199SXin Li    """Indicates an error which terminates and fails the whole job (ABORT)."""
51*9c5db199SXin Li
52*9c5db199SXin Li
53*9c5db199SXin Liclass UnhandledJobError(JobError):
54*9c5db199SXin Li    """Indicates an unhandled error in a job."""
55*9c5db199SXin Li    def __init__(self, unhandled_exception):
56*9c5db199SXin Li        if isinstance(unhandled_exception, JobError):
57*9c5db199SXin Li            JobError.__init__(self, *unhandled_exception.args)
58*9c5db199SXin Li        elif isinstance(unhandled_exception, six.string_types):
59*9c5db199SXin Li            JobError.__init__(self, unhandled_exception)
60*9c5db199SXin Li        else:
61*9c5db199SXin Li            msg = "Unhandled %s: %s"
62*9c5db199SXin Li            msg %= (unhandled_exception.__class__.__name__,
63*9c5db199SXin Li                    unhandled_exception)
64*9c5db199SXin Li            msg += "\n" + traceback.format_exc()
65*9c5db199SXin Li            JobError.__init__(self, msg)
66*9c5db199SXin Li
67*9c5db199SXin Li
68*9c5db199SXin Liclass TestBaseException(AutotestError):
69*9c5db199SXin Li    """The parent of all test exceptions."""
70*9c5db199SXin Li    # Children are required to override this.  Never instantiate directly.
71*9c5db199SXin Li    exit_status = "NEVER_RAISE_THIS"
72*9c5db199SXin Li
73*9c5db199SXin Li
74*9c5db199SXin Liclass TestError(TestBaseException):
75*9c5db199SXin Li    """Indicates that something went wrong with the test harness itself."""
76*9c5db199SXin Li    exit_status = "ERROR"
77*9c5db199SXin Li
78*9c5db199SXin Li
79*9c5db199SXin Liclass TestNAError(TestBaseException):
80*9c5db199SXin Li    """Indictates that the test is Not Applicable.  Should be thrown
81*9c5db199SXin Li    when various conditions are such that the test is inappropriate."""
82*9c5db199SXin Li    exit_status = "TEST_NA"
83*9c5db199SXin Li
84*9c5db199SXin Li
85*9c5db199SXin Liclass TestFail(TestBaseException):
86*9c5db199SXin Li    """Indicates that the test failed, but the job will not continue."""
87*9c5db199SXin Li    exit_status = "FAIL"
88*9c5db199SXin Li
89*9c5db199SXin Li
90*9c5db199SXin Liclass TestWarn(TestBaseException):
91*9c5db199SXin Li    """Indicates that bad things (may) have happened, but not an explicit
92*9c5db199SXin Li    failure."""
93*9c5db199SXin Li    exit_status = "WARN"
94*9c5db199SXin Li
95*9c5db199SXin Li
96*9c5db199SXin Liclass UnhandledTestError(TestError):
97*9c5db199SXin Li    """Indicates an unhandled error in a test."""
98*9c5db199SXin Li    def __init__(self, unhandled_exception):
99*9c5db199SXin Li        if isinstance(unhandled_exception, TestError):
100*9c5db199SXin Li            TestError.__init__(self, *unhandled_exception.args)
101*9c5db199SXin Li        elif isinstance(unhandled_exception, six.string_types):
102*9c5db199SXin Li            TestError.__init__(self, unhandled_exception)
103*9c5db199SXin Li        else:
104*9c5db199SXin Li            msg = "Unhandled %s: %s"
105*9c5db199SXin Li            msg %= (unhandled_exception.__class__.__name__,
106*9c5db199SXin Li                    unhandled_exception)
107*9c5db199SXin Li            msg += "\n" + traceback.format_exc()
108*9c5db199SXin Li            TestError.__init__(self, msg)
109*9c5db199SXin Li
110*9c5db199SXin Li
111*9c5db199SXin Liclass UnhandledTestFail(TestFail):
112*9c5db199SXin Li    """Indicates an unhandled fail in a test."""
113*9c5db199SXin Li    def __init__(self, unhandled_exception):
114*9c5db199SXin Li        if isinstance(unhandled_exception, TestFail):
115*9c5db199SXin Li            TestFail.__init__(self, *unhandled_exception.args)
116*9c5db199SXin Li        elif isinstance(unhandled_exception, six.string_types):
117*9c5db199SXin Li            TestFail.__init__(self, unhandled_exception)
118*9c5db199SXin Li        else:
119*9c5db199SXin Li            msg = "Unhandled %s: %s"
120*9c5db199SXin Li            msg %= (unhandled_exception.__class__.__name__,
121*9c5db199SXin Li                    unhandled_exception)
122*9c5db199SXin Li            msg += "\n" + traceback.format_exc()
123*9c5db199SXin Li            TestFail.__init__(self, msg)
124*9c5db199SXin Li
125*9c5db199SXin Li
126*9c5db199SXin Liclass CmdError(TestError):
127*9c5db199SXin Li    """Indicates that a command failed, is fatal to the test unless caught.
128*9c5db199SXin Li
129*9c5db199SXin Li    @type command: str
130*9c5db199SXin Li    @type result_obj: autotest_lib.client.common_lib.utils.CmdResult
131*9c5db199SXin Li    @type additional_text: str | None
132*9c5db199SXin Li    """
133*9c5db199SXin Li    def __init__(self, command, result_obj, additional_text=None):
134*9c5db199SXin Li        TestError.__init__(self, command, result_obj, additional_text)
135*9c5db199SXin Li        self.command = command
136*9c5db199SXin Li        self.result_obj = result_obj
137*9c5db199SXin Li        self.additional_text = additional_text
138*9c5db199SXin Li
139*9c5db199SXin Li    def __str__(self):
140*9c5db199SXin Li        if self.result_obj.exit_status is None:
141*9c5db199SXin Li            msg = "Command <%s> failed and is not responding to signals"
142*9c5db199SXin Li            msg %= self.command
143*9c5db199SXin Li        else:
144*9c5db199SXin Li            msg = "Command <%s> failed, rc=%d"
145*9c5db199SXin Li            msg %= (self.command, self.result_obj.exit_status)
146*9c5db199SXin Li
147*9c5db199SXin Li        if self.additional_text:
148*9c5db199SXin Li            msg += ", " + self.additional_text
149*9c5db199SXin Li        msg += '\n' + repr(self.result_obj)
150*9c5db199SXin Li        return msg
151*9c5db199SXin Li
152*9c5db199SXin Li    def __eq__(self, other):
153*9c5db199SXin Li        if type(self) == type(other):
154*9c5db199SXin Li            return (self.command == other.command
155*9c5db199SXin Li                    and self.result_obj == other.result_obj
156*9c5db199SXin Li                    and self.additional_text == other.additional_text)
157*9c5db199SXin Li        else:
158*9c5db199SXin Li            return NotImplemented
159*9c5db199SXin Li
160*9c5db199SXin Li
161*9c5db199SXin Liclass CmdTimeoutError(CmdError):
162*9c5db199SXin Li    """Indicates that a command timed out."""
163*9c5db199SXin Li
164*9c5db199SXin Li
165*9c5db199SXin Liclass PackageError(TestError):
166*9c5db199SXin Li    """Indicates an error trying to perform a package operation."""
167*9c5db199SXin Li
168*9c5db199SXin Li
169*9c5db199SXin Liclass BarrierError(JobError):
170*9c5db199SXin Li    """Indicates an error happened during a barrier operation."""
171*9c5db199SXin Li
172*9c5db199SXin Li
173*9c5db199SXin Liclass BarrierAbortError(BarrierError):
174*9c5db199SXin Li    """Indicate that the barrier was explicitly aborted by a member."""
175*9c5db199SXin Li
176*9c5db199SXin Li
177*9c5db199SXin Liclass InstallError(JobError):
178*9c5db199SXin Li    """Indicates an installation error which Terminates and fails the job."""
179*9c5db199SXin Li
180*9c5db199SXin Li
181*9c5db199SXin Liclass AutotestRunError(AutotestError):
182*9c5db199SXin Li    """Indicates a problem running server side control files."""
183*9c5db199SXin Li
184*9c5db199SXin Li
185*9c5db199SXin Liclass AutotestTimeoutError(AutotestError):
186*9c5db199SXin Li    """This exception is raised when an autotest test exceeds the timeout
187*9c5db199SXin Li    parameter passed to run_timed_test and is killed.
188*9c5db199SXin Li    """
189*9c5db199SXin Li
190*9c5db199SXin Li
191*9c5db199SXin Liclass GenericHostRunError(Exception):
192*9c5db199SXin Li    """Indicates a problem in the host run() function running in either client
193*9c5db199SXin Li    or server code.
194*9c5db199SXin Li
195*9c5db199SXin Li    Should always be constructed with a tuple of two args (error description
196*9c5db199SXin Li    (str), run result object). This is a common class used to create the client
197*9c5db199SXin Li    and server side versions of it when the distinction is useful.
198*9c5db199SXin Li    """
199*9c5db199SXin Li    def __init__(self, description, result_obj):
200*9c5db199SXin Li        self.description = description
201*9c5db199SXin Li        self.result_obj = result_obj
202*9c5db199SXin Li        Exception.__init__(self, description, result_obj)
203*9c5db199SXin Li
204*9c5db199SXin Li    def __str__(self):
205*9c5db199SXin Li        return self.description + '\n' + repr(self.result_obj)
206*9c5db199SXin Li
207*9c5db199SXin Li
208*9c5db199SXin Liclass HostInstallTimeoutError(JobError):
209*9c5db199SXin Li    """
210*9c5db199SXin Li    Indicates the machine failed to be installed after the predetermined
211*9c5db199SXin Li    timeout.
212*9c5db199SXin Li    """
213*9c5db199SXin Li
214*9c5db199SXin Li
215*9c5db199SXin Liclass AutotestHostRunError(GenericHostRunError, AutotestError):
216*9c5db199SXin Li    pass
217*9c5db199SXin Li
218*9c5db199SXin Li
219*9c5db199SXin Liclass AutotestHostRunCmdError(AutotestHostRunError):
220*9c5db199SXin Li    """Indicates that the command run via Host.run failed.
221*9c5db199SXin Li
222*9c5db199SXin Li    This is equivalent to CmdError when raised from a Host object instead of
223*9c5db199SXin Li    directly on the DUT using utils.run
224*9c5db199SXin Li    """
225*9c5db199SXin Li
226*9c5db199SXin Li    def __init__(self, command, result_obj, additional_text=''):
227*9c5db199SXin Li        description = command
228*9c5db199SXin Li        if additional_text:
229*9c5db199SXin Li            description += ' (%s)' % additional_text
230*9c5db199SXin Li        super(AutotestHostRunCmdError, self).__init__(description, result_obj)
231*9c5db199SXin Li        self.command = command
232*9c5db199SXin Li        self.additional_text = additional_text
233*9c5db199SXin Li
234*9c5db199SXin Li
235*9c5db199SXin Liclass AutotestHostRunTimeoutError(AutotestHostRunCmdError):
236*9c5db199SXin Li    """Indicates that a command run via Host.run timed out.
237*9c5db199SXin Li
238*9c5db199SXin Li    This is equivalent to CmdTimeoutError when raised from a Host object instead
239*9c5db199SXin Li    of directly on the DUT using utils.run
240*9c5db199SXin Li    """
241*9c5db199SXin Li
242*9c5db199SXin Li
243*9c5db199SXin Li# server-specific errors
244*9c5db199SXin Li
245*9c5db199SXin Liclass AutoservError(Exception):
246*9c5db199SXin Li    pass
247*9c5db199SXin Li
248*9c5db199SXin Li
249*9c5db199SXin Liclass AutoservSSHTimeout(AutoservError):
250*9c5db199SXin Li    """SSH experienced a connection timeout"""
251*9c5db199SXin Li
252*9c5db199SXin Li
253*9c5db199SXin Liclass AutoservRunError(GenericHostRunError, AutoservError):
254*9c5db199SXin Li    pass
255*9c5db199SXin Li
256*9c5db199SXin Li
257*9c5db199SXin Liclass AutoservSshPermissionDeniedError(AutoservRunError):
258*9c5db199SXin Li    """Indicates that a SSH permission denied error was encountered."""
259*9c5db199SXin Li
260*9c5db199SXin Li
261*9c5db199SXin Liclass AutoservSshDnsError(AutoservRunError):
262*9c5db199SXin Li    """Indicates that a DNS resolution error was encountered."""
263*9c5db199SXin Li
264*9c5db199SXin Li
265*9c5db199SXin Liclass AutoservUnsupportedError(AutoservError):
266*9c5db199SXin Li    """Error raised when you try to use an unsupported optional feature"""
267*9c5db199SXin Li
268*9c5db199SXin Li
269*9c5db199SXin Liclass AutoservHostError(AutoservError):
270*9c5db199SXin Li    """Error reaching a host"""
271*9c5db199SXin Li
272*9c5db199SXin Li
273*9c5db199SXin Liclass AutoservHostIsShuttingDownError(AutoservHostError):
274*9c5db199SXin Li    """Host is shutting down"""
275*9c5db199SXin Li
276*9c5db199SXin Li
277*9c5db199SXin Liclass AutoservNotMountedHostError(AutoservHostError):
278*9c5db199SXin Li    """Found unmounted partitions that should be mounted"""
279*9c5db199SXin Li
280*9c5db199SXin Li
281*9c5db199SXin Liclass AutoservSshPingHostError(AutoservHostError):
282*9c5db199SXin Li    """SSH ping failed"""
283*9c5db199SXin Li
284*9c5db199SXin Li
285*9c5db199SXin Liclass AutoservSSPError(AutoservHostError):
286*9c5db199SXin Li    """SSP setup failed"""
287*9c5db199SXin Li
288*9c5db199SXin Li
289*9c5db199SXin Liclass AutoservDiskFullHostError(AutoservHostError):
290*9c5db199SXin Li    """Not enough free disk space on host"""
291*9c5db199SXin Li
292*9c5db199SXin Li    def __init__(self, path, want_gb, free_space_gb):
293*9c5db199SXin Li        super(AutoservDiskFullHostError, self).__init__(
294*9c5db199SXin Li            'Not enough free space on %s - %.3fGB free, want %.3fGB' %
295*9c5db199SXin Li                    (path, free_space_gb, want_gb))
296*9c5db199SXin Li        self.path = path
297*9c5db199SXin Li        self.want_gb = want_gb
298*9c5db199SXin Li        self.free_space_gb = free_space_gb
299*9c5db199SXin Li
300*9c5db199SXin Li
301*9c5db199SXin Liclass AutoservNoFreeInodesError(AutoservHostError):
302*9c5db199SXin Li    """Not enough free i-nodes on host"""
303*9c5db199SXin Li
304*9c5db199SXin Li    def __init__(self, path, want_inodes, free_inodes):
305*9c5db199SXin Li        super(AutoservNoFreeInodesError, self).__init__(
306*9c5db199SXin Li            'Not enough free inodes on %s - %d free, want %d' %
307*9c5db199SXin Li                    (path, free_inodes, want_inodes))
308*9c5db199SXin Li        self.path = path
309*9c5db199SXin Li        self.want_inodes = want_inodes
310*9c5db199SXin Li        self.free_inodes = free_inodes
311*9c5db199SXin Li
312*9c5db199SXin Li
313*9c5db199SXin Liclass AutoservHardwareHostError(AutoservHostError):
314*9c5db199SXin Li    """Found hardware problems with the host"""
315*9c5db199SXin Li
316*9c5db199SXin Li
317*9c5db199SXin Liclass AutoservRebootError(AutoservError):
318*9c5db199SXin Li    """Error occured while rebooting a machine"""
319*9c5db199SXin Li
320*9c5db199SXin Li
321*9c5db199SXin Liclass AutoservShutdownError(AutoservRebootError):
322*9c5db199SXin Li    """Error occured during shutdown of machine"""
323*9c5db199SXin Li
324*9c5db199SXin Li
325*9c5db199SXin Liclass AutoservSuspendError(AutoservRebootError):
326*9c5db199SXin Li    """Error occured while suspending a machine"""
327*9c5db199SXin Li
328*9c5db199SXin Li
329*9c5db199SXin Liclass AutoservSubcommandError(AutoservError):
330*9c5db199SXin Li    """Indicates an error while executing a (forked) subcommand"""
331*9c5db199SXin Li    def __init__(self, func, exit_code):
332*9c5db199SXin Li        AutoservError.__init__(self, func, exit_code)
333*9c5db199SXin Li        self.func = func
334*9c5db199SXin Li        self.exit_code = exit_code
335*9c5db199SXin Li
336*9c5db199SXin Li    def __str__(self):
337*9c5db199SXin Li        return ("Subcommand %s failed with exit code %d" %
338*9c5db199SXin Li                (self.func, self.exit_code))
339*9c5db199SXin Li
340*9c5db199SXin Li
341*9c5db199SXin Liclass AutoservRepairTotalFailure(AutoservError):
342*9c5db199SXin Li    """Raised if all attempts to repair the DUT failed."""
343*9c5db199SXin Li
344*9c5db199SXin Li
345*9c5db199SXin Liclass AutoservInstallError(AutoservError):
346*9c5db199SXin Li    """Error occured while installing autotest on a host"""
347*9c5db199SXin Li
348*9c5db199SXin Li
349*9c5db199SXin Liclass AutoservPidAlreadyDeadError(AutoservError):
350*9c5db199SXin Li    """Error occured by trying to kill a nonexistant PID"""
351*9c5db199SXin Li
352*9c5db199SXin Li
353*9c5db199SXin Li# packaging system errors
354*9c5db199SXin Li
355*9c5db199SXin Liclass PackagingError(AutotestError):
356*9c5db199SXin Li    'Abstract error class for all packaging related errors.'
357*9c5db199SXin Li
358*9c5db199SXin Li
359*9c5db199SXin Liclass PackageUploadError(PackagingError):
360*9c5db199SXin Li    'Raised when there is an error uploading the package'
361*9c5db199SXin Li
362*9c5db199SXin Li
363*9c5db199SXin Liclass PackageFetchError(PackagingError):
364*9c5db199SXin Li    'Raised when there is an error fetching the package'
365*9c5db199SXin Li
366*9c5db199SXin Li
367*9c5db199SXin Liclass PackageRemoveError(PackagingError):
368*9c5db199SXin Li    'Raised when there is an error removing the package'
369*9c5db199SXin Li
370*9c5db199SXin Li
371*9c5db199SXin Liclass PackageInstallError(PackagingError):
372*9c5db199SXin Li    'Raised when there is an error installing the package'
373*9c5db199SXin Li
374*9c5db199SXin Li
375*9c5db199SXin Liclass RepoDiskFullError(PackagingError):
376*9c5db199SXin Li    'Raised when the destination for packages is full'
377*9c5db199SXin Li
378*9c5db199SXin Li
379*9c5db199SXin Liclass RepoWriteError(PackagingError):
380*9c5db199SXin Li    "Raised when packager cannot write to a repo's desitnation"
381*9c5db199SXin Li
382*9c5db199SXin Li
383*9c5db199SXin Liclass RepoUnknownError(PackagingError):
384*9c5db199SXin Li    "Raised when packager cannot write to a repo's desitnation"
385*9c5db199SXin Li
386*9c5db199SXin Li
387*9c5db199SXin Liclass RepoError(PackagingError):
388*9c5db199SXin Li    "Raised when a repo isn't working in some way"
389*9c5db199SXin Li
390*9c5db199SXin Li
391*9c5db199SXin Liclass StageControlFileFailure(Exception):
392*9c5db199SXin Li    """Exceptions encountered staging control files."""
393*9c5db199SXin Li
394*9c5db199SXin Li
395*9c5db199SXin Liclass CrosDynamicSuiteException(Exception):
396*9c5db199SXin Li    """
397*9c5db199SXin Li    Base class for exceptions coming from dynamic suite code in
398*9c5db199SXin Li    server/cros/dynamic_suite/*.
399*9c5db199SXin Li    """
400*9c5db199SXin Li
401*9c5db199SXin Li
402*9c5db199SXin Liclass StageBuildFailure(CrosDynamicSuiteException):
403*9c5db199SXin Li    """Raised when the dev server throws 500 while staging a build."""
404*9c5db199SXin Li
405*9c5db199SXin Li
406*9c5db199SXin Liclass ControlFileEmpty(CrosDynamicSuiteException):
407*9c5db199SXin Li    """Raised when the control file exists on the server, but can't be read."""
408*9c5db199SXin Li
409*9c5db199SXin Li
410*9c5db199SXin Liclass ControlFileMalformed(CrosDynamicSuiteException):
411*9c5db199SXin Li    """Raised when an invalid control file is read."""
412*9c5db199SXin Li
413*9c5db199SXin Li
414*9c5db199SXin Liclass AsynchronousBuildFailure(CrosDynamicSuiteException):
415*9c5db199SXin Li    """Raised when the dev server throws 500 while finishing staging of a build.
416*9c5db199SXin Li    """
417*9c5db199SXin Li
418*9c5db199SXin Li
419*9c5db199SXin Liclass SuiteArgumentException(CrosDynamicSuiteException):
420*9c5db199SXin Li    """Raised when improper arguments are used to run a suite."""
421*9c5db199SXin Li
422*9c5db199SXin Li
423*9c5db199SXin Liclass MalformedDependenciesException(CrosDynamicSuiteException):
424*9c5db199SXin Li    """Raised when a build has a malformed dependency_info file."""
425*9c5db199SXin Li
426*9c5db199SXin Li
427*9c5db199SXin Liclass InadequateHostsException(CrosDynamicSuiteException):
428*9c5db199SXin Li    """Raised when there are too few hosts to run a suite."""
429*9c5db199SXin Li
430*9c5db199SXin Li
431*9c5db199SXin Liclass NoHostsException(CrosDynamicSuiteException):
432*9c5db199SXin Li    """Raised when there are no healthy hosts to run a suite."""
433*9c5db199SXin Li
434*9c5db199SXin Li
435*9c5db199SXin Liclass ControlFileNotFound(CrosDynamicSuiteException):
436*9c5db199SXin Li    """Raised when a control file cannot be found and/or read."""
437*9c5db199SXin Li
438*9c5db199SXin Li
439*9c5db199SXin Liclass NoControlFileList(CrosDynamicSuiteException):
440*9c5db199SXin Li    """Raised to indicate that a listing can't be done."""
441*9c5db199SXin Li
442*9c5db199SXin Li
443*9c5db199SXin Liclass SuiteControlFileException(CrosDynamicSuiteException):
444*9c5db199SXin Li    """Raised when failing to list the contents of all control file."""
445*9c5db199SXin Li
446*9c5db199SXin Li
447*9c5db199SXin Liclass HostLockManagerReuse(CrosDynamicSuiteException):
448*9c5db199SXin Li    """Raised when a caller tries to re-use a HostLockManager instance."""
449*9c5db199SXin Li
450*9c5db199SXin Li
451*9c5db199SXin Liclass ReimageAbortedException(CrosDynamicSuiteException):
452*9c5db199SXin Li    """Raised when a Reimage job is aborted"""
453*9c5db199SXin Li
454*9c5db199SXin Li
455*9c5db199SXin Liclass UnknownReimageType(CrosDynamicSuiteException):
456*9c5db199SXin Li    """Raised when a suite passes in an invalid reimage type"""
457*9c5db199SXin Li
458*9c5db199SXin Li
459*9c5db199SXin Liclass NoUniquePackageFound(Exception):
460*9c5db199SXin Li    """Raised when an executable cannot be mapped back to a single package."""
461*9c5db199SXin Li
462*9c5db199SXin Li
463*9c5db199SXin Liclass RPCException(Exception):
464*9c5db199SXin Li    """Raised when an RPC encounters an error that a client might wish to
465*9c5db199SXin Li    handle specially."""
466*9c5db199SXin Li
467*9c5db199SXin Li
468*9c5db199SXin Liclass NoEligibleHostException(RPCException):
469*9c5db199SXin Li    """Raised when no host could satisfy the requirements of a job."""
470*9c5db199SXin Li
471*9c5db199SXin Li
472*9c5db199SXin Liclass UnmodifiableLabelException(RPCException):
473*9c5db199SXin Li    """Raised when an RPC tries to modify static labels."""
474*9c5db199SXin Li
475*9c5db199SXin Li
476*9c5db199SXin Liclass UnmodifiableAttributeException(RPCException):
477*9c5db199SXin Li    """Raised when an RPC tries to modify static attributes."""
478*9c5db199SXin Li
479*9c5db199SXin Li
480*9c5db199SXin Liclass InvalidBgJobCall(Exception):
481*9c5db199SXin Li    """Raised when an invalid call is made to a BgJob object."""
482*9c5db199SXin Li
483*9c5db199SXin Li
484*9c5db199SXin Liclass HeartbeatOnlyAllowedInShardModeException(Exception):
485*9c5db199SXin Li    """Raised when a heartbeat is attempted but not allowed."""
486*9c5db199SXin Li
487*9c5db199SXin Li
488*9c5db199SXin Liclass UnallowedRecordsSentToMain(Exception):
489*9c5db199SXin Li    """Raised when an illegal record was sent from shard to main."""
490*9c5db199SXin Li
491*9c5db199SXin Li
492*9c5db199SXin Liclass IgnorableUnallowedRecordsSentToMain(UnallowedRecordsSentToMain):
493*9c5db199SXin Li    """Raised when non-fatal illegal record was sent from shard.
494*9c5db199SXin Li
495*9c5db199SXin Li    This exception may be raised by rpc model logic on main, but will
496*9c5db199SXin Li    not be returned back to heartbeat client. It indicates that some records
497*9c5db199SXin Li    may have been illegal, but the main is ignoring those records and
498*9c5db199SXin Li    proceeding with the rest of the heartbeat handling.
499*9c5db199SXin Li    """
500*9c5db199SXin Li
501*9c5db199SXin Li
502*9c5db199SXin Liclass InvalidDataError(Exception):
503*9c5db199SXin Li    """Exception raised when invalid data provided for database operation."""
504*9c5db199SXin Li
505*9c5db199SXin Li
506*9c5db199SXin Liclass ContainerError(Exception):
507*9c5db199SXin Li    """Exception raised when program runs into error using container."""
508*9c5db199SXin Li
509*9c5db199SXin Li
510*9c5db199SXin Liclass IllegalUser(Exception):
511*9c5db199SXin Li    """Exception raise when a program runs as an illegal user."""
512*9c5db199SXin Li
513*9c5db199SXin Li
514*9c5db199SXin Liclass AutoservDirectoryNotFoundError(AutoservHostError):
515*9c5db199SXin Li    """Exception raised when an expected directory is not found."""
516*9c5db199SXin Li
517*9c5db199SXin Li
518*9c5db199SXin Liclass AutoservDiskSizeUnknownError(AutoservHostError):
519*9c5db199SXin Li    """Exception raised when the disk space could not be determined."""
520*9c5db199SXin Li
521*9c5db199SXin Li
522*9c5db199SXin Liclass TLSConnectionError(AutoservError):
523*9c5db199SXin Li    pass
524*9c5db199SXin Li
525*9c5db199SXin Li
526*9c5db199SXin Li# This MUST remain at the end of the file.
527*9c5db199SXin Li# Limit 'from error import *' to only import the exception instances.
528*9c5db199SXin Lifor _name, _thing in list(locals().items()):
529*9c5db199SXin Li    try:
530*9c5db199SXin Li        if issubclass(_thing, Exception):
531*9c5db199SXin Li            __all__.append(_name)
532*9c5db199SXin Li    except TypeError:
533*9c5db199SXin Li        pass  # _thing not a class
534*9c5db199SXin Li__all__ = tuple(__all__)
535