xref: /dpdk/dts/framework/exception.py (revision 680d8a240f1687d455fd62f1376e80d0278c9bc6)
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
26*680d8a24SJuraj Linkeš    DPDK_BUILD_ERR = 10
2778534506SJuraj Linkeš
2878534506SJuraj Linkeš
2978534506SJuraj Linkešclass DTSError(Exception):
3078534506SJuraj Linkeš    """
3178534506SJuraj Linkeš    The base exception from which all DTS exceptions are derived.
3278534506SJuraj Linkeš    Stores error severity.
3378534506SJuraj Linkeš    """
3478534506SJuraj Linkeš
3578534506SJuraj Linkeš    severity: ClassVar[ErrorSeverity] = ErrorSeverity.GENERIC_ERR
3678534506SJuraj Linkeš
3778534506SJuraj Linkeš
3878534506SJuraj Linkešclass SSHTimeoutError(DTSError):
39812c4071SJuraj Linkeš    """
40812c4071SJuraj Linkeš    Command execution timeout.
41812c4071SJuraj Linkeš    """
42812c4071SJuraj Linkeš
43812c4071SJuraj Linkeš    command: str
44812c4071SJuraj Linkeš    output: str
4578534506SJuraj Linkeš    severity: ClassVar[ErrorSeverity] = ErrorSeverity.SSH_ERR
46812c4071SJuraj Linkeš
47812c4071SJuraj Linkeš    def __init__(self, command: str, output: str):
48812c4071SJuraj Linkeš        self.command = command
49812c4071SJuraj Linkeš        self.output = output
50812c4071SJuraj Linkeš
51812c4071SJuraj Linkeš    def __str__(self) -> str:
52812c4071SJuraj Linkeš        return f"TIMEOUT on {self.command}"
53812c4071SJuraj Linkeš
54812c4071SJuraj Linkeš    def get_output(self) -> str:
55812c4071SJuraj Linkeš        return self.output
56812c4071SJuraj Linkeš
57812c4071SJuraj Linkeš
5878534506SJuraj Linkešclass SSHConnectionError(DTSError):
59812c4071SJuraj Linkeš    """
60812c4071SJuraj Linkeš    SSH connection error.
61812c4071SJuraj Linkeš    """
62812c4071SJuraj Linkeš
63812c4071SJuraj Linkeš    host: str
6478534506SJuraj Linkeš    severity: ClassVar[ErrorSeverity] = ErrorSeverity.SSH_ERR
65812c4071SJuraj Linkeš
66812c4071SJuraj Linkeš    def __init__(self, host: str):
67812c4071SJuraj Linkeš        self.host = host
68812c4071SJuraj Linkeš
69812c4071SJuraj Linkeš    def __str__(self) -> str:
70812c4071SJuraj Linkeš        return f"Error trying to connect with {self.host}"
71812c4071SJuraj Linkeš
72812c4071SJuraj Linkeš
7378534506SJuraj Linkešclass SSHSessionDeadError(DTSError):
74812c4071SJuraj Linkeš    """
75812c4071SJuraj Linkeš    SSH session is not alive.
76812c4071SJuraj Linkeš    It can no longer be used.
77812c4071SJuraj Linkeš    """
78812c4071SJuraj Linkeš
79812c4071SJuraj Linkeš    host: str
8078534506SJuraj Linkeš    severity: ClassVar[ErrorSeverity] = ErrorSeverity.SSH_ERR
81812c4071SJuraj Linkeš
82812c4071SJuraj Linkeš    def __init__(self, host: str):
83812c4071SJuraj Linkeš        self.host = host
84812c4071SJuraj Linkeš
85812c4071SJuraj Linkeš    def __str__(self) -> str:
86812c4071SJuraj Linkeš        return f"SSH session with {self.host} has died"
8778534506SJuraj Linkeš
8878534506SJuraj Linkeš
8978534506SJuraj Linkešclass ConfigurationError(DTSError):
9078534506SJuraj Linkeš    """
9178534506SJuraj Linkeš    Raised when an invalid configuration is encountered.
9278534506SJuraj Linkeš    """
9378534506SJuraj Linkeš
9478534506SJuraj Linkeš    severity: ClassVar[ErrorSeverity] = ErrorSeverity.CONFIG_ERR
95ad80f550SJuraj Linkeš
96ad80f550SJuraj Linkeš
97ad80f550SJuraj Linkešclass RemoteCommandExecutionError(DTSError):
98ad80f550SJuraj Linkeš    """
99ad80f550SJuraj Linkeš    Raised when a command executed on a Node returns a non-zero exit status.
100ad80f550SJuraj Linkeš    """
101ad80f550SJuraj Linkeš
102ad80f550SJuraj Linkeš    command: str
103ad80f550SJuraj Linkeš    command_return_code: int
104ad80f550SJuraj Linkeš    severity: ClassVar[ErrorSeverity] = ErrorSeverity.REMOTE_CMD_EXEC_ERR
105ad80f550SJuraj Linkeš
106ad80f550SJuraj Linkeš    def __init__(self, command: str, command_return_code: int):
107ad80f550SJuraj Linkeš        self.command = command
108ad80f550SJuraj Linkeš        self.command_return_code = command_return_code
109ad80f550SJuraj Linkeš
110ad80f550SJuraj Linkeš    def __str__(self) -> str:
111ad80f550SJuraj Linkeš        return (
112ad80f550SJuraj Linkeš            f"Command {self.command} returned a non-zero exit code: "
113ad80f550SJuraj Linkeš            f"{self.command_return_code}"
114ad80f550SJuraj Linkeš        )
115*680d8a24SJuraj Linkeš
116*680d8a24SJuraj Linkeš
117*680d8a24SJuraj Linkešclass RemoteDirectoryExistsError(DTSError):
118*680d8a24SJuraj Linkeš    """
119*680d8a24SJuraj Linkeš    Raised when a remote directory to be created already exists.
120*680d8a24SJuraj Linkeš    """
121*680d8a24SJuraj Linkeš
122*680d8a24SJuraj Linkeš    severity: ClassVar[ErrorSeverity] = ErrorSeverity.REMOTE_CMD_EXEC_ERR
123*680d8a24SJuraj Linkeš
124*680d8a24SJuraj Linkeš
125*680d8a24SJuraj Linkešclass DPDKBuildError(DTSError):
126*680d8a24SJuraj Linkeš    """
127*680d8a24SJuraj Linkeš    Raised when DPDK build fails for any reason.
128*680d8a24SJuraj Linkeš    """
129*680d8a24SJuraj Linkeš
130*680d8a24SJuraj Linkeš    severity: ClassVar[ErrorSeverity] = ErrorSeverity.DPDK_BUILD_ERR
131