Skip to content

Commit 593c353

Browse files
committed
Merge branch 'master' into extract-celery-code
2 parents dcef2f1 + 87fc3e7 commit 593c353

File tree

283 files changed

+8989
-3198
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

283 files changed

+8989
-3198
lines changed

api/specs/web-server/_projects_states.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from pydantic import ValidationError
1414
from servicelib.aiohttp import status
1515
from simcore_service_webserver._meta import API_VTAG
16-
from simcore_service_webserver.director_v2.exceptions import DirectorServiceError
16+
from simcore_service_webserver.director_v2.exceptions import DirectorV2ServiceError
1717
from simcore_service_webserver.projects._controller.projects_states_rest import (
1818
ProjectPathParams,
1919
_OpenProjectQuery,
@@ -62,7 +62,7 @@ def to_desc(exceptions: list[type[Exception]] | type[Exception]):
6262
"description": to_desc([ValidationError])
6363
},
6464
status.HTTP_503_SERVICE_UNAVAILABLE: {
65-
"description": to_desc([DirectorServiceError])
65+
"description": to_desc([DirectorV2ServiceError])
6666
},
6767
},
6868
)

api/tests/requirements.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
aiohappyeyeballs==2.4.6
1+
aiohappyeyeballs==2.6.1
22
# via aiohttp
3-
aiohttp==3.11.18
3+
aiohttp==3.12.7
44
# via
55
# -c ../../requirements/constraints.txt
66
# -r requirements.in

ci/helpers/requirements/requirements.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
aiohappyeyeballs==2.6.1
22
# via aiohttp
3-
aiohttp==3.11.18
3+
aiohttp==3.12.7
44
# via
55
# -c requirements/../../../requirements/constraints.txt
66
# -r requirements/requirements.in
@@ -20,7 +20,7 @@ charset-normalizer==3.4.1
2020
# via requests
2121
docker==7.1.0
2222
# via -r requirements/requirements.in
23-
fastapi==0.115.0
23+
fastapi==0.115.12
2424
# via -r requirements/requirements.in
2525
frozenlist==1.4.1
2626
# via
@@ -49,7 +49,7 @@ requests==2.32.3
4949
# via docker
5050
sniffio==1.3.1
5151
# via anyio
52-
starlette==0.38.6
52+
starlette==0.46.2
5353
# via
5454
# -c requirements/../../../requirements/constraints.txt
5555
# fastapi

packages/aws-library/requirements/_base.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ aiofiles==24.1.0
1616
# via
1717
# -r requirements/../../../packages/service-library/requirements/_base.in
1818
# aioboto3
19-
aiohappyeyeballs==2.4.6
19+
aiohappyeyeballs==2.6.1
2020
# via aiohttp
21-
aiohttp==3.11.18
21+
aiohttp==3.12.7
2222
# via
2323
# -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt
2424
# -c requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt

packages/aws-library/requirements/_test.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ docker==7.1.0
7070
# via moto
7171
faker==36.1.1
7272
# via -r requirements/_test.in
73-
fastapi==0.115.11
73+
fastapi==0.115.12
7474
# via -r requirements/_test.in
7575
flask==3.1.0
7676
# via

packages/dask-task-models-library/src/dask_task_models_library/container_tasks/errors.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1-
""" Dask task exceptions
1+
"""Dask task exceptions"""
22

3-
"""
43
from common_library.errors_classes import OsparcErrorMixin
54

65

7-
class TaskValueError(OsparcErrorMixin, ValueError):
8-
...
6+
class TaskValueError(OsparcErrorMixin, ValueError): ...
97

108

119
class TaskCancelledError(OsparcErrorMixin, RuntimeError):
@@ -18,3 +16,12 @@ class ServiceRuntimeError(OsparcErrorMixin, RuntimeError):
1816
" running in container {container_id} failed with code"
1917
" {exit_code}. Last logs:\n{service_logs}"
2018
)
19+
20+
21+
class ServiceInputsUseFileToKeyMapButReceivesZipDataError(
22+
OsparcErrorMixin, RuntimeError
23+
):
24+
msg_template = (
25+
"The service {service_key}:{service_version} {input} uses a file-to-key {file_to_key_map} map but receives zip data instead. "
26+
"TIP: either pass a single file or zip file and remove the file-to-key map parameter."
27+
)

