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