Skip to content

Commit db084cd

Browse files
committed
Merge remote-tracking branch 'upstream/master' into update-master-20
2 parents f335bca + cb74ff7 commit db084cd

File tree

240 files changed

+5492
-2466
lines changed

Some content is hidden

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

240 files changed

+5492
-2466
lines changed

.env-devel

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@ AGENT_VOLUMES_CLEANUP_S3_ENDPOINT=http://172.17.0.1:9001
1717
AGENT_VOLUMES_CLEANUP_S3_PROVIDER=MINIO
1818
AGENT_VOLUMES_CLEANUP_S3_REGION=us-east-1
1919
AGENT_VOLUMES_CLEANUP_S3_SECRET_KEY=12345678
20+
AGENT_TRACING={}
2021

2122
API_SERVER_DEV_FEATURES_ENABLED=0
2223
API_SERVER_LOGLEVEL=INFO
2324
API_SERVER_PROFILING=1
25+
API_SERVER_TRACING={}
2426
TRAEFIK_API_SERVER_INFLIGHTREQ_AMOUNT=25
2527

2628
AUTOSCALING_DASK=null
@@ -33,6 +35,7 @@ AUTOSCALING_LOGLEVEL=INFO
3335
AUTOSCALING_NODES_MONITORING=null
3436
AUTOSCALING_POLL_INTERVAL="00:00:10"
3537
AUTOSCALING_SSM_ACCESS=null
38+
AUTOSCALING_TRACING={}
3639

3740
AWS_S3_CLI_S3=null
3841

@@ -44,6 +47,7 @@ CATALOG_PORT=8000
4447
CATALOG_PROFILING=1
4548
CATALOG_SERVICES_DEFAULT_RESOURCES='{"CPU": {"limit": 0.1, "reservation": 0.1}, "RAM": {"limit": 2147483648, "reservation": 2147483648}}'
4649
CATALOG_SERVICES_DEFAULT_SPECIFICATIONS='{}'
50+
CATALOG_TRACING={}
4751

4852
CLUSTERS_KEEPER_COMPUTATIONAL_BACKEND_DEFAULT_CLUSTER_AUTH='{"type":"tls","tls_ca_file":"/home/scu/.dask/dask-crt.pem","tls_client_cert":"/home/scu/.dask/dask-crt.pem","tls_client_key":"/home/scu/.dask/dask-key.pem"}'
4953
CLUSTERS_KEEPER_COMPUTATIONAL_BACKEND_DOCKER_IMAGE_TAG=master-github-latest
@@ -57,6 +61,7 @@ CLUSTERS_KEEPER_MAX_MISSED_HEARTBEATS_BEFORE_CLUSTER_TERMINATION=5
5761
CLUSTERS_KEEPER_PRIMARY_EC2_INSTANCES=null
5862
CLUSTERS_KEEPER_TASK_INTERVAL=30
5963
CLUSTERS_KEEPER_WORKERS_EC2_INSTANCES=null
64+
CLUSTERS_KEEPER_TRACING={}
6065

6166
DASK_SCHEDULER_HOST=dask-scheduler
6267
DASK_SCHEDULER_PORT=8786
@@ -70,6 +75,7 @@ DIRECTOR_HOST=director
7075
DIRECTOR_PORT=8080
7176
DIRECTOR_REGISTRY_CACHING_TTL=900
7277
DIRECTOR_REGISTRY_CACHING=True
78+
DIRECTOR_TRACING={}
7379

7480
EFS_USER_ID=8006
7581
EFS_USER_NAME=efs
@@ -79,6 +85,10 @@ EFS_DNS_NAME=fs-xxx.efs.us-east-1.amazonaws.com
7985
EFS_MOUNTED_PATH=/tmp/efs
8086
EFS_PROJECT_SPECIFIC_DATA_DIRECTORY=project-specific-data
8187
EFS_ONLY_ENABLED_FOR_USERIDS=[]
88+
EFS_GUARDIAN_TRACING={}
89+
90+
# DATCORE_ADAPTER
91+
DATCORE_ADAPTER_TRACING={}
8292

