fractal-server 2.7.0a10__tar.gz → 2.7.1__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.7.0a10 → fractal_server-2.7.1}/PKG-INFO +4 -10
- fractal_server-2.7.1/fractal_server/__init__.py +1 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/models/v2/task.py +1 -2
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/admin/v2/task_group.py +7 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/api/v2/task.py +2 -1
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/api/v2/task_collection.py +3 -2
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/api/v2/task_collection_custom.py +2 -1
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/api/v2/workflow_import.py +4 -1
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/executors/slurm/ssh/executor.py +72 -51
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/schemas/v2/__init__.py +1 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/schemas/v2/task_group.py +8 -1
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/security/__init__.py +8 -1
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/config.py +8 -28
- fractal_server-2.7.1/fractal_server/migrations/versions/8e8f227a3e36_update_taskv2_post_2_7_0.py +42 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/tasks/v2/_venv_pip.py +5 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/tasks/v2/background_operations_ssh.py +1 -1
- fractal_server-2.7.0a10/fractal_server/tasks/v2/templates/_2_upgrade_pip.sh → fractal_server-2.7.1/fractal_server/tasks/v2/templates/_2_preliminary_pip_operations.sh +1 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/pyproject.toml +5 -10
- fractal_server-2.7.0a10/fractal_server/__init__.py +0 -1
- fractal_server-2.7.0a10/fractal_server/data_migrations/2_7_0.py +0 -323
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/LICENSE +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/README.md +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/__main__.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/alembic.ini +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/__init__.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/db/__init__.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/models/__init__.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/models/linkusergroup.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/models/linkuserproject.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/models/security.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/models/user_settings.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/models/v1/__init__.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/models/v1/dataset.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/models/v1/job.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/models/v1/project.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/models/v1/state.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/models/v1/task.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/models/v1/workflow.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/models/v2/__init__.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/models/v2/collection_state.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/models/v2/dataset.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/models/v2/job.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/models/v2/project.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/models/v2/workflow.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/models/v2/workflowtask.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/__init__.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/admin/__init__.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/admin/v1.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/admin/v2/__init__.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/admin/v2/job.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/admin/v2/project.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/admin/v2/task.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/api/__init__.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/api/v1/__init__.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/api/v1/_aux_functions.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/api/v1/dataset.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/api/v1/job.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/api/v1/project.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/api/v1/task.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/api/v1/task_collection.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/api/v1/workflow.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/api/v1/workflowtask.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/api/v2/__init__.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/api/v2/_aux_functions.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/api/v2/_aux_functions_tasks.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/api/v2/dataset.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/api/v2/images.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/api/v2/job.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/api/v2/project.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/api/v2/status.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/api/v2/submit.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/api/v2/task_group.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/api/v2/workflow.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/api/v2/workflowtask.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/auth/__init__.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/auth/_aux_auth.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/auth/current_user.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/auth/group.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/auth/login.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/auth/oauth.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/auth/register.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/auth/router.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/auth/users.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/aux/__init__.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/aux/_job.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/aux/_runner.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/aux/validate_user_settings.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/.gitignore +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/__init__.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/async_wrap.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/components.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/compress_folder.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/exceptions.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/executors/__init__.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/executors/slurm/__init__.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/executors/slurm/_batching.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/executors/slurm/_slurm_config.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/executors/slurm/remote.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/executors/slurm/ssh/__init__.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/executors/slurm/ssh/_executor_wait_thread.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/executors/slurm/ssh/_slurm_job.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/executors/slurm/sudo/__init__.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/executors/slurm/sudo/_check_jobs_status.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/executors/slurm/sudo/_executor_wait_thread.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/executors/slurm/sudo/_subprocess_run_as_user.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/executors/slurm/sudo/executor.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/extract_archive.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/filenames.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/run_subprocess.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/set_start_and_last_task_index.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/shutdown.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/task_files.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/v1/__init__.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/v1/_common.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/v1/_local/__init__.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/v1/_local/_local_config.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/v1/_local/_submit_setup.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/v1/_local/executor.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/v1/_slurm/__init__.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/v1/_slurm/_submit_setup.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/v1/_slurm/get_slurm_config.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/v1/common.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/v1/handle_failed_job.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/v2/__init__.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/v2/_local/__init__.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/v2/_local/_local_config.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/v2/_local/_submit_setup.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/v2/_local/executor.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/v2/_local_experimental/__init__.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/v2/_local_experimental/_local_config.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/v2/_local_experimental/_submit_setup.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/v2/_local_experimental/executor.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/v2/_slurm_common/__init__.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/v2/_slurm_common/get_slurm_config.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/v2/_slurm_ssh/__init__.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/v2/_slurm_ssh/_submit_setup.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/v2/_slurm_sudo/__init__.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/v2/_slurm_sudo/_submit_setup.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/v2/deduplicate_list.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/v2/handle_failed_job.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/v2/merge_outputs.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/v2/runner.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/v2/runner_functions.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/v2/runner_functions_low_level.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/v2/task_interface.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/runner/versions.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/schemas/__init__.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/schemas/_validators.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/schemas/user.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/schemas/user_group.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/schemas/user_settings.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/schemas/v1/__init__.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/schemas/v1/applyworkflow.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/schemas/v1/dataset.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/schemas/v1/dumps.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/schemas/v1/manifest.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/schemas/v1/project.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/schemas/v1/state.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/schemas/v1/task.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/schemas/v1/task_collection.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/schemas/v1/workflow.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/schemas/v2/dataset.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/schemas/v2/dumps.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/schemas/v2/job.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/schemas/v2/manifest.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/schemas/v2/project.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/schemas/v2/status.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/schemas/v2/task.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/schemas/v2/task_collection.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/schemas/v2/workflow.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/schemas/v2/workflowtask.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/user_settings.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/data_migrations/README.md +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/data_migrations/tools.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/gunicorn_fractal.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/images/__init__.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/images/models.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/images/tools.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/logger.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/main.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/migrations/README +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/migrations/env.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/migrations/naming_convention.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/migrations/script.py.mako +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/migrations/versions/034a469ec2eb_task_groups.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/migrations/versions/091b01f51f88_add_usergroup_and_linkusergroup_table.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/migrations/versions/4c308bcaea2b_add_task_args_schema_and_task_args_.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/migrations/versions/4cedeb448a53_workflowtask_foreign_keys_not_nullables.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/migrations/versions/501961cfcd85_remove_link_between_v1_and_v2_tasks_.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/migrations/versions/50a13d6138fd_initial_schema.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/migrations/versions/5bf02391cfef_v2.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/migrations/versions/70e77f1c38b0_add_applyworkflow_first_task_index_and_.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/migrations/versions/71eefd1dd202_add_slurm_accounts.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/migrations/versions/84bf0fffde30_add_dumps_to_applyworkflow.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/migrations/versions/8f79bd162e35_add_docs_info_and_docs_link_to_task_.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/migrations/versions/94a47ea2d3ff_remove_cache_dir_slurm_user_and_slurm_.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/migrations/versions/97f444d47249_add_applyworkflow_project_dump.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/migrations/versions/99ea79d9e5d2_add_dataset_history.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/migrations/versions/9c5ae74c9b98_add_user_settings_table.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/migrations/versions/9fd26a2b0de4_add_workflow_timestamp_created.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/migrations/versions/a7f4d6137b53_add_workflow_dump_to_applyworkflow.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/migrations/versions/d4fe3708d309_make_applyworkflow_workflow_dump_non_.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/migrations/versions/da2cb2ac4255_user_group_viewer_paths.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/migrations/versions/e75cac726012_make_applyworkflow_start_timestamp_not_.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/migrations/versions/efa89c30e0a4_add_project_timestamp_created.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/migrations/versions/f384e1c0cf5d_drop_task_default_args_columns.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/py.typed +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/ssh/__init__.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/ssh/_fabric.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/string_tools.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/syringe.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/tasks/__init__.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/tasks/utils.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/tasks/v1/_TaskCollectPip.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/tasks/v1/__init__.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/tasks/v1/background_operations.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/tasks/v1/endpoint_operations.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/tasks/v1/get_collection_data.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/tasks/v1/utils.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/tasks/v2/__init__.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/tasks/v2/background_operations.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/tasks/v2/database_operations.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/tasks/v2/endpoint_operations.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/tasks/v2/templates/_1_create_venv.sh +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/tasks/v2/templates/_3_pip_install.sh +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/tasks/v2/templates/_4_pip_freeze.sh +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/tasks/v2/templates/_5_pip_show.sh +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/tasks/v2/utils.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/urls.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/utils.py +0 -0
- {fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/zip_tools.py +0 -0
@@ -1,35 +1,29 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: fractal-server
|
3
|
-
Version: 2.7.
|
3
|
+
Version: 2.7.1
|
4
4
|
Summary: Server component of the Fractal analytics platform
|
5
5
|
Home-page: https://github.com/fractal-analytics-platform/fractal-server
|
6
6
|
License: BSD-3-Clause
|
7
7
|
Author: Tommaso Comparin
|
8
8
|
Author-email: tommaso.comparin@exact-lab.it
|
9
|
-
Requires-Python: >=3.
|
9
|
+
Requires-Python: >=3.10,<4.0
|
10
10
|
Classifier: License :: OSI Approved :: BSD License
|
11
11
|
Classifier: Programming Language :: Python :: 3
|
12
|
-
Classifier: Programming Language :: Python :: 3.9
|
13
12
|
Classifier: Programming Language :: Python :: 3.10
|
14
13
|
Classifier: Programming Language :: Python :: 3.11
|
15
14
|
Classifier: Programming Language :: Python :: 3.12
|
16
|
-
Provides-Extra: gunicorn
|
17
|
-
Provides-Extra: postgres
|
18
|
-
Provides-Extra: postgres-psycopg-binary
|
19
15
|
Requires-Dist: aiosqlite (>=0.19.0,<0.20.0)
|
20
16
|
Requires-Dist: alembic (>=1.13.1,<2.0.0)
|
21
|
-
Requires-Dist: asyncpg (>=0.29.0,<0.30.0) ; extra == "postgres"
|
22
17
|
Requires-Dist: bcrypt (==4.0.1)
|
23
18
|
Requires-Dist: cloudpickle (>=3.0.0,<3.1.0)
|
24
19
|
Requires-Dist: clusterfutures (>=0.5,<0.6)
|
25
20
|
Requires-Dist: fabric (>=3.2.2,<4.0.0)
|
26
21
|
Requires-Dist: fastapi (>=0.115.0,<0.116.0)
|
27
22
|
Requires-Dist: fastapi-users[oauth] (>=12.1.0,<13.0.0)
|
28
|
-
Requires-Dist: gunicorn (>=21.2,<23.0)
|
23
|
+
Requires-Dist: gunicorn (>=21.2,<23.0)
|
29
24
|
Requires-Dist: packaging (>=23.2,<24.0)
|
30
25
|
Requires-Dist: psutil (>=5.9.8,<6.0.0)
|
31
|
-
Requires-Dist:
|
32
|
-
Requires-Dist: psycopg[binary] (>=3.1.0,<4.0.0) ; extra == "postgres-psycopg-binary"
|
26
|
+
Requires-Dist: psycopg[binary] (>=3.1.0,<4.0.0)
|
33
27
|
Requires-Dist: pydantic (>=1.10.8,<2)
|
34
28
|
Requires-Dist: python-dotenv (>=1.0.0,<2.0.0)
|
35
29
|
Requires-Dist: sqlalchemy[asyncio] (>=2.0.23,<2.1)
|
@@ -0,0 +1 @@
|
|
1
|
+
__VERSION__ = "2.7.1"
|
@@ -29,7 +29,6 @@ class TaskV2(SQLModel, table=True):
|
|
29
29
|
sa_column=Column(JSON, server_default="{}", default={}, nullable=False)
|
30
30
|
)
|
31
31
|
|
32
|
-
owner: Optional[str] = None
|
33
32
|
version: Optional[str] = None
|
34
33
|
args_schema_non_parallel: Optional[dict[str, Any]] = Field(
|
35
34
|
sa_column=Column(JSON), default=None
|
@@ -44,7 +43,7 @@ class TaskV2(SQLModel, table=True):
|
|
44
43
|
input_types: dict[str, bool] = Field(sa_column=Column(JSON), default={})
|
45
44
|
output_types: dict[str, bool] = Field(sa_column=Column(JSON), default={})
|
46
45
|
|
47
|
-
taskgroupv2_id:
|
46
|
+
taskgroupv2_id: int = Field(foreign_key="taskgroupv2.id")
|
48
47
|
|
49
48
|
category: Optional[str] = None
|
50
49
|
modality: Optional[str] = None
|
{fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/admin/v2/task_group.py
RENAMED
@@ -21,6 +21,7 @@ from fractal_server.app.routes.auth._aux_auth import (
|
|
21
21
|
)
|
22
22
|
from fractal_server.app.schemas.v2 import TaskGroupReadV2
|
23
23
|
from fractal_server.app.schemas.v2 import TaskGroupUpdateV2
|
24
|
+
from fractal_server.app.schemas.v2 import TaskGroupV2OriginEnum
|
24
25
|
from fractal_server.logger import set_logger
|
25
26
|
|
26
27
|
router = APIRouter()
|
@@ -50,6 +51,8 @@ async def query_task_group_list(
|
|
50
51
|
user_group_id: Optional[int] = None,
|
51
52
|
private: Optional[bool] = None,
|
52
53
|
active: Optional[bool] = None,
|
54
|
+
pkg_name: Optional[str] = None,
|
55
|
+
origin: Optional[TaskGroupV2OriginEnum] = None,
|
53
56
|
user: UserOAuth = Depends(current_active_superuser),
|
54
57
|
db: AsyncSession = Depends(get_async_db),
|
55
58
|
) -> list[TaskGroupReadV2]:
|
@@ -75,6 +78,10 @@ async def query_task_group_list(
|
|
75
78
|
stm = stm.where(is_(TaskGroupV2.active, True))
|
76
79
|
else:
|
77
80
|
stm = stm.where(is_(TaskGroupV2.active, False))
|
81
|
+
if origin is not None:
|
82
|
+
stm = stm.where(TaskGroupV2.origin == origin)
|
83
|
+
if pkg_name is not None:
|
84
|
+
stm = stm.where(TaskGroupV2.pkg_name.icontains(pkg_name))
|
78
85
|
|
79
86
|
res = await db.execute(stm)
|
80
87
|
task_groups_list = res.scalars().all()
|
@@ -24,6 +24,7 @@ from fractal_server.app.models.v2 import TaskV2
|
|
24
24
|
from fractal_server.app.routes.auth import current_active_user
|
25
25
|
from fractal_server.app.routes.auth import current_active_verified_user
|
26
26
|
from fractal_server.app.schemas.v2 import TaskCreateV2
|
27
|
+
from fractal_server.app.schemas.v2 import TaskGroupV2OriginEnum
|
27
28
|
from fractal_server.app.schemas.v2 import TaskReadV2
|
28
29
|
from fractal_server.app.schemas.v2 import TaskUpdateV2
|
29
30
|
from fractal_server.logger import set_logger
|
@@ -200,7 +201,7 @@ async def create_task(
|
|
200
201
|
user_group_id=user_group_id,
|
201
202
|
active=True,
|
202
203
|
task_list=[db_task],
|
203
|
-
origin=
|
204
|
+
origin=TaskGroupV2OriginEnum.OTHER,
|
204
205
|
version=db_task.version,
|
205
206
|
pkg_name=pkg_name,
|
206
207
|
)
|
{fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/api/v2/task_collection.py
RENAMED
@@ -30,6 +30,7 @@ from ._aux_functions_tasks import _verify_non_duplication_user_constraint
|
|
30
30
|
from fractal_server.app.models import UserOAuth
|
31
31
|
from fractal_server.app.routes.auth import current_active_user
|
32
32
|
from fractal_server.app.routes.auth import current_active_verified_user
|
33
|
+
from fractal_server.app.schemas.v2 import TaskGroupV2OriginEnum
|
33
34
|
from fractal_server.tasks.utils import _normalize_package_name
|
34
35
|
from fractal_server.tasks.utils import get_collection_log_v2
|
35
36
|
from fractal_server.tasks.v2.background_operations import (
|
@@ -121,11 +122,11 @@ async def collect_tasks_pip(
|
|
121
122
|
wheel_info["distribution"]
|
122
123
|
)
|
123
124
|
task_group_attrs["version"] = wheel_info["version"]
|
124
|
-
task_group_attrs["origin"] =
|
125
|
+
task_group_attrs["origin"] = TaskGroupV2OriginEnum.WHEELFILE
|
125
126
|
else:
|
126
127
|
pkg_name = task_collect.package
|
127
128
|
task_group_attrs["pkg_name"] = _normalize_package_name(pkg_name)
|
128
|
-
task_group_attrs["origin"] =
|
129
|
+
task_group_attrs["origin"] = TaskGroupV2OriginEnum.PYPI
|
129
130
|
latest_version = await get_package_version_from_pypi(
|
130
131
|
task_collect.package,
|
131
132
|
task_collect.package_version,
|
@@ -21,6 +21,7 @@ from fractal_server.app.routes.auth import current_active_verified_user
|
|
21
21
|
from fractal_server.app.schemas.v2 import TaskCollectCustomV2
|
22
22
|
from fractal_server.app.schemas.v2 import TaskCreateV2
|
23
23
|
from fractal_server.app.schemas.v2 import TaskGroupCreateV2
|
24
|
+
from fractal_server.app.schemas.v2 import TaskGroupV2OriginEnum
|
24
25
|
from fractal_server.app.schemas.v2 import TaskReadV2
|
25
26
|
from fractal_server.config import get_settings
|
26
27
|
from fractal_server.logger import set_logger
|
@@ -140,7 +141,7 @@ async def collect_task_custom(
|
|
140
141
|
|
141
142
|
# Prepare task-group attributes
|
142
143
|
task_group_attrs = dict(
|
143
|
-
origin=
|
144
|
+
origin=TaskGroupV2OriginEnum.OTHER,
|
144
145
|
pkg_name=task_collect.label,
|
145
146
|
user_id=user.id,
|
146
147
|
user_group_id=user_group_id,
|
{fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/routes/api/v2/workflow_import.py
RENAMED
@@ -241,7 +241,10 @@ async def _get_task_by_taskimport(
|
|
241
241
|
"Found many task groups, after filtering by version."
|
242
242
|
)
|
243
243
|
final_task_group = await _disambiguate_task_groups(
|
244
|
-
matching_task_groups,
|
244
|
+
matching_task_groups=matching_task_groups,
|
245
|
+
user_id=user_id,
|
246
|
+
db=db,
|
247
|
+
default_group_id=default_group_id,
|
245
248
|
)
|
246
249
|
if final_task_group is None:
|
247
250
|
logger.info(
|
@@ -1055,55 +1055,59 @@ class FractalSlurmSSHExecutor(SlurmExecutor):
|
|
1055
1055
|
Arguments:
|
1056
1056
|
jobid: ID of the SLURM job
|
1057
1057
|
"""
|
1058
|
-
|
1059
|
-
# Loop over all job_ids, and fetch future and job objects
|
1060
|
-
futures: list[Future] = []
|
1061
|
-
jobs: list[SlurmJob] = []
|
1062
|
-
with self.jobs_lock:
|
1063
|
-
for job_id in job_ids:
|
1064
|
-
future, job = self.jobs.pop(job_id)
|
1065
|
-
futures.append(future)
|
1066
|
-
jobs.append(job)
|
1067
|
-
if not self.jobs:
|
1068
|
-
self.jobs_empty_cond.notify_all()
|
1069
|
-
|
1070
|
-
# Fetch subfolder from remote host
|
1058
|
+
# Handle all uncaught exceptions in this broad try/except block
|
1071
1059
|
try:
|
1072
|
-
self._get_subfolder_sftp(jobs=jobs)
|
1073
|
-
except NoValidConnectionsError as e:
|
1074
|
-
logger.error("NoValidConnectionError")
|
1075
|
-
logger.error(f"{str(e)=}")
|
1076
|
-
logger.error(f"{e.errors=}")
|
1077
|
-
for err in e.errors:
|
1078
|
-
logger.error(f"{str(err)}")
|
1079
|
-
|
1080
|
-
raise e
|
1081
|
-
|
1082
|
-
# First round of checking whether all output files exist
|
1083
|
-
missing_out_paths = []
|
1084
|
-
for job in jobs:
|
1085
|
-
for ind_out_path, out_path in enumerate(
|
1086
|
-
job.output_pickle_files_local
|
1087
|
-
):
|
1088
|
-
if not out_path.exists():
|
1089
|
-
missing_out_paths.append(out_path)
|
1090
|
-
num_missing = len(missing_out_paths)
|
1091
|
-
if num_missing > 0:
|
1092
|
-
# Output pickle files may be missing e.g. because of some slow
|
1093
|
-
# filesystem operation; wait some time before re-trying
|
1094
|
-
settings = Inject(get_settings)
|
1095
|
-
sleep_time = settings.FRACTAL_SLURM_ERROR_HANDLING_INTERVAL
|
1096
1060
|
logger.info(
|
1097
|
-
f"
|
1098
|
-
f"sleep {sleep_time} seconds."
|
1061
|
+
f"[FractalSlurmSSHExecutor._completion] START, for {job_ids=}."
|
1099
1062
|
)
|
1100
|
-
for missing_file in missing_out_paths:
|
1101
|
-
logger.debug(f"Missing output pickle file: {missing_file}")
|
1102
|
-
time.sleep(sleep_time)
|
1103
1063
|
|
1104
|
-
|
1105
|
-
|
1064
|
+
# Loop over all job_ids, and fetch future and job objects
|
1065
|
+
futures: list[Future] = []
|
1066
|
+
jobs: list[SlurmJob] = []
|
1067
|
+
with self.jobs_lock:
|
1068
|
+
for job_id in job_ids:
|
1069
|
+
future, job = self.jobs.pop(job_id)
|
1070
|
+
futures.append(future)
|
1071
|
+
jobs.append(job)
|
1072
|
+
if not self.jobs:
|
1073
|
+
self.jobs_empty_cond.notify_all()
|
1074
|
+
|
1075
|
+
# Fetch subfolder from remote host
|
1106
1076
|
try:
|
1077
|
+
self._get_subfolder_sftp(jobs=jobs)
|
1078
|
+
except NoValidConnectionsError as e:
|
1079
|
+
logger.error("NoValidConnectionError")
|
1080
|
+
logger.error(f"{str(e)=}")
|
1081
|
+
logger.error(f"{e.errors=}")
|
1082
|
+
for err in e.errors:
|
1083
|
+
logger.error(f"{str(err)}")
|
1084
|
+
|
1085
|
+
raise e
|
1086
|
+
|
1087
|
+
# First round of checking whether all output files exist
|
1088
|
+
missing_out_paths = []
|
1089
|
+
for job in jobs:
|
1090
|
+
for ind_out_path, out_path in enumerate(
|
1091
|
+
job.output_pickle_files_local
|
1092
|
+
):
|
1093
|
+
if not out_path.exists():
|
1094
|
+
missing_out_paths.append(out_path)
|
1095
|
+
num_missing = len(missing_out_paths)
|
1096
|
+
if num_missing > 0:
|
1097
|
+
# Output pickle files may be missing e.g. because of some slow
|
1098
|
+
# filesystem operation; wait some time before re-trying
|
1099
|
+
settings = Inject(get_settings)
|
1100
|
+
sleep_time = settings.FRACTAL_SLURM_ERROR_HANDLING_INTERVAL
|
1101
|
+
logger.info(
|
1102
|
+
f"{num_missing} output pickle files are missing; "
|
1103
|
+
f"sleep {sleep_time} seconds."
|
1104
|
+
)
|
1105
|
+
for missing_file in missing_out_paths:
|
1106
|
+
logger.debug(f"Missing output pickle file: {missing_file}")
|
1107
|
+
time.sleep(sleep_time)
|
1108
|
+
|
1109
|
+
# Handle all jobs
|
1110
|
+
for ind_job, job_id in enumerate(job_ids):
|
1107
1111
|
# Retrieve job and future objects
|
1108
1112
|
job = jobs[ind_job]
|
1109
1113
|
future = futures[ind_job]
|
@@ -1128,6 +1132,11 @@ class FractalSlurmSSHExecutor(SlurmExecutor):
|
|
1128
1132
|
remaining_futures=remaining_futures,
|
1129
1133
|
remaining_job_ids=remaining_job_ids,
|
1130
1134
|
)
|
1135
|
+
logger.info(
|
1136
|
+
"[FractalSlurmSSHExecutor._completion] END, "
|
1137
|
+
f"for {job_ids=}, with JobExecutionError due "
|
1138
|
+
f"to missing {out_path.as_posix()}."
|
1139
|
+
)
|
1131
1140
|
return
|
1132
1141
|
except InvalidStateError:
|
1133
1142
|
logger.warning(
|
@@ -1141,6 +1150,12 @@ class FractalSlurmSSHExecutor(SlurmExecutor):
|
|
1141
1150
|
remaining_futures=remaining_futures,
|
1142
1151
|
remaining_job_ids=remaining_job_ids,
|
1143
1152
|
)
|
1153
|
+
logger.info(
|
1154
|
+
"[FractalSlurmSSHExecutor._completion] END, "
|
1155
|
+
f"for {job_ids=}, with JobExecutionError/"
|
1156
|
+
"InvalidStateError due to "
|
1157
|
+
f"missing {out_path.as_posix()}."
|
1158
|
+
)
|
1144
1159
|
return
|
1145
1160
|
|
1146
1161
|
# Read the task output
|
@@ -1217,16 +1232,22 @@ class FractalSlurmSSHExecutor(SlurmExecutor):
|
|
1217
1232
|
else:
|
1218
1233
|
future.set_result(outputs)
|
1219
1234
|
|
1220
|
-
|
1235
|
+
except Exception as e:
|
1236
|
+
logger.warning(
|
1237
|
+
"[FractalSlurmSSHExecutor._completion] "
|
1238
|
+
f"An exception took place: {str(e)}."
|
1239
|
+
)
|
1240
|
+
for future in futures:
|
1221
1241
|
try:
|
1242
|
+
logger.info(f"Set exception for {future=}")
|
1222
1243
|
future.set_exception(e)
|
1223
|
-
return
|
1224
1244
|
except InvalidStateError:
|
1225
|
-
logger.
|
1226
|
-
|
1227
|
-
|
1228
|
-
|
1229
|
-
|
1245
|
+
logger.info(f"Future {future} was already cancelled.")
|
1246
|
+
logger.info(
|
1247
|
+
f"[FractalSlurmSSHExecutor._completion] END, for {job_ids=}, "
|
1248
|
+
"from within exception handling."
|
1249
|
+
)
|
1250
|
+
return
|
1230
1251
|
|
1231
1252
|
def _get_subfolder_sftp(self, jobs: list[SlurmJob]) -> None:
|
1232
1253
|
"""
|
@@ -30,6 +30,7 @@ from .task_collection import TaskCollectPipV2 # noqa F401
|
|
30
30
|
from .task_group import TaskGroupCreateV2 # noqa F401
|
31
31
|
from .task_group import TaskGroupReadV2 # noqa F401
|
32
32
|
from .task_group import TaskGroupUpdateV2 # noqa F401
|
33
|
+
from .task_group import TaskGroupV2OriginEnum # noqa F401
|
33
34
|
from .workflow import WorkflowCreateV2 # noqa F401
|
34
35
|
from .workflow import WorkflowExportV2 # noqa F401
|
35
36
|
from .workflow import WorkflowImportV2 # noqa F401
|
{fractal_server-2.7.0a10 → fractal_server-2.7.1}/fractal_server/app/schemas/v2/task_group.py
RENAMED
@@ -1,4 +1,5 @@
|
|
1
1
|
from datetime import datetime
|
2
|
+
from enum import Enum
|
2
3
|
from typing import Literal
|
3
4
|
from typing import Optional
|
4
5
|
|
@@ -13,11 +14,17 @@ from .._validators import valstr
|
|
13
14
|
from .task import TaskReadV2
|
14
15
|
|
15
16
|
|
17
|
+
class TaskGroupV2OriginEnum(str, Enum):
|
18
|
+
PYPI = "pypi"
|
19
|
+
WHEELFILE = "wheel-file"
|
20
|
+
OTHER = "other"
|
21
|
+
|
22
|
+
|
16
23
|
class TaskGroupCreateV2(BaseModel, extra=Extra.forbid):
|
17
24
|
user_id: int
|
18
25
|
user_group_id: Optional[int] = None
|
19
26
|
active: bool = True
|
20
|
-
origin:
|
27
|
+
origin: TaskGroupV2OriginEnum
|
21
28
|
pkg_name: str
|
22
29
|
version: Optional[str] = None
|
23
30
|
python_version: Optional[str] = None
|
@@ -315,13 +315,20 @@ async def _create_first_user(
|
|
315
315
|
|
316
316
|
|
317
317
|
def _create_first_group():
|
318
|
+
"""
|
319
|
+
Create a `UserGroup` with `name=FRACTAL_DEFAULT_GROUP_NAME`, if missing.
|
320
|
+
"""
|
318
321
|
function_logger = set_logger("fractal_server.create_first_group")
|
319
322
|
|
320
323
|
function_logger.info(
|
321
324
|
f"START _create_first_group, with name '{FRACTAL_DEFAULT_GROUP_NAME}'"
|
322
325
|
)
|
323
326
|
with next(get_sync_db()) as db:
|
324
|
-
group_all = db.execute(
|
327
|
+
group_all = db.execute(
|
328
|
+
select(UserGroup).where(
|
329
|
+
UserGroup.name == FRACTAL_DEFAULT_GROUP_NAME
|
330
|
+
)
|
331
|
+
)
|
325
332
|
if group_all.scalars().one_or_none() is None:
|
326
333
|
first_group = UserGroup(name=FRACTAL_DEFAULT_GROUP_NAME)
|
327
334
|
db.add(first_group)
|
@@ -167,9 +167,9 @@ class Settings(BaseSettings):
|
|
167
167
|
###########################################################################
|
168
168
|
# DATABASE
|
169
169
|
###########################################################################
|
170
|
-
DB_ENGINE: Literal["sqlite", "postgres
|
170
|
+
DB_ENGINE: Literal["sqlite", "postgres-psycopg"] = "sqlite"
|
171
171
|
"""
|
172
|
-
|
172
|
+
Database engine to use (supported: `sqlite`, `postgres-psycopg`).
|
173
173
|
"""
|
174
174
|
DB_ECHO: bool = False
|
175
175
|
"""
|
@@ -203,16 +203,7 @@ class Settings(BaseSettings):
|
|
203
203
|
|
204
204
|
@property
|
205
205
|
def DATABASE_ASYNC_URL(self) -> URL:
|
206
|
-
if self.DB_ENGINE == "postgres":
|
207
|
-
url = URL.create(
|
208
|
-
drivername="postgresql+asyncpg",
|
209
|
-
username=self.POSTGRES_USER,
|
210
|
-
password=self.POSTGRES_PASSWORD,
|
211
|
-
host=self.POSTGRES_HOST,
|
212
|
-
port=self.POSTGRES_PORT,
|
213
|
-
database=self.POSTGRES_DB,
|
214
|
-
)
|
215
|
-
elif self.DB_ENGINE == "postgres-psycopg":
|
206
|
+
if self.DB_ENGINE == "postgres-psycopg":
|
216
207
|
url = URL.create(
|
217
208
|
drivername="postgresql+psycopg",
|
218
209
|
username=self.POSTGRES_USER,
|
@@ -235,11 +226,7 @@ class Settings(BaseSettings):
|
|
235
226
|
|
236
227
|
@property
|
237
228
|
def DATABASE_SYNC_URL(self):
|
238
|
-
if self.DB_ENGINE == "postgres":
|
239
|
-
return self.DATABASE_ASYNC_URL.set(
|
240
|
-
drivername="postgresql+psycopg2"
|
241
|
-
)
|
242
|
-
elif self.DB_ENGINE == "postgres-psycopg":
|
229
|
+
if self.DB_ENGINE == "postgres-psycopg":
|
243
230
|
return self.DATABASE_ASYNC_URL.set(drivername="postgresql+psycopg")
|
244
231
|
else:
|
245
232
|
if not self.SQLITE_PATH:
|
@@ -546,20 +533,13 @@ class Settings(BaseSettings):
|
|
546
533
|
"""
|
547
534
|
Checks that db environment variables are properly set.
|
548
535
|
"""
|
549
|
-
if self.DB_ENGINE == "postgres":
|
536
|
+
if self.DB_ENGINE == "postgres-psycopg":
|
550
537
|
if not self.POSTGRES_DB:
|
551
538
|
raise FractalConfigurationError(
|
552
|
-
"POSTGRES_DB cannot be None when DB_ENGINE=
|
553
|
-
|
554
|
-
try:
|
555
|
-
import psycopg2 # noqa: F401
|
556
|
-
import asyncpg # noqa: F401
|
557
|
-
except ModuleNotFoundError:
|
558
|
-
raise FractalConfigurationError(
|
559
|
-
"DB engine is `postgres` but `psycopg2` or `asyncpg` "
|
560
|
-
"are not available"
|
539
|
+
"POSTGRES_DB cannot be None when DB_ENGINE="
|
540
|
+
"postgres-psycopg."
|
561
541
|
)
|
562
|
-
|
542
|
+
|
563
543
|
try:
|
564
544
|
import psycopg # noqa: F401
|
565
545
|
except ModuleNotFoundError:
|
fractal_server-2.7.1/fractal_server/migrations/versions/8e8f227a3e36_update_taskv2_post_2_7_0.py
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
"""Update TaskV2 post 2.7.0
|
2
|
+
|
3
|
+
Revision ID: 8e8f227a3e36
|
4
|
+
Revises: 034a469ec2eb
|
5
|
+
Create Date: 2024-10-29 09:01:33.075251
|
6
|
+
|
7
|
+
"""
|
8
|
+
import sqlalchemy as sa
|
9
|
+
from alembic import op
|
10
|
+
|
11
|
+
|
12
|
+
# revision identifiers, used by Alembic.
|
13
|
+
revision = "8e8f227a3e36"
|
14
|
+
down_revision = "034a469ec2eb"
|
15
|
+
branch_labels = None
|
16
|
+
depends_on = None
|
17
|
+
|
18
|
+
|
19
|
+
def upgrade() -> None:
|
20
|
+
# ### commands auto generated by Alembic - please adjust! ###
|
21
|
+
with op.batch_alter_table("taskv2", schema=None) as batch_op:
|
22
|
+
batch_op.alter_column(
|
23
|
+
"taskgroupv2_id", existing_type=sa.INTEGER(), nullable=False
|
24
|
+
)
|
25
|
+
batch_op.drop_column("owner")
|
26
|
+
|
27
|
+
# ### end Alembic commands ###
|
28
|
+
|
29
|
+
|
30
|
+
def downgrade() -> None:
|
31
|
+
# ### commands auto generated by Alembic - please adjust! ###
|
32
|
+
with op.batch_alter_table("taskv2", schema=None) as batch_op:
|
33
|
+
batch_op.add_column(
|
34
|
+
sa.Column(
|
35
|
+
"owner", sa.VARCHAR(), autoincrement=False, nullable=True
|
36
|
+
)
|
37
|
+
)
|
38
|
+
batch_op.alter_column(
|
39
|
+
"taskgroupv2_id", existing_type=sa.INTEGER(), nullable=True
|
40
|
+
)
|
41
|
+
|
42
|
+
# ### end Alembic commands ###
|
@@ -73,6 +73,11 @@ async def _pip_install(
|
|
73
73
|
),
|
74
74
|
logger_name=logger_name,
|
75
75
|
)
|
76
|
+
await execute_command(
|
77
|
+
cwd=Path(task_group.venv_path),
|
78
|
+
command=f"{python_bin} -m pip install setuptools",
|
79
|
+
logger_name=logger_name,
|
80
|
+
)
|
76
81
|
await execute_command(
|
77
82
|
cwd=Path(task_group.venv_path),
|
78
83
|
command=f"{python_bin} -m pip install {pip_install_str}",
|
@@ -205,7 +205,7 @@ def background_collect_pip_ssh(
|
|
205
205
|
remove_venv_folder_upon_failure = True
|
206
206
|
|
207
207
|
stdout = _customize_and_run_template(
|
208
|
-
script_filename="
|
208
|
+
script_filename="_2_preliminary_pip_operations.sh",
|
209
209
|
**common_args,
|
210
210
|
)
|
211
211
|
stdout = _customize_and_run_template(
|
@@ -1,6 +1,6 @@
|
|
1
1
|
[tool.poetry]
|
2
2
|
name = "fractal-server"
|
3
|
-
version = "2.7.
|
3
|
+
version = "2.7.1"
|
4
4
|
description = "Server component of the Fractal analytics platform"
|
5
5
|
authors = [
|
6
6
|
"Tommaso Comparin <tommaso.comparin@exact-lab.it>",
|
@@ -24,7 +24,7 @@ exclude = [
|
|
24
24
|
|
25
25
|
|
26
26
|
[tool.poetry.dependencies]
|
27
|
-
python = "^3.
|
27
|
+
python = "^3.10"
|
28
28
|
python-dotenv = "^1.0.0"
|
29
29
|
fastapi = "^0.115.0"
|
30
30
|
sqlmodel = "^0.0.21"
|
@@ -40,17 +40,12 @@ clusterfutures = "^0.5"
|
|
40
40
|
cloudpickle = ">=3.0.0,<3.1.0"
|
41
41
|
fabric = "^3.2.2"
|
42
42
|
|
43
|
-
|
44
|
-
|
45
|
-
psycopg = { version = "^3.1.0", extras=["binary"], optional=true }
|
46
|
-
psycopg2 = { version = "^2.9.5", optional = true }
|
43
|
+
gunicorn = { version = ">=21.2,<23.0" }
|
44
|
+
psycopg = { version = "^3.1.0", extras=["binary"] }
|
47
45
|
psutil = "^5.9.8"
|
48
46
|
uvicorn-worker = "^0.2.0"
|
49
47
|
|
50
48
|
[tool.poetry.extras]
|
51
|
-
postgres = ["asyncpg", "psycopg2"]
|
52
|
-
gunicorn = ["gunicorn"]
|
53
|
-
postgres-psycopg-binary = ["psycopg"]
|
54
49
|
|
55
50
|
[tool.poetry.group.dev.dependencies]
|
56
51
|
asgi-lifespan = "^2"
|
@@ -92,7 +87,7 @@ filterwarnings = [
|
|
92
87
|
]
|
93
88
|
|
94
89
|
[tool.bumpver]
|
95
|
-
current_version = "2.7.
|
90
|
+
current_version = "2.7.1"
|
96
91
|
version_pattern = "MAJOR.MINOR.PATCH[PYTAGNUM]"
|
97
92
|
commit_message = "bump version {old_version} -> {new_version}"
|
98
93
|
commit = true
|
@@ -1 +0,0 @@
|
|
1
|
-
__VERSION__ = "2.7.0a10"
|