Skip to content

Commit 148bca2

Browse files
committed
Fixed error handling and added parameter type in every function
1 parent 1253539 commit 148bca2

8 files changed

Lines changed: 84 additions & 58 deletions

File tree

src/python_ms_core/__init__.py

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@
1111
load_dotenv()
1212

1313

14-
# FIXME: ADD parameter type should be present in each and every function
15-
# FIXME: ADD return type should be present in each and every function
1614
class Core:
1715

1816
# FIXME: Fix the configuration
@@ -27,15 +25,13 @@ def __init__(self, config=None):
2725
if self.config.provider == 'Local':
2826
logging.error(f'Unimplemented initialization for core {self.config.provider}')
2927

30-
# FIXME: Change the function logic to take the configuration not from .env file if provided
3128
@staticmethod
3229
def initialize():
3330
return Core().__check_health()
3431

3532
@staticmethod
3633
def get_logger(provider=None):
37-
# TODO: Get logger fix local provider
38-
if provider:
34+
if provider and provider.lower() == 'local':
3935
return LocalLogger(provider_config=provider)
4036
else:
4137
return Logger()
@@ -48,13 +44,11 @@ def get_topic(topic_name: str):
4844
if topic_name is not None:
4945
return Topic(config=CoreConfig.default(), topic_name=topic_name)
5046
else:
51-
# FIXME: Fix the error message
52-
logging.error(f'Unimplemented initialization for core, Topic name required!')
47+
logging.error(f'Error: Topic name is required as function parameter')
5348
return
5449

5550
@staticmethod
5651
def get_storage_client():
57-
# FIXME: Check the azure connection first before call the method
5852
return azure_storage_client.AzureStorageClient(AzureStorageConfig())
5953

6054
def __check_health(self):

src/python_ms_core/core/logger/logger.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ def __init__(self):
1212
self.config = AzureServiceBusTopic()
1313
self.queue_client = Queue(self.config)
1414

