Skip to content

Commit 8466659

Browse files
authored
Merge pull request #121 from cloudblue/LITE-28676-fix-error-handling
LITE-28676 Fix error handling for calls to CBC
2 parents 4509ae4 + d3cbada commit 8466659

File tree

6 files changed

+140
-81
lines changed

6 files changed

+140
-81
lines changed

connect_ext_ppr/constants.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -572,3 +572,5 @@
572572
"required": ["hierarchical_files_data"]
573573
}}
574574
"""
575+
576+
DELAY_SECONDS_BETWEEN_TASKS = 10

connect_ext_ppr/service.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@ def add_new_deployment_request(db, dr_data, deployment, account_id, logger):
345345
))
346346
tasks.append(Task(
347347
deployment_request_id=deployment_request.id,
348-
title='Apply PP and delegate to marketplaces',
348+
title='Apply PPR and delegate to marketplaces',
349349
type=Task.TYPES.apply_and_delegate,
350350
created_by=account_id,
351351
))

connect_ext_ppr/services/cbc_hub.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ def update_product(self, product_id: str):
142142
)
143143

144144
def parse_ppr(self, file: BufferedReader):
145+
file.seek(0)
145146
base64_content = base64.b64encode(file.read()).decode('ascii')
146147

147148
return self.plm_service.action(
@@ -175,9 +176,9 @@ def search_task_logs_by_name(self, partial_name: str):
175176

176177
def parse_price_file(
177178
self,
178-
account_id: int,
179-
vendor_id: str,
180-
file: BufferedReader,
179+
account_id: int,
180+
vendor_id: str,
181+
file: BufferedReader,
181182
) -> Dict:
182183
"""
183184

connect_ext_ppr/tasks_manager.py

Lines changed: 83 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,11 @@
66
from sqlalchemy.orm import joinedload, selectinload
77

88
from connect_ext_ppr.client.exception import CBCClientError
9-
from connect_ext_ppr.constants import PPR_FILE_NAME_DELEGATION_L2, PPR_FILE_NAME_UPDATE_MARKETPLACES
9+
from connect_ext_ppr.constants import (
10+
DELAY_SECONDS_BETWEEN_TASKS,
11+
PPR_FILE_NAME_DELEGATION_L2,
12+
PPR_FILE_NAME_UPDATE_MARKETPLACES,
13+
)
1014
from connect_ext_ppr.db import get_cbc_extension_db, get_cbc_extension_db_engine, get_db_ctx_manager
1115
from connect_ext_ppr.models.configuration import Configuration
1216
from connect_ext_ppr.models.enums import (
@@ -65,7 +69,10 @@ def _execute_with_retries(function, func_kwargs, num_retries=5):
6569
num_retries=num_retries,
6670
)
6771
except CBCClientError as ex:
68-
raise TaskException(str(ex))
72+
message = ex.message
73+
if ex.json:
74+
message += f' - {ex.json.get("message")}'
75+
raise TaskException(message)
6976

7077

7178
def _send_ppr(cbc_service, file: BufferedReader):
@@ -89,11 +96,11 @@ def _check_cbc_task_status(cbc_service, tracking_id):
8996
task_log = _execute_with_retries(
9097
cbc_service.search_task_logs_by_name, func_kwargs={'partial_name': tracking_id},
9198
)
92-
# Setting this first default value in case takes time to create it in extenal system.
99+
# Setting this first default value in case takes time to create it in external system.
93100
task_log = task_log[0] if task_log else {'status': CBCTaskLogStatus.not_started}
94101

95102
while task_log['status'] in (CBCTaskLogStatus.not_started, CBCTaskLogStatus.running):
96-
time.sleep(10)
103+
time.sleep(DELAY_SECONDS_BETWEEN_TASKS)
97104
task_log = _execute_with_retries(
98105
cbc_service.search_task_logs_by_name, {'partial_name': tracking_id})[0]
99106

