fractal-server 2.14.4a0__py3-none-any.whl → 2.14.5__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 (25) hide show
  1. fractal_server/__init__.py +1 -1
  2. fractal_server/app/runner/exceptions.py +1 -6
  3. fractal_server/app/runner/executors/base_runner.py +16 -4
  4. fractal_server/app/runner/executors/call_command_wrapper.py +52 -0
  5. fractal_server/app/runner/executors/local/runner.py +52 -13
  6. fractal_server/app/runner/executors/slurm_common/base_slurm_runner.py +87 -52
  7. fractal_server/app/runner/executors/slurm_common/remote.py +47 -92
  8. fractal_server/app/runner/executors/slurm_common/slurm_job_task_models.py +20 -19
  9. fractal_server/app/runner/executors/slurm_ssh/runner.py +1 -2
  10. fractal_server/app/runner/executors/slurm_sudo/_subprocess_run_as_user.py +1 -4
  11. fractal_server/app/runner/executors/slurm_sudo/runner.py +3 -11
  12. fractal_server/app/runner/task_files.py +0 -8
  13. fractal_server/app/runner/v2/_slurm_ssh.py +1 -2
  14. fractal_server/app/runner/v2/_slurm_sudo.py +1 -2
  15. fractal_server/app/runner/v2/runner_functions.py +16 -30
  16. fractal_server/app/runner/versions.py +2 -11
  17. fractal_server/config.py +0 -9
  18. fractal_server/ssh/_fabric.py +4 -1
  19. {fractal_server-2.14.4a0.dist-info → fractal_server-2.14.5.dist-info}/METADATA +1 -7
  20. {fractal_server-2.14.4a0.dist-info → fractal_server-2.14.5.dist-info}/RECORD +23 -24
  21. fractal_server/app/runner/executors/slurm_common/utils_executors.py +0 -58
  22. fractal_server/app/runner/v2/runner_functions_low_level.py +0 -122
  23. {fractal_server-2.14.4a0.dist-info → fractal_server-2.14.5.dist-info}/LICENSE +0 -0
  24. {fractal_server-2.14.4a0.dist-info → fractal_server-2.14.5.dist-info}/WHEEL +0 -0
  25. {fractal_server-2.14.4a0.dist-info → fractal_server-2.14.5.dist-info}/entry_points.txt +0 -0
@@ -1,4 +1,4 @@
1
- fractal_server/__init__.py,sha256=ogag4AVsfl_E8OtJRekIRakeld3q5BpgpzxnhBgTkfs,25
1
+ fractal_server/__init__.py,sha256=UajcJi63hxo1f0KVwKUKBcFjbKvBho3JgZuYlujcsDA,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
@@ -67,45 +67,44 @@ fractal_server/app/routes/aux/validate_user_settings.py,sha256=FLVi__8YFcm_6c_K5
67
67
  fractal_server/app/routes/pagination.py,sha256=L8F5JqekF39qz-LpeScdlhb57MQnSRXjK4ZEtsZqYLk,1210
68
68
  fractal_server/app/runner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
69
69
  fractal_server/app/runner/components.py,sha256=-Ii5l8d_V6f5DFOd-Zsr8VYmOsyqw0Hox9fEFQiuqxY,66
70
- fractal_server/app/runner/exceptions.py,sha256=JC5ufHyeA1hYD_rkZUscI30DD8D903ncag7Z3AArmUY,4215
70
+ fractal_server/app/runner/exceptions.py,sha256=OPUWt8DV0V5iK5xPK8AhbJ3j3llrpmQM0pvgBCW4EqY,4033
71
71
  fractal_server/app/runner/executors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
72
- fractal_server/app/runner/executors/base_runner.py,sha256=4xxMpYycIeAOz5niaJj2xtVW_Cq-shCxP1qk4g-KwOM,5137
72
+ fractal_server/app/runner/executors/base_runner.py,sha256=QOs9AWtT3G3XxIWBNamWpH94mAzuwWMzLXpCCkOiD-0,5459
73
+ fractal_server/app/runner/executors/call_command_wrapper.py,sha256=6ykSnuC3u0eqvVE6vEcAL5CjQwphoIf-ZoadevUWOTU,1424
73
74
  fractal_server/app/runner/executors/local/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
