fractal-server 2.15.9__py3-none-any.whl → 2.15.10a0__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/v2/job.py +1 -0
- fractal_server/app/models/v2/task_group.py +44 -18
- fractal_server/app/routes/api/v2/task_collection.py +19 -8
- fractal_server/app/runner/executors/base_runner.py +2 -0
- fractal_server/app/runner/executors/slurm_common/base_slurm_runner.py +57 -0
- fractal_server/app/runner/v2/runner.py +9 -1
- fractal_server/app/schemas/v2/dumps.py +2 -1
- fractal_server/app/schemas/v2/job.py +1 -0
- fractal_server/app/schemas/v2/task_collection.py +17 -7
- fractal_server/app/schemas/v2/task_group.py +4 -2
- fractal_server/migrations/versions/0f5f85bb2ae7_add_pre_pinned_packages.py +39 -0
- fractal_server/migrations/versions/1a83a5260664_rename.py +31 -0
- fractal_server/migrations/versions/981d588fe248_add_executor_error_log.py +39 -0
- fractal_server/tasks/v2/templates/2_pip_install.sh +20 -7
- fractal_server/tasks/v2/utils_templates.py +6 -2
- {fractal_server-2.15.9.dist-info → fractal_server-2.15.10a0.dist-info}/METADATA +1 -1
- {fractal_server-2.15.9.dist-info → fractal_server-2.15.10a0.dist-info}/RECORD +21 -18
- {fractal_server-2.15.9.dist-info → fractal_server-2.15.10a0.dist-info}/LICENSE +0 -0
- {fractal_server-2.15.9.dist-info → fractal_server-2.15.10a0.dist-info}/WHEEL +0 -0
- {fractal_server-2.15.9.dist-info → fractal_server-2.15.10a0.dist-info}/entry_points.txt +0 -0
fractal_server/__init__.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__VERSION__ = "2.15.
|
|
1
|
+
__VERSION__ = "2.15.10a0"
|
|
@@ -55,6 +55,7 @@ class JobV2(SQLModel, table=True):
|
|
|
55
55
|
)
|
|
56
56
|
status: str = JobStatusTypeV2.SUBMITTED
|
|
57
57
|
log: str | None = None
|
|
58
|
+
executor_error_log: str | None = None
|
|
58
59
|
|
|
59
60
|
attribute_filters: AttributeFilters = Field(
|
|
60
61
|
sa_column=Column(JSONB, nullable=False, server_default="{}")
|
|
@@ -12,6 +12,24 @@ from .task import TaskV2
|
|
|
12
12
|
from fractal_server.utils import get_timestamp
|
|
13
13
|
|
|
14
14
|
|
|
15
|
+
def _check_origin_not_pixi(origin: str):
|
|
16
|
+
"""
|
|
17
|
+
Raise `ValueError` if `origin=="pixi"`
|
|
18
|
+
"""
|
|
19
|
+
if origin == "pixi":
|
|
20
|
+
raise ValueError(f"Cannot call 'pip_install_string' if {origin=}.")
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _create_dependency_string(pinned_versions: dict[str, str]) -> str:
|
|
24
|
+
"""
|
|
25
|
+
Expand e.g. `{"a": "1.2", "b": "3"}` into `"a==1.2 b==3"`.
|
|
26
|
+
"""
|
|
27
|
+
output = " ".join(
|
|
28
|
+
[f"{key}=={value}" for key, value in pinned_versions.items()]
|
|
29
|
+
)
|
|
30
|
+
return output
|
|
31
|
+
|
|
32
|
+
|
|
15
33
|
class TaskGroupV2(SQLModel, table=True):
|
|
16
34
|
id: int | None = Field(default=None, primary_key=True)
|
|
17
35
|
task_list: list[TaskV2] = Relationship(
|
|
@@ -33,7 +51,15 @@ class TaskGroupV2(SQLModel, table=True):
|
|
|
33
51
|
path: str | None = None
|
|
34
52
|
archive_path: str | None = None
|
|
35
53
|
pip_extras: str | None = None
|
|
36
|
-
|
|
54
|
+
pinned_package_versions_pre: dict[str, str] = Field(
|
|
55
|
+
sa_column=Column(
|
|
56
|
+
JSONB,
|
|
57
|
+
server_default="{}",
|
|
58
|
+
default={},
|
|
59
|
+
nullable=True,
|
|
60
|
+
),
|
|
61
|
+
)
|
|
62
|
+
pinned_package_versions_post: dict[str, str] = Field(
|
|
37
63
|
sa_column=Column(
|
|
38
64
|
JSONB,
|
|
39
65
|
server_default="{}",
|
|
@@ -67,10 +93,7 @@ class TaskGroupV2(SQLModel, table=True):
|
|
|
67
93
|
"""
|
|
68
94
|
Prepare string to be used in `python -m pip install`.
|
|
69
95
|
"""
|
|
70
|
-
|
|
71
|
-
raise ValueError(
|
|
72
|
-
f"Cannot call 'pip_install_string' if {self.origin=}."
|
|
73
|
-
)
|
|
96
|
+
_check_origin_not_pixi(self.origin)
|
|
74
97
|
|
|
75
98
|
extras = f"[{self.pip_extras}]" if self.pip_extras is not None else ""
|
|
76
99
|
|
|
@@ -85,24 +108,27 @@ class TaskGroupV2(SQLModel, table=True):
|
|
|
85
108
|
return f"{self.pkg_name}{extras}=={self.version}"
|
|
86
109
|
|
|
87
110
|
@property
|
|
88
|
-
def
|
|
111
|
+
def pinned_package_versions_pre_string(self) -> str:
|
|
112
|
+
"""
|
|
113
|
+
Prepare string to be used in `python -m pip install`.
|
|
114
|
+
"""
|
|
115
|
+
_check_origin_not_pixi(self.origin)
|
|
116
|
+
|
|
117
|
+
if self.pinned_package_versions_pre is None:
|
|
118
|
+
return ""
|
|
119
|
+
output = _create_dependency_string(self.pinned_package_versions_pre)
|
|
120
|
+
return output
|
|
121
|
+
|
|
122
|
+
@property
|
|
123
|
+
def pinned_package_versions_post_string(self) -> str:
|
|
89
124
|
"""
|
|
90
125
|
Prepare string to be used in `python -m pip install`.
|
|
91
126
|
"""
|
|
92
|
-
|
|
93
|
-
raise ValueError(
|
|
94
|
-
"Cannot call 'pinned_package_versions_string' if "
|
|
95
|
-
f"{self.origin=}."
|
|
96
|
-
)
|
|
127
|
+
_check_origin_not_pixi(self.origin)
|
|
97
128
|
|
|
98
|
-
if self.
|
|
129
|
+
if self.pinned_package_versions_post is None:
|
|
99
130
|
return ""
|
|
100
|
-
output =
|
|
101
|
-
[
|
|
102
|
-
f"{key}=={value}"
|
|
103
|
-
for key, value in self.pinned_package_versions.items()
|
|
104
|
-
]
|
|
105
|
-
)
|
|
131
|
+
output = _create_dependency_string(self.pinned_package_versions_post)
|
|
106
132
|
return output
|
|
107
133
|
|
|
108
134
|
|
|
@@ -108,7 +108,8 @@ def parse_request_data(
|
|
|
108
108
|
package_version: str | None = Form(None),
|
|
109
109
|
package_extras: str | None = Form(None),
|
|
110
110
|
python_version: str | None = Form(None),
|
|
111
|
-
|
|
111
|
+
pinned_package_versions_pre: str | None = Form(None),
|
|
112
|
+
pinned_package_versions_post: str | None = Form(None),
|
|
112
113
|
file: UploadFile | None = File(None),
|
|
113
114
|
) -> CollectionRequestData:
|
|
114
115
|
"""
|
|
@@ -117,9 +118,14 @@ def parse_request_data(
|
|
|
117
118
|
|
|
118
119
|
try:
|
|
119
120
|
# Convert dict_pinned_pkg from a JSON string into a Python dictionary
|
|
120
|
-
|
|
121
|
-
json.loads(
|
|
122
|
-
if
|
|
121
|
+
dict_pinned_pkg_pre = (
|
|
122
|
+
json.loads(pinned_package_versions_pre)
|
|
123
|
+
if pinned_package_versions_pre
|
|
124
|
+
else None
|
|
125
|
+
)
|
|
126
|
+
dict_pinned_pkg_post = (
|
|
127
|
+
json.loads(pinned_package_versions_post)
|
|
128
|
+
if pinned_package_versions_post
|
|
123
129
|
else None
|
|
124
130
|
)
|
|
125
131
|
# Validate and coerce form data
|
|
@@ -128,7 +134,8 @@ def parse_request_data(
|
|
|
128
134
|
package_version=package_version,
|
|
129
135
|
package_extras=package_extras,
|
|
130
136
|
python_version=python_version,
|
|
131
|
-
|
|
137
|
+
pinned_package_versions_pre=dict_pinned_pkg_pre,
|
|
138
|
+
pinned_package_versions_post=dict_pinned_pkg_post,
|
|
132
139
|
)
|
|
133
140
|
|
|
134
141
|
data = CollectionRequestData(
|
|
@@ -198,10 +205,14 @@ async def collect_tasks_pip(
|
|
|
198
205
|
task_group_attrs["pip_extras"] = task_collect.package_extras
|
|
199
206
|
|
|
200
207
|
# Set pinned_package_versions
|
|
201
|
-
if task_collect.
|
|
208
|
+
if task_collect.pinned_package_versions_pre is not None:
|
|
209
|
+
task_group_attrs[
|
|
210
|
+
"pinned_package_versions_pre"
|
|
211
|
+
] = task_collect.pinned_package_versions_pre
|
|
212
|
+
if task_collect.pinned_package_versions_post is not None:
|
|
202
213
|
task_group_attrs[
|
|
203
|
-
"
|
|
204
|
-
] = task_collect.
|
|
214
|
+
"pinned_package_versions_post"
|
|
215
|
+
] = task_collect.pinned_package_versions_post
|
|
205
216
|
|
|
206
217
|
# Initialize wheel_file_content as None
|
|
207
218
|
wheel_file = None
|
|
@@ -517,6 +517,48 @@ class BaseSlurmRunner(BaseRunner):
|
|
|
517
517
|
Path(task.input_file_local).unlink(missing_ok=True)
|
|
518
518
|
Path(task.output_file_local).unlink(missing_ok=True)
|
|
519
519
|
|
|
520
|
+
def _extract_slurm_error(self, slurm_job: SlurmJob) -> str | None:
|
|
521
|
+
"""
|
|
522
|
+
Extract stderr of SLURM job, or `None`.
|
|
523
|
+
|
|
524
|
+
Note: this method reads the _local_ stderr file, and then it should
|
|
525
|
+
always be called _after_ fetching remote artifacts (e.g. in an SSH
|
|
526
|
+
deployment).
|
|
527
|
+
"""
|
|
528
|
+
|
|
529
|
+
stderr_path = slurm_job.slurm_stderr_local_path
|
|
530
|
+
|
|
531
|
+
if not stderr_path.exists():
|
|
532
|
+
return None
|
|
533
|
+
|
|
534
|
+
try:
|
|
535
|
+
with open(stderr_path) as f:
|
|
536
|
+
stderr_content = f.read().strip()
|
|
537
|
+
if stderr_content:
|
|
538
|
+
return stderr_content
|
|
539
|
+
except Exception as e:
|
|
540
|
+
logger.error(f"Failed to read SLURM stderr file: {e}")
|
|
541
|
+
|
|
542
|
+
return None
|
|
543
|
+
|
|
544
|
+
def _set_executor_error_log(self, slurm_jobs: list[SlurmJob]) -> None:
|
|
545
|
+
"""
|
|
546
|
+
If `executor_error_log` is unset, update it based on a list of jobs.
|
|
547
|
+
|
|
548
|
+
Notes:
|
|
549
|
+
1. This method must be executed **after** `_fetch_artifacts`.
|
|
550
|
+
2. This method only captures the first error it finds.
|
|
551
|
+
"""
|
|
552
|
+
if self.executor_error_log is not None:
|
|
553
|
+
# `executor_error_log` is already set, exit
|
|
554
|
+
return
|
|
555
|
+
for slurm_job in slurm_jobs:
|
|
556
|
+
slurm_error = self._extract_slurm_error(slurm_job)
|
|
557
|
+
if slurm_error is not None:
|
|
558
|
+
logger.warning(f"SLURM error detected: {slurm_error}")
|
|
559
|
+
self.executor_error_log = slurm_error
|
|
560
|
+
return
|
|
561
|
+
|
|
520
562
|
def is_shutdown(self) -> bool:
|
|
521
563
|
return self.shutdown_file.exists()
|
|
522
564
|
|
|
@@ -573,6 +615,9 @@ class BaseSlurmRunner(BaseRunner):
|
|
|
573
615
|
) -> tuple[Any, Exception]:
|
|
574
616
|
logger.debug("[submit] START")
|
|
575
617
|
|
|
618
|
+
# Always refresh `executor_error_log` before starting a task
|
|
619
|
+
self.executor_error_log = None
|
|
620
|
+
|
|
576
621
|
config = self._enrich_slurm_config(config)
|
|
577
622
|
|
|
578
623
|
try:
|
|
@@ -658,7 +703,12 @@ class BaseSlurmRunner(BaseRunner):
|
|
|
658
703
|
self.jobs[_slurm_job_id]
|
|
659
704
|
for _slurm_job_id in finished_job_ids
|
|
660
705
|
]
|
|
706
|
+
|
|
661
707
|
self._fetch_artifacts(finished_jobs)
|
|
708
|
+
|
|
709
|
+
# Extract SLURM errors
|
|
710
|
+
self._set_executor_error_log(finished_jobs)
|
|
711
|
+
|
|
662
712
|
with next(get_sync_db()) as db:
|
|
663
713
|
for slurm_job_id in finished_job_ids:
|
|
664
714
|
logger.debug(f"[submit] Now process {slurm_job_id=}")
|
|
@@ -724,6 +774,9 @@ class BaseSlurmRunner(BaseRunner):
|
|
|
724
774
|
input images, while for compound tasks these can differ.
|
|
725
775
|
"""
|
|
726
776
|
|
|
777
|
+
# Always refresh `executor_error_log` before starting a task
|
|
778
|
+
self.executor_error_log = None
|
|
779
|
+
|
|
727
780
|
config = self._enrich_slurm_config(config)
|
|
728
781
|
|
|
729
782
|
logger.debug(f"[multisubmit] START, {len(list_parameters)=}")
|
|
@@ -868,6 +921,7 @@ class BaseSlurmRunner(BaseRunner):
|
|
|
868
921
|
finished_jobs = [
|
|
869
922
|
self.jobs[_slurm_job_id] for _slurm_job_id in finished_job_ids
|
|
870
923
|
]
|
|
924
|
+
|
|
871
925
|
fetch_artifacts_exception = None
|
|
872
926
|
try:
|
|
873
927
|
self._fetch_artifacts(finished_jobs)
|
|
@@ -879,6 +933,9 @@ class BaseSlurmRunner(BaseRunner):
|
|
|
879
933
|
)
|
|
880
934
|
fetch_artifacts_exception = e
|
|
881
935
|
|
|
936
|
+
# Extract SLURM errors
|
|
937
|
+
self._set_executor_error_log(finished_jobs)
|
|
938
|
+
|
|
882
939
|
with next(get_sync_db()) as db:
|
|
883
940
|
for slurm_job_id in finished_job_ids:
|
|
884
941
|
logger.debug(f"[multisubmit] Now process {slurm_job_id=}")
|
|
@@ -22,6 +22,7 @@ from fractal_server.app.models.v2 import DatasetV2
|
|
|
22
22
|
from fractal_server.app.models.v2 import HistoryImageCache
|
|
23
23
|
from fractal_server.app.models.v2 import HistoryRun
|
|
24
24
|
from fractal_server.app.models.v2 import HistoryUnit
|
|
25
|
+
from fractal_server.app.models.v2 import JobV2
|
|
25
26
|
from fractal_server.app.models.v2 import TaskGroupV2
|
|
26
27
|
from fractal_server.app.models.v2 import WorkflowTaskV2
|
|
27
28
|
from fractal_server.app.runner.exceptions import JobExecutionError
|
|
@@ -210,8 +211,8 @@ def execute_tasks_v2(
|
|
|
210
211
|
get_runner_config=get_runner_config,
|
|
211
212
|
history_run_id=history_run_id,
|
|
212
213
|
dataset_id=dataset.id,
|
|
213
|
-
user_id=user_id,
|
|
214
214
|
task_type=task.type,
|
|
215
|
+
user_id=user_id,
|
|
215
216
|
)
|
|
216
217
|
elif task.type == TaskType.PARALLEL:
|
|
217
218
|
outcomes_dict, num_tasks = run_v2_task_parallel(
|
|
@@ -255,6 +256,13 @@ def execute_tasks_v2(
|
|
|
255
256
|
}
|
|
256
257
|
num_tasks = 0
|
|
257
258
|
|
|
259
|
+
# Store the SLURM error in the job database
|
|
260
|
+
with next(get_sync_db()) as db:
|
|
261
|
+
job_db = db.get(JobV2, job_id)
|
|
262
|
+
job_db.executor_error_log = runner.executor_error_log
|
|
263
|
+
db.merge(job_db)
|
|
264
|
+
db.commit()
|
|
265
|
+
|
|
258
266
|
# POST TASK EXECUTION
|
|
259
267
|
try:
|
|
260
268
|
non_failed_task_outputs = [
|
|
@@ -82,7 +82,8 @@ class TaskGroupDumpV2(BaseModel):
|
|
|
82
82
|
version: str | None = None
|
|
83
83
|
python_version: str | None = None
|
|
84
84
|
pip_extras: str | None = None
|
|
85
|
-
|
|
85
|
+
pinned_package_versions_pre: dict[str, str] = Field(default_factory=dict)
|
|
86
|
+
pinned_package_versions_post: dict[str, str] = Field(default_factory=dict)
|
|
86
87
|
|
|
87
88
|
path: str | None = None
|
|
88
89
|
venv_path: str | None = None
|
|
@@ -79,6 +79,7 @@ class JobReadV2(BaseModel):
|
|
|
79
79
|
end_timestamp: AwareDatetime | None = None
|
|
80
80
|
status: str
|
|
81
81
|
log: str | None = None
|
|
82
|
+
executor_error_log: str | None = None
|
|
82
83
|
working_dir: str | None = None
|
|
83
84
|
working_dir_user: str | None = None
|
|
84
85
|
first_task_index: int | None = None
|
|
@@ -39,10 +39,12 @@ class TaskCollectPipV2(BaseModel):
|
|
|
39
39
|
package_version: Version of the package
|
|
40
40
|
package_extras: Package extras to include in the `pip install` command
|
|
41
41
|
python_version: Python version to install and run the package tasks
|
|
42
|
-
|
|
43
|
-
dictionary 'package':'version' used to pin versions for
|
|
44
|
-
packages.
|
|
45
|
-
|
|
42
|
+
pinned_package_versions_pre:
|
|
43
|
+
dictionary 'package':'version' used to pre-pin versions for
|
|
44
|
+
specific packages.
|
|
45
|
+
pinned_package_versions_post:
|
|
46
|
+
dictionary 'package':'version' used to post-pin versions for
|
|
47
|
+
specific packages.
|
|
46
48
|
"""
|
|
47
49
|
|
|
48
50
|
model_config = ConfigDict(extra="forbid")
|
|
@@ -52,10 +54,14 @@ class TaskCollectPipV2(BaseModel):
|
|
|
52
54
|
python_version: Literal[
|
|
53
55
|
"3.9", "3.10", "3.11", "3.12", "3.13"
|
|
54
56
|
] | None = None
|
|
55
|
-
|
|
57
|
+
pinned_package_versions_pre: DictStrStr | None = None
|
|
58
|
+
pinned_package_versions_post: DictStrStr | None = None
|
|
56
59
|
|
|
57
60
|
@field_validator(
|
|
58
|
-
"package",
|
|
61
|
+
"package",
|
|
62
|
+
"package_version",
|
|
63
|
+
"package_extras",
|
|
64
|
+
mode="after",
|
|
59
65
|
)
|
|
60
66
|
@classmethod
|
|
61
67
|
def validate_commands(cls, value):
|
|
@@ -63,7 +69,11 @@ class TaskCollectPipV2(BaseModel):
|
|
|
63
69
|
validate_cmd(value)
|
|
64
70
|
return value
|
|
65
71
|
|
|
66
|
-
@field_validator(
|
|
72
|
+
@field_validator(
|
|
73
|
+
"pinned_package_versions_pre",
|
|
74
|
+
"pinned_package_versions_post",
|
|
75
|
+
mode="after",
|
|
76
|
+
)
|
|
67
77
|
@classmethod
|
|
68
78
|
def validate_pinned_package_versions(cls, value):
|
|
69
79
|
if value is not None:
|
|
@@ -48,7 +48,8 @@ class TaskGroupCreateV2(BaseModel):
|
|
|
48
48
|
archive_path: AbsolutePathStr = None
|
|
49
49
|
pip_extras: NonEmptyStr = None
|
|
50
50
|
env_info: str | None = None
|
|
51
|
-
|
|
51
|
+
pinned_package_versions_pre: DictStrStr = Field(default_factory=dict)
|
|
52
|
+
pinned_package_versions_post: DictStrStr = Field(default_factory=dict)
|
|
52
53
|
|
|
53
54
|
|
|
54
55
|
class TaskGroupCreateV2Strict(TaskGroupCreateV2):
|
|
@@ -78,7 +79,8 @@ class TaskGroupReadV2(BaseModel):
|
|
|
78
79
|
venv_path: str | None = None
|
|
79
80
|
archive_path: str | None = None
|
|
80
81
|
pip_extras: str | None = None
|
|
81
|
-
|
|
82
|
+
pinned_package_versions_pre: dict[str, str] = Field(default_factory=dict)
|
|
83
|
+
pinned_package_versions_post: dict[str, str] = Field(default_factory=dict)
|
|
82
84
|
|
|
83
85
|
venv_size_in_kB: int | None = None
|
|
84
86
|
venv_file_number: int | None = None
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"""Add pre-pinned packages
|
|
2
|
+
|
|
3
|
+
Revision ID: 0f5f85bb2ae7
|
|
4
|
+
Revises: 1a83a5260664
|
|
5
|
+
Create Date: 2025-09-10 14:36:06.028179
|
|
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 = "0f5f85bb2ae7"
|
|
14
|
+
down_revision = "1a83a5260664"
|
|
15
|
+
branch_labels = None
|
|
16
|
+
depends_on = None
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def upgrade() -> None:
|
|
20
|
+
# ### commands auto generated by Alembic - please adjust! ###
|
|
21
|
+
with op.batch_alter_table("taskgroupv2", schema=None) as batch_op:
|
|
22
|
+
batch_op.add_column(
|
|
23
|
+
sa.Column(
|
|
24
|
+
"pinned_package_versions_pre",
|
|
25
|
+
postgresql.JSONB(astext_type=sa.Text()),
|
|
26
|
+
server_default="{}",
|
|
27
|
+
nullable=True,
|
|
28
|
+
)
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
# ### end Alembic commands ###
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def downgrade() -> None:
|
|
35
|
+
# ### commands auto generated by Alembic - please adjust! ###
|
|
36
|
+
with op.batch_alter_table("taskgroupv2", schema=None) as batch_op:
|
|
37
|
+
batch_op.drop_column("pinned_package_versions_pre")
|
|
38
|
+
|
|
39
|
+
# ### end Alembic commands ###
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"""Rename `pinned_package_versions`
|
|
2
|
+
|
|
3
|
+
Revision ID: 1a83a5260664
|
|
4
|
+
Revises: b3ffb095f973
|
|
5
|
+
Create Date: 2025-09-10 14:16:51.202765
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
from alembic import op
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
# revision identifiers, used by Alembic.
|
|
12
|
+
revision = "1a83a5260664"
|
|
13
|
+
down_revision = "b3ffb095f973"
|
|
14
|
+
branch_labels = None
|
|
15
|
+
depends_on = None
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def upgrade() -> None:
|
|
19
|
+
with op.batch_alter_table("taskgroupv2", schema=None) as batch_op:
|
|
20
|
+
batch_op.alter_column(
|
|
21
|
+
column_name="pinned_package_versions",
|
|
22
|
+
new_column_name="pinned_package_versions_post",
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def downgrade() -> None:
|
|
27
|
+
with op.batch_alter_table("taskgroupv2", schema=None) as batch_op:
|
|
28
|
+
batch_op.alter_column(
|
|
29
|
+
column_name="pinned_package_versions_post",
|
|
30
|
+
new_column_name="pinned_package_versions",
|
|
31
|
+
)
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"""Add executor error log
|
|
2
|
+
|
|
3
|
+
Revision ID: 981d588fe248
|
|
4
|
+
Revises: 0f5f85bb2ae7
|
|
5
|
+
Create Date: 2025-09-15 08:31:10.363449
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
import sqlalchemy as sa
|
|
9
|
+
import sqlmodel
|
|
10
|
+
from alembic import op
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
# revision identifiers, used by Alembic.
|
|
14
|
+
revision = "981d588fe248"
|
|
15
|
+
down_revision = "0f5f85bb2ae7"
|
|
16
|
+
branch_labels = None
|
|
17
|
+
depends_on = None
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def upgrade() -> None:
|
|
21
|
+
# ### commands auto generated by Alembic - please adjust! ###
|
|
22
|
+
with op.batch_alter_table("jobv2", schema=None) as batch_op:
|
|
23
|
+
batch_op.add_column(
|
|
24
|
+
sa.Column(
|
|
25
|
+
"executor_error_log",
|
|
26
|
+
sqlmodel.sql.sqltypes.AutoString(),
|
|
27
|
+
nullable=True,
|
|
28
|
+
)
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
# ### end Alembic commands ###
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def downgrade() -> None:
|
|
35
|
+
# ### commands auto generated by Alembic - please adjust! ###
|
|
36
|
+
with op.batch_alter_table("jobv2", schema=None) as batch_op:
|
|
37
|
+
batch_op.drop_column("executor_error_log")
|
|
38
|
+
|
|
39
|
+
# ### end Alembic commands ###
|
|
@@ -8,7 +8,8 @@ write_log(){
|
|
|
8
8
|
# Variables to be filled within fractal-server
|
|
9
9
|
PACKAGE_ENV_DIR=__PACKAGE_ENV_DIR__
|
|
10
10
|
INSTALL_STRING="__INSTALL_STRING__"
|
|
11
|
-
|
|
11
|
+
PINNED_PACKAGE_LIST_PRE="__PINNED_PACKAGE_LIST_PRE__"
|
|
12
|
+
PINNED_PACKAGE_LIST_POST="__PINNED_PACKAGE_LIST_POST__"
|
|
12
13
|
FRACTAL_MAX_PIP_VERSION="__FRACTAL_MAX_PIP_VERSION__"
|
|
13
14
|
FRACTAL_PIP_CACHE_DIR_ARG="__FRACTAL_PIP_CACHE_DIR_ARG__"
|
|
14
15
|
|
|
@@ -23,20 +24,32 @@ write_log "START upgrade pip and install setuptools"
|
|
|
23
24
|
write_log "END upgrade pip and install setuptools"
|
|
24
25
|
echo
|
|
25
26
|
|
|
27
|
+
|
|
28
|
+
# Install pre-pinned packages (note: do not quote $PINNED_PACKAGE_LIST_PRE since it could be e.g. "numpy==1.2.3 torch=3.2.1")
|
|
29
|
+
if [ "$PINNED_PACKAGE_LIST_PRE" != "" ]; then
|
|
30
|
+
write_log "START install with PINNED_PACKAGE_LIST_PRE=${PINNED_PACKAGE_LIST_PRE}"
|
|
31
|
+
"$VENVPYTHON" -m pip install ${FRACTAL_PIP_CACHE_DIR_ARG} $PINNED_PACKAGE_LIST_PRE
|
|
32
|
+
write_log "END install with PINNED_PACKAGE_LIST_PRE=${PINNED_PACKAGE_LIST_PRE}"
|
|
33
|
+
echo
|
|
34
|
+
else
|
|
35
|
+
write_log "SKIP installing pre-pinned versions $PINNED_PACKAGE_LIST_PRE (empty list)"
|
|
36
|
+
fi
|
|
37
|
+
|
|
38
|
+
|
|
26
39
|
# Install package
|
|
27
40
|
write_log "START install with INSTALL_STRING=${INSTALL_STRING}"
|
|
28
41
|
"$VENVPYTHON" -m pip install ${FRACTAL_PIP_CACHE_DIR_ARG} "$INSTALL_STRING"
|
|
29
42
|
write_log "END install with INSTALL_STRING=${INSTALL_STRING}"
|
|
30
43
|
echo
|
|
31
44
|
|
|
32
|
-
# Install pinned packages (note: do not quote $
|
|
33
|
-
if [ "$
|
|
34
|
-
write_log "START install with
|
|
35
|
-
"$VENVPYTHON" -m pip install ${FRACTAL_PIP_CACHE_DIR_ARG} $
|
|
36
|
-
write_log "END install with
|
|
45
|
+
# Install post-pinned packages (note: do not quote $PINNED_PACKAGE_LIST_POST since it could be e.g. "numpy==1.2.3 torch=3.2.1")
|
|
46
|
+
if [ "$PINNED_PACKAGE_LIST_POST" != "" ]; then
|
|
47
|
+
write_log "START install with PINNED_PACKAGE_LIST_POST=${PINNED_PACKAGE_LIST_POST}"
|
|
48
|
+
"$VENVPYTHON" -m pip install ${FRACTAL_PIP_CACHE_DIR_ARG} $PINNED_PACKAGE_LIST_POST
|
|
49
|
+
write_log "END install with PINNED_PACKAGE_LIST_POST=${PINNED_PACKAGE_LIST_POST}"
|
|
37
50
|
echo
|
|
38
51
|
else
|
|
39
|
-
write_log "SKIP installing pinned versions $
|
|
52
|
+
write_log "SKIP installing post-pinned versions $PINNED_PACKAGE_LIST_POST (empty list)"
|
|
40
53
|
fi
|
|
41
54
|
|
|
42
55
|
# End
|
|
@@ -99,8 +99,12 @@ def get_collection_replacements(
|
|
|
99
99
|
),
|
|
100
100
|
("__FRACTAL_PIP_CACHE_DIR_ARG__", settings.PIP_CACHE_DIR_ARG),
|
|
101
101
|
(
|
|
102
|
-
"
|
|
103
|
-
task_group.
|
|
102
|
+
"__PINNED_PACKAGE_LIST_PRE__",
|
|
103
|
+
task_group.pinned_package_versions_pre_string,
|
|
104
|
+
),
|
|
105
|
+
(
|
|
106
|
+
"__PINNED_PACKAGE_LIST_POST__",
|
|
107
|
+
task_group.pinned_package_versions_post_string,
|
|
104
108
|
),
|
|
105
109
|
]
|
|
106
110
|
logger.info(
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
fractal_server/__init__.py,sha256=
|
|
1
|
+
fractal_server/__init__.py,sha256=ZeYOB3HonBjDHE69pjAH9kiI5pyCycjD5zz9wrVQ4QA,26
|
|
2
2
|
fractal_server/__main__.py,sha256=rkM8xjY1KeS3l63irB8yCrlVobR-73uDapC4wvrIlxI,6957
|
|
3
3
|
fractal_server/alembic.ini,sha256=MWwi7GzjzawI9cCAK1LW7NxIBQDUqD12-ptJoq5JpP0,3153
|
|
4
4
|
fractal_server/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -12,10 +12,10 @@ fractal_server/app/models/v2/__init__.py,sha256=vjHwek7-IXmaZZL9VF0nD30YL9ca4wNc
|
|
|
12
12
|
fractal_server/app/models/v2/accounting.py,sha256=i-2TsjqyuclxFQ21C-TeDoss7ZBTRuXdzIJfVr2UxwE,1081
|
|
13
13
|
fractal_server/app/models/v2/dataset.py,sha256=P_zy4dPQAqrCALQ6737VkAFk1SvcgYjnslGUZhPI8sc,1226
|
|
14
14
|
fractal_server/app/models/v2/history.py,sha256=CBN2WVg9vW5pHU1RP8TkB_nnJrwnuifCcxgnd53UtEE,2163
|
|
15
|
-
fractal_server/app/models/v2/job.py,sha256=
|
|
15
|
+
fractal_server/app/models/v2/job.py,sha256=RsJY5B-HBOa2uMJYDefMbe8traBVIbwheAWk4H79EcU,2040
|
|
16
16
|
fractal_server/app/models/v2/project.py,sha256=XLna1SSKdywdDS3qfcVaGtafyVKMZq6CiLvHOe-AjhU,754
|
|
17
17
|
fractal_server/app/models/v2/task.py,sha256=iBIQB8POQE5MyKvLZhw7jZWlBhbrThzCDzRTcgiAczQ,1493
|
|
18
|
-
fractal_server/app/models/v2/task_group.py,sha256
|
|
18
|
+
fractal_server/app/models/v2/task_group.py,sha256=kMHvCROfQZ6Tl7iEOjM9sXQ0qvFSu6Kkg_5pKeP011Y,4590
|
|
19
19
|
fractal_server/app/models/v2/workflow.py,sha256=gBjDXO-RytVT81aAlesImBhmVHrwNUrmsF_UsGa1qLM,1057
|
|
20
20
|
fractal_server/app/models/v2/workflowtask.py,sha256=qkTc-hcFLpJUVsEUbnDq2BJL0qg9jagy2doZeusF1ek,1266
|
|
21
21
|
fractal_server/app/routes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -45,7 +45,7 @@ fractal_server/app/routes/api/v2/project.py,sha256=ldMEyjtwGpX2teu85sCNWaubDFlw-
|
|
|
45
45
|
fractal_server/app/routes/api/v2/status_legacy.py,sha256=ZckHeBy8y21cyQ_OLY-VmkapzMhd3g9ae-qg-r4-uVo,6317
|
|
46
46
|
fractal_server/app/routes/api/v2/submit.py,sha256=C9cLecHoVl_VXQFAHs2Y2LVE6S_v2PHpa-w5XQIaT-M,9174
|
|
47
47
|
fractal_server/app/routes/api/v2/task.py,sha256=WxkWRw-0fJkgmMt9fSDc6oikBFd6nSS-JdPwR0z24tg,7024
|
|
48
|
-
fractal_server/app/routes/api/v2/task_collection.py,sha256=
|
|
48
|
+
fractal_server/app/routes/api/v2/task_collection.py,sha256=Phb_ORpJ9J8oa1c75qcThJjOWSpv66qfwoePpoUQ_no,12738
|
|
49
49
|
fractal_server/app/routes/api/v2/task_collection_custom.py,sha256=j-vI1_FjoxU59VwkwUTYW5HhMVB5NObMkWLCjAKbers,6726
|
|
50
50
|
fractal_server/app/routes/api/v2/task_collection_pixi.py,sha256=1rCBfKANT9zcKcOVMQTByVpP8GjdrzeaMzyQT05k0nY,7517
|
|
51
51
|
fractal_server/app/routes/api/v2/task_group.py,sha256=DrXMc0D7IYqUsrlrpF5JO1zVKvx7RPdKPPOhz3FqqJE,9203
|
|
@@ -72,7 +72,7 @@ fractal_server/app/runner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJW
|
|
|
72
72
|
fractal_server/app/runner/components.py,sha256=-Ii5l8d_V6f5DFOd-Zsr8VYmOsyqw0Hox9fEFQiuqxY,66
|
|
73
73
|
fractal_server/app/runner/exceptions.py,sha256=lzYefT6IpA2ajcQUzm9kT9pTxRl5UGIJKyLs6v1JczA,1731
|
|
74
74
|
fractal_server/app/runner/executors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
75
|
-
fractal_server/app/runner/executors/base_runner.py,sha256=
|
|
75
|
+
fractal_server/app/runner/executors/base_runner.py,sha256=bznvlTrRPk_-ER9DrG8iRQI6bqKM66_uMd7VV5mIUhg,6069
|
|
76
76
|
fractal_server/app/runner/executors/call_command_wrapper.py,sha256=1BHl-zbXoX2oGUWGAFprVZMmg5QjutPH0-VZJSIC0II,1419
|
|
77
77
|
fractal_server/app/runner/executors/local/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
78
78
|
fractal_server/app/runner/executors/local/get_local_config.py,sha256=KBYOkcuwpSYl-ZIAwPBxpn59QSyFF8eJ-fLKVIhwwzA,3594
|
|
@@ -81,7 +81,7 @@ fractal_server/app/runner/executors/slurm_common/__init__.py,sha256=47DEQpj8HBSa
|
|
|
81
81
|
fractal_server/app/runner/executors/slurm_common/_batching.py,sha256=gbHZIxt90GjUwhB9_UInwVqpX-KdxRQMDeXzUagdL3U,8816
|
|
82
82
|
fractal_server/app/runner/executors/slurm_common/_job_states.py,sha256=nuV-Zba38kDrRESOVB3gaGbrSPZc4q7YGichQaeqTW0,238
|
|
83
83
|
fractal_server/app/runner/executors/slurm_common/_slurm_config.py,sha256=FI2p4yQ16571C_YM3Vs_tJnb71urVykwxfIXDXa79I8,15721
|
|
84
|
-
fractal_server/app/runner/executors/slurm_common/base_slurm_runner.py,sha256=
|
|
84
|
+
fractal_server/app/runner/executors/slurm_common/base_slurm_runner.py,sha256=7pI46LpmnbBzNKxsK0YC0Uv5YfyNwVYWA3dMuAoa_Lg,40020
|
|
85
85
|
fractal_server/app/runner/executors/slurm_common/get_slurm_config.py,sha256=KhQQJrGQZLX5u8fsMcIx7FN8jUKSGEeG68yO7Ay_LXg,7454
|
|
86
86
|
fractal_server/app/runner/executors/slurm_common/remote.py,sha256=LHK2Ram8X8q6jNSCxnnwKUwmSJMsyQyRem_VjH53qdw,3811
|
|
87
87
|
fractal_server/app/runner/executors/slurm_common/slurm_job_task_models.py,sha256=K4SdJOKsUWzDlnkb8Ug_UmTx6nBMsTqn9_oKqwE4XDI,3520
|
|
@@ -103,7 +103,7 @@ fractal_server/app/runner/v2/_slurm_sudo.py,sha256=Gvsh4tUlc1_3KdF3B7zEqs-YIntC_
|
|
|
103
103
|
fractal_server/app/runner/v2/db_tools.py,sha256=ozp4RFLB3LNI0rM0q0udi6ja8-5vooH_dVqrbmTPNDg,3323
|
|
104
104
|
fractal_server/app/runner/v2/deduplicate_list.py,sha256=IVTE4abBU1bUprFTkxrTfYKnvkNTanWQ-KWh_etiT08,645
|
|
105
105
|
fractal_server/app/runner/v2/merge_outputs.py,sha256=YOTKbGOM9s-uqY4KN2onoIxuHNm-v3hr5zv6Aa1KEtA,905
|
|
106
|
-
fractal_server/app/runner/v2/runner.py,sha256=
|
|
106
|
+
fractal_server/app/runner/v2/runner.py,sha256=3ueCWyYpDEMzakMwn_VLC1lEgUSEUqIGBfERpfqUTag,19297
|
|
107
107
|
fractal_server/app/runner/v2/runner_functions.py,sha256=xteoDSXKxStl3ABEXyjrggPiXdXAPy9sJPfT3B8CQ3Y,19050
|
|
108
108
|
fractal_server/app/runner/v2/submit_workflow.py,sha256=L6WqQC3Vm-tLe_CJXHIMbYLAeulAN2no_4HZD4cbhR0,12554
|
|
109
109
|
fractal_server/app/runner/v2/task_interface.py,sha256=BRSKpitGproY48JQdCbfrghbDonA-EqPP1yIopohpPo,2525
|
|
@@ -115,15 +115,15 @@ fractal_server/app/schemas/user_settings.py,sha256=NpdC0Me0fgwwdfJuTSlFLCnLUjiWW
|
|
|
115
115
|
fractal_server/app/schemas/v2/__init__.py,sha256=GqV6kJ0nKDq2vsSA4uph-nb5pmuaq013LUCcm9LbpLE,3097
|
|
116
116
|
fractal_server/app/schemas/v2/accounting.py,sha256=C_ekrYQwhi7PtrxxB07oVAG2y1NLigXjYwyp4E38fao,396
|
|
117
117
|
fractal_server/app/schemas/v2/dataset.py,sha256=NKCjBwGBC7mPiSlXktZAcleJsvlLY6KfNKw7Wx4Zfqk,1728
|
|
118
|
-
fractal_server/app/schemas/v2/dumps.py,sha256=
|
|
118
|
+
fractal_server/app/schemas/v2/dumps.py,sha256=LCYiNF_FNYiA6HYp5GyFao3IKRX0RpzgNpiX56IwgCE,2293
|
|
119
119
|
fractal_server/app/schemas/v2/history.py,sha256=pZiMKfh6nMWbTp5MUtrnGySPKbeRFf5tM1VLFaTgGcw,1784
|
|
120
|
-
fractal_server/app/schemas/v2/job.py,sha256=
|
|
120
|
+
fractal_server/app/schemas/v2/job.py,sha256=BuiNzAX2Kl-b7LJnAiqCGDC9h6bGEjKvsHQIgf5mjHQ,3330
|
|
121
121
|
fractal_server/app/schemas/v2/manifest.py,sha256=QUpXMDB8WkB1F4UK-yYmm3O8bXoHwDGURnqwn6ayO_I,6674
|
|
122
122
|
fractal_server/app/schemas/v2/project.py,sha256=7UC0aZLgtmkaAiPykeUj-9OZXhMkoyi3V-475UW_EQs,654
|
|
123
123
|
fractal_server/app/schemas/v2/status_legacy.py,sha256=eQT1zGxbkzSwd0EqclsOdZ60n1x6J3DB1CZ3m4LYyxc,955
|
|
124
124
|
fractal_server/app/schemas/v2/task.py,sha256=IJv8loB4kx9FBkaIHoiMsswQyq02FxvyAnHK1u074fU,4364
|
|
125
|
-
fractal_server/app/schemas/v2/task_collection.py,sha256=
|
|
126
|
-
fractal_server/app/schemas/v2/task_group.py,sha256=
|
|
125
|
+
fractal_server/app/schemas/v2/task_collection.py,sha256=BzHQXq2_zLZTbigWauOR5Zi-mlsqCIF2NEF_z12Nqxg,4480
|
|
126
|
+
fractal_server/app/schemas/v2/task_group.py,sha256=Gw_YK648PL1GuXyiYmB2b13pdt_3OBeEGCL3UuHGoTg,3393
|
|
127
127
|
fractal_server/app/schemas/v2/workflow.py,sha256=L-dW6SzCH_VNoH6ENip44lTgGGqVYHHBk_3PtM-Ooy8,1772
|
|
128
128
|
fractal_server/app/schemas/v2/workflowtask.py,sha256=6eweAMyziwaoMT-7R1fVJYunIeZKzT0-7fAVgPO_FEc,3639
|
|
129
129
|
fractal_server/app/security/__init__.py,sha256=oJ8RVglpOvWPQY4RokiE2YA72Nqo42dZEjywWTt8xr8,14032
|
|
@@ -145,7 +145,9 @@ fractal_server/migrations/env.py,sha256=nfyBpMIOT3kny6t-b-tUjyRjZ4k906bb1_wCQ7me
|
|
|
145
145
|
fractal_server/migrations/naming_convention.py,sha256=htbKrVdetx3pklowb_9Cdo5RqeF0fJ740DNecY5de_M,265
|
|
146
146
|
fractal_server/migrations/versions/034a469ec2eb_task_groups.py,sha256=vrPhC8hfFu1c4HmLHNZyCuqEfecFD8-bWc49bXMNes0,6199
|
|
147
147
|
fractal_server/migrations/versions/091b01f51f88_add_usergroup_and_linkusergroup_table.py,sha256=-BSS9AFTPcu3gYC-sYbawSy4MWQQx8TfMb5BW5EBKmQ,1450
|
|
148
|
+
fractal_server/migrations/versions/0f5f85bb2ae7_add_pre_pinned_packages.py,sha256=FxnIvfktnSjy2nBKDIow24on1nMkLw1THhO84FtNZSo,1055
|
|
148
149
|
fractal_server/migrations/versions/19eca0dd47a9_user_settings_project_dir.py,sha256=Q1Gj1cJ0UrdLBJ5AXfFK9QpxTtmcv-4Z3NEGDnxOme4,961
|
|
150
|
+
fractal_server/migrations/versions/1a83a5260664_rename.py,sha256=EkzTAjbJm7CfsLraIUbH9hkTj4M6XvmziVb4K9ZjKmQ,790
|
|
149
151
|
fractal_server/migrations/versions/1eac13a26c83_drop_v1_tables.py,sha256=7OW3HmqAePHx53OWdEPzNxvtupxSR0lB_6tZF1b3JIM,1604
|
|
150
152
|
fractal_server/migrations/versions/316140ff7ee1_remove_usersettings_cache_dir.py,sha256=lANgTox0rz459_yo1Rw7fGCT1qw5sUCUXTLUMc_Bzf8,911
|
|
151
153
|
fractal_server/migrations/versions/47351f8c7ebc_drop_dataset_filters.py,sha256=vePkVm1iUHiPNKLQ3KR7BBLdHruqBdl87j_tUCbMbEA,1414
|
|
@@ -163,6 +165,7 @@ fractal_server/migrations/versions/8f79bd162e35_add_docs_info_and_docs_link_to_t
|
|
|
163
165
|
fractal_server/migrations/versions/94a47ea2d3ff_remove_cache_dir_slurm_user_and_slurm_.py,sha256=yL3-Hvzw5jBLKj4LFP1z5ofZE9L9W3tLwYtPNW7z4ko,1508
|
|
164
166
|
fractal_server/migrations/versions/969d84257cac_add_historyrun_task_id.py,sha256=4nLSYEMp_Tm7VRfo8p9YKLHVnoizTXaPV6lfcfvWhj0,1143
|
|
165
167
|
fractal_server/migrations/versions/97f444d47249_add_applyworkflow_project_dump.py,sha256=eKTZm3EgUgapXBxO0RuHkEfTKic-TZG3ADaMpGLuc0k,1057
|
|
168
|
+
fractal_server/migrations/versions/981d588fe248_add_executor_error_log.py,sha256=p51lFxxpU-9vSdOHr_idkK3215NQsFD8oX9M6qRCASU,956
|
|
166
169
|
fractal_server/migrations/versions/99ea79d9e5d2_add_dataset_history.py,sha256=0im6TxDr53sKKcjiPgeH4ftVRGnRXZSh2lPbRQ1Ir9w,883
|
|
167
170
|
fractal_server/migrations/versions/9c5ae74c9b98_add_user_settings_table.py,sha256=syONdZNf4-OnAcWIsbzXpYwpXPsXZ4SsmjwVvmVG0PU,2256
|
|
168
171
|
fractal_server/migrations/versions/9db60297b8b2_set_ondelete.py,sha256=F0IdXk8vclViOGKe2SOHO3MsQsqe7SsZRSqz9cXhhrE,7928
|
|
@@ -208,7 +211,7 @@ fractal_server/tasks/v2/ssh/deactivate_pixi.py,sha256=K0yK_NPUqhFMj6cp6G_0Kfn0Yo
|
|
|
208
211
|
fractal_server/tasks/v2/ssh/reactivate.py,sha256=NJIgMNFKaXMhbvK0iZOsMwMtsms6Boj9f8N4L01X9Bo,8271
|
|
209
212
|
fractal_server/tasks/v2/ssh/reactivate_pixi.py,sha256=UOlG01wOv-eQCtUxSwphEY-Ey7OoUm5PMCSP9J-i1rY,10323
|
|
210
213
|
fractal_server/tasks/v2/templates/1_create_venv.sh,sha256=PK0jdHKtQpda1zULebBaVPORt4t6V17wa4N1ohcj5ac,548
|
|
211
|
-
fractal_server/tasks/v2/templates/2_pip_install.sh,sha256=
|
|
214
|
+
fractal_server/tasks/v2/templates/2_pip_install.sh,sha256=fabqylWdCZtI9YaD4QUvY5O_cRcVOrPkdFxHhvIWBO0,2297
|
|
212
215
|
fractal_server/tasks/v2/templates/3_pip_freeze.sh,sha256=JldREScEBI4cD_qjfX4UK7V4aI-FnX9ZvVNxgpSOBFc,168
|
|
213
216
|
fractal_server/tasks/v2/templates/4_pip_show.sh,sha256=qm1vPy6AkKhWDjCJGXS8LqCLYO3KsAyRK325ZsFcF6U,1747
|
|
214
217
|
fractal_server/tasks/v2/templates/5_get_venv_size_and_file_number.sh,sha256=q-6ZUvA6w6FDVEoSd9O63LaJ9tKZc7qAFH72SGPrd_k,284
|
|
@@ -221,7 +224,7 @@ fractal_server/tasks/v2/utils_database.py,sha256=yi7793Uue32O59OBVUgomO42oUrVKdS
|
|
|
221
224
|
fractal_server/tasks/v2/utils_package_names.py,sha256=RDg__xrvQs4ieeVzmVdMcEh95vGQYrv9Hfal-5EDBM8,2393
|
|
222
225
|
fractal_server/tasks/v2/utils_pixi.py,sha256=tqCnxMdxs7KGWncWvk0alrdvDbX-w77P3fAot68Bqh4,3257
|
|
223
226
|
fractal_server/tasks/v2/utils_python_interpreter.py,sha256=kF86UClk6HxghRLDYY4rKOXwnWGUYQfrNsVNxOmOGxM,964
|
|
224
|
-
fractal_server/tasks/v2/utils_templates.py,sha256=
|
|
227
|
+
fractal_server/tasks/v2/utils_templates.py,sha256=Ny-62q95NqgrzfS1UniijfeO8KUaEgyiNxWxRY2l2l8,3651
|
|
225
228
|
fractal_server/types/__init__.py,sha256=aA_8J1xXzuiLqpwO_Qf18-qzaRcYkHzevhH_T-diXWM,2026
|
|
226
229
|
fractal_server/types/validators/__init__.py,sha256=5uj6KJ9MelFZgyoq3MzXLhgWCl0yiriS7XKmb0gathg,392
|
|
227
230
|
fractal_server/types/validators/_common_validators.py,sha256=MpxyaP2kwgbyCTOaVRjYnJ74Lfi0f2X0q3rjX9w3vTk,1170
|
|
@@ -230,8 +233,8 @@ fractal_server/types/validators/_workflow_task_arguments_validators.py,sha256=HL
|
|
|
230
233
|
fractal_server/urls.py,sha256=QjIKAC1a46bCdiPMu3AlpgFbcv6a4l3ABcd5xz190Og,471
|
|
231
234
|
fractal_server/utils.py,sha256=Vn35lApt1T1J8nc09sAVqd10Cy0sa3dLipcljI-hkuk,2185
|
|
232
235
|
fractal_server/zip_tools.py,sha256=H0w7wS5yE4ebj7hw1_77YQ959dl2c-L0WX6J_ro1TY4,4884
|
|
233
|
-
fractal_server-2.15.
|
|
234
|
-
fractal_server-2.15.
|
|
235
|
-
fractal_server-2.15.
|
|
236
|
-
fractal_server-2.15.
|
|
237
|
-
fractal_server-2.15.
|
|
236
|
+
fractal_server-2.15.10a0.dist-info/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
|
|
237
|
+
fractal_server-2.15.10a0.dist-info/METADATA,sha256=RmShfyZgv2QeI_UbVOnSH0GAndEUmCUsyr5XuaWehGE,4337
|
|
238
|
+
fractal_server-2.15.10a0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
|
239
|
+
fractal_server-2.15.10a0.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
|
|
240
|
+
fractal_server-2.15.10a0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|