fractal-server 2.15.0a3__py3-none-any.whl → 2.15.0a5__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.
Files changed (33) hide show
  1. fractal_server/__init__.py +1 -1
  2. fractal_server/app/routes/admin/v2/task_group_lifecycle.py +0 -3
  3. fractal_server/app/routes/api/v2/_aux_functions_tasks.py +22 -0
  4. fractal_server/app/routes/api/v2/task_collection.py +5 -15
  5. fractal_server/app/routes/api/v2/task_collection_pixi.py +7 -24
  6. fractal_server/app/routes/api/v2/task_group.py +3 -0
  7. fractal_server/app/routes/api/v2/task_group_lifecycle.py +0 -3
  8. fractal_server/app/schemas/v2/__init__.py +0 -1
  9. fractal_server/app/schemas/v2/task_group.py +0 -9
  10. fractal_server/config.py +29 -1
  11. fractal_server/tasks/v2/local/_utils.py +1 -5
  12. fractal_server/tasks/v2/local/collect.py +5 -8
  13. fractal_server/tasks/v2/local/collect_pixi.py +29 -13
  14. fractal_server/tasks/v2/local/deactivate.py +5 -9
  15. fractal_server/tasks/v2/local/deactivate_pixi.py +4 -10
  16. fractal_server/tasks/v2/local/reactivate.py +5 -9
  17. fractal_server/tasks/v2/local/reactivate_pixi.py +29 -14
  18. fractal_server/tasks/v2/ssh/_utils.py +45 -4
  19. fractal_server/tasks/v2/ssh/collect.py +32 -37
  20. fractal_server/tasks/v2/ssh/collect_pixi.py +51 -45
  21. fractal_server/tasks/v2/ssh/deactivate.py +21 -28
  22. fractal_server/tasks/v2/ssh/deactivate_pixi.py +20 -28
  23. fractal_server/tasks/v2/ssh/reactivate.py +23 -29
  24. fractal_server/tasks/v2/ssh/reactivate_pixi.py +158 -38
  25. fractal_server/tasks/v2/templates/pixi_2_install.sh +12 -8
  26. fractal_server/tasks/v2/templates/pixi_3_post_install.sh +0 -4
  27. fractal_server/tasks/v2/utils_background.py +7 -0
  28. fractal_server/tasks/v2/utils_templates.py +14 -1
  29. {fractal_server-2.15.0a3.dist-info → fractal_server-2.15.0a5.dist-info}/METADATA +1 -1
  30. {fractal_server-2.15.0a3.dist-info → fractal_server-2.15.0a5.dist-info}/RECORD +33 -33
  31. {fractal_server-2.15.0a3.dist-info → fractal_server-2.15.0a5.dist-info}/LICENSE +0 -0
  32. {fractal_server-2.15.0a3.dist-info → fractal_server-2.15.0a5.dist-info}/WHEEL +0 -0
  33. {fractal_server-2.15.0a3.dist-info → fractal_server-2.15.0a5.dist-info}/entry_points.txt +0 -0
@@ -1,14 +1,26 @@
1
+ import time
1
2
  from pathlib import Path
2
3
  from tempfile import TemporaryDirectory
3
4
 
4
5
  from ..utils_background import fail_and_cleanup
5
6
  from ..utils_background import get_activity_and_task_group
7
+ from ..utils_pixi import SOURCE_DIR_NAME
8
+ from ._utils import check_ssh_or_fail_and_cleanup
6
9
  from fractal_server.app.db import get_sync_db
10
+ from fractal_server.app.schemas.v2 import TaskGroupActivityActionV2
11
+ from fractal_server.app.schemas.v2 import TaskGroupActivityStatusV2
12
+ from fractal_server.config import get_settings
7
13
  from fractal_server.logger import reset_logger_handlers
8
14
  from fractal_server.logger import set_logger
9
15
  from fractal_server.ssh._fabric import SingleUseFractalSSH
10
16
  from fractal_server.ssh._fabric import SSHConfig
17
+ from fractal_server.syringe import Inject
11
18
  from fractal_server.tasks.utils import get_log_path
19
+ from fractal_server.tasks.v2.ssh._utils import _customize_and_run_template
20
+ from fractal_server.tasks.v2.utils_background import add_commit_refresh
21
+ from fractal_server.tasks.v2.utils_background import get_current_log
22
+ from fractal_server.tasks.v2.utils_templates import SCRIPTS_SUBFOLDER
23
+ from fractal_server.utils import get_timestamp
12
24
 
13
25
 