@@ -103,6 +110,29 @@ def _check_cbc_task_status(cbc_service, tracking_id):
103110
raise TaskException(f'Something went wrong with task: {tracking_id}')
104111

105112

113+
def check_and_update_product(deployment_request, cbc_service, **kwargs):
114+
if not deployment_request.manually:
115+
116+
product_id = deployment_request.deployment.product_id
117+
118+
response = _execute_with_retries(
119+
cbc_service.get_product_details, func_kwargs={'product_id': product_id},
120+
)
121+
122+
if 'error' in response.keys():
123+
raise Exception(response['error'])
124+
125+
if response.get('isUpdateAvailable'):
126+
response = _execute_with_retries(
127+
cbc_service.update_product, func_kwargs={'product_id': product_id},
128+
)
129+
130+
if 'error' in response.keys():
131+
raise Exception(response['error'])
132+
133+
return True
134+
135+
106136
def prepare_ppr_file_for_task(
107137
connect_client,
108138
file_data,
@@ -153,8 +183,6 @@ def prepare_ppr_file_for_task(
153183
file_obj.read(),
154184
file_size,
155185
)
156-
157-
file_obj.seek(0)
158186
return file_obj
159187

160188
except (FileNotFoundError, ValueError, KeyError) as e:
@@ -163,34 +191,12 @@ def prepare_ppr_file_for_task(
163191
raise TaskException(f'Error while connecting to Connect: {e.message}')
164192

165193

166-
def check_and_update_product(deployment_request, cbc_service, **kwargs):
167-
if not deployment_request.manually:
168-
169-
product_id = deployment_request.deployment.product_id
170-
171-
response = _execute_with_retries(
172-
cbc_service.get_product_details, func_kwargs={'product_id': product_id},
173-
)
174-
175-
if 'error' in response.keys():
176-
raise Exception(response['error'])
177-
178-
if response.get('isUpdateAvailable'):
179-
response = _execute_with_retries(
180-
cbc_service.update_product, func_kwargs={'product_id': product_id},
181-
)
182-
183-
if 'error' in response.keys():
184-
raise Exception(response['error'])
185-
186-
return True
187-
188-
189194
def apply_ppr_and_delegate_to_marketplaces(
190195
deployment_request,
191196
cbc_service,
192197
connect_client,
193198
db,
199+
logger,
194200
**kwargs,
195201
):
196202
"""Task sends PPR to the Commerce and updates marketplaces in DB
@@ -199,6 +205,7 @@ def apply_ppr_and_delegate_to_marketplaces(
199205
:param cbc_service: CBC service
200206
:param connect_client: Connect client
201207
:param db: dbsession
208+
:param logger: logger
202209
:rtype bool
203210
:raises TaskException
204211
"""
@@ -255,6 +262,10 @@ def apply_ppr_and_delegate_to_marketplaces(
255262
)
256263

257264
tracking_id = _send_ppr(cbc_service, file)
265+
logger.debug(
266+
f'apply_ppr_and_delegate_to_marketplaces dr_id: {deployment_request.id},'
267+
f' tracking_id: {tracking_id}',
268+
)
258269
file.close()
259270
_check_cbc_task_status(cbc_service, tracking_id)
260271

@@ -267,6 +278,47 @@ def apply_ppr_and_delegate_to_marketplaces(
267278
return True
268279

269280

281+
def delegate_to_l2(deployment_request, cbc_service, connect_client, logger, **kwargs):
282+
"""Task delegates PPR to L2 in Commerce
283+
284+
:param deployment_request: DeploymentRequest model
285+
:param cbc_service: CBC service
286+
:param connect_client: Connect client
287+
:param logger: logger
288+
:rtype bool
289+
:raises TaskException
290+
"""
291+
if deployment_request.manually:
292+
return True
293+
294+
ppr_file_id = deployment_request.ppr.file
295+
deployment = deployment_request.deployment
296+
try:
297+
file_data = get_ppr_from_media(
298+
connect_client,
299+
deployment.account_id,
300+
deployment.id,
301+
ppr_file_id,
302+
)
303+
except ClientError as e:
304+
raise TaskException(f'Error while connecting to Connect: {e.message}')
305+
306+
file = prepare_ppr_file_for_task(
307+
connect_client=connect_client,
308+
file_data=file_data,
309+
file_name_template=PPR_FILE_NAME_DELEGATION_L2,
310+
deployment_request=deployment_request,
311+
deployment=deployment,
312+
process_func=process_ppr_file_for_delelegate_l2,
313+
)
314+
315+
tracking_id = _send_ppr(cbc_service, file)
316+
logger.debug(f'delegate_to_l2 dr_id: {deployment_request.id}, tracking_id: {tracking_id}')
317+
file.close()
318+
_check_cbc_task_status(cbc_service, tracking_id)
319+
return True
320+
321+
270322
def apply_pricelist_task(
271323
deployment_request,
272324
cbc_service,
@@ -343,44 +395,6 @@ def validate_pricelists_task(
343395
return True
344396

345397

346-
def delegate_to_l2(deployment_request, cbc_service, connect_client, **kwargs):
347-
"""Task delegates PPR to L2 in Commerce
348-
349-
:param deployment_request: DeploymentRequest model
350-
:param cbc_service: CBC service
351-
:param connect_client: Connect client
352-
:rtype bool
353-
:raises TaskException
354-
"""
355-
if deployment_request.manually:
356-
return True
357-
358-
ppr_file_id = deployment_request.ppr.file
359-
deployment = deployment_request.deployment
360-
try:
361-
file_data = get_ppr_from_media(
362-
connect_client,
363-
deployment.account_id,
364-
deployment.id,
365-
ppr_file_id,
366-
)
367-
except ClientError as e:
368-
raise TaskException(f'Error while connecting to Connect: {e.message}')
369-
370-
file = prepare_ppr_file_for_task(
371-
connect_client=connect_client,
372-
file_data=file_data,
373-
file_name_template=PPR_FILE_NAME_DELEGATION_L2,
374-
deployment_request=deployment_request,
375-
deployment=deployment,
376-
process_func=process_ppr_file_for_delelegate_l2,
377-
)
378-
379-
tracking_id = _send_ppr(cbc_service, file)
380-
file.close()
381-
return _check_cbc_task_status(cbc_service, tracking_id)
382-
383-
384398
TASK_PER_TYPE = {
385399
TaskTypesChoices.product_setup: check_and_update_product,
386400
TaskTypesChoices.apply_and_delegate: apply_ppr_and_delegate_to_marketplaces,
@@ -414,10 +428,12 @@ def execute_tasks(db, config, tasks, connect_client, logger):
414428
connect_client=connect_client,
415429
marketplace=task.marketplace,
416430
db=db,
431+
logger=logger,
417432
)
418433
task.status = TasksStatusChoices.done
419434

420435
except TaskException as ex:
436+
logger.error(f'Task ID: {task.id} - {ex}')
421437
was_succesfull = False
422438
task.error_message = str(ex)[:4000]
423439
except Exception as ex:

connect_ext_ppr/utils.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import time
12
from collections import defaultdict
23
from functools import partial
34
from io import BytesIO
@@ -18,6 +19,7 @@
1819
from connect_ext_ppr.constants import (
1920
BASE_SCHEMA,
2021
CONFIGURATION_SCHEMA_TEMPLATE,
22+
DELAY_SECONDS_BETWEEN_TASKS,
2123
PPR_SCHEMA,
2224
SUMMARY_TEMPLATE,
2325
)
@@ -682,6 +684,7 @@ def execute_with_retry(function, exception_class, args=None, kwargs=None, num_re
682684
except exception_class:
683685
if num_retries == 0:
684686
raise
687+
time.sleep(DELAY_SECONDS_BETWEEN_TASKS)
685688

686689

687690
def get_mps_to_update_for_apply_ppr_and_delegate_to_marketplaces(

0 commit comments

Comments
 (0)