Skip to content

Commit 6005b58

Browse files
committed
handles exceptions using warnings
1 parent bf964ad commit 6005b58

File tree

3 files changed

+39
-17
lines changed

3 files changed

+39
-17
lines changed

services/catalog/src/simcore_service_catalog/core/background_tasks.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@
1919
from models_library.services import ServiceMetaDataPublished
2020
from models_library.services_types import ServiceKey, ServiceVersion
2121
from packaging.version import Version
22+
from pydantic import ValidationError
2223
from simcore_service_catalog.api.dependencies.director import get_director_api
2324
from simcore_service_catalog.services import manifest
25+
from sqlalchemy.exc import SQLAlchemyError
2426
from sqlalchemy.ext.asyncio import AsyncEngine
2527

2628
from ..db.repositories.groups import GroupsRepository
@@ -62,6 +64,7 @@ def _by_version(t: tuple[ServiceKey, ServiceVersion]) -> Version:
6264
sorted_services = sorted(service_keys, key=_by_version)
6365

6466
for service_key, service_version in sorted_services:
67+
6568
service_metadata: ServiceMetaDataPublished = services_in_registry[
6669
(service_key, service_version)
6770
]
@@ -90,11 +93,15 @@ def _by_version(t: tuple[ServiceKey, ServiceVersion]) -> Version:
9093
service_access_rights,
9194
)
9295

93-
except HTTPException as err:
94-
# calls to director migh fail but this should not stop the background task from running.
96+
except (HTTPException, ValidationError, SQLAlchemyError) as err:
97+
# Resilient to single failures: errors in individual (service,key) should not affect the wholse serices
98+
# and stop the background task from running.
9599
# SEE https://github.com/ITISFoundation/osparc-simcore/issues/6318
96100
_logger.warning(
97-
"Skipping '%s:%s'. Reason: %s", service_key, service_version, err
101+
"Skipping '%s:%s' due to %s",
102+
service_key,
103+
service_version,
104+
err,
98105
)
99106

100107

services/catalog/src/simcore_service_catalog/services/access_rights.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import logging
66
import operator
77
from collections.abc import Callable
8-
from datetime import datetime, timezone
8+
from datetime import UTC, datetime
99
from typing import Any, cast
1010
from urllib.parse import quote_plus
1111

@@ -25,18 +25,14 @@
2525

2626
_logger = logging.getLogger(__name__)
2727

28-
_LEGACY_SERVICES_DATE: datetime = datetime(
29-
year=2020, month=8, day=19, tzinfo=timezone.utc
30-
)
28+
_LEGACY_SERVICES_DATE: datetime = datetime(year=2020, month=8, day=19, tzinfo=UTC)
3129

3230

3331
def _is_frontend_service(service: ServiceMetaDataPublished) -> bool:
3432
return "/frontend/" in service.key
3533

3634

3735
async def _is_old_service(app: FastAPI, service: ServiceMetaDataPublished) -> bool:
38-
39-
# FIXME: MUST NOT raise
4036
# NOTE: https://github.com/ITISFoundation/osparc-simcore/pull/6003#discussion_r1658200909
4137
# get service build date
4238
client = get_director_api(app)
@@ -48,9 +44,6 @@ async def _is_old_service(app: FastAPI, service: ServiceMetaDataPublished) -> bo
4844
)
4945
if not data or "build_date" not in data:
5046
return True
51-
52-
_logger.debug("retrieved service extras are %s", data)
53-
5447
service_build_data = arrow.get(data["build_date"]).datetime
5548
return bool(service_build_data < _LEGACY_SERVICES_DATE)
5649

@@ -65,6 +58,12 @@ async def evaluate_default_policy(
6558
1. All services published in osparc prior 19.08.2020 will be visible to everyone (refered as 'old service').
6659
2. Services published after 19.08.2020 will be visible ONLY to his/her owner
6760
3. Front-end services are have execute-access to everyone
61+
62+
63+
Raises:
64+
HTTPException: from calls to director's rest API. Maps director errors into catalog's server error
65+
SQLAlchemyError: from access to pg database
66+
ValidationError: from pydantic model errors
6867
"""
6968
db_engine: AsyncEngine = app.state.engine
7069

services/catalog/tests/unit/with_dbs/test_core_background_task__sync.py

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
from typing import Any
1010

1111
import pytest
12-
from fastapi import FastAPI
12+
from fastapi import FastAPI, HTTPException, status
13+
from pytest_mock import MockerFixture
1314
from respx.router import MockRouter
1415
from simcore_postgres_database.models.services import services_meta_data
1516
from simcore_service_catalog.core.background_tasks import _run_sync_services
@@ -40,6 +41,7 @@ async def cleanup_service_meta_data_db_content(sqlalchemy_async_engine: AsyncEng
4041
await conn.execute(services_meta_data.delete())
4142

4243

44+
@pytest.mark.parametrize("director_fails", [False, True])
4345
async def test_registry_sync_task(
4446
background_tasks_setup_disabled: None,
4547
rabbitmq_and_rpc_setup_disabled: None,
@@ -49,10 +51,20 @@ async def test_registry_sync_task(
4951
app: FastAPI,
5052
services_repo: ServicesRepository,
5153
cleanup_service_meta_data_db_content: None,
54+
mocker: MockerFixture,
55+
director_fails: bool,
5256
):
53-
5457
assert app.state
5558

59+
if director_fails:
60+
# Emulates issue https://github.com/ITISFoundation/osparc-simcore/issues/6318
61+
mocker.patch(
62+
"simcore_service_catalog.services.access_rights._is_old_service",
63+
side_effect=HTTPException(
64+
status_code=status.HTTP_404_NOT_FOUND, detail="fake director error"
65+
),
66+
)
67+
5668
service_key = expected_director_list_services[0]["key"]
5769
service_version = expected_director_list_services[0]["version"]
5870

@@ -75,6 +87,10 @@ async def test_registry_sync_task(
7587
key=service_key,
7688
version=service_version,
7789
)
78-
assert got_from_db
79-
assert got_from_db.key == service_key
80-
assert got_from_db.version == service_version
90+
91+
if director_fails:
92+
assert not got_from_db
93+
else:
94+
assert got_from_db
95+
assert got_from_db.key == service_key
96+
assert got_from_db.version == service_version

0 commit comments

Comments
 (0)