Skip to content

Commit 8bdb286

Browse files
author
Andrei Neagu
committed
fixed timeout and error handling with access
1 parent 53247a7 commit 8bdb286

File tree

4 files changed

+28
-17
lines changed

4 files changed

+28
-17
lines changed

packages/models-library/src/models_library/api_schemas_storage/data_export_async_jobs.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,5 @@ class InvalidFileIdentifierError(StorageRpcBaseError):
1515

1616
class AccessRightError(StorageRpcBaseError):
1717
msg_template: str = (
18-
"User {user_id} does not have access to file {file_id} with location {location_id}"
18+
"User {user_id} does not have access to one or multiple files in {paths_to_download} with location {location_id}"
1919
)

services/storage/src/simcore_service_storage/api/_worker_tasks/_simcore_s3.py

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from pydantic import TypeAdapter
1313
from servicelib.logging_utils import log_context
1414
from servicelib.progress_bar import ProgressBarData
15-
from simcore_service_storage.exceptions.errors import FileAccessRightError
15+
from simcore_service_storage.exceptions.errors import ProjectAccessRightError
1616

1717
from ...dsm import get_dsm_provider
1818
from ...modules.celery.models import TaskID, TaskId
@@ -80,20 +80,10 @@ async def export_data(
8080
assert isinstance(dsm, SimcoreS3DataManager) # nosec
8181

8282
paths_to_export = [
83-
TypeAdapter(StorageFileID).validate_python(path_to_export)
83+
TypeAdapter(S3ObjectKey).validate_python(path_to_export)
8484
for path_to_export in paths_to_export
8585
]
8686

87-
try:
88-
for path_to_export in paths_to_export:
89-
await dsm.can_read_file(user_id=user_id, file_id=path_to_export)
90-
except FileAccessRightError as err:
91-
raise AccessRightError(
92-
user_id=user_id,
93-
file_id=path_to_export,
94-
location_id=SimcoreS3DataManager.get_location_id(),
95-
) from err
96-
9787
async def _progress_cb(report: ProgressReport) -> None:
9888
assert task.name # nosec
9989
get_celery_worker(task.app).set_task_progress(task.name, task_id, report)
@@ -104,6 +94,13 @@ async def _progress_cb(report: ProgressReport) -> None:
10494
description=f"'{task_id}' export data",
10595
progress_report_cb=_progress_cb,
10696
) as progress_bar:
107-
return await dsm.create_s3_export(
108-
user_id, paths_to_export, progress_bar=progress_bar
109-
)
97+
try:
98+
return await dsm.create_s3_export(
99+
user_id, paths_to_export, progress_bar=progress_bar
100+
)
101+
except ProjectAccessRightError as err:
102+
raise AccessRightError(
103+
user_id=user_id,
104+
paths_to_download=paths_to_export,
105+
location_id=SimcoreS3DataManager.get_location_id(),
106+
) from err

services/storage/src/simcore_service_storage/modules/celery/_task.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
_logger = logging.getLogger(__name__)
1919

20-
_DEFAULT_TASK_TIMEOUT: Final[timedelta] | None = None
20+
_DEFAULT_TASK_TIMEOUT: Final[timedelta | None] = None
2121
_DEFAULT_MAX_RETRIES: Final[NonNegativeInt] = 3
2222
_DEFAULT_WAIT_BEFORE_RETRY: Final[timedelta] = timedelta(seconds=5)
2323

services/storage/src/simcore_service_storage/simcore_s3_dsm.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1250,6 +1250,20 @@ async def create_s3_export(
12501250
) -> StorageFileID:
12511251
source_object_keys: set[StorageFileID] = set()
12521252

1253+
# check access rights
1254+
for object_key in object_keys:
1255+
project_id = None
1256+
with contextlib.suppress(ValueError):
1257+
project_id = ProjectID(Path(object_key).parts[0])
1258+
1259+
accessible_projects_ids = await get_accessible_project_ids(
1260+
get_db_engine(self.app), user_id=user_id, project_id=project_id
1261+
)
1262+
if project_id is None or project_id not in accessible_projects_ids:
1263+
raise ProjectAccessRightError(
1264+
access_right="read", project_id=project_id
1265+
)
1266+
12531267
for object_key in object_keys:
12541268
async for meta_data_files in get_s3_client(self.app).list_objects_paginated(
12551269
self.simcore_bucket_name, object_key

0 commit comments

Comments
 (0)