Skip to content

Commit 4927761

Browse files
committed
@sanderegg review: stop before trashing
1 parent 5cef649 commit 4927761

File tree

5 files changed

+41
-7
lines changed

5 files changed

+41
-7
lines changed

packages/models-library/tests/test_rest_filters.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class CustomFilter(Filters):
1212

1313

1414
class CustomFilterStrict(CustomFilter):
15-
class Config:
15+
class Config(CustomFilter.Config):
1616
extra = Extra.forbid
1717

1818

packages/service-library/src/servicelib/project_lock.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import datetime
22
import logging
3+
from ast import TypeAlias
34
from asyncio.log import logger
45
from collections.abc import AsyncIterator
56
from contextlib import asynccontextmanager
@@ -21,7 +22,7 @@
2122
PROJECT_LOCK_TIMEOUT: Final[datetime.timedelta] = datetime.timedelta(seconds=10)
2223
ProjectLock = Lock
2324

24-
ProjectLockError = redis.exceptions.LockError
25+
ProjectLockError: TypeAlias = redis.exceptions.LockError
2526

2627

2728
async def _auto_extend_project_lock(project_lock: Lock) -> None:

services/web/server/src/simcore_service_webserver/projects/_trash_api.py

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,12 @@
77
from models_library.products import ProductName
88
from models_library.projects import ProjectID
99
from models_library.users import UserID
10+
from servicelib.common_headers import UNDEFINED_DEFAULT_SIMCORE_USER_AGENT_VALUE
11+
from simcore_service_webserver.director_v2.exceptions import DirectorServiceError
1012

13+
from ..director_v2 import api as director_v2_api
1114
from . import projects_api
15+
from .exceptions import ProjectLockError, StopProjectBeforeTrashError
1216
from .models import ProjectPatchExtended
1317
from .settings import get_plugin_settings
1418

@@ -18,7 +22,7 @@
1822
async def empty_trash(app: web.Application, product_name: ProductName, user_id: UserID):
1923
# filter trashed=True and set them to False
2024
_logger.debug(
21-
"CODE PLACEHOLDER: all projects marked of trashed of %s in %s are deleted",
25+
"CODE PLACEHOLDER: all projects marked as trashed of %s in %s are deleted",
2226
f"{user_id=}",
2327
f"{product_name=}",
2428
)
@@ -38,16 +42,37 @@ async def prune_all_trashes(app: web.Application) -> list[str]:
3842
return []
3943

4044

41-
async def update_project(
45+
async def trash_project(
4246
app: web.Application,
4347
*,
4448
product_name: ProductName,
4549
user_id: UserID,
4650
project_id: ProjectID,
4751
trashed: bool,
4852
):
49-
# FIXME: can you trash something that is running?
53+
if trashed:
54+
# stop first
55+
try:
56+
await projects_api.remove_project_dynamic_services(
57+
user_id=user_id,
58+
project_uuid=f"{project_id}",
59+
app=app,
60+
simcore_user_agent=UNDEFINED_DEFAULT_SIMCORE_USER_AGENT_VALUE,
61+
notify_users=False,
62+
)
5063

64+
await director_v2_api.delete_pipeline(
65+
app, user_id=user_id, project_id=project_id
66+
)
67+
except (DirectorServiceError, ProjectLockError) as exc:
68+
raise StopProjectBeforeTrashError(
69+
project_uuid=project_id,
70+
user_id=user_id,
71+
product_name=product_name,
72+
from_err=exc,
73+
) from exc
74+
75+
# mark as trash
5176
await projects_api.patch_project(
5277
app,
5378
user_id=user_id,

services/web/server/src/simcore_service_webserver/projects/_trash_handlers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ async def trash_project(request: web.Request):
3939
product_name = get_product_name(request)
4040
path_params = parse_request_path_parameters_as(ProjectPathParams, request)
4141

42-
await _trash_api.update_project(
42+
await _trash_api.trash_project(
4343
request.app,
4444
product_name=product_name,
4545
user_id=user_id,
@@ -58,7 +58,7 @@ async def untrash_project(request: web.Request):
5858
product_name = get_product_name(request)
5959
path_params = parse_request_path_parameters_as(ProjectPathParams, request)
6060

61-
await _trash_api.update_project(
61+
await _trash_api.trash_project(
6262
request.app,
6363
product_name=product_name,
6464
user_id=user_id,

services/web/server/src/simcore_service_webserver/projects/exceptions.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,14 @@ def __init__(self, *, project_uuid, reason, **ctx):
7878
self.reason = reason
7979

8080

81+
class ProjectTrashError(BaseProjectError):
82+
...
83+
84+
85+
class StopProjectBeforeTrashError(ProjectTrashError):
86+
msg_template = "Failed to services in '{project_uuid}' before trashing"
87+
88+
8189
class NodeNotFoundError(BaseProjectError):
8290
msg_template = "Node '{node_uuid}' not found in project '{project_uuid}'"
8391

0 commit comments

Comments
 (0)