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