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