fractal-server 2.14.1__py3-none-any.whl → 2.14.2__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/routes/admin/v2/job.py +1 -1
- fractal_server/app/routes/api/v2/pre_submission_checks.py +8 -0
- fractal_server/app/routes/api/v2/status_legacy.py +2 -2
- fractal_server/app/routes/api/v2/task_collection_custom.py +22 -10
- fractal_server/app/runner/v2/runner.py +136 -113
- fractal_server/tasks/v2/local/collect.py +1 -1
- fractal_server/tasks/v2/local/deactivate.py +1 -1
- fractal_server/tasks/v2/local/reactivate.py +1 -1
- fractal_server/tasks/v2/ssh/collect.py +1 -1
- fractal_server/tasks/v2/ssh/deactivate.py +1 -1
- fractal_server/tasks/v2/ssh/reactivate.py +1 -1
- {fractal_server-2.14.1.dist-info → fractal_server-2.14.2.dist-info}/METADATA +1 -1
- {fractal_server-2.14.1.dist-info → fractal_server-2.14.2.dist-info}/RECORD +17 -17
- {fractal_server-2.14.1.dist-info → fractal_server-2.14.2.dist-info}/LICENSE +0 -0
- {fractal_server-2.14.1.dist-info → fractal_server-2.14.2.dist-info}/WHEEL +0 -0
- {fractal_server-2.14.1.dist-info → fractal_server-2.14.2.dist-info}/entry_points.txt +0 -0
fractal_server/__init__.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
__VERSION__ = "2.14.
|
1
|
+
__VERSION__ = "2.14.2"
|
@@ -154,7 +154,7 @@ async def update_job(
|
|
154
154
|
if job_update.status != JobStatusTypeV2.FAILED:
|
155
155
|
raise HTTPException(
|
156
156
|
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
157
|
-
detail=f"Cannot set job status to {job_update.status}",
|
157
|
+
detail=f"Cannot set job status to {job_update.status.value}",
|
158
158
|
)
|
159
159
|
|
160
160
|
setattr(job, "status", job_update.status)
|
@@ -98,11 +98,19 @@ async def check_workflowtask(
|
|
98
98
|
)
|
99
99
|
|
100
100
|
if db_workflow_task.order == 0:
|
101
|
+
# Skip check for first task in the workflow
|
101
102
|
return JSONResponse(status_code=200, content=[])
|
102
103
|
|
103
104
|
previous_wft = db_workflow.task_list[db_workflow_task.order - 1]
|
104
105
|
|
105
106
|
if previous_wft.task.output_types != {}:
|
107
|
+
# Skip check if previous task has non-trivial `output_types`
|
108
|
+
return JSONResponse(status_code=200, content=[])
|
109
|
+
elif previous_wft.task.type in [
|
110
|
+
"converter_compound",
|
111
|
+
"converter_non_parallel",
|
112
|
+
]:
|
113
|
+
# Skip check if previous task is converter
|
106
114
|
return JSONResponse(status_code=200, content=[])
|
107
115
|
|
108
116
|
res = await _get_dataset_check_owner(
|
@@ -118,8 +118,8 @@ async def get_workflowtask_status(
|
|
118
118
|
)
|
119
119
|
except ValueError:
|
120
120
|
logger.warning(
|
121
|
-
f"Job {running_job.id} is submitted but its task list does "
|
122
|
-
f"
|
121
|
+
f"Job {running_job.id} is submitted but its task list does not"
|
122
|
+
f" contain a {WorkflowTaskStatusTypeV2.SUBMITTED.value} task."
|
123
123
|
)
|
124
124
|
first_submitted_index = 0
|
125
125
|
|
@@ -1,3 +1,4 @@
|
|
1
|
+
import os
|
1
2
|
import shlex
|
2
3
|
import subprocess # nosec
|
3
4
|
from pathlib import Path
|
@@ -65,25 +66,36 @@ async def collect_task_custom(
|
|
65
66
|
detail="Cannot infer 'package_root' with 'slurm_ssh' backend.",
|
66
67
|
)
|
67
68
|
else:
|
68
|
-
if not
|
69
|
+
if not os.access(
|
70
|
+
task_collect.python_interpreter, os.X_OK
|
71
|
+
) or not os.access(task_collect.python_interpreter, os.R_OK):
|
69
72
|
raise HTTPException(
|
70
73
|
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
71
74
|
detail=(
|
72
75
|
f"{task_collect.python_interpreter=} "
|
73
|
-
"
|
76
|
+
"is not accessible to the Fractal user "
|
77
|
+
"or it is not executable."
|
74
78
|
),
|
75
79
|
)
|
76
|
-
if (
|
77
|
-
task_collect.package_root is not None
|
78
|
-
and not Path(task_collect.package_root).is_dir()
|
79
|
-
):
|
80
|
+
if not Path(task_collect.python_interpreter).is_file():
|
80
81
|
raise HTTPException(
|
81
82
|
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
82
|
-
detail=
|
83
|
-
f"{task_collect.package_root=} "
|
84
|
-
"doesn't exist or is not a directory."
|
85
|
-
),
|
83
|
+
detail=f"{task_collect.python_interpreter=} is not a file.",
|
86
84
|
)
|
85
|
+
if task_collect.package_root is not None:
|
86
|
+
if not os.access(task_collect.package_root, os.R_OK):
|
87
|
+
raise HTTPException(
|
88
|
+
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
89
|
+
detail=(
|
90
|
+
f"{task_collect.package_root=} "
|
91
|
+
"is not accessible to the Fractal user."
|
92
|
+
),
|
93
|
+
)
|
94
|
+
if not Path(task_collect.package_root).is_dir():
|
95
|
+
raise HTTPException(
|
96
|
+
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
97
|
+
detail=f"{task_collect.package_root=} is not a directory.",
|
98
|
+
)
|
87
99
|
|
88
100
|
if task_collect.package_root is None:
|
89
101
|
|
@@ -9,6 +9,7 @@ from typing import Optional
|
|
9
9
|
|
10
10
|
from sqlalchemy.orm.attributes import flag_modified
|
11
11
|
from sqlmodel import delete
|
12
|
+
from sqlmodel import update
|
12
13
|
|
13
14
|
from ....images import SingleImage
|
14
15
|
from ....images.tools import filter_image_list
|
@@ -25,6 +26,7 @@ from fractal_server.app.models.v2 import AccountingRecord
|
|
25
26
|
from fractal_server.app.models.v2 import DatasetV2
|
26
27
|
from fractal_server.app.models.v2 import HistoryImageCache
|
27
28
|
from fractal_server.app.models.v2 import HistoryRun
|
29
|
+
from fractal_server.app.models.v2 import HistoryUnit
|
28
30
|
from fractal_server.app.models.v2 import TaskGroupV2
|
29
31
|
from fractal_server.app.models.v2 import WorkflowTaskV2
|
30
32
|
from fractal_server.app.runner.executors.base_runner import BaseRunner
|
@@ -219,139 +221,160 @@ def execute_tasks_v2(
|
|
219
221
|
num_tasks = 0
|
220
222
|
|
221
223
|
# POST TASK EXECUTION
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
if (
|
234
|
-
current_task_output.image_list_updates == []
|
235
|
-
and current_task_output.image_list_removals == []
|
236
|
-
):
|
237
|
-
current_task_output = TaskOutput(
|
238
|
-
image_list_updates=[
|
239
|
-
dict(zarr_url=img["zarr_url"])
|
240
|
-
for img in filtered_images
|
241
|
-
],
|
242
|
-
)
|
243
|
-
else:
|
244
|
-
current_task_output = TaskOutput()
|
245
|
-
|
246
|
-
# Update image list
|
247
|
-
num_new_images = 0
|
248
|
-
current_task_output.check_zarr_urls_are_unique()
|
249
|
-
# NOTE: In principle we could make the task-output processing more
|
250
|
-
# granular, and also associate output-processing failures to history
|
251
|
-
# status.
|
252
|
-
for image_obj in current_task_output.image_list_updates:
|
253
|
-
image = image_obj.model_dump()
|
254
|
-
if image["zarr_url"] in [img["zarr_url"] for img in tmp_images]:
|
255
|
-
img_search = find_image_by_zarr_url(
|
256
|
-
images=tmp_images,
|
257
|
-
zarr_url=image["zarr_url"],
|
258
|
-
)
|
259
|
-
if img_search is None:
|
260
|
-
raise ValueError(
|
261
|
-
"Unexpected error: "
|
262
|
-
f"Image with zarr_url {image['zarr_url']} not found, "
|
263
|
-
"while updating image list."
|
264
|
-
)
|
265
|
-
existing_image_index = img_search["index"]
|
266
|
-
|
224
|
+
try:
|
225
|
+
non_failed_task_outputs = [
|
226
|
+
value.task_output
|
227
|
+
for value in outcomes_dict.values()
|
228
|
+
if value.task_output is not None
|
229
|
+
]
|
230
|
+
if len(non_failed_task_outputs) > 0:
|
231
|
+
current_task_output = merge_outputs(non_failed_task_outputs)
|
232
|
+
# If `current_task_output` includes no images (to be created or
|
233
|
+
# removed), then flag all the input images as modified.
|
234
|
+
# See fractal-server issues #1374 and #2409.
|
267
235
|
if (
|
268
|
-
|
269
|
-
|
236
|
+
current_task_output.image_list_updates == []
|
237
|
+
and current_task_output.image_list_removals == []
|
270
238
|
):
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
239
|
+
current_task_output = TaskOutput(
|
240
|
+
image_list_updates=[
|
241
|
+
dict(zarr_url=img["zarr_url"])
|
242
|
+
for img in filtered_images
|
243
|
+
],
|
244
|
+
)
|
245
|
+
else:
|
246
|
+
current_task_output = TaskOutput()
|
247
|
+
|
248
|
+
# Update image list
|
249
|
+
num_new_images = 0
|
250
|
+
current_task_output.check_zarr_urls_are_unique()
|
251
|
+
# NOTE: In principle we could make the task-output processing more
|
252
|
+
# granular, and also associate output-processing failures to
|
253
|
+
# history status.
|
254
|
+
for image_obj in current_task_output.image_list_updates:
|
255
|
+
image = image_obj.model_dump()
|
256
|
+
if image["zarr_url"] in [
|
257
|
+
img["zarr_url"] for img in tmp_images
|
258
|
+
]:
|
259
|
+
img_search = find_image_by_zarr_url(
|
260
|
+
images=tmp_images,
|
276
261
|
zarr_url=image["zarr_url"],
|
277
262
|
)
|
278
|
-
if
|
279
|
-
|
263
|
+
if img_search is None:
|
264
|
+
raise ValueError(
|
265
|
+
"Unexpected error: "
|
266
|
+
f"Image with zarr_url {image['zarr_url']} not "
|
267
|
+
"found, while updating image list."
|
268
|
+
)
|
269
|
+
existing_image_index = img_search["index"]
|
270
|
+
|
271
|
+
if (
|
272
|
+
image["origin"] is None
|
273
|
+
or image["origin"] == image["zarr_url"]
|
274
|
+
):
|
275
|
+
# CASE 1: Edit existing image
|
276
|
+
existing_image = img_search["image"]
|
277
|
+
new_attributes = copy(existing_image["attributes"])
|
278
|
+
new_types = copy(existing_image["types"])
|
279
|
+
new_image = dict(
|
280
|
+
zarr_url=image["zarr_url"],
|
281
|
+
)
|
282
|
+
if "origin" in existing_image.keys():
|
283
|
+
new_image["origin"] = existing_image["origin"]
|
284
|
+
else:
|
285
|
+
# CASE 2: Re-create existing image based on `origin`
|
286
|
+
# Propagate attributes and types from `origin` (if any)
|
287
|
+
(
|
288
|
+
new_attributes,
|
289
|
+
new_types,
|
290
|
+
) = get_origin_attribute_and_types(
|
291
|
+
origin_url=image["origin"],
|
292
|
+
images=tmp_images,
|
293
|
+
)
|
294
|
+
new_image = dict(
|
295
|
+
zarr_url=image["zarr_url"],
|
296
|
+
origin=image["origin"],
|
297
|
+
)
|
298
|
+
# Update attributes
|
299
|
+
new_attributes.update(image["attributes"])
|
300
|
+
new_attributes = drop_none_attributes(new_attributes)
|
301
|
+
new_image["attributes"] = new_attributes
|
302
|
+
# Update types
|
303
|
+
new_types.update(image["types"])
|
304
|
+
new_types.update(task.output_types)
|
305
|
+
new_image["types"] = new_types
|
306
|
+
# Validate new image
|
307
|
+
SingleImage(**new_image)
|
308
|
+
# Update image in the dataset image list
|
309
|
+
tmp_images[existing_image_index] = new_image
|
310
|
+
|
280
311
|
else:
|
281
|
-
# CASE
|
312
|
+
# CASE 3: Add new image
|
313
|
+
# Check that image['zarr_url'] is a subfolder of zarr_dir
|
314
|
+
if (
|
315
|
+
not image["zarr_url"].startswith(zarr_dir)
|
316
|
+
or image["zarr_url"] == zarr_dir
|
317
|
+
):
|
318
|
+
raise JobExecutionError(
|
319
|
+
"Cannot create image if zarr_url is not a "
|
320
|
+
"subfolder of zarr_dir.\n"
|
321
|
+
f"zarr_dir: {zarr_dir}\n"
|
322
|
+
f"zarr_url: {image['zarr_url']}"
|
323
|
+
)
|
324
|
+
|
282
325
|
# Propagate attributes and types from `origin` (if any)
|
283
326
|
new_attributes, new_types = get_origin_attribute_and_types(
|
284
327
|
origin_url=image["origin"],
|
285
328
|
images=tmp_images,
|
286
329
|
)
|
330
|
+
# Prepare new image
|
331
|
+
new_attributes.update(image["attributes"])
|
332
|
+
new_attributes = drop_none_attributes(new_attributes)
|
333
|
+
new_types.update(image["types"])
|
334
|
+
new_types.update(task.output_types)
|
287
335
|
new_image = dict(
|
288
336
|
zarr_url=image["zarr_url"],
|
289
337
|
origin=image["origin"],
|
338
|
+
attributes=new_attributes,
|
339
|
+
types=new_types,
|
290
340
|
)
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
new_types.update(image["types"])
|
297
|
-
new_types.update(task.output_types)
|
298
|
-
new_image["types"] = new_types
|
299
|
-
# Validate new image
|
300
|
-
SingleImage(**new_image)
|
301
|
-
# Update image in the dataset image list
|
302
|
-
tmp_images[existing_image_index] = new_image
|
341
|
+
# Validate new image
|
342
|
+
SingleImage(**new_image)
|
343
|
+
# Add image into the dataset image list
|
344
|
+
tmp_images.append(new_image)
|
345
|
+
num_new_images += 1
|
303
346
|
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
):
|
347
|
+
# Remove images from tmp_images
|
348
|
+
for img_zarr_url in current_task_output.image_list_removals:
|
349
|
+
img_search = find_image_by_zarr_url(
|
350
|
+
images=tmp_images, zarr_url=img_zarr_url
|
351
|
+
)
|
352
|
+
if img_search is None:
|
311
353
|
raise JobExecutionError(
|
312
|
-
"Cannot
|
313
|
-
"
|
314
|
-
f"zarr_dir: {zarr_dir}\n"
|
315
|
-
f"zarr_url: {image['zarr_url']}"
|
354
|
+
"Cannot remove missing image "
|
355
|
+
f"(zarr_url={img_zarr_url})."
|
316
356
|
)
|
357
|
+
else:
|
358
|
+
tmp_images.pop(img_search["index"])
|
317
359
|
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
)
|
323
|
-
# Prepare new image
|
324
|
-
new_attributes.update(image["attributes"])
|
325
|
-
new_attributes = drop_none_attributes(new_attributes)
|
326
|
-
new_types.update(image["types"])
|
327
|
-
new_types.update(task.output_types)
|
328
|
-
new_image = dict(
|
329
|
-
zarr_url=image["zarr_url"],
|
330
|
-
origin=image["origin"],
|
331
|
-
attributes=new_attributes,
|
332
|
-
types=new_types,
|
333
|
-
)
|
334
|
-
# Validate new image
|
335
|
-
SingleImage(**new_image)
|
336
|
-
# Add image into the dataset image list
|
337
|
-
tmp_images.append(new_image)
|
338
|
-
num_new_images += 1
|
339
|
-
|
340
|
-
# Remove images from tmp_images
|
341
|
-
for img_zarr_url in current_task_output.image_list_removals:
|
342
|
-
img_search = find_image_by_zarr_url(
|
343
|
-
images=tmp_images, zarr_url=img_zarr_url
|
360
|
+
# Update type_filters based on task-manifest output_types
|
361
|
+
type_filters_from_task_manifest = task.output_types
|
362
|
+
current_dataset_type_filters.update(
|
363
|
+
type_filters_from_task_manifest
|
344
364
|
)
|
345
|
-
|
346
|
-
|
347
|
-
|
365
|
+
except Exception as e:
|
366
|
+
logger.error(
|
367
|
+
"Unexpected error in post-task-execution block. "
|
368
|
+
f"Original error: {str(e)}"
|
369
|
+
)
|
370
|
+
with next(get_sync_db()) as db:
|
371
|
+
db.execute(
|
372
|
+
update(HistoryUnit)
|
373
|
+
.where(HistoryUnit.history_run_id == history_run_id)
|
374
|
+
.values(status=HistoryUnitStatus.FAILED)
|
348
375
|
)
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
# Update type_filters based on task-manifest output_types
|
353
|
-
type_filters_from_task_manifest = task.output_types
|
354
|
-
current_dataset_type_filters.update(type_filters_from_task_manifest)
|
376
|
+
db.commit()
|
377
|
+
raise e
|
355
378
|
|
356
379
|
with next(get_sync_db()) as db:
|
357
380
|
# Write current dataset images into the database.
|
@@ -166,7 +166,7 @@ def collect_ssh(
|
|
166
166
|
script_dir_remote=script_dir_remote,
|
167
167
|
prefix=(
|
168
168
|
f"{int(time.time())}_"
|
169
|
-
f"{TaskGroupActivityActionV2.COLLECT}"
|
169
|
+
f"{TaskGroupActivityActionV2.COLLECT.value}"
|
170
170
|
),
|
171
171
|
fractal_ssh=fractal_ssh,
|
172
172
|
logger_name=LOGGER_NAME,
|
@@ -136,7 +136,7 @@ def deactivate_ssh(
|
|
136
136
|
script_dir_remote=script_dir_remote,
|
137
137
|
prefix=(
|
138
138
|
f"{int(time.time())}_"
|
139
|
-
f"{TaskGroupActivityActionV2.DEACTIVATE}"
|
139
|
+
f"{TaskGroupActivityActionV2.DEACTIVATE.value}"
|
140
140
|
),
|
141
141
|
fractal_ssh=fractal_ssh,
|
142
142
|
logger_name=LOGGER_NAME,
|
@@ -144,7 +144,7 @@ def reactivate_ssh(
|
|
144
144
|
script_dir_remote=script_dir_remote,
|
145
145
|
prefix=(
|
146
146
|
f"{int(time.time())}_"
|
147
|
-
f"{TaskGroupActivityActionV2.REACTIVATE}"
|
147
|
+
f"{TaskGroupActivityActionV2.REACTIVATE.value}"
|
148
148
|
),
|
149
149
|
fractal_ssh=fractal_ssh,
|
150
150
|
logger_name=LOGGER_NAME,
|
@@ -1,4 +1,4 @@
|
|
1
|
-
fractal_server/__init__.py,sha256=
|
1
|
+
fractal_server/__init__.py,sha256=6Uu9b8c6XWTG60V3XHQPdFjCGQfgYX4y4FTD3DmRFXk,23
|
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
|
@@ -24,7 +24,7 @@ fractal_server/app/routes/admin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm
|
|
24
24
|
fractal_server/app/routes/admin/v2/__init__.py,sha256=_5lqb6-M8-fZqE1HRMep6pAFYRUKMxrvbZOKs-RXWkw,933
|
25
25
|
fractal_server/app/routes/admin/v2/accounting.py,sha256=UDMPD9DMhMBcu4UsEOEtKMCGnkVMtmwBuRklek-_ShQ,3631
|
26
26
|
fractal_server/app/routes/admin/v2/impersonate.py,sha256=gc4lshfEPFR6W2asH7aKu6hqE6chzusdhAUVV9p51eU,1131
|
27
|
-
fractal_server/app/routes/admin/v2/job.py,sha256=
|
27
|
+
fractal_server/app/routes/admin/v2/job.py,sha256=Elb3aP9Az6V8u1C0FvhSxt9NDPjBrQeJB0fH1hpXWQs,7445
|
28
28
|
fractal_server/app/routes/admin/v2/project.py,sha256=luy-yiGX1JYTdPm1hpIdDUUqPm8xHuipLy9k2X6zu74,1223
|
29
29
|
fractal_server/app/routes/admin/v2/task.py,sha256=QOwgyDU9m7T_wLMwkdgfFaoMjNxcDg6zMVpngxhUvqk,4374
|
30
30
|
fractal_server/app/routes/admin/v2/task_group.py,sha256=LG41hAsllBL6kc-JLxRNG_IrI6frIKrIF3xD0GeeTiI,7173
|
@@ -39,13 +39,13 @@ fractal_server/app/routes/api/v2/dataset.py,sha256=h5AhE0sdhQ20ZlIbEJsFnHIOUW0S1
|
|
39
39
|
fractal_server/app/routes/api/v2/history.py,sha256=pDztvwQFOh3JChtSk9GIG3H17yg4G5pk1mq14qXF4Ck,17793
|
40
40
|
fractal_server/app/routes/api/v2/images.py,sha256=BGpO94gVd8BTpCN6Mun2RXmjrPmfkIp73m8RN7uiGW4,8361
|
41
41
|
fractal_server/app/routes/api/v2/job.py,sha256=MU1sHIKk_89WrD0TD44d4ufzqnywot7On_W71KjyUbQ,6500
|
42
|
-
fractal_server/app/routes/api/v2/pre_submission_checks.py,sha256=
|
42
|
+
fractal_server/app/routes/api/v2/pre_submission_checks.py,sha256=WyJAco9-96c15ImjgvsNfhd2169gG29CXkwtCTVLs38,4816
|
43
43
|
fractal_server/app/routes/api/v2/project.py,sha256=uAZgATiHcOvbnRX-vv1D3HoaEUvLUd7vzVmGcqOP8ZY,4602
|
44
|
-
fractal_server/app/routes/api/v2/status_legacy.py,sha256=
|
44
|
+
fractal_server/app/routes/api/v2/status_legacy.py,sha256=0QlbBErOT2Idf-LT0EvOiPtTjrm6WmIY0k69NOgjmWk,6355
|
45
45
|
fractal_server/app/routes/api/v2/submit.py,sha256=hCwwC6bXP7EyhgGyVLv1ClybRH1YytDVoPunOzpsf0s,8822
|
46
46
|
fractal_server/app/routes/api/v2/task.py,sha256=O7pquZhXIS4lRs5XqHvstiwe8BiCuS-B3ZKJI1g6EJU,6985
|
47
47
|
fractal_server/app/routes/api/v2/task_collection.py,sha256=IDNF6sjDuU37HIQ0TuQA-TZIuf7nfHAQXUUNmkrlhLM,12706
|
48
|
-
fractal_server/app/routes/api/v2/task_collection_custom.py,sha256=
|
48
|
+
fractal_server/app/routes/api/v2/task_collection_custom.py,sha256=CRe23ehouz08tedJ3-pe9akqTVyxv7GfqhWTjx5E45Q,6677
|
49
49
|
fractal_server/app/routes/api/v2/task_group.py,sha256=62zcVTdheXM5V3WmFuqisIqgETjXmZaRpNMcDX5bXS0,7408
|
50
50
|
fractal_server/app/routes/api/v2/task_group_lifecycle.py,sha256=3o9bCC8ubMwffQPPaxQZy-CjH9IB2RkIReIecI6L2_w,9300
|
51
51
|
fractal_server/app/routes/api/v2/workflow.py,sha256=sW6Nm7dfzUY354hawyEkpQHy7rUvV2FCV8DPorH-TDU,10270
|
@@ -101,7 +101,7 @@ fractal_server/app/runner/v2/_slurm_sudo.py,sha256=TVihkQKMX6YWEWxXJjQo0WEQOjVy7
|
|
101
101
|
fractal_server/app/runner/v2/db_tools.py,sha256=du5dKhMMFMErQXbGIgu9JvO_vtMensodyPsyDeqz1yQ,3324
|
102
102
|
fractal_server/app/runner/v2/deduplicate_list.py,sha256=IVTE4abBU1bUprFTkxrTfYKnvkNTanWQ-KWh_etiT08,645
|
103
103
|
fractal_server/app/runner/v2/merge_outputs.py,sha256=D1L4Taieq9i71SPQyNc1kMokgHh-sV_MqF3bv7QMDBc,907
|
104
|
-
fractal_server/app/runner/v2/runner.py,sha256=
|
104
|
+
fractal_server/app/runner/v2/runner.py,sha256=tYG-LB9Dm9_Lz3uYgAhcIeeFLy5I6xMqCdVuUKNXyII,17717
|
105
105
|
fractal_server/app/runner/v2/runner_functions.py,sha256=AzsE7VF6NMz_5qc0htQkfow5_2rr-wkx50vFJTndj8I,19250
|
106
106
|
fractal_server/app/runner/v2/runner_functions_low_level.py,sha256=_h_OOffq3d7V0uHa8Uvs0mj31y1GSZBUXjDDF3WjVjY,3620
|
107
107
|
fractal_server/app/runner/v2/submit_workflow.py,sha256=QywUGIoHAHnrWgfnyX8W9kVqKY-RvVyNLpzrbsXZOZ4,13075
|
@@ -187,14 +187,14 @@ fractal_server/tasks/utils.py,sha256=V7dj8o2AnoHhGSTYlqJHcRFhCIpmOrMOUhtiE_DvRVA
|
|
187
187
|
fractal_server/tasks/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
188
188
|
fractal_server/tasks/v2/local/__init__.py,sha256=9RVItnS7OyLsJOuJjWMCicaky4ASUPQEYD4SzDs0hOE,141
|
189
189
|
fractal_server/tasks/v2/local/_utils.py,sha256=EvhmVwYjqaNyDCUMEsTWYOUXLgEwR1xr6bu32apCEI8,2491
|
190
|
-
fractal_server/tasks/v2/local/collect.py,sha256
|
191
|
-
fractal_server/tasks/v2/local/deactivate.py,sha256=
|
192
|
-
fractal_server/tasks/v2/local/reactivate.py,sha256=
|
190
|
+
fractal_server/tasks/v2/local/collect.py,sha256=w1s96nqyGRSY_zhII3HP8JaBdJmzxPdqTksUO-ZH9lo,12210
|
191
|
+
fractal_server/tasks/v2/local/deactivate.py,sha256=o3lVnW35bjaRyRkjN6cpqe0WyE54sVydi-I5-tmLFNI,10044
|
192
|
+
fractal_server/tasks/v2/local/reactivate.py,sha256=hMgRWEY30qi-0lCMdC2GmyGLeAXOZYJCzNgamiucjEM,6197
|
193
193
|
fractal_server/tasks/v2/ssh/__init__.py,sha256=aSQbVi6Ummt9QzcSLWNmSqYjfdxrn9ROmqgH6bDpI7k,135
|
194
194
|
fractal_server/tasks/v2/ssh/_utils.py,sha256=LjaEYVUJDChilu3YuhxuGWYRNnVJ_zqNE9SDHdRTIHY,2824
|
195
|
-
fractal_server/tasks/v2/ssh/collect.py,sha256=
|
196
|
-
fractal_server/tasks/v2/ssh/deactivate.py,sha256=
|
197
|
-
fractal_server/tasks/v2/ssh/reactivate.py,sha256=
|
195
|
+
fractal_server/tasks/v2/ssh/collect.py,sha256=I-a2st4jo8mzc0u0EScs54Ccr3tNm_as7RZmn1FTGiE,13568
|
196
|
+
fractal_server/tasks/v2/ssh/deactivate.py,sha256=meiAVd4mvDR-ikclR0KXkSoJp3PbBYci-eZlOJbcI1c,11406
|
197
|
+
fractal_server/tasks/v2/ssh/reactivate.py,sha256=T6YPbMwaWV7RUD33Dmpn3K9173BGuOv0s7Vpr_YOCH4,7976
|
198
198
|
fractal_server/tasks/v2/templates/1_create_venv.sh,sha256=PK0jdHKtQpda1zULebBaVPORt4t6V17wa4N1ohcj5ac,548
|
199
199
|
fractal_server/tasks/v2/templates/2_pip_install.sh,sha256=Md2LPt3BJ7IfN0USF2uivl4rP8OwbzJOUepGAr_Cicg,1836
|
200
200
|
fractal_server/tasks/v2/templates/3_pip_freeze.sh,sha256=JldREScEBI4cD_qjfX4UK7V4aI-FnX9ZvVNxgpSOBFc,168
|
@@ -209,8 +209,8 @@ fractal_server/tasks/v2/utils_templates.py,sha256=Kc_nSzdlV6KIsO0CQSPs1w70zLyENP
|
|
209
209
|
fractal_server/urls.py,sha256=QjIKAC1a46bCdiPMu3AlpgFbcv6a4l3ABcd5xz190Og,471
|
210
210
|
fractal_server/utils.py,sha256=PMwrxWFxRTQRl1b9h-NRIbFGPKqpH_hXnkAT3NfZdpY,3571
|
211
211
|
fractal_server/zip_tools.py,sha256=GjDgo_sf6V_DDg6wWeBlZu5zypIxycn_l257p_YVKGc,4876
|
212
|
-
fractal_server-2.14.
|
213
|
-
fractal_server-2.14.
|
214
|
-
fractal_server-2.14.
|
215
|
-
fractal_server-2.14.
|
216
|
-
fractal_server-2.14.
|
212
|
+
fractal_server-2.14.2.dist-info/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
|
213
|
+
fractal_server-2.14.2.dist-info/METADATA,sha256=LQDnOxlZL14XsZXYcQ42N-JR0NSMBfxN4qOP2raSiG4,4560
|
214
|
+
fractal_server-2.14.2.dist-info/WHEEL,sha256=7dDg4QLnNKTvwIDR9Ac8jJaAmBC_owJrckbC0jjThyA,88
|
215
|
+
fractal_server-2.14.2.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
|
216
|
+
fractal_server-2.14.2.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|