xref: /dpdk/dts/framework/exception.py (revision 6fc05ca7ee4ed2d0c167b1f6a9a1832a085ac40a)
1812c4071SJuraj Linkeš# SPDX-License-Identifier: BSD-3-Clause
2812c4071SJuraj Linkeš# Copyright(c) 2010-2014 Intel Corporation
378534506SJuraj Linkeš# Copyright(c) 2022-2023 PANTHEON.tech s.r.o.
478534506SJuraj Linkeš# Copyright(c) 2022-2023 University of New Hampshire
5812c4071SJuraj Linkeš
6812c4071SJuraj Linkeš"""
7812c4071SJuraj LinkešUser-defined exceptions used across the framework.
8812c4071SJuraj Linkeš"""
9812c4071SJuraj Linkeš
1078534506SJuraj Linkešfrom enum import IntEnum, unique
1178534506SJuraj Linkešfrom typing import ClassVar
12812c4071SJuraj Linkeš
1378534506SJuraj Linkeš
1478534506SJuraj Linkeš@unique
1578534506SJuraj Linkešclass ErrorSeverity(IntEnum):
1678534506SJuraj Linkeš    """
1778534506SJuraj Linkeš    The severity of errors that occur during DTS execution.
1878534506SJuraj Linkeš    All exceptions are caught and the most severe error is used as return code.
1978534506SJuraj Linkeš    """
2078534506SJuraj Linkeš
2178534506SJuraj Linkeš    NO_ERR = 0
2278534506SJuraj Linkeš    GENERIC_ERR = 1
2378534506SJuraj Linkeš    CONFIG_ERR = 2
24ad80f550SJuraj Linkeš    REMOTE_CMD_EXEC_ERR = 3
25ad80f550SJuraj Linkeš    SSH_ERR = 4
26680d8a24SJuraj Linkeš    DPDK_BUILD_ERR = 10
27*6fc05ca7SJuraj Linkeš    TESTCASE_VERIFY_ERR = 20
2878534506SJuraj Linkeš
2978534506SJuraj Linkeš
3078534506SJuraj Linkešclass DTSError(Exception):
3178534506SJuraj Linkeš    """
3278534506SJuraj Linkeš    The base exception from which all DTS exceptions are derived.
3378534506SJuraj Linkeš    Stores error severity.
3478534506SJuraj Linkeš    """
3578534506SJuraj Linkeš
3678534506SJuraj Linkeš    severity: ClassVar[ErrorSeverity] = ErrorSeverity.GENERIC_ERR
3778534506SJuraj Linkeš
3878534506SJuraj Linkeš
3978534506SJuraj Linkešclass SSHTimeoutError(DTSError):
40812c4071SJuraj Linkeš    """
41812c4071SJuraj Linkeš    Command execution timeout.
42812c4071SJuraj Linkeš    """
43812c4071SJuraj Linkeš
44812c4071SJuraj Linkeš    command: str
45812c4071SJuraj Linkeš    output: str
4678534506SJuraj Linkeš    severity: ClassVar[ErrorSeverity] = ErrorSeverity.SSH_ERR
47812c4071SJuraj Linkeš
48812c4071SJuraj Linkeš    def __init__(self, command: str, output: str):
49812c4071SJuraj Linkeš        self.command = command
50812c4071SJuraj Linkeš        self.output = output
51812c4071SJuraj Linkeš
52812c4071SJuraj Linkeš    def __str__(self) -> str:
53812c4071SJuraj Linkeš        return f"TIMEOUT on {self.command}"
54812c4071SJuraj Linkeš
55812c4071SJuraj Linkeš    def get_output(self) -> str:
56812c4071SJuraj Linkeš        return self.output
57812c4071SJuraj Linkeš
58812c4071SJuraj Linkeš
5978534506SJuraj Linkešclass SSHConnectionError(DTSError):
60812c4071SJuraj Linkeš    """
61812c4071SJuraj Linkeš    SSH connection error.
62812c4071SJuraj Linkeš    """
63812c4071SJuraj Linkeš
64812c4071SJuraj Linkeš    host: str
6578534506SJuraj Linkeš    severity: ClassVar[ErrorSeverity] = ErrorSeverity.SSH_ERR
66812c4071SJuraj Linkeš
67812c4071SJuraj Linkeš    def __init__(self, host: str):
68812c4071SJuraj Linkeš        self.host = host
69812c4071SJuraj Linkeš
70812c4071SJuraj Linkeš    def __str__(self) -> str:
71812c4071SJuraj Linkeš        return f"Error trying to connect with {self.host}"
72812c4071SJuraj Linkeš
73812c4071SJuraj Linkeš
7478534506SJuraj Linkešclass SSHSessionDeadError(DTSError):
75812c4071SJuraj Linkeš    """
76812c4071SJuraj Linkeš    SSH session is not alive.
77812c4071SJuraj Linkeš    It can no longer be used.
78812c4071SJuraj Linkeš    """
79812c4071SJuraj Linkeš
80812c4071SJuraj Linkeš    host: str
8178534506SJuraj Linkeš    severity: ClassVar[ErrorSeverity] = ErrorSeverity.SSH_ERR
82812c4071SJuraj Linkeš
83812c4071SJuraj Linkeš    def __init__(self, host: str):
84812c4071SJuraj Linkeš        self.host = host
85812c4071SJuraj Linkeš
86812c4071SJuraj Linkeš    def __str__(self) -> str:
87812c4071SJuraj Linkeš        return f"SSH session with {self.host} has died"
8878534506SJuraj Linkeš
8978534506SJuraj Linkeš
9078534506SJuraj Linkešclass ConfigurationError(DTSError):
9178534506SJuraj Linkeš    """
9278534506SJuraj Linkeš    Raised when an invalid configuration is encountered.
9378534506SJuraj Linkeš    """
9478534506SJuraj Linkeš
9578534506SJuraj Linkeš    severity: ClassVar[ErrorSeverity] = ErrorSeverity.CONFIG_ERR
96ad80f550SJuraj Linkeš
97ad80f550SJuraj Linkeš
98ad80f550SJuraj Linkešclass RemoteCommandExecutionError(DTSError):
99ad80f550SJuraj Linkeš    """
100ad80f550SJuraj Linkeš    Raised when a command executed on a Node returns a non-zero exit status.
101ad80f550SJuraj Linkeš    """
102ad80f550SJuraj Linkeš
103ad80f550SJuraj Linkeš    command: str
104ad80f550SJuraj Linkeš    command_return_code: int
105ad80f550SJuraj Linkeš    severity: ClassVar[ErrorSeverity] = ErrorSeverity.REMOTE_CMD_EXEC_ERR
106ad80f550SJuraj Linkeš
107ad80f550SJuraj Linkeš    def __init__(self, command: str, command_return_code: int):
108ad80f550SJuraj Linkeš        self.command = command
109ad80f550SJuraj Linkeš        self.command_return_code = command_return_code
110ad80f550SJuraj Linkeš
111ad80f550SJuraj Linkeš    def __str__(self) -> str:
112ad80f550SJuraj Linkeš        return (
113ad80f550SJuraj Linkeš            f"Command {self.command} returned a non-zero exit code: "
114ad80f550SJuraj Linkeš            f"{self.command_return_code}"
115ad80f550SJuraj Linkeš        )
116680d8a24SJuraj Linkeš
117680d8a24SJuraj Linkeš
118680d8a24SJuraj Linkešclass RemoteDirectoryExistsError(DTSError):
119680d8a24SJuraj Linkeš    """
120680d8a24SJuraj Linkeš    Raised when a remote directory to be created already exists.
121680d8a24SJuraj Linkeš    """
122680d8a24SJuraj Linkeš
123680d8a24SJuraj Linkeš    severity: ClassVar[ErrorSeverity] = ErrorSeverity.REMOTE_CMD_EXEC_ERR
124680d8a24SJuraj Linkeš
125680d8a24SJuraj Linkeš
126680d8a24SJuraj Linkešclass DPDKBuildError(DTSError):
127680d8a24SJuraj Linkeš    """
128680d8a24SJuraj Linkeš    Raised when DPDK build fails for any reason.
129680d8a24SJuraj Linkeš    """
130680d8a24SJuraj Linkeš
131680d8a24SJuraj Linkeš    severity: ClassVar[ErrorSeverity] = ErrorSeverity.DPDK_BUILD_ERR
132*6fc05ca7SJuraj Linkeš
133*6fc05ca7SJuraj Linkeš
134*6fc05ca7SJuraj Linkešclass TestCaseVerifyError(DTSError):
135*6fc05ca7SJuraj Linkeš    """
136*6fc05ca7SJuraj Linkeš    Used in test cases to verify the expected behavior.
137*6fc05ca7SJuraj Linkeš    """
138*6fc05ca7SJuraj Linkeš
139*6fc05ca7SJuraj Linkeš    value: str
140*6fc05ca7SJuraj Linkeš    severity: ClassVar[ErrorSeverity] = ErrorSeverity.TESTCASE_VERIFY_ERR
141*6fc05ca7SJuraj Linkeš
142*6fc05ca7SJuraj Linkeš    def __init__(self, value: str):
143*6fc05ca7SJuraj Linkeš        self.value = value
144*6fc05ca7SJuraj Linkeš
145*6fc05ca7SJuraj Linkeš    def __str__(self) -> str:
146*6fc05ca7SJuraj Linkeš        return repr(self.value)
147