Skip to content

Commit 23d57de

Browse files
committed
drafts batch delete projects
1 parent 9f628b6 commit 23d57de

File tree

7 files changed

+46
-14
lines changed

7 files changed

+46
-14
lines changed

services/web/server/src/simcore_service_webserver/garbage_collector/_tasks_trash.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
)
3131
async def _run_task(app: web.Application):
3232
with log_context(_logger, logging.INFO, "Deleting expired trashed items"):
33-
await trash_service.delete_expired_trash_as_admin(app)
33+
await trash_service.safe_delete_expired_trash_as_admin(app)
3434

3535

3636
async def _run_periodically(app: web.Application, wait_interval_s: float):

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,3 +237,14 @@ async def delete_explicitly_trashed_project(
237237
user_id=user_id,
238238
project_uuid=project_id,
239239
)
240+
241+
242+
async def batch_delete_trashed_projects_as_admin(
243+
app: web.Application,
244+
trashed_before: datetime,
245+
*,
246+
product_name: ProductName,
247+
fail_fast: bool,
248+
) -> None:
249+
250+
raise NotImplementedError

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
from ._trash_service import (
2+
batch_delete_trashed_projects_as_admin,
23
delete_explicitly_trashed_project,
34
list_explicitly_trashed_projects,
45
)
56

67
__all__: tuple[str, ...] = (
8+
"batch_delete_trashed_projects_as_admin",
79
"delete_explicitly_trashed_project",
810
"list_explicitly_trashed_projects",
911
)

services/web/server/src/simcore_service_webserver/trash/_rest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ async def empty_trash(request: web.Request):
5858
product_name = get_product_name(request)
5959

6060
fire_and_forget_task(
61-
_service.empty_trash_safe(
61+
_service.safe_empty_trash(
6262
request.app, product_name=product_name, user_id=user_id
6363
),
6464
task_suffix_name="rest.empty_trash",

services/web/server/src/simcore_service_webserver/trash/_service.py

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -99,21 +99,28 @@ async def _empty_explicitly_trashed_folders_and_content(
9999
)
100100

101101

102-
async def empty_trash_safe(
102+
async def safe_empty_trash(
103103
app: web.Application, *, product_name: ProductName, user_id: UserID
104104
):
105105
await _empty_explicitly_trashed_projects(app, product_name, user_id)
106106

107107
await _empty_explicitly_trashed_folders_and_content(app, product_name, user_id)
108108

109109

110-
async def delete_expired_trash_as_admin(app: web.Application) -> list:
110+
async def safe_delete_expired_trash_as_admin(app: web.Application) -> list:
111111
settings = get_plugin_settings(app)
112112
retention = timedelta(days=settings.TRASH_RETENTION_DAYS)
113113
delete_until = arrow.now().datetime - retention
114114

115115
deleted = [] # TODO: delete count of all items? ids? delete-stats?
116116
for product in products_service.list_products(app):
117+
118+
ctx = {
119+
"delete_until": delete_until,
120+
"retention": retention,
121+
"product_name": product.name,
122+
}
123+
117124
with log_context(
118125
_logger,
119126
logging.DEBUG,
@@ -136,14 +143,26 @@ async def delete_expired_trash_as_admin(app: web.Application) -> list:
136143
**create_troubleshotting_log_kwargs(
137144
"Error batch deleting expired trashed folders as admin.",
138145
error=exc,
139-
error_context={
140-
"delete_until": delete_until,
141-
"retention": retention,
142-
"product_name": product.name,
143-
},
146+
error_context=ctx,
144147
)
145148
)
146149

147-
# TODO: batch delete trashed projects here
150+
try:
151+
152+
await projects_trash_service.batch_delete_trashed_projects_as_admin(
153+
app,
154+
trashed_before=delete_until,
155+
product_name=product.name,
156+
fail_fast=False,
157+
)
158+
159+
except Exception as exc: # pylint: disable=broad-exception-caught
160+
_logger.warning(
161+
**create_troubleshotting_log_kwargs(
162+
"Error batch deleting expired projects as admin.",
163+
error=exc,
164+
error_context=ctx,
165+
)
166+
)
148167

149168
return deleted
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from ._service import delete_expired_trash_as_admin
1+
from ._service import safe_delete_expired_trash_as_admin
22

3-
__all__: tuple[str, ...] = ("delete_expired_trash_as_admin",)
3+
__all__: tuple[str, ...] = ("safe_delete_expired_trash_as_admin",)
44
# nopycln: file

services/web/server/tests/unit/with_dbs/03/trash/test_trash_service.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ async def test_trash_service__delete_expired_trash(
110110
assert ProjectGet.model_validate(data).trashed_by == logged_user["primary_gid"]
111111

112112
# UNDER TEST: Run delete_expired_trash
113-
await trash_service.delete_expired_trash_as_admin(client.app)
113+
await trash_service.safe_delete_expired_trash_as_admin(client.app)
114114

115115
# ASSERT: logged_user tries to get the project and expects 404
116116
resp = await client.get(f"/v0/projects/{user_project_id}")
@@ -194,7 +194,7 @@ async def test_trash_nested_folders_and_projects(
194194
await assert_status(resp, status.HTTP_204_NO_CONTENT)
195195

196196
# UNDER TEST
197-
await trash_service.delete_expired_trash_as_admin(client.app)
197+
await trash_service.safe_delete_expired_trash_as_admin(client.app)
198198

199199
async with _client_session_with_user(client, logged_user):
200200
# Verify logged_user's resources are gone

0 commit comments

Comments
 (0)