8393
# DIRECTOR_V2 ----
8494
COMPUTATIONAL_BACKEND_DEFAULT_CLUSTER_AUTH='{"type":"tls","tls_ca_file":"/home/scu/.dask/dask-crt.pem","tls_client_cert":"/home/scu/.dask/dask-crt.pem","tls_client_key":"/home/scu/.dask/dask-key.pem"}'
@@ -105,10 +115,13 @@ DYNAMIC_SIDECAR_LOG_LEVEL=DEBUG
105115
DYNAMIC_SIDECAR_PROMETHEUS_MONITORING_NETWORKS=[]
106116
DYNAMIC_SIDECAR_PROMETHEUS_SERVICE_LABELS={}
107117
DYNAMIC_SIDECAR_API_SAVE_RESTORE_STATE_TIMEOUT=01:00:00
108-
# DIRECTOR_V2 ----
118+
DIRECTOR_V2_TRACING={}
119+
120+
# DYNAMIC_SCHEDULER ----
109121
DYNAMIC_SCHEDULER_LOGLEVEL=DEBUG
110122
DYNAMIC_SCHEDULER_PROFILING=1
111123
DYNAMIC_SCHEDULER_STOP_SERVICE_TIMEOUT=01:00:00
124+
DYNAMIC_SCHEDULER_TRACING={}
112125

113126
FUNCTION_SERVICES_AUTHORS='{"UN": {"name": "Unknown", "email": "[email protected]", "affiliation": "unknown"}}'
114127

@@ -122,6 +135,7 @@ INVITATIONS_PORT=8000
122135
INVITATIONS_SECRET_KEY='REPLACE_ME_with_result__Fernet_generate_key='
123136
INVITATIONS_SWAGGER_API_DOC_ENABLED=1
124137
INVITATIONS_USERNAME=admin
138+
INVITATIONS_TRACING={}
125139

126140
LOG_FORMAT_LOCAL_DEV_ENABLED=1
127141
LOG_FILTER_MAPPING='{}'
@@ -146,6 +160,7 @@ PAYMENTS_STRIPE_API_SECRET='REPLACE_ME_with_api_secret'
146160
PAYMENTS_STRIPE_URL=https://api.stripe.com
147161
PAYMENTS_SWAGGER_API_DOC_ENABLED=1
148162
PAYMENTS_USERNAME=admin
163+
PAYMENTS_TRACING={}
149164

150165
POSTGRES_DB=simcoredb
151166
POSTGRES_ENDPOINT=postgres:5432
@@ -185,6 +200,7 @@ RESOURCE_USAGE_TRACKER_MISSED_HEARTBEAT_CHECK_ENABLED=1
185200
RESOURCE_USAGE_TRACKER_MISSED_HEARTBEAT_COUNTER_FAIL=6
186201
RESOURCE_USAGE_TRACKER_MISSED_HEARTBEAT_INTERVAL_SEC=300
187202
RESOURCE_USAGE_TRACKER_S3=null
203+
RESOURCE_USAGE_TRACKER_TRACING={}
188204

189205
# NOTE: 172.17.0.1 is the docker0 interface, which redirect from inside a container onto the host network interface.
190206
R_CLONE_OPTION_BUFFER_SIZE=0M
@@ -218,6 +234,7 @@ STORAGE_HOST=storage
218234
STORAGE_LOGLEVEL=INFO
219235
STORAGE_PORT=8080
220236
STORAGE_PROFILING=1
237+
STORAGE_TRACING={}
221238
# STORAGE ----
222239

223240
SWARM_STACK_NAME=master-simcore

api/specs/web-server/_folders.py

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
from models_library.workspaces import WorkspaceID
2222
from pydantic import Json
2323
from simcore_service_webserver._meta import API_VTAG
24-
from simcore_service_webserver.folders._folders_handlers import FoldersPathParams
24+
from simcore_service_webserver.folders._models import FolderFilters, FoldersPathParams
2525

2626
router = APIRouter(
2727
prefix=f"/{API_VTAG}",
@@ -30,8 +30,6 @@
3030
],
3131
)
3232

33-
### Folders
34-
3533

