hpc-beeflow 0.1.9.dev3__tar.gz → 0.1.10.dev0__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.
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/PKG-INFO +7 -3
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/client/bee_client.py +127 -18
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/client/core.py +112 -77
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/config_driver.py +121 -48
- hpc_beeflow-0.1.10.dev0/beeflow/common/config_utils.py +42 -0
- hpc_beeflow-0.1.10.dev0/beeflow/common/db/client_db.py +57 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/db/wfm_db.py +31 -53
- hpc_beeflow-0.1.10.dev0/beeflow/common/deps/container_manager.py +88 -0
- hpc_beeflow-0.1.10.dev0/beeflow/common/deps/neo4j_manager.py +204 -0
- hpc_beeflow-0.1.10.dev0/beeflow/common/deps/redis_manager.py +37 -0
- hpc_beeflow-0.1.10.dev0/beeflow/common/gdb/DESIGN.md +74 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/gdb/gdb_driver.py +5 -12
- hpc_beeflow-0.1.10.dev0/beeflow/common/gdb/generate_graph.py +114 -0
- hpc_beeflow-0.1.10.dev0/beeflow/common/gdb/graphml_key_updater.py +71 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/gdb/neo4j_cypher.py +144 -89
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/gdb/neo4j_driver.py +100 -62
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/integration_test.py +2 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/parser/parser.py +7 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/paths.py +16 -5
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/wf_interface.py +51 -93
- hpc_beeflow-0.1.10.dev0/beeflow/data/dockerfiles/Dockerfile.neo4j +2 -0
- hpc_beeflow-0.1.10.dev0/beeflow/remote/remote.py +161 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/tests/mocks.py +30 -37
- hpc_beeflow-0.1.10.dev0/beeflow/tests/test_config_driver.py +105 -0
- hpc_beeflow-0.1.10.dev0/beeflow/tests/test_config_utils.py +114 -0
- hpc_beeflow-0.1.10.dev0/beeflow/tests/test_db_client.py +37 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/tests/test_parser.py +1 -1
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/tests/test_wf_interface.py +41 -96
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/tests/test_wf_manager.py +8 -26
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/wf_manager/resources/wf_actions.py +4 -6
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/wf_manager/resources/wf_list.py +19 -77
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/wf_manager/resources/wf_update.py +6 -8
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/wf_manager/resources/wf_utils.py +64 -57
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/wf_manager/wf_manager.py +2 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/pyproject.toml +7 -3
- hpc_beeflow-0.1.9.dev3/beeflow/common/gdb/DESIGN.md +0 -83
- hpc_beeflow-0.1.9.dev3/beeflow/common/gdb_interface.py +0 -302
- hpc_beeflow-0.1.9.dev3/beeflow/data/dockerfiles/Dockerfile.neo4j-ppc64le +0 -42
- hpc_beeflow-0.1.9.dev3/beeflow/wf_manager/common/dep_manager.py +0 -229
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/LICENSE +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/README.rst +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/client/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/cloud_launcher.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/api.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/build/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/build/build_driver.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/build/container_drivers.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/build/utils.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/build_interfaces.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/cli.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/cli_connection.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/cloud/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/cloud/__init__.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/cloud/chameleoncloud.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/cloud/cloud.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/cloud/constants.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/cloud/google.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/cloud/openstack.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/cloud/provider.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/config_validator.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/connection.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/container_path.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/crt/charliecloud_driver.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/crt/crt_driver.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/crt/singularity_driver.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/crt_interface.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/cwl/cwl.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/cwl/examples/cat_grep_tar_driver.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/cwl/examples/comd_driver.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/db/bdb.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/db/sched_db.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/db/tm_db.py +0 -0
- /hpc_beeflow-0.1.9.dev3/beeflow/common/celery.py → /hpc_beeflow-0.1.10.dev0/beeflow/common/deps/celery_manager.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/expr.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/integration/generated_workflows.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/integration/utils.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/log.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/parser/.gitignore +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/parser/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/parser/__init__.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/states.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/tab_completion.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/validation.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/wf_data.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/wf_profiler.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/worker/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/worker/__init__.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/worker/flux_worker.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/worker/lsf_worker.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/worker/simple_worker.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/worker/slurm_worker.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/worker/utils.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/worker/worker.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/common/worker_interface.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cloud_templates/dora.jinja +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cloud_templates/dora.yaml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/blast/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/blast/blast.yml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/blast/blast_output.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/blast/blast_output_err.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/blast/blast_split.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/blast/blast_wf.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/blast/blast_worker001.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/blast/blast_worker002.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/blast/input/small.fasta +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/cat-grep-fail/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/cat-grep-fail/cat.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/cat-grep-fail/grep0.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/cat-grep-fail/grep1.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/cat-grep-fail/input.yml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/cat-grep-fail/lorem.txt +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/cat-grep-fail/tar.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/cat-grep-fail/workflow.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-ci/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-ci/clamr.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-ci/clamr_job.json +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-ci/clamr_job.yml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-ci/clamr_wf.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-ci/ffmpeg.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-build_script/Dockerfile.clamr-ffmpeg +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-build_script/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-build_script/clamr.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-build_script/clamr_job.json +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-build_script/clamr_job.yml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-build_script/clamr_wf.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-build_script/ffmpeg.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-build_script/post_run.sh +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-build_script/pre_run.sh +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-validate_script/Dockerfile.clamr-ffmpeg +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-validate_script/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-validate_script/clamr.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-validate_script/clamr_job.json +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-validate_script/clamr_job.yml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-validate_script/clamr_wf.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-validate_script/ffmpeg.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-validate_script/post_run.sh +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-validate_script/pre_run.sh +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf/clamr.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf/clamr_job.json +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf/clamr_job.yml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf/clamr_wf.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf/ffmpeg.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/clamr.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/clamr_job.json +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/clamr_job.yml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/clamr_wf.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/ffmpeg.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/lsf-charliecloud/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/lsf-charliecloud/cf-summit.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/Dockerfile.clamr-lanl-x86_64 +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/cf-darwin.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/cf-no-owrite.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/cf.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/copyContainer_containerName.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/dockerFile_containerName.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/dockerPull.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-singularity/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-singularity/cf-singularity.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf-singularity/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf-singularity/clamr.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf-singularity/clamr_job.json +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf-singularity/clamr_job.yml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf-singularity/clamr_wf.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf-singularity/ffmpeg.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf-summit/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf-summit/clamr.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf-summit/clamr_job.json +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf-summit/clamr_job.yml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf-summit/clamr_wf.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf-summit/ffmpeg.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf-use-container/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf-use-container/clamr.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf-use-container/clamr_job.json +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf-use-container/clamr_job.yml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf-use-container/clamr_wf.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/clamr-wf-use-container/ffmpeg.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/lulesh-mpi/lulesh.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/lulesh-mpi/lulesh.yml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/lulesh-mpi-multi-file/lulesh.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/lulesh-mpi-multi-file/lulesh_job.yml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/lulesh-mpi-multi-file/lulesh_wf.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/nwchem-mpi/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/nwchem-mpi/nwchem.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/nwchem-mpi/nwchem.yml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/nwchem-mpi/nwchem_bin.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/pennant/graph.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/pennant/pennant.yml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/pennant/pennant_1_node.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/pennant/pennant_2_node.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/pennant/pennant_4_node.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/pennant/pennant_wf.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/pennant-build/Dockerfile.pennant-flux-x86_64 +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/pennant-build/Dockerfile.pennant-graph-x86_64 +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/pennant-build/graph.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/pennant-build/graph_pennant.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/pennant-build/graph_pennant.sh +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/pennant-build/pennant.yml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/pennant-build/pennant_1_node.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/pennant-build/pennant_2_node.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/pennant-build/pennant_4_node.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/pennant-build/pennant_8_node.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/pennant-build/pennant_wf.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/pytest.ini +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/simple-workflows/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/simple-workflows/cancel.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/simple-workflows/grep-wordcount/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/simple-workflows/grep-wordcount/gc-nc.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/simple-workflows/grep-wordcount/gc.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/bee_workflows/simple-workflows/grep-wordcount/lorem.txt +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/cwl_validation/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/cwl_validation/builder/dockerFile.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/cwl_validation/builder/dockerPull.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/cwl_validation/grep-wordcount/gc.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/cwl_validation/grep-wordcount/lorem.txt +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/cwl_validation/helloworld.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/cwl_validation/helloworld_input.yaml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/cwl_validation/ml-workflow/example-1/DAG_example-1.png +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/cwl_validation/ml-workflow/example-1/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/cwl_validation/ml-workflow/example-1/add.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/cwl_validation/ml-workflow/example-1/add_multiply_example_workflow.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/cwl_validation/ml-workflow/example-1/add_step1.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/cwl_validation/ml-workflow/example-1/isolated test.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/cwl_validation/ml-workflow/example-1/job.yaml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/cwl_validation/ml-workflow/example-1/multiply.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/cwl_validation/ml-workflow/example-1/multiply_step2.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/cwl_validation/ml-workflow/example-1/workflow_generater_python.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/decision_tree.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/decision_tree_output.txt +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/decision_tree_tool.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/expectedValue.txt +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/hiring1.txt +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/linear_regress_output.txt +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/linear_regression.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/machinelearning_pipeline.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/out.PNG +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/predict_code.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/predict_tool.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/read_dataset.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/read_dataset_tool.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/regress_tool.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/dockerfiles/Dockerfile.builder_demo +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/dockerfiles/Dockerfile.clamr-ffmpeg +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/dockerfiles/Dockerfile.clamr-lanl-x86_64 +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/dockerfiles/Dockerfile.clamr-ppc64le +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/dockerfiles/Dockerfile.comd-flux-x86_64 +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/dockerfiles/Dockerfile.deb9ompi-x86_64 +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/dockerfiles/Dockerfile.lulesh-x86_64 +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/dockerfiles/Dockerfile.nwchem-x86_64 +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/dockerfiles/Dockerfile.pennant-flux-x86_64 +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/dockerfiles/Dockerfile.vaspompi-x86_64 +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/dockerfiles/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/dockerfiles/comd-pmix-support/Dockerfile.comd-x86_64-wpmix +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/dockerfiles/comd-pmix-support/Dockerfile.debian +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/dockerfiles/comd-pmix-support/Dockerfile.openmpi-3.1.5 +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/dockerfiles/comd-pmix-support/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/dockerfiles/comd-pmix-support/dont-init-ucx-on-intel-cray.patch +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/dockerfiles/pennant-graph/Dockerfile.pennant-graph-x86_64 +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/dockerfiles/pennant-graph/graph_pennant.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/data/dockerfiles/pennant-graph/graph_pennant.sh +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/scheduler/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/scheduler/algorithms.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/scheduler/resource_allocation.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/scheduler/scheduler.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/scheduler/scheduler.yaml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/scheduler/serializable.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/scheduler/task.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/task_manager/background.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/task_manager/task_actions.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/task_manager/task_manager.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/task_manager/task_submit.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/task_manager/utils.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/tests/42.tgz +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/tests/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/tests/cf.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/tests/clamr-wf/clamr.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/tests/clamr-wf/clamr_job.json +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/tests/clamr-wf/clamr_job.yml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/tests/clamr-wf/clamr_wf.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/tests/clamr-wf/ffmpeg.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/tests/clamr-wf/mv_script.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/tests/clamr-wf/mv_script.sh +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/tests/clamr-wf.tgz +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/tests/gdb.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/tests/test_cloud.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/tests/test_config_validator.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/tests/test_container_path.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/tests/test_db_sched.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/tests/test_db_tm.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/tests/test_scheduler.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/tests/test_scheduler_resource_allocation.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/tests/test_scheduler_rest.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/tests/test_slurm_worker.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/tests/test_tm.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/wf_manager/common/wf_db.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.10.dev0}/beeflow/wf_manager/resources/wf_metadata.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: hpc-beeflow
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.10.dev0
|
|
4
4
|
Summary: A software package for containerizing HPC applications and managing job workflows
|
|
5
5
|
Home-page: https://github.com/lanl/BEE
|
|
6
6
|
Keywords: bee,hpc,workflow,cluster,computing
|
|
@@ -34,17 +34,21 @@ Requires-Dist: celery[redis,sqlalchemy] (>=5.3.4,<6.0.0)
|
|
|
34
34
|
Requires-Dist: cffi (>=1.15.1,<2.0.0)
|
|
35
35
|
Requires-Dist: cwl-utils (>=0.16,<0.17)
|
|
36
36
|
Requires-Dist: docutils (==0.18.1)
|
|
37
|
+
Requires-Dist: fastapi (==0.109.2)
|
|
37
38
|
Requires-Dist: flask_restful (==0.3.9)
|
|
38
39
|
Requires-Dist: google-api-python-client (>=2.66.0,<3.0.0) ; extra == "cloud-extras"
|
|
40
|
+
Requires-Dist: graphviz (>=0.20.3,<0.21.0)
|
|
39
41
|
Requires-Dist: gunicorn (>=20.1,<23.0)
|
|
40
42
|
Requires-Dist: jsonpickle (>=2.2.0,<3.0.0)
|
|
41
43
|
Requires-Dist: neo4j (>=5,<6)
|
|
44
|
+
Requires-Dist: networkx (==3.1)
|
|
42
45
|
Requires-Dist: python-daemon (>=2.3.1,<3.0.0)
|
|
43
46
|
Requires-Dist: python-heatclient (>=3.1.0,<4.0.0) ; extra == "cloud-extras"
|
|
44
47
|
Requires-Dist: python-openstackclient (>=6.0.0,<7.0.0) ; extra == "cloud-extras"
|
|
45
|
-
Requires-Dist: requests (
|
|
46
|
-
Requires-Dist: requests-
|
|
48
|
+
Requires-Dist: requests (>=2.32.3,<3.0.0)
|
|
49
|
+
Requires-Dist: requests-unixsocket2 (>=0.4.2,<0.5.0)
|
|
47
50
|
Requires-Dist: typer (>=0.5.0,<0.6.0)
|
|
51
|
+
Requires-Dist: uvicorn (==0.27.1)
|
|
48
52
|
Project-URL: Repository, https://github.com/lanl/BEE
|
|
49
53
|
Description-Content-Type: text/x-rst
|
|
50
54
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
"""bee-client.
|
|
3
3
|
|
|
4
|
-
This script provides
|
|
4
|
+
This script provides a client interface to the user to manage workflows.
|
|
5
5
|
Capablities include submitting, starting, listing, pausing and cancelling workflows.
|
|
6
6
|
"""
|
|
7
7
|
import os
|
|
@@ -11,6 +11,7 @@ import inspect
|
|
|
11
11
|
import pathlib
|
|
12
12
|
import shutil
|
|
13
13
|
import subprocess
|
|
14
|
+
import tarfile
|
|
14
15
|
import tempfile
|
|
15
16
|
import textwrap
|
|
16
17
|
import time
|
|
@@ -18,6 +19,7 @@ import importlib.metadata
|
|
|
18
19
|
import jsonpickle
|
|
19
20
|
import requests
|
|
20
21
|
import typer
|
|
22
|
+
import yaml
|
|
21
23
|
|
|
22
24
|
from beeflow.common import config_driver
|
|
23
25
|
from beeflow.common.cli import NaturalOrderGroup
|
|
@@ -27,6 +29,8 @@ from beeflow.common.parser import CwlParser
|
|
|
27
29
|
from beeflow.common.wf_data import generate_workflow_id
|
|
28
30
|
from beeflow.client import core
|
|
29
31
|
from beeflow.wf_manager.resources import wf_utils
|
|
32
|
+
from beeflow.common.db import client_db
|
|
33
|
+
from beeflow.common.db import bdb
|
|
30
34
|
|
|
31
35
|
# Length of a shortened workflow ID
|
|
32
36
|
short_id_len = 6 #noqa: Not a constant
|
|
@@ -39,6 +43,7 @@ _INTERACTIVE = False
|
|
|
39
43
|
|
|
40
44
|
|
|
41
45
|
logging.basicConfig(level=logging.WARNING)
|
|
46
|
+
logging.getLogger("neo4j").setLevel(logging.WARNING)
|
|
42
47
|
WORKFLOW_MANAGER = 'bee_wfm/v1/jobs/'
|
|
43
48
|
|
|
44
49
|
|
|
@@ -50,6 +55,41 @@ class ClientError(Exception):
|
|
|
50
55
|
self.args = args
|
|
51
56
|
|
|
52
57
|
|
|
58
|
+
def warn(*pargs):
|
|
59
|
+
"""Print a red warning message."""
|
|
60
|
+
typer.secho(' '.join(pargs), fg=typer.colors.RED, file=sys.stderr)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def db_path():
|
|
64
|
+
"""Return the client database path."""
|
|
65
|
+
bee_workdir = config_driver.BeeConfig.get('DEFAULT', 'bee_workdir')
|
|
66
|
+
return os.path.join(bee_workdir, 'client.db')
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def setup_hostname(start_hn):
|
|
70
|
+
"""Set up front end name when beeflow core start is returned."""
|
|
71
|
+
db = bdb.connect_db(client_db, db_path())
|
|
72
|
+
db.info.set_hostname(start_hn)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def get_hostname():
|
|
76
|
+
"""Check if beeflow is running somewhere else."""
|
|
77
|
+
db = bdb.connect_db(client_db, db_path())
|
|
78
|
+
curr_hn = db.info.get_hostname()
|
|
79
|
+
return curr_hn
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def check_hostname(curr_hn):
|
|
83
|
+
"""Check current front end name matches the one beeflow was started on."""
|
|
84
|
+
db = bdb.connect_db(client_db, db_path())
|
|
85
|
+
start_hn = db.info.get_hostname()
|
|
86
|
+
if start_hn and curr_hn != start_hn: # noqa: don't use set instead
|
|
87
|
+
warn(f'beeflow was started on "{start_hn}" and you are trying to '
|
|
88
|
+
f'run a command on "{curr_hn}".')
|
|
89
|
+
if start_hn == "":
|
|
90
|
+
warn('beeflow has not been started!')
|
|
91
|
+
|
|
92
|
+
|
|
53
93
|
def error_exit(msg, include_caller=True):
|
|
54
94
|
"""Print a message and exit or raise an error with that message."""
|
|
55
95
|
if include_caller:
|
|
@@ -112,7 +152,11 @@ def get_wf_list():
|
|
|
112
152
|
conn = _wfm_conn()
|
|
113
153
|
resp = conn.get(_url(), timeout=60)
|
|
114
154
|
except requests.exceptions.ConnectionError:
|
|
115
|
-
|
|
155
|
+
if get_hostname() == "":
|
|
156
|
+
warn('beeflow has not been started!')
|
|
157
|
+
sys.exit(1)
|
|
158
|
+
else:
|
|
159
|
+
error_exit('Could not reach WF Manager.')
|
|
116
160
|
|
|
117
161
|
if resp.status_code != requests.codes.okay: # pylint: disable=no-member
|
|
118
162
|
error_exit('WF Manager did not return workflow list')
|
|
@@ -192,7 +236,7 @@ def submit(wf_name: str = typer.Argument(..., help='the workflow name'), # pyli
|
|
|
192
236
|
main_cwl: str = typer.Argument(...,
|
|
193
237
|
help='filename of main CWL (if using CWL tarball), '
|
|
194
238
|
+ 'path of main CWL (if using CWL directory)'),
|
|
195
|
-
|
|
239
|
+
yaml_file: str = typer.Argument(...,
|
|
196
240
|
help='filename of yaml file (if using CWL tarball), '
|
|
197
241
|
+ 'path of yaml file (if using CWL directory)'),
|
|
198
242
|
workdir: pathlib.Path = typer.Argument(...,
|
|
@@ -215,16 +259,17 @@ def submit(wf_name: str = typer.Argument(..., help='the workflow name'), # pyli
|
|
|
215
259
|
if os.path.isdir(wf_path):
|
|
216
260
|
print("Detected directory instead of packaged workflow. Packaging Directory...")
|
|
217
261
|
main_cwl_path = pathlib.Path(main_cwl).resolve()
|
|
218
|
-
yaml_path = pathlib.Path(
|
|
262
|
+
yaml_path = pathlib.Path(yaml_file).resolve()
|
|
219
263
|
|
|
220
264
|
if not main_cwl_path.exists():
|
|
221
265
|
error_exit(f'Main CWL file {main_cwl} does not exist')
|
|
222
266
|
if not yaml_path.exists():
|
|
223
|
-
error_exit(f'YAML file {
|
|
267
|
+
error_exit(f'YAML file {yaml_file} does not exist')
|
|
224
268
|
|
|
225
269
|
# Packaging in temp dir, after copying alternate cwl_main or yaml file
|
|
226
270
|
cwl_indir = is_parent(wf_path, main_cwl_path)
|
|
227
271
|
yaml_indir = is_parent(wf_path, yaml_path)
|
|
272
|
+
|
|
228
273
|
# Always create temp dir for the workflow
|
|
229
274
|
tempdir_path = pathlib.Path(tempfile.mkdtemp())
|
|
230
275
|
tempdir_wf_path = pathlib.Path(tempdir_path / wf_name)
|
|
@@ -232,15 +277,16 @@ def submit(wf_name: str = typer.Argument(..., help='the workflow name'), # pyli
|
|
|
232
277
|
if not cwl_indir:
|
|
233
278
|
shutil.copy2(main_cwl, tempdir_wf_path)
|
|
234
279
|
if not yaml_indir:
|
|
235
|
-
shutil.copy2(
|
|
280
|
+
shutil.copy2(yaml_file, tempdir_wf_path)
|
|
236
281
|
package_path = package(tempdir_wf_path, tempdir_path)
|
|
237
282
|
else:
|
|
238
283
|
package_path = wf_path
|
|
284
|
+
|
|
239
285
|
# Untar and parse workflow
|
|
240
286
|
untar_path = pathlib.Path(tempfile.mkdtemp())
|
|
241
287
|
untar_wf_path = unpackage(package_path, untar_path)
|
|
242
288
|
main_cwl_path = untar_wf_path / pathlib.Path(main_cwl).name
|
|
243
|
-
yaml_path = untar_wf_path / pathlib.Path(
|
|
289
|
+
yaml_path = untar_wf_path / pathlib.Path(yaml_file).name
|
|
244
290
|
parser = CwlParser()
|
|
245
291
|
workflow_id = generate_workflow_id()
|
|
246
292
|
workflow, tasks = parser.parse_workflow(workflow_id, str(main_cwl_path),
|
|
@@ -304,16 +350,19 @@ def submit(wf_name: str = typer.Argument(..., help='the workflow name'), # pyli
|
|
|
304
350
|
|
|
305
351
|
# Store provided arguments in text file for future reference
|
|
306
352
|
wf_dir = wf_utils.get_workflow_dir(wf_id)
|
|
307
|
-
sub_wf_dir = wf_dir + "/submit_command_args.
|
|
353
|
+
sub_wf_dir = wf_dir + "/submit_command_args.yaml"
|
|
354
|
+
|
|
355
|
+
cmd = {
|
|
356
|
+
'wf_name': wf_name,
|
|
357
|
+
'wf_path': str(wf_path),
|
|
358
|
+
'main_cwl': main_cwl,
|
|
359
|
+
'yaml': yaml_file,
|
|
360
|
+
'workdir': workdir,
|
|
361
|
+
'wf_id': wf_id
|
|
362
|
+
}
|
|
308
363
|
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
f_name.write(f"wf_path: {wf_path}\n")
|
|
312
|
-
f_name.write(f"main_cwl: {main_cwl}\n")
|
|
313
|
-
f_name.write(f"yaml: {yaml}\n")
|
|
314
|
-
f_name.write(f"workdir: {workdir}\n")
|
|
315
|
-
f_name.write(f"wf_id: {wf_id}")
|
|
316
|
-
f_name.close()
|
|
364
|
+
with open(sub_wf_dir, "w", encoding='utf-8') as command_file:
|
|
365
|
+
yaml.dump(cmd, command_file)
|
|
317
366
|
|
|
318
367
|
return wf_id
|
|
319
368
|
|
|
@@ -457,7 +506,10 @@ def query(wf_id: str = typer.Argument(..., callback=match_short_id)):
|
|
|
457
506
|
wf_status = resp.json()['wf_status']
|
|
458
507
|
typer.echo(wf_status)
|
|
459
508
|
for _task_id, task_name, task_state in tasks_status:
|
|
460
|
-
|
|
509
|
+
if wf_status == 'No Start':
|
|
510
|
+
typer.echo(f'{task_name}')
|
|
511
|
+
else:
|
|
512
|
+
typer.echo(f'{task_name}--{task_state}')
|
|
461
513
|
|
|
462
514
|
logging.info('Query workflow: {resp.text}')
|
|
463
515
|
return wf_status, tasks_status
|
|
@@ -518,7 +570,7 @@ def cancel(wf_id: str = typer.Argument(..., callback=match_short_id)):
|
|
|
518
570
|
"""Cancel a paused or running workflow."""
|
|
519
571
|
long_wf_id = wf_id
|
|
520
572
|
wf_status = get_wf_status(wf_id)
|
|
521
|
-
if wf_status in ('Running', 'Paused'):
|
|
573
|
+
if wf_status in ('Running', 'Paused', 'No Start'):
|
|
522
574
|
try:
|
|
523
575
|
conn = _wfm_conn()
|
|
524
576
|
resp = conn.delete(_resource(long_wf_id), json={'option': 'cancel'}, timeout=60)
|
|
@@ -570,6 +622,26 @@ def reexecute(wf_name: str = typer.Argument(..., help='The workflow name'),
|
|
|
570
622
|
workdir = os.path.abspath(workdir)
|
|
571
623
|
if not os.path.exists(workdir):
|
|
572
624
|
error_exit(f"Workflow working directory \"{workdir}\" doesn't exist")
|
|
625
|
+
cwl_path = pathlib.Path(tempfile.mkdtemp())
|
|
626
|
+
archive_id = str(wf_path.stem)
|
|
627
|
+
with tarfile.open(wf_path) as archive:
|
|
628
|
+
archive_cmd = yaml.load(archive.extractfile(
|
|
629
|
+
str(pathlib.Path(archive_id) / 'submit_command_args.yaml')).read(),
|
|
630
|
+
Loader=yaml.Loader)
|
|
631
|
+
|
|
632
|
+
cwl_files = [
|
|
633
|
+
tarinfo for tarinfo in archive.getmembers()
|
|
634
|
+
if tarinfo.name.startswith(archive_id + '/cwl_files/')
|
|
635
|
+
and tarinfo.isreg()
|
|
636
|
+
]
|
|
637
|
+
for path in cwl_files:
|
|
638
|
+
path.name = os.path.basename(path.name)
|
|
639
|
+
archive.extractall(path=cwl_path, members=cwl_files)
|
|
640
|
+
|
|
641
|
+
main_cwl = cwl_path / pathlib.Path(archive_cmd['main_cwl']).name
|
|
642
|
+
yaml_file = cwl_path / pathlib.Path(archive_cmd['yaml']).name
|
|
643
|
+
|
|
644
|
+
return submit(wf_name, pathlib.Path(cwl_path), main_cwl, yaml_file, pathlib.Path(workdir))
|
|
573
645
|
|
|
574
646
|
data = {
|
|
575
647
|
'wf_filename': os.path.basename(wf_path).encode(),
|
|
@@ -593,6 +665,42 @@ def reexecute(wf_name: str = typer.Argument(..., help='The workflow name'),
|
|
|
593
665
|
return wf_id
|
|
594
666
|
|
|
595
667
|
|
|
668
|
+
@app.command()
|
|
669
|
+
def dag(wf_id: str = typer.Argument(..., callback=match_short_id),
|
|
670
|
+
output_dir: pathlib.Path = typer.Argument(...,
|
|
671
|
+
help='Path to the where the dag output will be'),
|
|
672
|
+
no_dag_dir: bool = typer.Option(False, '--no-dag-dir',
|
|
673
|
+
help='do not make a subdirectory within ouput_dir for the dags')):
|
|
674
|
+
"""Export a DAG of the workflow to a GraphML file."""
|
|
675
|
+
output_dir = output_dir.resolve()
|
|
676
|
+
# Make sure output_dir is an absolute path and exists
|
|
677
|
+
output_dir = os.path.expanduser(output_dir)
|
|
678
|
+
output_dir = os.path.abspath(output_dir)
|
|
679
|
+
if not os.path.exists(output_dir):
|
|
680
|
+
error_exit(f"Path for dag directory \"{output_dir}\" doesn't exist")
|
|
681
|
+
|
|
682
|
+
# output_dir must be a string
|
|
683
|
+
output_dir = str(output_dir)
|
|
684
|
+
# Check if the workflow is archived
|
|
685
|
+
wf_status = get_wf_status(wf_id)
|
|
686
|
+
if wf_status == 'Archived':
|
|
687
|
+
copy_dag_in_archive = False
|
|
688
|
+
bee_workdir = wf_utils.get_bee_workdir()
|
|
689
|
+
mount_dir = os.path.join(bee_workdir, 'gdb_mount')
|
|
690
|
+
graphmls_dir = mount_dir + '/graphmls'
|
|
691
|
+
typer.secho("Workflow has been archived. All new DAGs will look the same as the one "
|
|
692
|
+
"in the archive directory.",
|
|
693
|
+
fg=typer.colors.MAGENTA)
|
|
694
|
+
else:
|
|
695
|
+
copy_dag_in_archive = True
|
|
696
|
+
wf_dir = wf_utils.get_workflow_dir(wf_id)
|
|
697
|
+
graphmls_dir = wf_dir + '/graphmls'
|
|
698
|
+
os.makedirs(graphmls_dir, exist_ok=True)
|
|
699
|
+
wf_utils.export_dag(wf_id, output_dir, graphmls_dir, no_dag_dir, copy_dag_in_archive)
|
|
700
|
+
typer.secho(f"DAG for workflow {_short_id(wf_id)} has been exported successfully.",
|
|
701
|
+
fg=typer.colors.GREEN)
|
|
702
|
+
|
|
703
|
+
|
|
596
704
|
@app.callback(invoke_without_command=True)
|
|
597
705
|
def version_callback(version: bool = False):
|
|
598
706
|
"""Beeflow."""
|
|
@@ -615,4 +723,5 @@ if __name__ == "__main__":
|
|
|
615
723
|
|
|
616
724
|
# Ignore W0511: This allows us to have TODOs in the code
|
|
617
725
|
# Ignore R1732: Significant code restructuring required to fix
|
|
726
|
+
# Ignore R1714: Not using a set instead
|
|
618
727
|
# pylama:ignore=W0511,R1732
|
|
@@ -9,6 +9,7 @@ services is specified using the appropriate flag(s) then ONLY those services
|
|
|
9
9
|
will be started.
|
|
10
10
|
"""
|
|
11
11
|
import os
|
|
12
|
+
import re
|
|
12
13
|
import signal
|
|
13
14
|
import subprocess
|
|
14
15
|
import socket
|
|
@@ -17,19 +18,26 @@ import shutil
|
|
|
17
18
|
import datetime
|
|
18
19
|
import time
|
|
19
20
|
import importlib.metadata
|
|
21
|
+
from pathlib import Path
|
|
22
|
+
import packaging
|
|
20
23
|
|
|
21
24
|
import daemon
|
|
22
25
|
import typer
|
|
23
26
|
|
|
27
|
+
|
|
24
28
|
from beeflow.client import bee_client
|
|
25
29
|
from beeflow.common.config_driver import BeeConfig as bc
|
|
30
|
+
from beeflow.common.config_driver import AlterConfig
|
|
26
31
|
from beeflow.common import cli_connection
|
|
27
32
|
from beeflow.common import paths
|
|
28
33
|
from beeflow.wf_manager.resources import wf_utils
|
|
29
34
|
|
|
30
|
-
from beeflow.common.
|
|
31
|
-
from beeflow.common.
|
|
32
|
-
from beeflow.
|
|
35
|
+
from beeflow.common.deps import container_manager
|
|
36
|
+
from beeflow.common.deps import neo4j_manager
|
|
37
|
+
from beeflow.common.deps import redis_manager
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
REPO_PATH = Path(*Path(__file__).parts[:-3])
|
|
33
41
|
|
|
34
42
|
|
|
35
43
|
class ComponentManager:
|
|
@@ -44,7 +52,11 @@ class ComponentManager:
|
|
|
44
52
|
"""Return a decorator function to be called."""
|
|
45
53
|
|
|
46
54
|
def wrap(fn):
|
|
47
|
-
"""
|
|
55
|
+
"""Check to see if any components are disabled."""
|
|
56
|
+
if bc.get('DEFAULT', 'remote_api') is False and 'remote_api' in name:
|
|
57
|
+
return
|
|
58
|
+
|
|
59
|
+
# Add the component to the list.
|
|
48
60
|
self.components[name] = {
|
|
49
61
|
'fn': fn,
|
|
50
62
|
'deps': deps,
|
|
@@ -156,6 +168,22 @@ def need_slurmrestd():
|
|
|
156
168
|
and not bc.get('slurm', 'use_commands'))
|
|
157
169
|
|
|
158
170
|
|
|
171
|
+
def get_slurmrestd_version():
|
|
172
|
+
"""Get the newest slurmrestd version."""
|
|
173
|
+
resp = subprocess.run(["slurmrestd", "-s", "list"], check=True, stderr=subprocess.PIPE,
|
|
174
|
+
text=True).stderr
|
|
175
|
+
resp = resp.split("\n")
|
|
176
|
+
# Confirm slurmrestd format is the same
|
|
177
|
+
# If the slurmrestd list outputs has changed potentially something else has broken
|
|
178
|
+
if "Possible OpenAPI plugins" not in resp[0]:
|
|
179
|
+
print("Slurmrestd OpenAPI format has changed and things may break")
|
|
180
|
+
api_versions = [line.split('/')[1] for line in resp[1:] if re.search(r"openapi/v\d+\.\d+\.\d+",
|
|
181
|
+
line)]
|
|
182
|
+
# Sort the versions and grab the newest one
|
|
183
|
+
newest_api = sorted(api_versions, key=packaging.version.Version, reverse=True)[0]
|
|
184
|
+
return newest_api
|
|
185
|
+
|
|
186
|
+
|
|
159
187
|
def init_components():
|
|
160
188
|
"""Initialize the components and component manager."""
|
|
161
189
|
mgr = ComponentManager()
|
|
@@ -189,54 +217,46 @@ def init_components():
|
|
|
189
217
|
return launch_with_gunicorn('beeflow.scheduler.scheduler:create_app()',
|
|
190
218
|
paths.sched_socket(), stdout=fp, stderr=fp)
|
|
191
219
|
|
|
220
|
+
@mgr.component('remote_api', ('wf_manager', 'task_manager'))
|
|
221
|
+
def start_remote_api():
|
|
222
|
+
"""Start the remote API."""
|
|
223
|
+
fp = open_log('remote_api')
|
|
224
|
+
return launch_with_gunicorn('beeflow.remote.remote:create_app()',
|
|
225
|
+
paths.remote_socket(), stdout=fp, stderr=fp)
|
|
226
|
+
|
|
192
227
|
@mgr.component('celery', ('redis',))
|
|
193
228
|
def celery():
|
|
194
229
|
"""Start the celery task queue."""
|
|
195
230
|
log = open_log('celery')
|
|
196
231
|
# Setting --pool=solo to avoid preforking multiple processes
|
|
197
|
-
return subprocess.Popen(['celery', '-A', 'beeflow.common.
|
|
198
|
-
|
|
232
|
+
return subprocess.Popen(['celery', '-A', 'beeflow.common.deps.celery_manager',
|
|
233
|
+
'worker', '--pool=solo'], stdout=log, stderr=log)
|
|
199
234
|
|
|
200
235
|
# Run this before daemonizing in order to avoid slow background start
|
|
201
|
-
container_path = paths.redis_container()
|
|
236
|
+
# container_path = paths.redis_container()
|
|
202
237
|
# If it exists, we assume that it actually has a valid container
|
|
203
|
-
if not os.path.exists(container_path):
|
|
238
|
+
# if not os.path.exists(container_path):
|
|
239
|
+
# print('Unpacking Redis image...')
|
|
240
|
+
# subprocess.check_call(['ch-convert', '-i', 'tar', '-o', 'dir',
|
|
241
|
+
# bc.get('DEFAULT', 'redis_image'), container_path])
|
|
242
|
+
if not container_manager.check_container_dir('redis'):
|
|
204
243
|
print('Unpacking Redis image...')
|
|
205
|
-
|
|
206
|
-
|
|
244
|
+
container_manager.create_image('redis')
|
|
245
|
+
|
|
246
|
+
if not container_manager.check_container_dir('neo4j'):
|
|
247
|
+
print('Unpacking Neo4j image...')
|
|
248
|
+
container_manager.create_image('neo4j')
|
|
249
|
+
|
|
250
|
+
@mgr.component('neo4j-database', ('wf_manager',))
|
|
251
|
+
def start_neo4j():
|
|
252
|
+
"""Start the neo4j graph database."""
|
|
253
|
+
return neo4j_manager.start()
|
|
207
254
|
|
|
208
255
|
@mgr.component('redis', ())
|
|
209
|
-
def
|
|
256
|
+
def start_redis():
|
|
210
257
|
"""Start redis."""
|
|
211
|
-
data_dir = 'data'
|
|
212
|
-
os.makedirs(os.path.join(paths.redis_root(), data_dir), exist_ok=True)
|
|
213
|
-
conf_name = 'redis.conf'
|
|
214
|
-
container_path = paths.redis_container()
|
|
215
|
-
# Dump the config
|
|
216
|
-
conf_path = os.path.join(paths.redis_root(), conf_name)
|
|
217
|
-
if not os.path.exists(conf_path):
|
|
218
|
-
with open(conf_path, 'w', encoding='utf-8') as fp:
|
|
219
|
-
# Don't listen on TCP
|
|
220
|
-
print('port 0', file=fp)
|
|
221
|
-
print('dir', os.path.join('/mnt', data_dir), file=fp)
|
|
222
|
-
print('maxmemory 2mb', file=fp)
|
|
223
|
-
print('unixsocket', os.path.join('/mnt', paths.redis_sock_fname()), file=fp)
|
|
224
|
-
print('unixsocketperm 700', file=fp)
|
|
225
|
-
cmd = [
|
|
226
|
-
'ch-run',
|
|
227
|
-
f'--bind={paths.redis_root()}:/mnt',
|
|
228
|
-
container_path,
|
|
229
|
-
'redis-server',
|
|
230
|
-
'/mnt/redis.conf',
|
|
231
|
-
]
|
|
232
258
|
log = open_log('redis')
|
|
233
|
-
|
|
234
|
-
# from Redis, so setting LANG=C. This could have consequences for UTF-8
|
|
235
|
-
# strings.
|
|
236
|
-
env = dict(os.environ)
|
|
237
|
-
env['LANG'] = 'C'
|
|
238
|
-
env['LC_ALL'] = 'C'
|
|
239
|
-
return subprocess.Popen(cmd, env=env, stdout=log, stderr=log)
|
|
259
|
+
return redis_manager.start(log)
|
|
240
260
|
|
|
241
261
|
# Workflow manager and task manager need to be opened with PIPE for their stdout/stderr
|
|
242
262
|
if need_slurmrestd():
|
|
@@ -246,6 +266,9 @@ def init_components():
|
|
|
246
266
|
bee_workdir = bc.get('DEFAULT', 'bee_workdir')
|
|
247
267
|
slurmrestd_log = '/'.join([bee_workdir, 'logs', 'restd.log'])
|
|
248
268
|
openapi_version = bc.get('slurm', 'openapi_version')
|
|
269
|
+
if not openapi_version:
|
|
270
|
+
# Detect the newest version of the slurmrestd API
|
|
271
|
+
openapi_version = get_slurmrestd_version()
|
|
249
272
|
slurm_args = f'-s openapi/{openapi_version}'
|
|
250
273
|
# The following adds the db plugin we opted not to use for now
|
|
251
274
|
# slurm_args = f'-s openapi/{openapi_version},openapi/db{openapi_version}'
|
|
@@ -300,8 +323,13 @@ def load_check_charliecloud():
|
|
|
300
323
|
sys.exit(1)
|
|
301
324
|
|
|
302
325
|
|
|
303
|
-
def check_dependencies():
|
|
326
|
+
def check_dependencies(backend=False):
|
|
304
327
|
"""Check for various dependencies in the environment."""
|
|
328
|
+
# Check if running on compute node under Slurm scheduler
|
|
329
|
+
if not backend and os.environ.get('SLURM_JOB_NODELIST') is not None:
|
|
330
|
+
warn('Slurm job node detected! Beeflow should not be run on a compute node.')
|
|
331
|
+
warn(f'SLURM_JOB_NODELIST = {os.environ.get("SLURM_JOB_NODELIST")}')
|
|
332
|
+
sys.exit(1)
|
|
305
333
|
print('Checking dependencies...')
|
|
306
334
|
# Check for Charliecloud and its version
|
|
307
335
|
load_check_charliecloud()
|
|
@@ -384,9 +412,19 @@ app = typer.Typer(no_args_is_help=True)
|
|
|
384
412
|
|
|
385
413
|
@app.command()
|
|
386
414
|
def start(foreground: bool = typer.Option(False, '--foreground', '-F',
|
|
387
|
-
help='run in the foreground')
|
|
415
|
+
help='run in the foreground'), backend: bool = typer.Option(False, '--backend',
|
|
416
|
+
'-B', help='allow to run on a backend node')):
|
|
388
417
|
"""Start all BEE components."""
|
|
389
|
-
|
|
418
|
+
start_hn = socket.gethostname() # hostname when beeflow starts
|
|
419
|
+
if bee_client.get_hostname() == "":
|
|
420
|
+
bee_client.setup_hostname(start_hn) # add to client db
|
|
421
|
+
elif bee_client.get_hostname() != start_hn:
|
|
422
|
+
warn(f'Error: beeflow is already running on "{bee_client.get_hostname()}."')
|
|
423
|
+
sys.exit(1)
|
|
424
|
+
if backend: # allow beeflow to run on backend node
|
|
425
|
+
check_dependencies(backend=True)
|
|
426
|
+
else:
|
|
427
|
+
check_dependencies()
|
|
390
428
|
mgr = init_components()
|
|
391
429
|
beeflow_log = paths.log_fname('beeflow')
|
|
392
430
|
sock_path = paths.beeflow_socket()
|
|
@@ -412,6 +450,7 @@ def start(foreground: bool = typer.Option(False, '--foreground', '-F',
|
|
|
412
450
|
|
|
413
451
|
version = importlib.metadata.version("hpc-beeflow")
|
|
414
452
|
print(f'Starting beeflow {version}...')
|
|
453
|
+
print(f'Running beeflow on {start_hn}')
|
|
415
454
|
if not foreground:
|
|
416
455
|
print('Run `beeflow core status` for more information.')
|
|
417
456
|
# Create the log path if it doesn't exist yet
|
|
@@ -430,20 +469,29 @@ def start(foreground: bool = typer.Option(False, '--foreground', '-F',
|
|
|
430
469
|
@app.command()
|
|
431
470
|
def status():
|
|
432
471
|
"""Check the status of beeflow and the components."""
|
|
472
|
+
status_hn = socket.gethostname() # hostname when beeflow core status returned
|
|
433
473
|
resp = cli_connection.send(paths.beeflow_socket(), {'type': 'status'})
|
|
434
474
|
if resp is None:
|
|
435
|
-
|
|
436
|
-
warn('Cannot connect to the beeflow daemon, is it running? Check the '
|
|
437
|
-
f'log at "{beeflow_log}".')
|
|
475
|
+
bee_client.check_hostname(status_hn)
|
|
438
476
|
sys.exit(1)
|
|
439
477
|
print('beeflow components:')
|
|
440
478
|
for comp, stat in resp['components'].items():
|
|
441
479
|
print(f'{comp} ... {stat}')
|
|
442
480
|
|
|
443
481
|
|
|
482
|
+
@app.command()
|
|
483
|
+
def info():
|
|
484
|
+
"""Get information about beeflow's installation."""
|
|
485
|
+
version = importlib.metadata.version("hpc-beeflow")
|
|
486
|
+
print(f"Beeflow version: {version}")
|
|
487
|
+
print(f"bee_workflow directory: {paths.workdir()}")
|
|
488
|
+
print(f"Log path: {paths.log_path()}")
|
|
489
|
+
|
|
490
|
+
|
|
444
491
|
@app.command()
|
|
445
492
|
def stop(query='yes'):
|
|
446
493
|
"""Stop the current running beeflow daemon."""
|
|
494
|
+
stop_hn = socket.gethostname() # hostname when beeflow core stop returned
|
|
447
495
|
# Check workflow states; warn if there are active states, pause running workflows
|
|
448
496
|
workflow_list = bee_client.get_wf_list()
|
|
449
497
|
concern_states = {'Running', 'Initializing', 'Waiting'}
|
|
@@ -466,32 +514,13 @@ def stop(query='yes'):
|
|
|
466
514
|
bee_client.pause(wf_id)
|
|
467
515
|
resp = cli_connection.send(paths.beeflow_socket(), {'type': 'quit'})
|
|
468
516
|
if resp is None:
|
|
469
|
-
|
|
470
|
-
warn('Error: beeflow is not running on this system. It could be '
|
|
471
|
-
'running on a different front end.\n'
|
|
472
|
-
f' Check the beeflow log: "{beeflow_log}".')
|
|
517
|
+
bee_client.check_hostname(stop_hn)
|
|
473
518
|
sys.exit(1)
|
|
474
519
|
# As long as it returned something, we should be good
|
|
475
520
|
beeflow_log = paths.log_fname('beeflow')
|
|
476
521
|
if query == "yes":
|
|
477
522
|
print(f'Beeflow has stopped. Check the log at "{beeflow_log}".')
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
def kill_active_workflows(active_states, workflow_list):
|
|
481
|
-
"""Kill workflows with active states."""
|
|
482
|
-
db_path = wf_utils.get_db_path()
|
|
483
|
-
db = connect_db(wfm_db, db_path)
|
|
484
|
-
success = True
|
|
485
|
-
for name, wf_id, state in workflow_list:
|
|
486
|
-
if state in active_states:
|
|
487
|
-
pid = db.workflows.get_gdb_pid(wf_id)
|
|
488
|
-
if pid > 0:
|
|
489
|
-
dep_manager.kill_gdb(pid)
|
|
490
|
-
else:
|
|
491
|
-
# Failure most likely caused by an Initializing workflow.
|
|
492
|
-
print(f"No process for {name}, {wf_id}, {state}.")
|
|
493
|
-
success = False
|
|
494
|
-
return success
|
|
523
|
+
bee_client.setup_hostname("")
|
|
495
524
|
|
|
496
525
|
|
|
497
526
|
def archive_dir(dir_to_archive):
|
|
@@ -528,6 +557,8 @@ def reset(archive: bool = typer.Option(False, '--archive', '-a',
|
|
|
528
557
|
help='Archive bee_workdir before removal')):
|
|
529
558
|
"""Stop all components and delete the bee_workdir directory."""
|
|
530
559
|
# Check workflow states; warn if there are active states.
|
|
560
|
+
reset_hn = socket.gethostname()
|
|
561
|
+
bee_client.check_hostname(reset_hn)
|
|
531
562
|
workflow_list = bee_client.get_wf_list()
|
|
532
563
|
active_states = {'Running', 'Paused', 'Initializing', 'Waiting'}
|
|
533
564
|
caution = ""
|
|
@@ -561,9 +592,6 @@ def reset(archive: bool = typer.Option(False, '--archive', '-a',
|
|
|
561
592
|
# Exit out if the user didn't really mean to do a reset
|
|
562
593
|
sys.exit()
|
|
563
594
|
elif absolutely_sure in ("y", "yes"):
|
|
564
|
-
# First stop all active workflow processes
|
|
565
|
-
workflow_list = bee_client.get_wf_list()
|
|
566
|
-
kill_active_workflows(active_states, workflow_list)
|
|
567
595
|
# Stop all of the beeflow processes
|
|
568
596
|
stop("quiet")
|
|
569
597
|
print("Beeflow is shutting down.")
|
|
@@ -598,19 +626,26 @@ def pull_to_tar(ref, tarball):
|
|
|
598
626
|
subprocess.check_call(['ch-convert', '-i', 'ch-image', '-o', 'tar', ref, tarball])
|
|
599
627
|
|
|
600
628
|
|
|
629
|
+
def build_to_tar(tag, dockerfile, tarball):
|
|
630
|
+
"""Build a container from a Dockerfile and convert to tarball."""
|
|
631
|
+
subprocess.check_call(['ch-image', 'build', '-t', tag, '-f', dockerfile, '.'])
|
|
632
|
+
subprocess.check_call(['ch-convert', '-i', 'ch-image', '-o', 'tar', tag, tarball])
|
|
633
|
+
|
|
634
|
+
|
|
601
635
|
@app.command()
|
|
602
636
|
def pull_deps(outdir: str = typer.Option('.', '--outdir', '-o',
|
|
603
637
|
help='directory to store containers in')):
|
|
604
638
|
"""Pull required BEE containers and store in outdir."""
|
|
605
639
|
load_check_charliecloud()
|
|
606
640
|
neo4j_path = os.path.join(os.path.realpath(outdir), 'neo4j.tar.gz')
|
|
607
|
-
|
|
641
|
+
neo4j_dockerfile = str(Path(REPO_PATH, "beeflow/data/dockerfiles/Dockerfile.neo4j"))
|
|
642
|
+
build_to_tar('neo4j_image', neo4j_dockerfile, neo4j_path)
|
|
608
643
|
redis_path = os.path.join(os.path.realpath(outdir), 'redis.tar.gz')
|
|
609
644
|
pull_to_tar('redis', redis_path)
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
645
|
+
|
|
646
|
+
AlterConfig(changes={'DEFAULT': {'neo4j_image': neo4j_path,
|
|
647
|
+
'redis_image': redis_path}}).save()
|
|
648
|
+
|
|
649
|
+
dep_dir = container_manager.get_dep_dir()
|
|
650
|
+
if os.path.isdir(dep_dir):
|
|
651
|
+
shutil.rmtree(dep_dir)
|