74
75
  fractal_server/app/runner/executors/local/get_local_config.py,sha256=KiakXxOahaLgWvQJ1LVGYGXht6DMGR9x8Xu-TuT9aY4,3628
75
- fractal_server/app/runner/executors/local/runner.py,sha256=AfJ2KDUBdLqkeJTdRzYCkfJh4LiGbdnsHROko_Pk9vA,9587
76
+ fractal_server/app/runner/executors/local/runner.py,sha256=0b98oB9HX-1GS41M6yJ6KnL1MQxYjNtJPzF7u06Jcoc,10721
76
77
  fractal_server/app/runner/executors/slurm_common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
78
  fractal_server/app/runner/executors/slurm_common/_batching.py,sha256=ZY020JZlDS5mfpgpWTChQkyHU7iLE5kx2HVd57_C6XA,8850
78
79
  fractal_server/app/runner/executors/slurm_common/_job_states.py,sha256=nuV-Zba38kDrRESOVB3gaGbrSPZc4q7YGichQaeqTW0,238
79
80
  fractal_server/app/runner/executors/slurm_common/_slurm_config.py,sha256=_feRRnVVnvQa3AsOQqfULfOgaoj2o6Ze0-fwXwic8p4,15795
80
- fractal_server/app/runner/executors/slurm_common/base_slurm_runner.py,sha256=bqFD9uZfwXqmVXsScrgANp09zvbuc_LSGCDAmBV0wqo,33379
81
+ fractal_server/app/runner/executors/slurm_common/base_slurm_runner.py,sha256=M7liHYIo7r0Ej70uxQF8eg-J5Ag4HM92uSMoveBB05I,34729
81
82
  fractal_server/app/runner/executors/slurm_common/get_slurm_config.py,sha256=BW6fDpPyB0VH5leVxvwzkVH3r3hC7DuSyoWmRzHITWg,7305
82
- fractal_server/app/runner/executors/slurm_common/remote.py,sha256=Z7cnAlhYi9Orgeq6UGCl3cnWq9DX_sPrc6X1p40hVFE,5364
83
- fractal_server/app/runner/executors/slurm_common/slurm_job_task_models.py,sha256=RoxHLKOn0_wGjnY0Sv0a9nDSiqxYZHKRoMkT3p9_G1E,3607
84
- fractal_server/app/runner/executors/slurm_common/utils_executors.py,sha256=naPyJI0I3lD-sYHbSXbMFGUBK4h_SggA5V91Z1Ch1Xg,1416
83
+ fractal_server/app/runner/executors/slurm_common/remote.py,sha256=hKnNph1aSTLw1o33jHxoKhku5w_-vw5Y_bHr4J87KWc,3775
84
+ fractal_server/app/runner/executors/slurm_common/slurm_job_task_models.py,sha256=ZYi8pDKBX4fnBzJ82njH9U9uV6VbSSK1cjKav_ei8uo,3554
85
85
  fractal_server/app/runner/executors/slurm_ssh/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
86
86
  fractal_server/app/runner/executors/slurm_ssh/run_subprocess.py,sha256=vlkJ0S37wYOmLG6gKC5-x8mBivYcgK7HTVvaroBnqLk,1030
87
- fractal_server/app/runner/executors/slurm_ssh/runner.py,sha256=IJ6fHidj8Yv0H59NzOgd3ZIgYuCiOmlkB1_Rt8Jt-Qo,7901
87
+ fractal_server/app/runner/executors/slurm_ssh/runner.py,sha256=1Tf-Sx8u-6yKpIdwE7BTsfxN2VwRAs0CMc0CVoIgcOM,7826
88
88
  fractal_server/app/runner/executors/slurm_ssh/tar_commands.py,sha256=g173siyv7qtjov5i-CjTVRT8d19ibK8re3RVWbsdHYA,1845
