File size: 3,512 Bytes
079c32c |
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 |
from abc import ABCMeta
from enum import unique, IntEnum
from typing import Type
import enum_tools
from requests import HTTPError
from .base import ResponseException
from ..base import get_values_from_response
@enum_tools.documentation.document_enum
@unique
class MasterErrorCode(IntEnum):
"""
Overview:
Error codes for master end
"""
SUCCESS = 0 # doc: Master request success
SYSTEM_SHUTTING_DOWN = 101 # doc: Master end is shutting down
CHANNEL_NOT_GIVEN = 201 # doc: No channel id given in request
CHANNEL_INVALID = 202 # doc: Channel id given not match with master end
MASTER_TOKEN_NOT_GIVEN = 301 # doc: No master token found in connection request from slave
MASTER_TOKEN_INVALID = 302 # doc: Master token auth failed in master end
SELF_TOKEN_NOT_GIVEN = 401 # doc: No self token given in self request (such as ping, shutdown)
SELF_TOKEN_INVALID = 402 # doc: Self token auth failed in master end itself (such as ping, shutdown)
SLAVE_TOKEN_NOT_GIVEN = 501 # doc: No slave token given in service request from slave
SLAVE_TOKEN_INVALID = 502 # doc: Slave token not found in master end
TASK_DATA_INVALID = 601 # doc: Task data is invalid
# noinspection DuplicatedCode
class MasterResponseException(ResponseException, metaclass=ABCMeta):
"""
Overview:
Response exception for master client
"""
def __init__(self, error: HTTPError):
"""
Overview:
Constructor
Arguments:
- error (:obj:`HTTPError`): Original http exception object
"""
ResponseException.__init__(self, error)
class MasterSuccess(MasterResponseException):
pass
class MasterSystemShuttingDown(MasterResponseException):
pass
class MasterChannelNotGiven(MasterResponseException):
pass
class MasterChannelInvalid(MasterResponseException):
pass
class MasterMasterTokenNotGiven(MasterResponseException):
pass
class MasterMasterTokenInvalid(MasterResponseException):
pass
class MasterSelfTokenNotGiven(MasterResponseException):
pass
class MasterSelfTokenInvalid(MasterResponseException):
pass
class MasterSlaveTokenNotGiven(MasterResponseException):
pass
class MasterSlaveTokenInvalid(MasterResponseException):
pass
class MasterTaskDataInvalid(MasterResponseException):
pass
_PREFIX = ['master']
def get_master_exception_class_by_error_code(error_code: MasterErrorCode) -> Type[MasterResponseException]:
"""
Overview:
Transform from master error code to `MasterResponseException` class
Arguments:
- error_code (:obj:`MasterErrorCode`): Master error code
Returns:
- exception_class (:obj:`Type[MasterResponseException`): Master response exception class
"""
class_name = ''.join([word.lower().capitalize() for word in (_PREFIX + error_code.name.split('_'))])
return eval(class_name)
def get_master_exception_by_error(error: HTTPError) -> MasterResponseException:
"""
Overview:
Auto transform http error object to master response exception object.
Arguments:
- error (:obj:`HTTPError`): Http error object
Returns:
- exception (:obj:`MasterResponseException`): Master response exception object
"""
_, _, code, _, _ = get_values_from_response(error.response)
error_code = {v.value: v for k, v in MasterErrorCode.__members__.items()}[code]
return get_master_exception_class_by_error_code(error_code)(error)
|