hpc-beeflow 0.1.9.dev3__tar.gz → 0.1.9.dev4__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.9.dev4}/PKG-INFO +1 -1
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/client/core.py +23 -58
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/config_driver.py +1 -1
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/db/wfm_db.py +31 -53
- hpc_beeflow-0.1.9.dev4/beeflow/common/deps/container_manager.py +88 -0
- hpc_beeflow-0.1.9.dev4/beeflow/common/deps/neo4j_manager.py +164 -0
- hpc_beeflow-0.1.9.dev4/beeflow/common/deps/redis_manager.py +37 -0
- hpc_beeflow-0.1.9.dev4/beeflow/common/gdb/DESIGN.md +74 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/gdb/gdb_driver.py +0 -11
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/gdb/neo4j_cypher.py +125 -86
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/gdb/neo4j_driver.py +90 -59
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/parser/parser.py +7 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/paths.py +5 -5
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/wf_interface.py +47 -93
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/tests/mocks.py +22 -34
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/tests/test_parser.py +1 -1
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/tests/test_wf_interface.py +10 -82
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/tests/test_wf_manager.py +7 -26
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/wf_manager/resources/wf_actions.py +1 -6
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/wf_manager/resources/wf_list.py +13 -67
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/wf_manager/resources/wf_update.py +0 -8
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/wf_manager/resources/wf_utils.py +52 -57
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/wf_manager/wf_manager.py +2 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/pyproject.toml +1 -1
- 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/wf_manager/common/dep_manager.py +0 -229
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/LICENSE +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/README.rst +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/client/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/client/bee_client.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/cloud_launcher.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/api.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/build/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/build/build_driver.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/build/container_drivers.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/build/utils.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/build_interfaces.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/cli.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/cli_connection.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/cloud/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/cloud/__init__.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/cloud/chameleoncloud.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/cloud/cloud.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/cloud/constants.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/cloud/google.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/cloud/openstack.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/cloud/provider.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/config_validator.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/connection.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/container_path.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/crt/charliecloud_driver.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/crt/crt_driver.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/crt/singularity_driver.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/crt_interface.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/cwl/cwl.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/cwl/examples/cat_grep_tar_driver.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/cwl/examples/comd_driver.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/db/bdb.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/db/sched_db.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/db/tm_db.py +0 -0
- /hpc_beeflow-0.1.9.dev3/beeflow/common/celery.py → /hpc_beeflow-0.1.9.dev4/beeflow/common/deps/celery_manager.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/expr.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/integration/generated_workflows.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/integration/utils.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/integration_test.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/log.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/parser/.gitignore +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/parser/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/parser/__init__.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/states.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/tab_completion.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/validation.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/wf_data.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/wf_profiler.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/worker/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/worker/__init__.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/worker/flux_worker.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/worker/lsf_worker.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/worker/simple_worker.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/worker/slurm_worker.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/worker/utils.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/worker/worker.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/common/worker_interface.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cloud_templates/dora.jinja +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cloud_templates/dora.yaml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/blast/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/blast/blast.yml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/blast/blast_output.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/blast/blast_output_err.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/blast/blast_split.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/blast/blast_wf.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/blast/blast_worker001.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/blast/blast_worker002.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/blast/input/small.fasta +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/cat-grep-fail/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/cat-grep-fail/cat.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/cat-grep-fail/grep0.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/cat-grep-fail/grep1.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/cat-grep-fail/input.yml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/cat-grep-fail/lorem.txt +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/cat-grep-fail/tar.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/cat-grep-fail/workflow.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-ci/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-ci/clamr.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-ci/clamr_job.json +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-ci/clamr_job.yml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-ci/clamr_wf.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-ci/ffmpeg.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-build_script/Dockerfile.clamr-ffmpeg +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-build_script/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-build_script/clamr.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-build_script/clamr_job.json +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-build_script/clamr_job.yml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-build_script/clamr_wf.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-build_script/ffmpeg.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-build_script/post_run.sh +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-build_script/pre_run.sh +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-validate_script/Dockerfile.clamr-ffmpeg +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-validate_script/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-validate_script/clamr.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-validate_script/clamr_job.json +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-validate_script/clamr_job.yml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-validate_script/clamr_wf.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-validate_script/ffmpeg.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-validate_script/post_run.sh +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-validate_script/pre_run.sh +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-wf/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-wf/clamr.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-wf/clamr_job.json +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-wf/clamr_job.yml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-wf/clamr_wf.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-wf/ffmpeg.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/clamr.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/clamr_job.json +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/clamr_job.yml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/clamr_wf.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/ffmpeg.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/lsf-charliecloud/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/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.9.dev4}/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.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/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.9.dev4}/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.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/cf.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/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.9.dev4}/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.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/dockerPull.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-singularity/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/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.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-wf-singularity/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-wf-singularity/clamr.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-wf-singularity/clamr_job.json +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-wf-singularity/clamr_job.yml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-wf-singularity/clamr_wf.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-wf-singularity/ffmpeg.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-wf-summit/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-wf-summit/clamr.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-wf-summit/clamr_job.json +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-wf-summit/clamr_job.yml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-wf-summit/clamr_wf.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-wf-summit/ffmpeg.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-wf-use-container/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-wf-use-container/clamr.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-wf-use-container/clamr_job.json +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-wf-use-container/clamr_job.yml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-wf-use-container/clamr_wf.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/clamr-wf-use-container/ffmpeg.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/lulesh-mpi/lulesh.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/lulesh-mpi/lulesh.yml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/lulesh-mpi-multi-file/lulesh.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/lulesh-mpi-multi-file/lulesh_job.yml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/lulesh-mpi-multi-file/lulesh_wf.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/nwchem-mpi/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/nwchem-mpi/nwchem.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/nwchem-mpi/nwchem.yml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/nwchem-mpi/nwchem_bin.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/pennant/graph.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/pennant/pennant.yml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/pennant/pennant_1_node.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/pennant/pennant_2_node.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/pennant/pennant_4_node.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/pennant/pennant_wf.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/pennant-build/Dockerfile.pennant-flux-x86_64 +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/pennant-build/Dockerfile.pennant-graph-x86_64 +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/pennant-build/graph.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/pennant-build/graph_pennant.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/pennant-build/graph_pennant.sh +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/pennant-build/pennant.yml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/pennant-build/pennant_1_node.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/pennant-build/pennant_2_node.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/pennant-build/pennant_4_node.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/pennant-build/pennant_8_node.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/pennant-build/pennant_wf.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/pytest.ini +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/simple-workflows/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/simple-workflows/cancel.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/simple-workflows/grep-wordcount/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/simple-workflows/grep-wordcount/gc-nc.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/simple-workflows/grep-wordcount/gc.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/bee_workflows/simple-workflows/grep-wordcount/lorem.txt +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/cwl_validation/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/cwl_validation/builder/dockerFile.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/cwl_validation/builder/dockerPull.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/cwl_validation/grep-wordcount/gc.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/cwl_validation/grep-wordcount/lorem.txt +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/cwl_validation/helloworld.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/cwl_validation/helloworld_input.yaml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/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.9.dev4}/beeflow/data/cwl/cwl_validation/ml-workflow/example-1/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/cwl_validation/ml-workflow/example-1/add.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/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.9.dev4}/beeflow/data/cwl/cwl_validation/ml-workflow/example-1/add_step1.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/cwl_validation/ml-workflow/example-1/isolated test.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/cwl_validation/ml-workflow/example-1/job.yaml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/cwl_validation/ml-workflow/example-1/multiply.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/cwl_validation/ml-workflow/example-1/multiply_step2.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/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.9.dev4}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/decision_tree.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/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.9.dev4}/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.9.dev4}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/expectedValue.txt +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/hiring1.txt +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/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.9.dev4}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/linear_regression.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/machinelearning_pipeline.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/out.PNG +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/predict_code.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/predict_tool.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/read_dataset.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/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.9.dev4}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/regress_tool.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/dockerfiles/Dockerfile.builder_demo +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/dockerfiles/Dockerfile.clamr-ffmpeg +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/dockerfiles/Dockerfile.clamr-lanl-x86_64 +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/dockerfiles/Dockerfile.clamr-ppc64le +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/dockerfiles/Dockerfile.comd-flux-x86_64 +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/dockerfiles/Dockerfile.deb9ompi-x86_64 +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/dockerfiles/Dockerfile.lulesh-x86_64 +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/dockerfiles/Dockerfile.neo4j-ppc64le +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/dockerfiles/Dockerfile.nwchem-x86_64 +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/dockerfiles/Dockerfile.pennant-flux-x86_64 +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/dockerfiles/Dockerfile.vaspompi-x86_64 +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/dockerfiles/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/dockerfiles/comd-pmix-support/Dockerfile.comd-x86_64-wpmix +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/dockerfiles/comd-pmix-support/Dockerfile.debian +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/dockerfiles/comd-pmix-support/Dockerfile.openmpi-3.1.5 +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/dockerfiles/comd-pmix-support/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/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.9.dev4}/beeflow/data/dockerfiles/pennant-graph/Dockerfile.pennant-graph-x86_64 +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/dockerfiles/pennant-graph/graph_pennant.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/data/dockerfiles/pennant-graph/graph_pennant.sh +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/scheduler/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/scheduler/algorithms.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/scheduler/resource_allocation.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/scheduler/scheduler.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/scheduler/scheduler.yaml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/scheduler/serializable.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/scheduler/task.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/task_manager/background.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/task_manager/task_actions.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/task_manager/task_manager.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/task_manager/task_submit.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/task_manager/utils.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/tests/42.tgz +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/tests/README.md +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/tests/cf.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/tests/clamr-wf/clamr.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/tests/clamr-wf/clamr_job.json +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/tests/clamr-wf/clamr_job.yml +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/tests/clamr-wf/clamr_wf.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/tests/clamr-wf/ffmpeg.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/tests/clamr-wf/mv_script.cwl +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/tests/clamr-wf/mv_script.sh +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/tests/clamr-wf.tgz +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/tests/gdb.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/tests/test_cloud.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/tests/test_config_validator.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/tests/test_container_path.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/tests/test_db_sched.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/tests/test_db_tm.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/tests/test_scheduler.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/tests/test_scheduler_resource_allocation.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/tests/test_scheduler_rest.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/tests/test_slurm_worker.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/tests/test_tm.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/wf_manager/common/wf_db.py +0 -0
- {hpc_beeflow-0.1.9.dev3 → hpc_beeflow-0.1.9.dev4}/beeflow/wf_manager/resources/wf_metadata.py +0 -0
|
@@ -27,9 +27,9 @@ from beeflow.common import cli_connection
|
|
|
27
27
|
from beeflow.common import paths
|
|
28
28
|
from beeflow.wf_manager.resources import wf_utils
|
|
29
29
|
|
|
30
|
-
from beeflow.common.
|
|
31
|
-
from beeflow.common.
|
|
32
|
-
from beeflow.
|
|
30
|
+
from beeflow.common.deps import container_manager
|
|
31
|
+
from beeflow.common.deps import neo4j_manager
|
|
32
|
+
from beeflow.common.deps import redis_manager
|
|
33
33
|
|
|
34
34
|
|
|
35
35
|
class ComponentManager:
|
|
@@ -194,49 +194,34 @@ def init_components():
|
|
|
194
194
|
"""Start the celery task queue."""
|
|
195
195
|
log = open_log('celery')
|
|
196
196
|
# Setting --pool=solo to avoid preforking multiple processes
|
|
197
|
-
return subprocess.Popen(['celery', '-A', 'beeflow.common.
|
|
198
|
-
|
|
197
|
+
return subprocess.Popen(['celery', '-A', 'beeflow.common.deps.celery_manager',
|
|
198
|
+
'worker', '--pool=solo'], stdout=log, stderr=log)
|
|
199
199
|
|
|
200
200
|
# Run this before daemonizing in order to avoid slow background start
|
|
201
|
-
container_path = paths.redis_container()
|
|
201
|
+
# container_path = paths.redis_container()
|
|
202
202
|
# If it exists, we assume that it actually has a valid container
|
|
203
|
-
if not os.path.exists(container_path):
|
|
203
|
+
# if not os.path.exists(container_path):
|
|
204
|
+
# print('Unpacking Redis image...')
|
|
205
|
+
# subprocess.check_call(['ch-convert', '-i', 'tar', '-o', 'dir',
|
|
206
|
+
# bc.get('DEFAULT', 'redis_image'), container_path])
|
|
207
|
+
if not container_manager.check_container_dir('redis'):
|
|
204
208
|
print('Unpacking Redis image...')
|
|
205
|
-
|
|
206
|
-
|
|
209
|
+
container_manager.create_image('redis')
|
|
210
|
+
|
|
211
|
+
if not container_manager.check_container_dir('neo4j'):
|
|
212
|
+
print('Unpacking Neo4j image...')
|
|
213
|
+
container_manager.create_image('neo4j')
|
|
214
|
+
|
|
215
|
+
@mgr.component('neo4j-database', ('wf_manager',))
|
|
216
|
+
def start_neo4j():
|
|
217
|
+
"""Start the neo4j graph database."""
|
|
218
|
+
return neo4j_manager.start()
|
|
207
219
|
|
|
208
220
|
@mgr.component('redis', ())
|
|
209
|
-
def
|
|
221
|
+
def start_redis():
|
|
210
222
|
"""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
223
|
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)
|
|
224
|
+
return redis_manager.start(log)
|
|
240
225
|
|
|
241
226
|
# Workflow manager and task manager need to be opened with PIPE for their stdout/stderr
|
|
242
227
|
if need_slurmrestd():
|
|
@@ -477,23 +462,6 @@ def stop(query='yes'):
|
|
|
477
462
|
print(f'Beeflow has stopped. Check the log at "{beeflow_log}".')
|
|
478
463
|
|
|
479
464
|
|
|
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
|
|
495
|
-
|
|
496
|
-
|
|
497
465
|
def archive_dir(dir_to_archive):
|
|
498
466
|
"""Archive directories for archive flag in reset."""
|
|
499
467
|
archive_dirs = ['logs', 'container_archive', 'archives', 'workflows']
|
|
@@ -561,9 +529,6 @@ def reset(archive: bool = typer.Option(False, '--archive', '-a',
|
|
|
561
529
|
# Exit out if the user didn't really mean to do a reset
|
|
562
530
|
sys.exit()
|
|
563
531
|
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
532
|
# Stop all of the beeflow processes
|
|
568
533
|
stop("quiet")
|
|
569
534
|
print("Beeflow is shutting down.")
|
|
@@ -301,7 +301,7 @@ VALIDATOR.option('graphdb', 'https_port', default=DEFAULT_HTTPS_PORT,
|
|
|
301
301
|
info='HTTPS port used for the graph database')
|
|
302
302
|
VALIDATOR.option('graphdb', 'gdb_image_mntdir', default=join_path('/tmp', USER),
|
|
303
303
|
info='graph database image mount directory', validator=validation.make_dir)
|
|
304
|
-
VALIDATOR.option('graphdb', 'sleep_time', validator=int, default=
|
|
304
|
+
VALIDATOR.option('graphdb', 'sleep_time', validator=int, default=1,
|
|
305
305
|
info='how long to wait for the graph database to come up (this can take a while, '
|
|
306
306
|
'depending on the system)')
|
|
307
307
|
# Builder
|
|
@@ -10,7 +10,7 @@ class WorkflowInfo:
|
|
|
10
10
|
|
|
11
11
|
def __init__(self, db_file):
|
|
12
12
|
"""Initialize Info and db file."""
|
|
13
|
-
self.Info = namedtuple("Info", "id wfm_port tm_port sched_port num_workflows") # noqa Snake Case
|
|
13
|
+
self.Info = namedtuple("Info", "id wfm_port tm_port sched_port num_workflows bolt_port http_port https_port gdb_pid") # noqa Snake Case
|
|
14
14
|
self.db_file = db_file
|
|
15
15
|
|
|
16
16
|
def set_port(self, component, new_port):
|
|
@@ -22,7 +22,7 @@ class WorkflowInfo:
|
|
|
22
22
|
"""Return port for the specified component."""
|
|
23
23
|
# Need to add code here to make sure we chose a valid component.
|
|
24
24
|
stmt = f"SELECT {component}_port FROM info"
|
|
25
|
-
result = bdb.getone(self.db_file, stmt)
|
|
25
|
+
result = bdb.getone(self.db_file, stmt)[0]
|
|
26
26
|
port = result
|
|
27
27
|
return port
|
|
28
28
|
|
|
@@ -45,6 +45,18 @@ class WorkflowInfo:
|
|
|
45
45
|
info = self.Info(*result)
|
|
46
46
|
return info
|
|
47
47
|
|
|
48
|
+
def get_gdb_pid(self):
|
|
49
|
+
"""Return the gdb pid."""
|
|
50
|
+
stmt = "SELECT gdb_pid FROM info"
|
|
51
|
+
result = bdb.getone(self.db_file, stmt)[0]
|
|
52
|
+
gdb_pid = result
|
|
53
|
+
return gdb_pid
|
|
54
|
+
|
|
55
|
+
def update_gdb_pid(self, gdb_pid):
|
|
56
|
+
"""Update the gdb PID."""
|
|
57
|
+
stmt = "UPDATE info SET gdb_pid=?"
|
|
58
|
+
bdb.run(self.db_file, stmt, [gdb_pid])
|
|
59
|
+
|
|
48
60
|
|
|
49
61
|
class Workflows:
|
|
50
62
|
"""Workflow database object."""
|
|
@@ -53,7 +65,7 @@ class Workflows:
|
|
|
53
65
|
"""Initialize Task, db_file, and Workflow object."""
|
|
54
66
|
self.Task = namedtuple("Task", "id task_id workflow_id name resource state slurm_id") #noqa
|
|
55
67
|
self.db_file = db_file
|
|
56
|
-
self.Workflow = namedtuple("Workflow", "id workflow_id name state run_dir
|
|
68
|
+
self.Workflow = namedtuple("Workflow", "id workflow_id name state run_dir") #noqa
|
|
57
69
|
|
|
58
70
|
def get_workflow(self, workflow_id):
|
|
59
71
|
"""Return a workflow object."""
|
|
@@ -69,13 +81,11 @@ class Workflows:
|
|
|
69
81
|
workflows = [self.Workflow(*workflow) for workflow in result]
|
|
70
82
|
return workflows
|
|
71
83
|
|
|
72
|
-
def init_workflow(self, workflow_id, name, run_dir
|
|
84
|
+
def init_workflow(self, workflow_id, name, run_dir):
|
|
73
85
|
"""Insert a new workflow into the database."""
|
|
74
|
-
stmt = """INSERT INTO workflows (workflow_id, name, state, run_dir
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
bdb.run(self.db_file, stmt, [workflow_id, name, 'Initializing', run_dir,
|
|
78
|
-
bolt_port, http_port, https_port, -1])
|
|
86
|
+
stmt = """INSERT INTO workflows (workflow_id, name, state, run_dir)
|
|
87
|
+
VALUES(?, ?, ?, ?);"""
|
|
88
|
+
bdb.run(self.db_file, stmt, [workflow_id, name, 'Initializing', run_dir])
|
|
79
89
|
|
|
80
90
|
def delete_workflow(self, workflow_id):
|
|
81
91
|
"""Delete a workflow from the database."""
|
|
@@ -123,42 +133,9 @@ class Workflows:
|
|
|
123
133
|
result = bdb.getone(self.db_file, stmt, [task_id, workflow_id])
|
|
124
134
|
return result
|
|
125
135
|
|
|
126
|
-
def get_bolt_port(self, workflow_id):
|
|
127
|
-
"""Return the bolt port associated with a workflow."""
|
|
128
|
-
stmt = "SELECT bolt_port FROM workflows WHERE workflow_id=?"
|
|
129
|
-
result = bdb.getone(self.db_file, stmt, [workflow_id])[0]
|
|
130
|
-
bolt_port = result
|
|
131
|
-
return bolt_port
|
|
132
|
-
|
|
133
|
-
def get_http_port(self, workflow_id):
|
|
134
|
-
"""Return the bolt port associated with a workflow."""
|
|
135
|
-
stmt = "SELECT http_port FROM workflows WHERE workflow_id=?"
|
|
136
|
-
result = bdb.getone(self.db_file, stmt, [workflow_id])[0]
|
|
137
|
-
http_port = result
|
|
138
|
-
return http_port
|
|
139
|
-
|
|
140
|
-
def get_https_port(self, workflow_id):
|
|
141
|
-
"""Return the bolt port associated with a workflow."""
|
|
142
|
-
stmt = "SELECT https_port FROM workflows WHERE workflow_id=?"
|
|
143
|
-
result = bdb.getone(self.db_file, stmt, [workflow_id])[0]
|
|
144
|
-
https_port = result
|
|
145
|
-
return https_port
|
|
146
|
-
|
|
147
|
-
def get_gdb_pid(self, workflow_id):
|
|
148
|
-
"""Return the bolt port associated with a workflow."""
|
|
149
|
-
stmt = "SELECT gdb_pid FROM workflows WHERE workflow_id=?"
|
|
150
|
-
result = bdb.getone(self.db_file, stmt, [workflow_id])[0]
|
|
151
|
-
gdb_pid = result
|
|
152
|
-
return gdb_pid
|
|
153
|
-
|
|
154
|
-
def update_gdb_pid(self, workflow_id, gdb_pid):
|
|
155
|
-
"""Update the gdb PID associated with a workflow."""
|
|
156
|
-
stmt = "UPDATE workflows SET gdb_pid=? WHERE workflow_id=?"
|
|
157
|
-
bdb.run(self.db_file, stmt, [gdb_pid, workflow_id])
|
|
158
|
-
|
|
159
136
|
def get_run_dir(self, workflow_id):
|
|
160
|
-
"""Return the
|
|
161
|
-
stmt = "SELECT run_dir FROM
|
|
137
|
+
"""Return the run directory."""
|
|
138
|
+
stmt = "SELECT run_dir FROM info WHERE workflow_id=?"
|
|
162
139
|
result = bdb.getone(self.db_file, stmt, [workflow_id])[0]
|
|
163
140
|
run_dir = result
|
|
164
141
|
return run_dir
|
|
@@ -180,11 +157,8 @@ class WorkflowDB:
|
|
|
180
157
|
workflow_id INTEGER UNIQUE,
|
|
181
158
|
name TEXT,
|
|
182
159
|
state TEST NOT NULL,
|
|
183
|
-
run_dir STR
|
|
184
|
-
|
|
185
|
-
http_port INTEGER,
|
|
186
|
-
https_port INTEGER,
|
|
187
|
-
gdb_pid INTEGER);"""
|
|
160
|
+
run_dir STR
|
|
161
|
+
);"""
|
|
188
162
|
|
|
189
163
|
tasks_stmt = """CREATE TABLE IF NOT EXISTS tasks (
|
|
190
164
|
id INTEGER PRIMARY KEY,
|
|
@@ -205,7 +179,11 @@ class WorkflowDB:
|
|
|
205
179
|
wfm_port INTEGER,
|
|
206
180
|
tm_port INTEGER,
|
|
207
181
|
sched_port INTEGER,
|
|
208
|
-
num_workflows INTEGER
|
|
182
|
+
num_workflows INTEGER,
|
|
183
|
+
bolt_port INTEGER,
|
|
184
|
+
http_port INTEGER,
|
|
185
|
+
https_port INTEGER,
|
|
186
|
+
gdb_pid INTEGER
|
|
209
187
|
);"""
|
|
210
188
|
|
|
211
189
|
bdb.create_table(self.db_file, workflows_stmt)
|
|
@@ -213,9 +191,9 @@ class WorkflowDB:
|
|
|
213
191
|
if not bdb.table_exists(self.db_file, 'info'):
|
|
214
192
|
bdb.create_table(self.db_file, info_stmt)
|
|
215
193
|
# insert a new workflow into the database
|
|
216
|
-
stmt = """INSERT INTO info (wfm_port, tm_port, sched_port, num_workflows
|
|
217
|
-
|
|
218
|
-
bdb.run(self.db_file, stmt, [-1, -1, -1, 0])
|
|
194
|
+
stmt = """INSERT INTO info (wfm_port, tm_port, sched_port, num_workflows,
|
|
195
|
+
bolt_port, http_port, https_port, gdb_pid) VALUES(?, ?, ?, ?, ?, ?, ?, ?);"""
|
|
196
|
+
bdb.run(self.db_file, stmt, [-1, -1, -1, 0, -1, -1, -1, -1])
|
|
219
197
|
|
|
220
198
|
@property
|
|
221
199
|
def workflows(self):
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
|
|
3
|
+
"""Functions for managing the BEE depency container and associated bind mounts."""
|
|
4
|
+
|
|
5
|
+
import os
|
|
6
|
+
import shutil
|
|
7
|
+
import subprocess
|
|
8
|
+
|
|
9
|
+
from beeflow.common.config_driver import BeeConfig as bc
|
|
10
|
+
from beeflow.common import paths
|
|
11
|
+
from celery import shared_task #noqa pylama can't find celery
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class NoContainerRuntime(Exception):
|
|
15
|
+
"""An exception for no container runtime like charliecloud or singularity."""
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def check_container_runtime():
|
|
19
|
+
"""Check if the container runtime is currently installed."""
|
|
20
|
+
# Needs to support singuarity as well
|
|
21
|
+
if shutil.which("ch-convert") is None or shutil.which("ch-run") is None:
|
|
22
|
+
print("ch-convert or ch-run not found. Charliecloud required"
|
|
23
|
+
" for neo4j container.")
|
|
24
|
+
raise NoContainerRuntime('')
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def make_dep_dir():
|
|
28
|
+
"""Make a new bee dependency container directory."""
|
|
29
|
+
bee_workdir = paths.workdir()
|
|
30
|
+
bee_dir = f'{bee_workdir}/deps'
|
|
31
|
+
bee_dir_exists = os.path.isdir(bee_dir)
|
|
32
|
+
if not bee_dir_exists:
|
|
33
|
+
os.makedirs(bee_dir)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def get_dep_dir():
|
|
37
|
+
"""Return the dependency directory path."""
|
|
38
|
+
bee_workdir = paths.workdir()
|
|
39
|
+
bee_container_dir = f'{bee_workdir}/deps/'
|
|
40
|
+
return bee_container_dir
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def get_container_dir(dep_name):
|
|
44
|
+
"""Return the depency container path."""
|
|
45
|
+
container_name = dep_name + '_container'
|
|
46
|
+
return get_dep_dir() + container_name
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def check_container_dir(dep_name):
|
|
50
|
+
"""Return true if the container directory exists."""
|
|
51
|
+
container_dir = get_container_dir(dep_name)
|
|
52
|
+
container_dir_exists = os.path.isdir(container_dir)
|
|
53
|
+
return container_dir_exists
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def create_image(dep_name):
|
|
57
|
+
"""Create a new BEE dependency container if one does not exist.
|
|
58
|
+
|
|
59
|
+
By default, the container is stored in /tmp/<user>/beeflow/deps.
|
|
60
|
+
"""
|
|
61
|
+
# Can throw an exception that needs to be handled by the caller
|
|
62
|
+
check_container_runtime()
|
|
63
|
+
|
|
64
|
+
image = bc.get('DEFAULT', dep_name + '_image')
|
|
65
|
+
|
|
66
|
+
# Check for BEE dependency container directory:
|
|
67
|
+
container_dir_exists = check_container_dir(dep_name)
|
|
68
|
+
if container_dir_exists:
|
|
69
|
+
print(f"Already have {dep_name} container")
|
|
70
|
+
return
|
|
71
|
+
|
|
72
|
+
make_dep_dir()
|
|
73
|
+
container_dir = get_container_dir(dep_name)
|
|
74
|
+
|
|
75
|
+
# Build new dependency container
|
|
76
|
+
try:
|
|
77
|
+
subprocess.run(["ch-convert", "-i", "tar", "-o", "dir",
|
|
78
|
+
str(image), str(container_dir)], check=True)
|
|
79
|
+
except subprocess.CalledProcessError as error:
|
|
80
|
+
print(f"ch-convert failed: {error}")
|
|
81
|
+
shutil.rmtree(container_dir)
|
|
82
|
+
print(f"{dep_name} container mount directory {container_dir} removed")
|
|
83
|
+
return
|
|
84
|
+
|
|
85
|
+
# If neo4j, make the certificates directory
|
|
86
|
+
if dep_name == 'neo4j':
|
|
87
|
+
container_certs_path = os.path.join(container_dir, 'var/lib/neo4j/certificates')
|
|
88
|
+
os.makedirs(container_certs_path, exist_ok=True)
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"""Contains methods for managing neo4j instance."""
|
|
2
|
+
import socket
|
|
3
|
+
import os
|
|
4
|
+
import shutil
|
|
5
|
+
import re
|
|
6
|
+
import subprocess
|
|
7
|
+
import time
|
|
8
|
+
|
|
9
|
+
from beeflow.wf_manager.resources import wf_utils
|
|
10
|
+
from beeflow.common.db import wfm_db
|
|
11
|
+
|
|
12
|
+
from beeflow.common import paths
|
|
13
|
+
from beeflow.common.deps import container_manager
|
|
14
|
+
|
|
15
|
+
from beeflow.common.config_driver import BeeConfig as bc
|
|
16
|
+
from beeflow.common import log as bee_logging
|
|
17
|
+
|
|
18
|
+
# Define directories within module scope
|
|
19
|
+
bee_workdir = paths.workdir()
|
|
20
|
+
mount_dir = os.path.join(bee_workdir, 'gdb_mount')
|
|
21
|
+
data_dir = mount_dir + '/data'
|
|
22
|
+
logs_dir = mount_dir + '/logs'
|
|
23
|
+
run_dir = mount_dir + '/run'
|
|
24
|
+
certs_dir = mount_dir + '/certificates'
|
|
25
|
+
confs_dir = mount_dir + "/conf"
|
|
26
|
+
container_path = container_manager.get_container_dir('neo4j')
|
|
27
|
+
log = bee_logging.setup('neo4j')
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def get_open_port():
|
|
31
|
+
"""Return an open ephemeral port."""
|
|
32
|
+
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
33
|
+
s.bind(("", 0))
|
|
34
|
+
s.listen(1)
|
|
35
|
+
port = s.getsockname()[1]
|
|
36
|
+
s.close()
|
|
37
|
+
return port
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def setup_ports():
|
|
41
|
+
"""Return three open ports for bolt, http, https."""
|
|
42
|
+
# Get ports for neo4j to run
|
|
43
|
+
bolt_port = get_open_port()
|
|
44
|
+
http_port = get_open_port()
|
|
45
|
+
https_port = get_open_port()
|
|
46
|
+
|
|
47
|
+
db = wf_utils.connect_db(wfm_db, wf_utils.get_db_path())
|
|
48
|
+
|
|
49
|
+
db.info.set_port('bolt', bolt_port)
|
|
50
|
+
db.info.set_port('http', http_port)
|
|
51
|
+
db.info.set_port('https', https_port)
|
|
52
|
+
return bolt_port, http_port, https_port
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def setup_mounts():
|
|
56
|
+
"""Set up mount directories for the graph database."""
|
|
57
|
+
os.makedirs(data_dir, exist_ok=True)
|
|
58
|
+
os.makedirs(logs_dir, exist_ok=True)
|
|
59
|
+
os.makedirs(mount_dir, exist_ok=True)
|
|
60
|
+
os.makedirs(certs_dir, exist_ok=True)
|
|
61
|
+
os.makedirs(run_dir, exist_ok=True)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def setup_configs(bolt_port, http_port, https_port):
|
|
65
|
+
"""Set up GDB configuration.
|
|
66
|
+
|
|
67
|
+
This function needs to be run before each new invocation since the
|
|
68
|
+
config file could have changed.
|
|
69
|
+
"""
|
|
70
|
+
os.makedirs(confs_dir, exist_ok=True)
|
|
71
|
+
gdb_configfile = shutil.copyfile(container_path + "/var/lib/neo4j/conf/neo4j.conf",
|
|
72
|
+
confs_dir + "/neo4j.conf")
|
|
73
|
+
log.info(gdb_configfile)
|
|
74
|
+
|
|
75
|
+
with open(gdb_configfile, "rt", encoding="utf8") as cfile:
|
|
76
|
+
data = cfile.read()
|
|
77
|
+
|
|
78
|
+
log.info(f"new bolt: {bolt_port}")
|
|
79
|
+
bolt_config = r'#(server.bolt.listen_address=):[0-9]*'
|
|
80
|
+
data = re.sub(bolt_config, rf'\1:{bolt_port}', data)
|
|
81
|
+
http_config = r'#(server.http.listen_address=):[0-9]*'
|
|
82
|
+
data = re.sub(http_config, rf'\1:{http_port}', data)
|
|
83
|
+
https_config = r'#(server.https.listen_address=):[0-9]*'
|
|
84
|
+
data = re.sub(https_config, rf'\1:{https_port}', data)
|
|
85
|
+
|
|
86
|
+
with open(gdb_configfile, "wt", encoding="utf8") as cfile:
|
|
87
|
+
cfile.write(data)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def create_credentials():
|
|
91
|
+
"""Create the password and set the logfiles in environment."""
|
|
92
|
+
db_password = bc.get('graphdb', 'dbpass')
|
|
93
|
+
try:
|
|
94
|
+
command = ['neo4j-admin', 'dbms', 'set-initial-password', str(db_password)]
|
|
95
|
+
subprocess.run([
|
|
96
|
+
"ch-run",
|
|
97
|
+
"--set-env=" + container_path + "/ch/environment",
|
|
98
|
+
"-b", confs_dir + ":/var/lib/neo4j/conf",
|
|
99
|
+
"-b", data_dir + ":/data",
|
|
100
|
+
"-b", logs_dir + ":/logs",
|
|
101
|
+
"-b", run_dir + ":/var/lib/neo4j/run", container_path,
|
|
102
|
+
"--", *command
|
|
103
|
+
], check=True)
|
|
104
|
+
except subprocess.CalledProcessError:
|
|
105
|
+
log.error("neo4j-admin set-initial-password failed")
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def create_database():
|
|
109
|
+
"""Create the neo4j database and return the process."""
|
|
110
|
+
try:
|
|
111
|
+
command = ['neo4j', 'console']
|
|
112
|
+
proc = subprocess.Popen([ #noqa can't use with because returning
|
|
113
|
+
"ch-run",
|
|
114
|
+
"--set-env=" + container_path + "/ch/environment",
|
|
115
|
+
"-b", confs_dir + ":/var/lib/neo4j/conf",
|
|
116
|
+
"-b", data_dir + ":/data",
|
|
117
|
+
"-b", logs_dir + ":/logs",
|
|
118
|
+
"-b", run_dir + ":/var/lib/neo4j/run",
|
|
119
|
+
"-b", certs_dir + ":/var/lib/neo4j/certificates",
|
|
120
|
+
container_path, "--", *command
|
|
121
|
+
], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
|
122
|
+
wait_gdb()
|
|
123
|
+
return proc
|
|
124
|
+
|
|
125
|
+
except FileNotFoundError:
|
|
126
|
+
log.error("Neo4j failed to start.")
|
|
127
|
+
return -1
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def start():
|
|
131
|
+
"""Start the graph database."""
|
|
132
|
+
log.info('Starting Neo4j Database')
|
|
133
|
+
|
|
134
|
+
bolt_port, http_port, https_port = setup_ports()
|
|
135
|
+
|
|
136
|
+
setup_configs(bolt_port, http_port, https_port)
|
|
137
|
+
|
|
138
|
+
setup_mounts()
|
|
139
|
+
|
|
140
|
+
create_credentials()
|
|
141
|
+
|
|
142
|
+
return create_database()
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def wait_gdb():
|
|
146
|
+
"""Need to wait for the GDB. Currently, we're using the sleep time paramater.
|
|
147
|
+
|
|
148
|
+
We'd like to remove that in the future.
|
|
149
|
+
"""
|
|
150
|
+
gdb_sleep_time = bc.get('graphdb', 'sleep_time')
|
|
151
|
+
print(f'waiting {gdb_sleep_time}s for GDB to come up')
|
|
152
|
+
time.sleep(gdb_sleep_time)
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def remove_gdb():
|
|
156
|
+
"""Remove the current GDB bind mount directory."""
|
|
157
|
+
gdb_workdir = os.path.join(bee_workdir, 'current_gdb')
|
|
158
|
+
old_gdb_workdir = os.path.join(bee_workdir, 'old_gdb')
|
|
159
|
+
if os.path.isdir(gdb_workdir):
|
|
160
|
+
# Rename the directory to guard against NFS errors
|
|
161
|
+
shutil.move(gdb_workdir, old_gdb_workdir)
|
|
162
|
+
time.sleep(2)
|
|
163
|
+
shutil.rmtree(old_gdb_workdir)
|
|
164
|
+
time.sleep(2)
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"""Module contains the code for launching redis subprocess."""
|
|
2
|
+
import os
|
|
3
|
+
import subprocess
|
|
4
|
+
|
|
5
|
+
from beeflow.common import paths
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def start(log):
|
|
9
|
+
"""Start redis."""
|
|
10
|
+
data_dir = 'data'
|
|
11
|
+
os.makedirs(os.path.join(paths.redis_root(), data_dir), exist_ok=True)
|
|
12
|
+
conf_name = 'redis.conf'
|
|
13
|
+
container_path = paths.redis_container()
|
|
14
|
+
# Dump the config
|
|
15
|
+
conf_path = os.path.join(paths.redis_root(), conf_name)
|
|
16
|
+
if not os.path.exists(conf_path):
|
|
17
|
+
with open(conf_path, 'w', encoding='utf-8') as fp:
|
|
18
|
+
# Don't listen on TCP
|
|
19
|
+
print('port 0', file=fp)
|
|
20
|
+
print('dir', os.path.join('/mnt', data_dir), file=fp)
|
|
21
|
+
print('maxmemory 2mb', file=fp)
|
|
22
|
+
print('unixsocket', os.path.join('/mnt', paths.redis_sock_fname()), file=fp)
|
|
23
|
+
print('unixsocketperm 700', file=fp)
|
|
24
|
+
cmd = [
|
|
25
|
+
'ch-run',
|
|
26
|
+
f'--bind={paths.redis_root()}:/mnt',
|
|
27
|
+
container_path,
|
|
28
|
+
'redis-server',
|
|
29
|
+
'/mnt/redis.conf',
|
|
30
|
+
]
|
|
31
|
+
# Ran into a strange "Failed to configure LOCALE for invalid locale name."
|
|
32
|
+
# from Redis, so setting LANG=C. This could have consequences for UTF-8
|
|
33
|
+
# strings.
|
|
34
|
+
env = dict(os.environ)
|
|
35
|
+
env['LANG'] = 'C'
|
|
36
|
+
env['LC_ALL'] = 'C'
|
|
37
|
+
return subprocess.Popen(cmd, env=env, stdout=log, stderr=log)
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Graph Database Design
|
|
2
|
+
|
|
3
|
+
## Basics
|
|
4
|
+
|
|
5
|
+
A Neo4j graph consists of nodes and relationships. Nodes can have labels (e.g. `:Label`) and properties (name value pairs like `name = "Pat"`). Relationships have a type (e.g. `:DEPENDS_ON`) and properties. Property values can be `number`, `string`, `boolean`, spatial (only `Point`), temporal (e.g. `Time`, `Date`, `Duration`), or composite types of the previous types (e.g. lists and maps).
|
|
6
|
+
|
|
7
|
+
## BEE Workflow Graph Entities
|
|
8
|
+
|
|
9
|
+
A BEE workflow is a DAG (currently implemented in Neo4j) that represents a workflow originally specified in a CWL (Common Workflow Language) file. The fundamental structure of the workflow is based on `Task` nodes and `DEPENDS_ON` relationships. There are other nodes and relationships that are used to represent other properties of the workflow such as `Metadata`, `Requirements`, `Hints`, `Inputs`, `Outputs`, etc. BEE's nodes, relationships, and properties are documented below.
|
|
10
|
+
|
|
11
|
+
## List of Node Types
|
|
12
|
+
* Listed edges are **outgoing**. Nodes are english cased, edges are all caps.
|
|
13
|
+
|
|
14
|
+
### `:BEE`
|
|
15
|
+
* This is the head node to the Graph Database. All `:Workflow` nodes point to this head. Only one such node exists in the graph database.
|
|
16
|
+
* `name`: Is always named "Head"
|
|
17
|
+
|
|
18
|
+
### `:Workflow`
|
|
19
|
+
* Node representing a workflow
|
|
20
|
+
* `id`: unique ID for a workflow in this database
|
|
21
|
+
* `name`: name of workflow as a string
|
|
22
|
+
* `state`: state of entire workflow
|
|
23
|
+
- See `states,py` for more information
|
|
24
|
+
* `:WORKFLOW_OF`: Edge between from `:Workflow` to `:BEE` node to denote workflows of a BEE instance
|
|
25
|
+
|
|
26
|
+
### `:Task`
|
|
27
|
+
* Node representing a single task in a workflow
|
|
28
|
+
* `id`: unique ID for every task in workflow
|
|
29
|
+
* `workflow_id`: `id` of the workflow the task belongs to
|
|
30
|
+
* `name`: name of task as a string
|
|
31
|
+
* `base_command`: command (and parameters) to be executed
|
|
32
|
+
* `stdout`: command output location for task
|
|
33
|
+
* `stdin`: error output location for task
|
|
34
|
+
* `:BEGINS`: Edge from `:Task` to `:Workflow` node to indicate using an input parameter from the workflow
|
|
35
|
+
* `:DEPENDS_ON`: Edge from a `:Task`(1) to a `:Task`(2). (2) must be completed before (1) can be submitted to the task manager. `:DEPENDS_ON` relationships are deduced by parsing CWL.
|
|
36
|
+
|
|
37
|
+
### `:Input`
|
|
38
|
+
* Node that contains information for an input either to a workflow or task
|
|
39
|
+
* `id`: Moniker for input
|
|
40
|
+
* `type` Type of input (e.g File, string)
|
|
41
|
+
* `value` Value of input
|
|
42
|
+
* `:INPUT_OF`: Edge from `:Input` to either `:Task` or `:Workflow` node to indicate being an input to the workflow or task
|
|
43
|
+
#### IF `:Input` node is `:INPUT_OF` a `:Task` node:
|
|
44
|
+
* `position`: Serial number for multiple inputs
|
|
45
|
+
* `source`:
|
|
46
|
+
|
|
47
|
+
### `:Output`
|
|
48
|
+
* Node that contains information for an output either from a workflow or task
|
|
49
|
+
* `id`: Moniker for output
|
|
50
|
+
* `type` Type of output (e.g File, string)
|
|
51
|
+
* `value` Value of output
|
|
52
|
+
* `:OUTPUT_OF`: Edge from `:Output` to either `:Task` or `:Workflow` node to indicate being an output of the task or workflow.
|
|
53
|
+
#### If `:Output` node is `:OUTPUT_OF` a `:Workflow` node:
|
|
54
|
+
* `source`:
|
|
55
|
+
#### IF `:Output` node is `:OUTPUT_OF` a `:Task` node:
|
|
56
|
+
* `glob`:
|
|
57
|
+
|
|
58
|
+
### `:Hint`
|
|
59
|
+
* Node specifying hints (optional parameters) for a task or workflow
|
|
60
|
+
* `params`: Array of hint parameters for workflow or task
|
|
61
|
+
* `:HINT_OF`: Edge from `:Hint` to either `:Task` or `:Workflow` node to indicate being a hint of task or workflow
|
|
62
|
+
|
|
63
|
+
### `:Requirement`
|
|
64
|
+
* Node specifying requirements (mandatory parameters) for a task or workflow
|
|
65
|
+
* `params`: Array of requirement parameters for workflow or task
|
|
66
|
+
* `:REQUIREMENT_OF`: Edge from `:Requirement` to either`:Task` or `:Workflow` node to indicate being a requirement of task or workflow
|
|
67
|
+
|
|
68
|
+
### `Metadata`
|
|
69
|
+
* Contains state of task in workflow
|
|
70
|
+
* `state`: State of the task being described (defaults to `WAITING`)
|
|
71
|
+
* :DESCRIBES`: edge to the `:Task` node whose metadata is being described
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
|
|
@@ -284,17 +284,6 @@ class GraphDatabaseDriver(ABC):
|
|
|
284
284
|
:rtype: bool
|
|
285
285
|
"""
|
|
286
286
|
|
|
287
|
-
@abstractmethod
|
|
288
|
-
def empty(self):
|
|
289
|
-
"""Determine if the database is empty.
|
|
290
|
-
|
|
291
|
-
:rtype: bool
|
|
292
|
-
"""
|
|
293
|
-
|
|
294
|
-
@abstractmethod
|
|
295
|
-
def cleanup(self):
|
|
296
|
-
"""Clean up all the data stored in the graph database."""
|
|
297
|
-
|
|
298
287
|
@abstractmethod
|
|
299
288
|
def close(self):
|
|
300
289
|
"""Close the connection to the graph database."""
|