fractal-server 2.18.0__py3-none-any.whl → 2.18.0a1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- fractal_server/__init__.py +1 -1
- fractal_server/__main__.py +1 -2
- fractal_server/app/models/security.py +5 -7
- fractal_server/app/models/v2/job.py +2 -13
- fractal_server/app/models/v2/resource.py +0 -13
- fractal_server/app/routes/admin/v2/__init__.py +12 -10
- fractal_server/app/routes/admin/v2/job.py +15 -15
- fractal_server/app/routes/admin/v2/task.py +7 -7
- fractal_server/app/routes/admin/v2/task_group.py +12 -14
- fractal_server/app/routes/admin/v2/task_group_lifecycle.py +20 -20
- fractal_server/app/routes/api/__init__.py +9 -0
- fractal_server/app/routes/api/v2/__init__.py +49 -47
- fractal_server/app/routes/api/v2/_aux_functions.py +47 -22
- fractal_server/app/routes/api/v2/_aux_functions_task_lifecycle.py +4 -4
- fractal_server/app/routes/api/v2/_aux_functions_tasks.py +2 -2
- fractal_server/app/routes/api/v2/dataset.py +60 -66
- fractal_server/app/routes/api/v2/history.py +5 -7
- fractal_server/app/routes/api/v2/job.py +12 -12
- fractal_server/app/routes/api/v2/project.py +11 -11
- fractal_server/app/routes/api/v2/status_legacy.py +29 -15
- fractal_server/app/routes/api/v2/submit.py +66 -65
- fractal_server/app/routes/api/v2/task.py +17 -15
- fractal_server/app/routes/api/v2/task_collection.py +18 -18
- fractal_server/app/routes/api/v2/task_collection_custom.py +13 -11
- fractal_server/app/routes/api/v2/task_collection_pixi.py +9 -9
- fractal_server/app/routes/api/v2/task_group.py +18 -18
- fractal_server/app/routes/api/v2/task_group_lifecycle.py +26 -26
- fractal_server/app/routes/api/v2/task_version_update.py +5 -5
- fractal_server/app/routes/api/v2/workflow.py +18 -18
- fractal_server/app/routes/api/v2/workflow_import.py +11 -11
- fractal_server/app/routes/api/v2/workflowtask.py +37 -10
- fractal_server/app/routes/auth/_aux_auth.py +0 -100
- fractal_server/app/routes/auth/current_user.py +63 -0
- fractal_server/app/routes/auth/group.py +30 -1
- fractal_server/app/routes/auth/router.py +0 -2
- fractal_server/app/routes/auth/users.py +0 -9
- fractal_server/app/schemas/user.py +12 -29
- fractal_server/app/schemas/user_group.py +15 -0
- fractal_server/app/schemas/v2/__init__.py +48 -48
- fractal_server/app/schemas/v2/dataset.py +13 -35
- fractal_server/app/schemas/v2/dumps.py +9 -9
- fractal_server/app/schemas/v2/job.py +11 -11
- fractal_server/app/schemas/v2/project.py +3 -3
- fractal_server/app/schemas/v2/resource.py +4 -13
- fractal_server/app/schemas/v2/status_legacy.py +3 -3
- fractal_server/app/schemas/v2/task.py +6 -6
- fractal_server/app/schemas/v2/task_collection.py +4 -4
- fractal_server/app/schemas/v2/task_group.py +16 -16
- fractal_server/app/schemas/v2/workflow.py +16 -16
- fractal_server/app/schemas/v2/workflowtask.py +14 -14
- fractal_server/app/security/__init__.py +1 -1
- fractal_server/app/shutdown.py +6 -6
- fractal_server/config/__init__.py +6 -0
- fractal_server/config/_data.py +79 -0
- fractal_server/config/_main.py +1 -6
- fractal_server/images/models.py +2 -1
- fractal_server/main.py +11 -72
- fractal_server/runner/config/_slurm.py +0 -2
- fractal_server/runner/executors/slurm_common/slurm_config.py +0 -1
- fractal_server/runner/v2/_local.py +3 -4
- fractal_server/runner/v2/_slurm_ssh.py +3 -4
- fractal_server/runner/v2/_slurm_sudo.py +3 -4
- fractal_server/runner/v2/runner.py +17 -36
- fractal_server/runner/v2/runner_functions.py +14 -11
- fractal_server/runner/v2/submit_workflow.py +9 -22
- fractal_server/tasks/v2/local/_utils.py +2 -2
- fractal_server/tasks/v2/local/collect.py +6 -5
- fractal_server/tasks/v2/local/collect_pixi.py +6 -5
- fractal_server/tasks/v2/local/deactivate.py +7 -7
- fractal_server/tasks/v2/local/deactivate_pixi.py +3 -3
- fractal_server/tasks/v2/local/delete.py +5 -5
- fractal_server/tasks/v2/local/reactivate.py +5 -5
- fractal_server/tasks/v2/local/reactivate_pixi.py +5 -5
- fractal_server/tasks/v2/ssh/collect.py +5 -5
- fractal_server/tasks/v2/ssh/collect_pixi.py +5 -5
- fractal_server/tasks/v2/ssh/deactivate.py +7 -7
- fractal_server/tasks/v2/ssh/deactivate_pixi.py +2 -2
- fractal_server/tasks/v2/ssh/delete.py +5 -5
- fractal_server/tasks/v2/ssh/reactivate.py +5 -5
- fractal_server/tasks/v2/ssh/reactivate_pixi.py +5 -5
- fractal_server/tasks/v2/utils_background.py +7 -7
- fractal_server/tasks/v2/utils_database.py +5 -5
- fractal_server/types/__init__.py +0 -22
- fractal_server/types/validators/__init__.py +0 -3
- fractal_server/types/validators/_common_validators.py +0 -32
- {fractal_server-2.18.0.dist-info → fractal_server-2.18.0a1.dist-info}/METADATA +1 -1
- {fractal_server-2.18.0.dist-info → fractal_server-2.18.0a1.dist-info}/RECORD +90 -95
- fractal_server/app/routes/auth/viewer_paths.py +0 -43
- fractal_server/data_migrations/2_18_0.py +0 -30
- fractal_server/migrations/versions/7910eed4cf97_user_project_dirs_and_usergroup_viewer_.py +0 -60
- fractal_server/migrations/versions/88270f589c9b_add_prevent_new_submissions.py +0 -39
- fractal_server/migrations/versions/f0702066b007_one_submitted_job_per_dataset.py +0 -40
- {fractal_server-2.18.0.dist-info → fractal_server-2.18.0a1.dist-info}/WHEEL +0 -0
- {fractal_server-2.18.0.dist-info → fractal_server-2.18.0a1.dist-info}/entry_points.txt +0 -0
- {fractal_server-2.18.0.dist-info → fractal_server-2.18.0a1.dist-info}/licenses/LICENSE +0 -0
|
@@ -13,17 +13,17 @@ from pydantic import ConfigDict
|
|
|
13
13
|
from pydantic import Field
|
|
14
14
|
|
|
15
15
|
from .task import TaskType
|
|
16
|
-
from .task_group import
|
|
16
|
+
from .task_group import TaskGroupV2OriginEnum
|
|
17
17
|
|
|
18
18
|
|
|
19
|
-
class
|
|
19
|
+
class ProjectDumpV2(BaseModel):
|
|
20
20
|
model_config = ConfigDict(extra="forbid")
|
|
21
21
|
id: int
|
|
22
22
|
name: str
|
|
23
23
|
timestamp_created: str
|
|
24
24
|
|
|
25
25
|
|
|
26
|
-
class
|
|
26
|
+
class TaskDumpV2(BaseModel):
|
|
27
27
|
id: int
|
|
28
28
|
name: str
|
|
29
29
|
type: TaskType
|
|
@@ -37,7 +37,7 @@ class TaskDump(BaseModel):
|
|
|
37
37
|
output_types: dict[str, bool]
|
|
38
38
|
|
|
39
39
|
|
|
40
|
-
class
|
|
40
|
+
class WorkflowTaskDumpV2(BaseModel):
|
|
41
41
|
"""
|
|
42
42
|
We do not include 'model_config = ConfigDict(extra="forbid")'
|
|
43
43
|
because legacy data may include 'input_filters' field and we want to avoid
|
|
@@ -51,10 +51,10 @@ class WorkflowTaskDump(BaseModel):
|
|
|
51
51
|
type_filters: dict[str, bool]
|
|
52
52
|
|
|
53
53
|
task_id: int | None = None
|
|
54
|
-
task:
|
|
54
|
+
task: TaskDumpV2 | None = None
|
|
55
55
|
|
|
56
56
|
|
|
57
|
-
class
|
|
57
|
+
class WorkflowDumpV2(BaseModel):
|
|
58
58
|
model_config = ConfigDict(extra="forbid")
|
|
59
59
|
id: int
|
|
60
60
|
name: str
|
|
@@ -62,7 +62,7 @@ class WorkflowDump(BaseModel):
|
|
|
62
62
|
timestamp_created: str
|
|
63
63
|
|
|
64
64
|
|
|
65
|
-
class
|
|
65
|
+
class DatasetDumpV2(BaseModel):
|
|
66
66
|
"""
|
|
67
67
|
We do not include 'model_config = ConfigDict(extra="forbid")' because
|
|
68
68
|
legacy data may include 'type_filters' or 'attribute_filters' and we
|
|
@@ -76,9 +76,9 @@ class DatasetDump(BaseModel):
|
|
|
76
76
|
zarr_dir: str
|
|
77
77
|
|
|
78
78
|
|
|
79
|
-
class
|
|
79
|
+
class TaskGroupDumpV2(BaseModel):
|
|
80
80
|
id: int
|
|
81
|
-
origin:
|
|
81
|
+
origin: TaskGroupV2OriginEnum
|
|
82
82
|
pkg_name: str
|
|
83
83
|
version: str | None = None
|
|
84
84
|
python_version: str | None = None
|
|
@@ -10,15 +10,15 @@ from pydantic.types import AwareDatetime
|
|
|
10
10
|
from pydantic.types import NonNegativeInt
|
|
11
11
|
from pydantic.types import StrictStr
|
|
12
12
|
|
|
13
|
-
from fractal_server.app.schemas.v2.dumps import
|
|
14
|
-
from fractal_server.app.schemas.v2.dumps import
|
|
15
|
-
from fractal_server.app.schemas.v2.dumps import
|
|
13
|
+
from fractal_server.app.schemas.v2.dumps import DatasetDumpV2
|
|
14
|
+
from fractal_server.app.schemas.v2.dumps import ProjectDumpV2
|
|
15
|
+
from fractal_server.app.schemas.v2.dumps import WorkflowDumpV2
|
|
16
16
|
from fractal_server.types import AttributeFilters
|
|
17
17
|
from fractal_server.types import NonEmptyStr
|
|
18
18
|
from fractal_server.types import TypeFilters
|
|
19
19
|
|
|
20
20
|
|
|
21
|
-
class
|
|
21
|
+
class JobStatusTypeV2(StrEnum):
|
|
22
22
|
"""
|
|
23
23
|
Define the available job statuses
|
|
24
24
|
|
|
@@ -39,7 +39,7 @@ class JobStatusType(StrEnum):
|
|
|
39
39
|
FAILED = "failed"
|
|
40
40
|
|
|
41
41
|
|
|
42
|
-
class
|
|
42
|
+
class JobCreateV2(BaseModel):
|
|
43
43
|
model_config = ConfigDict(extra="forbid")
|
|
44
44
|
|
|
45
45
|
first_task_index: NonNegativeInt | None = None
|
|
@@ -65,16 +65,16 @@ class JobCreate(BaseModel):
|
|
|
65
65
|
return values
|
|
66
66
|
|
|
67
67
|
|
|
68
|
-
class
|
|
68
|
+
class JobReadV2(BaseModel):
|
|
69
69
|
id: int
|
|
70
70
|
project_id: int | None = None
|
|
71
|
-
project_dump:
|
|
71
|
+
project_dump: ProjectDumpV2
|
|
72
72
|
user_email: str
|
|
73
73
|
slurm_account: str | None = None
|
|
74
74
|
workflow_id: int | None = None
|
|
75
|
-
workflow_dump:
|
|
75
|
+
workflow_dump: WorkflowDumpV2
|
|
76
76
|
dataset_id: int | None = None
|
|
77
|
-
dataset_dump:
|
|
77
|
+
dataset_dump: DatasetDumpV2
|
|
78
78
|
start_timestamp: AwareDatetime
|
|
79
79
|
end_timestamp: AwareDatetime | None = None
|
|
80
80
|
status: str
|
|
@@ -100,7 +100,7 @@ class JobRead(BaseModel):
|
|
|
100
100
|
return v.isoformat()
|
|
101
101
|
|
|
102
102
|
|
|
103
|
-
class
|
|
103
|
+
class JobUpdateV2(BaseModel):
|
|
104
104
|
model_config = ConfigDict(extra="forbid")
|
|
105
105
|
|
|
106
|
-
status:
|
|
106
|
+
status: JobStatusTypeV2
|
|
@@ -8,13 +8,13 @@ from pydantic.types import AwareDatetime
|
|
|
8
8
|
from fractal_server.types import NonEmptyStr
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
class
|
|
11
|
+
class ProjectCreateV2(BaseModel):
|
|
12
12
|
model_config = ConfigDict(extra="forbid")
|
|
13
13
|
|
|
14
14
|
name: NonEmptyStr
|
|
15
15
|
|
|
16
16
|
|
|
17
|
-
class
|
|
17
|
+
class ProjectReadV2(BaseModel):
|
|
18
18
|
id: int
|
|
19
19
|
name: str
|
|
20
20
|
timestamp_created: AwareDatetime
|
|
@@ -24,7 +24,7 @@ class ProjectRead(BaseModel):
|
|
|
24
24
|
return v.isoformat()
|
|
25
25
|
|
|
26
26
|
|
|
27
|
-
class
|
|
27
|
+
class ProjectUpdateV2(BaseModel):
|
|
28
28
|
model_config = ConfigDict(extra="forbid")
|
|
29
29
|
|
|
30
30
|
name: NonEmptyStr = None
|
|
@@ -77,8 +77,6 @@ class ValidResourceBase(BaseModel):
|
|
|
77
77
|
jobs_runner_config: dict[NonEmptyStr, Any]
|
|
78
78
|
jobs_poll_interval: int = 5
|
|
79
79
|
|
|
80
|
-
prevent_new_submissions: bool = False
|
|
81
|
-
|
|
82
80
|
@model_validator(mode="after")
|
|
83
81
|
def _pixi_slurm_config(self) -> Self:
|
|
84
82
|
if (
|
|
@@ -97,9 +95,6 @@ class ValidResourceLocal(ValidResourceBase):
|
|
|
97
95
|
Attributes:
|
|
98
96
|
name: Resource name.
|
|
99
97
|
type: Resource type.
|
|
100
|
-
prevent_new_submissions:
|
|
101
|
-
When set to true: Prevent new job submissions and stop execution of
|
|
102
|
-
ongoing jobs as soon as the current task is complete.
|
|
103
98
|
tasks_python_config:
|
|
104
99
|
Configuration of Python interpreters used for task collection.
|
|
105
100
|
tasks_pixi_config:
|
|
@@ -110,6 +105,7 @@ class ValidResourceLocal(ValidResourceBase):
|
|
|
110
105
|
Local base folder for job folders.
|
|
111
106
|
jobs_runner_config:
|
|
112
107
|
Runner configuration.
|
|
108
|
+
|
|
113
109
|
"""
|
|
114
110
|
|
|
115
111
|
type: Literal[ResourceType.LOCAL]
|
|
@@ -125,9 +121,6 @@ class ValidResourceSlurmSudo(ValidResourceBase):
|
|
|
125
121
|
Attributes:
|
|
126
122
|
name: Resource name.
|
|
127
123
|
type: Resource type.
|
|
128
|
-
prevent_new_submissions:
|
|
129
|
-
When set to true: Prevent new job submissions and stop execution of
|
|
130
|
-
ongoing jobs as soon as the current task is complete.
|
|
131
124
|
tasks_python_config:
|
|
132
125
|
Configuration of Python interpreters used for task collection.
|
|
133
126
|
tasks_pixi_config:
|
|
@@ -157,9 +150,6 @@ class ValidResourceSlurmSSH(ValidResourceBase):
|
|
|
157
150
|
Attributes:
|
|
158
151
|
name: Resource name
|
|
159
152
|
type: Resource type.
|
|
160
|
-
prevent_new_submissions:
|
|
161
|
-
When set to true: Prevent new job submissions and stop execution of
|
|
162
|
-
ongoing jobs as soon as the current task is complete.
|
|
163
153
|
tasks_python_config:
|
|
164
154
|
Configuration of Python interpreters used for task collection.
|
|
165
155
|
tasks_pixi_config:
|
|
@@ -208,9 +198,10 @@ class ResourceRead(BaseModel):
|
|
|
208
198
|
"""
|
|
209
199
|
|
|
210
200
|
id: int
|
|
211
|
-
|
|
201
|
+
|
|
212
202
|
type: str
|
|
213
|
-
|
|
203
|
+
|
|
204
|
+
name: str
|
|
214
205
|
timestamp_created: AwareDatetime
|
|
215
206
|
|
|
216
207
|
host: str | None
|
|
@@ -4,7 +4,7 @@ from pydantic import BaseModel
|
|
|
4
4
|
from pydantic import Field
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
class
|
|
7
|
+
class WorkflowTaskStatusTypeV2(StrEnum):
|
|
8
8
|
"""
|
|
9
9
|
Define the available values for the status of a `WorkflowTask`.
|
|
10
10
|
|
|
@@ -23,7 +23,7 @@ class WorkflowTaskStatusType(StrEnum):
|
|
|
23
23
|
FAILED = "failed"
|
|
24
24
|
|
|
25
25
|
|
|
26
|
-
class
|
|
26
|
+
class LegacyStatusReadV2(BaseModel):
|
|
27
27
|
"""
|
|
28
28
|
Response type for the
|
|
29
29
|
`/project/{project_id}/status/` endpoint
|
|
@@ -31,5 +31,5 @@ class LegacyStatusRead(BaseModel):
|
|
|
31
31
|
|
|
32
32
|
status: dict[
|
|
33
33
|
str,
|
|
34
|
-
|
|
34
|
+
WorkflowTaskStatusTypeV2,
|
|
35
35
|
] = Field(default_factory=dict)
|
|
@@ -29,7 +29,7 @@ class TaskType(StrEnum):
|
|
|
29
29
|
PARALLEL = "parallel"
|
|
30
30
|
|
|
31
31
|
|
|
32
|
-
class
|
|
32
|
+
class TaskCreateV2(BaseModel):
|
|
33
33
|
model_config = ConfigDict(extra="forbid")
|
|
34
34
|
|
|
35
35
|
name: NonEmptyStr
|
|
@@ -90,7 +90,7 @@ class TaskCreate(BaseModel):
|
|
|
90
90
|
return self
|
|
91
91
|
|
|
92
92
|
|
|
93
|
-
class
|
|
93
|
+
class TaskReadV2(BaseModel):
|
|
94
94
|
id: int
|
|
95
95
|
name: str
|
|
96
96
|
type: TaskType
|
|
@@ -117,7 +117,7 @@ class TaskRead(BaseModel):
|
|
|
117
117
|
tags: list[str]
|
|
118
118
|
|
|
119
119
|
|
|
120
|
-
class
|
|
120
|
+
class TaskUpdateV2(BaseModel):
|
|
121
121
|
model_config = ConfigDict(extra="forbid")
|
|
122
122
|
|
|
123
123
|
command_parallel: NonEmptyStr = None
|
|
@@ -131,7 +131,7 @@ class TaskUpdate(BaseModel):
|
|
|
131
131
|
tags: ListUniqueNonEmptyString | None = None
|
|
132
132
|
|
|
133
133
|
|
|
134
|
-
class
|
|
134
|
+
class TaskImportV2(BaseModel):
|
|
135
135
|
model_config = ConfigDict(extra="forbid")
|
|
136
136
|
|
|
137
137
|
pkg_name: NonEmptyStr
|
|
@@ -139,11 +139,11 @@ class TaskImport(BaseModel):
|
|
|
139
139
|
name: NonEmptyStr
|
|
140
140
|
|
|
141
141
|
|
|
142
|
-
class
|
|
142
|
+
class TaskImportV2Legacy(BaseModel):
|
|
143
143
|
source: NonEmptyStr
|
|
144
144
|
|
|
145
145
|
|
|
146
|
-
class
|
|
146
|
+
class TaskExportV2(BaseModel):
|
|
147
147
|
pkg_name: NonEmptyStr
|
|
148
148
|
version: NonEmptyStr | None = None
|
|
149
149
|
name: NonEmptyStr
|
|
@@ -21,9 +21,9 @@ class FractalUploadedFile(BaseModel):
|
|
|
21
21
|
contents: bytes
|
|
22
22
|
|
|
23
23
|
|
|
24
|
-
class
|
|
24
|
+
class TaskCollectPipV2(BaseModel):
|
|
25
25
|
"""
|
|
26
|
-
|
|
26
|
+
TaskCollectPipV2 class
|
|
27
27
|
|
|
28
28
|
This class only encodes the attributes required to trigger a
|
|
29
29
|
task-collection operation. Other attributes (that are assigned *during*
|
|
@@ -91,7 +91,7 @@ class TaskCollectPip(BaseModel):
|
|
|
91
91
|
return value
|
|
92
92
|
|
|
93
93
|
|
|
94
|
-
class
|
|
94
|
+
class TaskCollectCustomV2(BaseModel):
|
|
95
95
|
"""
|
|
96
96
|
Attributes:
|
|
97
97
|
manifest: Manifest of a Fractal task package (this is typically the
|
|
@@ -99,7 +99,7 @@ class TaskCollectCustom(BaseModel):
|
|
|
99
99
|
python_interpreter: Absolute path to the Python interpreter to be used
|
|
100
100
|
for running tasks.
|
|
101
101
|
name: A name identifying this package, that will fill the
|
|
102
|
-
`
|
|
102
|
+
`TaskGroupV2.pkg_name` column.
|
|
103
103
|
package_root: The folder where the package is installed.
|
|
104
104
|
If not provided, it will be extracted via `pip show`
|
|
105
105
|
(requires `package_name` to be set).
|
|
@@ -7,40 +7,40 @@ from pydantic import Field
|
|
|
7
7
|
from pydantic import field_serializer
|
|
8
8
|
from pydantic.types import AwareDatetime
|
|
9
9
|
|
|
10
|
-
from fractal_server.app.schemas.v2.task import
|
|
10
|
+
from fractal_server.app.schemas.v2.task import TaskReadV2
|
|
11
11
|
from fractal_server.types import AbsolutePathStr
|
|
12
12
|
from fractal_server.types import DictStrStr
|
|
13
13
|
from fractal_server.types import NonEmptyStr
|
|
14
14
|
|
|
15
15
|
|
|
16
|
-
class
|
|
16
|
+
class TaskGroupV2OriginEnum(StrEnum):
|
|
17
17
|
PYPI = "pypi"
|
|
18
18
|
WHEELFILE = "wheel-file"
|
|
19
19
|
PIXI = "pixi"
|
|
20
20
|
OTHER = "other"
|
|
21
21
|
|
|
22
22
|
|
|
23
|
-
class
|
|
23
|
+
class TaskGroupActivityStatusV2(StrEnum):
|
|
24
24
|
PENDING = "pending"
|
|
25
25
|
ONGOING = "ongoing"
|
|
26
26
|
FAILED = "failed"
|
|
27
27
|
OK = "OK"
|
|
28
28
|
|
|
29
29
|
|
|
30
|
-
class
|
|
30
|
+
class TaskGroupActivityActionV2(StrEnum):
|
|
31
31
|
COLLECT = "collect"
|
|
32
32
|
DEACTIVATE = "deactivate"
|
|
33
33
|
REACTIVATE = "reactivate"
|
|
34
34
|
DELETE = "delete"
|
|
35
35
|
|
|
36
36
|
|
|
37
|
-
class
|
|
37
|
+
class TaskGroupCreateV2(BaseModel):
|
|
38
38
|
model_config = ConfigDict(extra="forbid")
|
|
39
39
|
user_id: int
|
|
40
40
|
resource_id: int
|
|
41
41
|
user_group_id: int | None = None
|
|
42
42
|
active: bool = True
|
|
43
|
-
origin:
|
|
43
|
+
origin: TaskGroupV2OriginEnum
|
|
44
44
|
pkg_name: str
|
|
45
45
|
version: str | None = None
|
|
46
46
|
python_version: NonEmptyStr = None
|
|
@@ -54,9 +54,9 @@ class TaskGroupCreate(BaseModel):
|
|
|
54
54
|
pinned_package_versions_post: DictStrStr = Field(default_factory=dict)
|
|
55
55
|
|
|
56
56
|
|
|
57
|
-
class
|
|
57
|
+
class TaskGroupCreateV2Strict(TaskGroupCreateV2):
|
|
58
58
|
"""
|
|
59
|
-
A strict version of
|
|
59
|
+
A strict version of TaskGroupCreateV2, to be used for task collection.
|
|
60
60
|
"""
|
|
61
61
|
|
|
62
62
|
path: AbsolutePathStr
|
|
@@ -65,14 +65,14 @@ class TaskGroupCreateStrict(TaskGroupCreate):
|
|
|
65
65
|
python_version: NonEmptyStr
|
|
66
66
|
|
|
67
67
|
|
|
68
|
-
class
|
|
68
|
+
class TaskGroupReadV2(BaseModel):
|
|
69
69
|
id: int
|
|
70
|
-
task_list: list[
|
|
70
|
+
task_list: list[TaskReadV2]
|
|
71
71
|
|
|
72
72
|
user_id: int
|
|
73
73
|
user_group_id: int | None = None
|
|
74
74
|
|
|
75
|
-
origin:
|
|
75
|
+
origin: TaskGroupV2OriginEnum
|
|
76
76
|
pkg_name: str
|
|
77
77
|
version: str | None = None
|
|
78
78
|
python_version: str | None = None
|
|
@@ -96,16 +96,16 @@ class TaskGroupRead(BaseModel):
|
|
|
96
96
|
return v.isoformat()
|
|
97
97
|
|
|
98
98
|
|
|
99
|
-
class TaskGroupReadSuperuser(
|
|
99
|
+
class TaskGroupReadSuperuser(TaskGroupReadV2):
|
|
100
100
|
resource_id: int
|
|
101
101
|
|
|
102
102
|
|
|
103
|
-
class
|
|
103
|
+
class TaskGroupUpdateV2(BaseModel):
|
|
104
104
|
model_config = ConfigDict(extra="forbid")
|
|
105
105
|
user_group_id: int | None = None
|
|
106
106
|
|
|
107
107
|
|
|
108
|
-
class
|
|
108
|
+
class TaskGroupActivityV2Read(BaseModel):
|
|
109
109
|
id: int
|
|
110
110
|
user_id: int
|
|
111
111
|
taskgroupv2_id: int | None = None
|
|
@@ -113,8 +113,8 @@ class TaskGroupActivityRead(BaseModel):
|
|
|
113
113
|
timestamp_ended: AwareDatetime | None = None
|
|
114
114
|
pkg_name: str
|
|
115
115
|
version: str
|
|
116
|
-
status:
|
|
117
|
-
action:
|
|
116
|
+
status: TaskGroupActivityStatusV2
|
|
117
|
+
action: TaskGroupActivityActionV2
|
|
118
118
|
log: str | None = None
|
|
119
119
|
|
|
120
120
|
@field_serializer("timestamp_started")
|
|
@@ -5,29 +5,29 @@ from pydantic import ConfigDict
|
|
|
5
5
|
from pydantic import field_serializer
|
|
6
6
|
from pydantic.types import AwareDatetime
|
|
7
7
|
|
|
8
|
-
from fractal_server.app.schemas.v2.project import
|
|
9
|
-
from fractal_server.app.schemas.v2.workflowtask import
|
|
10
|
-
from fractal_server.app.schemas.v2.workflowtask import
|
|
11
|
-
from fractal_server.app.schemas.v2.workflowtask import
|
|
8
|
+
from fractal_server.app.schemas.v2.project import ProjectReadV2
|
|
9
|
+
from fractal_server.app.schemas.v2.workflowtask import WorkflowTaskExportV2
|
|
10
|
+
from fractal_server.app.schemas.v2.workflowtask import WorkflowTaskImportV2
|
|
11
|
+
from fractal_server.app.schemas.v2.workflowtask import WorkflowTaskReadV2
|
|
12
12
|
from fractal_server.app.schemas.v2.workflowtask import (
|
|
13
|
-
|
|
13
|
+
WorkflowTaskReadV2WithWarning,
|
|
14
14
|
)
|
|
15
15
|
from fractal_server.types import ListUniqueNonNegativeInt
|
|
16
16
|
from fractal_server.types import NonEmptyStr
|
|
17
17
|
|
|
18
18
|
|
|
19
|
-
class
|
|
19
|
+
class WorkflowCreateV2(BaseModel):
|
|
20
20
|
model_config = ConfigDict(extra="forbid")
|
|
21
21
|
|
|
22
22
|
name: NonEmptyStr
|
|
23
23
|
|
|
24
24
|
|
|
25
|
-
class
|
|
25
|
+
class WorkflowReadV2(BaseModel):
|
|
26
26
|
id: int
|
|
27
27
|
name: str
|
|
28
28
|
project_id: int
|
|
29
|
-
task_list: list[
|
|
30
|
-
project:
|
|
29
|
+
task_list: list[WorkflowTaskReadV2]
|
|
30
|
+
project: ProjectReadV2
|
|
31
31
|
timestamp_created: AwareDatetime
|
|
32
32
|
|
|
33
33
|
@field_serializer("timestamp_created")
|
|
@@ -35,18 +35,18 @@ class WorkflowRead(BaseModel):
|
|
|
35
35
|
return v.isoformat()
|
|
36
36
|
|
|
37
37
|
|
|
38
|
-
class
|
|
39
|
-
task_list: list[
|
|
38
|
+
class WorkflowReadV2WithWarnings(WorkflowReadV2):
|
|
39
|
+
task_list: list[WorkflowTaskReadV2WithWarning]
|
|
40
40
|
|
|
41
41
|
|
|
42
|
-
class
|
|
42
|
+
class WorkflowUpdateV2(BaseModel):
|
|
43
43
|
model_config = ConfigDict(extra="forbid")
|
|
44
44
|
|
|
45
45
|
name: NonEmptyStr = None
|
|
46
46
|
reordered_workflowtask_ids: ListUniqueNonNegativeInt | None = None
|
|
47
47
|
|
|
48
48
|
|
|
49
|
-
class
|
|
49
|
+
class WorkflowImportV2(BaseModel):
|
|
50
50
|
"""
|
|
51
51
|
Class for `Workflow` import.
|
|
52
52
|
|
|
@@ -56,10 +56,10 @@ class WorkflowImport(BaseModel):
|
|
|
56
56
|
|
|
57
57
|
model_config = ConfigDict(extra="forbid")
|
|
58
58
|
name: NonEmptyStr
|
|
59
|
-
task_list: list[
|
|
59
|
+
task_list: list[WorkflowTaskImportV2]
|
|
60
60
|
|
|
61
61
|
|
|
62
|
-
class
|
|
62
|
+
class WorkflowExportV2(BaseModel):
|
|
63
63
|
"""
|
|
64
64
|
Class for `Workflow` export.
|
|
65
65
|
|
|
@@ -68,4 +68,4 @@ class WorkflowExport(BaseModel):
|
|
|
68
68
|
"""
|
|
69
69
|
|
|
70
70
|
name: str
|
|
71
|
-
task_list: list[
|
|
71
|
+
task_list: list[WorkflowTaskExportV2]
|
|
@@ -9,14 +9,14 @@ from fractal_server.types import DictStrAny
|
|
|
9
9
|
from fractal_server.types import TypeFilters
|
|
10
10
|
from fractal_server.types import WorkflowTaskArgument
|
|
11
11
|
|
|
12
|
-
from .task import
|
|
13
|
-
from .task import
|
|
14
|
-
from .task import
|
|
15
|
-
from .task import
|
|
12
|
+
from .task import TaskExportV2
|
|
13
|
+
from .task import TaskImportV2
|
|
14
|
+
from .task import TaskImportV2Legacy
|
|
15
|
+
from .task import TaskReadV2
|
|
16
16
|
from .task import TaskType
|
|
17
17
|
|
|
18
18
|
|
|
19
|
-
class
|
|
19
|
+
class WorkflowTaskCreateV2(BaseModel):
|
|
20
20
|
model_config = ConfigDict(extra="forbid")
|
|
21
21
|
|
|
22
22
|
meta_non_parallel: DictStrAny | None = None
|
|
@@ -26,14 +26,14 @@ class WorkflowTaskCreate(BaseModel):
|
|
|
26
26
|
type_filters: TypeFilters = Field(default_factory=dict)
|
|
27
27
|
|
|
28
28
|
|
|
29
|
-
class
|
|
29
|
+
class WorkflowTaskReplaceV2(BaseModel):
|
|
30
30
|
"""Used by 'replace-task' endpoint"""
|
|
31
31
|
|
|
32
32
|
args_non_parallel: dict[str, Any] | None = None
|
|
33
33
|
args_parallel: dict[str, Any] | None = None
|
|
34
34
|
|
|
35
35
|
|
|
36
|
-
class
|
|
36
|
+
class WorkflowTaskReadV2(BaseModel):
|
|
37
37
|
id: int
|
|
38
38
|
|
|
39
39
|
workflow_id: int
|
|
@@ -48,14 +48,14 @@ class WorkflowTaskRead(BaseModel):
|
|
|
48
48
|
|
|
49
49
|
task_type: TaskType
|
|
50
50
|
task_id: int
|
|
51
|
-
task:
|
|
51
|
+
task: TaskReadV2
|
|
52
52
|
|
|
53
53
|
|
|
54
|
-
class
|
|
54
|
+
class WorkflowTaskReadV2WithWarning(WorkflowTaskReadV2):
|
|
55
55
|
warning: str | None = None
|
|
56
56
|
|
|
57
57
|
|
|
58
|
-
class
|
|
58
|
+
class WorkflowTaskUpdateV2(BaseModel):
|
|
59
59
|
model_config = ConfigDict(extra="forbid")
|
|
60
60
|
|
|
61
61
|
meta_non_parallel: DictStrAny | None = None
|
|
@@ -65,7 +65,7 @@ class WorkflowTaskUpdate(BaseModel):
|
|
|
65
65
|
type_filters: TypeFilters = None
|
|
66
66
|
|
|
67
67
|
|
|
68
|
-
class
|
|
68
|
+
class WorkflowTaskImportV2(BaseModel):
|
|
69
69
|
model_config = ConfigDict(extra="forbid")
|
|
70
70
|
|
|
71
71
|
meta_non_parallel: DictStrAny | None = None
|
|
@@ -75,7 +75,7 @@ class WorkflowTaskImport(BaseModel):
|
|
|
75
75
|
type_filters: TypeFilters | None = None
|
|
76
76
|
input_filters: dict[str, Any] | None = None
|
|
77
77
|
|
|
78
|
-
task:
|
|
78
|
+
task: TaskImportV2 | TaskImportV2Legacy
|
|
79
79
|
|
|
80
80
|
@model_validator(mode="before")
|
|
81
81
|
@classmethod
|
|
@@ -106,11 +106,11 @@ class WorkflowTaskImport(BaseModel):
|
|
|
106
106
|
return values
|
|
107
107
|
|
|
108
108
|
|
|
109
|
-
class
|
|
109
|
+
class WorkflowTaskExportV2(BaseModel):
|
|
110
110
|
meta_non_parallel: dict[str, Any] | None = None
|
|
111
111
|
meta_parallel: dict[str, Any] | None = None
|
|
112
112
|
args_non_parallel: dict[str, Any] | None = None
|
|
113
113
|
args_parallel: dict[str, Any] | None = None
|
|
114
114
|
type_filters: dict[str, bool] = Field(default_factory=dict)
|
|
115
115
|
|
|
116
|
-
task:
|
|
116
|
+
task: TaskExportV2
|
fractal_server/app/shutdown.py
CHANGED
|
@@ -4,26 +4,26 @@ from sqlmodel import select
|
|
|
4
4
|
|
|
5
5
|
from fractal_server.app.db import get_async_db
|
|
6
6
|
from fractal_server.app.models.v2 import JobV2
|
|
7
|
-
from fractal_server.app.models.v2.job import
|
|
7
|
+
from fractal_server.app.models.v2.job import JobStatusTypeV2
|
|
8
8
|
from fractal_server.app.routes.aux._job import _write_shutdown_file
|
|
9
9
|
from fractal_server.config import get_settings
|
|
10
10
|
from fractal_server.logger import get_logger
|
|
11
11
|
from fractal_server.syringe import Inject
|
|
12
12
|
|
|
13
13
|
|
|
14
|
-
async def cleanup_after_shutdown(*,
|
|
14
|
+
async def cleanup_after_shutdown(*, jobsV2: list[int], logger_name: str):
|
|
15
15
|
settings = Inject(get_settings)
|
|
16
16
|
logger = get_logger(logger_name)
|
|
17
17
|
logger.info("Cleanup function after shutdown")
|
|
18
18
|
stm_objects = (
|
|
19
19
|
select(JobV2)
|
|
20
|
-
.where(JobV2.id.in_(
|
|
21
|
-
.where(JobV2.status ==
|
|
20
|
+
.where(JobV2.id.in_(jobsV2))
|
|
21
|
+
.where(JobV2.status == JobStatusTypeV2.SUBMITTED)
|
|
22
22
|
)
|
|
23
23
|
stm_ids = (
|
|
24
24
|
select(JobV2.id)
|
|
25
|
-
.where(JobV2.id.in_(
|
|
26
|
-
.where(JobV2.status ==
|
|
25
|
+
.where(JobV2.id.in_(jobsV2))
|
|
26
|
+
.where(JobV2.status == JobStatusTypeV2.SUBMITTED)
|
|
27
27
|
)
|
|
28
28
|
|
|
29
29
|
async for session in get_async_db():
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
from ._data import DataAuthScheme # noqa F401
|
|
2
|
+
from ._data import DataSettings
|
|
1
3
|
from ._database import DatabaseSettings
|
|
2
4
|
from ._email import EmailSettings
|
|
3
5
|
from ._email import PublicEmailSettings # noqa F401
|
|
@@ -19,3 +21,7 @@ def get_email_settings(email_settings=EmailSettings()) -> EmailSettings:
|
|
|
19
21
|
|
|
20
22
|
def get_oauth_settings(oauth_settings=OAuthSettings()) -> OAuthSettings:
|
|
21
23
|
return oauth_settings
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def get_data_settings(data_settings=DataSettings()) -> DataSettings:
|
|
27
|
+
return data_settings
|