89
89
  fractal_server/app/runner/executors/slurm_sudo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
90
- fractal_server/app/runner/executors/slurm_sudo/_subprocess_run_as_user.py,sha256=BlOz4NElv3v7rUYefyeki33uaJxcSDk6rPuVZx9ocdw,2776
91
- fractal_server/app/runner/executors/slurm_sudo/runner.py,sha256=zT-DH61oPEq4dvo08EMnXv3QMYpwAZ3teY7R3MJ5G_8,6291
90
+ fractal_server/app/runner/executors/slurm_sudo/_subprocess_run_as_user.py,sha256=Lolm9nNk810wpJmPIXPK-Op7Wt0Oj4btT6tEVO0gfjc,2607
91
+ fractal_server/app/runner/executors/slurm_sudo/runner.py,sha256=vif3PO55mfpGMiRUzkEPSsHxazj6cBbTPpbV-UuQjEk,5907
92
92
  fractal_server/app/runner/filenames.py,sha256=lPnxKHtdRizr6FqG3zOdjDPyWA7GoaJGTtiuJV0gA8E,70
93
93
  fractal_server/app/runner/set_start_and_last_task_index.py,sha256=-q4zVybAj8ek2XlbENKlfOAJ39hT_zoJoZkqzDqiAMY,1254
94
94
  fractal_server/app/runner/shutdown.py,sha256=9pfSKHDNdIcm0eY-opgRTi7y0HmvfPmYiu9JR6Idark,2082
95
- fractal_server/app/runner/task_files.py,sha256=27xFuPzSJc1Pw912CfSMPOhOIpvNwpkyLCnycqdo9lw,4365
95
+ fractal_server/app/runner/task_files.py,sha256=VR6JD5jPaZZof28j6GfkFnn_hF1DR1Om1YV8NUtslvA,4106
96
96
  fractal_server/app/runner/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
97
97
  fractal_server/app/runner/v2/_local.py,sha256=fJfSpY72BJeO_hGISIK1jE5q7lx3z3fv9_hlhNcJHLM,3072
98
- fractal_server/app/runner/v2/_slurm_ssh.py,sha256=zQYvuTF_pNuBm9t73CSnhxvh1z_fgp2EkXJWclHiI5I,3306
99
- fractal_server/app/runner/v2/_slurm_sudo.py,sha256=KmRBGFw9NDNMuMLp4H72iSj4NA3hm9f6OHJHkrMQmHM,3021
98
+ fractal_server/app/runner/v2/_slurm_ssh.py,sha256=evhY0Ec4Foa9CXkZWC5YHkD1phrpVIxBwsxHwgLCK5E,3268
99
+ fractal_server/app/runner/v2/_slurm_sudo.py,sha256=0g96dQ7Xj8om14Lcr2vQuBDrHSmQc8L4O1rD421Kd5w,2983
100
100
  fractal_server/app/runner/v2/db_tools.py,sha256=du5dKhMMFMErQXbGIgu9JvO_vtMensodyPsyDeqz1yQ,3324
101
101
  fractal_server/app/runner/v2/deduplicate_list.py,sha256=IVTE4abBU1bUprFTkxrTfYKnvkNTanWQ-KWh_etiT08,645
102
102
  fractal_server/app/runner/v2/merge_outputs.py,sha256=D1L4Taieq9i71SPQyNc1kMokgHh-sV_MqF3bv7QMDBc,907
103
103
  fractal_server/app/runner/v2/runner.py,sha256=2NQhcaGDw6XJ6Mnmiubru0yq2PpgF6fWFIE5hOVnOY0,17701
104
- fractal_server/app/runner/v2/runner_functions.py,sha256=AzsE7VF6NMz_5qc0htQkfow5_2rr-wkx50vFJTndj8I,19250
105
- fractal_server/app/runner/v2/runner_functions_low_level.py,sha256=_h_OOffq3d7V0uHa8Uvs0mj31y1GSZBUXjDDF3WjVjY,3620
104
+ fractal_server/app/runner/v2/runner_functions.py,sha256=78tJEjeN_NKVwrMJjzMvS2Bu2bYoO5Cerh8QdC3T2nw,18865
106
105
  fractal_server/app/runner/v2/submit_workflow.py,sha256=QywUGIoHAHnrWgfnyX8W9kVqKY-RvVyNLpzrbsXZOZ4,13075
