fractal-server 2.10.0a0__py3-none-any.whl → 2.10.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.
@@ -1 +1 @@
1
- __VERSION__ = "2.10.0a0"
1
+ __VERSION__ = "2.10.2"
@@ -6,22 +6,129 @@ from fastapi import Depends
6
6
  from fastapi import HTTPException
7
7
  from fastapi import Response
8
8
  from fastapi import status
9
+ from sqlalchemy.orm.attributes import flag_modified
9
10
 
10
11
  from ....db import AsyncSession
11
12
  from ....db import get_async_db
12
- from ....schemas.v2 import WorkflowTaskCreateV2
13
- from ....schemas.v2 import WorkflowTaskReadV2
14
- from ....schemas.v2 import WorkflowTaskUpdateV2
15
13
  from ._aux_functions import _get_workflow_check_owner
16
14
  from ._aux_functions import _get_workflow_task_check_owner
17
15
  from ._aux_functions import _workflow_insert_task
18
16
  from ._aux_functions_tasks import _get_task_read_access
19
17
  from fractal_server.app.models import UserOAuth
18
+ from fractal_server.app.models.v2 import WorkflowTaskV2
20
19
  from fractal_server.app.routes.auth import current_active_user
20
+ from fractal_server.app.schemas.v2 import WorkflowTaskCreateV2
21
+ from fractal_server.app.schemas.v2 import WorkflowTaskReadV2
22
+ from fractal_server.app.schemas.v2 import WorkflowTaskReplaceV2
23
+ from fractal_server.app.schemas.v2 import WorkflowTaskUpdateV2
21
24
 
22
25
  router = APIRouter()
23
26
 
24
27
 
28
+ @router.post(
29
+ "/project/{project_id}/workflow/{workflow_id}/wftask/replace-task/",
30
+ response_model=WorkflowTaskReadV2,
31
+ status_code=status.HTTP_201_CREATED,
32
+ )
33
+ async def replace_workflowtask(
34
+ project_id: int,
35
+ workflow_id: int,
36
+ workflow_task_id: int,
37
+ task_id: int,
38
+ replace: Optional[WorkflowTaskReplaceV2] = None,
39
+ user: UserOAuth = Depends(current_active_user),
40
+ db: AsyncSession = Depends(get_async_db),
41
+ ) -> WorkflowTaskReadV2:
42
+
43
+ old_workflow_task, workflow = await _get_workflow_task_check_owner(
44
+ project_id=project_id,
45
+ workflow_id=workflow_id,
46
+ workflow_task_id=workflow_task_id,
47
+ user_id=user.id,
48
+ db=db,
49
+ )
50
+
51
+ task = await _get_task_read_access(
52
+ task_id=task_id, user_id=user.id, db=db, require_active=True
53
+ )
54
+
55
+ if task.type != old_workflow_task.task.type:
56
+ raise HTTPException(
57
+ status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
58
+ detail=(
59
+ f"Cannot replace a Task '{old_workflow_task.task.type}' with a"
60
+ f" Task '{task.type}'."
61
+ ),
62
+ )
63
+
64
+ _args_non_parallel = old_workflow_task.args_non_parallel
65
+ _args_parallel = old_workflow_task.args_parallel
66
+ if replace is not None:
67
+ if replace.args_non_parallel is not None:
68
+ if task.type == "parallel":
69
+ raise HTTPException(
70
+ status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
71
+ detail=(
72
+ "Cannot set 'args_non_parallel' "
73
+ "when Task is 'parallel'."
74
+ ),
75
+ )
76
+ else:
77
+ _args_non_parallel = replace.args_non_parallel
78
+
79
+ if replace.args_parallel is not None:
80
+ if task.type == "non_parallel":
81
+ raise HTTPException(
82
+ status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
83
+ detail=(
84
+ "Cannot set 'args_parallel' "
85
+ "when Task is 'non_parallel'."
86
+ ),
87
+ )
88
+ else:
89
+ _args_parallel = replace.args_parallel
90
+
91
+ # If user's changes to `meta_non_parallel` are compatible with new task,
92
+ # keep them;
93
+ # else, get `meta_non_parallel` from new task
94
+ if (
95
+ old_workflow_task.meta_non_parallel
96
+ != old_workflow_task.task.meta_non_parallel
97
+ ) and (old_workflow_task.task.meta_non_parallel == task.meta_non_parallel):
98
+ _meta_non_parallel = old_workflow_task.meta_non_parallel
99
+ else:
100
+ _meta_non_parallel = task.meta_non_parallel
101
+ # Same for `meta_parallel`
102
+ if (
103
+ old_workflow_task.meta_parallel != old_workflow_task.task.meta_parallel
104
+ ) and (old_workflow_task.task.meta_parallel == task.meta_parallel):
105
+ _meta_parallel = old_workflow_task.meta_parallel
106
+ else:
107
+ _meta_parallel = task.meta_parallel
108
+
109
+ new_workflow_task = WorkflowTaskV2(
110
+ # new task
111
+ task_type=task.type,
112
+ task_id=task.id,
113
+ task=task,
114
+ # old values
115
+ order=old_workflow_task.order,
116
+ input_filters=old_workflow_task.input_filters,
117
+ # possibly new values
118
+ args_non_parallel=_args_non_parallel,
119
+ args_parallel=_args_parallel,
120
+ meta_non_parallel=_meta_non_parallel,
121
+ meta_parallel=_meta_parallel,
122
+ )
123
+
124
+ await db.delete(old_workflow_task)
125
+ workflow.task_list.insert(new_workflow_task.order, new_workflow_task)
126
+ flag_modified(workflow, "task_list")
127
+ await db.commit()
128
+
129
+ return new_workflow_task
130
+
131
+
25
132
  @router.post(
26
133
  "/project/{project_id}/workflow/{workflow_id}/wftask/",
27
134
  response_model=WorkflowTaskReadV2,
@@ -73,7 +180,6 @@ async def create_workflowtask(
73
180
  "is `non_parallel`."
74
181
  ),
75
182
  )