3634
@router.post(
3735
"/folders",
@@ -57,6 +55,32 @@ async def list_folders(
5755
example='{"field": "name", "direction": "desc"}',
5856
),
5957
] = '{"field": "modified_at", "direction": "desc"}',
58+
filters: Annotated[
59+
Json | None,
60+
Query(description=FolderFilters.schema_json(indent=1)),
61+
] = None,
62+
):
63+
...
64+
65+
66+
@router.get(
67+
"/folders:search",
68+
response_model=Envelope[list[FolderGet]],
69+
)
70+
async def list_folders_full_search(
71+
params: Annotated[PageQueryParameters, Depends()],
72+
text: str | None = None,
73+
order_by: Annotated[
74+
Json,
75+
Query(
76+
description="Order by field (modified_at|name|description) and direction (asc|desc). The default sorting order is ascending.",
77+
example='{"field": "name", "direction": "desc"}',
78+
),
79+
] = '{"field": "modified_at", "direction": "desc"}',
80+
filters: Annotated[
81+
Json | None,
82+
Query(description=FolderFilters.schema_json(indent=1)),
83+
] = None,
6084
):
6185
...
6286

api/specs/web-server/_projects_crud.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
from simcore_service_webserver.projects._common_models import ProjectPathParams
3333
from simcore_service_webserver.projects._crud_handlers import ProjectCreateParams
3434
from simcore_service_webserver.projects._crud_handlers_models import (
35+
ProjectFilters,
3536
ProjectListFullSearchParams,
3637
ProjectListParams,
3738
)
@@ -83,7 +84,10 @@ async def list_projects(
8384
example='{"field": "last_change_date", "direction": "desc"}',
8485
),
8586
] = '{"field": "last_change_date", "direction": "desc"}',
86-
filters: Annotated[Json | None, Query()] = None,
87+
filters: Annotated[
88+
Json | None,
89+
Query(description=ProjectFilters.schema_json(indent=1)),
90+
] = None,
8791
):
8892
...
8993

api/specs/web-server/_trash.py

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,14 @@
99

