fractal-server 2.3.4__tar.gz → 2.3.6__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.3.4 → fractal_server-2.3.6}/PKG-INFO +2 -2
- fractal_server-2.3.6/fractal_server/__init__.py +1 -0
- fractal_server-2.3.6/fractal_server/app/models/v2/task.py +41 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/routes/api/v2/_aux_functions.py +4 -6
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/routes/api/v2/workflowtask.py +6 -23
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/executors/slurm/_slurm_config.py +16 -1
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/executors/slurm/ssh/executor.py +19 -4
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/executors/slurm/sudo/executor.py +6 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/v2/__init__.py +1 -1
- {fractal_server-2.3.4/fractal_server/app/runner/v2/_slurm_ssh → fractal_server-2.3.6/fractal_server/app/runner/v2/_slurm_common}/get_slurm_config.py +4 -13
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/v2/_slurm_ssh/_submit_setup.py +3 -3
- {fractal_server-2.3.4/fractal_server/app/runner/v2/_slurm → fractal_server-2.3.6/fractal_server/app/runner/v2/_slurm_sudo}/_submit_setup.py +3 -3
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/ssh/_fabric.py +22 -0
- fractal_server-2.3.6/fractal_server/tasks/v2/__init__.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/pyproject.toml +3 -3
- fractal_server-2.3.4/fractal_server/__init__.py +0 -1
- fractal_server-2.3.4/fractal_server/app/models/v2/task.py +0 -93
- fractal_server-2.3.4/fractal_server/app/runner/v2/_slurm/get_slurm_config.py +0 -182
- {fractal_server-2.3.4 → fractal_server-2.3.6}/LICENSE +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/README.md +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/__main__.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/alembic.ini +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/__init__.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/db/__init__.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/models/__init__.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/models/linkuserproject.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/models/security.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/models/v1/__init__.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/models/v1/dataset.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/models/v1/job.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/models/v1/project.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/models/v1/state.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/models/v1/task.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/models/v1/workflow.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/models/v2/__init__.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/models/v2/collection_state.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/models/v2/dataset.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/models/v2/job.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/models/v2/project.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/models/v2/workflow.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/models/v2/workflowtask.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/routes/__init__.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/routes/admin/__init__.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/routes/admin/v1.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/routes/admin/v2.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/routes/api/__init__.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/routes/api/v1/__init__.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/routes/api/v1/_aux_functions.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/routes/api/v1/dataset.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/routes/api/v1/job.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/routes/api/v1/project.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/routes/api/v1/task.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/routes/api/v1/task_collection.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/routes/api/v1/workflow.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/routes/api/v1/workflowtask.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/routes/api/v2/__init__.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/routes/api/v2/dataset.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/routes/api/v2/images.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/routes/api/v2/job.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/routes/api/v2/project.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/routes/api/v2/status.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/routes/api/v2/submit.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/routes/api/v2/task.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/routes/api/v2/task_collection.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/routes/api/v2/task_collection_custom.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/routes/api/v2/task_legacy.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/routes/api/v2/workflow.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/routes/auth.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/routes/aux/__init__.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/routes/aux/_job.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/routes/aux/_runner.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/.gitignore +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/__init__.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/async_wrap.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/components.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/compress_folder.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/exceptions.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/executors/__init__.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/executors/slurm/__init__.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/executors/slurm/_batching.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/executors/slurm/remote.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/executors/slurm/ssh/__init__.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/executors/slurm/ssh/_executor_wait_thread.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/executors/slurm/ssh/_slurm_job.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/executors/slurm/sudo/__init__.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/executors/slurm/sudo/_check_jobs_status.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/executors/slurm/sudo/_executor_wait_thread.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/executors/slurm/sudo/_subprocess_run_as_user.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/extract_archive.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/filenames.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/run_subprocess.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/set_start_and_last_task_index.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/shutdown.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/task_files.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/v1/__init__.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/v1/_common.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/v1/_local/__init__.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/v1/_local/_local_config.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/v1/_local/_submit_setup.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/v1/_local/executor.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/v1/_slurm/__init__.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/v1/_slurm/_submit_setup.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/v1/_slurm/get_slurm_config.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/v1/common.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/v1/handle_failed_job.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/v2/_local/__init__.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/v2/_local/_local_config.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/v2/_local/_submit_setup.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/v2/_local/executor.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/v2/_local_experimental/__init__.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/v2/_local_experimental/_local_config.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/v2/_local_experimental/_submit_setup.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/v2/_local_experimental/executor.py +0 -0
- {fractal_server-2.3.4/fractal_server/tasks/v1 → fractal_server-2.3.6/fractal_server/app/runner/v2/_slurm_common}/__init__.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/v2/_slurm_ssh/__init__.py +0 -0
- {fractal_server-2.3.4/fractal_server/app/runner/v2/_slurm → fractal_server-2.3.6/fractal_server/app/runner/v2/_slurm_sudo}/__init__.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/v2/deduplicate_list.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/v2/handle_failed_job.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/v2/merge_outputs.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/v2/runner.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/v2/runner_functions.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/v2/runner_functions_low_level.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/v2/task_interface.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/v2/v1_compat.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/runner/versions.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/schemas/__init__.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/schemas/_validators.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/schemas/user.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/schemas/v1/__init__.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/schemas/v1/applyworkflow.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/schemas/v1/dataset.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/schemas/v1/dumps.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/schemas/v1/manifest.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/schemas/v1/project.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/schemas/v1/state.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/schemas/v1/task.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/schemas/v1/task_collection.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/schemas/v1/workflow.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/schemas/v2/__init__.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/schemas/v2/dataset.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/schemas/v2/dumps.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/schemas/v2/job.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/schemas/v2/manifest.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/schemas/v2/project.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/schemas/v2/status.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/schemas/v2/task.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/schemas/v2/task_collection.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/schemas/v2/workflow.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/schemas/v2/workflowtask.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/security/__init__.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/config.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/data_migrations/README.md +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/gunicorn_fractal.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/images/__init__.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/images/models.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/images/tools.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/logger.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/main.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/migrations/README +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/migrations/env.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/migrations/script.py.mako +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/migrations/versions/4c308bcaea2b_add_task_args_schema_and_task_args_.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/migrations/versions/4cedeb448a53_workflowtask_foreign_keys_not_nullables.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/migrations/versions/50a13d6138fd_initial_schema.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/migrations/versions/5bf02391cfef_v2.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/migrations/versions/70e77f1c38b0_add_applyworkflow_first_task_index_and_.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/migrations/versions/71eefd1dd202_add_slurm_accounts.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/migrations/versions/84bf0fffde30_add_dumps_to_applyworkflow.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/migrations/versions/8f79bd162e35_add_docs_info_and_docs_link_to_task_.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/migrations/versions/97f444d47249_add_applyworkflow_project_dump.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/migrations/versions/99ea79d9e5d2_add_dataset_history.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/migrations/versions/9fd26a2b0de4_add_workflow_timestamp_created.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/migrations/versions/a7f4d6137b53_add_workflow_dump_to_applyworkflow.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/migrations/versions/d4fe3708d309_make_applyworkflow_workflow_dump_non_.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/migrations/versions/e75cac726012_make_applyworkflow_start_timestamp_not_.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/migrations/versions/efa89c30e0a4_add_project_timestamp_created.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/migrations/versions/f384e1c0cf5d_drop_task_default_args_columns.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/py.typed +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/ssh/__init__.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/string_tools.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/syringe.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/tasks/__init__.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/tasks/utils.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/tasks/v1/_TaskCollectPip.py +0 -0
- {fractal_server-2.3.4/fractal_server/tasks/v2 → fractal_server-2.3.6/fractal_server/tasks/v1}/__init__.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/tasks/v1/background_operations.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/tasks/v1/endpoint_operations.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/tasks/v1/get_collection_data.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/tasks/v1/utils.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/tasks/v2/_TaskCollectPip.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/tasks/v2/_venv_pip.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/tasks/v2/background_operations.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/tasks/v2/background_operations_ssh.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/tasks/v2/endpoint_operations.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/tasks/v2/templates/_1_create_venv.sh +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/tasks/v2/templates/_2_upgrade_pip.sh +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/tasks/v2/templates/_3_pip_install.sh +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/tasks/v2/templates/_4_pip_freeze.sh +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/tasks/v2/templates/_5_pip_show.sh +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/tasks/v2/utils.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/urls.py +0 -0
- {fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/utils.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: fractal-server
|
3
|
-
Version: 2.3.
|
3
|
+
Version: 2.3.6
|
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
|
@@ -33,7 +33,7 @@ Requires-Dist: psycopg[binary] (>=3.1.0,<4.0.0) ; extra == "postgres-psycopg-bin
|
|
33
33
|
Requires-Dist: pydantic (>=1.10.8,<2)
|
34
34
|
Requires-Dist: python-dotenv (>=1.0.0,<2.0.0)
|
35
35
|
Requires-Dist: sqlalchemy[asyncio] (>=2.0.23,<2.1)
|
36
|
-
Requires-Dist: sqlmodel (>=0.0.
|
36
|
+
Requires-Dist: sqlmodel (>=0.0.21,<0.0.22)
|
37
37
|
Requires-Dist: uvicorn (>=0.29.0,<0.30.0)
|
38
38
|
Project-URL: Changelog, https://github.com/fractal-analytics-platform/fractal-server/blob/main/CHANGELOG.md
|
39
39
|
Project-URL: Documentation, https://fractal-analytics-platform.github.io/fractal-server
|
@@ -0,0 +1 @@
|
|
1
|
+
__VERSION__ = "2.3.6"
|
@@ -0,0 +1,41 @@
|
|
1
|
+
from typing import Any
|
2
|
+
from typing import Optional
|
3
|
+
|
4
|
+
from pydantic import HttpUrl
|
5
|
+
from sqlalchemy import Column
|
6
|
+
from sqlalchemy.types import JSON
|
7
|
+
from sqlmodel import Field
|
8
|
+
from sqlmodel import SQLModel
|
9
|
+
|
10
|
+
|
11
|
+
class TaskV2(SQLModel, table=True):
|
12
|
+
|
13
|
+
id: Optional[int] = Field(default=None, primary_key=True)
|
14
|
+
name: str
|
15
|
+
|
16
|
+
type: str
|
17
|
+
command_non_parallel: Optional[str] = None
|
18
|
+
command_parallel: Optional[str] = None
|
19
|
+
source: str = Field(unique=True)
|
20
|
+
|
21
|
+
meta_non_parallel: dict[str, Any] = Field(
|
22
|
+
sa_column=Column(JSON, server_default="{}", default={}, nullable=False)
|
23
|
+
)
|
24
|
+
meta_parallel: dict[str, Any] = Field(
|
25
|
+
sa_column=Column(JSON, server_default="{}", default={}, nullable=False)
|
26
|
+
)
|
27
|
+
|
28
|
+
owner: Optional[str] = None
|
29
|
+
version: Optional[str] = None
|
30
|
+
args_schema_non_parallel: Optional[dict[str, Any]] = Field(
|
31
|
+
sa_column=Column(JSON), default=None
|
32
|
+
)
|
33
|
+
args_schema_parallel: Optional[dict[str, Any]] = Field(
|
34
|
+
sa_column=Column(JSON), default=None
|
35
|
+
)
|
36
|
+
args_schema_version: Optional[str]
|
37
|
+
docs_info: Optional[str] = None
|
38
|
+
docs_link: Optional[HttpUrl] = None
|
39
|
+
|
40
|
+
input_types: dict[str, bool] = Field(sa_column=Column(JSON), default={})
|
41
|
+
output_types: dict[str, bool] = Field(sa_column=Column(JSON), default={})
|
{fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/routes/api/v2/_aux_functions.py
RENAMED
@@ -422,6 +422,8 @@ async def _workflow_insert_task(
|
|
422
422
|
|
423
423
|
# Get task from db, and extract default arguments via a Task property
|
424
424
|
# method
|
425
|
+
# NOTE: this logic remains there for V1 tasks only. When we deprecate V1
|
426
|
+
# tasks, we can simplify this block
|
425
427
|
if is_legacy_task is True:
|
426
428
|
db_task = await db.get(Task, task_id)
|
427
429
|
if db_task is None:
|
@@ -439,12 +441,8 @@ async def _workflow_insert_task(
|
|
439
441
|
raise ValueError(f"TaskV2 {task_id} not found.")
|
440
442
|
task_type = db_task.type
|
441
443
|
|
442
|
-
final_args_non_parallel =
|
443
|
-
|
444
|
-
)
|
445
|
-
final_args_parallel = (
|
446
|
-
db_task.default_args_parallel_from_args_schema.copy()
|
447
|
-
)
|
444
|
+
final_args_non_parallel = {}
|
445
|
+
final_args_parallel = {}
|
448
446
|
final_meta_parallel = (db_task.meta_parallel or {}).copy()
|
449
447
|
final_meta_non_parallel = (db_task.meta_non_parallel or {}).copy()
|
450
448
|
|
{fractal_server-2.3.4 → fractal_server-2.3.6}/fractal_server/app/routes/api/v2/workflowtask.py
RENAMED
@@ -186,34 +186,17 @@ async def update_workflowtask(
|
|
186
186
|
default_args = (
|
187
187
|
db_wf_task.task_legacy.default_args_from_args_schema
|
188
188
|
)
|
189
|
+
actual_args = deepcopy(default_args)
|
190
|
+
if value is not None:
|
191
|
+
for k, v in value.items():
|
192
|
+
actual_args[k] = v
|
189
193
|
else:
|
190
|
-
|
191
|
-
db_wf_task.task.default_args_parallel_from_args_schema
|
192
|
-
)
|
193
|
-
# Override default_args with args value items
|
194
|
-
actual_args = deepcopy(default_args)
|
195
|
-
if value is not None:
|
196
|
-
for k, v in value.items():
|
197
|
-
actual_args[k] = v
|
194
|
+
actual_args = deepcopy(value)
|
198
195
|
if not actual_args:
|
199
196
|
actual_args = None
|
200
197
|
setattr(db_wf_task, key, actual_args)
|
201
198
|
elif key == "args_non_parallel":
|
202
|
-
|
203
|
-
if db_wf_task.is_legacy_task:
|
204
|
-
# This is only needed so that we don't have to modify the rest
|
205
|
-
# of this block, but legacy task cannot take any non-parallel
|
206
|
-
# args (see checks above).
|
207
|
-
default_args = {}
|
208
|
-
else:
|
209
|
-
default_args = deepcopy(
|
210
|
-
db_wf_task.task.default_args_non_parallel_from_args_schema
|
211
|
-
)
|
212
|
-
# Override default_args with args value items
|
213
|
-
actual_args = default_args.copy()
|
214
|
-
if value is not None:
|
215
|
-
for k, v in value.items():
|
216
|
-
actual_args[k] = v
|
199
|
+
actual_args = deepcopy(value)
|
217
200
|
if not actual_args:
|
218
201
|
actual_args = None
|
219
202
|
setattr(db_wf_task, key, actual_args)
|
@@ -62,6 +62,8 @@ class _SlurmConfigSet(BaseModel, extra=Extra.forbid):
|
|
62
62
|
time: Optional[str]
|
63
63
|
account: Optional[str]
|
64
64
|
extra_lines: Optional[list[str]]
|
65
|
+
pre_submission_commands: Optional[list[str]]
|
66
|
+
gpus: Optional[str]
|
65
67
|
|
66
68
|
|
67
69
|
class _BatchingConfigSet(BaseModel, extra=Extra.forbid):
|
@@ -219,6 +221,7 @@ class SlurmConfig(BaseModel, extra=Extra.forbid):
|
|
219
221
|
constraint: Corresponds to SLURM option.
|
220
222
|
gres: Corresponds to SLURM option.
|
221
223
|
account: Corresponds to SLURM option.
|
224
|
+
gpus: Corresponds to SLURM option.
|
222
225
|
time: Corresponds to SLURM option (WARNING: not fully supported).
|
223
226
|
prefix: Prefix of configuration lines in SLURM submission scripts.
|
224
227
|
shebang_line: Shebang line for SLURM submission scripts.
|
@@ -240,6 +243,8 @@ class SlurmConfig(BaseModel, extra=Extra.forbid):
|
|
240
243
|
Key-value pairs to be included as `export`-ed variables in SLURM
|
241
244
|
submission script, after prepending values with the user's cache
|
242
245
|
directory.
|
246
|
+
pre_submission_commands: List of commands to be prepended to the sbatch
|
247
|
+
command.
|
243
248
|
"""
|
244
249
|
|
245
250
|
# Required SLURM parameters (note that the integer attributes are those
|
@@ -254,6 +259,7 @@ class SlurmConfig(BaseModel, extra=Extra.forbid):
|
|
254
259
|
job_name: Optional[str] = None
|
255
260
|
constraint: Optional[str] = None
|
256
261
|
gres: Optional[str] = None
|
262
|
+
gpus: Optional[str] = None
|
257
263
|
time: Optional[str] = None
|
258
264
|
account: Optional[str] = None
|
259
265
|
|
@@ -274,6 +280,8 @@ class SlurmConfig(BaseModel, extra=Extra.forbid):
|
|
274
280
|
target_num_jobs: int
|
275
281
|
max_num_jobs: int
|
276
282
|
|
283
|
+
pre_submission_commands: list[str] = Field(default_factory=list)
|
284
|
+
|
277
285
|
def _sorted_extra_lines(self) -> list[str]:
|
278
286
|
"""
|
279
287
|
Return a copy of `self.extra_lines`, where lines starting with
|
@@ -340,7 +348,14 @@ class SlurmConfig(BaseModel, extra=Extra.forbid):
|
|
340
348
|
f"{self.prefix} --cpus-per-task={self.cpus_per_task}",
|
341
349
|
f"{self.prefix} --mem={mem_per_job_MB}M",
|
342
350
|
]
|
343
|
-
for key in [
|
351
|
+
for key in [
|
352
|
+
"job_name",
|
353
|
+
"constraint",
|
354
|
+
"gres",
|
355
|
+
"gpus",
|
356
|
+
"time",
|
357
|
+
"account",
|
358
|
+
]:
|
344
359
|
value = getattr(self, key)
|
345
360
|
if value is not None:
|
346
361
|
# Handle the `time` parameter
|
@@ -869,9 +869,22 @@ class FractalSlurmSSHExecutor(SlurmExecutor):
|
|
869
869
|
|
870
870
|
# Submit job to SLURM, and get jobid
|
871
871
|
sbatch_command = f"sbatch --parsable {job.slurm_script_remote}"
|
872
|
-
|
873
|
-
|
874
|
-
|
872
|
+
pre_submission_cmds = job.slurm_config.pre_submission_commands
|
873
|
+
if len(pre_submission_cmds) == 0:
|
874
|
+
sbatch_stdout = self.fractal_ssh.run_command(cmd=sbatch_command)
|
875
|
+
else:
|
876
|
+
logger.debug(f"Now using {pre_submission_cmds=}")
|
877
|
+
script_lines = pre_submission_cmds + [sbatch_command]
|
878
|
+
script_content = "\n".join(script_lines)
|
879
|
+
script_content = f"{script_content}\n"
|
880
|
+
script_path_remote = (
|
881
|
+
f"{job.slurm_script_remote.as_posix()}_wrapper.sh"
|
882
|
+
)
|
883
|
+
self.fractal_ssh.write_remote_file(
|
884
|
+
path=script_path_remote, content=script_content
|
885
|
+
)
|
886
|
+
cmd = f"bash {script_path_remote}"
|
887
|
+
sbatch_stdout = self.fractal_ssh.run_command(cmd=cmd)
|
875
888
|
|
876
889
|
# Extract SLURM job ID from stdout
|
877
890
|
try:
|
@@ -881,7 +894,9 @@ class FractalSlurmSSHExecutor(SlurmExecutor):
|
|
881
894
|
error_msg = (
|
882
895
|
f"Submit command `{sbatch_command}` returned "
|
883
896
|
f"`{stdout=}` which cannot be cast to an integer "
|
884
|
-
f"SLURM-job ID
|
897
|
+
f"SLURM-job ID.\n"
|
898
|
+
f"Note that {pre_submission_cmds=}.\n"
|
899
|
+
f"Original error:\n{str(e)}"
|
885
900
|
)
|
886
901
|
logger.error(error_msg)
|
887
902
|
raise JobExecutionError(info=error_msg)
|
@@ -1121,6 +1121,12 @@ class FractalSlurmExecutor(SlurmExecutor):
|
|
1121
1121
|
slurm_err_path=str(job.slurm_stderr),
|
1122
1122
|
)
|
1123
1123
|
|
1124
|
+
# Print warning for ignored parameter
|
1125
|
+
if len(job.slurm_config.pre_submission_commands) > 0:
|
1126
|
+
logger.warning(
|
1127
|
+
f"Ignoring {job.slurm_config.pre_submission_commands=}."
|
1128
|
+
)
|
1129
|
+
|
1124
1130
|
# Submit job via sbatch, and retrieve jobid
|
1125
1131
|
|
1126
1132
|
# Write script content to a job.slurm_script
|
@@ -36,8 +36,8 @@ from ._local import process_workflow as local_process_workflow
|
|
36
36
|
from ._local_experimental import (
|
37
37
|
process_workflow as local_experimental_process_workflow,
|
38
38
|
)
|
39
|
-
from ._slurm import process_workflow as slurm_sudo_process_workflow
|
40
39
|
from ._slurm_ssh import process_workflow as slurm_ssh_process_workflow
|
40
|
+
from ._slurm_sudo import process_workflow as slurm_sudo_process_workflow
|
41
41
|
from .handle_failed_job import assemble_filters_failed_job
|
42
42
|
from .handle_failed_job import assemble_history_failed_job
|
43
43
|
from .handle_failed_job import assemble_images_failed_job
|
@@ -18,8 +18,6 @@ from fractal_server.app.runner.executors.slurm._slurm_config import (
|
|
18
18
|
|
19
19
|
def get_slurm_config(
|
20
20
|
wftask: WorkflowTaskV2,
|
21
|
-
workflow_dir_local: Path,
|
22
|
-
workflow_dir_remote: Path,
|
23
21
|
which_type: Literal["non_parallel", "parallel"],
|
24
22
|
config_path: Optional[Path] = None,
|
25
23
|
) -> SlurmConfig:
|
@@ -43,13 +41,6 @@ def get_slurm_config(
|
|
43
41
|
wftask:
|
44
42
|
WorkflowTask for which the SLURM configuration is is to be
|
45
43
|
prepared.
|
46
|
-
workflow_dir_local:
|
47
|
-
Server-owned directory to store all task-execution-related relevant
|
48
|
-
files (inputs, outputs, errors, and all meta files related to the
|
49
|
-
job execution). Note: users cannot write directly to this folder.
|
50
|
-
workflow_dir_remote:
|
51
|
-
User-side directory with the same scope as `workflow_dir_local`,
|
52
|
-
and where a user can write.
|
53
44
|
config_path:
|
54
45
|
Path of a Fractal SLURM configuration file; if `None`, use
|
55
46
|
`FRACTAL_SLURM_CONFIG_FILE` variable from settings.
|
@@ -99,13 +90,13 @@ def get_slurm_config(
|
|
99
90
|
# 1. This block of definitions takes priority over other definitions from
|
100
91
|
# slurm_env which are not under the `needs_gpu` subgroup
|
101
92
|
# 2. This block of definitions has lower priority than whatever comes next
|
102
|
-
# (i.e. from WorkflowTask.
|
93
|
+
# (i.e. from WorkflowTask.meta_parallel).
|
103
94
|
if wftask_meta is not None:
|
104
95
|
needs_gpu = wftask_meta.get("needs_gpu", False)
|
105
96
|
else:
|
106
97
|
needs_gpu = False
|
107
98
|
logger.debug(f"[get_slurm_config] {needs_gpu=}")
|
108
|
-
if needs_gpu
|
99
|
+
if needs_gpu:
|
109
100
|
for key, value in slurm_env.gpu_slurm_config.dict(
|
110
101
|
exclude_unset=True, exclude={"mem"}
|
111
102
|
).items():
|
@@ -143,9 +134,9 @@ def get_slurm_config(
|
|
143
134
|
)
|
144
135
|
logger.error(error_msg)
|
145
136
|
raise SlurmConfigError(error_msg)
|
146
|
-
for key in ["time", "gres", "constraint"]:
|
137
|
+
for key in ["time", "gres", "gpus", "constraint"]:
|
147
138
|
value = wftask_meta.get(key, None)
|
148
|
-
if value:
|
139
|
+
if value is not None:
|
149
140
|
slurm_dict[key] = value
|
150
141
|
if wftask_meta is not None:
|
151
142
|
extra_lines = wftask_meta.get("extra_lines", [])
|
@@ -17,8 +17,10 @@ from pathlib import Path
|
|
17
17
|
from typing import Literal
|
18
18
|
|
19
19
|
from ...task_files import get_task_file_paths
|
20
|
-
from .get_slurm_config import get_slurm_config
|
21
20
|
from fractal_server.app.models.v2 import WorkflowTaskV2
|
21
|
+
from fractal_server.app.runner.v2._slurm_common.get_slurm_config import (
|
22
|
+
get_slurm_config,
|
23
|
+
)
|
22
24
|
|
23
25
|
|
24
26
|
def _slurm_submit_setup(
|
@@ -62,8 +64,6 @@ def _slurm_submit_setup(
|
|
62
64
|
# Get SlurmConfig object
|
63
65
|
slurm_config = get_slurm_config(
|
64
66
|
wftask=wftask,
|
65
|
-
workflow_dir_local=workflow_dir_local,
|
66
|
-
workflow_dir_remote=workflow_dir_remote,
|
67
67
|
which_type=which_type,
|
68
68
|
)
|
69
69
|
|
@@ -17,8 +17,10 @@ from pathlib import Path
|
|
17
17
|
from typing import Literal
|
18
18
|
|
19
19
|
from ...task_files import get_task_file_paths
|
20
|
-
from .get_slurm_config import get_slurm_config
|
21
20
|
from fractal_server.app.models.v2 import WorkflowTaskV2
|
21
|
+
from fractal_server.app.runner.v2._slurm_common.get_slurm_config import (
|
22
|
+
get_slurm_config,
|
23
|
+
)
|
22
24
|
|
23
25
|
|
24
26
|
def _slurm_submit_setup(
|
@@ -62,8 +64,6 @@ def _slurm_submit_setup(
|
|
62
64
|
# Get SlurmConfig object
|
63
65
|
slurm_config = get_slurm_config(
|
64
66
|
wftask=wftask,
|
65
|
-
workflow_dir_local=workflow_dir_local,
|
66
|
-
workflow_dir_remote=workflow_dir_remote,
|
67
67
|
which_type=which_type,
|
68
68
|
)
|
69
69
|
|
@@ -306,6 +306,28 @@ class FractalSSH(object):
|
|
306
306
|
cmd = f"rm -r {folder}"
|
307
307
|
self.run_command(cmd=cmd)
|
308
308
|
|
309
|
+
def write_remote_file(
|
310
|
+
self,
|
311
|
+
*,
|
312
|
+
path: str,
|
313
|
+
content: str,
|
314
|
+
lock_timeout: Optional[float] = None,
|
315
|
+
) -> None:
|
316
|
+
"""
|
317
|
+
Open a remote file via SFTP and write it.
|
318
|
+
|
319
|
+
Args:
|
320
|
+
path: Absolute path
|
321
|
+
contents: File contents
|
322
|
+
lock_timeout:
|
323
|
+
"""
|
324
|
+
actual_lock_timeout = self.default_lock_timeout
|
325
|
+
if lock_timeout is not None:
|
326
|
+
actual_lock_timeout = lock_timeout
|
327
|
+
with self.acquire_timeout(timeout=actual_lock_timeout):
|
328
|
+
with self.sftp().open(filename=path, mode="w") as f:
|
329
|
+
f.write(content)
|
330
|
+
|
309
331
|
|
310
332
|
def get_ssh_connection(
|
311
333
|
*,
|
File without changes
|
@@ -1,6 +1,6 @@
|
|
1
1
|
[tool.poetry]
|
2
2
|
name = "fractal-server"
|
3
|
-
version = "2.3.
|
3
|
+
version = "2.3.6"
|
4
4
|
description = "Server component of the Fractal analytics platform"
|
5
5
|
authors = [
|
6
6
|
"Tommaso Comparin <tommaso.comparin@exact-lab.it>",
|
@@ -27,7 +27,7 @@ exclude = [
|
|
27
27
|
python = "^3.9"
|
28
28
|
python-dotenv = "^1.0.0"
|
29
29
|
fastapi = "^0.110.0"
|
30
|
-
sqlmodel = "^0.0.
|
30
|
+
sqlmodel = "^0.0.21"
|
31
31
|
sqlalchemy = {extras = ["asyncio"], version = ">=2.0.23,<2.1"}
|
32
32
|
aiosqlite = "^0.19.0"
|
33
33
|
fastapi-users = {extras = ["oauth"], version = "^12.1.0"}
|
@@ -91,7 +91,7 @@ filterwarnings = [
|
|
91
91
|
]
|
92
92
|
|
93
93
|
[tool.bumpver]
|
94
|
-
current_version = "2.3.
|
94
|
+
current_version = "2.3.6"
|
95
95
|
version_pattern = "MAJOR.MINOR.PATCH[PYTAGNUM]"
|
96
96
|
commit_message = "bump version {old_version} -> {new_version}"
|
97
97
|
commit = true
|
@@ -1 +0,0 @@
|
|
1
|
-
__VERSION__ = "2.3.4"
|
@@ -1,93 +0,0 @@
|
|
1
|
-
import json
|
2
|
-
import logging
|
3
|
-
from typing import Any
|
4
|
-
from typing import Optional
|
5
|
-
|
6
|
-
from pydantic import HttpUrl
|
7
|
-
from sqlalchemy import Column
|
8
|
-
from sqlalchemy.types import JSON
|
9
|
-
from sqlmodel import Field
|
10
|
-
from sqlmodel import SQLModel
|
11
|
-
|
12
|
-
|
13
|
-
class TaskV2(SQLModel, table=True):
|
14
|
-
|
15
|
-
id: Optional[int] = Field(default=None, primary_key=True)
|
16
|
-
name: str
|
17
|
-
|
18
|
-
type: str
|
19
|
-
command_non_parallel: Optional[str] = None
|
20
|
-
command_parallel: Optional[str] = None
|
21
|
-
source: str = Field(unique=True)
|
22
|
-
|
23
|
-
meta_non_parallel: dict[str, Any] = Field(
|
24
|
-
sa_column=Column(JSON, server_default="{}", default={}, nullable=False)
|
25
|
-
)
|
26
|
-
meta_parallel: dict[str, Any] = Field(
|
27
|
-
sa_column=Column(JSON, server_default="{}", default={}, nullable=False)
|
28
|
-
)
|
29
|
-
|
30
|
-
owner: Optional[str] = None
|
31
|
-
version: Optional[str] = None
|
32
|
-
args_schema_non_parallel: Optional[dict[str, Any]] = Field(
|
33
|
-
sa_column=Column(JSON), default=None
|
34
|
-
)
|
35
|
-
args_schema_parallel: Optional[dict[str, Any]] = Field(
|
36
|
-
sa_column=Column(JSON), default=None
|
37
|
-
)
|
38
|
-
args_schema_version: Optional[str]
|
39
|
-
docs_info: Optional[str] = None
|
40
|
-
docs_link: Optional[HttpUrl] = None
|
41
|
-
|
42
|
-
input_types: dict[str, bool] = Field(sa_column=Column(JSON), default={})
|
43
|
-
output_types: dict[str, bool] = Field(sa_column=Column(JSON), default={})
|
44
|
-
|
45
|
-
@property
|
46
|
-
def default_args_non_parallel_from_args_schema(self) -> dict[str, Any]:
|
47
|
-
"""
|
48
|
-
Extract default arguments from args_schema
|
49
|
-
"""
|
50
|
-
# Return {} if there is no args_schema
|
51
|
-
if self.args_schema_non_parallel is None:
|
52
|
-
return {}
|
53
|
-
# Try to construct default_args
|
54
|
-
try:
|
55
|
-
default_args = {}
|
56
|
-
properties = self.args_schema_non_parallel["properties"]
|
57
|
-
for prop_name, prop_schema in properties.items():
|
58
|
-
default_value = prop_schema.get("default", None)
|
59
|
-
if default_value is not None:
|
60
|
-
default_args[prop_name] = default_value
|
61
|
-
return default_args
|
62
|
-
except KeyError as e:
|
63
|
-
logging.warning(
|
64
|
-
"Cannot set default_args from args_schema_non_parallel="
|
65
|
-
f"{json.dumps(self.args_schema_non_parallel)}\n"
|
66
|
-
f"Original KeyError: {str(e)}"
|
67
|
-
)
|
68
|
-
return {}
|
69
|
-
|
70
|
-
@property
|
71
|
-
def default_args_parallel_from_args_schema(self) -> dict[str, Any]:
|
72
|
-
"""
|
73
|
-
Extract default arguments from args_schema
|
74
|
-
"""
|
75
|
-
# Return {} if there is no args_schema
|
76
|
-
if self.args_schema_parallel is None:
|
77
|
-
return {}
|
78
|
-
# Try to construct default_args
|
79
|
-
try:
|
80
|
-
default_args = {}
|
81
|
-
properties = self.args_schema_parallel["properties"]
|
82
|
-
for prop_name, prop_schema in properties.items():
|
83
|
-
default_value = prop_schema.get("default", None)
|
84
|
-
if default_value is not None:
|
85
|
-
default_args[prop_name] = default_value
|
86
|
-
return default_args
|
87
|
-
except KeyError as e:
|
88
|
-
logging.warning(
|
89
|
-
"Cannot set default_args from args_schema_parallel="
|
90
|
-
f"{json.dumps(self.args_schema_parallel)}\n"
|
91
|
-
f"Original KeyError: {str(e)}"
|
92
|
-
)
|
93
|
-
return {}
|