fractal-server 2.4.1__tar.gz → 2.5.0a0__tar.gz
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-2.4.1 → fractal_server-2.5.0a0}/PKG-INFO +1 -1
- fractal_server-2.5.0a0/fractal_server/__init__.py +1 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/__main__.py +3 -4
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/db/__init__.py +4 -1
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/models/v1/task.py +0 -5
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/models/v2/workflowtask.py +2 -10
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/admin/v2.py +0 -30
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/api/v2/__init__.py +0 -4
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/api/v2/_aux_functions.py +11 -46
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/api/v2/workflow.py +23 -54
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/api/v2/workflowtask.py +9 -33
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/executors/slurm/sudo/_subprocess_run_as_user.py +1 -1
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/executors/slurm/sudo/executor.py +1 -1
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/v2/__init__.py +1 -4
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/v2/_slurm_common/get_slurm_config.py +1 -4
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/v2/handle_failed_job.py +2 -9
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/v2/runner.py +42 -70
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/v2/runner_functions.py +0 -58
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/v2/runner_functions_low_level.py +7 -21
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/schemas/v2/__init__.py +0 -1
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/schemas/v2/dumps.py +2 -23
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/schemas/v2/task.py +0 -5
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/schemas/v2/workflowtask.py +4 -29
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/security/__init__.py +22 -15
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/migrations/env.py +4 -7
- fractal_server-2.5.0a0/fractal_server/migrations/naming_convention.py +7 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/migrations/versions/091b01f51f88_add_usergroup_and_linkusergroup_table.py +1 -1
- fractal_server-2.5.0a0/fractal_server/migrations/versions/501961cfcd85_remove_link_between_v1_and_v2_tasks_.py +97 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/pyproject.toml +2 -2
- fractal_server-2.4.1/fractal_server/__init__.py +0 -1
- fractal_server-2.4.1/fractal_server/app/routes/api/v2/task_legacy.py +0 -59
- fractal_server-2.4.1/fractal_server/app/runner/v2/v1_compat.py +0 -31
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/LICENSE +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/README.md +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/alembic.ini +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/__init__.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/models/__init__.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/models/linkusergroup.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/models/linkuserproject.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/models/security.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/models/v1/__init__.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/models/v1/dataset.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/models/v1/job.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/models/v1/project.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/models/v1/state.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/models/v1/workflow.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/models/v2/__init__.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/models/v2/collection_state.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/models/v2/dataset.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/models/v2/job.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/models/v2/project.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/models/v2/task.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/models/v2/workflow.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/__init__.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/admin/__init__.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/admin/v1.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/api/__init__.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/api/v1/__init__.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/api/v1/_aux_functions.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/api/v1/dataset.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/api/v1/job.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/api/v1/project.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/api/v1/task.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/api/v1/task_collection.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/api/v1/workflow.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/api/v1/workflowtask.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/api/v2/dataset.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/api/v2/images.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/api/v2/job.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/api/v2/project.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/api/v2/status.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/api/v2/submit.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/api/v2/task.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/api/v2/task_collection.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/api/v2/task_collection_custom.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/auth/__init__.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/auth/_aux_auth.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/auth/current_user.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/auth/group.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/auth/group_names.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/auth/login.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/auth/oauth.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/auth/register.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/auth/router.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/auth/users.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/aux/__init__.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/aux/_job.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/aux/_runner.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/.gitignore +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/__init__.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/async_wrap.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/components.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/compress_folder.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/exceptions.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/executors/__init__.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/executors/slurm/__init__.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/executors/slurm/_batching.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/executors/slurm/_slurm_config.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/executors/slurm/remote.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/executors/slurm/ssh/__init__.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/executors/slurm/ssh/_executor_wait_thread.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/executors/slurm/ssh/_slurm_job.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/executors/slurm/ssh/executor.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/executors/slurm/sudo/__init__.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/executors/slurm/sudo/_check_jobs_status.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/executors/slurm/sudo/_executor_wait_thread.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/extract_archive.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/filenames.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/run_subprocess.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/set_start_and_last_task_index.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/shutdown.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/task_files.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/v1/__init__.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/v1/_common.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/v1/_local/__init__.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/v1/_local/_local_config.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/v1/_local/_submit_setup.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/v1/_local/executor.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/v1/_slurm/__init__.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/v1/_slurm/_submit_setup.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/v1/_slurm/get_slurm_config.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/v1/common.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/v1/handle_failed_job.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/v2/_local/__init__.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/v2/_local/_local_config.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/v2/_local/_submit_setup.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/v2/_local/executor.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/v2/_local_experimental/__init__.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/v2/_local_experimental/_local_config.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/v2/_local_experimental/_submit_setup.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/v2/_local_experimental/executor.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/v2/_slurm_common/__init__.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/v2/_slurm_ssh/__init__.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/v2/_slurm_ssh/_submit_setup.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/v2/_slurm_sudo/__init__.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/v2/_slurm_sudo/_submit_setup.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/v2/deduplicate_list.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/v2/merge_outputs.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/v2/task_interface.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/versions.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/schemas/__init__.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/schemas/_validators.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/schemas/user.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/schemas/user_group.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/schemas/v1/__init__.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/schemas/v1/applyworkflow.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/schemas/v1/dataset.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/schemas/v1/dumps.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/schemas/v1/manifest.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/schemas/v1/project.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/schemas/v1/state.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/schemas/v1/task.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/schemas/v1/task_collection.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/schemas/v1/workflow.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/schemas/v2/dataset.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/schemas/v2/job.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/schemas/v2/manifest.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/schemas/v2/project.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/schemas/v2/status.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/schemas/v2/task_collection.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/schemas/v2/workflow.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/config.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/data_migrations/2_4_0.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/data_migrations/README.md +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/gunicorn_fractal.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/images/__init__.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/images/models.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/images/tools.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/logger.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/main.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/migrations/README +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/migrations/script.py.mako +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/migrations/versions/4c308bcaea2b_add_task_args_schema_and_task_args_.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/migrations/versions/4cedeb448a53_workflowtask_foreign_keys_not_nullables.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/migrations/versions/50a13d6138fd_initial_schema.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/migrations/versions/5bf02391cfef_v2.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/migrations/versions/70e77f1c38b0_add_applyworkflow_first_task_index_and_.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/migrations/versions/71eefd1dd202_add_slurm_accounts.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/migrations/versions/84bf0fffde30_add_dumps_to_applyworkflow.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/migrations/versions/8f79bd162e35_add_docs_info_and_docs_link_to_task_.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/migrations/versions/97f444d47249_add_applyworkflow_project_dump.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/migrations/versions/99ea79d9e5d2_add_dataset_history.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/migrations/versions/9fd26a2b0de4_add_workflow_timestamp_created.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/migrations/versions/a7f4d6137b53_add_workflow_dump_to_applyworkflow.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/migrations/versions/d4fe3708d309_make_applyworkflow_workflow_dump_non_.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/migrations/versions/e75cac726012_make_applyworkflow_start_timestamp_not_.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/migrations/versions/efa89c30e0a4_add_project_timestamp_created.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/migrations/versions/f384e1c0cf5d_drop_task_default_args_columns.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/py.typed +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/ssh/__init__.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/ssh/_fabric.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/string_tools.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/syringe.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/tasks/__init__.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/tasks/utils.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/tasks/v1/_TaskCollectPip.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/tasks/v1/__init__.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/tasks/v1/background_operations.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/tasks/v1/endpoint_operations.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/tasks/v1/get_collection_data.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/tasks/v1/utils.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/tasks/v2/_TaskCollectPip.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/tasks/v2/__init__.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/tasks/v2/_venv_pip.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/tasks/v2/background_operations.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/tasks/v2/background_operations_ssh.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/tasks/v2/endpoint_operations.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/tasks/v2/templates/_1_create_venv.sh +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/tasks/v2/templates/_2_upgrade_pip.sh +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/tasks/v2/templates/_3_pip_install.sh +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/tasks/v2/templates/_4_pip_freeze.sh +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/tasks/v2/templates/_5_pip_show.sh +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/tasks/v2/utils.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/urls.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/utils.py +0 -0
- {fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/zip_tools.py +0 -0
@@ -0,0 +1 @@
|
|
1
|
+
__VERSION__ = "2.5.0a0"
|
@@ -88,12 +88,11 @@ def set_db():
|
|
88
88
|
alembic.config.main(argv=alembic_args)
|
89
89
|
print("END: alembic.config")
|
90
90
|
# Insert default group
|
91
|
-
print(
|
91
|
+
print()
|
92
92
|
_create_first_group()
|
93
|
-
print(
|
93
|
+
print()
|
94
94
|
# NOTE: It will be fixed with #1739
|
95
95
|
settings = Inject(get_settings)
|
96
|
-
print("START: First user creation")
|
97
96
|
asyncio.run(
|
98
97
|
_create_first_user(
|
99
98
|
email=settings.FRACTAL_DEFAULT_ADMIN_EMAIL,
|
@@ -103,7 +102,7 @@ def set_db():
|
|
103
102
|
is_verified=True,
|
104
103
|
)
|
105
104
|
)
|
106
|
-
print(
|
105
|
+
print()
|
107
106
|
|
108
107
|
|
109
108
|
def update_db_data():
|
@@ -2,6 +2,7 @@
|
|
2
2
|
`db` module, loosely adapted from
|
3
3
|
https://testdriven.io/blog/fastapi-sqlmodel/#async-sqlmodel
|
4
4
|
"""
|
5
|
+
import sqlite3
|
5
6
|
from typing import AsyncGenerator
|
6
7
|
from typing import Generator
|
7
8
|
|
@@ -21,7 +22,9 @@ from ...syringe import Inject
|
|
21
22
|
logger = set_logger(__name__)
|
22
23
|
|
23
24
|
SQLITE_WARNING_MESSAGE = (
|
24
|
-
"SQLite is supported (
|
25
|
+
"SQLite is supported (supported version >=3.37, "
|
26
|
+
f"current {sqlite3.sqlite_version=}) "
|
27
|
+
"but discouraged in production. "
|
25
28
|
"Given its partial support for ForeignKey constraints, "
|
26
29
|
"database consistency cannot be guaranteed."
|
27
30
|
)
|
@@ -5,7 +5,6 @@ from typing import Optional
|
|
5
5
|
|
6
6
|
from pydantic import HttpUrl
|
7
7
|
from sqlalchemy import Column
|
8
|
-
from sqlalchemy import sql
|
9
8
|
from sqlalchemy.types import JSON
|
10
9
|
from sqlmodel import Field
|
11
10
|
from sqlmodel import SQLModel
|
@@ -49,10 +48,6 @@ class Task(_TaskBaseV1, SQLModel, table=True):
|
|
49
48
|
docs_info: Optional[str] = None
|
50
49
|
docs_link: Optional[HttpUrl] = None
|
51
50
|
|
52
|
-
is_v2_compatible: bool = Field(
|
53
|
-
default=False, sa_column_kwargs={"server_default": sql.false()}
|
54
|
-
)
|
55
|
-
|
56
51
|
@property
|
57
52
|
def parallelization_level(self) -> Optional[str]:
|
58
53
|
try:
|
{fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/models/v2/workflowtask.py
RENAMED
@@ -8,7 +8,6 @@ from sqlmodel import Field
|
|
8
8
|
from sqlmodel import Relationship
|
9
9
|
from sqlmodel import SQLModel
|
10
10
|
|
11
|
-
from ..v1.task import Task
|
12
11
|
from .task import TaskV2
|
13
12
|
|
14
13
|
|
@@ -37,13 +36,6 @@ class WorkflowTaskV2(SQLModel, table=True):
|
|
37
36
|
)
|
38
37
|
|
39
38
|
# Task
|
40
|
-
is_legacy_task: bool
|
41
39
|
task_type: str
|
42
|
-
task_id:
|
43
|
-
task:
|
44
|
-
sa_relationship_kwargs=dict(lazy="selectin")
|
45
|
-
)
|
46
|
-
task_legacy_id: Optional[int] = Field(foreign_key="task.id")
|
47
|
-
task_legacy: Optional[Task] = Relationship(
|
48
|
-
sa_relationship_kwargs=dict(lazy="selectin")
|
49
|
-
)
|
40
|
+
task_id: int = Field(foreign_key="taskv2.id")
|
41
|
+
task: TaskV2 = Relationship(sa_relationship_kwargs=dict(lazy="selectin"))
|
@@ -24,7 +24,6 @@ from ....utils import get_timestamp
|
|
24
24
|
from ....zip_tools import _zip_folder_to_byte_stream_iterator
|
25
25
|
from ...db import AsyncSession
|
26
26
|
from ...db import get_async_db
|
27
|
-
from ...models.v1 import Task
|
28
27
|
from ...models.v2 import JobV2
|
29
28
|
from ...models.v2 import ProjectV2
|
30
29
|
from ...models.v2 import TaskV2
|
@@ -281,35 +280,6 @@ async def download_job_logs(
|
|
281
280
|
)
|
282
281
|
|
283
282
|
|
284
|
-
class TaskCompatibility(BaseModel):
|
285
|
-
is_v2_compatible: bool
|
286
|
-
|
287
|
-
|
288
|
-
@router_admin_v2.patch(
|
289
|
-
"/task-v1/{task_id}/",
|
290
|
-
status_code=status.HTTP_200_OK,
|
291
|
-
)
|
292
|
-
async def flag_task_v1_as_v2_compatible(
|
293
|
-
task_id: int,
|
294
|
-
compatibility: TaskCompatibility,
|
295
|
-
user: UserOAuth = Depends(current_active_superuser),
|
296
|
-
db: AsyncSession = Depends(get_async_db),
|
297
|
-
) -> Response:
|
298
|
-
|
299
|
-
task = await db.get(Task, task_id)
|
300
|
-
if task is None:
|
301
|
-
raise HTTPException(
|
302
|
-
status_code=status.HTTP_404_NOT_FOUND,
|
303
|
-
detail=f"Task {task_id} not found",
|
304
|
-
)
|
305
|
-
|
306
|
-
task.is_v2_compatible = compatibility.is_v2_compatible
|
307
|
-
await db.commit()
|
308
|
-
await db.close()
|
309
|
-
|
310
|
-
return Response(status_code=status.HTTP_200_OK)
|
311
|
-
|
312
|
-
|
313
283
|
class TaskV2Minimal(BaseModel):
|
314
284
|
|
315
285
|
id: int
|
{fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/api/v2/__init__.py
RENAMED
@@ -12,7 +12,6 @@ from .submit import router as submit_job_router_v2
|
|
12
12
|
from .task import router as task_router_v2
|
13
13
|
from .task_collection import router as task_collection_router_v2
|
14
14
|
from .task_collection_custom import router as task_collection_router_v2_custom
|
15
|
-
from .task_legacy import router as task_legacy_router_v2
|
16
15
|
from .workflow import router as workflow_router_v2
|
17
16
|
from .workflowtask import router as workflowtask_router_v2
|
18
17
|
from fractal_server.config import get_settings
|
@@ -38,9 +37,6 @@ router_api_v2.include_router(
|
|
38
37
|
tags=["V2 Task Collection"],
|
39
38
|
)
|
40
39
|
router_api_v2.include_router(task_router_v2, prefix="/task", tags=["V2 Task"])
|
41
|
-
router_api_v2.include_router(
|
42
|
-
task_legacy_router_v2, prefix="/task-legacy", tags=["V2 Task Legacy"]
|
43
|
-
)
|
44
40
|
router_api_v2.include_router(workflow_router_v2, tags=["V2 Workflow"])
|
45
41
|
router_api_v2.include_router(workflowtask_router_v2, tags=["V2 WorkflowTask"])
|
46
42
|
router_api_v2.include_router(status_router_v2, tags=["V2 Status"])
|
{fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/api/v2/_aux_functions.py
RENAMED
@@ -13,7 +13,6 @@ from sqlmodel import select
|
|
13
13
|
from sqlmodel.sql.expression import SelectOfScalar
|
14
14
|
|
15
15
|
from ....db import AsyncSession
|
16
|
-
from ....models.v1 import Task
|
17
16
|
from ....models.v2 import DatasetV2
|
18
17
|
from ....models.v2 import JobV2
|
19
18
|
from ....models.v2 import LinkUserProjectV2
|
@@ -389,7 +388,6 @@ async def _workflow_insert_task(
|
|
389
388
|
*,
|
390
389
|
workflow_id: int,
|
391
390
|
task_id: int,
|
392
|
-
is_legacy_task: bool = False,
|
393
391
|
order: Optional[int] = None,
|
394
392
|
meta_parallel: Optional[dict[str, Any]] = None,
|
395
393
|
meta_non_parallel: Optional[dict[str, Any]] = None,
|
@@ -404,7 +402,7 @@ async def _workflow_insert_task(
|
|
404
402
|
Args:
|
405
403
|
workflow_id:
|
406
404
|
task_id:
|
407
|
-
|
405
|
+
|
408
406
|
order:
|
409
407
|
meta_parallel:
|
410
408
|
meta_non_parallel:
|
@@ -420,52 +418,21 @@ async def _workflow_insert_task(
|
|
420
418
|
if order is None:
|
421
419
|
order = len(db_workflow.task_list)
|
422
420
|
|
423
|
-
# Get task from db
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
db_task = await db.get(Task, task_id)
|
429
|
-
if db_task is None:
|
430
|
-
raise ValueError(f"Task {task_id} not found.")
|
431
|
-
task_type = "parallel"
|
432
|
-
|
433
|
-
final_args_parallel = db_task.default_args_from_args_schema.copy()
|
434
|
-
final_args_non_parallel = {}
|
435
|
-
final_meta_parallel = (db_task.meta or {}).copy()
|
436
|
-
final_meta_non_parallel = {}
|
437
|
-
|
438
|
-
else:
|
439
|
-
db_task = await db.get(TaskV2, task_id)
|
440
|
-
if db_task is None:
|
441
|
-
raise ValueError(f"TaskV2 {task_id} not found.")
|
442
|
-
task_type = db_task.type
|
443
|
-
|
444
|
-
final_args_non_parallel = {}
|
445
|
-
final_args_parallel = {}
|
446
|
-
final_meta_parallel = (db_task.meta_parallel or {}).copy()
|
447
|
-
final_meta_non_parallel = (db_task.meta_non_parallel or {}).copy()
|
448
|
-
|
449
|
-
# Combine arg_parallel
|
450
|
-
if args_parallel is not None:
|
451
|
-
for k, v in args_parallel.items():
|
452
|
-
final_args_parallel[k] = v
|
453
|
-
if final_args_parallel == {}:
|
454
|
-
final_args_parallel = None
|
455
|
-
# Combine arg_non_parallel
|
456
|
-
if args_non_parallel is not None:
|
457
|
-
for k, v in args_non_parallel.items():
|
458
|
-
final_args_non_parallel[k] = v
|
459
|
-
if final_args_non_parallel == {}:
|
460
|
-
final_args_non_parallel = None
|
421
|
+
# Get task from db
|
422
|
+
db_task = await db.get(TaskV2, task_id)
|
423
|
+
if db_task is None:
|
424
|
+
raise ValueError(f"TaskV2 {task_id} not found.")
|
425
|
+
task_type = db_task.type
|
461
426
|
|
462
427
|
# Combine meta_parallel (higher priority)
|
463
428
|
# and db_task.meta_parallel (lower priority)
|
429
|
+
final_meta_parallel = (db_task.meta_parallel or {}).copy()
|
464
430
|
final_meta_parallel.update(meta_parallel or {})
|
465
431
|
if final_meta_parallel == {}:
|
466
432
|
final_meta_parallel = None
|
467
433
|
# Combine meta_non_parallel (higher priority)
|
468
434
|
# and db_task.meta_non_parallel (lower priority)
|
435
|
+
final_meta_non_parallel = (db_task.meta_non_parallel or {}).copy()
|
469
436
|
final_meta_non_parallel.update(meta_non_parallel or {})
|
470
437
|
if final_meta_non_parallel == {}:
|
471
438
|
final_meta_non_parallel = None
|
@@ -479,11 +446,9 @@ async def _workflow_insert_task(
|
|
479
446
|
# Create DB entry
|
480
447
|
wf_task = WorkflowTaskV2(
|
481
448
|
task_type=task_type,
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
args_non_parallel=final_args_non_parallel,
|
486
|
-
args_parallel=final_args_parallel,
|
449
|
+
task_id=task_id,
|
450
|
+
args_non_parallel=args_non_parallel,
|
451
|
+
args_parallel=args_parallel,
|
487
452
|
meta_parallel=final_meta_parallel,
|
488
453
|
meta_non_parallel=final_meta_non_parallel,
|
489
454
|
**input_filters_kwarg,
|
{fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/api/v2/workflow.py
RENAMED
@@ -11,7 +11,6 @@ from .....logger import reset_logger_handlers
|
|
11
11
|
from .....logger import set_logger
|
12
12
|
from ....db import AsyncSession
|
13
13
|
from ....db import get_async_db
|
14
|
-
from ....models.v1 import Task as TaskV1
|
15
14
|
from ....models.v2 import JobV2
|
16
15
|
from ....models.v2 import ProjectV2
|
17
16
|
from ....models.v2 import TaskV2
|
@@ -242,23 +241,13 @@ async def export_worfklow(
|
|
242
241
|
# Emit a warning when exporting a workflow with custom tasks
|
243
242
|
logger = set_logger(None)
|
244
243
|
for wftask in workflow.task_list:
|
245
|
-
if wftask.
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
"expected."
|
253
|
-
)
|
254
|
-
else:
|
255
|
-
if wftask.task.owner is not None:
|
256
|
-
logger.warning(
|
257
|
-
f"Custom tasks (like the one with id={wftask.task_id} and "
|
258
|
-
f'source="{wftask.task.source}") are not meant to be '
|
259
|
-
"portable; re-importing this workflow may not work as "
|
260
|
-
"expected."
|
261
|
-
)
|
244
|
+
if wftask.task.owner is not None:
|
245
|
+
logger.warning(
|
246
|
+
f"Custom tasks (like the one with id={wftask.task_id} and "
|
247
|
+
f'source="{wftask.task.source}") are not meant to be '
|
248
|
+
"portable; re-importing this workflow may not work as "
|
249
|
+
"expected."
|
250
|
+
)
|
262
251
|
reset_logger_handlers(logger)
|
263
252
|
|
264
253
|
await db.close()
|
@@ -296,38 +285,22 @@ async def import_workflow(
|
|
296
285
|
|
297
286
|
# Check that all required tasks are available
|
298
287
|
source_to_id = {}
|
299
|
-
source_to_id_legacy = {}
|
300
288
|
|
301
289
|
for wf_task in workflow.task_list:
|
302
290
|
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
source_to_id_legacy[source] = tasks_by_source[0].id
|
317
|
-
else:
|
318
|
-
source = wf_task.task.source
|
319
|
-
if source not in source_to_id.keys():
|
320
|
-
stm = select(TaskV2).where(TaskV2.source == source)
|
321
|
-
tasks_by_source = (await db.execute(stm)).scalars().all()
|
322
|
-
if len(tasks_by_source) != 1:
|
323
|
-
raise HTTPException(
|
324
|
-
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
325
|
-
detail=(
|
326
|
-
f"Found {len(tasks_by_source)} tasks "
|
327
|
-
f"with {source=}."
|
328
|
-
),
|
329
|
-
)
|
330
|
-
source_to_id[source] = tasks_by_source[0].id
|
291
|
+
source = wf_task.task.source
|
292
|
+
if source not in source_to_id.keys():
|
293
|
+
stm = select(TaskV2).where(TaskV2.source == source)
|
294
|
+
tasks_by_source = (await db.execute(stm)).scalars().all()
|
295
|
+
if len(tasks_by_source) != 1:
|
296
|
+
raise HTTPException(
|
297
|
+
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
298
|
+
detail=(
|
299
|
+
f"Found {len(tasks_by_source)} tasks "
|
300
|
+
f"with {source=}."
|
301
|
+
),
|
302
|
+
)
|
303
|
+
source_to_id[source] = tasks_by_source[0].id
|
331
304
|
|
332
305
|
# Create new Workflow (with empty task_list)
|
333
306
|
db_workflow = WorkflowV2(
|
@@ -341,15 +314,11 @@ async def import_workflow(
|
|
341
314
|
# Insert tasks
|
342
315
|
|
343
316
|
for wf_task in workflow.task_list:
|
344
|
-
|
345
|
-
|
346
|
-
task_id = source_to_id_legacy[source]
|
347
|
-
else:
|
348
|
-
source = wf_task.task.source
|
349
|
-
task_id = source_to_id[source]
|
317
|
+
source = wf_task.task.source
|
318
|
+
task_id = source_to_id[source]
|
350
319
|
|
351
320
|
new_wf_task = WorkflowTaskCreateV2(
|
352
|
-
**wf_task.dict(exclude_none=True, exclude={"task"
|
321
|
+
**wf_task.dict(exclude_none=True, exclude={"task"})
|
353
322
|
)
|
354
323
|
# Insert task
|
355
324
|
await _workflow_insert_task(
|
{fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/routes/api/v2/workflowtask.py
RENAMED
@@ -9,7 +9,6 @@ from fastapi import status
|
|
9
9
|
|
10
10
|
from ....db import AsyncSession
|
11
11
|
from ....db import get_async_db
|
12
|
-
from ....models.v1 import Task
|
13
12
|
from ....models.v2 import TaskV2
|
14
13
|
from ....schemas.v2 import WorkflowTaskCreateV2
|
15
14
|
from ....schemas.v2 import WorkflowTaskReadV2
|
@@ -44,27 +43,14 @@ async def create_workflowtask(
|
|
44
43
|
project_id=project_id, workflow_id=workflow_id, user_id=user.id, db=db
|
45
44
|
)
|
46
45
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
)
|
54
|
-
if not task.is_v2_compatible:
|
55
|
-
raise HTTPException(
|
56
|
-
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
57
|
-
detail=f"Task {task_id} is not V2-compatible.",
|
58
|
-
)
|
59
|
-
else:
|
60
|
-
task = await db.get(TaskV2, task_id)
|
61
|
-
if not task:
|
62
|
-
raise HTTPException(
|
63
|
-
status_code=status.HTTP_404_NOT_FOUND,
|
64
|
-
detail=f"TaskV2 {task_id} not found.",
|
65
|
-
)
|
46
|
+
task = await db.get(TaskV2, task_id)
|
47
|
+
if not task:
|
48
|
+
raise HTTPException(
|
49
|
+
status_code=status.HTTP_404_NOT_FOUND,
|
50
|
+
detail=f"TaskV2 {task_id} not found.",
|
51
|
+
)
|
66
52
|
|
67
|
-
if
|
53
|
+
if task.type == "parallel":
|
68
54
|
if (
|
69
55
|
new_task.meta_non_parallel is not None
|
70
56
|
or new_task.args_non_parallel is not None
|
@@ -74,7 +60,7 @@ async def create_workflowtask(
|
|
74
60
|
detail=(
|
75
61
|
"Cannot set `WorkflowTaskV2.meta_non_parallel` or "
|
76
62
|
"`WorkflowTask.args_non_parallel` if the associated Task "
|
77
|
-
"is `parallel
|
63
|
+
"is `parallel`."
|
78
64
|
),
|
79
65
|
)
|
80
66
|
elif task.type == "non_parallel":
|
@@ -93,7 +79,6 @@ async def create_workflowtask(
|
|
93
79
|
|
94
80
|
workflow_task = await _workflow_insert_task(
|
95
81
|
workflow_id=workflow.id,
|
96
|
-
is_legacy_task=new_task.is_legacy_task,
|
97
82
|
task_id=task_id,
|
98
83
|
order=new_task.order,
|
99
84
|
meta_non_parallel=new_task.meta_non_parallel,
|
@@ -182,16 +167,7 @@ async def update_workflowtask(
|
|
182
167
|
for key, value in workflow_task_update.dict(exclude_unset=True).items():
|
183
168
|
if key == "args_parallel":
|
184
169
|
# Get default arguments via a Task property method
|
185
|
-
|
186
|
-
default_args = (
|
187
|
-
db_wf_task.task_legacy.default_args_from_args_schema
|
188
|
-
)
|
189
|
-
actual_args = deepcopy(default_args)
|
190
|
-
if value is not None:
|
191
|
-
for k, v in value.items():
|
192
|
-
actual_args[k] = v
|
193
|
-
else:
|
194
|
-
actual_args = deepcopy(value)
|
170
|
+
actual_args = deepcopy(value)
|
195
171
|
if not actual_args:
|
196
172
|
actual_args = None
|
197
173
|
setattr(db_wf_task, key, actual_args)
|
@@ -49,7 +49,7 @@ def _run_command_as_user(
|
|
49
49
|
"""
|
50
50
|
logger.debug(f'[_run_command_as_user] {user=}, cmd="{cmd}"')
|
51
51
|
if user:
|
52
|
-
new_cmd = f"sudo --non-interactive -u {user} {cmd}"
|
52
|
+
new_cmd = f"sudo --set-home --non-interactive -u {user} {cmd}"
|
53
53
|
else:
|
54
54
|
new_cmd = cmd
|
55
55
|
res = subprocess.run( # nosec
|
@@ -1134,7 +1134,7 @@ class FractalSlurmExecutor(SlurmExecutor):
|
|
1134
1134
|
f.write(sbatch_script)
|
1135
1135
|
|
1136
1136
|
# Prepare submission command
|
1137
|
-
pre_command = f"sudo --non-interactive -u {self.slurm_user}"
|
1137
|
+
pre_command = f"sudo --set-home --non-interactive -u {self.slurm_user}"
|
1138
1138
|
submit_command = f"sbatch --parsable {job.slurm_script}"
|
1139
1139
|
full_command = f"{pre_command} {submit_command}"
|
1140
1140
|
|
@@ -208,10 +208,7 @@ async def submit_workflow(
|
|
208
208
|
# Create all tasks subfolders
|
209
209
|
for order in range(job.first_task_index, job.last_task_index + 1):
|
210
210
|
this_wftask = workflow.task_list[order]
|
211
|
-
|
212
|
-
task_name = this_wftask.task_legacy.name
|
213
|
-
else:
|
214
|
-
task_name = this_wftask.task.name
|
211
|
+
task_name = this_wftask.task.name
|
215
212
|
subfolder_name = task_subfolder_name(
|
216
213
|
order=order,
|
217
214
|
task_name=task_name,
|
@@ -116,10 +116,7 @@ def get_slurm_config(
|
|
116
116
|
slurm_dict["mem_per_task_MB"] = mem_per_task_MB
|
117
117
|
|
118
118
|
# Job name
|
119
|
-
|
120
|
-
job_name = wftask.task_legacy.name.replace(" ", "_")
|
121
|
-
else:
|
122
|
-
job_name = wftask.task.name.replace(" ", "_")
|
119
|
+
job_name = wftask.task.name.replace(" ", "_")
|
123
120
|
slurm_dict["job_name"] = job_name
|
124
121
|
|
125
122
|
# Optional SLURM arguments and extra lines
|
{fractal_server-2.4.1 → fractal_server-2.5.0a0}/fractal_server/app/runner/v2/handle_failed_job.py
RENAMED
@@ -96,15 +96,8 @@ def assemble_history_failed_job(
|
|
96
96
|
|
97
97
|
# Part 3/B: Append failed task to history
|
98
98
|
if failed_wftask is not None:
|
99
|
-
failed_wftask_dump = failed_wftask.model_dump(
|
100
|
-
|
101
|
-
)
|
102
|
-
if failed_wftask.is_legacy_task:
|
103
|
-
failed_wftask_dump[
|
104
|
-
"task_legacy"
|
105
|
-
] = failed_wftask.task_legacy.model_dump()
|
106
|
-
else:
|
107
|
-
failed_wftask_dump["task"] = failed_wftask.task.model_dump()
|
99
|
+
failed_wftask_dump = failed_wftask.model_dump(exclude={"task"})
|
100
|
+
failed_wftask_dump["task"] = failed_wftask.task.model_dump()
|
108
101
|
new_history_item = dict(
|
109
102
|
workflowtask=failed_wftask_dump,
|
110
103
|
status=WorkflowTaskStatusTypeV2.FAILED,
|