packages/models-library/src/models_library/api_schemas_api_server/functions.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,16 @@
55
FunctionClass,
66
FunctionClassSpecificData,
77
FunctionID,
8-
FunctionIDNotFoundError,
98
FunctionInputs,
109
FunctionInputSchema,
1110
FunctionInputsList,
12-
FunctionInputsValidationError,
1311
FunctionJob,
1412
FunctionJobClassSpecificData,
1513
FunctionJobCollection,
1614
FunctionJobCollectionID,
17-
FunctionJobCollectionIDNotFoundError,
1815
FunctionJobCollectionsListFilters,
1916
FunctionJobCollectionStatus,
2017
FunctionJobID,
21-
FunctionJobIDNotFoundError,
2218
FunctionJobStatus,
2319
FunctionOutputs,
2420
FunctionOutputSchema,
@@ -34,6 +30,12 @@
3430
RegisteredProjectFunctionJob,
3531
SolverFunction,
3632
SolverFunctionJob,
33+
)
34+
from ..functions_errors import (
35+
FunctionIDNotFoundError,
36+
FunctionInputsValidationError,
37+
FunctionJobCollectionIDNotFoundError,
38+
FunctionJobIDNotFoundError,
3739
UnsupportedFunctionClassError,
3840
UnsupportedFunctionFunctionJobClassCombinationError,
3941
)

packages/models-library/src/models_library/api_schemas_webserver/functions.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,17 @@
88
FunctionClass,
99
FunctionClassSpecificData,
1010
FunctionID,
11-
FunctionIDNotFoundError,
11+
FunctionIDString,
1212
FunctionInputs,
1313
FunctionInputSchema,
1414
FunctionInputsList,
15-
FunctionInputsValidationError,
1615
FunctionJob,
1716
FunctionJobClassSpecificData,
1817
FunctionJobCollection,
1918
FunctionJobCollectionID,
20-
FunctionJobCollectionIDNotFoundError,
2119
FunctionJobCollectionsListFilters,
2220
FunctionJobCollectionStatus,
2321
FunctionJobID,
24-
FunctionJobIDNotFoundError,
2522
FunctionJobStatus,
2623
FunctionOutputs,
2724
FunctionOutputSchema,
@@ -39,6 +36,13 @@
3936
RegisteredSolverFunction,
4037
SolverFunction,
4138
SolverFunctionJob,
39+
)
40+
from ..functions_errors import (
41+
FunctionIDNotFoundError,
42+
FunctionInputsValidationError,
43+
FunctionJobCollectionIDNotFoundError,
44+
FunctionJobIDNotFoundError,
45+
FunctionReadAccessDeniedError,
4246
UnsupportedFunctionClassError,
4347
UnsupportedFunctionFunctionJobClassCombinationError,
4448
)
@@ -54,6 +58,7 @@
5458
"FunctionID",
5559
"FunctionIDNotFoundError",
5660
"FunctionIDNotFoundError",
61+
"FunctionIDString",
5762
"FunctionInputSchema",
5863
"FunctionInputs",
5964
"FunctionInputs",
@@ -80,6 +85,7 @@
8085
"FunctionJobStatus",
8186
"FunctionOutputSchema",
8287
"FunctionOutputs",
88+
"FunctionReadAccessDeniedError",
8389
"FunctionSchemaClass",
8490
"FunctionToRegister",
8591
"FunctionToRegister",

packages/models-library/src/models_library/functions.py

Lines changed: 61 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
1+
import datetime
12
from collections.abc import Mapping
23
from enum import Enum
34
from typing import Annotated, Any, Literal, TypeAlias
45
from uuid import UUID
56

6-
from common_library.errors_classes import OsparcErrorMixin
77
from models_library import projects
88
from models_library.basic_regex import UUID_RE_BASE
99
from models_library.basic_types import ConstrainedStr
10+
from models_library.groups import GroupID
11+
from models_library.products import ProductName
1012
from models_library.services_types import ServiceKey, ServiceVersion
11-
from pydantic import BaseModel, Field
13+
from models_library.users import UserID
14+
from pydantic import BaseModel, ConfigDict, Field
1215

1316
from .projects import ProjectID
17+
from .utils.change_case import snake_to_camel
1418

1519
FunctionID: TypeAlias = UUID
1620
FunctionJobID: TypeAlias = UUID
@@ -72,7 +76,10 @@ class FunctionClass(str, Enum):
7276
# see here https://github.com/ITISFoundation/osparc-simcore/issues/7659
7377
FunctionInputs: TypeAlias = dict[str, Any] | None
7478

75-
FunctionInputsList: TypeAlias = list[FunctionInputs]
79+
FunctionInputsList: TypeAlias = Annotated[
80+
list[FunctionInputs],
81+
Field(max_length=50),
82+
]
7683

7784
FunctionOutputs: TypeAlias = dict[str, Any] | None
7885

@@ -90,6 +97,7 @@ class FunctionBase(BaseModel):
9097

9198
class RegisteredFunctionBase(FunctionBase):
9299
uid: FunctionID
100+
created_at: datetime.datetime
93101

94102

95103
class ProjectFunction(FunctionBase):
@@ -146,6 +154,7 @@ class FunctionJobBase(BaseModel):
146154