1010
from fastapi import APIRouter, Depends, status
1111
from simcore_service_webserver._meta import API_VTAG
12-
from simcore_service_webserver.projects._trash_handlers import (
13-
ProjectPathParams,
12+
from simcore_service_webserver.folders._models import (
13+
FoldersPathParams,
1414
RemoveQueryParams,
1515
)
16+
from simcore_service_webserver.projects._trash_handlers import ProjectPathParams
17+
from simcore_service_webserver.projects._trash_handlers import (
18+
RemoveQueryParams as RemoveQueryParams_duplicated,
19+
)
1620

1721
router = APIRouter(
1822
prefix=f"/{API_VTAG}",
@@ -59,3 +63,36 @@ def untrash_project(
5963
_p: Annotated[ProjectPathParams, Depends()],
6064
):
6165
...
66+
67+
68+
_extra_tags = ["folders"]
69+
70+
71+
@router.post(
72+
"/folders/{folder_id}:trash",
73+
tags=_extra_tags,
74+
status_code=status.HTTP_204_NO_CONTENT,
75+
responses={
76+
status.HTTP_404_NOT_FOUND: {"description": "Not such a folder"},
77+
status.HTTP_409_CONFLICT: {
78+
"description": "One or more projects is in use and cannot be trashed"
79+
},
80+
status.HTTP_503_SERVICE_UNAVAILABLE: {"description": "Trash service error"},
81+
},
82+
)
83+
def trash_folder(
84+
_p: Annotated[FoldersPathParams, Depends()],
85+
_q: Annotated[RemoveQueryParams_duplicated, Depends()],
86+
):
87+
...
88+
89+
90+
@router.post(
91+
"/folders/{folder_id}:untrash",
92+
tags=_extra_tags,
93+
status_code=status.HTTP_204_NO_CONTENT,
94+
)
95+
def untrash_folder(
96+
_p: Annotated[FoldersPathParams, Depends()],
97+
):
98+
...

packages/aws-library/requirements/_base.txt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,6 @@ arrow==1.3.0
5252
# -r requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/_base.in
5353
# -r requirements/../../../packages/service-library/requirements/_base.in
5454
# -r requirements/_base.in
55-
async-timeout==4.0.3
56-
# via redis
5755
attrs==24.2.0
5856
# via
5957
# aiohttp

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ class FolderGet(OutputSchema):
1818
description: str
1919
created_at: datetime
2020
modified_at: datetime
21+
trashed_at: datetime | None
2122
owner: GroupID
2223
my_access_rights: AccessRights
2324
access_rights: dict[GroupID, AccessRights]

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ class FolderGet(OutputSchema):
1818
name: str
1919
created_at: datetime
2020
modified_at: datetime
21+
trashed_at: datetime | None
2122
owner: GroupID
2223
workspace_id: WorkspaceID | None
2324
my_access_rights: AccessRights

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

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,42 @@
11
from datetime import datetime
2+
from enum import auto
23
from typing import TypeAlias
34

4-
from pydantic import BaseModel, ConfigDict, Field, PositiveInt
5+
from pydantic import BaseModel, ConfigDict, Field, PositiveInt, field_validator
56

7+
from .access_rights import AccessRights
68
from .users import GroupID, UserID
9+
from .utils.enums import StrAutoEnum
710
from .workspaces import WorkspaceID
811

912
FolderID: TypeAlias = PositiveInt
1013

1114

15+
class FolderScope(StrAutoEnum):
16+
ROOT = auto()
17+
SPECIFIC = auto()
18+
ALL = auto()
19+
20+
21+
class FolderQuery(BaseModel):
22+
folder_scope: FolderScope
23+
folder_id: PositiveInt | None = None
24+
25+
@field_validator("folder_id", mode="before")
26+
@classmethod
27+
def validate_folder_id(cls, value, values):
28+
scope = values.get("folder_scope")
29+
if scope == FolderScope.SPECIFIC and value is None:
30+
raise ValueError(
31+
"folder_id must be provided when folder_scope is SPECIFIC."
32+
)
33+
if scope != FolderScope.SPECIFIC and value is not None:
34+
raise ValueError(
35+
"folder_id should be None when folder_scope is not SPECIFIC."
36+
)
37+
return value
38+
39+
1240
#
1341
# DB
1442
#
@@ -30,7 +58,17 @@ class FolderDB(BaseModel):
3058
...,
3159
description="Timestamp of last modification",
3260
)
61+
trashed_at: datetime | None = Field(
62+
...,
63+
)
64+
3365
user_id: UserID | None
3466
workspace_id: WorkspaceID | None
3567

3668
model_config = ConfigDict(from_attributes=True)
69+
70+
71+
class UserFolderAccessRightsDB(FolderDB):
72+
my_access_rights: AccessRights
73+
74+
model_config = ConfigDict(from_attributes=True)

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,5 +182,6 @@ class Project(BaseProjectModel):
182182
default=None,
183183
alias="trashedAt",
184184
)
185+
trashed_explicitly: bool = Field(default=False, alias="trashedExplicitly")
185186

186187
model_config = ConfigDict(title="osparc-simcore project", extra="forbid")

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

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,41 @@
11
from datetime import datetime
2+
from enum import auto
23
from typing import TypeAlias
34

4-
from models_library.access_rights import AccessRights
5-
from models_library.users import GroupID
6-
from pydantic import BaseModel, ConfigDict, Field, PositiveInt
5+
from pydantic import BaseModel, ConfigDict, Field, PositiveInt, field_validator
6+
7+
from .access_rights import AccessRights
8+
from .users import GroupID
9+
from .utils.enums import StrAutoEnum
710

811
WorkspaceID: TypeAlias = PositiveInt
912

1013

14+
class WorkspaceScope(StrAutoEnum):
15+
PRIVATE = auto()
16+
SHARED = auto()
17+
ALL = auto()
18+
19+
20+
class WorkspaceQuery(BaseModel):
21+
workspace_scope: WorkspaceScope
22+
workspace_id: PositiveInt | None = None
23+
24+
@field_validator("workspace_id", mode="before")
25+
@classmethod
26+
def validate_workspace_id(cls, value, values):
27+
scope = values.get("workspace_scope")
28+
if scope == WorkspaceScope.SHARED and value is None:
29+
raise ValueError(
30+
"workspace_id must be provided when workspace_scope is SHARED."
31+
)
32+
if scope != WorkspaceScope.SHARED and value is not None:
33+
raise ValueError(
34+
"workspace_id should be None when workspace_scope is not SHARED."
35+
)
36+
return value
37+
38+
1139
#
1240
# DB
1341
#

0 commit comments

Comments
 (0)