fractal-server 1.4.10__py3-none-any.whl → 2.0.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/app/models/__init__.py +3 -7
- fractal_server/app/models/linkuserproject.py +9 -0
- fractal_server/app/models/security.py +6 -0
- fractal_server/app/models/state.py +1 -1
- fractal_server/app/models/v1/__init__.py +11 -0
- fractal_server/app/models/{dataset.py → v1/dataset.py} +5 -5
- fractal_server/app/models/{job.py → v1/job.py} +5 -5
- fractal_server/app/models/{project.py → v1/project.py} +5 -5
- fractal_server/app/models/{task.py → v1/task.py} +7 -2
- fractal_server/app/models/{workflow.py → v1/workflow.py} +5 -5
- fractal_server/app/models/v2/__init__.py +20 -0
- fractal_server/app/models/v2/dataset.py +55 -0
- fractal_server/app/models/v2/job.py +51 -0
- fractal_server/app/models/v2/project.py +31 -0
- fractal_server/app/models/v2/task.py +93 -0
- fractal_server/app/models/v2/workflow.py +43 -0
- fractal_server/app/models/v2/workflowtask.py +90 -0
- fractal_server/app/routes/{admin.py → admin/v1.py} +42 -42
- fractal_server/app/routes/admin/v2.py +274 -0
- fractal_server/app/routes/api/v1/__init__.py +7 -7
- fractal_server/app/routes/api/v1/_aux_functions.py +2 -2
- fractal_server/app/routes/api/v1/dataset.py +37 -37
- fractal_server/app/routes/api/v1/job.py +14 -14
- fractal_server/app/routes/api/v1/project.py +23 -21
- fractal_server/app/routes/api/v1/task.py +24 -14
- fractal_server/app/routes/api/v1/task_collection.py +16 -14
- fractal_server/app/routes/api/v1/workflow.py +24 -24
- fractal_server/app/routes/api/v1/workflowtask.py +10 -10
- fractal_server/app/routes/api/v2/__init__.py +28 -0
- fractal_server/app/routes/api/v2/_aux_functions.py +497 -0
- fractal_server/app/routes/api/v2/dataset.py +309 -0
- fractal_server/app/routes/api/v2/images.py +207 -0
- fractal_server/app/routes/api/v2/job.py +200 -0
- fractal_server/app/routes/api/v2/project.py +202 -0
- fractal_server/app/routes/api/v2/submit.py +220 -0
- fractal_server/app/routes/api/v2/task.py +222 -0
- fractal_server/app/routes/api/v2/task_collection.py +229 -0
- fractal_server/app/routes/api/v2/workflow.py +397 -0
- fractal_server/app/routes/api/v2/workflowtask.py +269 -0
- fractal_server/app/routes/aux/_job.py +1 -1
- fractal_server/app/runner/async_wrap.py +27 -0
- fractal_server/app/runner/components.py +5 -0
- fractal_server/app/runner/exceptions.py +129 -0
- fractal_server/app/runner/executors/slurm/__init__.py +3 -0
- fractal_server/app/runner/{_slurm → executors/slurm}/_batching.py +1 -1
- fractal_server/app/runner/{_slurm → executors/slurm}/_check_jobs_status.py +1 -1
- fractal_server/app/runner/{_slurm → executors/slurm}/_executor_wait_thread.py +1 -1
- fractal_server/app/runner/{_slurm → executors/slurm}/_slurm_config.py +3 -152
- fractal_server/app/runner/{_slurm → executors/slurm}/_subprocess_run_as_user.py +1 -1
- fractal_server/app/runner/{_slurm → executors/slurm}/executor.py +32 -19
- fractal_server/app/runner/filenames.py +6 -0
- fractal_server/app/runner/set_start_and_last_task_index.py +39 -0
- fractal_server/app/runner/task_files.py +103 -0
- fractal_server/app/runner/{__init__.py → v1/__init__.py} +22 -20
- fractal_server/app/runner/{_common.py → v1/_common.py} +13 -120
- fractal_server/app/runner/{_local → v1/_local}/__init__.py +5 -5
- fractal_server/app/runner/{_local → v1/_local}/_local_config.py +6 -7
- fractal_server/app/runner/{_local → v1/_local}/_submit_setup.py +1 -5
- fractal_server/app/runner/v1/_slurm/__init__.py +310 -0
- fractal_server/app/runner/{_slurm → v1/_slurm}/_submit_setup.py +3 -9
- fractal_server/app/runner/v1/_slurm/get_slurm_config.py +163 -0
- fractal_server/app/runner/v1/common.py +117 -0
- fractal_server/app/runner/{handle_failed_job.py → v1/handle_failed_job.py} +8 -8
- fractal_server/app/runner/v2/__init__.py +336 -0
- fractal_server/app/runner/v2/_local/__init__.py +167 -0
- fractal_server/app/runner/v2/_local/_local_config.py +118 -0
- fractal_server/app/runner/v2/_local/_submit_setup.py +52 -0
- fractal_server/app/runner/v2/_local/executor.py +100 -0
- fractal_server/app/runner/{_slurm → v2/_slurm}/__init__.py +34 -45
- fractal_server/app/runner/v2/_slurm/_submit_setup.py +83 -0
- fractal_server/app/runner/v2/_slurm/get_slurm_config.py +179 -0
- fractal_server/app/runner/v2/deduplicate_list.py +22 -0
- fractal_server/app/runner/v2/handle_failed_job.py +156 -0
- fractal_server/app/runner/v2/merge_outputs.py +38 -0
- fractal_server/app/runner/v2/runner.py +267 -0
- fractal_server/app/runner/v2/runner_functions.py +341 -0
- fractal_server/app/runner/v2/runner_functions_low_level.py +134 -0
- fractal_server/app/runner/v2/task_interface.py +43 -0
- fractal_server/app/runner/v2/v1_compat.py +21 -0
- fractal_server/app/schemas/__init__.py +4 -42
- fractal_server/app/schemas/v1/__init__.py +42 -0
- fractal_server/app/schemas/{applyworkflow.py → v1/applyworkflow.py} +18 -18
- fractal_server/app/schemas/{dataset.py → v1/dataset.py} +30 -30
- fractal_server/app/schemas/{dumps.py → v1/dumps.py} +8 -8
- fractal_server/app/schemas/{manifest.py → v1/manifest.py} +5 -5
- fractal_server/app/schemas/{project.py → v1/project.py} +9 -9
- fractal_server/app/schemas/{task.py → v1/task.py} +12 -12
- fractal_server/app/schemas/{task_collection.py → v1/task_collection.py} +7 -7
- fractal_server/app/schemas/{workflow.py → v1/workflow.py} +38 -38
- fractal_server/app/schemas/v2/__init__.py +34 -0
- fractal_server/app/schemas/v2/dataset.py +89 -0
- fractal_server/app/schemas/v2/dumps.py +87 -0
- fractal_server/app/schemas/v2/job.py +114 -0
- fractal_server/app/schemas/v2/manifest.py +159 -0
- fractal_server/app/schemas/v2/project.py +37 -0
- fractal_server/app/schemas/v2/task.py +120 -0
- fractal_server/app/schemas/v2/task_collection.py +105 -0
- fractal_server/app/schemas/v2/workflow.py +79 -0
- fractal_server/app/schemas/v2/workflowtask.py +119 -0
- fractal_server/config.py +5 -4
- fractal_server/images/__init__.py +2 -0
- fractal_server/images/models.py +50 -0
- fractal_server/images/tools.py +85 -0
- fractal_server/main.py +11 -3
- fractal_server/migrations/env.py +0 -2
- fractal_server/migrations/versions/d71e732236cd_v2.py +239 -0
- fractal_server/tasks/__init__.py +0 -5
- fractal_server/tasks/endpoint_operations.py +13 -19
- fractal_server/tasks/utils.py +35 -0
- fractal_server/tasks/{_TaskCollectPip.py → v1/_TaskCollectPip.py} +3 -3
- fractal_server/tasks/{background_operations.py → v1/background_operations.py} +18 -50
- fractal_server/tasks/v1/get_collection_data.py +14 -0
- fractal_server/tasks/v2/_TaskCollectPip.py +103 -0
- fractal_server/tasks/v2/background_operations.py +381 -0
- fractal_server/tasks/v2/get_collection_data.py +14 -0
- {fractal_server-1.4.10.dist-info → fractal_server-2.0.0a1.dist-info}/METADATA +1 -1
- fractal_server-2.0.0a1.dist-info/RECORD +160 -0
- fractal_server/app/runner/_slurm/.gitignore +0 -2
- fractal_server/app/runner/common.py +0 -311
- fractal_server-1.4.10.dist-info/RECORD +0 -98
- /fractal_server/app/runner/{_slurm → executors/slurm}/remote.py +0 -0
- /fractal_server/app/runner/{_local → v1/_local}/executor.py +0 -0
- {fractal_server-1.4.10.dist-info → fractal_server-2.0.0a1.dist-info}/LICENSE +0 -0
- {fractal_server-1.4.10.dist-info → fractal_server-2.0.0a1.dist-info}/WHEEL +0 -0
- {fractal_server-1.4.10.dist-info → fractal_server-2.0.0a1.dist-info}/entry_points.txt +0 -0
@@ -1,311 +0,0 @@
|
|
1
|
-
"""
|
2
|
-
Common utilities and routines for runner backends (public API)
|
3
|
-
|
4
|
-
This module includes utilities and routines that are of use to implement
|
5
|
-
runner backends but that should also be exposed to the other components of
|
6
|
-
`Fractal Server`.
|
7
|
-
"""
|
8
|
-
import asyncio
|
9
|
-
import json
|
10
|
-
import os
|
11
|
-
from functools import partial
|
12
|
-
from functools import wraps
|
13
|
-
from json import JSONEncoder
|
14
|
-
from pathlib import Path
|
15
|
-
from typing import Any
|
16
|
-
from typing import Callable
|
17
|
-
from typing import Optional
|
18
|
-
|
19
|
-
from pydantic import BaseModel
|
20
|
-
|
21
|
-
from ...logger import close_logger as close_job_logger # noqa F401
|
22
|
-
from ..models import Dataset
|
23
|
-
from ..models.workflow import Workflow
|
24
|
-
|
25
|
-
|
26
|
-
class TaskExecutionError(RuntimeError):
|
27
|
-
"""
|
28
|
-
Forwards errors occurred during the execution of a task
|
29
|
-
|
30
|
-
This error wraps and forwards errors occurred during the execution of
|
31
|
-
tasks, when the exit code is larger than 0 (i.e. the error took place
|
32
|
-
within the task). This error also adds information that is useful to track
|
33
|
-
down and debug the failing task within a workflow.
|
34
|
-
|
35
|
-
Attributes:
|
36
|
-
workflow_task_id:
|
37
|
-
ID of the workflow task that failed.
|
38
|
-
workflow_task_order:
|
39
|
-
Order of the task within the workflow.
|
40
|
-
task_name:
|
41
|
-
Human readable name of the failing task.
|
42
|
-
"""
|
43
|
-
|
44
|
-
workflow_task_id: Optional[int] = None
|
45
|
-
workflow_task_order: Optional[int] = None
|
46
|
-
task_name: Optional[str] = None
|
47
|
-
|
48
|
-
def __init__(
|
49
|
-
self,
|
50
|
-
*args,
|
51
|
-
workflow_task_id: Optional[int] = None,
|
52
|
-
workflow_task_order: Optional[int] = None,
|
53
|
-
task_name: Optional[str] = None,
|
54
|
-
):
|
55
|
-
super().__init__(*args)
|
56
|
-
self.workflow_task_id = workflow_task_id
|
57
|
-
self.workflow_task_order = workflow_task_order
|
58
|
-
self.task_name = task_name
|
59
|
-
|
60
|
-
|
61
|
-
class JobExecutionError(RuntimeError):
|
62
|
-
"""
|
63
|
-
Forwards errors in the execution of a task that are due to external factors
|
64
|
-
|
65
|
-
This error wraps and forwards errors occurred during the execution of
|
66
|
-
tasks, but related to external factors like:
|
67
|
-
|
68
|
-
1. A negative exit code (e.g. because the task received a TERM or KILL
|
69
|
-
signal);
|
70
|
-
2. An error on the executor side (e.g. the SLURM executor could not
|
71
|
-
find the pickled file with task output).
|
72
|
-
|
73
|
-
This error also adds information that is useful to track down and debug the
|
74
|
-
failing task within a workflow.
|
75
|
-
|
76
|
-
Attributes:
|
77
|
-
info:
|
78
|
-
A free field for additional information
|
79
|
-
cmd_file:
|
80
|
-
Path to the file of the command that was executed (e.g. a SLURM
|
81
|
-
submission script).
|
82
|
-
stdout_file:
|
83
|
-
Path to the file with the command stdout
|
84
|
-
stderr_file:
|
85
|
-
Path to the file with the command stderr
|
86
|
-
"""
|
87
|
-
|
88
|
-
cmd_file: Optional[str] = None
|
89
|
-
stdout_file: Optional[str] = None
|
90
|
-
stderr_file: Optional[str] = None
|
91
|
-
info: Optional[str] = None
|
92
|
-
|
93
|
-
def __init__(
|
94
|
-
self,
|
95
|
-
*args,
|
96
|
-
cmd_file: Optional[str] = None,
|
97
|
-
stdout_file: Optional[str] = None,
|
98
|
-
stderr_file: Optional[str] = None,
|
99
|
-
info: Optional[str] = None,
|
100
|
-
):
|
101
|
-
super().__init__(*args)
|
102
|
-
self.cmd_file = cmd_file
|
103
|
-
self.stdout_file = stdout_file
|
104
|
-
self.stderr_file = stderr_file
|
105
|
-
self.info = info
|
106
|
-
|
107
|
-
def _read_file(self, filepath: str) -> str:
|
108
|
-
"""
|
109
|
-
Return the content of a text file, and handle the cases where it is
|
110
|
-
empty or missing
|
111
|
-
"""
|
112
|
-
if os.path.exists(filepath):
|
113
|
-
with open(filepath, "r") as f:
|
114
|
-
content = f.read()
|
115
|
-
if content:
|
116
|
-
return f"Content of {filepath}:\n{content}"
|
117
|
-
else:
|
118
|
-
return f"File {filepath} is empty\n"
|
119
|
-
else:
|
120
|
-
return f"File {filepath} is missing\n"
|
121
|
-
|
122
|
-
def assemble_error(self) -> str:
|
123
|
-
"""
|
124
|
-
Read the files that are specified in attributes, and combine them in an
|
125
|
-
error message.
|
126
|
-
"""
|
127
|
-
if self.cmd_file:
|
128
|
-
content = self._read_file(self.cmd_file)
|
129
|
-
cmd_content = f"COMMAND:\n{content}\n\n"
|
130
|
-
else:
|
131
|
-
cmd_content = ""
|
132
|
-
if self.stdout_file:
|
133
|
-
content = self._read_file(self.stdout_file)
|
134
|
-
out_content = f"STDOUT:\n{content}\n\n"
|
135
|
-
else:
|
136
|
-
out_content = ""
|
137
|
-
if self.stderr_file:
|
138
|
-
content = self._read_file(self.stderr_file)
|
139
|
-
err_content = f"STDERR:\n{content}\n\n"
|
140
|
-
else:
|
141
|
-
err_content = ""
|
142
|
-
|
143
|
-
content = f"{cmd_content}{out_content}{err_content}"
|
144
|
-
if self.info:
|
145
|
-
content = f"{content}ADDITIONAL INFO:\n{self.info}\n\n"
|
146
|
-
|
147
|
-
if not content:
|
148
|
-
content = str(self)
|
149
|
-
message = f"JobExecutionError\n\n{content}"
|
150
|
-
return message
|
151
|
-
|
152
|
-
|
153
|
-
class TaskParameterEncoder(JSONEncoder):
|
154
|
-
"""
|
155
|
-
Convenience JSONEncoder that serialises `Path`s as strings
|
156
|
-
"""
|
157
|
-
|
158
|
-
def default(self, value):
|
159
|
-
if isinstance(value, Path):
|
160
|
-
return value.as_posix()
|
161
|
-
return JSONEncoder.default(self, value)
|
162
|
-
|
163
|
-
|
164
|
-
class TaskParameters(BaseModel):
|
165
|
-
"""
|
166
|
-
Wrapper for task input parameters
|
167
|
-
|
168
|
-
Instances of this class are used to pass parameters from the output of a
|
169
|
-
task to the input of the next one.
|
170
|
-
|
171
|
-
Attributes:
|
172
|
-
input_paths:
|
173
|
-
Input paths as derived by the input dataset.
|
174
|
-
output_paths:
|
175
|
-
Output path as derived from the output dataset.
|
176
|
-
metadata:
|
177
|
-
Dataset metadata, as found in the input dataset or as updated by
|
178
|
-
the previous task.
|
179
|
-
history:
|
180
|
-
Dataset history, as found in the input dataset or as updated by
|
181
|
-
the previous task.
|
182
|
-
"""
|
183
|
-
|
184
|
-
input_paths: list[Path]
|
185
|
-
output_path: Path
|
186
|
-
metadata: dict[str, Any]
|
187
|
-
history: list[dict[str, Any]]
|
188
|
-
|
189
|
-
class Config:
|
190
|
-
arbitrary_types_allowed = True
|
191
|
-
extra = "forbid"
|
192
|
-
|
193
|
-
|
194
|
-
def validate_workflow_compatibility(
|
195
|
-
*,
|
196
|
-
input_dataset: Dataset,
|
197
|
-
workflow: Workflow,
|
198
|
-
output_dataset: Dataset,
|
199
|
-
first_task_index: int,
|
200
|
-
last_task_index: int,
|
201
|
-
) -> None:
|
202
|
-
"""
|
203
|
-
Check compatibility of workflow and input / ouptut dataset
|
204
|
-
"""
|
205
|
-
# Check input_dataset type
|
206
|
-
workflow_input_type = workflow.task_list[first_task_index].task.input_type
|
207
|
-
if (
|
208
|
-
workflow_input_type != "Any"
|
209
|
-
and workflow_input_type != input_dataset.type
|
210
|
-
):
|
211
|
-
raise TypeError(
|
212
|
-
f"Incompatible types `{workflow_input_type}` of workflow "
|
213
|
-
f"`{workflow.name}` and `{input_dataset.type}` of dataset "
|
214
|
-
f"`{input_dataset.name}`"
|
215
|
-
)
|
216
|
-
|
217
|
-
# Check output_dataset type
|
218
|
-
workflow_output_type = workflow.task_list[last_task_index].task.output_type
|
219
|
-
if (
|
220
|
-
workflow_output_type != "Any"
|
221
|
-
and workflow_output_type != output_dataset.type
|
222
|
-
):
|
223
|
-
raise TypeError(
|
224
|
-
f"Incompatible types `{workflow_output_type}` of workflow "
|
225
|
-
f"`{workflow.name}` and `{output_dataset.type}` of dataset "
|
226
|
-
f"`{output_dataset.name}`"
|
227
|
-
)
|
228
|
-
|
229
|
-
|
230
|
-
def async_wrap(func: Callable) -> Callable:
|
231
|
-
"""
|
232
|
-
Wrap a synchronous callable in an async task
|
233
|
-
|
234
|
-
Ref: [issue #140](https://github.com/fractal-analytics-platform/fractal-server/issues/140)
|
235
|
-
and [this StackOverflow answer](https://stackoverflow.com/q/43241221/19085332).
|
236
|
-
|
237
|
-
Returns:
|
238
|
-
async_wrapper:
|
239
|
-
A factory that allows wrapping a blocking callable within a
|
240
|
-
coroutine.
|
241
|
-
""" # noqa: E501
|
242
|
-
|
243
|
-
@wraps(func)
|
244
|
-
async def async_wrapper(*args, loop=None, executor=None, **kwargs):
|
245
|
-
if loop is None:
|
246
|
-
loop = asyncio.get_event_loop()
|
247
|
-
pfunc = partial(func, *args, **kwargs)
|
248
|
-
return await loop.run_in_executor(executor, pfunc)
|
249
|
-
|
250
|
-
return async_wrapper
|
251
|
-
|
252
|
-
|
253
|
-
def write_args_file(
|
254
|
-
*args: dict[str, Any],
|
255
|
-
path: Path,
|
256
|
-
):
|
257
|
-
"""
|
258
|
-
Merge arbitrary dictionaries and write to file
|
259
|
-
|
260
|
-
Args:
|
261
|
-
*args:
|
262
|
-
One or more dictionaries that will be merged into one respecting
|
263
|
-
the order with which they are passed in, i.e., last in overrides
|
264
|
-
previous ones.
|
265
|
-
path:
|
266
|
-
Destination for serialised file.
|
267
|
-
"""
|
268
|
-
out = {}
|
269
|
-
for d in args:
|
270
|
-
out.update(d)
|
271
|
-
|
272
|
-
with open(path, "w") as f:
|
273
|
-
json.dump(out, f, cls=TaskParameterEncoder, indent=4)
|
274
|
-
|
275
|
-
|
276
|
-
def set_start_and_last_task_index(
|
277
|
-
num_tasks: int,
|
278
|
-
first_task_index: Optional[int] = None,
|
279
|
-
last_task_index: Optional[int] = None,
|
280
|
-
) -> tuple[int, int]:
|
281
|
-
"""
|
282
|
-
Handle `first_task_index` and `last_task_index`, by setting defaults and
|
283
|
-
validating values.
|
284
|
-
|
285
|
-
num_tasks:
|
286
|
-
Total number of tasks in a workflow task list
|
287
|
-
first_task_index:
|
288
|
-
Positional index of the first task to execute
|
289
|
-
last_task_index:
|
290
|
-
Positional index of the last task to execute
|
291
|
-
"""
|
292
|
-
# Set default values
|
293
|
-
if first_task_index is None:
|
294
|
-
first_task_index = 0
|
295
|
-
if last_task_index is None:
|
296
|
-
last_task_index = num_tasks - 1
|
297
|
-
|
298
|
-
# Perform checks
|
299
|
-
if first_task_index < 0:
|
300
|
-
raise ValueError(f"{first_task_index=} cannot be negative")
|
301
|
-
if last_task_index < 0:
|
302
|
-
raise ValueError(f"{last_task_index=} cannot be negative")
|
303
|
-
if last_task_index > num_tasks - 1:
|
304
|
-
raise ValueError(
|
305
|
-
f"{last_task_index=} cannot be larger than {(num_tasks-1)=}"
|
306
|
-
)
|
307
|
-
if first_task_index > last_task_index:
|
308
|
-
raise ValueError(
|
309
|
-
f"{first_task_index=} cannot be larger than {last_task_index=}"
|
310
|
-
)
|
311
|
-
return (first_task_index, last_task_index)
|
@@ -1,98 +0,0 @@
|
|
1
|
-
fractal_server/__init__.py,sha256=t8NS5fz3p0nUC42V0AgAZYewpt_H0bj6cdGkswqpg2k,23
|
2
|
-
fractal_server/__main__.py,sha256=CocbzZooX1UtGqPi55GcHGNxnrJXFg5tUU5b3wyFCyo,4958
|
3
|
-
fractal_server/alembic.ini,sha256=MWwi7GzjzawI9cCAK1LW7NxIBQDUqD12-ptJoq5JpP0,3153
|
4
|
-
fractal_server/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
5
|
-
fractal_server/app/db/__init__.py,sha256=WZEVfdJAX7ZyBM1ngfEGeqWWcjK_NygtCbawpmbwGpU,4042
|
6
|
-
fractal_server/app/models/__init__.py,sha256=RuxWH8fsmkTWsjLhYjrxSt-mvk74coCilAQlX2Q6OO0,353
|
7
|
-
fractal_server/app/models/dataset.py,sha256=nydU9syGVXSVuj3sTsVXIiU2vhTUrdwcUZipM-p00GY,2000
|
8
|
-
fractal_server/app/models/job.py,sha256=t0O9EKGQO4aPuTtc_N9SzLF2vrc-pevjsHumLeCPvM8,3287
|
9
|
-
fractal_server/app/models/linkuserproject.py,sha256=RVtl25Q_N99uoVDE7wx0IN0SgFjc7Id5XbScsgrjv_E,309
|
10
|
-
fractal_server/app/models/project.py,sha256=lK2CObOto_ozeNQ0gzHiioqaMIavCc-Zh_GE8yWbBTQ,848
|
11
|
-
fractal_server/app/models/security.py,sha256=Lvf1Z50oQneDSJeJxYjQcmNTJHAb64EW3hnjfu_ahUY,3135
|
12
|
-
fractal_server/app/models/state.py,sha256=rSTjYPfPZntEfdQudKp6yu5vsdyfHA7nMYNRIBWsiAQ,1087
|
13
|
-
fractal_server/app/models/task.py,sha256=APndtea9A7EF7TtpVK8kWapBM01a6nk3FFCrQbbioI8,2632
|
14
|
-
fractal_server/app/models/workflow.py,sha256=B6v3qqNDb6hvAyDN63n5vkemNueR2aH6zpwSGLlcRNE,3933
|
15
|
-
fractal_server/app/routes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
16
|
-
fractal_server/app/routes/admin.py,sha256=IfPEUhZA7P__pKiKjkJbOzot3HcvSZ6raJDeM61ml-k,13872
|
17
|
-
fractal_server/app/routes/api/__init__.py,sha256=EVyZrEq3I_1643QGTPCC5lgCp4xH_auYbrFfogTm4pc,315
|
18
|
-
fractal_server/app/routes/api/v1/__init__.py,sha256=V4nhYyMIqhlJxbotLTYikq_ghb6KID0ZKOOYaOq7C-g,944
|
19
|
-
fractal_server/app/routes/api/v1/_aux_functions.py,sha256=wcrYf29PrCrRHAH_8CIOfMge17RGU8iTro4jKvjajDM,11948
|
20
|
-
fractal_server/app/routes/api/v1/dataset.py,sha256=7iokdBq516xLwjtgLorSRAnhQLy4mwA5EOBItI9I_r8,16810
|
21
|
-
fractal_server/app/routes/api/v1/job.py,sha256=82QMOfSnoO4t3Y90gNif6bBol13018tXQN-KrCkiB2U,5400
|
22
|
-
fractal_server/app/routes/api/v1/project.py,sha256=Z3hqcH6_5H-ddaOxsDNM9qgvKt7ObyuwQKsIFNE-7fE,15673
|
23
|
-
fractal_server/app/routes/api/v1/task.py,sha256=CwGbmlJYoKlX_PuoV273tALAb0WCNuuc9DxqLkDlUtA,5745
|
24
|
-
fractal_server/app/routes/api/v1/task_collection.py,sha256=zKkKd-3hne16hYCaopySvkj1l8HOfWozgjHsQaceGN8,8340
|
25
|
-
fractal_server/app/routes/api/v1/workflow.py,sha256=3dfFBUh0qJ_h4zMEsRgPit7g2Nu7v0CczeyfVA_Q4Fw,10864
|
26
|
-
fractal_server/app/routes/api/v1/workflowtask.py,sha256=9QrsnZatai4PXvRgD7gfT-8QGRu787-2wenN_6gfYuo,5550
|
27
|
-
fractal_server/app/routes/auth.py,sha256=Xv80iqdyfY3lyicYs2Y8B6zEDEnyUu_H6_6psYtv3R4,4885
|
28
|
-
fractal_server/app/routes/aux/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
29
|
-
fractal_server/app/routes/aux/_job.py,sha256=whx2G9PCCt-Hw_lgsZa1ECQlhDKNq4eHvwqgpgvBgwg,1246
|
30
|
-
fractal_server/app/routes/aux/_runner.py,sha256=psW6fsoo_VrAHrD5UQPbqFYikCp0m16VRymC-U1yUTk,675
|
31
|
-
fractal_server/app/runner/.gitignore,sha256=ytzN_oyHWXrGU7iFAtoHSTUbM6Rn6kG0Zkddg0xZk6s,16
|
32
|
-
fractal_server/app/runner/__init__.py,sha256=ZWixaPPVsOZJFGpTjNwpOndIyc8qcXD7CMC_GObWj1c,13505
|
33
|
-
fractal_server/app/runner/_common.py,sha256=cRmhAayWLbXrSYV0ZJNAnlZp8hqvLofJmaFLGNChSfE,24363
|
34
|
-
fractal_server/app/runner/_local/__init__.py,sha256=gHsilCnT9VkqVbKpnEIZCnx4BuDydWcKneeWHWb2410,6799
|
35
|
-
fractal_server/app/runner/_local/_local_config.py,sha256=-oNTsjEUmytHlsYpWfw2CrPvSxDFeEhZSdQvI_wf3Mk,3245
|
36
|
-
fractal_server/app/runner/_local/_submit_setup.py,sha256=cP4gjQ_3TFgqglscQacp9dB3aqeXup5tVqqWE7TZl9Q,1631
|
37
|
-
fractal_server/app/runner/_local/executor.py,sha256=QrJlD77G6q4WohoJQO7XXbvi2RlCUsNvMnPDEZIoAqA,3620
|
38
|
-
fractal_server/app/runner/_slurm/.gitignore,sha256=ytzN_oyHWXrGU7iFAtoHSTUbM6Rn6kG0Zkddg0xZk6s,16
|
39
|
-
fractal_server/app/runner/_slurm/__init__.py,sha256=vHuEPhmwZi6c22sAF3rKy3rvSBOA9E1FdwFVQlG3J28,4850
|
40
|
-
fractal_server/app/runner/_slurm/_batching.py,sha256=KE4NrLXRHFZQSLW2vbUyu0X7TE7bTd2WCRrbYhXRTow,8840
|
41
|
-
fractal_server/app/runner/_slurm/_check_jobs_status.py,sha256=4lZiVq0o_9Tmbui-UsPCLewCuxWCd-nyzPbbzPvzt2A,1907
|
42
|
-
fractal_server/app/runner/_slurm/_executor_wait_thread.py,sha256=8DMlW3vxZ0rJPQw7F1X48ljUKBJod_88Kj_Sg9UgzRk,4420
|
43
|
-
fractal_server/app/runner/_slurm/_slurm_config.py,sha256=fNjnqbQgZ2wSMTTUOC9HuPis9MHxX6rl49wd4ro2SKY,21010
|
44
|
-
fractal_server/app/runner/_slurm/_submit_setup.py,sha256=JIPmZEqyLRByQ3SgqiyocQlsHjfm0wKCk7W-KRBGu_0,2930
|
45
|
-
fractal_server/app/runner/_slurm/_subprocess_run_as_user.py,sha256=KYaifaAR8JsQ0OZW2A6JlfL0GsiQ6WFUa5fTvaMgA-g,5122
|
46
|
-
fractal_server/app/runner/_slurm/executor.py,sha256=H5Cpu8ths5XZysvX1dTdEEbWQyku1_C8YNvN-nAeXuw,43886
|
47
|
-
fractal_server/app/runner/_slurm/remote.py,sha256=wLziIsGdSMiO-jIXM8x77JRK82g_2hx0iBKTiMghuIo,5852
|
48
|
-
fractal_server/app/runner/common.py,sha256=soO9qFWh1Aac13oolk0K1VpP0VIWG5QqTNkcqzHDDUE,9508
|
49
|
-
fractal_server/app/runner/handle_failed_job.py,sha256=Kov_Ha1rcPNdoLuQx8Dq4fz7s2naR25ce4oQaUy-7TI,4653
|
50
|
-
fractal_server/app/schemas/__init__.py,sha256=vjGKGMM45ywNClHV5KZ2u9eGLCa4p7i6ueQqCGtPcSk,2010
|
51
|
-
fractal_server/app/schemas/_validators.py,sha256=s9a6AX4-3Vfoy1Y_HMQA3lXm4FLdmnODYUD4lfsJr6w,2549
|
52
|
-
fractal_server/app/schemas/applyworkflow.py,sha256=hDYB5Oao1uq1RURUBSxFJH7L3AO5YTXCqTxnvICkeZA,4264
|
53
|
-
fractal_server/app/schemas/dataset.py,sha256=e5rM5vyrxWsuWn-rb0BUaGLYS5BtE_Ksq4Vpi8FjDGM,3375
|
54
|
-
fractal_server/app/schemas/dumps.py,sha256=ovxbPB6Zfq1t2R8exBHj-jl0clvI-BcVyGfamU25qtY,1258
|
55
|
-
fractal_server/app/schemas/json_schemas/manifest.json,sha256=yXYKHbYXPYSkSXMTLfTpfCUGBtmQuPTk1xuSXscdba4,1787
|
56
|
-
fractal_server/app/schemas/manifest.py,sha256=xxTd39dAXMK9Ox1y-p3gbyg0zd5udW99pV4JngCUGwM,3819
|
57
|
-
fractal_server/app/schemas/project.py,sha256=NSileJqsKdvRd7wg5nUC-uAJhyAKuTLIZU1FU_w1HqY,1196
|
58
|
-
fractal_server/app/schemas/state.py,sha256=t4XM04aqxeluh8MfvD7LfEc-8-dOmUVluZHhLsfxxkc,692
|
59
|
-
fractal_server/app/schemas/task.py,sha256=2TBE5Ne9tO_-a2-Es0PRXMT8ZddSInTOPMor7u8-gx0,3671
|
60
|
-
fractal_server/app/schemas/task_collection.py,sha256=nkbW076pB0wWYyWkFpplyLBBEWufAP6buYAmEupWV6I,3044
|
61
|
-
fractal_server/app/schemas/user.py,sha256=rE8WgBz-ceVUs0Sz2ZwcjUrSTZTnS0ys5SBtD2XD9r8,3113
|
62
|
-
fractal_server/app/schemas/workflow.py,sha256=sbao4_hWHzby5w7syKB045XLLEwsYv-GHczBSMHM8QU,4525
|
63
|
-
fractal_server/app/security/__init__.py,sha256=wxosoHc3mJYPCdPMyWnRD8w_2OgnKYp2aDkdmwrZh5k,11203
|
64
|
-
fractal_server/config.py,sha256=IBDGp3x-pXRznOa0NZybU0FlT8SVPJ7zFZEtkhWn9WA,15068
|
65
|
-
fractal_server/data_migrations/README.md,sha256=_3AEFvDg9YkybDqCLlFPdDmGJvr6Tw7HRI14aZ3LOIw,398
|
66
|
-
fractal_server/logger.py,sha256=95duXY8eSxf1HWg0CVn8SUGNzgJw9ZR0FlapDDF6WAY,3924
|
67
|
-
fractal_server/main.py,sha256=qz0YrcLCEYVGobHcrntQJicbPiC7y4MFoKTlBkZmCqI,2706
|
68
|
-
fractal_server/migrations/README,sha256=4rQvyDfqodGhpJw74VYijRmgFP49ji5chyEemWGHsuw,59
|
69
|
-
fractal_server/migrations/env.py,sha256=05EoWw0p43ojTNiz7UVG4lsl057B4ImSgXiHmiU-M80,2690
|
70
|
-
fractal_server/migrations/script.py.mako,sha256=oMXw9LC3zRbinWWPPDgeZ4z9FJrV2zhRWiYdS5YgNbI,526
|
71
|
-
fractal_server/migrations/versions/4c308bcaea2b_add_task_args_schema_and_task_args_.py,sha256=-wHe-fOffmYeAm0JXVl_lxZ7hhDkaEVqxgxpHkb_uL8,954
|
72
|
-
fractal_server/migrations/versions/4cedeb448a53_workflowtask_foreign_keys_not_nullables.py,sha256=Mob8McGYAcmgvrseyyYOa54E6Gsgr-4SiGdC-r9O4_A,1157
|
73
|
-
fractal_server/migrations/versions/50a13d6138fd_initial_schema.py,sha256=zwXegXs9J40eyCWi3w0c_iIBVJjXNn4VdVnQaT3KxDg,8770
|
74
|
-
fractal_server/migrations/versions/70e77f1c38b0_add_applyworkflow_first_task_index_and_.py,sha256=Q-DsMzG3IcUV2Ol1dhJWosDvKERamBE6QvA2zzS5zpQ,1632
|
75
|
-
fractal_server/migrations/versions/71eefd1dd202_add_slurm_accounts.py,sha256=mbWuCkTpRAdGbRhW7lhXs_e5S6O37UAcCN6JfoY5H8A,1353
|
76
|
-
fractal_server/migrations/versions/84bf0fffde30_add_dumps_to_applyworkflow.py,sha256=NSCuhANChsg76vBkShBl-9tQ4VEHubOjtAv1etHhlvY,2684
|
77
|
-
fractal_server/migrations/versions/8f79bd162e35_add_docs_info_and_docs_link_to_task_.py,sha256=6pgODDtyAxevZvAJBj9IJ41inhV1RpwbpZr_qfPPu1A,1115
|
78
|
-
fractal_server/migrations/versions/97f444d47249_add_applyworkflow_project_dump.py,sha256=eKTZm3EgUgapXBxO0RuHkEfTKic-TZG3ADaMpGLuc0k,1057
|
79
|
-
fractal_server/migrations/versions/99ea79d9e5d2_add_dataset_history.py,sha256=0im6TxDr53sKKcjiPgeH4ftVRGnRXZSh2lPbRQ1Ir9w,883
|
80
|
-
fractal_server/migrations/versions/9fd26a2b0de4_add_workflow_timestamp_created.py,sha256=4l1AHGUsa0ONoJVZlr3fTXw_xbbQ8O7wlD92Az2aRfM,1849
|
81
|
-
fractal_server/migrations/versions/a7f4d6137b53_add_workflow_dump_to_applyworkflow.py,sha256=ekDUML7ILpmdoqEclKbEUdyLi4uw9HSG_sTjG2hp_JE,867
|
82
|
-
fractal_server/migrations/versions/d4fe3708d309_make_applyworkflow_workflow_dump_non_.py,sha256=6cHEZFuTXiQg9yu32Y3RH1XAl71av141WQ6UMbiITIg,949
|
83
|
-
fractal_server/migrations/versions/e75cac726012_make_applyworkflow_start_timestamp_not_.py,sha256=lOggSvzGWqQvnxxFuSM6W50Ui49R918A-uBuiZJ0pNM,963
|
84
|
-
fractal_server/migrations/versions/efa89c30e0a4_add_project_timestamp_created.py,sha256=jilQW3QIqYQ4Q6hCnUiG7UtNMpA41ujqrB3tPFiPM1Q,1221
|
85
|
-
fractal_server/migrations/versions/f384e1c0cf5d_drop_task_default_args_columns.py,sha256=9BwqUS9Gf7UW_KjrzHbtViC880qhD452KAytkHWWZyk,746
|
86
|
-
fractal_server/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
87
|
-
fractal_server/syringe.py,sha256=3qSMW3YaMKKnLdgnooAINOPxnCOxP7y2jeAQYB21Gdo,2786
|
88
|
-
fractal_server/tasks/_TaskCollectPip.py,sha256=Y1YPu0YB0z5abmwyWvBhFVIkP8ORv6lxihg8Q5zsY9I,3765
|
89
|
-
fractal_server/tasks/__init__.py,sha256=k5bhaUOXRrSQSik_riqTDQlWgNHzHMR92AIwmyBrIlw,176
|
90
|
-
fractal_server/tasks/background_operations.py,sha256=GiDIE4s3tVkjJbUle7rSzQsldiFnABes8Vm2zii1WdY,12744
|
91
|
-
fractal_server/tasks/endpoint_operations.py,sha256=PC94y_sNajyGxNFsgxNGB8FDZF8MuCxquL6l63FJeY4,5549
|
92
|
-
fractal_server/tasks/utils.py,sha256=-j8T1VBbjTt5fjP2XdIcs0nBwSkYyuv_yLI1troBg9Q,2274
|
93
|
-
fractal_server/utils.py,sha256=b7WwFdcFZ8unyT65mloFToYuEDXpQoHRcmRNqrhd_dQ,2115
|
94
|
-
fractal_server-1.4.10.dist-info/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
|
95
|
-
fractal_server-1.4.10.dist-info/METADATA,sha256=41I4kYdxw0cQH-Zqq3M1cb7OpSjKIpX533-QLTHhQzQ,4204
|
96
|
-
fractal_server-1.4.10.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
|
97
|
-
fractal_server-1.4.10.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
|
98
|
-
fractal_server-1.4.10.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|