5
5
from dataclasses import dataclass
6
6
from datetime import datetime , timezone
7
7
from functools import lru_cache
8
+ from json import JSONDecodeError
8
9
from typing import Dict , Iterable , List , Optional , Set , Tuple , Union
9
10
10
11
import dateutil .parser as dp
@@ -193,6 +194,9 @@ class HTTPError429(HTTPError):
193
194
pass
194
195
195
196
197
+ ModeRequestError = (HTTPError , JSONDecodeError )
198
+
199
+
196
200
@dataclass
197
201
class ModeSourceReport (StaleEntityRemovalSourceReport ):
198
202
filtered_spaces : LossyList [str ] = dataclasses .field (default_factory = LossyList )
@@ -328,11 +332,11 @@ def __init__(self, ctx: PipelineContext, config: ModeConfig):
328
332
# Test the connection
329
333
try :
330
334
self ._get_request_json (f"{ self .config .connect_uri } /api/verify" )
331
- except HTTPError as http_error :
335
+ except ModeRequestError as e :
332
336
self .report .report_failure (
333
337
title = "Failed to Connect" ,
334
338
message = "Unable to verify connection to mode." ,
335
- context = f"Error: { str (http_error )} " ,
339
+ context = f"Error: { str (e )} " ,
336
340
)
337
341
338
342
self .workspace_uri = f"{ self .config .connect_uri } /api/{ self .config .workspace } "
@@ -521,11 +525,11 @@ def _get_creator(self, href: str) -> Optional[str]:
521
525
if self .config .owner_username_instead_of_email
522
526
else user_json .get ("email" )
523
527
)
524
- except HTTPError as http_error :
528
+ except ModeRequestError as e :
525
529
self .report .report_warning (
526
530
title = "Failed to retrieve Mode creator" ,
527
531
message = f"Unable to retrieve user for { href } " ,
528
- context = f"Reason: { str (http_error )} " ,
532
+ context = f"Reason: { str (e )} " ,
529
533
)
530
534
return user
531
535
@@ -571,11 +575,11 @@ def _get_space_name_and_tokens(self) -> dict:
571
575
logging .debug (f"Skipping space { space_name } due to space pattern" )
572
576
continue
573
577
space_info [s .get ("token" , "" )] = s .get ("name" , "" )
574
- except HTTPError as http_error :
578
+ except ModeRequestError as e :
575
579
self .report .report_failure (
576
580
title = "Failed to Retrieve Spaces" ,
577
581
message = "Unable to retrieve spaces / collections for workspace." ,
578
- context = f"Workspace: { self .workspace_uri } , Error: { str (http_error )} " ,
582
+ context = f"Workspace: { self .workspace_uri } , Error: { str (e )} " ,
579
583
)
580
584
581
585
return space_info
@@ -721,11 +725,11 @@ def _get_data_sources(self) -> List[dict]:
721
725
try :
722
726
ds_json = self ._get_request_json (f"{ self .workspace_uri } /data_sources" )
723
727
data_sources = ds_json .get ("_embedded" , {}).get ("data_sources" , [])
724
- except HTTPError as http_error :
728
+ except ModeRequestError as e :
725
729
self .report .report_failure (
726
730
title = "Failed to retrieve Data Sources" ,
727
731
message = "Unable to retrieve data sources from Mode." ,
728
- context = f"Error: { str (http_error )} " ,
732
+ context = f"Error: { str (e )} " ,
729
733
)
730
734
731
735
return data_sources
@@ -812,11 +816,11 @@ def _get_definition(self, definition_name):
812
816
if definition .get ("name" , "" ) == definition_name :
813
817
return definition .get ("source" , "" )
814
818
815
- except HTTPError as http_error :
819
+ except ModeRequestError as e :
816
820
self .report .report_failure (
817
821
title = "Failed to Retrieve Definition" ,
818
822
message = "Unable to retrieve definition from Mode." ,
819
- context = f"Definition Name: { definition_name } , Error: { str (http_error )} " ,
823
+ context = f"Definition Name: { definition_name } , Error: { str (e )} " ,
820
824
)
821
825
return None
822
826
@@ -1382,11 +1386,11 @@ def _get_reports(self, space_token: str) -> List[dict]:
1382
1386
f"{ self .workspace_uri } /spaces/{ space_token } /reports"
1383
1387
)
1384
1388
reports = reports_json .get ("_embedded" , {}).get ("reports" , {})
1385
- except HTTPError as http_error :
1389
+ except ModeRequestError as e :
1386
1390
self .report .report_failure (
1387
1391
title = "Failed to Retrieve Reports for Space" ,
1388
1392
message = "Unable to retrieve reports for space token." ,
1389
- context = f"Space Token: { space_token } , Error: { str (http_error )} " ,
1393
+ context = f"Space Token: { space_token } , Error: { str (e )} " ,
1390
1394
)
1391
1395
return reports
1392
1396
@@ -1400,11 +1404,11 @@ def _get_datasets(self, space_token: str) -> List[dict]:
1400
1404
url = f"{ self .workspace_uri } /spaces/{ space_token } /datasets"
1401
1405
datasets_json = self ._get_request_json (url )
1402
1406
datasets = datasets_json .get ("_embedded" , {}).get ("reports" , [])
1403
- except HTTPError as http_error :
1407
+ except ModeRequestError as e :
1404
1408
self .report .report_failure (
1405
1409
title = "Failed to Retrieve Datasets for Space" ,
1406
1410
message = f"Unable to retrieve datasets for space token { space_token } ." ,
1407
- context = f"Error: { str (http_error )} " ,
1411
+ context = f"Error: { str (e )} " ,
1408
1412
)
1409
1413
return datasets
1410
1414
@@ -1416,11 +1420,11 @@ def _get_queries(self, report_token: str) -> list:
1416
1420
f"{ self .workspace_uri } /reports/{ report_token } /queries"
1417
1421
)
1418
1422
queries = queries_json .get ("_embedded" , {}).get ("queries" , {})
1419
- except HTTPError as http_error :
1423
+ except ModeRequestError as e :
1420
1424
self .report .report_failure (
1421
1425
title = "Failed to Retrieve Queries" ,
1422
1426
message = "Unable to retrieve queries for report token." ,
1423
- context = f"Report Token: { report_token } , Error: { str (http_error )} " ,
1427
+ context = f"Report Token: { report_token } , Error: { str (e )} " ,
1424
1428
)
1425
1429
return queries
1426
1430
@@ -1433,11 +1437,11 @@ def _get_last_query_run(
1433
1437
f"{ self .workspace_uri } /reports/{ report_token } /runs/{ report_run_id } /query_runs{ query_run_id } "
1434
1438
)
1435
1439
queries = queries_json .get ("_embedded" , {}).get ("queries" , {})
1436
- except HTTPError as http_error :
1440
+ except ModeRequestError as e :
1437
1441
self .report .report_failure (
1438
1442
title = "Failed to Retrieve Queries for Report" ,
1439
1443
message = "Unable to retrieve queries for report token." ,
1440
- context = f"Report Token:{ report_token } , Error: { str (http_error )} " ,
1444
+ context = f"Report Token:{ report_token } , Error: { str (e )} " ,
1441
1445
)
1442
1446
return {}
1443
1447
return queries
@@ -1451,13 +1455,13 @@ def _get_charts(self, report_token: str, query_token: str) -> list:
1451
1455
f"/queries/{ query_token } /charts"
1452
1456
)
1453
1457
charts = charts_json .get ("_embedded" , {}).get ("charts" , {})
1454
- except HTTPError as http_error :
1458
+ except ModeRequestError as e :
1455
1459
self .report .report_failure (
1456
1460
title = "Failed to Retrieve Charts" ,
1457
1461
message = "Unable to retrieve charts from Mode." ,
1458
1462
context = f"Report Token: { report_token } , "
1459
1463
f"Query token: { query_token } , "
1460
- f"Error: { str (http_error )} " ,
1464
+ f"Error: { str (e )} " ,
1461
1465
)
1462
1466
return charts
1463
1467
@@ -1477,6 +1481,8 @@ def get_request():
1477
1481
response = self .session .get (
1478
1482
url , timeout = self .config .api_options .timeout
1479
1483
)
1484
+ if response .status_code == 204 : # No content, don't parse json
1485
+ return {}
1480
1486
return response .json ()
1481
1487
except HTTPError as http_error :
1482
1488
error_response = http_error .response
0 commit comments