76
-
77
183
  workflow_task = await _workflow_insert_task(
78
184
  workflow_id=workflow.id,
79
185
  task_id=task_id,
@@ -9,6 +9,7 @@ from cfut import FileWaitThread
9
9
 
10
10
  from ......logger import set_logger
11
11
  from ._check_jobs_status import _jobs_finished
12
+ from fractal_server.app.runner.exceptions import JobExecutionError
12
13
 
13
14
  logger = set_logger(__name__)
14
15
 
@@ -56,6 +57,10 @@ class FractalFileWaitThread(FileWaitThread):
56
57
  Note that (with respect to clusterfutures) we replaced `filename` with
57
58
  `filenames`.
58
59
  """
60
+ if self.shutdown:
61
+ error_msg = "Cannot call `wait` method after executor shutdown."
62
+ logger.warning(error_msg)
63
+ raise JobExecutionError(info=error_msg)
59
64
  with self.lock:
60
65
  self.waiting[filenames] = jobid
61
66
 
@@ -331,6 +331,12 @@ class FractalSlurmExecutor(SlurmExecutor):
331
331
  Future representing the execution of the current SLURM job.
332
332
  """
333
333
 
334
+ # Do not continue if auxiliary thread was shut down
335
+ if self.wait_thread.shutdown:
336
+ error_msg = "Cannot call `submit` method after executor shutdown"
337
+ logger.warning(error_msg)
338
+ raise JobExecutionError(info=error_msg)
339
+
334
340
  # Set slurm_file_prefix
335
341
  slurm_file_prefix = task_files.file_prefix
336
342
 
@@ -395,6 +401,12 @@ class FractalSlurmExecutor(SlurmExecutor):
395
401
 
396
402
  """
397
403
 
404
+ # Do not continue if auxiliary thread was shut down
405
+ if self.wait_thread.shutdown:
406
+ error_msg = "Cannot call `map` method after executor shutdown"
407
+ logger.warning(error_msg)
408
+ raise JobExecutionError(info=error_msg)
409
+
398
410
  def _result_or_cancel(fut):
399
411
  """
400
412
  This function is based on the Python Standard Library 3.11.
@@ -546,6 +558,15 @@ class FractalSlurmExecutor(SlurmExecutor):
546
558
  Returns:
547
559
  Future representing the execution of the current SLURM job.
548
560
  """
561
+
562
+ # Prevent calling sbatch if auxiliary thread was shut down
563
+ if self.wait_thread.shutdown:
564
+ error_msg = (
565
+ "Cannot call `_submit_job` method after executor shutdown"
566
+ )
567
+ logger.warning(error_msg)
568
+ raise JobExecutionError(info=error_msg)
569
+
549
570
  fut: Future = Future()
550
571
 
551
572
  # Inject SLURM account (if set) into slurm_config
@@ -1207,6 +1228,9 @@ class FractalSlurmExecutor(SlurmExecutor):
1207
1228
  logger.error(error_msg)
1208
1229
  raise JobExecutionError(info=error_msg)
1209
1230
 
1231
+ # Redudantly set thread shutdown attribute to True
1232
+ self.wait_thread.shutdown = True
1233
+
1210
1234
  logger.debug("Executor shutdown: end")
1211
1235
 
1212
1236
  def _stop_and_join_wait_thread(self):
@@ -45,5 +45,6 @@ from .workflowtask import WorkflowTaskExportV2 # noqa F401
45
45
  from .workflowtask import WorkflowTaskImportV2 # noqa F401
46
46
  from .workflowtask import WorkflowTaskReadV2 # noqa F401
47
47
  from .workflowtask import WorkflowTaskReadV2WithWarning # noqa F401
48
+ from .workflowtask import WorkflowTaskReplaceV2 # noqa F401
48
49
  from .workflowtask import WorkflowTaskStatusTypeV2 # noqa F401
49
50
  from .workflowtask import WorkflowTaskUpdateV2 # noqa F401
@@ -82,6 +82,13 @@ class WorkflowTaskCreateV2(BaseModel, extra=Extra.forbid):
82
82
  return value
83
83
 
84
84
 
85
+ class WorkflowTaskReplaceV2(BaseModel):
86
+ """Used by 'replace-task' endpoint"""
87
+
88
+ args_non_parallel: Optional[dict[str, Any]] = None
89
+ args_parallel: Optional[dict[str, Any]] = None
90
+
91
+
85
92
  class WorkflowTaskReadV2(BaseModel):
86
93
 
87
94
  id: int
fractal_server/config.py CHANGED
@@ -492,6 +492,39 @@ class Settings(BaseSettings):
492
492
  Whether to include the v1 API.
493
493
  """
494
494
 
495
+ FRACTAL_PIP_CACHE_DIR: Optional[str] = None
496
+ """
497
+ Absolute path to the cache directory for `pip`; if unset,
498
+ `--no-cache-dir` is used.
499
+ """
500
+
501
+ @validator("FRACTAL_PIP_CACHE_DIR", always=True)
502
+ def absolute_FRACTAL_PIP_CACHE_DIR(cls, v):
503
+ """
504
+ If `FRACTAL_PIP_CACHE_DIR` is a relative path, fail.
505
+ """
506
+ if v is None:
507
+ return None
508
+ elif not Path(v).is_absolute():
509
+ raise FractalConfigurationError(
510
+ f"Non-absolute value for FRACTAL_PIP_CACHE_DIR={v}"
511
+ )
512
+ else:
513
+ return v
514
+
515
+ @property
516
+ def PIP_CACHE_DIR_ARG(self) -> str:
517
+ """
518
+ Option for `pip install`, based on `FRACTAL_PIP_CACHE_DIR` value.
519
+
520
+ If `FRACTAL_PIP_CACHE_DIR` is set, then return
521
+ `--cache-dir /somewhere`; else return `--no-cache-dir`.
522
+ """
523
+ if self.FRACTAL_PIP_CACHE_DIR is not None:
524
+ return f"--cache-dir {self.FRACTAL_PIP_CACHE_DIR}"
525
+ else:
526
+ return "--no-cache-dir"
527
+
495
528
  FRACTAL_MAX_PIP_VERSION: str = "24.0"
496
529
  """
497
530
  Maximum value at which to update `pip` before performing task collection.
@@ -538,7 +571,6 @@ class Settings(BaseSettings):
538
571
  raise FractalConfigurationError("POSTGRES_DB cannot be None.")
539
572
 
540
573
  def check_runner(self) -> None:
541
-
542
574
  if not self.FRACTAL_RUNNER_WORKING_BASE_DIR:
543
575
  raise FractalConfigurationError(
544
576
  "FRACTAL_RUNNER_WORKING_BASE_DIR cannot be None."
@@ -546,7 +578,6 @@ class Settings(BaseSettings):
546
578
 
547
579
  info = f"FRACTAL_RUNNER_BACKEND={self.FRACTAL_RUNNER_BACKEND}"
548
580
  if self.FRACTAL_RUNNER_BACKEND == "slurm":
549
-
550
581
  from fractal_server.app.runner.executors.slurm._slurm_config import ( # noqa: E501
551
582
  load_slurm_config_file,
552
583
  )
@@ -6,6 +6,7 @@ from fractal_server.syringe import Inject
6
6
  COLLECTION_FILENAME = "collection.json"
7
7
  COLLECTION_LOG_FILENAME = "collection.log"
8
8
  COLLECTION_FREEZE_FILENAME = "collection_freeze.txt"
9
+ FORBIDDEN_DEPENDENCY_STRINGS = ["github.com"]
9
10
 
10
11
 
11
12
  def get_absolute_venv_path_v1(venv_path: Path) -> Path:
@@ -15,6 +15,7 @@ from fractal_server.app.schemas.v2 import TaskGroupActivityActionV2
15
15
  from fractal_server.app.schemas.v2 import TaskGroupV2OriginEnum
16
16
  from fractal_server.app.schemas.v2.task_group import TaskGroupActivityStatusV2
17
17
  from fractal_server.logger import set_logger
18
+ from fractal_server.tasks.utils import FORBIDDEN_DEPENDENCY_STRINGS
18
19
  from fractal_server.tasks.utils import get_log_path
19
20
  from fractal_server.tasks.v2.utils_background import get_current_log
20
21
  from fractal_server.tasks.v2.utils_templates import SCRIPTS_SUBFOLDER
@@ -189,6 +190,16 @@ def deactivate_local(
189
190
  "task-group attributes."
190
191
  )
191
192
 
193
+ # Fail if `pip_freeze` includes "github.com", see
194
+ # https://github.com/fractal-analytics-platform/fractal-server/issues/2142
195
+ for forbidden_string in FORBIDDEN_DEPENDENCY_STRINGS:
196
+ if forbidden_string in task_group.pip_freeze:
197
+ raise ValueError(
198
+ "Deactivation and reactivation of task packages "
199
+ f"with direct {forbidden_string} dependencies "
200
+ "are not currently supported. Exit."
201
+ )
202
+
192
203
  # We now have all required information for reactivating the
193
204
  # virtual environment at a later point
194
205
 
@@ -119,7 +119,6 @@ def reactivate_local(
119
119
  )
120
120
  logger.debug("end - create venv")
121
121
  activity.log = get_current_log(log_file_path)
122
- activity.timestamp_ended = get_timestamp()
123
122
  activity = add_commit_refresh(obj=activity, db=db)
124
123
 
125
124
  logger.debug("start - install from pip freeze")
@@ -16,6 +16,7 @@ from fractal_server.app.schemas.v2 import TaskGroupV2OriginEnum
16
16
  from fractal_server.app.schemas.v2.task_group import TaskGroupActivityStatusV2
17
17
  from fractal_server.logger import set_logger
18
18
  from fractal_server.ssh._fabric import FractalSSH
19
+ from fractal_server.tasks.utils import FORBIDDEN_DEPENDENCY_STRINGS
19
20
  from fractal_server.tasks.utils import get_log_path
20
21
  from fractal_server.tasks.v2.utils_background import get_current_log
21
22
  from fractal_server.tasks.v2.utils_templates import SCRIPTS_SUBFOLDER
@@ -221,6 +222,16 @@ def deactivate_ssh(
221
222
  "task-group attributes."
222
223
  )
223
224
 
225
+ # Fail if `pip_freeze` includes "github", see
226
+ # https://github.com/fractal-analytics-platform/fractal-server/issues/2142
227
+ for forbidden_string in FORBIDDEN_DEPENDENCY_STRINGS:
228
+ if forbidden_string in task_group.pip_freeze:
229
+ raise ValueError(
230
+ "Deactivation and reactivation of task packages "
231
+ f"with direct {forbidden_string} dependencies "
232
+ "are not currently supported. Exit."
233
+ )
234
+
224
235
  # We now have all required information for reactivating the
225
236
  # virtual environment at a later point
226
237
 
@@ -159,7 +159,6 @@ def reactivate_ssh(
159
159
  )
160
160
  logger.debug("end - create venv")
161
161
  activity.log = get_current_log(log_file_path)
162
- activity.timestamp_ended = get_timestamp()
163
162
  activity = add_commit_refresh(obj=activity, db=db)
164
163
 
165
164
  logger.debug("start - install from pip freeze")
@@ -10,6 +10,7 @@ PACKAGE_ENV_DIR=__PACKAGE_ENV_DIR__
10
10
  INSTALL_STRING=__INSTALL_STRING__
11
11
  PINNED_PACKAGE_LIST="__PINNED_PACKAGE_LIST__"
12
12
  FRACTAL_MAX_PIP_VERSION="__FRACTAL_MAX_PIP_VERSION__"
13
+ FRACTAL_PIP_CACHE_DIR_ARG="__FRACTAL_PIP_CACHE_DIR_ARG__"
13
14
 
14
15
  TIME_START=$(date +%s)
15
16
 
@@ -17,8 +18,8 @@ VENVPYTHON=${PACKAGE_ENV_DIR}/bin/python
17
18
 
18
19
  # Upgrade `pip` and install `setuptools`
19
20
  write_log "START upgrade pip and install setuptools"
20
- "$VENVPYTHON" -m pip install --no-cache-dir "pip<=${FRACTAL_MAX_PIP_VERSION}" --upgrade
21
- "$VENVPYTHON" -m pip install --no-cache-dir setuptools
21
+ "$VENVPYTHON" -m pip install ${FRACTAL_PIP_CACHE_DIR_ARG} "pip<=${FRACTAL_MAX_PIP_VERSION}" --upgrade
22
+ "$VENVPYTHON" -m pip install ${FRACTAL_PIP_CACHE_DIR_ARG} setuptools
22
23
  write_log "END upgrade pip and install setuptools"
23
24
  echo
24
25
 
@@ -41,7 +42,7 @@ if [ "$PINNED_PACKAGE_LIST" != "" ]; then
41
42
  done
42
43
 
43
44
  write_log "All packages in ${PINNED_PACKAGE_LIST} are already installed, proceed with specific versions."
44
- "$VENVPYTHON" -m pip install --no-cache-dir "$PINNED_PACKAGE_LIST"
45
+ "$VENVPYTHON" -m pip install ${FRACTAL_PIP_CACHE_DIR_ARG} "$PINNED_PACKAGE_LIST"
45
46
  write_log "END installing pinned versions $PINNED_PACKAGE_LIST"
46
47
  else
47
48
  write_log "SKIP installing pinned versions $PINNED_PACKAGE_LIST (empty list)"
@@ -9,6 +9,7 @@ write_log(){
9
9
  PACKAGE_ENV_DIR=__PACKAGE_ENV_DIR__
10
10
  PIP_FREEZE_FILE=__PIP_FREEZE_FILE__
11
11
  FRACTAL_MAX_PIP_VERSION=__FRACTAL_MAX_PIP_VERSION__
12
+ FRACTAL_PIP_CACHE_DIR_ARG="__FRACTAL_PIP_CACHE_DIR_ARG__"
12
13
 
13
14
  TIME_START=$(date +%s)
14
15
 
@@ -16,14 +17,14 @@ VENVPYTHON=${PACKAGE_ENV_DIR}/bin/python
16
17
 
17
18
  # Upgrade `pip` and install `setuptools`
18
19
  write_log "START upgrade pip and install setuptools"
19
- "$VENVPYTHON" -m pip install --no-cache-dir "pip<=${FRACTAL_MAX_PIP_VERSION}" --upgrade
20
- "$VENVPYTHON" -m pip install --no-cache-dir setuptools
20
+ "$VENVPYTHON" -m pip install ${FRACTAL_PIP_CACHE_DIR_ARG} "pip<=${FRACTAL_MAX_PIP_VERSION}" --upgrade
21
+ "$VENVPYTHON" -m pip install ${FRACTAL_PIP_CACHE_DIR_ARG} setuptools
21
22
  write_log "END upgrade pip and install setuptools"
22
23
  echo
23
24
 
24
25
  # Install from pip-freeze file
25
26
  write_log "START installing requirements from ${PIP_FREEZE_FILE}"
26
- "$VENVPYTHON" -m pip install -r "${PIP_FREEZE_FILE}"
27
+ "$VENVPYTHON" -m pip install ${FRACTAL_PIP_CACHE_DIR_ARG} -r "${PIP_FREEZE_FILE}"
27
28
  write_log "END installing requirements from ${PIP_FREEZE_FILE}"
28
29
  echo
29
30
 
@@ -81,6 +81,7 @@ def get_collection_replacements(
81
81
  "__FRACTAL_MAX_PIP_VERSION__",
82
82
  settings.FRACTAL_MAX_PIP_VERSION,
83
83
  ),
84
+ ("__FRACTAL_PIP_CACHE_DIR_ARG__", settings.PIP_CACHE_DIR_ARG),
84
85
  (
85
86
  "__PINNED_PACKAGE_LIST__",
86
87
  task_group.pinned_package_versions_string,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fractal-server
3
- Version: 2.10.0a0
3
+ Version: 2.10.2
4
4
  Summary: Server component of the Fractal analytics platform
5
5
  Home-page: https://github.com/fractal-analytics-platform/fractal-server
6
6
  License: BSD-3-Clause
@@ -1,4 +1,4 @@
1
- fractal_server/__init__.py,sha256=Qb19IXoi0fWBhP9l0Xx5EOFNybthKtzgo46qgF8V_s0,25
1
+ fractal_server/__init__.py,sha256=tZW5fVNCJEAwS9Hds76myD5Wbu6QwRk6i6vry6Km0qQ,23
2
2
  fractal_server/__main__.py,sha256=dEkCfzLLQrIlxsGC-HBfoR-RBMWnJDgNrxYTyzmE9c0,6146
3
3
  fractal_server/alembic.ini,sha256=MWwi7GzjzawI9cCAK1LW7NxIBQDUqD12-ptJoq5JpP0,3153
4
4
  fractal_server/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -59,7 +59,7 @@ fractal_server/app/routes/api/v2/task_group.py,sha256=4o2N0z7jK7VUVlJZMM4GveCCc4
59
59
  fractal_server/app/routes/api/v2/task_group_lifecycle.py,sha256=3o9bCC8ubMwffQPPaxQZy-CjH9IB2RkIReIecI6L2_w,9300
60
60
  fractal_server/app/routes/api/v2/workflow.py,sha256=vjCNRzMHaAB4YWbAEWGlELHXDN4GjtE26IkIiB15RGM,8682
61
61
  fractal_server/app/routes/api/v2/workflow_import.py,sha256=-7Er3FWGF_1xI2qHFO9gfLVQAok5bojd7mbzQxa9Ofw,10858
62
- fractal_server/app/routes/api/v2/workflowtask.py,sha256=ciHTwXXFiFnMF7ZpJ3Xs0q6YfuZrFvIjqndlzAEdZpo,6969
62
+ fractal_server/app/routes/api/v2/workflowtask.py,sha256=opA6hYfscPmoPhD-Xx1Z9DDeUf9Nnoo6jF2LUdNyGhM,10771
63
63
  fractal_server/app/routes/auth/__init__.py,sha256=fao6CS0WiAjHDTvBzgBVV_bSXFpEAeDBF6Z6q7rRkPc,1658
64
64
  fractal_server/app/routes/auth/_aux_auth.py,sha256=ifkNocTYatBSMYGwiR14qohmvR9SfMldceiEj6uJBrU,4783
65
65
  fractal_server/app/routes/auth/current_user.py,sha256=I3aVY5etWAJ_SH6t65Mj5TjvB2X8sAGuu1KG7FxLyPU,5883
@@ -90,9 +90,9 @@ fractal_server/app/runner/executors/slurm/ssh/_slurm_job.py,sha256=rwlqZzoGo4SAb
90
90
  fractal_server/app/runner/executors/slurm/ssh/executor.py,sha256=U2-tNE_5ECHFIoXjEvBlaSXKaIf-1IXZlDs0c34mab8,54110
91
91
  fractal_server/app/runner/executors/slurm/sudo/__init__.py,sha256=Cjn1rYvljddi96tAwS-qqGkNfOcfPzjChdaEZEObCcM,65
92
92
  fractal_server/app/runner/executors/slurm/sudo/_check_jobs_status.py,sha256=wAgwpVcr6JIslKHOuS0FhRa_6T1KCManyRJqA-fifzw,1909
93
- fractal_server/app/runner/executors/slurm/sudo/_executor_wait_thread.py,sha256=z5LlhaiqAb8pHsF1WwdzXN39C5anQmwjo1rSQgtRAYE,4422
93
+ fractal_server/app/runner/executors/slurm/sudo/_executor_wait_thread.py,sha256=uRRyVHQtK9McHCB6OsjYfDnQsu2E8At9K_UYb_pe2pg,4682
94
94
  fractal_server/app/runner/executors/slurm/sudo/_subprocess_run_as_user.py,sha256=g8wqUjSicN17UZVXlfaMomYZ-xOIbBu1oE7HdJTzfvw,5218
95
- fractal_server/app/runner/executors/slurm/sudo/executor.py,sha256=CAIPFMmsjQLxmjN8Kdpq0OlZIX9PZIiRo0XO1quKWEM,46495
95
+ fractal_server/app/runner/executors/slurm/sudo/executor.py,sha256=FVgx2mxqCLOhSoH3UTAeNc0BT0eJaxHMglGzGYePGPM,47439
96
96
  fractal_server/app/runner/executors/slurm/utils_executors.py,sha256=naPyJI0I3lD-sYHbSXbMFGUBK4h_SggA5V91Z1Ch1Xg,1416
97
97
  fractal_server/app/runner/extract_archive.py,sha256=tLpjDrX47OjTNhhoWvm6iNukg8KoieWyTb7ZfvE9eWU,2483
98
98
  fractal_server/app/runner/filenames.py,sha256=9lwu3yB4C67yiijYw8XIKaLFn3mJUt6_TCyVFM_aZUQ,206
@@ -149,7 +149,7 @@ fractal_server/app/schemas/v1/state.py,sha256=tBXzp_qW2TNNNPBo-AWEaffEU-1GkMBtUo
149
149
  fractal_server/app/schemas/v1/task.py,sha256=7BxOZ_qoRQ8n3YbQpDvB7VMcxB5fSYQmR5RLIWhuJ5U,3704
150
150
  fractal_server/app/schemas/v1/task_collection.py,sha256=uvq9bcMaGD_qHsh7YtcpoSAkVAbw12eY4DocIO3MKOg,3057
151
151
  fractal_server/app/schemas/v1/workflow.py,sha256=oRKamLSuAgrTcv3gMMxGcotDloLL2c3NNgPA39UEmmM,4467
152
- fractal_server/app/schemas/v2/__init__.py,sha256=ILWYZu_PfVVuZ8-qMRAuRuzBhne6nhS6sUzsigLcl-E,2557
152
+ fractal_server/app/schemas/v2/__init__.py,sha256=IT2a6fbRx3rt8h6jri_4gZWzTN9EVXewiWoIuBcZ-xA,2618
153
153
  fractal_server/app/schemas/v2/dataset.py,sha256=zRlcO0wDZahTW1PINdVEuARZ7GZUuEqqop7UdE3-5do,2470
154
154
  fractal_server/app/schemas/v2/dumps.py,sha256=s6dg-pHZFui6t2Ktm0SMxjKDN-v-ZqBHz9iTsBQF3eU,1712
155
155
  fractal_server/app/schemas/v2/job.py,sha256=42V-bFfMvysRplwTKGsL_WshAVsWSM6yjFqypxwrY3k,3020
@@ -160,10 +160,10 @@ fractal_server/app/schemas/v2/task.py,sha256=FFAbYwDlqowB8gVMdjFVPVHvAM0T89PYLix
160
160
  fractal_server/app/schemas/v2/task_collection.py,sha256=9c_yyFcVBXdAZpQQniy1bROhYnQT7G1BflOpMY1joPE,6250
161
161
  fractal_server/app/schemas/v2/task_group.py,sha256=EPQ1WHjIA8WDrpsTfvfRESjwUVzu6jKiaKZx45b36N4,3215
162
162
  fractal_server/app/schemas/v2/workflow.py,sha256=-KWvXnbHBFA3pj5n7mfSyLKJQSqkJmoziIEe7mpLl3M,1875
163
- fractal_server/app/schemas/v2/workflowtask.py,sha256=vDdMktYbHeYBgB5OuWSv6wRPRXWqvetkeqQ7IC5YtfA,5751
163
+ fractal_server/app/schemas/v2/workflowtask.py,sha256=FthKErVgx3a-k7WVk3nqJe1G-fl_iHND4rVrDXJ0F84,5942
164
164
  fractal_server/app/security/__init__.py,sha256=MlWVrLFPj9M2Gug-k8yATM-Cw066RugVU4KK6kMRbnQ,13019
165
165
  fractal_server/app/user_settings.py,sha256=OP1yiYKtPadxwM51_Q0hdPk3z90TCN4z1BLpQsXyWiU,1316
166
- fractal_server/config.py,sha256=wRWJqyEeH4j2puH-fGlCYKLoKFh9pzRsQkS6q1VtO9M,23173
166
+ fractal_server/config.py,sha256=y9dxlHg1_BY6grec3mlpjutEiakQlsPJr3ERU-FlRfE,24200
167
167
  fractal_server/data_migrations/README.md,sha256=_3AEFvDg9YkybDqCLlFPdDmGJvr6Tw7HRI14aZ3LOIw,398
168
168
  fractal_server/data_migrations/tools.py,sha256=LeMeASwYGtEqd-3wOLle6WARdTGAimoyMmRbbJl-hAM,572
169
169
  fractal_server/gunicorn_fractal.py,sha256=u6U01TLGlXgq1v8QmEpLih3QnsInZD7CqphgJ_GrGzc,1230
@@ -208,7 +208,7 @@ fractal_server/ssh/_fabric.py,sha256=lNy4IX1I4We6VoWa4Bz4fUPuApLMSoejpyE6I3jDZeM
208
208
  fractal_server/string_tools.py,sha256=XtMNsr5R7GmgzmFi68zkKMedHs8vjGoVMMCXqWhIk9k,2568
209
209
  fractal_server/syringe.py,sha256=3qSMW3YaMKKnLdgnooAINOPxnCOxP7y2jeAQYB21Gdo,2786
210
210
  fractal_server/tasks/__init__.py,sha256=kadmVUoIghl8s190_Tt-8f-WBqMi8u8oU4Pvw39NHE8,23
211
- fractal_server/tasks/utils.py,sha256=2ShlUSOXx53IiZT72dTCF31xXoLX9P8bY18vMj2m-mc,1059
211
+ fractal_server/tasks/utils.py,sha256=gA9nYAviWKAMJmaF5RtoT2InddU6dCT2qA6fZTYNGO4,1105
212
212
  fractal_server/tasks/v1/_TaskCollectPip.py,sha256=ARq5AoHYXH0hziEsb-nFAqbsLA-VIddXOdXL38O6_zA,3746
213
213
  fractal_server/tasks/v1/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
214
214
  fractal_server/tasks/v1/background_operations.py,sha256=0Zm8TT_RV0BxJCXbruYJCu1eXOkEcHpqnWn_BEe7huw,11829
@@ -219,29 +219,29 @@ fractal_server/tasks/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG
219
219
  fractal_server/tasks/v2/local/__init__.py,sha256=9RVItnS7OyLsJOuJjWMCicaky4ASUPQEYD4SzDs0hOE,141
220
220
  fractal_server/tasks/v2/local/_utils.py,sha256=EvhmVwYjqaNyDCUMEsTWYOUXLgEwR1xr6bu32apCEI8,2491
221
221
  fractal_server/tasks/v2/local/collect.py,sha256=JuMplfREqrPvVEGlT5kJhcmZXC_iYlwvNlkgFrCaCC0,12107
222
- fractal_server/tasks/v2/local/deactivate.py,sha256=XR1nvJY3mKCRqwPwV79rVaQmtb3J83KdmJKjTOHD-cU,9250
223
- fractal_server/tasks/v2/local/reactivate.py,sha256=R3rArAzUpMGf6xa3dGVwwXHW9WVDi5ia28AFisZsqNc,6112
222
+ fractal_server/tasks/v2/local/deactivate.py,sha256=SOFtOaR5yYm3IkbOw48TrQgzEpONQ9647KvyD_zImr8,9899
223
+ fractal_server/tasks/v2/local/reactivate.py,sha256=MeUZHx8IKrfTEf-pXlfYms8I4o-26co3jdNgSNAvw60,6053
224
224
  fractal_server/tasks/v2/ssh/__init__.py,sha256=aSQbVi6Ummt9QzcSLWNmSqYjfdxrn9ROmqgH6bDpI7k,135
225
225
  fractal_server/tasks/v2/ssh/_utils.py,sha256=LjaEYVUJDChilu3YuhxuGWYRNnVJ_zqNE9SDHdRTIHY,2824
226
226
  fractal_server/tasks/v2/ssh/collect.py,sha256=2XXEPpl4LS22A75v_k4Bd46k46tmnLNZfceHyPi3kXo,13457
227
- fractal_server/tasks/v2/ssh/deactivate.py,sha256=Ffk_UuQSBUBNBCiviuKNhEUGyZPQa4_erJKFdwgMcE8,10616
228
- fractal_server/tasks/v2/ssh/reactivate.py,sha256=jdO8iyzavzSVPcOpIZrYSEkGPYTvz5XJ5h_5-nz9yzA,7896
227
+ fractal_server/tasks/v2/ssh/deactivate.py,sha256=D8rfnC46davmDKZCipPdWZHDD4TIZ-4nr9vxZSV2aC0,11261
228
+ fractal_server/tasks/v2/ssh/reactivate.py,sha256=cmdT2P1J0FwS1NYYRrhxHsSRyUZ5uu78hS3fDrSVbKo,7837
229
229
  fractal_server/tasks/v2/templates/1_create_venv.sh,sha256=PK0jdHKtQpda1zULebBaVPORt4t6V17wa4N1ohcj5ac,548
230
- fractal_server/tasks/v2/templates/2_pip_install.sh,sha256=RDDfbFnGOK3aRuHyXqDOUNCGullzAr0zS7BFqG1CJeE,1720
230
+ fractal_server/tasks/v2/templates/2_pip_install.sh,sha256=0NLELYgEDOrbfcjMamWN91Cw90bdl9wvWjlgXeLHT98,1820
231
231
  fractal_server/tasks/v2/templates/3_pip_freeze.sh,sha256=JldREScEBI4cD_qjfX4UK7V4aI-FnX9ZvVNxgpSOBFc,168
232
232
  fractal_server/tasks/v2/templates/4_pip_show.sh,sha256=84NGHlg6JIbrQktgGKyfGsggPFzy6RBJuOmIpPUhsrw,1747
233
233
  fractal_server/tasks/v2/templates/5_get_venv_size_and_file_number.sh,sha256=q-6ZUvA6w6FDVEoSd9O63LaJ9tKZc7qAFH72SGPrd_k,284
234
- fractal_server/tasks/v2/templates/6_pip_install_from_freeze.sh,sha256=n9C8w76YraLbeTe7NhuLzvAQiJCm_akL3Mc3EMfxrHo,1007
234
+ fractal_server/tasks/v2/templates/6_pip_install_from_freeze.sh,sha256=A2y8RngEjAcRhG-_owA6P7tAdrS_AszFuGXnaeMV8u0,1122
235
235
  fractal_server/tasks/v2/utils_background.py,sha256=tikXhggqxdU7EnKdx2co3UwinlDazEjfOPQOXtO58zs,4240
236
236
  fractal_server/tasks/v2/utils_database.py,sha256=g5m3sNPZKQ3AjflhPURDlAppQcIS5T1A8a1macdswBA,1268
237
237
  fractal_server/tasks/v2/utils_package_names.py,sha256=RDg__xrvQs4ieeVzmVdMcEh95vGQYrv9Hfal-5EDBM8,2393
238
238
  fractal_server/tasks/v2/utils_python_interpreter.py,sha256=5_wrlrTqXyo1YuLZvAW9hrSoh5MyLOzdPVUlUwM7uDQ,955
239
- fractal_server/tasks/v2/utils_templates.py,sha256=MS8zu24qimJSktZaHruPxkwIl81ZoUnIVGtnMHS4Y3o,2876
239
+ fractal_server/tasks/v2/utils_templates.py,sha256=07TZpJ0Mh_A4lXVXrrH2o1VLFFGwxeRumA6DdgMgCWk,2947
240
240
  fractal_server/urls.py,sha256=5o_qq7PzKKbwq12NHSQZDmDitn5RAOeQ4xufu-2v9Zk,448
241
241
  fractal_server/utils.py,sha256=utvmBx8K9I8hRWFquxna2pBaOqe0JifDL_NVPmihEJI,3525
242
242
  fractal_server/zip_tools.py,sha256=GjDgo_sf6V_DDg6wWeBlZu5zypIxycn_l257p_YVKGc,4876
243
- fractal_server-2.10.0a0.dist-info/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
244
- fractal_server-2.10.0a0.dist-info/METADATA,sha256=G-j04Q-B4uv3h77NOrY7lh-IEVFO_7AzmV3Lp3zqw8w,4546
245
- fractal_server-2.10.0a0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
246
- fractal_server-2.10.0a0.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
247
- fractal_server-2.10.0a0.dist-info/RECORD,,
243
+ fractal_server-2.10.2.dist-info/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
244
+ fractal_server-2.10.2.dist-info/METADATA,sha256=qVhVwFIf7b6tlYACZ6HCT621DPVmF0YxwepFRoTkPU0,4544
245
+ fractal_server-2.10.2.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
246
+ fractal_server-2.10.2.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
247
+ fractal_server-2.10.2.dist-info/RECORD,,