107
106
  fractal_server/app/runner/v2/task_interface.py,sha256=vVNSLiUTnImo82dp910KqP4gYLX3aoiLSJsfvdzGems,2561
108
- fractal_server/app/runner/versions.py,sha256=dSaPRWqmFPHjg20kTCHmi_dmGNcCETflDtDLronNanU,852
107
+ fractal_server/app/runner/versions.py,sha256=cgKICSTSf9mPq0gSNi1fpnk2oKSHItcxDynipT9hvo8,429
109
108
  fractal_server/app/schemas/__init__.py,sha256=stURAU_t3AOBaH0HSUbV-GKhlPKngnnIMoqWc3orFyI,135
110
109
  fractal_server/app/schemas/user.py,sha256=0e4fWin0EdStjlbUnNWl7GsvnVfKMJPmVPCt-Mm_9tg,1945
111
110
  fractal_server/app/schemas/user_group.py,sha256=ejk5qHLbmmDotXT6_--kkoDHVm-T5nS9GDtivJ4LjZU,1456
@@ -127,7 +126,7 @@ fractal_server/app/schemas/v2/workflowtask.py,sha256=Q_2wM89QLMX19uthrnOigh-bxLY
127
126
  fractal_server/app/security/__init__.py,sha256=e2cveg5hQpieGD3bSPd5GTOMthvJ-HXH3buSb9WVfEU,14096
128
127
  fractal_server/app/security/signup_email.py,sha256=Xd6QYxcdmg0PHpDwmUE8XQmPcOj3Xjy5oROcIMhmltM,1472
129
128
  fractal_server/app/user_settings.py,sha256=OP1yiYKtPadxwM51_Q0hdPk3z90TCN4z1BLpQsXyWiU,1316
130
- fractal_server/config.py,sha256=McwfsTwRUzQOfN97ZjTLOHVyUvJKBqKY8xc9vK_eACA,26437
129
+ fractal_server/config.py,sha256=7njTJrbddEckO8VZjeO5_V7l9v8gCk9JwtfzYKTXvzA,26046
131
130
  fractal_server/data_migrations/README.md,sha256=_3AEFvDg9YkybDqCLlFPdDmGJvr6Tw7HRI14aZ3LOIw,398
132
131
  fractal_server/data_migrations/tools.py,sha256=LeMeASwYGtEqd-3wOLle6WARdTGAimoyMmRbbJl-hAM,572
133
132
  fractal_server/gunicorn_fractal.py,sha256=u6U01TLGlXgq1v8QmEpLih3QnsInZD7CqphgJ_GrGzc,1230
@@ -176,7 +175,7 @@ fractal_server/migrations/versions/f384e1c0cf5d_drop_task_default_args_columns.p
176
175
  fractal_server/migrations/versions/fbce16ff4e47_new_history_items.py,sha256=TDWCaIoM0Q4SpRWmR9zr_rdp3lJXhCfBPTMhtrP5xYE,3950
177
176
  fractal_server/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
178
177
  fractal_server/ssh/__init__.py,sha256=sVUmzxf7_DuXG1xoLQ1_00fo5NPhi2LJipSmU5EAkPs,124
179
- fractal_server/ssh/_fabric.py,sha256=jF7Nny0r3_PL1WjM1Zlw1I73Uqerx-mTaDWQlOaOpa0,23324
178
+ fractal_server/ssh/_fabric.py,sha256=wLjOh2kBnaBjpmGB6lbrPdcWq9D5BzbaS2vKYwOfxEo,23498
180
179
  fractal_server/string_tools.py,sha256=niViRrrZAOo0y6pEFI9L_eUYS1PoOiQZUBtngiLc2_k,1877
