aboutsummaryrefslogtreecommitdiff
path: root/wlauto/exceptions.py
blob: 36f3050a07df77158ac16a1c6e9a624629616470 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#    Copyright 2013-2015 ARM Limited
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#


from wlauto.utils.misc import get_traceback, TimeoutError  # NOQA pylint: disable=W0611


class WAError(Exception):
    """Base class for all Workload Automation exceptions."""
    pass


class NotFoundError(WAError):
    """Raised when the specified item is not found."""
    pass


class ValidationError(WAError):
    """Raised on failure to validate an extension."""
    pass


class DeviceError(WAError):
    """General Device error."""
    pass


class DeviceNotRespondingError(WAError):
    """The device is not responding."""

    def __init__(self, device):
        super(DeviceNotRespondingError, self).__init__('Device {} is not responding.'.format(device))


class WorkloadError(WAError):
    """General Workload error."""
    pass


class HostError(WAError):
    """Problem with the host on which WA is running."""
    pass


class ModuleError(WAError):
    """
    Problem with a module.

    .. note:: Modules for specific extension types should raise execeptions
              appropriate to that extension. E.g. a ``Device`` module should raise
              ``DeviceError``. This is intended for situation where a module is
              unsure (and/or doesn't care) what its owner is.

    """
    pass


class InstrumentError(WAError):
    """General Instrument error."""
    pass


class ResultProcessorError(WAError):
    """General ResultProcessor error."""
    pass


class ResourceError(WAError):
    """General Resolver error."""
    pass


class CommandError(WAError):
    """Raised by commands when they have encountered an error condition
    during execution."""
    pass


class ToolError(WAError):
    """Raised by tools when they have encountered an error condition
    during execution."""
    pass


class LoaderError(WAError):
    """Raised when there is an error loading an extension or
    an external resource. Apart form the usual message, the __init__
    takes an exc_info parameter which should be the result of
    sys.exc_info() for the original exception (if any) that
    caused the error."""

    def __init__(self, message, exc_info=None):
        super(LoaderError, self).__init__(message)
        self.exc_info = exc_info

    def __str__(self):
        if self.exc_info:
            orig = self.exc_info[1]
            orig_name = type(orig).__name__
            if isinstance(orig, WAError):
                reason = 'because of:\n{}: {}'.format(orig_name, orig)
            else:
                reason = 'because of:\n{}\n{}: {}'.format(get_traceback(self.exc_info), orig_name, orig)
            return '\n'.join([self.message, reason])
        else:
            return self.message


class ConfigError(WAError):
    """Raised when configuration provided is invalid. This error suggests that
    the user should modify their config and try again."""
    pass


class WorkerThreadError(WAError):
    """
    This should get raised  in the main thread if a non-WAError-derived exception occurs on
    a worker/background thread. If a WAError-derived exception is raised in the worker, then
    it that exception should be re-raised on the main thread directly -- the main point of this is
    to preserve the backtrace in the output, and backtrace doesn't get output for WAErrors.

    """

    def __init__(self, thread, exc_info):
        self.thread = thread
        self.exc_info = exc_info
        orig = self.exc_info[1]
        orig_name = type(orig).__name__
        message = 'Exception of type {} occured on thread {}:\n'.format(orig_name, thread)
        message += '{}\n{}: {}'.format(get_traceback(self.exc_info), orig_name, orig)
        super(WorkerThreadError, self).__init__(message)