Skip to content

Commit 140776e

Browse files
authored
Merge branch 'master' into enh/ligth-theme
2 parents 4796df0 + 2af7f21 commit 140776e

File tree

94 files changed

+2447
-1022
lines changed

Some content is hidden

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

94 files changed

+2447
-1022
lines changed

.env-devel

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ AGENT_VOLUMES_CLEANUP_S3_SECRET_KEY=12345678
2121
API_SERVER_DEV_FEATURES_ENABLED=0
2222
API_SERVER_LOGLEVEL=INFO
2323
API_SERVER_PROFILING=1
24+
API_SERVER_TRACING={}
2425
TRAEFIK_API_SERVER_INFLIGHTREQ_AMOUNT=25
2526

2627
AUTOSCALING_DASK=null
@@ -33,6 +34,7 @@ AUTOSCALING_LOGLEVEL=INFO
3334
AUTOSCALING_NODES_MONITORING=null
3435
AUTOSCALING_POLL_INTERVAL=10
3536
AUTOSCALING_SSM_ACCESS=null
37+
AUTOSCALING_TRACING={}
3638

3739
AWS_S3_CLI_S3=null
3840

@@ -44,6 +46,7 @@ CATALOG_PORT=8000
4446
CATALOG_PROFILING=1
4547
CATALOG_SERVICES_DEFAULT_RESOURCES='{"CPU": {"limit": 0.1, "reservation": 0.1}, "RAM": {"limit": 2147483648, "reservation": 2147483648}}'
4648
CATALOG_SERVICES_DEFAULT_SPECIFICATIONS='{}'
49+
CATALOG_TRACING={}
4750

4851
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"}'
4952
CLUSTERS_KEEPER_COMPUTATIONAL_BACKEND_DOCKER_IMAGE_TAG=master-github-latest
@@ -57,6 +60,7 @@ CLUSTERS_KEEPER_MAX_MISSED_HEARTBEATS_BEFORE_CLUSTER_TERMINATION=5
5760
CLUSTERS_KEEPER_PRIMARY_EC2_INSTANCES=null
5861
CLUSTERS_KEEPER_TASK_INTERVAL=30
5962
CLUSTERS_KEEPER_WORKERS_EC2_INSTANCES=null
63+
CLUSTERS_KEEPER_TRACING={}
6064

6165
DASK_SCHEDULER_HOST=dask-scheduler
6266
DASK_SCHEDULER_PORT=8786
@@ -70,6 +74,7 @@ DIRECTOR_HOST=director
7074
DIRECTOR_PORT=8080
7175
DIRECTOR_REGISTRY_CACHING_TTL=900
7276
DIRECTOR_REGISTRY_CACHING=True
77+
DIRECTOR_TRACING={}
7378

7479
EFS_USER_ID=8006
7580
EFS_USER_NAME=efs
@@ -79,6 +84,10 @@ EFS_DNS_NAME=fs-xxx.efs.us-east-1.amazonaws.com
7984
EFS_MOUNTED_PATH=/tmp/efs
8085
EFS_PROJECT_SPECIFIC_DATA_DIRECTORY=project-specific-data
8186
EFS_ONLY_ENABLED_FOR_USERIDS=[]
87+
EFS_GUARDIAN_TRACING={}
88+
89+
# DATCORE_ADAPTER
90+
DATCORE_ADAPTER_TRACING={}
8291

8392
# DIRECTOR_V2 ----
8493
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 +114,13 @@ DYNAMIC_SIDECAR_LOG_LEVEL=DEBUG
105114
DYNAMIC_SIDECAR_PROMETHEUS_MONITORING_NETWORKS=[]
106115
DYNAMIC_SIDECAR_PROMETHEUS_SERVICE_LABELS={}
107116
DYNAMIC_SIDECAR_API_SAVE_RESTORE_STATE_TIMEOUT=3600
108-
# DIRECTOR_V2 ----
117+
DIRECTOR_V2_TRACING={}
118+
119+
# DYNAMIC_SCHEDULER ----
109120
DYNAMIC_SCHEDULER_LOGLEVEL=DEBUG
110121
DYNAMIC_SCHEDULER_PROFILING=1
111122
DYNAMIC_SCHEDULER_STOP_SERVICE_TIMEOUT=PT1H
123+
DYNAMIC_SCHEDULER_TRACING={}
112124

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

@@ -122,6 +134,7 @@ INVITATIONS_PORT=8000
122134
INVITATIONS_SECRET_KEY='REPLACE_ME_with_result__Fernet_generate_key='
123135
INVITATIONS_SWAGGER_API_DOC_ENABLED=1
124136
INVITATIONS_USERNAME=admin
137+
INVITATIONS_TRACING={}
125138

126139
LOG_FORMAT_LOCAL_DEV_ENABLED=1
127140
LOG_FILTER_MAPPING='{}'
@@ -146,6 +159,7 @@ PAYMENTS_STRIPE_API_SECRET='REPLACE_ME_with_api_secret'
146159
PAYMENTS_STRIPE_URL=https://api.stripe.com
147160
PAYMENTS_SWAGGER_API_DOC_ENABLED=1
148161
PAYMENTS_USERNAME=admin
162+
PAYMENTS_TRACING={}
149163