14
26
  def reactivate_ssh_pixi(
@@ -42,62 +54,170 @@ def reactivate_ssh_pixi(
42
54
  log_file_path=log_file_path,
43
55
  )
44
56
 
45
- with SingleUseFractalSSH(
46
- ssh_config=ssh_config,
47
- logger_name=LOGGER_NAME,
48
- ) as fractal_ssh:
49
-
50
- with next(get_sync_db()) as db:
51
- success, task_group, activity = get_activity_and_task_group(
52
- task_group_activity_id=task_group_activity_id,
53
- task_group_id=task_group_id,
54
- db=db,
55
- )
56
- if not success:
57
- return
58
-
59
- # Log some info
60
- logger.info("START")
61
- for key, value in task_group.model_dump(
62
- exclude={"env_info"}
63
- ).items():
64
- logger.debug(f"task_group.{key}: {value}")
65
-
66
- # Check that SSH connection works
57
+ logger.info("START")
58
+ with next(get_sync_db()) as db:
59
+ db_objects_ok, task_group, activity = get_activity_and_task_group(
60
+ task_group_activity_id=task_group_activity_id,
61
+ task_group_id=task_group_id,
62
+ db=db,
63
+ logger_name=LOGGER_NAME,
64
+ )
65
+ if not db_objects_ok:
66
+ return
67
+
68
+ with SingleUseFractalSSH(
69
+ ssh_config=ssh_config,
70
+ logger_name=LOGGER_NAME,
71
+ ) as fractal_ssh:
67
72
  try:
68
- fractal_ssh.check_connection()
69
- except Exception as e:
70
- logger.error("Cannot establish SSH connection.")
71
- fail_and_cleanup(
73
+ # Check SSH connection
74
+ ssh_ok = check_ssh_or_fail_and_cleanup(
75
+ fractal_ssh=fractal_ssh,
72
76
  task_group=task_group,
73
77
  task_group_activity=activity,
74
78
  logger_name=LOGGER_NAME,
75
79
  log_file_path=log_file_path,
76
- exception=e,
77
80
  db=db,
78
81
  )
79
- return
82
+ if not ssh_ok:
83
+ return
80
84
 
81
- try:
82
- raise NotImplementedError("pixi-task reactivation FIXME")
85
+ # Check that the (remote) task_group source_dir does not
86
+ # exist
87
+ source_dir = Path(
88
+ task_group.path, SOURCE_DIR_NAME
89
+ ).as_posix()
90
+ if fractal_ssh.remote_exists(source_dir):
91
+ error_msg = f"{source_dir} already exists."
92
+ logger.error(error_msg)
93
+ fail_and_cleanup(
94
+ task_group=task_group,
95
+ task_group_activity=activity,
96
+ logger_name=LOGGER_NAME,
97
+ log_file_path=log_file_path,
98
+ exception=FileExistsError(error_msg),
99
+ db=db,
100
+ )
101
+ return
102
+
103
+ settings = Inject(get_settings)
104
+ replacements = {
105
+ (
106
+ "__PIXI_HOME__",
107
+ settings.pixi.versions[task_group.pixi_version],
108
+ ),
109
+ ("__PACKAGE_DIR__", task_group.path),
110
+ ("__TAR_GZ_PATH__", task_group.archive_path),
111
+ (
112
+ "__IMPORT_PACKAGE_NAME__",
113
+ task_group.pkg_name.replace("-", "_"),
114
+ ),
115
+ ("__SOURCE_DIR_NAME__", SOURCE_DIR_NAME),
116
+ ("__FROZEN_OPTION__", "--frozen"),
117
+ (
118
+ "__TOKIO_WORKER_THREADS__",
119
+ str(settings.pixi.TOKIO_WORKER_THREADS),
120
+ ),
121
+ (
122
+ "__PIXI_CONCURRENT_SOLVES__",
123
+ str(settings.pixi.PIXI_CONCURRENT_SOLVES),
124
+ ),
125
+ (
126
+ "__PIXI_CONCURRENT_DOWNLOADS__",
127
+ str(settings.pixi.PIXI_CONCURRENT_DOWNLOADS),
128
+ ),
129
+ }
130
+
131
+ logger.info("installing - START")
132
+
133
+ # Set status to ONGOING and refresh logs
134
+ activity.status = TaskGroupActivityStatusV2.ONGOING
135
+ activity.log = get_current_log(log_file_path)
136
+ activity = add_commit_refresh(obj=activity, db=db)
137
+
138
+ script_dir_remote = Path(
139
+ task_group.path, SCRIPTS_SUBFOLDER
140
+ ).as_posix()
141
+ common_args = dict(
142
+ script_dir_local=(
143
+ Path(tmpdir) / SCRIPTS_SUBFOLDER
144
+ ).as_posix(),
145
+ script_dir_remote=script_dir_remote,
146
+ prefix=(
147
+ f"{int(time.time())}_"
148
+ f"{TaskGroupActivityActionV2.REACTIVATE}"
149
+ ),
150
+ logger_name=LOGGER_NAME,
151
+ fractal_ssh=fractal_ssh,
152
+ )
153
+
154
+ # Run script 1 - extract tar.gz into `source_dir`
155
+ _customize_and_run_template(
156
+ template_filename="pixi_1_extract.sh",
157
+ replacements=replacements,
158
+ **common_args,
159
+ )
160
+ activity.log = get_current_log(log_file_path)
161
+ activity = add_commit_refresh(obj=activity, db=db)
162
+
163
+ # Write pixi.lock into `source_dir`
164
+ pixi_lock_local = Path(tmpdir, "pixi.lock").as_posix()
165
+ pixi_lock_remote = Path(
166
+ task_group.path, SOURCE_DIR_NAME, "pixi.lock"
167
+ ).as_posix()
168
+ logger.info(
169
+ f"Write `env_info` contents into {pixi_lock_local}"
170
+ )
171
+ with open(pixi_lock_local, "w") as f:
172
+ f.write(task_group.env_info)
173
+ fractal_ssh.send_file(
174
+ local=pixi_lock_local,
175
+ remote=pixi_lock_remote,
176
+ )
177
+
178
+ # Run script 2 - run pixi-install command
179
+ _customize_and_run_template(
180
+ template_filename="pixi_2_install.sh",
181
+ replacements=replacements,
182
+ **common_args,
183
+ )
184
+ activity.log = get_current_log(log_file_path)
185
+ activity = add_commit_refresh(obj=activity, db=db)
186
+
187
+ # Run script 3 - post-install
188
+ _customize_and_run_template(
189
+ template_filename="pixi_3_post_install.sh",
190
+ replacements=replacements,
191
+ **common_args,
192
+ )
193
+ activity.log = get_current_log(log_file_path)
194
+ activity = add_commit_refresh(obj=activity, db=db)
195
+
196
+ fractal_ssh.run_command(cmd=f"chmod 755 {source_dir} -R")
197
+
198
+ # Finalize (write metadata to DB)
199
+ activity.status = TaskGroupActivityStatusV2.OK
200
+ activity.timestamp_ended = get_timestamp()
201
+ activity = add_commit_refresh(obj=activity, db=db)
202
+ task_group.active = True
203
+ task_group = add_commit_refresh(obj=task_group, db=db)
204
+ logger.info("END")
83
205
 
84
206
  reset_logger_handlers(logger)
85
207
 
86
208
  except Exception as reactivate_e:
87
- # Delete corrupted venv_path
209
+ # Delete corrupted source_dir
88
210
  try:
89
- logger.info(
90
- f"Now delete folder {task_group.venv_path}"
91
- )
211
+ logger.info(f"Now delete folder {source_dir}")
92
212
  fractal_ssh.remove_folder(
93
- folder=task_group.venv_path,
213
+ folder=source_dir,
94
214
  safe_root=tasks_base_dir,
95
215
  )
96
- logger.info(f"Deleted folder {task_group.venv_path}")
216
+ logger.info(f"Deleted folder {source_dir}")
97
217
  except Exception as rm_e:
98
218
  logger.error(
99
- "Removing folder failed.\n"
100
- f"Original error:\n{str(rm_e)}"
219
+ "Removing folder failed. "
220
+ f"Original error: {str(rm_e)}"
101
221
  )
102
222
 
103
223
  fail_and_cleanup(
@@ -10,6 +10,9 @@ PIXI_HOME="__PIXI_HOME__"
10
10
  PACKAGE_DIR="__PACKAGE_DIR__"
11
11
  SOURCE_DIR_NAME="__SOURCE_DIR_NAME__"
12
12
  FROZEN_OPTION="__FROZEN_OPTION__"
13
+ TOKIO_WORKER_THREADS="__TOKIO_WORKER_THREADS__"
14
+ PIXI_CONCURRENT_SOLVES="__PIXI_CONCURRENT_SOLVES__"
15
+ PIXI_CONCURRENT_DOWNLOADS="__PIXI_CONCURRENT_DOWNLOADS__"
13
16
 
14
17
  # Strip trailing `/` from `PACKAGE_DIR`
15
18
  PIXI_HOME=${PIXI_HOME%/}
@@ -24,22 +27,23 @@ PYPROJECT_TOML="${SOURCE_DIR}/pyproject.toml"
24
27
  export PIXI_HOME="${PIXI_HOME}"
25
28
  export PIXI_CACHE_DIR="${PIXI_HOME}/cache"
26
29
  export RATTLER_AUTH_FILE="${PIXI_HOME}/credentials.json"
30
+ export TOKIO_WORKER_THREADS="${TOKIO_WORKER_THREADS}"
27
31
 
28
32
  TIME_START=$(date +%s)
29
33
 
34
+ echo "Hostname: $(hostname)"
35
+
30
36
  cd "${PACKAGE_DIR}"
31
37
  write_log "Changed working directory to ${PACKAGE_DIR}"
32
38
 
33
39
  # -----------------------------------------------------------------------------
34
40
 
35
- FROZEN_FLAG=""
36
- if [[ "${FROZEN_OPTION}" == "true" ]]; then
37
- FROZEN_FLAG="--frozen"
38
- fi
39
-
40
- write_log "START '${PIXI_EXECUTABLE} install ${FROZEN_FLAG} --manifest-path ${PYPROJECT_TOML}'"
41
- ${PIXI_EXECUTABLE} install ${FROZEN_FLAG} --manifest-path "${PYPROJECT_TOML}"
42
- write_log "END '${PIXI_EXECUTABLE} install ${FROZEN_FLAG} --manifest-path ${PYPROJECT_TOML}'"
41
+ write_log "START '${PIXI_EXECUTABLE} install ${FROZEN_OPTION} --manifest-path ${PYPROJECT_TOML}'"
42
+ ${PIXI_EXECUTABLE} install \
43
+ --concurrent-solves "${PIXI_CONCURRENT_SOLVES}" \
44
+ --concurrent-downloads "${PIXI_CONCURRENT_DOWNLOADS}" \
45
+ ${FROZEN_OPTION} --manifest-path "${PYPROJECT_TOML}"
46
+ write_log "END '${PIXI_EXECUTABLE} install ${FROZEN_OPTION} --manifest-path ${PYPROJECT_TOML}'"
43
47
  echo
44
48
 
45
49
  TIME_END=$(date +%s)
@@ -70,10 +70,6 @@ write_log "Disk usage: ${ENV_DISK_USAGE}"
70
70
  write_log "Number of files: ${ENV_FILE_NUMBER}"
71
71
  echo
72
72
 
73
- write_log "START chmod 755 ${SOURCE_DIR} -R"
74
- chmod 755 "${SOURCE_DIR}" -R
75
- write_log "END chmod 755 ${SOURCE_DIR} -R"
76
-
77
73
  TIME_END=$(date +%s)
78
74
  write_log "Elapsed: $((TIME_END - TIME_START)) seconds"
79
75
  write_log "All ok, exit."
@@ -30,6 +30,7 @@ def get_activity_and_task_group(
30
30
  task_group_activity_id: int,
31
31
  task_group_id: int,
32
32
  db: DBSyncSession,
33
+ logger_name: str,
33
34
  ) -> tuple[bool, TaskGroupV2, TaskGroupActivityV2]:
34
35
  task_group = db.get(TaskGroupV2, task_group_id)
35
36
  activity = db.get(TaskGroupActivityV2, task_group_activity_id)
@@ -40,6 +41,12 @@ def get_activity_and_task_group(
40
41
  f"{task_group=}\n{activity=}. Exit."
41
42
  )
42
43
  return False, None, None
44
+
45
+ # Log some info about task group
46
+ logger = get_logger(logger_name=logger_name)
47
+ for key, value in task_group.model_dump(exclude={"env_info"}).items():
48
+ logger.debug(f"task_group.{key}: {value}")
49
+
43
50
  return True, task_group, activity
44
51
 
45
52
 
@@ -12,10 +12,21 @@ SCRIPTS_SUBFOLDER = "scripts"
12
12
  logger = set_logger(__name__)
13
13
 
14
14
 
15
+ def _check_pixi_frozen_option(replacements: list[tuple[str, str]]):
16
+ try:
17
+ replacement = next(
18
+ rep for rep in replacements if rep[0] == "__FROZEN_OPTION__"
19
+ )
20
+ if replacement[1] not in ["", "--frozen"]:
21
+ raise ValueError(f"Invalid {replacement=}.")
22
+ except StopIteration:
23
+ pass
24
+
25
+
15
26
  def customize_template(
16
27
  *,
17
28
  template_name: str,
18
- replacements: list[tuple[str, str]],
29
+ replacements: set[tuple[str, str]],
19
30
  script_path: str,
20
31
  ) -> str:
21
32
  """
@@ -26,6 +37,8 @@ def customize_template(
26
37
  replacements: List of replacements for template customization.
27
38
  script_path: Local path where the customized template will be written.
28
39
  """
40
+ _check_pixi_frozen_option(replacements=replacements)
41
+
29
42
  # Read template
30
43
  template_path = TEMPLATES_DIR / template_name
31
44
  with template_path.open("r") as f:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: fractal-server
3
- Version: 2.15.0a3
3
+ Version: 2.15.0a5
4
4
  Summary: Backend component of the Fractal analytics platform
5
5
  License: BSD-3-Clause
6
6
  Author: Tommaso Comparin
@@ -1,4 +1,4 @@
1
- fractal_server/__init__.py,sha256=tcBKTFic3HqyDYYBuQ8rt1m1EBOL362w1jDviQBo4aI,25
1
+ fractal_server/__init__.py,sha256=EiSBiIGr3J4HykWpwvOxbtsBmNSbQnrB9Kqpelw5XWA,25
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
@@ -27,14 +27,14 @@ fractal_server/app/routes/admin/v2/job.py,sha256=EOnW645RaacyNof55O_NV_4ONyb7ihM
27
27
  fractal_server/app/routes/admin/v2/project.py,sha256=MA_LdoEuSuisSGRO43TapMuJ080y5iaUGSAUgKuuKOg,1188
28
28
  fractal_server/app/routes/admin/v2/task.py,sha256=93QIbWZNnqaBhG9R9-RStDX2mpqRNN3G7BIb0KM-jeE,4312
29
29
  fractal_server/app/routes/admin/v2/task_group.py,sha256=biibAvMPD2w-267eyTm3wH2s3mITjiS5gYzwCCwmLbI,7099
30
- fractal_server/app/routes/admin/v2/task_group_lifecycle.py,sha256=8-CWyfyB22K-0VlbzJ1BFUqcFsflfeBKVeHRqePClfs,9222
30
+ fractal_server/app/routes/admin/v2/task_group_lifecycle.py,sha256=2J3M9VXWD_0j9jRTZ5APuUXl9E-aVv0qF8K02vvcO3s,9150
31
31
  fractal_server/app/routes/api/__init__.py,sha256=B8l6PSAhR10iZqHEiyTat-_0tkeKdrCigIE6DJGP5b8,638
32
32
  fractal_server/app/routes/api/v2/__init__.py,sha256=D3sRRsqkmZO6kBxUjg40q0aRDsnuXI4sOOfn0xF9JsM,2820
33
33
  fractal_server/app/routes/api/v2/_aux_functions.py,sha256=P5exwdiNm0ZxtoGw4wxvm_-u8e83gXz8iYEVFuUq_cU,12792
34
34
  fractal_server/app/routes/api/v2/_aux_functions_history.py,sha256=Z23xwvBaVEEQ5B-JsWZJpjj4_QqoXqHYONztnbAH6gw,4425
35
35
  fractal_server/app/routes/api/v2/_aux_functions_task_lifecycle.py,sha256=GpKfw9yj01LmOAuNMTOreU1PFkCKpjK5oCt7_wp35-A,6741
36
36
  fractal_server/app/routes/api/v2/_aux_functions_task_version_update.py,sha256=WLDOYCnb6fnS5avKflyx6yN24Vo1n5kJk5ZyiKbzb8Y,1175
37
- fractal_server/app/routes/api/v2/_aux_functions_tasks.py,sha256=MFYnyNPBACSHXTDLXe6cSennnpmlpajN84iivOOMW7Y,11599
37
+ fractal_server/app/routes/api/v2/_aux_functions_tasks.py,sha256=MNty8CBnTMPSAKE5gMT7tCY8QWpCQyhft_shq12hHpA,12208
38
38
  fractal_server/app/routes/api/v2/_aux_task_group_disambiguation.py,sha256=8x1_q9FyCzItnPmdSdLQuwUTy4B9xCsXscp97_lJcpM,4635
39
39
  fractal_server/app/routes/api/v2/dataset.py,sha256=6u4MFqJ3YZ0Zq6Xx8CRMrTPKW55ZaR63Uno21DqFr4Q,8889
40
40
  fractal_server/app/routes/api/v2/history.py,sha256=BHBZYFSF5lw-YYOl0OVV5yEZPMxiqjH72_KwR66EtaE,15495
@@ -45,11 +45,11 @@ 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=_BDkWtFdo8-p7kZ0Oxaidei04MfuBeaEsWtwJaKZQ_Y,8781
47
47
  fractal_server/app/routes/api/v2/task.py,sha256=ptS47XtxnHzk9bPNZV24Wfroo5sP19RE0-LsfX0ZvOc,7018
48
- fractal_server/app/routes/api/v2/task_collection.py,sha256=MRaf_-rI4dL6Sfn8XuDUZ-f9a_60V-ChPvPEEuzCzCc,12599
48
+ fractal_server/app/routes/api/v2/task_collection.py,sha256=UcS7tb9RjiDimeI-iWwD0wqnXYQEdEZT56PnPa0zC9Q,12233
49
49
  fractal_server/app/routes/api/v2/task_collection_custom.py,sha256=3EZAzTVlt3wrHAuwxfcYo7LpHefLCcQUctZuolJOQHE,6728
50
- fractal_server/app/routes/api/v2/task_collection_pixi.py,sha256=oHTTB1gXoX2mbuQTvH7SuW4GYrGOfmb9xHZ8DwChmcE,8219
51
- fractal_server/app/routes/api/v2/task_group.py,sha256=M96VoKcLqOpZlY0RWnsHza8jN0dzAWK9lxw87Om3Fbw,9063
52
- fractal_server/app/routes/api/v2/task_group_lifecycle.py,sha256=vCIAuSkepwLZw05ZLn46MOB4x6ZN_v3tXXyjv4f6rJw,10070
50
+ fractal_server/app/routes/api/v2/task_collection_pixi.py,sha256=LS5xOYRRvI25TyvPWR9anxQt3emTfuV610zUVKc7eJU,7518
51
+ fractal_server/app/routes/api/v2/task_group.py,sha256=Wmp5Rt6NQm8_EbdJyi3XOkTXxJTTd4MNIy0ja6K-ifA,9205
52
+ fractal_server/app/routes/api/v2/task_group_lifecycle.py,sha256=-uS_z8E3__t_twEqhZOzcEcAxZsgnpg-c7Ya9RF3_bs,9998
53
53
  fractal_server/app/routes/api/v2/task_version_update.py,sha256=o8W_C0I84X0u8gAMnCvi8ChiVAKrb5WzUBuJLSuujCA,8235
54
54
  fractal_server/app/routes/api/v2/workflow.py,sha256=gwMtpfUY_JiTv5_R_q1I9WNkp6nTqEVtYx8jWNJRxcU,10227
55
55
  fractal_server/app/routes/api/v2/workflow_import.py,sha256=kOGDaCj0jCGK1WSYGbnUjtUg2U1YxUY9UMH-2ilqJg4,9027
@@ -112,7 +112,7 @@ fractal_server/app/schemas/__init__.py,sha256=stURAU_t3AOBaH0HSUbV-GKhlPKngnnIMo
112
112
  fractal_server/app/schemas/user.py,sha256=t9nbyYjGCSOsxm9K97PDG3-9o27CsaFfhWb_L5nrjqA,1910
113
113
  fractal_server/app/schemas/user_group.py,sha256=x3-kqbo0q2wTP7QI0iZ7PU_9Dr957UYrFMKqS7BXLhE,1425
114
114
  fractal_server/app/schemas/user_settings.py,sha256=NpdC0Me0fgwwdfJuTSlFLCnLUjiWWzrJlPn_UPLjXnw,1862
115
- fractal_server/app/schemas/v2/__init__.py,sha256=iWYmNuTPjiPArgEmXHYQcDDfugLOEKAab70zEZ4gDP4,3162
115
+ fractal_server/app/schemas/v2/__init__.py,sha256=GqV6kJ0nKDq2vsSA4uph-nb5pmuaq013LUCcm9LbpLE,3097
116
116
  fractal_server/app/schemas/v2/accounting.py,sha256=Wylt7uWTiDIFlHJOh4XEtYitk2FjFlmnodDrJDxcr0E,397
117
117
  fractal_server/app/schemas/v2/dataset.py,sha256=NKCjBwGBC7mPiSlXktZAcleJsvlLY6KfNKw7Wx4Zfqk,1728
118
118
  fractal_server/app/schemas/v2/dumps.py,sha256=MoQHjKZy-_ujSfr7XmZ6FjB_VR-zLedx9XJj_sp5xvc,2210
@@ -123,13 +123,13 @@ fractal_server/app/schemas/v2/project.py,sha256=l96-3bCfB3knhITaLj1WSyBgbzP_k8Cd
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
125
  fractal_server/app/schemas/v2/task_collection.py,sha256=EPGe4bTRka-Y3S3_h6Wfmstq1889Cn-5cZ9ODdnsKG8,4154
126
- fractal_server/app/schemas/v2/task_group.py,sha256=NfgoQutaRKcrS1jpRL-s45BFXVuiabT7BvGooRXqY5k,3440
126
+ fractal_server/app/schemas/v2/task_group.py,sha256=NwU3FRPzPtoEhunE7dcF3su20dxaL_4YJQw4fPnTcgo,3231
127
127
  fractal_server/app/schemas/v2/workflow.py,sha256=JtjxbDO52bmY06WUMACUKpFSdJysO4DBv7wezsvODRQ,1775
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
130
130
  fractal_server/app/security/signup_email.py,sha256=Xd6QYxcdmg0PHpDwmUE8XQmPcOj3Xjy5oROcIMhmltM,1472
131
131
  fractal_server/app/user_settings.py,sha256=OP1yiYKtPadxwM51_Q0hdPk3z90TCN4z1BLpQsXyWiU,1316
132
- fractal_server/config.py,sha256=T9TbGbKrQqY2jGEGyKW78mVPPYajfypzWk7YxDdFIxg,27205
132
+ fractal_server/config.py,sha256=JvFF2nbXOKI6WPKv2UwvJmT4loStBytdG8EU6qZckY8,28259
133
133
  fractal_server/data_migrations/2_14_10.py,sha256=gMRR5QB0SDv0ToEiXVLg1VrHprM_Ii-9O1Kg-ZF-YhY,1599
134
134
  fractal_server/data_migrations/README.md,sha256=_3AEFvDg9YkybDqCLlFPdDmGJvr6Tw7HRI14aZ3LOIw,398
135
135
  fractal_server/data_migrations/tools.py,sha256=LeMeASwYGtEqd-3wOLle6WARdTGAimoyMmRbbJl-hAM,572
@@ -191,21 +191,21 @@ fractal_server/tasks/__init__.py,sha256=kadmVUoIghl8s190_Tt-8f-WBqMi8u8oU4Pvw39N
191
191
  fractal_server/tasks/utils.py,sha256=V7dj8o2AnoHhGSTYlqJHcRFhCIpmOrMOUhtiE_DvRVA,291
192
192
  fractal_server/tasks/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
193
193
  fractal_server/tasks/v2/local/__init__.py,sha256=S842wRersYKBKjc7xbmj0ov8b5i1YuCHa2f_yYuxcaI,312
194
- fractal_server/tasks/v2/local/_utils.py,sha256=n-w1IqgOTeeXLE0LoHBixrU7kkg-eYEPWepur6g7DQA,2664
195
- fractal_server/tasks/v2/local/collect.py,sha256=OIqvvXqI631MjHDGxYj3a7AmC0FhMZ2v2LD3RSZ18wU,12000
196
- fractal_server/tasks/v2/local/collect_pixi.py,sha256=hm-57SixLujb6wGUI2RBOv49g3E14j80BxGpxhW5x50,9915
197
- fractal_server/tasks/v2/local/deactivate.py,sha256=jaJ-Ejq29JQTZpiQjWHCRf2yUPZUbnjvaQrqnNkmFuo,9836
198
- fractal_server/tasks/v2/local/deactivate_pixi.py,sha256=JM5YM8HLd6YoJdkUH8k8WhXjpydfB3EIhbrL-6SdZgU,3647
199
- fractal_server/tasks/v2/local/reactivate.py,sha256=ZZhwyoQQ8Lzkk18BB4l3pr8x8VI-MnZSoClKnMvTy14,5860
200
- fractal_server/tasks/v2/local/reactivate_pixi.py,sha256=wAUpGWS8mbWn78T2Eh-b6fRDAIIh_d60DUNsFAwN69I,6542
194
+ fractal_server/tasks/v2/local/_utils.py,sha256=p2KJ4BvEwJxahICpzbvzrc5-ciLCFnLXWPCwdNGi-3Q,2495
195
+ fractal_server/tasks/v2/local/collect.py,sha256=MQncScKbWv3g9lrjF8WOhzuEoTEOOgS02RqOJno5csI,11897
196
+ fractal_server/tasks/v2/local/collect_pixi.py,sha256=i24MS7yxV0_sHkZJ8rd148n8TGqCPo6Zob5LPks3odk,10753
197
+ fractal_server/tasks/v2/local/deactivate.py,sha256=LoEs2TUoHQOq3JfxufW6zroXD-Xx_b-hLtdigEBi1JU,9732
198
+ fractal_server/tasks/v2/local/deactivate_pixi.py,sha256=_ycvnLIZ8zUFB3fZbCzDlNudh-SSetl4UkyFrClCcUU,3494
199
+ fractal_server/tasks/v2/local/reactivate.py,sha256=Q43DOadNeFyyfgNP67lUqaXmZsS6onv67XwxH_-5ANA,5756
200
+ fractal_server/tasks/v2/local/reactivate_pixi.py,sha256=wF_3gcMWO_8ArJFo4iYh-51LDZDF_1OuYYHrY9eUSL8,7320
201
201
  fractal_server/tasks/v2/ssh/__init__.py,sha256=vX5aIM9Hbn2T_cIP_LrZ5ekRqJzYm_GSfp-4Iv7kqeI,300
202
- fractal_server/tasks/v2/ssh/_utils.py,sha256=VAagoseIQW_fSsbwLencqQGyPflQii-Tvzk-r58g478,2834
203
- fractal_server/tasks/v2/ssh/collect.py,sha256=4PwHLEBjY6CV0URHfin47YXPQnhcoizBug2-Syh1CKQ,14543
204
- fractal_server/tasks/v2/ssh/collect_pixi.py,sha256=uzDVM3zN3m6U3uekH2qKjxQyeFOi9l_ZU5e-iExJCiw,13282
205
- fractal_server/tasks/v2/ssh/deactivate.py,sha256=A4v9pcualcGD7l-eWcnMbM0N0HEsectHFA9lJnDXlM0,12639
206
- fractal_server/tasks/v2/ssh/deactivate_pixi.py,sha256=18S9CQ7XA1YS4GHHFl-1HzHRtKnI2TNDSxvuFeA1HhM,5005
207
- fractal_server/tasks/v2/ssh/reactivate.py,sha256=IWekB37oCWzqiFvHe2ncsvL1qgM9RVCmqe3CMBaz5L8,8472
208
- fractal_server/tasks/v2/ssh/reactivate_pixi.py,sha256=Szs4yuDOp2kib1Sda7AFQsHtVQLJstGhtFSUjT9hZrs,3847
202
+ fractal_server/tasks/v2/ssh/_utils.py,sha256=ktVH7psQSAhh353fVUe-BwiBZHzTdgXnR-Xv_vfuX0Y,3857
203
+ fractal_server/tasks/v2/ssh/collect.py,sha256=M9gFD1h9Q1Z-BFQq65dI0vFs6HPCkKQzOkxaLddmChY,14334
204
+ fractal_server/tasks/v2/ssh/collect_pixi.py,sha256=g-dwkVbzV_4dMXAU8Ej_HmgivHmyq7p9sSOfDXNJhR4,13621
205
+ fractal_server/tasks/v2/ssh/deactivate.py,sha256=XAIy84cLT9MSTMiN67U-wfOjxMm5s7lmrGwhW0qp7BU,12439
206
+ fractal_server/tasks/v2/ssh/deactivate_pixi.py,sha256=K0yK_NPUqhFMj6cp6G_0Kfn0Yo7oQux4kT5dFPulnos,4748
207
+ fractal_server/tasks/v2/ssh/reactivate.py,sha256=NJIgMNFKaXMhbvK0iZOsMwMtsms6Boj9f8N4L01X9Bo,8271
208
+ fractal_server/tasks/v2/ssh/reactivate_pixi.py,sha256=QNlY0cqZvQblsl0eAbKBPBs_QAkN0G233Hy58PpWHxs,9595
209
209
  fractal_server/tasks/v2/templates/1_create_venv.sh,sha256=PK0jdHKtQpda1zULebBaVPORt4t6V17wa4N1ohcj5ac,548
210
210
  fractal_server/tasks/v2/templates/2_pip_install.sh,sha256=jMJPQJXHKznO6fxOOXtFXKPdCmTf1VLLWj_JL_ZdKxo,1644
211
211
  fractal_server/tasks/v2/templates/3_pip_freeze.sh,sha256=JldREScEBI4cD_qjfX4UK7V4aI-FnX9ZvVNxgpSOBFc,168
@@ -213,14 +213,14 @@ fractal_server/tasks/v2/templates/4_pip_show.sh,sha256=qm1vPy6AkKhWDjCJGXS8LqCLY
213
213
  fractal_server/tasks/v2/templates/5_get_venv_size_and_file_number.sh,sha256=q-6ZUvA6w6FDVEoSd9O63LaJ9tKZc7qAFH72SGPrd_k,284
214
214
  fractal_server/tasks/v2/templates/6_pip_install_from_freeze.sh,sha256=A2y8RngEjAcRhG-_owA6P7tAdrS_AszFuGXnaeMV8u0,1122
215
215
  fractal_server/tasks/v2/templates/pixi_1_extract.sh,sha256=1Z6sd_fTzqQkOfbFswaPZBNLUyv-OrS4euGlcoi8ces,1097
216
- fractal_server/tasks/v2/templates/pixi_2_install.sh,sha256=lvqIUH3zVr2fhZfoEwjBqAzvYhX9fID6Cea-fPTHbOI,1315
217
- fractal_server/tasks/v2/templates/pixi_3_post_install.sh,sha256=SfXl0l4wY1ygr-DErbaXrgg24UFU7wsz1O8zgbHV0NE,2618
218
- fractal_server/tasks/v2/utils_background.py,sha256=_62JAee3DltnQn14HVGfFosssgiDTyuzFkPbw2RNB8M,4575
216
+ fractal_server/tasks/v2/templates/pixi_2_install.sh,sha256=BkINfTU34vZ_zCyg_CIDEWvlAME3p6kF1qmxs4UAkPw,1595
217
+ fractal_server/tasks/v2/templates/pixi_3_post_install.sh,sha256=uDCdjXpBMsQcexZ4pvZn3ctJenM4QMsazsWMf5aw7eA,2500
218
+ fractal_server/tasks/v2/utils_background.py,sha256=_4wGETgZ3JdnJXLYKSI0Lns8LwokJL-NEzUOK5SxCJU,4811
219
219
  fractal_server/tasks/v2/utils_database.py,sha256=yi7793Uue32O59OBVUgomO42oUrVKdSKXoShBUNDdK0,1807
220
220
  fractal_server/tasks/v2/utils_package_names.py,sha256=RDg__xrvQs4ieeVzmVdMcEh95vGQYrv9Hfal-5EDBM8,2393
221
221
  fractal_server/tasks/v2/utils_pixi.py,sha256=QrRVtN8SZM_ZDoRadXK98R27irOvTJuZO4c_mCfJ92A,1221
222
222
  fractal_server/tasks/v2/utils_python_interpreter.py,sha256=5_wrlrTqXyo1YuLZvAW9hrSoh5MyLOzdPVUlUwM7uDQ,955
223
- fractal_server/tasks/v2/utils_templates.py,sha256=Kc_nSzdlV6KIsO0CQSPs1w70zLyENPqJeTQEFiz4bOg,3124
223
+ fractal_server/tasks/v2/utils_templates.py,sha256=GR8z7ODkR9tLftNAI1g1NrtN7pvDGrasp2jIlfdg4cI,3518
224
224
  fractal_server/types/__init__.py,sha256=aA_8J1xXzuiLqpwO_Qf18-qzaRcYkHzevhH_T-diXWM,2026
225
225
  fractal_server/types/validators/__init__.py,sha256=5uj6KJ9MelFZgyoq3MzXLhgWCl0yiriS7XKmb0gathg,392
226
226
  fractal_server/types/validators/_common_validators.py,sha256=MpxyaP2kwgbyCTOaVRjYnJ74Lfi0f2X0q3rjX9w3vTk,1170
@@ -229,8 +229,8 @@ fractal_server/types/validators/_workflow_task_arguments_validators.py,sha256=HL
229
229
  fractal_server/urls.py,sha256=QjIKAC1a46bCdiPMu3AlpgFbcv6a4l3ABcd5xz190Og,471
230
230
  fractal_server/utils.py,sha256=Vn35lApt1T1J8nc09sAVqd10Cy0sa3dLipcljI-hkuk,2185
231
231
  fractal_server/zip_tools.py,sha256=tqz_8f-vQ9OBRW-4OQfO6xxY-YInHTyHmZxU7U4PqZo,4885
232
- fractal_server-2.15.0a3.dist-info/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
233
- fractal_server-2.15.0a3.dist-info/METADATA,sha256=Ohmn8BKN9-iTrWF56LJDlUnfC7ZBCi_Y4jX6j0IwAt8,4245
234
- fractal_server-2.15.0a3.dist-info/WHEEL,sha256=7dDg4QLnNKTvwIDR9Ac8jJaAmBC_owJrckbC0jjThyA,88
235
- fractal_server-2.15.0a3.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
236
- fractal_server-2.15.0a3.dist-info/RECORD,,
232
+ fractal_server-2.15.0a5.dist-info/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
233
+ fractal_server-2.15.0a5.dist-info/METADATA,sha256=ItBnov8ODJ4zuzUPJQXjBLs6H5SviOLZ5K6nw1Lfjmw,4245
234
+ fractal_server-2.15.0a5.dist-info/WHEEL,sha256=7dDg4QLnNKTvwIDR9Ac8jJaAmBC_owJrckbC0jjThyA,88
235
+ fractal_server-2.15.0a5.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
236
+ fractal_server-2.15.0a5.dist-info/RECORD,,