15-
def add_request(self, request_data):
15+
def add_request(self, request_data: dict):
1616
message = QueueMessage.data_from({
1717
'message': 'Add Request',
1818
'messageType': 'addRequest',

src/python_ms_core/core/queue/topic.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ def messages(self, provider, topic, subscription):
2424
finally:
2525
topic_receiver.complete_message(message)
2626

27+
2728
class Topic:
2829
def __init__(self, config=None, topic_name=None):
2930
self.topic = topic_name
@@ -40,6 +41,7 @@ def subscribe(self, subscription=None, callback=None):
4041
if subscription is not None:
4142
cb = Callback(callback)
4243
thread = threading.Thread(target=cb.messages, args=(self.provider,self.topic, subscription))
44+
thread.daemon = True
4345
thread.start()
4446
time.sleep(5)
4547
else:
@@ -53,4 +55,3 @@ def publish(self, data=None):
5355
sender = self.provider.client.get_topic_sender(topic_name=self.provider.topic)
5456
with sender:
5557
sender.send_messages(self.provider.sender(json.dumps(message)))
56-
print('Message Sent')
Lines changed: 56 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
1-
import azure
21
import operator
32
from functools import wraps
43
from .errors import BadRequestError, UnauthorizedError, ForbiddenError, NotFoundError, ConflictError, \
5-
UnProcessableError, TooManyRequestError, ServiceError, TimeOutError
4+
UnProcessableError, TooManyRequestError, ServiceError, TimeOutError, InternalServerError
5+
from azure.servicebus.exceptions import AutoLockRenewFailed, AutoLockRenewTimeout, MessageAlreadySettled, \
6+
MessageLockLostError, MessageNotFoundError, MessageSizeExceededError, MessagingEntityAlreadyExistsError, \
7+
MessagingEntityDisabledError, MessagingEntityNotFoundError, OperationTimeoutError, ServiceBusAuthenticationError, \
8+
ServiceBusAuthorizationError, ServiceBusCommunicationError, ServiceBusConnectionError, ServiceBusError, \
9+
ServiceBusQuotaExceededError, ServiceBusServerBusyError, SessionCannotBeLockedError, SessionLockLostError
10+
11+
from azure.core.exceptions import ClientAuthenticationError, HttpResponseError, ServiceRequestError, \
12+
ResourceNotFoundError, AzureError
613

714

815
def parse_error(base_message, error):
@@ -11,21 +18,23 @@ def parse_error(base_message, error):
1118
description = ''
1219
if error.__class__ == TypeError:
1320
error = str(error)
21+
try:
22+
complete_message = error.split('\n') if operator.contains(str(error), '\n') else [error]
1423

15-
complete_message = error.split('\n') if operator.contains(str(error), '\n') else [error]
16-
17-
if complete_message and len(complete_message) > 0:
18-
message = complete_message[0]
19-
if complete_message and len(complete_message) > 1:
20-
status_code_string = complete_message[1]
21-
status_code_string = status_code_string.split('Status code: ')
22-
if len(status_code_string) == 2:
23-
status_code = int(status_code_string[1])
24-
if complete_message and len(complete_message) > 2:
25-
description_string = complete_message[2]
26-
description_string = description_string.split('Description: ')
27-
if len(description_string) == 2:
28-
description = description_string[1]
24+
if complete_message and len(complete_message) > 0:
25+
message = complete_message[0]
26+
if complete_message and len(complete_message) > 1:
27+
status_code_string = complete_message[1]
28+
status_code_string = status_code_string.split('Status code: ')
29+
if len(status_code_string) == 2:
30+
status_code = int(status_code_string[1])
31+
if complete_message and len(complete_message) > 2:
32+
description_string = complete_message[2]
33+
description_string = description_string.split('Description: ')
34+
if len(description_string) == 2:
35+
description = description_string[1]
36+
except Exception as e:
37+
pass
2938

3039
return {
3140
'message': f'{base_message}: {message}',
@@ -41,49 +50,59 @@ def decorated(fn):
4150
def wrapper(*args, **kwargs):
4251
try:
4352
return fn(*args, **kwargs)
44-
except azure.servicebus.exceptions.AutoLockRenewFailed as ex:
53+
except AutoLockRenewFailed as ex:
4554
raise BadRequestError(parse_error('AutoLock Renew Failed Error', ex.message))
46-
except azure.servicebus.exceptions.AutoLockRenewTimeout as ex:
55+
except AutoLockRenewTimeout as ex:
4756
raise TimeOutError(parse_error('AutoLock Renew Timeout Error', ex.message))
48-
except azure.servicebus.exceptions.MessageAlreadySettled as ex:
57+
except MessageAlreadySettled as ex:
4958
raise BadRequestError(parse_error('Message Already Settled Error', ex.message))
50-
except azure.servicebus.exceptions.MessageLockLostError as ex:
59+
except MessageLockLostError as ex:
5160
raise BadRequestError(parse_error('Message Lock Lost Error', ex.message))
52-
except azure.servicebus.exceptions.MessageNotFoundError as ex:
61+
except MessageNotFoundError as ex:
5362
raise NotFoundError(parse_error('Message Not Found Error', ex.message))
54-
except azure.servicebus.exceptions.MessageSizeExceededError as ex:
63+
except MessageSizeExceededError as ex:
5564
raise BadRequestError(parse_error('Message Size Exceeded Error', ex.message))
56-
except azure.servicebus.exceptions.MessagingEntityAlreadyExistsError as ex:
65+
except MessagingEntityAlreadyExistsError as ex:
5766
raise ConflictError(parse_error('Message Entity Already Exists Error', ex.message))
58-
except azure.servicebus.exceptions.MessagingEntityDisabledError as ex:
67+
except MessagingEntityDisabledError as ex:
5968
raise UnProcessableError(parse_error('Message Entity Disabled Error', ex.message))
60-
except azure.servicebus.exceptions.MessagingEntityNotFoundError as ex:
69+
except MessagingEntityNotFoundError as ex:
6170
raise NotFoundError(parse_error('Message Entity Not Found Error', ex.message))
62-
except azure.servicebus.exceptions.OperationTimeoutError as ex:
71+
except OperationTimeoutError as ex:
6372
raise TimeOutError(parse_error('Operation Timeout Error', ex.message))
64-
except azure.servicebus.exceptions.ServiceBusAuthenticationError as ex:
73+
except ServiceBusAuthenticationError as ex:
6574
raise NotFoundError(parse_error('Unable to Authenticate Service Bus Error', ex.message))
66-
except azure.servicebus.exceptions.ServiceBusAuthorizationError as ex:
75+
except ServiceBusAuthorizationError as ex:
6776
raise ForbiddenError(parse_error('Unable to Authorization Service Bus Error', ex.message))
68-
except azure.servicebus.exceptions.ServiceBusCommunicationError as ex:
77+
except ServiceBusCommunicationError as ex:
6978
raise UnProcessableError(parse_error('Service Bus Communication Error', ex.message))
70-
except azure.servicebus.exceptions.ServiceBusConnectionError as ex:
79+
except ServiceBusConnectionError as ex:
7180
raise ForbiddenError(parse_error('Service Bus Connection Error', ex.message))
72-
except azure.servicebus.exceptions.ServiceBusError as ex:
73-
raise ForbiddenError(parse_error('Service Bus Error', ex.message))
74-
except azure.servicebus.exceptions.ServiceBusQuotaExceededError as ex:
81+
except ServiceBusQuotaExceededError as ex:
7582
raise UnProcessableError(parse_error('Service Bus Quota Exceeded Error', ex.message))
76-
except azure.servicebus.exceptions.ServiceBusServerBusyError as ex:
83+
except ServiceBusServerBusyError as ex:
7784
raise UnProcessableError(parse_error('Service Bus Server Busy Error', ex.message))
78-
except azure.servicebus.exceptions.SessionCannotBeLockedError as ex:
85+
except SessionCannotBeLockedError as ex:
7986
raise UnProcessableError(parse_error('Session Cannot Be Locked Error', ex.message))
80-
except azure.servicebus.exceptions.SessionLockLostError as ex:
87+
except SessionLockLostError as ex:
8188
raise UnProcessableError(parse_error('Session Lock Lost Error', ex.message))
89+
except ServiceBusError as ex:
90+
raise ForbiddenError(parse_error('Service Bus Error', ex.message))
91+
except ClientAuthenticationError as ex:
92+
raise UnauthorizedError(parse_error('Client Authentication Error', ex.message))
93+
except ResourceNotFoundError as ex:
94+
raise NotFoundError(parse_error('Resource Not Found Error', ex.message))
95+
except HttpResponseError as ex:
96+
raise UnProcessableError(parse_error('Http Response Error', ex.message))
97+
except ServiceRequestError as ex:
98+
raise UnProcessableError(parse_error('Service Request Error', ex.message))
99+
except AzureError as ex:
100+
raise NotFoundError(parse_error('Azure Error', ex.message))
82101
except ValueError as ex:
83102
raise UnProcessableError(parse_error('UnProcessable Error', ex))
84103
except TypeError as ex:
85104
raise ServiceError(parse_error('Service Error', ex))
86105
except Exception as ex:
87-
raise ServiceError(parse_error('Exception', ex))
106+
raise InternalServerError(parse_error('Exception', ex))
88107

89108
return wrapper

src/python_ms_core/core/resource_errors/errors.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,3 +45,5 @@ class TooManyRequestError(ServiceError):
4545
status = 429
4646

4747

48+
class InternalServerError(ServiceError):
49+
status = 500

src/python_ms_core/core/storage/providers/azure/azure_file_entity.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from azure.storage.blob import BlobClient
22
from ...abstract import file_entity
3+
from ....resource_errors import ExceptionHandler
34

45

56
class AzureFileEntity(file_entity.FileEntity):
@@ -10,15 +11,19 @@ def __init__(self, name, blob_client):
1011
self.blob_client = blob_client
1112
self._get_remote_url = None
1213

14+
@ExceptionHandler.decorated
1315
def get_stream(self):
1416
return self.blob_client.download_blob().readall()
1517

18+
@ExceptionHandler.decorated
1619
def get_body_text(self):
1720
return self.blob_client.download_blob().content_as_text()
1821

22+
@ExceptionHandler.decorated
1923
def upload(self, upload_stream):
2024
upload_file = self.blob_client.upload_blob(self.file_path, upload_stream)
2125
self._get_remote_url = upload_file.url
2226

27+
@ExceptionHandler.decorated
2328
def get_remote_url(self):
2429
return self._get_remote_url

src/python_ms_core/core/storage/providers/azure/azure_storage_client.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,36 @@
11
import logging
22
import urllib.parse
33
from azure.storage.blob import BlobServiceClient
4-
from ...abstract import storage_client
54
from . import azure_storage_config, azure_file_entity, azure_storage_container
5+
from ...abstract import storage_client
6+
from ....resource_errors import ExceptionHandler
67

78

89
class AzureStorageClient(storage_client.StorageClient):
910
_blob_service_client: BlobServiceClient
1011

1112
def __init__(self, config: azure_storage_config.AzureStorageConfig):
1213
super().__init__()
14+
self.config = config
1315
self._blob_service_client = BlobServiceClient.from_connection_string(config.connection_string)
1416

15-
# TODO: Added exception handler here
16-
# TODO: Like @ExceptionHandler.decorated
17-
def get_container(self, container_name=None):
18-
if container_name is not None:
17+
@ExceptionHandler.decorated
18+
def get_container(self, container_name: str):
19+
if container_name:
1920
client_container = self._blob_service_client.get_container_client(container_name)
2021
return azure_storage_container.AzureStorageContainer(container_name, client_container)
2122
else:
2223
logging.error(f'Unimplemented initialization for core {self.config.provider}, Container name is required!')
2324
return
2425

25-
def get_file(self, container_name, file_name):
26+
@ExceptionHandler.decorated
27+
def get_file(self, container_name: str, file_name: str):
2628
client_container = self._blob_service_client.get_container_client(container_name)
2729
blob_client = client_container.get_blob_client(file_name)
28-
properties = blob_client.get_blob_properties()
29-
return azure_file_entity.AzureFileEntity(file_name, properties.blob_type, blob_client)
30+
return azure_file_entity.AzureFileEntity(file_name, blob_client)
3031

31-
def get_file_from_url(self, container_name, full_url):
32+
@ExceptionHandler.decorated
33+
def get_file_from_url(self, container_name: str, full_url: str):
3234
path = '/'.join(urllib.parse.unquote(full_url).split('/')[4:])
3335
file = azure_file_entity.AzureFileEntity
3436
client_container = self._blob_service_client.get_container_client(container_name)
Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
from azure.storage.blob import ContainerClient
22
from ...abstract import storage_container
33
from ...providers.azure import azure_file_entity
4+
from ....resource_errors import ExceptionHandler
45

56

67
class AzureStorageContainer(storage_container.StorageContainer):
78
container_client = ContainerClient
89

9-
def __init__(self, name, container_client: ContainerClient):
10+
def __init__(self, name: str, container_client: ContainerClient):
1011
super().__init__(name)
1112
self.container_client = container_client
1213

14+
@ExceptionHandler.decorated
1315
def list_files(self):
1416
blob_iterator = self.container_client.list_blobs()
1517
files_list = [azure_file_entity.AzureFileEntity]
@@ -18,5 +20,6 @@ def list_files(self):
1820
files_list.append(azure_file_entity.AzureFileEntity(single_item.name, blob_client=blob_client))
1921
return files_list
2022

21-
def create_file(self, name):
23+
@ExceptionHandler.decorated
24+
def create_file(self, name: str):
2225
return azure_file_entity.AzureFileEntity(name, self.container_client)

0 commit comments

Comments
 (0)