150164
POSTGRES_DB=simcoredb
151165
POSTGRES_ENDPOINT=postgres:5432
@@ -185,6 +199,7 @@ RESOURCE_USAGE_TRACKER_MISSED_HEARTBEAT_CHECK_ENABLED=1
185199
RESOURCE_USAGE_TRACKER_MISSED_HEARTBEAT_COUNTER_FAIL=6
186200
RESOURCE_USAGE_TRACKER_MISSED_HEARTBEAT_INTERVAL_SEC=300
187201
RESOURCE_USAGE_TRACKER_S3=null
202+
RESOURCE_USAGE_TRACKER_TRACING={}
188203

189204
# NOTE: 172.17.0.1 is the docker0 interface, which redirect from inside a container onto the host network interface.
190205
R_CLONE_OPTION_BUFFER_SIZE=0M
@@ -218,6 +233,7 @@ STORAGE_HOST=storage
218233
STORAGE_LOGLEVEL=INFO
219234
STORAGE_PORT=8080
220235
STORAGE_PROFILING=1
236+
STORAGE_TRACING={}
221237
# STORAGE ----
222238

223239
SWARM_STACK_NAME=master-simcore

api/specs/web-server/_folders.py

Lines changed: 5 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,10 @@ 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,
6062
):
6163
...
6264

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/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: 35 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.users import GroupID, UserID
5-
from models_library.workspaces import WorkspaceID
6-
from pydantic import BaseModel, Field, PositiveInt
5+
from pydantic import BaseModel, Field, PositiveInt, validator
6+
7+
from .users import GroupID, UserID
8+
from .utils.enums import StrAutoEnum
9+
from .workspaces import WorkspaceID
710

811
FolderID: TypeAlias = PositiveInt
912

1013

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

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ class Project(BaseProjectModel):
190190
default=None,
191191
alias="trashedAt",
192192
)
193+
trashed_explicitly: bool = Field(default=False, alias="trashedExplicitly")
193194

194195
class Config:
195196
description = "Document that stores metadata, pipeline and UI setup of a study"

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, Field, PositiveInt
5+
from pydantic import BaseModel, Field, PositiveInt, 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+
@validator("workspace_id", pre=True, always=True)
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
#
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
"""project and folder trash columns
2+
3+
Revision ID: 5ad02358751a
4+
Revises: fce5d231e16d
5+
Create Date: 2024-11-07 17:14:01.094583+00:00
6+
7+
"""
8+
import sqlalchemy as sa
9+
from alembic import op
10+
from sqlalchemy.dialects import postgresql
11+
12+
# revision identifiers, used by Alembic.
13+
revision = "5ad02358751a"
14+
down_revision = "fce5d231e16d"
15+
branch_labels = None
16+
depends_on = None
17+
18+
19+
def upgrade():
20+
# ### commands auto generated by Alembic - please adjust! ###
21+
op.add_column(
22+
"folders_v2",
23+
sa.Column(
24+
"trashed_at",
25+
sa.DateTime(timezone=True),
26+
nullable=True,
27+
comment="The date and time when the folder was marked as trashed.Null if the folder has not been trashed [default].",
28+
),
29+
)
30+
op.add_column(
31+
"folders_v2",
32+
sa.Column(
33+
"trashed_explicitly",
34+
sa.Boolean(),
35+
server_default=sa.text("false"),
36+
nullable=False,
37+
comment="Indicates whether the folder was explicitly trashed by the user (true) or inherited its trashed status from a parent (false) [default].",
38+
),
39+
)
40+
op.add_column(
41+
"projects",
42+
sa.Column(
43+
"trashed_explicitly",
44+
sa.Boolean(),
45+
server_default=sa.text("false"),
46+
nullable=False,
47+
comment="Indicates whether the project was explicitly trashed by the user (true) or inherited its trashed status from a parent (false) [default].",
48+
),
49+
)
50+
op.alter_column(
51+
"projects",
52+
"trashed_at",
53+
existing_type=postgresql.TIMESTAMP(timezone=True),
54+
comment="The date and time when the project was marked as trashed. Null if the project has not been trashed [default].",
55+
existing_nullable=True,
56+
)
57+
# ### end Alembic commands ###
58+
59+
60+
def downgrade():
61+
# ### commands auto generated by Alembic - please adjust! ###
62+
op.alter_column(
63+
"projects",
64+
"trashed_at",
65+
existing_type=postgresql.TIMESTAMP(timezone=True),
66+
comment=None,
67+
existing_comment="The date and time when the project was marked as trashed. Null if the project has not been trashed [default].",
68+
existing_nullable=True,
69+
)
70+
op.drop_column("projects", "trashed_explicitly")
71+
op.drop_column("folders_v2", "trashed_explicitly")
72+
op.drop_column("folders_v2", "trashed_at")
73+
# ### end Alembic commands ###

0 commit comments

Comments
 (0)