181
180
  fractal_server/syringe.py,sha256=3qSMW3YaMKKnLdgnooAINOPxnCOxP7y2jeAQYB21Gdo,2786
182
181
  fractal_server/tasks/__init__.py,sha256=kadmVUoIghl8s190_Tt-8f-WBqMi8u8oU4Pvw39NHE8,23
@@ -211,8 +210,8 @@ fractal_server/types/validators/_workflow_task_arguments_validators.py,sha256=HL
211
210
  fractal_server/urls.py,sha256=QjIKAC1a46bCdiPMu3AlpgFbcv6a4l3ABcd5xz190Og,471
212
211
  fractal_server/utils.py,sha256=PMwrxWFxRTQRl1b9h-NRIbFGPKqpH_hXnkAT3NfZdpY,3571
213
212
  fractal_server/zip_tools.py,sha256=GjDgo_sf6V_DDg6wWeBlZu5zypIxycn_l257p_YVKGc,4876
214
- fractal_server-2.14.4a0.dist-info/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
215
- fractal_server-2.14.4a0.dist-info/METADATA,sha256=Hl3iQzK2CtzTsqeTm4h_I4DZOX318S_WRsFjGmDEwhQ,4562
216
- fractal_server-2.14.4a0.dist-info/WHEEL,sha256=7dDg4QLnNKTvwIDR9Ac8jJaAmBC_owJrckbC0jjThyA,88
217
- fractal_server-2.14.4a0.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
218
- fractal_server-2.14.4a0.dist-info/RECORD,,
213
+ fractal_server-2.14.5.dist-info/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
214
+ fractal_server-2.14.5.dist-info/METADATA,sha256=UZkyF3UKy2ONKfsIYsUrS7u0ha7kdkeudbUet6_ZUu4,4294
215
+ fractal_server-2.14.5.dist-info/WHEEL,sha256=7dDg4QLnNKTvwIDR9Ac8jJaAmBC_owJrckbC0jjThyA,88
216
+ fractal_server-2.14.5.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
217
+ fractal_server-2.14.5.dist-info/RECORD,,
@@ -1,58 +0,0 @@
1
- from pathlib import Path
2
- from typing import Literal
3
- from typing import Optional
4
-
5
-
6
- def get_pickle_file_path(
7
- *,
8
- arg: str,
9
- workflow_dir: Path,
10
- subfolder_name: str,
11
- in_or_out: Literal["in", "out"],
12
- prefix: str,
13
- ) -> Path:
14
- if in_or_out in ["in", "out"]:
15
- output = (
16
- workflow_dir
17
- / subfolder_name
18
- / f"{prefix}_{in_or_out}_{arg}.pickle"
19
- )
20
- return output
21
- else:
22
- raise ValueError(
23
- f"Missing or unexpected value in_or_out argument, {in_or_out=}"
24
- )
25
-
26
-
27
- def get_slurm_script_file_path(
28
- *, workflow_dir: Path, subfolder_name: str, prefix: Optional[str] = None
29
- ) -> Path:
30
- prefix = prefix or "_temp"
31
- return workflow_dir / subfolder_name / f"{prefix}_slurm_submit.sbatch"
32
-
33
-
34
- def get_slurm_file_path(
35
- *,
36
- workflow_dir: Path,
37
- subfolder_name: str,
38
- arg: str = "%j",
39
- out_or_err: Literal["out", "err"],
40
- prefix: str,
41
- ) -> Path:
42
- if out_or_err == "out":
43
- return (
44
- workflow_dir
45
- / subfolder_name
46
- / f"{prefix}_slurm_{arg}.{out_or_err}"
47
- )
48
- elif out_or_err == "err":
49
- return (
50
- workflow_dir
51
- / subfolder_name
52
- / f"{prefix}_slurm_{arg}.{out_or_err}"
53
- )
54
- else:
55
- raise ValueError(
56
- "Missing or unexpected value out_or_err argument, "
57
- f"{out_or_err=}"
58
- )
@@ -1,122 +0,0 @@
1
- import json
2
- import logging
3
- import shutil
4
- import subprocess # nosec
5
- from shlex import split
6
- from typing import Any
7
-
8
- from fractal_server.app.runner.exceptions import JobExecutionError
9
- from fractal_server.app.runner.exceptions import TaskExecutionError
10
- from fractal_server.string_tools import validate_cmd
11
-
12
-
13
- def _call_command_wrapper(cmd: str, log_path: str) -> None:
14
- """
15
- Call a command and write its stdout and stderr to files
16
-
17
- Raises:
18
- TaskExecutionError: If the `subprocess.run` call returns a positive
19
- exit code
20
- JobExecutionError: If the `subprocess.run` call returns a negative
21
- exit code (e.g. due to the subprocess receiving a
22
- TERM or KILL signal)
23
- """
24
- try:
25
- validate_cmd(cmd)
26
- except ValueError as e:
27
- raise TaskExecutionError(f"Invalid command. Original error: {str(e)}")
28
-
29
- # Verify that task command is executable
30
- if shutil.which(split(cmd)[0]) is None:
31
- msg = (
32
- f'Command "{split(cmd)[0]}" is not valid. '
33
- "Hint: make sure that it is executable."
34
- )
35
- raise TaskExecutionError(msg)
36
-
37
- with open(log_path, "w") as fp_log:
38
- try:
39
- result = subprocess.run( # nosec
40
- split(cmd),
41
- stderr=fp_log,
42
- stdout=fp_log,
43
- )
44
- except Exception as e:
45
- raise e
46
-
47
- if result.returncode > 0:
48
- with open(log_path, "r") as fp_stderr:
49
- err = fp_stderr.read()
50
- raise TaskExecutionError(err)
51
- elif result.returncode < 0:
52
- raise JobExecutionError(
53
- info=f"Task failed with returncode={result.returncode}"
54
- )
55
-
56
-
57
- def run_single_task(
58
- # COMMON to all parallel tasks
59
- command: str,
60
- workflow_task_order: int,
61
- workflow_task_id: int,
62
- task_name: str,
63
- # SPECIAL for each parallel task
64
- parameters: dict[str, Any],
65
- remote_files: dict[str, str],
66
- ) -> dict[str, Any]:
67
- """
68
- Runs within an executor (AKA on the SLURM cluster).
69
- """
70
-
71
- try:
72
- args_file_remote = remote_files["args_file_remote"]
73
- metadiff_file_remote = remote_files["metadiff_file_remote"]
74
- log_file_remote = remote_files["log_file_remote"]
75
- except KeyError:
76
- raise TaskExecutionError(
77
- f"Invalid {remote_files=}",
78
- workflow_task_order=workflow_task_order,
79
- workflow_task_id=workflow_task_id,
80
- task_name=task_name,
81
- )
82
-
83
- logger = logging.getLogger(None)
84
- logger.debug(f"Now start running {command=}")
85
-
86
- # Write arguments to args.json file
87
- # NOTE: see issue 2346
88
- with open(args_file_remote, "w") as f:
89
- json.dump(parameters, f, indent=2)
90
-
91
- # Assemble full command
92
- # NOTE: this could be assembled backend-side
93
- full_command = (
94
- f"{command} "
95
- f"--args-json {args_file_remote} "
96
- f"--out-json {metadiff_file_remote}"
97
- )
98
-
99
- try:
100
- _call_command_wrapper(
101
- full_command,
102
- log_path=log_file_remote,
103
- )
104
- except TaskExecutionError as e:
105
- e.workflow_task_order = workflow_task_order
106
- e.workflow_task_id = workflow_task_id
107
- e.task_name = task_name
108
- raise e
109
-
110
- try:
111
- with open(metadiff_file_remote, "r") as f:
112
- out_meta = json.load(f)
113
- except FileNotFoundError as e:
114
- logger.debug(
115
- "Task did not produce output metadata. "
116
- f"Original FileNotFoundError: {str(e)}"
117
- )
118
- out_meta = None
119
-
120
- if out_meta == {}:
121
- return None
122
- return out_meta