Skip to content

Commit 2ada7e6

Browse files
review @sanderegg
1 parent 50fe206 commit 2ada7e6

File tree

3 files changed

+95
-10
lines changed

3 files changed

+95
-10
lines changed
Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,33 @@
1-
import uuid
21
from datetime import datetime, timezone
32

43
import sqlalchemy as sa
4+
from models_library.errors_classes import OsparcErrorMixin
5+
from models_library.projects import ProjectID
56
from pydantic import parse_obj_as
67
from sqlalchemy.ext.asyncio import AsyncConnection
78

89
from .models.projects import projects
910
from .utils_repos import transaction_context
1011

1112

13+
class DBBaseProjectError(OsparcErrorMixin, Exception):
14+
...
15+
16+
17+
class DBProjectNotFoundError(DBBaseProjectError):
18+
project_uuid: ProjectID
19+
20+
1221
class ProjectsRepo:
1322
def __init__(self, engine):
1423
self.engine = engine
1524

1625
async def get_project_last_change_date(
1726
self,
18-
project_uuid: uuid.UUID,
27+
project_uuid: ProjectID,
1928
*,
2029
connection: AsyncConnection | None = None,
21-
) -> datetime | None:
30+
) -> datetime:
2231
async with transaction_context(self.engine, connection) as conn:
2332
get_stmt = sa.select(projects.c.last_change_date).where(
2433
projects.c.uuid == f"{project_uuid}"
@@ -27,6 +36,6 @@ async def get_project_last_change_date(
2736
result = await conn.execute(get_stmt)
2837
row = result.first()
2938
if row is None:
30-
return None
39+
raise DBProjectNotFoundError(project_uuid=project_uuid)
3140
date = parse_obj_as(datetime, row[0])
3241
return date.replace(tzinfo=timezone.utc)
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# pylint: disable=redefined-outer-name
2+
# pylint: disable=unused-argument
3+
# pylint: disable=unused-variable
4+
# pylint: disable=too-many-arguments
5+
import uuid
6+
from collections.abc import Awaitable, Callable
7+
from datetime import datetime
8+
from typing import Any, AsyncIterator
9+
10+
import pytest
11+
import sqlalchemy
12+
from aiopg.sa.connection import SAConnection
13+
from aiopg.sa.result import RowProxy
14+
from simcore_postgres_database.models.projects import projects
15+
from simcore_postgres_database.utils_projects import (
16+
DBProjectNotFoundError,
17+
ProjectsRepo,
18+
)
19+
from sqlalchemy.ext.asyncio import AsyncEngine
20+
21+
22+
async def _delete_project(connection: SAConnection, project_uuid: uuid.UUID) -> None:
23+
result = await connection.execute(
24+
sqlalchemy.delete(projects).where(projects.c.uuid == f"{project_uuid}")
25+
)
26+
assert result.rowcount == 1
27+
28+
29+
@pytest.fixture
30+
async def registered_user(
31+
connection: SAConnection,
32+
create_fake_user: Callable[..., Awaitable[RowProxy]],
33+
) -> RowProxy:
34+
user = await create_fake_user(connection)
35+
assert user
36+
return user
37+
38+
39+
@pytest.fixture
40+
async def registered_project(
41+
connection: SAConnection,
42+
registered_user: RowProxy,
43+
create_fake_project: Callable[..., Awaitable[RowProxy]],
44+
) -> AsyncIterator[dict[str, Any]]:
45+
project = await create_fake_project(connection, registered_user)
46+
assert project
47+
48+
yield dict(project)
49+
50+
await _delete_project(connection, project["uuid"])
51+
52+
53+
async def test_get_project_last_change_date(
54+
asyncpg_engine: AsyncEngine,
55+
registered_project: dict,
56+
):
57+
# conn = connection
58+
projects_repo = ProjectsRepo(asyncpg_engine)
59+
60+
project_last_change_date = await projects_repo.get_project_last_change_date(
61+
project_uuid=registered_project["uuid"]
62+
)
63+
assert isinstance(project_last_change_date, datetime)
64+
65+
with pytest.raises(DBProjectNotFoundError):
66+
await projects_repo.get_project_last_change_date(
67+
project_uuid="976b031b-828e-4d88-836a-6c2fe4823c6b" # <-- Non existing uuid in DB
68+
)

services/efs-guardian/src/simcore_service_efs_guardian/services/background_tasks.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@
99
PROJECT_REDIS_LOCK_KEY,
1010
lock_project,
1111
)
12-
from simcore_postgres_database.utils_projects import ProjectsRepo
12+
from simcore_postgres_database.utils_projects import (
13+
DBProjectNotFoundError,
14+
ProjectsRepo,
15+
)
1316

1417
from ..core.settings import ApplicationSettings
1518
from .efs_manager import EfsManager
@@ -33,12 +36,17 @@ async def removal_policy_task(app: FastAPI) -> None:
3336

3437
projects_repo = ProjectsRepo(app.state.engine)
3538
for project_id in efs_project_ids:
36-
_project_last_change_date = await projects_repo.get_project_last_change_date(
37-
project_id
38-
)
39+
try:
40+
_project_last_change_date = (
41+
await projects_repo.get_project_last_change_date(project_id)
42+
)
43+
except DBProjectNotFoundError as exc:
44+
_logger.warning(
45+
"Project %s not found, this should not happen, please investigate (contact MD)",
46+
exc.project_uuid,
47+
)
3948
if (
40-
_project_last_change_date is None
41-
or _project_last_change_date
49+
_project_last_change_date
4250
< base_start_timestamp
4351
- app_settings.EFS_REMOVAL_POLICY_TASK_AGE_LIMIT_TIMEDELTA
4452
):

0 commit comments

Comments
 (0)