fractal-server 2.11.1__tar.gz → 2.12.0a1__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.11.1 → fractal_server-2.12.0a1}/PKG-INFO +1 -1
- fractal_server-2.12.0a1/fractal_server/__init__.py +1 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/models/__init__.py +0 -2
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/models/linkuserproject.py +0 -9
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/aux/_job.py +1 -3
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/executors/slurm/ssh/executor.py +9 -6
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/executors/slurm/sudo/executor.py +1 -5
- fractal_server-2.12.0a1/fractal_server/app/runner/filenames.py +2 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/shutdown.py +3 -27
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/schemas/_validators.py +0 -19
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/config.py +1 -15
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/main.py +1 -12
- fractal_server-2.12.0a1/fractal_server/migrations/versions/1eac13a26c83_drop_v1_tables.py +67 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/string_tools.py +0 -21
- fractal_server-2.12.0a1/fractal_server/tasks/utils.py +11 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/pyproject.toml +2 -2
- fractal_server-2.11.1/fractal_server/__init__.py +0 -1
- fractal_server-2.11.1/fractal_server/app/models/v1/__init__.py +0 -13
- fractal_server-2.11.1/fractal_server/app/models/v1/dataset.py +0 -71
- fractal_server-2.11.1/fractal_server/app/models/v1/job.py +0 -101
- fractal_server-2.11.1/fractal_server/app/models/v1/project.py +0 -29
- fractal_server-2.11.1/fractal_server/app/models/v1/state.py +0 -34
- fractal_server-2.11.1/fractal_server/app/models/v1/task.py +0 -85
- fractal_server-2.11.1/fractal_server/app/models/v1/workflow.py +0 -133
- fractal_server-2.11.1/fractal_server/app/routes/admin/v1.py +0 -377
- fractal_server-2.11.1/fractal_server/app/routes/api/v1/__init__.py +0 -26
- fractal_server-2.11.1/fractal_server/app/routes/api/v1/_aux_functions.py +0 -478
- fractal_server-2.11.1/fractal_server/app/routes/api/v1/dataset.py +0 -554
- fractal_server-2.11.1/fractal_server/app/routes/api/v1/job.py +0 -195
- fractal_server-2.11.1/fractal_server/app/routes/api/v1/project.py +0 -475
- fractal_server-2.11.1/fractal_server/app/routes/api/v1/task.py +0 -203
- fractal_server-2.11.1/fractal_server/app/routes/api/v1/task_collection.py +0 -239
- fractal_server-2.11.1/fractal_server/app/routes/api/v1/workflow.py +0 -355
- fractal_server-2.11.1/fractal_server/app/routes/api/v1/workflowtask.py +0 -187
- fractal_server-2.11.1/fractal_server/app/runner/async_wrap_v1.py +0 -27
- fractal_server-2.11.1/fractal_server/app/runner/filenames.py +0 -4
- fractal_server-2.11.1/fractal_server/app/runner/v1/__init__.py +0 -415
- fractal_server-2.11.1/fractal_server/app/runner/v1/_common.py +0 -620
- fractal_server-2.11.1/fractal_server/app/runner/v1/_local/__init__.py +0 -186
- fractal_server-2.11.1/fractal_server/app/runner/v1/_local/_local_config.py +0 -105
- fractal_server-2.11.1/fractal_server/app/runner/v1/_local/_submit_setup.py +0 -48
- fractal_server-2.11.1/fractal_server/app/runner/v1/_slurm/__init__.py +0 -312
- fractal_server-2.11.1/fractal_server/app/runner/v1/_slurm/_submit_setup.py +0 -81
- fractal_server-2.11.1/fractal_server/app/runner/v1/_slurm/get_slurm_config.py +0 -163
- fractal_server-2.11.1/fractal_server/app/runner/v1/common.py +0 -117
- fractal_server-2.11.1/fractal_server/app/runner/v1/handle_failed_job.py +0 -141
- fractal_server-2.11.1/fractal_server/app/runner/v2/_local/executor.py +0 -100
- fractal_server-2.11.1/fractal_server/app/schemas/v1/__init__.py +0 -37
- fractal_server-2.11.1/fractal_server/app/schemas/v1/applyworkflow.py +0 -161
- fractal_server-2.11.1/fractal_server/app/schemas/v1/dataset.py +0 -165
- fractal_server-2.11.1/fractal_server/app/schemas/v1/dumps.py +0 -64
- fractal_server-2.11.1/fractal_server/app/schemas/v1/manifest.py +0 -126
- fractal_server-2.11.1/fractal_server/app/schemas/v1/project.py +0 -66
- fractal_server-2.11.1/fractal_server/app/schemas/v1/state.py +0 -18
- fractal_server-2.11.1/fractal_server/app/schemas/v1/task.py +0 -167
- fractal_server-2.11.1/fractal_server/app/schemas/v1/task_collection.py +0 -110
- fractal_server-2.11.1/fractal_server/app/schemas/v1/workflow.py +0 -212
- fractal_server-2.11.1/fractal_server/tasks/utils.py +0 -39
- fractal_server-2.11.1/fractal_server/tasks/v1/_TaskCollectPip.py +0 -103
- fractal_server-2.11.1/fractal_server/tasks/v1/background_operations.py +0 -352
- fractal_server-2.11.1/fractal_server/tasks/v1/endpoint_operations.py +0 -156
- fractal_server-2.11.1/fractal_server/tasks/v1/get_collection_data.py +0 -14
- fractal_server-2.11.1/fractal_server/tasks/v1/utils.py +0 -67
- fractal_server-2.11.1/fractal_server/tasks/v2/__init__.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/LICENSE +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/README.md +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/__main__.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/alembic.ini +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/__init__.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/db/__init__.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/models/linkusergroup.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/models/security.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/models/user_settings.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/models/v2/__init__.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/models/v2/dataset.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/models/v2/job.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/models/v2/project.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/models/v2/task.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/models/v2/task_group.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/models/v2/workflow.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/models/v2/workflowtask.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/__init__.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/admin/__init__.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/admin/v2/__init__.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/admin/v2/job.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/admin/v2/project.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/admin/v2/task.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/admin/v2/task_group.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/admin/v2/task_group_lifecycle.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/api/__init__.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/api/v2/__init__.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/api/v2/_aux_functions.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/api/v2/_aux_functions_task_lifecycle.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/api/v2/_aux_functions_tasks.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/api/v2/dataset.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/api/v2/images.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/api/v2/job.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/api/v2/project.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/api/v2/status.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/api/v2/submit.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/api/v2/task.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/api/v2/task_collection.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/api/v2/task_collection_custom.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/api/v2/task_group.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/api/v2/task_group_lifecycle.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/api/v2/workflow.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/api/v2/workflow_import.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/api/v2/workflowtask.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/auth/__init__.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/auth/_aux_auth.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/auth/current_user.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/auth/group.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/auth/login.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/auth/oauth.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/auth/register.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/auth/router.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/auth/users.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/aux/__init__.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/aux/_runner.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/routes/aux/validate_user_settings.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/__init__.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/components.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/compress_folder.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/exceptions.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/executors/__init__.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/executors/slurm/__init__.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/executors/slurm/_batching.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/executors/slurm/_slurm_config.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/executors/slurm/remote.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/executors/slurm/ssh/__init__.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/executors/slurm/ssh/_executor_wait_thread.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/executors/slurm/ssh/_slurm_job.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/executors/slurm/sudo/__init__.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/executors/slurm/sudo/_check_jobs_status.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/executors/slurm/sudo/_executor_wait_thread.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/executors/slurm/sudo/_subprocess_run_as_user.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/executors/slurm/utils_executors.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/extract_archive.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/run_subprocess.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/set_start_and_last_task_index.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/task_files.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/v2/__init__.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/v2/_local/__init__.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/v2/_local/_local_config.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/v2/_local/_submit_setup.py +0 -0
- {fractal_server-2.11.1/fractal_server/app/runner/v1 → fractal_server-2.12.0a1/fractal_server/app/runner/v2}/_local/executor.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/v2/_local_experimental/__init__.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/v2/_local_experimental/_local_config.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/v2/_local_experimental/_submit_setup.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/v2/_local_experimental/executor.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/v2/_slurm_common/__init__.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/v2/_slurm_common/get_slurm_config.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/v2/_slurm_ssh/__init__.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/v2/_slurm_ssh/_submit_setup.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/v2/_slurm_sudo/__init__.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/v2/_slurm_sudo/_submit_setup.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/v2/deduplicate_list.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/v2/handle_failed_job.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/v2/merge_outputs.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/v2/runner.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/v2/runner_functions.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/v2/runner_functions_low_level.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/v2/task_interface.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/runner/versions.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/schemas/__init__.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/schemas/_filter_validators.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/schemas/user.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/schemas/user_group.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/schemas/user_settings.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/schemas/v2/__init__.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/schemas/v2/dataset.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/schemas/v2/dumps.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/schemas/v2/job.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/schemas/v2/manifest.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/schemas/v2/project.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/schemas/v2/status.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/schemas/v2/task.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/schemas/v2/task_collection.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/schemas/v2/task_group.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/schemas/v2/workflow.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/schemas/v2/workflowtask.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/security/__init__.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/security/signup_email.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/user_settings.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/data_migrations/README.md +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/data_migrations/tools.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/gunicorn_fractal.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/images/__init__.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/images/models.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/images/tools.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/logger.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/migrations/env.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/migrations/naming_convention.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/migrations/versions/034a469ec2eb_task_groups.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/migrations/versions/091b01f51f88_add_usergroup_and_linkusergroup_table.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/migrations/versions/19eca0dd47a9_user_settings_project_dir.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/migrations/versions/316140ff7ee1_remove_usersettings_cache_dir.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/migrations/versions/4c308bcaea2b_add_task_args_schema_and_task_args_.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/migrations/versions/4cedeb448a53_workflowtask_foreign_keys_not_nullables.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/migrations/versions/501961cfcd85_remove_link_between_v1_and_v2_tasks_.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/migrations/versions/50a13d6138fd_initial_schema.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/migrations/versions/5bf02391cfef_v2.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/migrations/versions/70e77f1c38b0_add_applyworkflow_first_task_index_and_.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/migrations/versions/71eefd1dd202_add_slurm_accounts.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/migrations/versions/84bf0fffde30_add_dumps_to_applyworkflow.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/migrations/versions/8e8f227a3e36_update_taskv2_post_2_7_0.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/migrations/versions/8f79bd162e35_add_docs_info_and_docs_link_to_task_.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/migrations/versions/94a47ea2d3ff_remove_cache_dir_slurm_user_and_slurm_.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/migrations/versions/97f444d47249_add_applyworkflow_project_dump.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/migrations/versions/99ea79d9e5d2_add_dataset_history.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/migrations/versions/9c5ae74c9b98_add_user_settings_table.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/migrations/versions/9fd26a2b0de4_add_workflow_timestamp_created.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/migrations/versions/a7f4d6137b53_add_workflow_dump_to_applyworkflow.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/migrations/versions/af8673379a5c_drop_old_filter_columns.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/migrations/versions/d256a7379ab8_taskgroup_activity_and_venv_info_to_.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/migrations/versions/d4fe3708d309_make_applyworkflow_workflow_dump_non_.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/migrations/versions/da2cb2ac4255_user_group_viewer_paths.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/migrations/versions/db09233ad13a_split_filters_and_keep_old_columns.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/migrations/versions/e75cac726012_make_applyworkflow_start_timestamp_not_.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/migrations/versions/efa89c30e0a4_add_project_timestamp_created.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/migrations/versions/f384e1c0cf5d_drop_task_default_args_columns.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/py.typed +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/ssh/__init__.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/ssh/_fabric.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/syringe.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/tasks/__init__.py +0 -0
- {fractal_server-2.11.1/fractal_server/tasks/v1 → fractal_server-2.12.0a1/fractal_server/tasks/v2}/__init__.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/tasks/v2/local/__init__.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/tasks/v2/local/_utils.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/tasks/v2/local/collect.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/tasks/v2/local/deactivate.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/tasks/v2/local/reactivate.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/tasks/v2/ssh/__init__.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/tasks/v2/ssh/_utils.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/tasks/v2/ssh/collect.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/tasks/v2/ssh/deactivate.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/tasks/v2/ssh/reactivate.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/tasks/v2/templates/1_create_venv.sh +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/tasks/v2/templates/2_pip_install.sh +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/tasks/v2/templates/3_pip_freeze.sh +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/tasks/v2/templates/4_pip_show.sh +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/tasks/v2/templates/5_get_venv_size_and_file_number.sh +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/tasks/v2/templates/6_pip_install_from_freeze.sh +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/tasks/v2/utils_background.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/tasks/v2/utils_database.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/tasks/v2/utils_package_names.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/tasks/v2/utils_python_interpreter.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/tasks/v2/utils_templates.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/urls.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/utils.py +0 -0
- {fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/zip_tools.py +0 -0
@@ -0,0 +1 @@
|
|
1
|
+
__VERSION__ = "2.12.0a1"
|
@@ -4,9 +4,7 @@ thus we should always export all relevant database models from here or they
|
|
4
4
|
will not be picked up by alembic.
|
5
5
|
"""
|
6
6
|
from .linkusergroup import LinkUserGroup # noqa: F401
|
7
|
-
from .linkuserproject import LinkUserProject # noqa: F401
|
8
7
|
from .linkuserproject import LinkUserProjectV2 # noqa: F401
|
9
8
|
from .security import * # noqa
|
10
9
|
from .user_settings import UserSettings # noqa
|
11
|
-
from .v1 import * # noqa
|
12
10
|
from .v2 import * # noqa
|
{fractal_server-2.11.1 → fractal_server-2.12.0a1}/fractal_server/app/models/linkuserproject.py
RENAMED
@@ -2,15 +2,6 @@ from sqlmodel import Field
|
|
2
2
|
from sqlmodel import SQLModel
|
3
3
|
|
4
4
|
|
5
|
-
class LinkUserProject(SQLModel, table=True):
|
6
|
-
"""
|
7
|
-
Crossing table between User and Project
|
8
|
-
"""
|
9
|
-
|
10
|
-
project_id: int = Field(foreign_key="project.id", primary_key=True)
|
11
|
-
user_id: int = Field(foreign_key="user_oauth.id", primary_key=True)
|
12
|
-
|
13
|
-
|
14
5
|
class LinkUserProjectV2(SQLModel, table=True):
|
15
6
|
"""
|
16
7
|
Crossing table between User and ProjectV2
|
@@ -1,12 +1,10 @@
|
|
1
1
|
from pathlib import Path
|
2
|
-
from typing import Union
|
3
2
|
|
4
|
-
from ...models.v1 import ApplyWorkflow
|
5
3
|
from ...models.v2 import JobV2
|
6
4
|
from ...runner.filenames import SHUTDOWN_FILENAME
|
7
5
|
|
8
6
|
|
9
|
-
def _write_shutdown_file(*, job:
|
7
|
+
def _write_shutdown_file(*, job: JobV2):
|
10
8
|
"""
|
11
9
|
Write job's shutdown file.
|
12
10
|
|
@@ -385,9 +385,7 @@ class FractalSlurmSSHExecutor(SlurmExecutor):
|
|
385
385
|
args_batches = []
|
386
386
|
batch_size = tasks_per_job
|
387
387
|
for ind_chunk in range(0, tot_tasks, batch_size):
|
388
|
-
args_batches.append(
|
389
|
-
list_args[ind_chunk : ind_chunk + batch_size] # noqa
|
390
|
-
)
|
388
|
+
args_batches.append(list_args[ind_chunk : ind_chunk + batch_size])
|
391
389
|
if len(args_batches) != math.ceil(tot_tasks / tasks_per_job):
|
392
390
|
raise RuntimeError("Something wrong here while batching tasks")
|
393
391
|
|
@@ -536,10 +534,15 @@ class FractalSlurmSSHExecutor(SlurmExecutor):
|
|
536
534
|
_prefixes = []
|
537
535
|
_subfolder_names = []
|
538
536
|
for component in components:
|
539
|
-
|
537
|
+
# In Fractal, `component` is `dict` by construction (e.g.
|
538
|
+
# `component = {"zarr_url": "/something", "param": 1}``). The
|
539
|
+
# try/except covers the case of e.g. `executor.map([1, 2])`,
|
540
|
+
# which is useful for testing.
|
541
|
+
try:
|
540
542
|
actual_component = component.get(_COMPONENT_KEY_, None)
|
541
|
-
|
542
|
-
actual_component = component
|
543
|
+
except AttributeError:
|
544
|
+
actual_component = str(component)
|
545
|
+
|
543
546
|
_task_file_paths = get_task_file_paths(
|
544
547
|
workflow_dir_local=task_files.workflow_dir_local,
|
545
548
|
workflow_dir_remote=task_files.workflow_dir_remote,
|
@@ -608,11 +608,7 @@ class FractalSlurmExecutor(SlurmExecutor):
|
|
608
608
|
_prefixes = []
|
609
609
|
_subfolder_names = []
|
610
610
|
for component in components:
|
611
|
-
|
612
|
-
# This is needed for V2
|
613
|
-
actual_component = component.get(_COMPONENT_KEY_, None)
|
614
|
-
else:
|
615
|
-
actual_component = component
|
611
|
+
actual_component = component.get(_COMPONENT_KEY_, None)
|
616
612
|
_task_file_paths = get_task_file_paths(
|
617
613
|
workflow_dir_local=task_files.workflow_dir_local,
|
618
614
|
workflow_dir_remote=task_files.workflow_dir_remote,
|
@@ -3,8 +3,6 @@ import time
|
|
3
3
|
from sqlmodel import select
|
4
4
|
|
5
5
|
from fractal_server.app.db import get_async_db
|
6
|
-
from fractal_server.app.models.v1 import ApplyWorkflow
|
7
|
-
from fractal_server.app.models.v1.job import JobStatusTypeV1
|
8
6
|
from fractal_server.app.models.v2 import JobV2
|
9
7
|
from fractal_server.app.models.v2.job import JobStatusTypeV2
|
10
8
|
from fractal_server.app.routes.aux._job import _write_shutdown_file
|
@@ -13,9 +11,7 @@ from fractal_server.logger import get_logger
|
|
13
11
|
from fractal_server.syringe import Inject
|
14
12
|
|
15
13
|
|
16
|
-
async def cleanup_after_shutdown(
|
17
|
-
*, jobsV1: list[int], jobsV2: list[int], logger_name: str
|
18
|
-
):
|
14
|
+
async def cleanup_after_shutdown(*, jobsV2: list[int], logger_name: str):
|
19
15
|
logger = get_logger(logger_name)
|
20
16
|
logger.info("Cleanup function after shutdown")
|
21
17
|
stm_v2 = (
|
@@ -24,22 +20,12 @@ async def cleanup_after_shutdown(
|
|
24
20
|
.where(JobV2.status == JobStatusTypeV2.SUBMITTED)
|
25
21
|
)
|
26
22
|
|
27
|
-
stm_v1 = (
|
28
|
-
select(ApplyWorkflow)
|
29
|
-
.where(ApplyWorkflow.id.in_(jobsV1))
|
30
|
-
.where(ApplyWorkflow.status == JobStatusTypeV1.SUBMITTED)
|
31
|
-
)
|
32
|
-
|
33
23
|
async for session in get_async_db():
|
34
24
|
jobsV2_db = (await session.execute(stm_v2)).scalars().all()
|
35
|
-
jobsV1_db = (await session.execute(stm_v1)).scalars().all()
|
36
25
|
|
37
26
|
for job in jobsV2_db:
|
38
27
|
_write_shutdown_file(job=job)
|
39
28
|
|
40
|
-
for job in jobsV1_db:
|
41
|
-
_write_shutdown_file(job=job)
|
42
|
-
|
43
29
|
settings = Inject(get_settings)
|
44
30
|
|
45
31
|
t_start = time.perf_counter()
|
@@ -49,9 +35,8 @@ async def cleanup_after_shutdown(
|
|
49
35
|
logger.info("Waiting 3 seconds before checking")
|
50
36
|
time.sleep(3)
|
51
37
|
jobsV2_db = (await session.execute(stm_v2)).scalars().all()
|
52
|
-
jobsV1_db = (await session.execute(stm_v1)).scalars().all()
|
53
38
|
|
54
|
-
if len(jobsV2_db) == 0
|
39
|
+
if len(jobsV2_db) == 0:
|
55
40
|
logger.info(
|
56
41
|
(
|
57
42
|
"All jobs associated to this app are "
|
@@ -61,10 +46,7 @@ async def cleanup_after_shutdown(
|
|
61
46
|
return
|
62
47
|
else:
|
63
48
|
logger.info(
|
64
|
-
(
|
65
|
-
f"Some jobs are still 'submitted' "
|
66
|
-
f"{jobsV1_db=}, {jobsV2_db=}"
|
67
|
-
)
|
49
|
+
(f"Some jobs are still 'submitted' " f"{jobsV2_db=}")
|
68
50
|
)
|
69
51
|
logger.info(
|
70
52
|
(
|
@@ -79,10 +61,4 @@ async def cleanup_after_shutdown(
|
|
79
61
|
session.add(job)
|
80
62
|
await session.commit()
|
81
63
|
|
82
|
-
for job in jobsV1_db:
|
83
|
-
job.status = "failed"
|
84
|
-
job.log = (job.log or "") + "\nJob stopped due to app shutdown\n"
|
85
|
-
session.add(job)
|
86
|
-
await session.commit()
|
87
|
-
|
88
64
|
logger.info("Exit from shutdown logic")
|
@@ -48,25 +48,6 @@ def valdict_keys(attribute: str):
|
|
48
48
|
return val
|
49
49
|
|
50
50
|
|
51
|
-
def valint(attribute: str, min_val: int = 1):
|
52
|
-
"""
|
53
|
-
Check that an integer attribute (e.g. if it is meant to be the ID of a
|
54
|
-
database entry) is greater or equal to min_val.
|
55
|
-
"""
|
56
|
-
|
57
|
-
def val(integer: Optional[int]) -> Optional[int]:
|
58
|
-
if integer is None:
|
59
|
-
raise ValueError(f"Integer attribute '{attribute}' cannot be None")
|
60
|
-
if integer < min_val:
|
61
|
-
raise ValueError(
|
62
|
-
f"Integer attribute '{attribute}' cannot be less than "
|
63
|
-
f"{min_val} (given {integer})"
|
64
|
-
)
|
65
|
-
return integer
|
66
|
-
|
67
|
-
return val
|
68
|
-
|
69
|
-
|
70
51
|
def val_absolute_path(attribute: str, accept_none: bool = False):
|
71
52
|
"""
|
72
53
|
Check that a string attribute is an absolute path
|
@@ -338,7 +338,7 @@ class Settings(BaseSettings):
|
|
338
338
|
|
339
339
|
FRACTAL_API_MAX_JOB_LIST_LENGTH: int = 50
|
340
340
|
"""
|
341
|
-
Number of ids that can be stored in the `
|
341
|
+
Number of ids that can be stored in the `jobsV2` attribute of
|
342
342
|
`app.state`.
|
343
343
|
"""
|
344
344
|
|
@@ -496,13 +496,6 @@ class Settings(BaseSettings):
|
|
496
496
|
`JobExecutionError`.
|
497
497
|
"""
|
498
498
|
|
499
|
-
FRACTAL_API_SUBMIT_RATE_LIMIT: int = 2
|
500
|
-
"""
|
501
|
-
Interval to wait (in seconds) to be allowed to call again
|
502
|
-
`POST api/v1/{project_id}/workflow/{workflow_id}/apply/`
|
503
|
-
with the same path and query parameters.
|
504
|
-
"""
|
505
|
-
|
506
499
|
FRACTAL_RUNNER_TASKS_INCLUDE_IMAGE: str = (
|
507
500
|
"Copy OME-Zarr structure;Convert Metadata Components from 2D to 3D"
|
508
501
|
)
|
@@ -511,13 +504,6 @@ class Settings(BaseSettings):
|
|
511
504
|
attribute in their input-arguments JSON file.
|
512
505
|
"""
|
513
506
|
|
514
|
-
FRACTAL_API_V1_MODE: Literal[
|
515
|
-
"include", "include_read_only", "exclude"
|
516
|
-
] = "include"
|
517
|
-
"""
|
518
|
-
Whether to include the v1 API.
|
519
|
-
"""
|
520
|
-
|
521
507
|
FRACTAL_PIP_CACHE_DIR: Optional[str] = None
|
522
508
|
"""
|
523
509
|
Absolute path to the cache directory for `pip`; if unset,
|
@@ -39,20 +39,11 @@ def collect_routers(app: FastAPI) -> None:
|
|
39
39
|
The application to register the routers to.
|
40
40
|
"""
|
41
41
|
from .app.routes.api import router_api
|
42
|
-
from .app.routes.api.v1 import router_api_v1
|
43
42
|
from .app.routes.api.v2 import router_api_v2
|
44
|
-
from .app.routes.admin.v1 import router_admin_v1
|
45
43
|
from .app.routes.admin.v2 import router_admin_v2
|
46
44
|
from .app.routes.auth.router import router_auth
|
47
45
|
|
48
|
-
settings = Inject(get_settings)
|
49
|
-
|
50
46
|
app.include_router(router_api, prefix="/api")
|
51
|
-
if settings.FRACTAL_API_V1_MODE.startswith("include"):
|
52
|
-
app.include_router(router_api_v1, prefix="/api/v1")
|
53
|
-
app.include_router(
|
54
|
-
router_admin_v1, prefix="/admin/v1", tags=["V1 Admin area"]
|
55
|
-
)
|
56
47
|
app.include_router(router_api_v2, prefix="/api/v2")
|
57
48
|
app.include_router(
|
58
49
|
router_admin_v2, prefix="/admin/v2", tags=["V2 Admin area"]
|
@@ -84,7 +75,6 @@ def check_settings() -> None:
|
|
84
75
|
|
85
76
|
@asynccontextmanager
|
86
77
|
async def lifespan(app: FastAPI):
|
87
|
-
app.state.jobsV1 = []
|
88
78
|
app.state.jobsV2 = []
|
89
79
|
logger = set_logger("fractal_server.lifespan")
|
90
80
|
logger.info("Start application startup")
|
@@ -123,12 +113,11 @@ async def lifespan(app: FastAPI):
|
|
123
113
|
|
124
114
|
logger.info(
|
125
115
|
f"Current worker with pid {os.getpid()} is shutting down. "
|
126
|
-
f"Current jobs: {app.state.
|
116
|
+
f"Current jobs: {app.state.jobsV2=}"
|
127
117
|
)
|
128
118
|
if _backend_supports_shutdown(settings.FRACTAL_RUNNER_BACKEND):
|
129
119
|
try:
|
130
120
|
await cleanup_after_shutdown(
|
131
|
-
jobsV1=app.state.jobsV1,
|
132
121
|
jobsV2=app.state.jobsV2,
|
133
122
|
logger_name="fractal_server.lifespan",
|
134
123
|
)
|
@@ -0,0 +1,67 @@
|
|
1
|
+
"""Drop V1 tables
|
2
|
+
|
3
|
+
Revision ID: 1eac13a26c83
|
4
|
+
Revises: af8673379a5c
|
5
|
+
Create Date: 2025-01-10 13:17:47.838607
|
6
|
+
|
7
|
+
"""
|
8
|
+
import logging
|
9
|
+
|
10
|
+
from alembic import op
|
11
|
+
from sqlmodel import SQLModel
|
12
|
+
|
13
|
+
from fractal_server.migrations.naming_convention import NAMING_CONVENTION
|
14
|
+
|
15
|
+
# revision identifiers, used by Alembic.
|
16
|
+
revision = "1eac13a26c83"
|
17
|
+
down_revision = "af8673379a5c"
|
18
|
+
branch_labels = None
|
19
|
+
depends_on = None
|
20
|
+
|
21
|
+
|
22
|
+
TABLES_V1 = [
|
23
|
+
"resource",
|
24
|
+
"applyworkflow",
|
25
|
+
"task",
|
26
|
+
"workflow",
|
27
|
+
"workflowtask",
|
28
|
+
"linkuserproject",
|
29
|
+
"dataset",
|
30
|
+
"project",
|
31
|
+
"state",
|
32
|
+
]
|
33
|
+
|
34
|
+
|
35
|
+
def upgrade() -> None:
|
36
|
+
|
37
|
+
logger = logging.getLogger("alembic.runtime.migration")
|
38
|
+
|
39
|
+
target_metadata = SQLModel.metadata
|
40
|
+
target_metadata.naming_convention = NAMING_CONVENTION
|
41
|
+
|
42
|
+
connection = op.get_bind()
|
43
|
+
target_metadata.reflect(
|
44
|
+
bind=connection,
|
45
|
+
extend_existing=True,
|
46
|
+
only=TABLES_V1,
|
47
|
+
)
|
48
|
+
|
49
|
+
logger.info("Starting non-reversible upgrade")
|
50
|
+
logger.info("Dropping all V1 ForeignKey constraints")
|
51
|
+
fk_names = []
|
52
|
+
for table_name in TABLES_V1:
|
53
|
+
table = target_metadata.tables[table_name]
|
54
|
+
for fk in table.foreign_keys:
|
55
|
+
op.drop_constraint(fk.name, table_name, type_="foreignkey")
|
56
|
+
fk_names.append(fk.name)
|
57
|
+
logger.info(f"Dropped all V1 ForeignKey constraints: {fk_names}")
|
58
|
+
logger.info(f"Dropping all V1 tables: {TABLES_V1}")
|
59
|
+
for table_name in TABLES_V1:
|
60
|
+
op.drop_table(table_name)
|
61
|
+
|
62
|
+
|
63
|
+
def downgrade() -> None:
|
64
|
+
raise RuntimeError(
|
65
|
+
"Cannot downgrade from 1eac13a26c83 to db09233ad13a, "
|
66
|
+
"because it's fully breaking."
|
67
|
+
)
|
@@ -33,27 +33,6 @@ def sanitize_string(value: str) -> str:
|
|
33
33
|
return new_value
|
34
34
|
|
35
35
|
|
36
|
-
def slugify_task_name_for_source_v1(task_name: str) -> str:
|
37
|
-
"""
|
38
|
-
NOTE: this function is used upon creation of tasks' sources, therefore
|
39
|
-
for the moment we cannot replace it with its more comprehensive version
|
40
|
-
from `fractal_server.string_tools.sanitize_string`, nor we can remove it.
|
41
|
-
|
42
|
-
As of 2.3.1, we are renaming it to `slugify_task_name_for_source`, to make
|
43
|
-
it clear that it should not be used for other purposes.
|
44
|
-
|
45
|
-
As of 2.7.0, we are renaming it to `slugify_task_name_for_source_v1`, to
|
46
|
-
make it clear that it is not used for v2.
|
47
|
-
|
48
|
-
Args:
|
49
|
-
task_name:
|
50
|
-
|
51
|
-
Return:
|
52
|
-
Slug-ified task name.
|
53
|
-
"""
|
54
|
-
return task_name.replace(" ", "_").lower()
|
55
|
-
|
56
|
-
|
57
36
|
def validate_cmd(
|
58
37
|
command: str,
|
59
38
|
*,
|
@@ -0,0 +1,11 @@
|
|
1
|
+
from pathlib import Path
|
2
|
+
|
3
|
+
|
4
|
+
COLLECTION_FILENAME = "collection.json"
|
5
|
+
COLLECTION_LOG_FILENAME = "collection.log"
|
6
|
+
COLLECTION_FREEZE_FILENAME = "collection_freeze.txt"
|
7
|
+
FORBIDDEN_DEPENDENCY_STRINGS = ["github.com"]
|
8
|
+
|
9
|
+
|
10
|
+
def get_log_path(base: Path) -> Path:
|
11
|
+
return base / COLLECTION_LOG_FILENAME
|
@@ -1,6 +1,6 @@
|
|
1
1
|
[project]
|
2
2
|
name = "fractal-server"
|
3
|
-
version = "2.
|
3
|
+
version = "2.12.0a1"
|
4
4
|
description = "Backend component of the Fractal analytics platform"
|
5
5
|
authors = [
|
6
6
|
{ name="Tommaso Comparin", email="tommaso.comparin@exact-lab.it" },
|
@@ -95,7 +95,7 @@ filterwarnings = [
|
|
95
95
|
]
|
96
96
|
|
97
97
|
[tool.bumpver]
|
98
|
-
current_version = "2.
|
98
|
+
current_version = "2.12.0a1"
|
99
99
|
version_pattern = "MAJOR.MINOR.PATCH[PYTAGNUM]"
|
100
100
|
commit_message = "bump version {old_version} -> {new_version}"
|
101
101
|
commit = true
|
@@ -1 +0,0 @@
|
|
1
|
-
__VERSION__ = "2.11.1"
|
@@ -1,13 +0,0 @@
|
|
1
|
-
"""
|
2
|
-
`models` module
|
3
|
-
"""
|
4
|
-
from ..linkuserproject import LinkUserProject # noqa F401
|
5
|
-
from .dataset import Dataset # noqa F401
|
6
|
-
from .dataset import Resource # noqa F401
|
7
|
-
from .job import ApplyWorkflow # noqa F401
|
8
|
-
from .job import JobStatusTypeV1 # noqa F401
|
9
|
-
from .project import Project # noqa F401
|
10
|
-
from .state import State # noqa F401
|
11
|
-
from .task import Task # noqa F401
|
12
|
-
from .workflow import Workflow # noqa F401
|
13
|
-
from .workflow import WorkflowTask # noqa F401
|
@@ -1,71 +0,0 @@
|
|
1
|
-
from datetime import datetime
|
2
|
-
from typing import Any
|
3
|
-
from typing import Optional
|
4
|
-
|
5
|
-
from sqlalchemy import Column
|
6
|
-
from sqlalchemy.ext.orderinglist import ordering_list
|
7
|
-
from sqlalchemy.types import DateTime
|
8
|
-
from sqlalchemy.types import JSON
|
9
|
-
from sqlmodel import Field
|
10
|
-
from sqlmodel import Relationship
|
11
|
-
from sqlmodel import SQLModel
|
12
|
-
|
13
|
-
from ....utils import get_timestamp
|
14
|
-
from ...schemas.v1.dataset import _DatasetBaseV1
|
15
|
-
from ...schemas.v1.dataset import _ResourceBaseV1
|
16
|
-
|
17
|
-
|
18
|
-
class Resource(_ResourceBaseV1, SQLModel, table=True):
|
19
|
-
id: Optional[int] = Field(default=None, primary_key=True)
|
20
|
-
dataset_id: int = Field(foreign_key="dataset.id")
|
21
|
-
|
22
|
-
|
23
|
-
class Dataset(_DatasetBaseV1, SQLModel, table=True):
|
24
|
-
"""
|
25
|
-
Represent a dataset
|
26
|
-
|
27
|
-
Attributes:
|
28
|
-
id:
|
29
|
-
Primary key
|
30
|
-
project_id:
|
31
|
-
ID of the project the workflow belongs to.
|
32
|
-
meta:
|
33
|
-
Metadata of the Dataset
|
34
|
-
history:
|
35
|
-
History of the Dataset
|
36
|
-
resource_list:
|
37
|
-
(Mapper attribute)
|
38
|
-
|
39
|
-
"""
|
40
|
-
|
41
|
-
id: Optional[int] = Field(default=None, primary_key=True)
|
42
|
-
project_id: int = Field(foreign_key="project.id")
|
43
|
-
project: "Project" = Relationship( # noqa: F821
|
44
|
-
sa_relationship_kwargs=dict(lazy="selectin"),
|
45
|
-
)
|
46
|
-
|
47
|
-
resource_list: list[Resource] = Relationship(
|
48
|
-
sa_relationship_kwargs={
|
49
|
-
"lazy": "selectin",
|
50
|
-
"order_by": "Resource.id",
|
51
|
-
"collection_class": ordering_list("id"),
|
52
|
-
"cascade": "all, delete-orphan",
|
53
|
-
}
|
54
|
-
)
|
55
|
-
|
56
|
-
meta: dict[str, Any] = Field(sa_column=Column(JSON), default={})
|
57
|
-
history: list[dict[str, Any]] = Field(
|
58
|
-
sa_column=Column(JSON, server_default="[]", nullable=False)
|
59
|
-
)
|
60
|
-
|
61
|
-
timestamp_created: datetime = Field(
|
62
|
-
default_factory=get_timestamp,
|
63
|
-
sa_column=Column(DateTime(timezone=True), nullable=False),
|
64
|
-
)
|
65
|
-
|
66
|
-
class Config:
|
67
|
-
arbitrary_types_allowed = True
|
68
|
-
|
69
|
-
@property
|
70
|
-
def paths(self) -> list[str]:
|
71
|
-
return [r.path for r in self.resource_list]
|
@@ -1,101 +0,0 @@
|
|
1
|
-
from datetime import datetime
|
2
|
-
from typing import Any
|
3
|
-
from typing import Optional
|
4
|
-
|
5
|
-
from sqlalchemy import Column
|
6
|
-
from sqlalchemy.types import DateTime
|
7
|
-
from sqlalchemy.types import JSON
|
8
|
-
from sqlmodel import Field
|
9
|
-
from sqlmodel import SQLModel
|
10
|
-
|
11
|
-
from ....utils import get_timestamp
|
12
|
-
from ...schemas.v1 import JobStatusTypeV1
|
13
|
-
from ...schemas.v1.applyworkflow import _ApplyWorkflowBaseV1
|
14
|
-
|
15
|
-
|
16
|
-
class ApplyWorkflow(_ApplyWorkflowBaseV1, SQLModel, table=True):
|
17
|
-
"""
|
18
|
-
Represent a workflow run
|
19
|
-
|
20
|
-
This table is responsible for storing the state of a workflow execution in
|
21
|
-
the database.
|
22
|
-
|
23
|
-
Attributes:
|
24
|
-
id:
|
25
|
-
Primary key.
|
26
|
-
project_id:
|
27
|
-
ID of the project the workflow belongs to, or `None` if the project
|
28
|
-
was deleted.
|
29
|
-
input_dataset_id:
|
30
|
-
ID of the input dataset, or `None` if the dataset was deleted.
|
31
|
-
output_dataset_id:
|
32
|
-
ID of the output dataset, or `None` if the dataset was deleted.
|
33
|
-
workflow_id:
|
34
|
-
ID of the workflow being applied, or `None` if the workflow was
|
35
|
-
deleted.
|
36
|
-
status:
|
37
|
-
Job status
|
38
|
-
workflow_dump:
|
39
|
-
Copy of the submitted workflow at submission.
|
40
|
-
input_dataset_dump:
|
41
|
-
Copy of the input_dataset at submission.
|
42
|
-
output_dataset_dump:
|
43
|
-
Copy of the output_dataset at submission.
|
44
|
-
start_timestamp:
|
45
|
-
Timestamp of when the run began.
|
46
|
-
end_timestamp:
|
47
|
-
Timestamp of when the run ended or failed.
|
48
|
-
status:
|
49
|
-
Status of the run.
|
50
|
-
log:
|
51
|
-
Forward of the workflow logs.
|
52
|
-
user_email:
|
53
|
-
Email address of the user who submitted the job.
|
54
|
-
slurm_account:
|
55
|
-
Account to be used when submitting the job to SLURM (see "account"
|
56
|
-
option in [`sbatch`
|
57
|
-
documentation](https://slurm.schedmd.com/sbatch.html#SECTION_OPTIONS)).
|
58
|
-
first_task_index:
|
59
|
-
last_task_index:
|
60
|
-
"""
|
61
|
-
|
62
|
-
class Config:
|
63
|
-
arbitrary_types_allowed = True
|
64
|
-
|
65
|
-
id: Optional[int] = Field(default=None, primary_key=True)
|
66
|
-
|
67
|
-
project_id: Optional[int] = Field(foreign_key="project.id")
|
68
|
-
workflow_id: Optional[int] = Field(foreign_key="workflow.id")
|
69
|
-
input_dataset_id: Optional[int] = Field(foreign_key="dataset.id")
|
70
|
-
output_dataset_id: Optional[int] = Field(foreign_key="dataset.id")
|
71
|
-
|
72
|
-
user_email: str = Field(nullable=False)
|
73
|
-
slurm_account: Optional[str]
|
74
|
-
|
75
|
-
input_dataset_dump: dict[str, Any] = Field(
|
76
|
-
sa_column=Column(JSON, nullable=False)
|
77
|
-
)
|
78
|
-
output_dataset_dump: dict[str, Any] = Field(
|
79
|
-
sa_column=Column(JSON, nullable=False)
|
80
|
-
)
|
81
|
-
workflow_dump: dict[str, Any] = Field(
|
82
|
-
sa_column=Column(JSON, nullable=False)
|
83
|
-
)
|
84
|
-
project_dump: dict[str, Any] = Field(
|
85
|
-
sa_column=Column(JSON, nullable=False)
|
86
|
-
)
|
87
|
-
|
88
|
-
working_dir: Optional[str]
|
89
|
-
working_dir_user: Optional[str]
|
90
|
-
first_task_index: int
|
91
|
-
last_task_index: int
|
92
|
-
|
93
|
-
start_timestamp: datetime = Field(
|
94
|
-
default_factory=get_timestamp,
|
95
|
-
sa_column=Column(DateTime(timezone=True), nullable=False),
|
96
|
-
)
|
97
|
-
end_timestamp: Optional[datetime] = Field(
|
98
|
-
default=None, sa_column=Column(DateTime(timezone=True))
|
99
|
-
)
|
100
|
-
status: str = JobStatusTypeV1.SUBMITTED
|
101
|
-
log: Optional[str] = None
|
@@ -1,29 +0,0 @@
|
|
1
|
-
from datetime import datetime
|
2
|
-
from typing import Optional
|
3
|
-
|
4
|
-
from sqlalchemy import Column
|
5
|
-
from sqlalchemy.types import DateTime
|
6
|
-
from sqlmodel import Field
|
7
|
-
from sqlmodel import Relationship
|
8
|
-
from sqlmodel import SQLModel
|
9
|
-
|
10
|
-
from . import LinkUserProject
|
11
|
-
from ....utils import get_timestamp
|
12
|
-
from ...schemas.v1.project import _ProjectBaseV1
|
13
|
-
from fractal_server.app.models import UserOAuth
|
14
|
-
|
15
|
-
|
16
|
-
class Project(_ProjectBaseV1, SQLModel, table=True):
|
17
|
-
|
18
|
-
id: Optional[int] = Field(default=None, primary_key=True)
|
19
|
-
timestamp_created: datetime = Field(
|
20
|
-
default_factory=get_timestamp,
|
21
|
-
sa_column=Column(DateTime(timezone=True), nullable=False),
|
22
|
-
)
|
23
|
-
|
24
|
-
user_list: list[UserOAuth] = Relationship(
|
25
|
-
link_model=LinkUserProject,
|
26
|
-
sa_relationship_kwargs={
|
27
|
-
"lazy": "selectin",
|
28
|
-
},
|
29
|
-
)
|
@@ -1,34 +0,0 @@
|
|
1
|
-
from datetime import datetime
|
2
|
-
from typing import Any
|
3
|
-
from typing import Optional
|
4
|
-
|
5
|
-
from sqlalchemy import Column
|
6
|
-
from sqlalchemy.types import DateTime
|
7
|
-
from sqlalchemy.types import JSON
|
8
|
-
from sqlmodel import Field
|
9
|
-
from sqlmodel import SQLModel
|
10
|
-
|
11
|
-
from ....utils import get_timestamp
|
12
|
-
|
13
|
-
|
14
|
-
class State(SQLModel, table=True):
|
15
|
-
"""
|
16
|
-
Store arbitrary data in the database
|
17
|
-
|
18
|
-
This table is just a state interchange that allows the system to store
|
19
|
-
arbitrary data for later retrieval. This is particuarly important for long
|
20
|
-
background tasks, in which it is not possible to return a meaningful
|
21
|
-
response to the client within a single request lifespan.
|
22
|
-
|
23
|
-
Attributes:
|
24
|
-
id: Primary key
|
25
|
-
data: Content of the `State`
|
26
|
-
timestamp: Timestap of the `State`
|
27
|
-
"""
|
28
|
-
|
29
|
-
id: Optional[int] = Field(default=None, primary_key=True)
|
30
|
-
data: dict[str, Any] = Field(sa_column=Column(JSON), default={})
|
31
|
-
timestamp: datetime = Field(
|
32
|
-
default_factory=get_timestamp,
|
33
|
-
sa_column=Column(DateTime(timezone=True)),
|
34
|
-
)
|