fractal-server 2.14.0a34__tar.gz → 2.14.0a36__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.14.0a34 → fractal_server-2.14.0a36}/PKG-INFO +1 -1
- fractal_server-2.14.0a36/fractal_server/__init__.py +1 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/executors/base_runner.py +4 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/executors/local/runner.py +2 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/executors/slurm_common/base_slurm_runner.py +56 -28
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/executors/slurm_common/remote.py +14 -11
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/executors/slurm_ssh/runner.py +6 -6
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/executors/slurm_sudo/_subprocess_run_as_user.py +0 -15
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/v2/runner.py +55 -42
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/v2/runner_functions.py +7 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/ssh/_fabric.py +1 -1
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/pyproject.toml +2 -2
- fractal_server-2.14.0a34/fractal_server/__init__.py +0 -1
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/LICENSE +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/README.md +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/__main__.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/alembic.ini +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/__init__.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/db/__init__.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/history/__init__.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/models/__init__.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/models/linkusergroup.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/models/linkuserproject.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/models/security.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/models/user_settings.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/models/v2/__init__.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/models/v2/accounting.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/models/v2/dataset.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/models/v2/history.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/models/v2/job.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/models/v2/project.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/models/v2/task.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/models/v2/task_group.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/models/v2/workflow.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/models/v2/workflowtask.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/__init__.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/admin/__init__.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/admin/v2/__init__.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/admin/v2/accounting.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/admin/v2/impersonate.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/admin/v2/job.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/admin/v2/project.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/admin/v2/task.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/admin/v2/task_group.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/admin/v2/task_group_lifecycle.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/api/__init__.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/api/v2/__init__.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/api/v2/_aux_functions.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/api/v2/_aux_functions_history.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/api/v2/_aux_functions_task_lifecycle.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/api/v2/_aux_functions_tasks.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/api/v2/dataset.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/api/v2/history.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/api/v2/images.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/api/v2/job.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/api/v2/project.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/api/v2/status_legacy.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/api/v2/submit.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/api/v2/task.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/api/v2/task_collection.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/api/v2/task_collection_custom.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/api/v2/task_group.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/api/v2/task_group_lifecycle.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/api/v2/verify_image_types.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/api/v2/workflow.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/api/v2/workflow_import.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/api/v2/workflowtask.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/auth/__init__.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/auth/_aux_auth.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/auth/current_user.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/auth/group.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/auth/login.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/auth/oauth.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/auth/register.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/auth/router.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/auth/users.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/aux/__init__.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/aux/_job.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/aux/_runner.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/aux/validate_user_settings.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/routes/pagination.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/__init__.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/components.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/compress_folder.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/exceptions.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/executors/__init__.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/executors/local/__init__.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/executors/local/get_local_config.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/executors/slurm_common/__init__.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/executors/slurm_common/_batching.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/executors/slurm_common/_job_states.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/executors/slurm_common/_slurm_config.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/executors/slurm_common/get_slurm_config.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/executors/slurm_common/slurm_job_task_models.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/executors/slurm_common/utils_executors.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/executors/slurm_ssh/__init__.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/executors/slurm_sudo/__init__.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/executors/slurm_sudo/runner.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/extract_archive.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/filenames.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/run_subprocess.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/set_start_and_last_task_index.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/shutdown.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/task_files.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/v2/__init__.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/v2/_local.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/v2/_slurm_ssh.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/v2/_slurm_sudo.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/v2/db_tools.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/v2/deduplicate_list.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/v2/merge_outputs.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/v2/runner_functions_low_level.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/v2/submit_workflow.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/v2/task_interface.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/versions.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/schemas/__init__.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/schemas/_filter_validators.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/schemas/_validators.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/schemas/user.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/schemas/user_group.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/schemas/user_settings.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/schemas/v2/__init__.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/schemas/v2/accounting.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/schemas/v2/dataset.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/schemas/v2/dumps.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/schemas/v2/history.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/schemas/v2/job.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/schemas/v2/manifest.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/schemas/v2/project.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/schemas/v2/status_legacy.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/schemas/v2/task.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/schemas/v2/task_collection.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/schemas/v2/task_group.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/schemas/v2/workflow.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/schemas/v2/workflowtask.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/security/__init__.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/security/signup_email.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/user_settings.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/config.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/data_migrations/README.md +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/data_migrations/tools.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/gunicorn_fractal.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/images/__init__.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/images/models.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/images/tools.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/logger.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/main.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/migrations/env.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/migrations/naming_convention.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/migrations/versions/034a469ec2eb_task_groups.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/migrations/versions/091b01f51f88_add_usergroup_and_linkusergroup_table.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/migrations/versions/19eca0dd47a9_user_settings_project_dir.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/migrations/versions/1eac13a26c83_drop_v1_tables.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/migrations/versions/316140ff7ee1_remove_usersettings_cache_dir.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/migrations/versions/47351f8c7ebc_drop_dataset_filters.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/migrations/versions/4c308bcaea2b_add_task_args_schema_and_task_args_.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/migrations/versions/4cedeb448a53_workflowtask_foreign_keys_not_nullables.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/migrations/versions/501961cfcd85_remove_link_between_v1_and_v2_tasks_.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/migrations/versions/50a13d6138fd_initial_schema.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/migrations/versions/5bf02391cfef_v2.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/migrations/versions/70e77f1c38b0_add_applyworkflow_first_task_index_and_.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/migrations/versions/71eefd1dd202_add_slurm_accounts.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/migrations/versions/84bf0fffde30_add_dumps_to_applyworkflow.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/migrations/versions/8e8f227a3e36_update_taskv2_post_2_7_0.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/migrations/versions/8f79bd162e35_add_docs_info_and_docs_link_to_task_.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/migrations/versions/94a47ea2d3ff_remove_cache_dir_slurm_user_and_slurm_.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/migrations/versions/97f444d47249_add_applyworkflow_project_dump.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/migrations/versions/99ea79d9e5d2_add_dataset_history.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/migrations/versions/9c5ae74c9b98_add_user_settings_table.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/migrations/versions/9db60297b8b2_set_ondelete.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/migrations/versions/9fd26a2b0de4_add_workflow_timestamp_created.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/migrations/versions/a7f4d6137b53_add_workflow_dump_to_applyworkflow.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/migrations/versions/af1ef1c83c9b_add_accounting_tables.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/migrations/versions/af8673379a5c_drop_old_filter_columns.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/migrations/versions/c90a7c76e996_job_id_in_history_run.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/migrations/versions/d256a7379ab8_taskgroup_activity_and_venv_info_to_.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/migrations/versions/d4fe3708d309_make_applyworkflow_workflow_dump_non_.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/migrations/versions/da2cb2ac4255_user_group_viewer_paths.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/migrations/versions/db09233ad13a_split_filters_and_keep_old_columns.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/migrations/versions/e75cac726012_make_applyworkflow_start_timestamp_not_.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/migrations/versions/e81103413827_add_job_type_filters.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/migrations/versions/efa89c30e0a4_add_project_timestamp_created.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/migrations/versions/f37aceb45062_make_historyunit_logfile_required.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/migrations/versions/f384e1c0cf5d_drop_task_default_args_columns.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/migrations/versions/fbce16ff4e47_new_history_items.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/py.typed +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/ssh/__init__.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/string_tools.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/syringe.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/tasks/__init__.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/tasks/utils.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/tasks/v2/__init__.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/tasks/v2/local/__init__.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/tasks/v2/local/_utils.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/tasks/v2/local/collect.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/tasks/v2/local/deactivate.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/tasks/v2/local/reactivate.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/tasks/v2/ssh/__init__.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/tasks/v2/ssh/_utils.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/tasks/v2/ssh/collect.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/tasks/v2/ssh/deactivate.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/tasks/v2/ssh/reactivate.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/tasks/v2/templates/1_create_venv.sh +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/tasks/v2/templates/2_pip_install.sh +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/tasks/v2/templates/3_pip_freeze.sh +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/tasks/v2/templates/4_pip_show.sh +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/tasks/v2/templates/5_get_venv_size_and_file_number.sh +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/tasks/v2/templates/6_pip_install_from_freeze.sh +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/tasks/v2/utils_background.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/tasks/v2/utils_database.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/tasks/v2/utils_package_names.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/tasks/v2/utils_python_interpreter.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/tasks/v2/utils_templates.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/urls.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/utils.py +0 -0
- {fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/zip_tools.py +0 -0
@@ -0,0 +1 @@
|
|
1
|
+
__VERSION__ = "2.14.0a36"
|
@@ -32,6 +32,7 @@ class BaseRunner(object):
|
|
32
32
|
task_type: TaskTypeType,
|
33
33
|
task_files: TaskFiles,
|
34
34
|
config: Any,
|
35
|
+
user_id: int,
|
35
36
|
) -> tuple[Any, BaseException]:
|
36
37
|
"""
|
37
38
|
Run a single fractal task.
|
@@ -44,6 +45,7 @@ class BaseRunner(object):
|
|
44
45
|
task_type: Task type.
|
45
46
|
task_files: `TaskFiles` object.
|
46
47
|
config: Runner-specific parameters.
|
48
|
+
user_id:
|
47
49
|
"""
|
48
50
|
raise NotImplementedError()
|
49
51
|
|
@@ -55,6 +57,7 @@ class BaseRunner(object):
|
|
55
57
|
list_task_files: list[TaskFiles],
|
56
58
|
task_type: TaskTypeType,
|
57
59
|
config: Any,
|
60
|
+
user_id: int,
|
58
61
|
) -> tuple[dict[int, Any], dict[int, BaseException]]:
|
59
62
|
"""
|
60
63
|
Run a parallel fractal task.
|
@@ -68,6 +71,7 @@ class BaseRunner(object):
|
|
68
71
|
task_type: Task type.
|
69
72
|
task_files: `TaskFiles` object.
|
70
73
|
config: Runner-specific parameters.
|
74
|
+
user_id
|
71
75
|
"""
|
72
76
|
raise NotImplementedError()
|
73
77
|
|
@@ -58,6 +58,7 @@ class LocalRunner(BaseRunner):
|
|
58
58
|
"converter_compound",
|
59
59
|
],
|
60
60
|
config: LocalBackendConfig,
|
61
|
+
user_id: int,
|
61
62
|
) -> tuple[Any, Exception]:
|
62
63
|
logger.debug("[submit] START")
|
63
64
|
|
@@ -116,6 +117,7 @@ class LocalRunner(BaseRunner):
|
|
116
117
|
list_task_files: list[TaskFiles],
|
117
118
|
task_type: Literal["parallel", "compound", "converter_compound"],
|
118
119
|
config: LocalBackendConfig,
|
120
|
+
user_id: int,
|
119
121
|
) -> tuple[dict[int, Any], dict[int, BaseException]]:
|
120
122
|
"""
|
121
123
|
Note: `list_parameters`, `list_task_files` and `history_unit_ids`
|
@@ -15,6 +15,7 @@ from ..slurm_common.slurm_job_task_models import SlurmTask
|
|
15
15
|
from ._job_states import STATES_FINISHED
|
16
16
|
from fractal_server import __VERSION__
|
17
17
|
from fractal_server.app.db import get_sync_db
|
18
|
+
from fractal_server.app.models.v2 import AccountingRecordSlurm
|
18
19
|
from fractal_server.app.runner.exceptions import JobExecutionError
|
19
20
|
from fractal_server.app.runner.exceptions import TaskExecutionError
|
20
21
|
from fractal_server.app.runner.executors.base_runner import BaseRunner
|
@@ -34,7 +35,20 @@ SHUTDOWN_EXCEPTION = JobExecutionError(SHUTDOWN_ERROR_MESSAGE)
|
|
34
35
|
|
35
36
|
logger = set_logger(__name__)
|
36
37
|
|
37
|
-
|
38
|
+
|
39
|
+
def create_accounting_record_slurm(
|
40
|
+
*,
|
41
|
+
user_id: int,
|
42
|
+
slurm_job_ids: list[int],
|
43
|
+
) -> None:
|
44
|
+
with next(get_sync_db()) as db:
|
45
|
+
db.add(
|
46
|
+
AccountingRecordSlurm(
|
47
|
+
user_id=user_id,
|
48
|
+
slurm_job_ids=slurm_job_ids,
|
49
|
+
)
|
50
|
+
)
|
51
|
+
db.commit()
|
38
52
|
|
39
53
|
|
40
54
|
class BaseSlurmRunner(BaseRunner):
|
@@ -158,7 +172,7 @@ class BaseSlurmRunner(BaseRunner):
|
|
158
172
|
slurm_job: SlurmJob,
|
159
173
|
slurm_config: SlurmConfig,
|
160
174
|
) -> str:
|
161
|
-
logger.
|
175
|
+
logger.debug("[_submit_single_sbatch] START")
|
162
176
|
# Prepare input pickle(s)
|
163
177
|
versions = dict(
|
164
178
|
python=sys.version_info[:3],
|
@@ -175,7 +189,7 @@ class BaseSlurmRunner(BaseRunner):
|
|
175
189
|
funcser = cloudpickle.dumps((versions, func, _args, _kwargs))
|
176
190
|
with open(task.input_pickle_file_local, "wb") as f:
|
177
191
|
f.write(funcser)
|
178
|
-
logger.
|
192
|
+
logger.debug(
|
179
193
|
"[_submit_single_sbatch] Written "
|
180
194
|
f"{task.input_pickle_file_local=}"
|
181
195
|
)
|
@@ -186,7 +200,7 @@ class BaseSlurmRunner(BaseRunner):
|
|
186
200
|
local=task.input_pickle_file_local,
|
187
201
|
remote=task.input_pickle_file_remote,
|
188
202
|
)
|
189
|
-
logger.
|
203
|
+
logger.debug(
|
190
204
|
"[_submit_single_sbatch] Transferred "
|
191
205
|
f"{task.input_pickle_file_local=}"
|
192
206
|
)
|
@@ -229,7 +243,7 @@ class BaseSlurmRunner(BaseRunner):
|
|
229
243
|
]
|
230
244
|
)
|
231
245
|
script_lines = slurm_config.sort_script_lines(script_lines)
|
232
|
-
logger.
|
246
|
+
logger.debug(script_lines)
|
233
247
|
|
234
248
|
# Always print output of `uname -n` and `pwd`
|
235
249
|
script_lines.append('\necho "Hostname: $(uname -n)"')
|
@@ -258,7 +272,7 @@ class BaseSlurmRunner(BaseRunner):
|
|
258
272
|
# Write submission script
|
259
273
|
with open(slurm_job.slurm_submission_script_local, "w") as f:
|
260
274
|
f.write(script)
|
261
|
-
logger.
|
275
|
+
logger.debug(
|
262
276
|
"[_submit_single_sbatch] Written "
|
263
277
|
f"{slurm_job.slurm_submission_script_local=}"
|
264
278
|
)
|
@@ -280,10 +294,10 @@ class BaseSlurmRunner(BaseRunner):
|
|
280
294
|
# Run sbatch
|
281
295
|
pre_submission_cmds = slurm_config.pre_submission_commands
|
282
296
|
if len(pre_submission_cmds) == 0:
|
283
|
-
logger.
|
297
|
+
logger.debug(f"Now run {submit_command=}")
|
284
298
|
sbatch_stdout = self._run_remote_cmd(submit_command)
|
285
299
|
else:
|
286
|
-
logger.
|
300
|
+
logger.debug(f"Now using {pre_submission_cmds=}")
|
287
301
|
script_lines = pre_submission_cmds + [submit_command]
|
288
302
|
wrapper_script_contents = "\n".join(script_lines)
|
289
303
|
wrapper_script_contents = f"{wrapper_script_contents}\n"
|
@@ -300,22 +314,22 @@ class BaseSlurmRunner(BaseRunner):
|
|
300
314
|
)
|
301
315
|
with open(wrapper_script, "w") as f:
|
302
316
|
f.write(wrapper_script_contents)
|
303
|
-
logger.
|
317
|
+
logger.debug(f"Now run {wrapper_script=}")
|
304
318
|
sbatch_stdout = self._run_remote_cmd(f"bash {wrapper_script}")
|
305
319
|
|
306
320
|
# Submit SLURM job and retrieve job ID
|
307
|
-
logger.info(f"[
|
321
|
+
logger.info(f"[_submit_single_sbatch] {sbatch_stdout=}")
|
308
322
|
stdout = sbatch_stdout.strip("\n")
|
309
323
|
submitted_job_id = int(stdout)
|
310
324
|
slurm_job.slurm_job_id = str(submitted_job_id)
|
311
325
|
|
312
326
|
# Add job to self.jobs
|
313
327
|
self.jobs[slurm_job.slurm_job_id] = slurm_job
|
314
|
-
logger.
|
328
|
+
logger.debug(
|
315
329
|
"[_submit_single_sbatch] Added "
|
316
330
|
f"{slurm_job.slurm_job_id} to self.jobs."
|
317
331
|
)
|
318
|
-
logger.
|
332
|
+
logger.debug("[_submit_single_sbatch] END")
|
319
333
|
|
320
334
|
def _fetch_artifacts(
|
321
335
|
self,
|
@@ -448,8 +462,9 @@ class BaseSlurmRunner(BaseRunner):
|
|
448
462
|
"compound",
|
449
463
|
"converter_compound",
|
450
464
|
],
|
465
|
+
user_id: int,
|
451
466
|
) -> tuple[Any, Exception]:
|
452
|
-
logger.
|
467
|
+
logger.debug("[submit] START")
|
453
468
|
try:
|
454
469
|
workdir_local = task_files.wftask_subfolder_local
|
455
470
|
workdir_remote = task_files.wftask_subfolder_remote
|
@@ -473,10 +488,10 @@ class BaseSlurmRunner(BaseRunner):
|
|
473
488
|
)
|
474
489
|
|
475
490
|
# Create task subfolder
|
476
|
-
logger.
|
491
|
+
logger.debug("[submit] Create local/remote folders - START")
|
477
492
|
self._mkdir_local_folder(folder=workdir_local.as_posix())
|
478
493
|
self._mkdir_remote_folder(folder=workdir_remote.as_posix())
|
479
|
-
logger.
|
494
|
+
logger.debug("[submit] Create local/remote folders - END")
|
480
495
|
|
481
496
|
# Submission phase
|
482
497
|
slurm_job = SlurmJob(
|
@@ -502,7 +517,12 @@ class BaseSlurmRunner(BaseRunner):
|
|
502
517
|
slurm_job=slurm_job,
|
503
518
|
slurm_config=config,
|
504
519
|
)
|
505
|
-
logger.
|
520
|
+
logger.debug(f"[submit] END submission phase, {self.job_ids=}")
|
521
|
+
|
522
|
+
create_accounting_record_slurm(
|
523
|
+
user_id=user_id,
|
524
|
+
slurm_job_ids=self.job_ids,
|
525
|
+
)
|
506
526
|
|
507
527
|
# NOTE: see issue 2444
|
508
528
|
settings = Inject(get_settings)
|
@@ -511,7 +531,7 @@ class BaseSlurmRunner(BaseRunner):
|
|
511
531
|
time.sleep(sleep_time)
|
512
532
|
|
513
533
|
# Retrieval phase
|
514
|
-
logger.
|
534
|
+
logger.debug("[submit] START retrieval phase")
|
515
535
|
scancelled_job_ids = []
|
516
536
|
while len(self.jobs) > 0:
|
517
537
|
# Look for finished jobs
|
@@ -554,7 +574,7 @@ class BaseSlurmRunner(BaseRunner):
|
|
554
574
|
if len(self.jobs) > 0:
|
555
575
|
scancelled_job_ids = self.wait_and_check_shutdown()
|
556
576
|
|
557
|
-
logger.
|
577
|
+
logger.debug("[submit] END")
|
558
578
|
return result, exception
|
559
579
|
|
560
580
|
except Exception as e:
|
@@ -578,6 +598,7 @@ class BaseSlurmRunner(BaseRunner):
|
|
578
598
|
list_task_files: list[TaskFiles],
|
579
599
|
task_type: Literal["parallel", "compound", "converter_compound"],
|
580
600
|
config: SlurmConfig,
|
601
|
+
user_id: int,
|
581
602
|
) -> tuple[dict[int, Any], dict[int, BaseException]]:
|
582
603
|
"""
|
583
604
|
Note: `list_parameters`, `list_task_files` and `history_unit_ids`
|
@@ -585,7 +606,7 @@ class BaseSlurmRunner(BaseRunner):
|
|
585
606
|
input images, while for compound tasks these can differ.
|
586
607
|
"""
|
587
608
|
|
588
|
-
logger.
|
609
|
+
logger.debug(f"[multisubmit] START, {len(list_parameters)=}")
|
589
610
|
try:
|
590
611
|
|
591
612
|
if self.is_shutdown():
|
@@ -639,7 +660,7 @@ class BaseSlurmRunner(BaseRunner):
|
|
639
660
|
raise RuntimeError("Something wrong here while batching tasks")
|
640
661
|
|
641
662
|
# Part 1/3: Iterate over chunks, prepare SlurmJob objects
|
642
|
-
logger.
|
663
|
+
logger.debug("[multisubmit] Prepare `SlurmJob`s.")
|
643
664
|
jobs_to_submit = []
|
644
665
|
for ind_batch, chunk in enumerate(args_batches):
|
645
666
|
# Read prefix based on the first task of this batch
|
@@ -669,7 +690,7 @@ class BaseSlurmRunner(BaseRunner):
|
|
669
690
|
)
|
670
691
|
|
671
692
|
# NOTE: see issue 2431
|
672
|
-
logger.
|
693
|
+
logger.debug("[multisubmit] Transfer files and submit jobs.")
|
673
694
|
for slurm_job in jobs_to_submit:
|
674
695
|
self._submit_single_sbatch(
|
675
696
|
func,
|
@@ -677,11 +698,16 @@ class BaseSlurmRunner(BaseRunner):
|
|
677
698
|
slurm_config=config,
|
678
699
|
)
|
679
700
|
|
680
|
-
logger.info(f"END submission phase, {self.job_ids=}")
|
701
|
+
logger.info(f"[multisubmit] END submission phase, {self.job_ids=}")
|
702
|
+
|
703
|
+
create_accounting_record_slurm(
|
704
|
+
user_id=user_id,
|
705
|
+
slurm_job_ids=self.job_ids,
|
706
|
+
)
|
681
707
|
|
682
708
|
settings = Inject(get_settings)
|
683
709
|
sleep_time = settings.FRACTAL_SLURM_INTERVAL_BEFORE_RETRIEVAL
|
684
|
-
logger.warning(f"[
|
710
|
+
logger.warning(f"[multisubmit] Now sleep {sleep_time} seconds.")
|
685
711
|
time.sleep(sleep_time)
|
686
712
|
except Exception as e:
|
687
713
|
logger.error(
|
@@ -701,7 +727,7 @@ class BaseSlurmRunner(BaseRunner):
|
|
701
727
|
return results, exceptions
|
702
728
|
|
703
729
|
# Retrieval phase
|
704
|
-
logger.
|
730
|
+
logger.debug("[multisubmit] START retrieval phase")
|
705
731
|
scancelled_job_ids = []
|
706
732
|
while len(self.jobs) > 0:
|
707
733
|
# Look for finished jobs
|
@@ -723,10 +749,12 @@ class BaseSlurmRunner(BaseRunner):
|
|
723
749
|
|
724
750
|
with next(get_sync_db()) as db:
|
725
751
|
for slurm_job_id in finished_job_ids:
|
726
|
-
logger.
|
752
|
+
logger.debug(f"[multisubmit] Now process {slurm_job_id=}")
|
727
753
|
slurm_job = self.jobs.pop(slurm_job_id)
|
728
754
|
for task in slurm_job.tasks:
|
729
|
-
logger.
|
755
|
+
logger.debug(
|
756
|
+
f"[multisubmit] Now process {task.index=}"
|
757
|
+
)
|
730
758
|
was_job_scancelled = slurm_job_id in scancelled_job_ids
|
731
759
|
if fetch_artifacts_exception is not None:
|
732
760
|
result = None
|
@@ -775,7 +803,7 @@ class BaseSlurmRunner(BaseRunner):
|
|
775
803
|
if len(self.jobs) > 0:
|
776
804
|
scancelled_job_ids = self.wait_and_check_shutdown()
|
777
805
|
|
778
|
-
logger.
|
806
|
+
logger.debug("[multisubmit] END")
|
779
807
|
return results, exceptions
|
780
808
|
|
781
809
|
def check_fractal_server_versions(self) -> None:
|
@@ -814,7 +842,7 @@ class BaseSlurmRunner(BaseRunner):
|
|
814
842
|
if self.jobs:
|
815
843
|
scancel_string = " ".join(scancelled_job_ids)
|
816
844
|
scancel_cmd = f"scancel {scancel_string}"
|
817
|
-
logger.warning(f"
|
845
|
+
logger.warning(f"[scancel_jobs] {scancel_string}")
|
818
846
|
try:
|
819
847
|
self._run_remote_cmd(scancel_cmd)
|
820
848
|
except Exception as e:
|
@@ -54,18 +54,21 @@ def _check_versions_mismatch(
|
|
54
54
|
do not match with the ones on the server
|
55
55
|
"""
|
56
56
|
|
57
|
-
server_python_version = server_versions["python"]
|
58
|
-
worker_python_version = sys.version_info[:3]
|
57
|
+
server_python_version = list(server_versions["python"])
|
58
|
+
worker_python_version = list(sys.version_info[:3])
|
59
59
|
if worker_python_version != server_python_version:
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
60
|
+
if worker_python_version[:2] != server_python_version[:2]:
|
61
|
+
# FIXME: Turn this into an error, in some version post 2.14.
|
62
|
+
logging.error(
|
63
|
+
f"{server_python_version=} but {worker_python_version=}. "
|
64
|
+
"This configuration will be deprecated in a future version, "
|
65
|
+
"please contact the admin of this Fractal instance."
|
66
|
+
)
|
67
|
+
else:
|
68
|
+
# Major.minor versions match, patch versions differ
|
69
|
+
logging.warning(
|
70
|
+
f"{server_python_version=} but {worker_python_version=}."
|
71
|
+
)
|
69
72
|
|
70
73
|
server_cloudpickle_version = server_versions["cloudpickle"]
|
71
74
|
worker_cloudpickle_version = cloudpickle.__version__
|
@@ -113,7 +113,7 @@ class SlurmSSHRunner(BaseSlurmRunner):
|
|
113
113
|
elapsed = time.perf_counter() - t_0
|
114
114
|
logger.debug(
|
115
115
|
"[_fetch_artifacts] Created filelist "
|
116
|
-
f"({len(filelist)=}, from start: {elapsed
|
116
|
+
f"({len(filelist)=}, from start: {elapsed=:.3f} s)."
|
117
117
|
)
|
118
118
|
|
119
119
|
# Write filelist to file remotely
|
@@ -125,7 +125,7 @@ class SlurmSSHRunner(BaseSlurmRunner):
|
|
125
125
|
elapsed = time.perf_counter() - t_0
|
126
126
|
logger.debug(
|
127
127
|
f"[_fetch_artifacts] File list written to {tmp_filelist_path} "
|
128
|
-
f"(from start: {elapsed
|
128
|
+
f"(from start: {elapsed=:.3f} s)."
|
129
129
|
)
|
130
130
|
|
131
131
|
# Create remote tarfile
|
@@ -140,7 +140,7 @@ class SlurmSSHRunner(BaseSlurmRunner):
|
|
140
140
|
t_1_tar = time.perf_counter()
|
141
141
|
logger.info(
|
142
142
|
f"[_fetch_artifacts] Remote archive {tarfile_path_remote} created"
|
143
|
-
f" - elapsed
|
143
|
+
f" - elapsed={t_1_tar - t_0_tar:.3f} s"
|
144
144
|
)
|
145
145
|
|
146
146
|
# Fetch tarfile
|
@@ -153,7 +153,7 @@ class SlurmSSHRunner(BaseSlurmRunner):
|
|
153
153
|
logger.info(
|
154
154
|
"[_fetch_artifacts] Subfolder archive transferred back "
|
155
155
|
f"to {tarfile_path_local}"
|
156
|
-
f" - elapsed
|
156
|
+
f" - elapsed={t_1_get - t_0_get:.3f} s"
|
157
157
|
)
|
158
158
|
|
159
159
|
# Extract tarfile locally
|
@@ -163,7 +163,7 @@ class SlurmSSHRunner(BaseSlurmRunner):
|
|
163
163
|
Path(tarfile_path_local).unlink(missing_ok=True)
|
164
164
|
|
165
165
|
t_1 = time.perf_counter()
|
166
|
-
logger.info(f"[_fetch_artifacts] End - elapsed
|
166
|
+
logger.info(f"[_fetch_artifacts] End - elapsed={t_1 - t_0:.3f} s")
|
167
167
|
|
168
168
|
def _send_inputs(self, jobs: list[SlurmJob]) -> None:
|
169
169
|
"""
|
@@ -190,7 +190,7 @@ class SlurmSSHRunner(BaseSlurmRunner):
|
|
190
190
|
t_1_put = time.perf_counter()
|
191
191
|
logger.info(
|
192
192
|
f"Subfolder archive transferred to {tarfile_path_remote}"
|
193
|
-
f" - elapsed
|
193
|
+
f" - elapsed={t_1_put - t_0_put:.3f} s"
|
194
194
|
)
|
195
195
|
|
196
196
|
# Remove local archive
|
@@ -88,18 +88,3 @@ def _mkdir_as_user(*, folder: str, user: str) -> None:
|
|
88
88
|
|
89
89
|
cmd = f"mkdir -p {folder}"
|
90
90
|
_run_command_as_user(cmd=cmd, user=user, check=True)
|
91
|
-
|
92
|
-
|
93
|
-
def _path_exists_as_user(*, path: str, user: Optional[str] = None) -> bool:
|
94
|
-
"""
|
95
|
-
Impersonate a user and check if `path` exists via `ls`
|
96
|
-
|
97
|
-
Arguments:
|
98
|
-
path: Absolute file/folder path
|
99
|
-
user: If not `None`, user to be impersonated
|
100
|
-
"""
|
101
|
-
res = _run_command_as_user(cmd=f"ls {path}", user=user)
|
102
|
-
if res.returncode == 0:
|
103
|
-
return True
|
104
|
-
else:
|
105
|
-
return False
|
{fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/runner/v2/runner.py
RENAMED
@@ -18,6 +18,7 @@ from .merge_outputs import merge_outputs
|
|
18
18
|
from .runner_functions import run_v2_task_compound
|
19
19
|
from .runner_functions import run_v2_task_non_parallel
|
20
20
|
from .runner_functions import run_v2_task_parallel
|
21
|
+
from .runner_functions import SubmissionOutcome
|
21
22
|
from .task_interface import TaskOutput
|
22
23
|
from fractal_server.app.db import get_sync_db
|
23
24
|
from fractal_server.app.models.v2 import AccountingRecord
|
@@ -132,48 +133,60 @@ def execute_tasks_v2(
|
|
132
133
|
history_run_id = history_run.id
|
133
134
|
|
134
135
|
# TASK EXECUTION (V2)
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
136
|
+
try:
|
137
|
+
if task.type in ["non_parallel", "converter_non_parallel"]:
|
138
|
+
outcomes_dict, num_tasks = run_v2_task_non_parallel(
|
139
|
+
images=filtered_images,
|
140
|
+
zarr_dir=zarr_dir,
|
141
|
+
wftask=wftask,
|
142
|
+
task=task,
|
143
|
+
workflow_dir_local=workflow_dir_local,
|
144
|
+
workflow_dir_remote=workflow_dir_remote,
|
145
|
+
runner=runner,
|
146
|
+
get_runner_config=get_runner_config,
|
147
|
+
history_run_id=history_run_id,
|
148
|
+
dataset_id=dataset.id,
|
149
|
+
user_id=user_id,
|
150
|
+
task_type=task.type,
|
151
|
+
)
|
152
|
+
elif task.type == "parallel":
|
153
|
+
outcomes_dict, num_tasks = run_v2_task_parallel(
|
154
|
+
images=filtered_images,
|
155
|
+
wftask=wftask,
|
156
|
+
task=task,
|
157
|
+
workflow_dir_local=workflow_dir_local,
|
158
|
+
workflow_dir_remote=workflow_dir_remote,
|
159
|
+
runner=runner,
|
160
|
+
get_runner_config=get_runner_config,
|
161
|
+
history_run_id=history_run_id,
|
162
|
+
dataset_id=dataset.id,
|
163
|
+
user_id=user_id,
|
164
|
+
)
|
165
|
+
elif task.type in ["compound", "converter_compound"]:
|
166
|
+
outcomes_dict, num_tasks = run_v2_task_compound(
|
167
|
+
images=filtered_images,
|
168
|
+
zarr_dir=zarr_dir,
|
169
|
+
wftask=wftask,
|
170
|
+
task=task,
|
171
|
+
workflow_dir_local=workflow_dir_local,
|
172
|
+
workflow_dir_remote=workflow_dir_remote,
|
173
|
+
runner=runner,
|
174
|
+
get_runner_config=get_runner_config,
|
175
|
+
history_run_id=history_run_id,
|
176
|
+
dataset_id=dataset.id,
|
177
|
+
task_type=task.type,
|
178
|
+
user_id=user_id,
|
179
|
+
)
|
180
|
+
else:
|
181
|
+
raise ValueError(f"Unexpected error: Invalid {task.type=}.")
|
182
|
+
except Exception as e:
|
183
|
+
outcomes_dict = {
|
184
|
+
0: SubmissionOutcome(
|
185
|
+
result=None,
|
186
|
+
exception=e,
|
187
|
+
)
|
188
|
+
}
|
189
|
+
num_tasks = 0
|
177
190
|
|
178
191
|
# POST TASK EXECUTION
|
179
192
|
|
@@ -139,6 +139,7 @@ def run_v2_task_non_parallel(
|
|
139
139
|
dataset_id: int,
|
140
140
|
history_run_id: int,
|
141
141
|
task_type: Literal["non_parallel", "converter_non_parallel"],
|
142
|
+
user_id: int,
|
142
143
|
) -> tuple[dict[int, SubmissionOutcome], int]:
|
143
144
|
"""
|
144
145
|
This runs server-side (see `executor` argument)
|
@@ -218,6 +219,7 @@ def run_v2_task_non_parallel(
|
|
218
219
|
task_files=task_files,
|
219
220
|
history_unit_id=history_unit_id,
|
220
221
|
config=runner_config,
|
222
|
+
user_id=user_id,
|
221
223
|
)
|
222
224
|
|
223
225
|
positional_index = 0
|
@@ -261,6 +263,7 @@ def run_v2_task_parallel(
|
|
261
263
|
],
|
262
264
|
dataset_id: int,
|
263
265
|
history_run_id: int,
|
266
|
+
user_id: int,
|
264
267
|
) -> tuple[dict[int, SubmissionOutcome], int]:
|
265
268
|
if len(images) == 0:
|
266
269
|
return {}, 0
|
@@ -344,6 +347,7 @@ def run_v2_task_parallel(
|
|
344
347
|
list_task_files=list_task_files,
|
345
348
|
history_unit_ids=history_unit_ids,
|
346
349
|
config=runner_config,
|
350
|
+
user_id=user_id,
|
347
351
|
)
|
348
352
|
|
349
353
|
outcome = {}
|
@@ -394,6 +398,7 @@ def run_v2_task_compound(
|
|
394
398
|
dataset_id: int,
|
395
399
|
history_run_id: int,
|
396
400
|
task_type: Literal["compound", "converter_compound"],
|
401
|
+
user_id: int,
|
397
402
|
) -> tuple[dict[int, SubmissionOutcome], int]:
|
398
403
|
# Get TaskFiles object
|
399
404
|
task_files_init = TaskFiles(
|
@@ -463,6 +468,7 @@ def run_v2_task_compound(
|
|
463
468
|
task_files=task_files_init,
|
464
469
|
history_unit_id=init_history_unit_id,
|
465
470
|
config=runner_config_init,
|
471
|
+
user_id=user_id,
|
466
472
|
)
|
467
473
|
|
468
474
|
init_outcome = _process_init_task_output(
|
@@ -565,6 +571,7 @@ def run_v2_task_compound(
|
|
565
571
|
list_task_files=list_task_files,
|
566
572
|
history_unit_ids=history_unit_ids,
|
567
573
|
config=runner_config_compute,
|
574
|
+
user_id=user_id,
|
568
575
|
)
|
569
576
|
|
570
577
|
compute_outcomes: dict[int, SubmissionOutcome] = {}
|
@@ -322,7 +322,7 @@ class FractalSSH(object):
|
|
322
322
|
t_1 = time.perf_counter()
|
323
323
|
self.logger.info(
|
324
324
|
f"{prefix} END running '{cmd}' over SSH, "
|
325
|
-
f"elapsed
|
325
|
+
f"elapsed={t_1 - t_0:.3f}"
|
326
326
|
)
|
327
327
|
self.logger.debug("STDOUT:")
|
328
328
|
self.logger.debug(res.stdout)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
[project]
|
2
2
|
name = "fractal-server"
|
3
|
-
version = "2.14.
|
3
|
+
version = "2.14.0a36"
|
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
|
markers = ["container", "ssh"]
|
96
96
|
|
97
97
|
[tool.bumpver]
|
98
|
-
current_version = "2.14.
|
98
|
+
current_version = "2.14.0a36"
|
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.14.0a34"
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/history/__init__.py
RENAMED
File without changes
|
File without changes
|
{fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/models/linkusergroup.py
RENAMED
File without changes
|
{fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/models/linkuserproject.py
RENAMED
File without changes
|
File without changes
|
{fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/models/user_settings.py
RENAMED
File without changes
|
{fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/models/v2/__init__.py
RENAMED
File without changes
|
{fractal_server-2.14.0a34 → fractal_server-2.14.0a36}/fractal_server/app/models/v2/accounting.py
RENAMED
File without changes
|