147155
class RegisteredFunctionJobBase(FunctionJobBase):
148156
uid: FunctionJobID
157+
created_at: datetime.datetime
149158

150159

151160
class ProjectFunctionJob(FunctionJobBase):
@@ -201,46 +210,13 @@ class FunctionJobCollection(BaseModel):
201210

202211
class RegisteredFunctionJobCollection(FunctionJobCollection):
203212
uid: FunctionJobCollectionID
213+
created_at: datetime.datetime
204214

205215

206216
class FunctionJobCollectionStatus(BaseModel):
207217
status: list[str]
208218

209219

210-
class FunctionBaseError(OsparcErrorMixin, Exception):
211-
pass
212-
213-
214-
class FunctionIDNotFoundError(FunctionBaseError):
215-
msg_template: str = "Function {function_id} not found"
216-
217-
218-
class FunctionJobIDNotFoundError(FunctionBaseError):
219-
msg_template: str = "Function job {function_job_id} not found"
220-
221-
222-
class FunctionJobCollectionIDNotFoundError(FunctionBaseError):
223-
msg_template: str = "Function job collection {function_job_collection_id} not found"
224-
225-
226-
class UnsupportedFunctionClassError(FunctionBaseError):
227-
msg_template: str = "Function class {function_class} is not supported"
228-
229-
230-
class UnsupportedFunctionJobClassError(FunctionBaseError):
231-
msg_template: str = "Function job class {function_job_class} is not supported"
232-
233-
234-
class UnsupportedFunctionFunctionJobClassCombinationError(FunctionBaseError):
235-
msg_template: str = (
236-
"Function class {function_class} and function job class {function_job_class} combination is not supported"
237-
)
238-
239-
240-
class FunctionInputsValidationError(FunctionBaseError):
241-
msg_template: str = "Function inputs validation failed: {error}"
242-
243-
244220
class FunctionJobDB(BaseModel):
245221
function_uuid: FunctionID
246222
title: str = ""
@@ -253,6 +229,7 @@ class FunctionJobDB(BaseModel):
253229

254230
class RegisteredFunctionJobDB(FunctionJobDB):
255231
uuid: FunctionJobID
232+
created: datetime.datetime
256233

257234

258235
class FunctionDB(BaseModel):
@@ -267,6 +244,7 @@ class FunctionDB(BaseModel):
267244

268245
class RegisteredFunctionDB(FunctionDB):
269246
uuid: FunctionID
247+
created: datetime.datetime
270248

271249

272250
class FunctionJobCollectionDB(BaseModel):
@@ -276,6 +254,7 @@ class FunctionJobCollectionDB(BaseModel):
276254

277255
class RegisteredFunctionJobCollectionDB(FunctionJobCollectionDB):
278256
uuid: FunctionJobCollectionID
257+
created: datetime.datetime
279258

280259

281260
class FunctionIDString(ConstrainedStr):
@@ -286,3 +265,48 @@ class FunctionJobCollectionsListFilters(BaseModel):
286265
"""Filters for listing function job collections"""
287266

288267
has_function_id: FunctionIDString | None = None
268+
269+
270+
class FunctionAccessRights(BaseModel):
271+
read: bool = False
272+
write: bool = False
273+
execute: bool = False
274+
275+
model_config = ConfigDict(
276+
alias_generator=snake_to_camel,
277+
populate_by_name=True,
278+
extra="forbid",
279+
)
280+
281+
282+
class FunctionUserAccessRights(FunctionAccessRights):
283+
user_id: UserID
284+
285+
286+
class FunctionGroupAccessRights(FunctionAccessRights):
287+
group_id: GroupID
288+
289+
290+
class FunctionAccessRightsDB(BaseModel):
291+
group_id: GroupID | None = None
292+
product_name: ProductName | None = None
293+
read: bool = False
294+
write: bool = False
295+
execute: bool = False
296+
297+
model_config = ConfigDict(
298+
alias_generator=snake_to_camel,
299+
populate_by_name=True,
300+
extra="forbid",
301+
)
302+
303+
304+
FunctionJobAccessRights: TypeAlias = FunctionAccessRights
305+
FunctionJobAccessRightsDB: TypeAlias = FunctionAccessRightsDB
306+
FunctionJobUserAccessRights: TypeAlias = FunctionUserAccessRights
307+
FunctionJobGroupAccessRights: TypeAlias = FunctionGroupAccessRights
308+
309+
FunctionJobCollectionAccessRights: TypeAlias = FunctionAccessRights
310+
FunctionJobCollectionAccessRightsDB: TypeAlias = FunctionAccessRightsDB
311+
FunctionJobCollectionUserAccessRights: TypeAlias = FunctionUserAccessRights
312+
FunctionJobCollectionGroupAccessRights: TypeAlias = FunctionGroupAccessRights

0 commit comments

Comments
 (0)