hpc-beeflow 0.1.9.dev4__tar.gz → 0.1.10.dev1__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.
Files changed (309) hide show
  1. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/PKG-INFO +11 -5
  2. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/README.rst +1 -0
  3. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/client/bee_client.py +190 -37
  4. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/client/core.py +87 -20
  5. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/config_driver.py +197 -98
  6. hpc_beeflow-0.1.10.dev1/beeflow/common/config_utils.py +42 -0
  7. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/config_validator.py +3 -1
  8. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/crt/charliecloud_driver.py +19 -12
  9. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/cwl/cwl.py +136 -52
  10. hpc_beeflow-0.1.10.dev1/beeflow/common/cwl/examples/Dockerfile.comd-x86_64 +78 -0
  11. hpc_beeflow-0.1.10.dev1/beeflow/common/cwl/examples/README.txt +51 -0
  12. hpc_beeflow-0.1.10.dev1/beeflow/common/cwl/examples/cat_grep_tar.py +48 -0
  13. hpc_beeflow-0.1.10.dev1/beeflow/common/cwl/examples/comd.py +43 -0
  14. hpc_beeflow-0.1.10.dev1/beeflow/common/cwl/examples/comd_driver.py +82 -0
  15. hpc_beeflow-0.1.10.dev1/beeflow/common/cwl/workflow.py +172 -0
  16. hpc_beeflow-0.1.10.dev1/beeflow/common/db/client_db.py +67 -0
  17. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/deps/neo4j_manager.py +71 -31
  18. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/gdb/gdb_driver.py +15 -1
  19. hpc_beeflow-0.1.10.dev1/beeflow/common/gdb/generate_graph.py +114 -0
  20. hpc_beeflow-0.1.10.dev1/beeflow/common/gdb/graphml_key_updater.py +71 -0
  21. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/gdb/neo4j_cypher.py +72 -13
  22. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/gdb/neo4j_driver.py +21 -3
  23. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/integration_test.py +2 -0
  24. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/paths.py +11 -0
  25. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/wf_interface.py +13 -2
  26. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/worker/slurm_worker.py +20 -8
  27. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/worker/utils.py +19 -0
  28. hpc_beeflow-0.1.10.dev1/beeflow/data/cwl/bee_workflows/cat-grep-fail/lorem.txt +49 -0
  29. hpc_beeflow-0.1.10.dev1/beeflow/data/dockerfiles/Dockerfile.neo4j +2 -0
  30. hpc_beeflow-0.1.10.dev1/beeflow/remote/remote.py +161 -0
  31. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/task_manager/utils.py +4 -2
  32. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/tests/mocks.py +8 -3
  33. hpc_beeflow-0.1.10.dev1/beeflow/tests/test_charliecloud_driver.py +70 -0
  34. hpc_beeflow-0.1.10.dev1/beeflow/tests/test_config_driver.py +166 -0
  35. hpc_beeflow-0.1.10.dev1/beeflow/tests/test_config_utils.py +114 -0
  36. hpc_beeflow-0.1.10.dev1/beeflow/tests/test_db_client.py +43 -0
  37. hpc_beeflow-0.1.10.dev1/beeflow/tests/test_neo4j_cypher.py +56 -0
  38. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/tests/test_slurm_worker.py +10 -5
  39. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/tests/test_wf_interface.py +31 -14
  40. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/tests/test_wf_manager.py +1 -0
  41. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/wf_manager/resources/wf_actions.py +8 -1
  42. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/wf_manager/resources/wf_list.py +12 -15
  43. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/wf_manager/resources/wf_update.py +15 -5
  44. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/wf_manager/resources/wf_utils.py +26 -14
  45. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/wf_manager/wf_manager.py +0 -2
  46. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/pyproject.toml +8 -4
  47. hpc_beeflow-0.1.9.dev4/beeflow/common/cwl/examples/cat_grep_tar_driver.py +0 -75
  48. hpc_beeflow-0.1.9.dev4/beeflow/common/cwl/examples/comd_driver.py +0 -50
  49. hpc_beeflow-0.1.9.dev4/beeflow/data/dockerfiles/Dockerfile.neo4j-ppc64le +0 -42
  50. hpc_beeflow-0.1.9.dev4/beeflow/wf_manager/resources/wf_metadata.py +0 -18
  51. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/LICENSE +0 -0
  52. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/client/README.md +0 -0
  53. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/cloud_launcher.py +0 -0
  54. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/README.md +0 -0
  55. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/api.py +0 -0
  56. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/build/README.md +0 -0
  57. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/build/build_driver.py +0 -0
  58. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/build/container_drivers.py +0 -0
  59. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/build/utils.py +0 -0
  60. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/build_interfaces.py +0 -0
  61. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/cli.py +0 -0
  62. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/cli_connection.py +0 -0
  63. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/cloud/README.md +0 -0
  64. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/cloud/__init__.py +0 -0
  65. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/cloud/chameleoncloud.py +0 -0
  66. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/cloud/cloud.py +0 -0
  67. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/cloud/constants.py +0 -0
  68. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/cloud/google.py +0 -0
  69. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/cloud/openstack.py +0 -0
  70. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/cloud/provider.py +0 -0
  71. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/connection.py +0 -0
  72. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/container_path.py +0 -0
  73. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/crt/crt_driver.py +0 -0
  74. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/crt/singularity_driver.py +0 -0
  75. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/crt_interface.py +0 -0
  76. {hpc_beeflow-0.1.9.dev4/beeflow/data/cwl/bee_workflows/cat-grep-fail → hpc_beeflow-0.1.10.dev1/beeflow/common/cwl/examples}/lorem.txt +0 -0
  77. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/db/bdb.py +0 -0
  78. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/db/sched_db.py +0 -0
  79. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/db/tm_db.py +0 -0
  80. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/db/wfm_db.py +0 -0
  81. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/deps/celery_manager.py +0 -0
  82. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/deps/container_manager.py +0 -0
  83. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/deps/redis_manager.py +0 -0
  84. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/expr.py +0 -0
  85. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/gdb/DESIGN.md +0 -0
  86. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/integration/generated_workflows.py +0 -0
  87. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/integration/utils.py +0 -0
  88. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/log.py +0 -0
  89. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/parser/.gitignore +0 -0
  90. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/parser/README.md +0 -0
  91. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/parser/__init__.py +0 -0
  92. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/parser/parser.py +0 -0
  93. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/states.py +0 -0
  94. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/tab_completion.py +0 -0
  95. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/validation.py +0 -0
  96. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/wf_data.py +0 -0
  97. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/wf_profiler.py +0 -0
  98. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/worker/README.md +0 -0
  99. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/worker/__init__.py +0 -0
  100. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/worker/flux_worker.py +0 -0
  101. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/worker/lsf_worker.py +0 -0
  102. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/worker/simple_worker.py +0 -0
  103. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/worker/worker.py +0 -0
  104. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/common/worker_interface.py +0 -0
  105. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cloud_templates/dora.jinja +0 -0
  106. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cloud_templates/dora.yaml +0 -0
  107. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/README.md +0 -0
  108. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/README.md +0 -0
  109. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/blast/README.md +0 -0
  110. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/blast/blast.yml +0 -0
  111. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/blast/blast_output.cwl +0 -0
  112. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/blast/blast_output_err.cwl +0 -0
  113. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/blast/blast_split.cwl +0 -0
  114. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/blast/blast_wf.cwl +0 -0
  115. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/blast/blast_worker001.cwl +0 -0
  116. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/blast/blast_worker002.cwl +0 -0
  117. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/blast/input/small.fasta +0 -0
  118. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/cat-grep-fail/README.md +0 -0
  119. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/cat-grep-fail/cat.cwl +0 -0
  120. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/cat-grep-fail/grep0.cwl +0 -0
  121. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/cat-grep-fail/grep1.cwl +0 -0
  122. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/cat-grep-fail/input.yml +0 -0
  123. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/cat-grep-fail/tar.cwl +0 -0
  124. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/cat-grep-fail/workflow.cwl +0 -0
  125. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-ci/README.md +0 -0
  126. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-ci/clamr.cwl +0 -0
  127. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-ci/clamr_job.json +0 -0
  128. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-ci/clamr_job.yml +0 -0
  129. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-ci/clamr_wf.cwl +0 -0
  130. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-ci/ffmpeg.cwl +0 -0
  131. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-build_script/Dockerfile.clamr-ffmpeg +0 -0
  132. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-build_script/README.md +0 -0
  133. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-build_script/clamr.cwl +0 -0
  134. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-build_script/clamr_job.json +0 -0
  135. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-build_script/clamr_job.yml +0 -0
  136. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-build_script/clamr_wf.cwl +0 -0
  137. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-build_script/ffmpeg.cwl +0 -0
  138. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-build_script/post_run.sh +0 -0
  139. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-build_script/pre_run.sh +0 -0
  140. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-validate_script/Dockerfile.clamr-ffmpeg +0 -0
  141. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-validate_script/README.md +0 -0
  142. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-validate_script/clamr.cwl +0 -0
  143. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-validate_script/clamr_job.json +0 -0
  144. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-validate_script/clamr_job.yml +0 -0
  145. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-validate_script/clamr_wf.cwl +0 -0
  146. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-validate_script/ffmpeg.cwl +0 -0
  147. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-validate_script/post_run.sh +0 -0
  148. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-ffmpeg-validate_script/pre_run.sh +0 -0
  149. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf/README.md +0 -0
  150. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf/clamr.cwl +0 -0
  151. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf/clamr_job.json +0 -0
  152. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf/clamr_job.yml +0 -0
  153. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf/clamr_wf.cwl +0 -0
  154. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf/ffmpeg.cwl +0 -0
  155. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/README.md +0 -0
  156. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/clamr.cwl +0 -0
  157. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/clamr_job.json +0 -0
  158. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/clamr_job.yml +0 -0
  159. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/clamr_wf.cwl +0 -0
  160. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/ffmpeg.cwl +0 -0
  161. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/README.md +0 -0
  162. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/lsf-charliecloud/README.md +0 -0
  163. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/lsf-charliecloud/cf-summit.cwl +0 -0
  164. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/Dockerfile.clamr-lanl-x86_64 +0 -0
  165. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/README.md +0 -0
  166. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/cf-darwin.cwl +0 -0
  167. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/cf-no-owrite.cwl +0 -0
  168. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/cf.cwl +0 -0
  169. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/copyContainer_containerName.cwl +0 -0
  170. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/dockerFile_containerName.cwl +0 -0
  171. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/dockerPull.cwl +0 -0
  172. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-singularity/README.md +0 -0
  173. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-singularity/cf-singularity.cwl +0 -0
  174. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf-singularity/README.md +0 -0
  175. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf-singularity/clamr.cwl +0 -0
  176. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf-singularity/clamr_job.json +0 -0
  177. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf-singularity/clamr_job.yml +0 -0
  178. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf-singularity/clamr_wf.cwl +0 -0
  179. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf-singularity/ffmpeg.cwl +0 -0
  180. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf-summit/README.md +0 -0
  181. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf-summit/clamr.cwl +0 -0
  182. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf-summit/clamr_job.json +0 -0
  183. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf-summit/clamr_job.yml +0 -0
  184. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf-summit/clamr_wf.cwl +0 -0
  185. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf-summit/ffmpeg.cwl +0 -0
  186. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf-use-container/README.md +0 -0
  187. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf-use-container/clamr.cwl +0 -0
  188. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf-use-container/clamr_job.json +0 -0
  189. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf-use-container/clamr_job.yml +0 -0
  190. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf-use-container/clamr_wf.cwl +0 -0
  191. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/clamr-wf-use-container/ffmpeg.cwl +0 -0
  192. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/lulesh-mpi/lulesh.cwl +0 -0
  193. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/lulesh-mpi/lulesh.yml +0 -0
  194. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/lulesh-mpi-multi-file/lulesh.cwl +0 -0
  195. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/lulesh-mpi-multi-file/lulesh_job.yml +0 -0
  196. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/lulesh-mpi-multi-file/lulesh_wf.cwl +0 -0
  197. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/nwchem-mpi/README.md +0 -0
  198. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/nwchem-mpi/nwchem.cwl +0 -0
  199. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/nwchem-mpi/nwchem.yml +0 -0
  200. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/nwchem-mpi/nwchem_bin.cwl +0 -0
  201. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/pennant/graph.cwl +0 -0
  202. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/pennant/pennant.yml +0 -0
  203. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/pennant/pennant_1_node.cwl +0 -0
  204. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/pennant/pennant_2_node.cwl +0 -0
  205. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/pennant/pennant_4_node.cwl +0 -0
  206. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/pennant/pennant_wf.cwl +0 -0
  207. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/pennant-build/Dockerfile.pennant-flux-x86_64 +0 -0
  208. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/pennant-build/Dockerfile.pennant-graph-x86_64 +0 -0
  209. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/pennant-build/graph.cwl +0 -0
  210. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/pennant-build/graph_pennant.py +0 -0
  211. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/pennant-build/graph_pennant.sh +0 -0
  212. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/pennant-build/pennant.yml +0 -0
  213. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/pennant-build/pennant_1_node.cwl +0 -0
  214. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/pennant-build/pennant_2_node.cwl +0 -0
  215. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/pennant-build/pennant_4_node.cwl +0 -0
  216. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/pennant-build/pennant_8_node.cwl +0 -0
  217. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/pennant-build/pennant_wf.cwl +0 -0
  218. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/pytest.ini +0 -0
  219. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/simple-workflows/README.md +0 -0
  220. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/simple-workflows/cancel.cwl +0 -0
  221. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/simple-workflows/grep-wordcount/README.md +0 -0
  222. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/simple-workflows/grep-wordcount/gc-nc.cwl +0 -0
  223. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/simple-workflows/grep-wordcount/gc.cwl +0 -0
  224. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/bee_workflows/simple-workflows/grep-wordcount/lorem.txt +0 -0
  225. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/cwl_validation/README.md +0 -0
  226. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/cwl_validation/builder/dockerFile.cwl +0 -0
  227. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/cwl_validation/builder/dockerPull.cwl +0 -0
  228. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/cwl_validation/grep-wordcount/gc.cwl +0 -0
  229. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/cwl_validation/grep-wordcount/lorem.txt +0 -0
  230. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/cwl_validation/helloworld.cwl +0 -0
  231. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/cwl_validation/helloworld_input.yaml +0 -0
  232. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/cwl_validation/ml-workflow/example-1/DAG_example-1.png +0 -0
  233. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/cwl_validation/ml-workflow/example-1/README.md +0 -0
  234. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/cwl_validation/ml-workflow/example-1/add.cwl +0 -0
  235. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/cwl_validation/ml-workflow/example-1/add_multiply_example_workflow.cwl +0 -0
  236. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/cwl_validation/ml-workflow/example-1/add_step1.py +0 -0
  237. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/cwl_validation/ml-workflow/example-1/isolated test.cwl +0 -0
  238. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/cwl_validation/ml-workflow/example-1/job.yaml +0 -0
  239. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/cwl_validation/ml-workflow/example-1/multiply.cwl +0 -0
  240. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/cwl_validation/ml-workflow/example-1/multiply_step2.py +0 -0
  241. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/cwl_validation/ml-workflow/example-1/workflow_generater_python.py +0 -0
  242. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/README.md +0 -0
  243. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/decision_tree.py +0 -0
  244. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/decision_tree_output.txt +0 -0
  245. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/decision_tree_tool.cwl +0 -0
  246. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/expectedValue.txt +0 -0
  247. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/hiring1.txt +0 -0
  248. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/linear_regress_output.txt +0 -0
  249. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/linear_regression.py +0 -0
  250. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/machinelearning_pipeline.cwl +0 -0
  251. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/out.PNG +0 -0
  252. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/predict_code.py +0 -0
  253. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/predict_tool.cwl +0 -0
  254. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/read_dataset.py +0 -0
  255. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/read_dataset_tool.cwl +0 -0
  256. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/cwl/cwl_validation/ml-workflow/machine_learning/regress_tool.cwl +0 -0
  257. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/dockerfiles/Dockerfile.builder_demo +0 -0
  258. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/dockerfiles/Dockerfile.clamr-ffmpeg +0 -0
  259. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/dockerfiles/Dockerfile.clamr-lanl-x86_64 +0 -0
  260. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/dockerfiles/Dockerfile.clamr-ppc64le +0 -0
  261. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/dockerfiles/Dockerfile.comd-flux-x86_64 +0 -0
  262. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/dockerfiles/Dockerfile.deb9ompi-x86_64 +0 -0
  263. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/dockerfiles/Dockerfile.lulesh-x86_64 +0 -0
  264. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/dockerfiles/Dockerfile.nwchem-x86_64 +0 -0
  265. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/dockerfiles/Dockerfile.pennant-flux-x86_64 +0 -0
  266. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/dockerfiles/Dockerfile.vaspompi-x86_64 +0 -0
  267. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/dockerfiles/README.md +0 -0
  268. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/dockerfiles/comd-pmix-support/Dockerfile.comd-x86_64-wpmix +0 -0
  269. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/dockerfiles/comd-pmix-support/Dockerfile.debian +0 -0
  270. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/dockerfiles/comd-pmix-support/Dockerfile.openmpi-3.1.5 +0 -0
  271. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/dockerfiles/comd-pmix-support/README.md +0 -0
  272. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/dockerfiles/comd-pmix-support/dont-init-ucx-on-intel-cray.patch +0 -0
  273. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/dockerfiles/pennant-graph/Dockerfile.pennant-graph-x86_64 +0 -0
  274. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/dockerfiles/pennant-graph/graph_pennant.py +0 -0
  275. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/data/dockerfiles/pennant-graph/graph_pennant.sh +0 -0
  276. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/scheduler/README.md +0 -0
  277. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/scheduler/algorithms.py +0 -0
  278. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/scheduler/resource_allocation.py +0 -0
  279. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/scheduler/scheduler.py +0 -0
  280. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/scheduler/scheduler.yaml +0 -0
  281. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/scheduler/serializable.py +0 -0
  282. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/scheduler/task.py +0 -0
  283. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/task_manager/background.py +0 -0
  284. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/task_manager/task_actions.py +0 -0
  285. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/task_manager/task_manager.py +0 -0
  286. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/task_manager/task_submit.py +0 -0
  287. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/tests/42.tgz +0 -0
  288. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/tests/README.md +0 -0
  289. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/tests/cf.cwl +0 -0
  290. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/tests/clamr-wf/clamr.cwl +0 -0
  291. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/tests/clamr-wf/clamr_job.json +0 -0
  292. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/tests/clamr-wf/clamr_job.yml +0 -0
  293. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/tests/clamr-wf/clamr_wf.cwl +0 -0
  294. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/tests/clamr-wf/ffmpeg.cwl +0 -0
  295. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/tests/clamr-wf/mv_script.cwl +0 -0
  296. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/tests/clamr-wf/mv_script.sh +0 -0
  297. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/tests/clamr-wf.tgz +0 -0
  298. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/tests/gdb.py +0 -0
  299. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/tests/test_cloud.py +0 -0
  300. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/tests/test_config_validator.py +0 -0
  301. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/tests/test_container_path.py +0 -0
  302. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/tests/test_db_sched.py +0 -0
  303. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/tests/test_db_tm.py +0 -0
  304. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/tests/test_parser.py +0 -0
  305. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/tests/test_scheduler.py +0 -0
  306. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/tests/test_scheduler_resource_allocation.py +0 -0
  307. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/tests/test_scheduler_rest.py +0 -0
  308. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/tests/test_tm.py +0 -0
  309. {hpc_beeflow-0.1.9.dev4 → hpc_beeflow-0.1.10.dev1}/beeflow/wf_manager/common/wf_db.py +0 -0
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: hpc-beeflow
3
- Version: 0.1.9.dev4
3
+ Version: 0.1.10.dev1
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
7
7
  Author: BEE-LANL Dev Team
8
8
  Author-email: bee-dev@lanl.gov
9
- Requires-Python: >=3.8.3,<=3.12.2
9
+ Requires-Python: >=3.8.3,<=3.13.0
10
10
  Classifier: Environment :: Console
11
11
  Classifier: Environment :: OpenStack
12
12
  Classifier: Environment :: Other Environment
@@ -19,7 +19,8 @@ Classifier: Programming Language :: Python :: 3
19
19
  Classifier: Programming Language :: Python :: 3.9
20
20
  Classifier: Programming Language :: Python :: 3.10
21
21
  Classifier: Programming Language :: Python :: 3.11
22
- Classifier: Programming Language :: Python :: 3
22
+ Classifier: Programming Language :: Python :: 3.12
23
+ Classifier: Programming Language :: Python :: 3.13
23
24
  Classifier: Programming Language :: Python :: Implementation :: CPython
24
25
  Classifier: Topic :: Scientific/Engineering
25
26
  Classifier: Topic :: System :: Clustering
@@ -34,17 +35,21 @@ Requires-Dist: celery[redis,sqlalchemy] (>=5.3.4,<6.0.0)
34
35
  Requires-Dist: cffi (>=1.15.1,<2.0.0)
35
36
  Requires-Dist: cwl-utils (>=0.16,<0.17)
36
37
  Requires-Dist: docutils (==0.18.1)
38
+ Requires-Dist: fastapi (==0.109.2)
37
39
  Requires-Dist: flask_restful (==0.3.9)
38
40
  Requires-Dist: google-api-python-client (>=2.66.0,<3.0.0) ; extra == "cloud-extras"
41
+ Requires-Dist: graphviz (>=0.20.3,<0.21.0)
39
42
  Requires-Dist: gunicorn (>=20.1,<23.0)
40
43
  Requires-Dist: jsonpickle (>=2.2.0,<3.0.0)
41
44
  Requires-Dist: neo4j (>=5,<6)
45
+ Requires-Dist: networkx (==3.1)
42
46
  Requires-Dist: python-daemon (>=2.3.1,<3.0.0)
43
47
  Requires-Dist: python-heatclient (>=3.1.0,<4.0.0) ; extra == "cloud-extras"
44
48
  Requires-Dist: python-openstackclient (>=6.0.0,<7.0.0) ; extra == "cloud-extras"
45
- Requires-Dist: requests (<2.29.0)
46
- Requires-Dist: requests-unixsocket (>=0.3.0,<0.4.0)
49
+ Requires-Dist: requests (>=2.32.3,<3.0.0)
50
+ Requires-Dist: requests-unixsocket2 (>=0.4.2,<0.5.0)
47
51
  Requires-Dist: typer (>=0.5.0,<0.6.0)
52
+ Requires-Dist: uvicorn (==0.27.1)
48
53
  Project-URL: Repository, https://github.com/lanl/BEE
49
54
  Description-Content-Type: text/x-rst
50
55
 
@@ -106,6 +111,7 @@ Contributors:
106
111
  * Patricia Grubel - `pagrubel <https://github.com/pagrubel>`_
107
112
  * Qiang Guan - `guanxyz <https://github.com/guanxyz>`_
108
113
  * Ragini Gupta - `raginigupta6 <https://github.com/raginigupta6>`_
114
+ * Aaron R Hall - `arhall0 <https://github.com/arhall0>`_
109
115
  * Leah Howell - `Leahh02 <https://github.com/Leahh02>`_
110
116
  * Andres Quan - `aquan9 <https://github.com/aquan9>`_
111
117
  * Quincy Wofford - `qwofford <https://github.com/qwofford>`_
@@ -56,6 +56,7 @@ Contributors:
56
56
  * Patricia Grubel - `pagrubel <https://github.com/pagrubel>`_
57
57
  * Qiang Guan - `guanxyz <https://github.com/guanxyz>`_
58
58
  * Ragini Gupta - `raginigupta6 <https://github.com/raginigupta6>`_
59
+ * Aaron R Hall - `arhall0 <https://github.com/arhall0>`_
59
60
  * Leah Howell - `Leahh02 <https://github.com/Leahh02>`_
60
61
  * Andres Quan - `aquan9 <https://github.com/aquan9>`_
61
62
  * Quincy Wofford - `qwofford <https://github.com/qwofford>`_
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env python3
2
2
  """bee-client.
3
3
 
4
- This script provides an client interface to the user to manage workflows.
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,8 @@ import inspect
11
11
  import pathlib
12
12
  import shutil
13
13
  import subprocess
14
+ import getpass
15
+ import tarfile
14
16
  import tempfile
15
17
  import textwrap
16
18
  import time
@@ -18,6 +20,7 @@ import importlib.metadata
18
20
  import jsonpickle
19
21
  import requests
20
22
  import typer
23
+ import yaml
21
24
 
22
25
  from beeflow.common import config_driver
23
26
  from beeflow.common.cli import NaturalOrderGroup
@@ -27,6 +30,8 @@ from beeflow.common.parser import CwlParser
27
30
  from beeflow.common.wf_data import generate_workflow_id
28
31
  from beeflow.client import core
29
32
  from beeflow.wf_manager.resources import wf_utils
33
+ from beeflow.common.db import client_db
34
+ from beeflow.common.db import bdb
30
35
 
31
36
  # Length of a shortened workflow ID
32
37
  short_id_len = 6 #noqa: Not a constant
@@ -39,6 +44,7 @@ _INTERACTIVE = False
39
44
 
40
45
 
41
46
  logging.basicConfig(level=logging.WARNING)
47
+ logging.getLogger("neo4j").setLevel(logging.WARNING)
42
48
  WORKFLOW_MANAGER = 'bee_wfm/v1/jobs/'
43
49
 
44
50
 
@@ -50,6 +56,104 @@ class ClientError(Exception):
50
56
  self.args = args
51
57
 
52
58
 
59
+ def warn(*pargs):
60
+ """Print a red warning message."""
61
+ typer.secho(' '.join(pargs), fg=typer.colors.RED, file=sys.stderr)
62
+
63
+
64
+ def db_path():
65
+ """Return the client database path."""
66
+ bee_workdir = config_driver.BeeConfig.get('DEFAULT', 'bee_workdir')
67
+ return os.path.join(bee_workdir, 'client.db')
68
+
69
+
70
+ def setup_hostname(start_hn):
71
+ """Set up front end name when beeflow core start is returned."""
72
+ db = bdb.connect_db(client_db, db_path())
73
+ db.info.set_hostname(start_hn)
74
+
75
+
76
+ def get_hostname():
77
+ """Check if beeflow is running somewhere else."""
78
+ db = bdb.connect_db(client_db, db_path())
79
+ curr_hn = db.info.get_hostname()
80
+ return curr_hn
81
+
82
+
83
+ def set_backend_status(new_status):
84
+ """Set backend flag to true in database."""
85
+ db = bdb.connect_db(client_db, db_path())
86
+ db.info.set_backend_status(new_status)
87
+
88
+
89
+ def check_backend_status():
90
+ """Check if backend flag has been set."""
91
+ db = bdb.connect_db(client_db, db_path())
92
+ status = db.info.get_backend_status()
93
+ return status
94
+
95
+
96
+ def reset_client_db():
97
+ """Reset client db when beeflow is stopped."""
98
+ setup_hostname("")
99
+ set_backend_status("")
100
+
101
+
102
+ def check_backend_jobs(start_hn, command=False):
103
+ """Check if there is an instance of beeflow running on a backend node."""
104
+ user_name = getpass.getuser()
105
+ cmd = ['squeue', '-u', f'{user_name}', '-o', '%N', '-h']
106
+ resp = subprocess.run(cmd, text=True, check=True, stdout=subprocess.PIPE)
107
+
108
+ # iterate through available nodes
109
+ data = resp.stdout.splitlines()
110
+ cur_alloc = False
111
+ if get_hostname() in data:
112
+ cur_alloc = True
113
+
114
+ if cur_alloc:
115
+ if command:
116
+ warn(f'beeflow was started on "{get_hostname()}" and you are trying to '
117
+ f'run a command on "{start_hn}".')
118
+ sys.exit(1)
119
+ else:
120
+ warn(f'beeflow was started on compute node "{get_hostname()}" '
121
+ 'and it is still running. ')
122
+ sys.exit(1)
123
+ else: # beeflow was started on compute node but user no longer owns node
124
+ if command:
125
+ warn('beeflow has not been started!')
126
+ sys.exit(1)
127
+ else:
128
+ warn('beeflow was started on a compute node (no longer owned by user) and '
129
+ 'not stopped correctly. ')
130
+ warn("Resetting client database.")
131
+ reset_client_db()
132
+ setup_hostname(start_hn) # add to client db
133
+
134
+
135
+ def check_db_flags(start_hn):
136
+ """Check that beeflow was stopped correctly during the last run."""
137
+ if get_hostname() and get_hostname() != start_hn and check_backend_status() == "":
138
+ warn(f'Error: beeflow is already running on "{get_hostname()}".')
139
+ sys.exit(1)
140
+ if get_hostname() and get_hostname() != start_hn and check_backend_status() == "true":
141
+ check_backend_jobs(start_hn)
142
+
143
+
144
+ def check_hostname(curr_hn):
145
+ """Check current front end name matches the one beeflow was started on."""
146
+ if get_hostname() and curr_hn != get_hostname() and check_backend_status() == "":
147
+ warn(f'beeflow was started on "{get_hostname()}" and you are trying to '
148
+ f'run a command on "{curr_hn}".')
149
+ sys.exit(1)
150
+ elif get_hostname() and curr_hn != get_hostname() and check_backend_status() == "true":
151
+ check_backend_jobs(curr_hn, command=True)
152
+ if get_hostname() == "" and check_backend_status() == "":
153
+ warn('beeflow has not been started!')
154
+ sys.exit(1)
155
+
156
+
53
157
  def error_exit(msg, include_caller=True):
54
158
  """Print a message and exit or raise an error with that message."""
55
159
  if include_caller:
@@ -112,7 +216,11 @@ def get_wf_list():
112
216
  conn = _wfm_conn()
113
217
  resp = conn.get(_url(), timeout=60)
114
218
  except requests.exceptions.ConnectionError:
115
- error_exit('Could not reach WF Manager.')
219
+ if get_hostname() == "":
220
+ warn('beeflow has not been started!')
221
+ sys.exit(1)
222
+ else:
223
+ error_exit('Could not reach WF Manager.')
116
224
 
117
225
  if resp.status_code != requests.codes.okay: # pylint: disable=no-member
118
226
  error_exit('WF Manager did not return workflow list')
@@ -192,7 +300,7 @@ def submit(wf_name: str = typer.Argument(..., help='the workflow name'), # pyli
192
300
  main_cwl: str = typer.Argument(...,
193
301
  help='filename of main CWL (if using CWL tarball), '
194
302
  + 'path of main CWL (if using CWL directory)'),
195
- yaml: str = typer.Argument(...,
303
+ yaml_file: str = typer.Argument(...,
196
304
  help='filename of yaml file (if using CWL tarball), '
197
305
  + 'path of yaml file (if using CWL directory)'),
198
306
  workdir: pathlib.Path = typer.Argument(...,
@@ -215,16 +323,17 @@ def submit(wf_name: str = typer.Argument(..., help='the workflow name'), # pyli
215
323
  if os.path.isdir(wf_path):
216
324
  print("Detected directory instead of packaged workflow. Packaging Directory...")
217
325
  main_cwl_path = pathlib.Path(main_cwl).resolve()
218
- yaml_path = pathlib.Path(yaml).resolve()
326
+ yaml_path = pathlib.Path(yaml_file).resolve()
219
327
 
220
328
  if not main_cwl_path.exists():
221
329
  error_exit(f'Main CWL file {main_cwl} does not exist')
222
330
  if not yaml_path.exists():
223
- error_exit(f'YAML file {yaml} does not exist')
331
+ error_exit(f'YAML file {yaml_file} does not exist')
224
332
 
225
333
  # Packaging in temp dir, after copying alternate cwl_main or yaml file
226
334
  cwl_indir = is_parent(wf_path, main_cwl_path)
227
335
  yaml_indir = is_parent(wf_path, yaml_path)
336
+
228
337
  # Always create temp dir for the workflow
229
338
  tempdir_path = pathlib.Path(tempfile.mkdtemp())
230
339
  tempdir_wf_path = pathlib.Path(tempdir_path / wf_name)
@@ -232,15 +341,16 @@ def submit(wf_name: str = typer.Argument(..., help='the workflow name'), # pyli
232
341
  if not cwl_indir:
233
342
  shutil.copy2(main_cwl, tempdir_wf_path)
234
343
  if not yaml_indir:
235
- shutil.copy2(yaml, tempdir_wf_path)
344
+ shutil.copy2(yaml_file, tempdir_wf_path)
236
345
  package_path = package(tempdir_wf_path, tempdir_path)
237
346
  else:
238
347
  package_path = wf_path
348
+
239
349
  # Untar and parse workflow
240
350
  untar_path = pathlib.Path(tempfile.mkdtemp())
241
351
  untar_wf_path = unpackage(package_path, untar_path)
242
352
  main_cwl_path = untar_wf_path / pathlib.Path(main_cwl).name
243
- yaml_path = untar_wf_path / pathlib.Path(yaml).name
353
+ yaml_path = untar_wf_path / pathlib.Path(yaml_file).name
244
354
  parser = CwlParser()
245
355
  workflow_id = generate_workflow_id()
246
356
  workflow, tasks = parser.parse_workflow(workflow_id, str(main_cwl_path),
@@ -304,16 +414,19 @@ def submit(wf_name: str = typer.Argument(..., help='the workflow name'), # pyli
304
414
 
305
415
  # Store provided arguments in text file for future reference
306
416
  wf_dir = wf_utils.get_workflow_dir(wf_id)
307
- sub_wf_dir = wf_dir + "/submit_command_args.txt"
417
+ sub_wf_dir = wf_dir + "/submit_command_args.yaml"
308
418
 
309
- f_name = open(sub_wf_dir, "w", encoding="utf-8")
310
- f_name.write(f"wf_name: {wf_name}\n")
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()
419
+ cmd = {
420
+ 'wf_name': wf_name,
421
+ 'wf_path': str(wf_path),
422
+ 'main_cwl': main_cwl,
423
+ 'yaml': yaml_file,
424
+ 'workdir': workdir,
425
+ 'wf_id': wf_id
426
+ }
427
+
428
+ with open(sub_wf_dir, "w", encoding='utf-8') as command_file:
429
+ yaml.dump(cmd, command_file)
317
430
 
318
431
  return wf_id
319
432
 
@@ -457,31 +570,15 @@ def query(wf_id: str = typer.Argument(..., callback=match_short_id)):
457
570
  wf_status = resp.json()['wf_status']
458
571
  typer.echo(wf_status)
459
572
  for _task_id, task_name, task_state in tasks_status:
460
- typer.echo(f'{task_name}--{task_state}')
573
+ if wf_status == 'No Start':
574
+ typer.echo(f'{task_name}')
575
+ else:
576
+ typer.echo(f'{task_name}--{task_state}')
461
577
 
462
578
  logging.info('Query workflow: {resp.text}')
463
579
  return wf_status, tasks_status
464
580
 
465
581
 
466
- @app.command()
467
- def metadata(wf_id: str = typer.Argument(..., callback=match_short_id)):
468
- """Get metadata about a given workflow."""
469
- try:
470
- conn = _wfm_conn()
471
- resp = conn.get(_resource(wf_id) + '/metadata', timeout=60)
472
- except requests.exceptions.ConnectionError:
473
- error_exit('Could not reach WF Manager.')
474
-
475
- if resp.status_code != requests.codes.okay: # noqa (pylama doesn't know about the okay member)
476
- error_exit('Could not successfully query workflow manager')
477
-
478
- # Print and or return the metadata
479
- data = resp.json()
480
- for key, value in data.items():
481
- typer.echo(f'{key} = {value}')
482
- return data
483
-
484
-
485
582
  @app.command()
486
583
  def pause(wf_id: str = typer.Argument(..., callback=match_short_id)):
487
584
  """Pause a workflow (Running tasks will finish)."""
@@ -518,7 +615,7 @@ def cancel(wf_id: str = typer.Argument(..., callback=match_short_id)):
518
615
  """Cancel a paused or running workflow."""
519
616
  long_wf_id = wf_id
520
617
  wf_status = get_wf_status(wf_id)
521
- if wf_status in ('Running', 'Paused'):
618
+ if wf_status in ('Running', 'Paused', 'No Start'):
522
619
  try:
523
620
  conn = _wfm_conn()
524
621
  resp = conn.delete(_resource(long_wf_id), json={'option': 'cancel'}, timeout=60)
@@ -570,6 +667,26 @@ def reexecute(wf_name: str = typer.Argument(..., help='The workflow name'),
570
667
  workdir = os.path.abspath(workdir)
571
668
  if not os.path.exists(workdir):
572
669
  error_exit(f"Workflow working directory \"{workdir}\" doesn't exist")
670
+ cwl_path = pathlib.Path(tempfile.mkdtemp())
671
+ archive_id = str(wf_path.stem)
672
+ with tarfile.open(wf_path) as archive:
673
+ archive_cmd = yaml.load(archive.extractfile(
674
+ str(pathlib.Path(archive_id) / 'submit_command_args.yaml')).read(),
675
+ Loader=yaml.Loader)
676
+
677
+ cwl_files = [
678
+ tarinfo for tarinfo in archive.getmembers()
679
+ if tarinfo.name.startswith(archive_id + '/cwl_files/')
680
+ and tarinfo.isreg()
681
+ ]
682
+ for path in cwl_files:
683
+ path.name = os.path.basename(path.name)
684
+ archive.extractall(path=cwl_path, members=cwl_files)
685
+
686
+ main_cwl = cwl_path / pathlib.Path(archive_cmd['main_cwl']).name
687
+ yaml_file = cwl_path / pathlib.Path(archive_cmd['yaml']).name
688
+
689
+ return submit(wf_name, pathlib.Path(cwl_path), main_cwl, yaml_file, pathlib.Path(workdir))
573
690
 
574
691
  data = {
575
692
  'wf_filename': os.path.basename(wf_path).encode(),
@@ -593,6 +710,42 @@ def reexecute(wf_name: str = typer.Argument(..., help='The workflow name'),
593
710
  return wf_id
594
711
 
595
712
 
713
+ @app.command()
714
+ def dag(wf_id: str = typer.Argument(..., callback=match_short_id),
715
+ output_dir: pathlib.Path = typer.Argument(...,
716
+ help='Path to the where the dag output will be'),
717
+ no_dag_dir: bool = typer.Option(False, '--no-dag-dir',
718
+ help='do not make a subdirectory within ouput_dir for the dags')):
719
+ """Export a DAG of the workflow to a GraphML file."""
720
+ output_dir = output_dir.resolve()
721
+ # Make sure output_dir is an absolute path and exists
722
+ output_dir = os.path.expanduser(output_dir)
723
+ output_dir = os.path.abspath(output_dir)
724
+ if not os.path.exists(output_dir):
725
+ error_exit(f"Path for dag directory \"{output_dir}\" doesn't exist")
726
+
727
+ # output_dir must be a string
728
+ output_dir = str(output_dir)
729
+ # Check if the workflow is archived
730
+ wf_status = get_wf_status(wf_id)
731
+ if wf_status == 'Archived':
732
+ copy_dag_in_archive = False
733
+ bee_workdir = wf_utils.get_bee_workdir()
734
+ mount_dir = os.path.join(bee_workdir, 'gdb_mount')
735
+ graphmls_dir = mount_dir + '/graphmls'
736
+ typer.secho("Workflow has been archived. All new DAGs will look the same as the one "
737
+ "in the archive directory.",
738
+ fg=typer.colors.MAGENTA)
739
+ else:
740
+ copy_dag_in_archive = True
741
+ wf_dir = wf_utils.get_workflow_dir(wf_id)
742
+ graphmls_dir = wf_dir + '/graphmls'
743
+ os.makedirs(graphmls_dir, exist_ok=True)
744
+ wf_utils.export_dag(wf_id, output_dir, graphmls_dir, no_dag_dir, copy_dag_in_archive)
745
+ typer.secho(f"DAG for workflow {_short_id(wf_id)} has been exported successfully.",
746
+ fg=typer.colors.GREEN)
747
+
748
+
596
749
  @app.callback(invoke_without_command=True)
597
750
  def version_callback(version: bool = False):
598
751
  """Beeflow."""
@@ -17,21 +17,28 @@ import shutil
17
17
  import datetime
18
18
  import time
19
19
  import importlib.metadata
20
+ from pathlib import Path
20
21
 
21
22
  import daemon
22
23
  import typer
23
24
 
25
+
24
26
  from beeflow.client import bee_client
25
27
  from beeflow.common.config_driver import BeeConfig as bc
28
+ from beeflow.common.config_driver import AlterConfig
26
29
  from beeflow.common import cli_connection
27
30
  from beeflow.common import paths
28
31
  from beeflow.wf_manager.resources import wf_utils
32
+ import beeflow.common.worker.utils as worker_utils
29
33
 
30
34
  from beeflow.common.deps import container_manager
31
35
  from beeflow.common.deps import neo4j_manager
32
36
  from beeflow.common.deps import redis_manager
33
37
 
34
38
 
39
+ REPO_PATH = Path(*Path(__file__).parts[:-3])
40
+
41
+
35
42
  class ComponentManager:
36
43
  """Component manager class."""
37
44
 
@@ -44,7 +51,11 @@ class ComponentManager:
44
51
  """Return a decorator function to be called."""
45
52
 
46
53
  def wrap(fn):
47
- """Add the component to the list."""
54
+ """Check to see if any components are disabled."""
55
+ if bc.get('DEFAULT', 'remote_api') is False and 'remote_api' in name:
56
+ return
57
+
58
+ # Add the component to the list.
48
59
  self.components[name] = {
49
60
  'fn': fn,
50
61
  'deps': deps,
@@ -189,6 +200,13 @@ def init_components():
189
200
  return launch_with_gunicorn('beeflow.scheduler.scheduler:create_app()',
190
201
  paths.sched_socket(), stdout=fp, stderr=fp)
191
202
 
203
+ @mgr.component('remote_api', ('wf_manager', 'task_manager'))
204
+ def start_remote_api():
205
+ """Start the remote API."""
206
+ fp = open_log('remote_api')
207
+ return launch_with_gunicorn('beeflow.remote.remote:create_app()',
208
+ paths.remote_socket(), stdout=fp, stderr=fp)
209
+
192
210
  @mgr.component('celery', ('redis',))
193
211
  def celery():
194
212
  """Start the celery task queue."""
@@ -230,7 +248,8 @@ def init_components():
230
248
  """Start BEESlurmRestD. Returns a Popen process object."""
231
249
  bee_workdir = bc.get('DEFAULT', 'bee_workdir')
232
250
  slurmrestd_log = '/'.join([bee_workdir, 'logs', 'restd.log'])
233
- openapi_version = bc.get('slurm', 'openapi_version')
251
+ openapi_version = worker_utils.get_slurmrestd_version()
252
+ print(f"Inferred slurmrestd version: {openapi_version}")
234
253
  slurm_args = f'-s openapi/{openapi_version}'
235
254
  # The following adds the db plugin we opted not to use for now
236
255
  # slurm_args = f'-s openapi/{openapi_version},openapi/db{openapi_version}'
@@ -285,8 +304,24 @@ def load_check_charliecloud():
285
304
  sys.exit(1)
286
305
 
287
306
 
288
- def check_dependencies():
307
+ def check_dependencies(backend=False):
289
308
  """Check for various dependencies in the environment."""
309
+ # Note: Code block of lines 309-320 is for SLURM scheduler!
310
+ # Check if running on compute node under Slurm scheduler and --backend not specified
311
+ if not backend and os.environ.get('SLURM_JOB_NODELIST') is not None:
312
+ warn('Slurm job node detected! Beeflow should not be run on a compute node. ')
313
+ warn(f'SLURM_JOB_NODELIST = {os.environ.get("SLURM_JOB_NODELIST")}')
314
+ bee_client.reset_client_db()
315
+ sys.exit(1)
316
+ # Check if running on front end with --backend flag specified
317
+ if backend and os.environ.get('SLURM_JOB_NODELIST') is None:
318
+ warn('Slurm node was not detected! Are you sure you are on a compute node? ')
319
+ warn("Please run 'beeflow core start' again without the --backend flag.")
320
+ bee_client.reset_client_db()
321
+ sys.exit(1)
322
+
323
+ # TO DO: Add checks when using Flux scheduler
324
+
290
325
  print('Checking dependencies...')
291
326
  # Check for Charliecloud and its version
292
327
  load_check_charliecloud()
@@ -369,9 +404,21 @@ app = typer.Typer(no_args_is_help=True)
369
404
 
370
405
  @app.command()
371
406
  def start(foreground: bool = typer.Option(False, '--foreground', '-F',
372
- help='run in the foreground')):
407
+ help='run in the foreground'), backend: bool = typer.Option(False, '--backend',
408
+ '-B', help='allow to run on a backend node')):
373
409
  """Start all BEE components."""
374
- check_dependencies()
410
+ start_hn = socket.gethostname() # hostname when beeflow starts
411
+ if bee_client.get_hostname() == "" and bee_client.check_backend_status() == "":
412
+ bee_client.setup_hostname(start_hn) # add to client db
413
+ else:
414
+ time.sleep(10) # giving Slurm time to relinquish compute node, if necessary
415
+ bee_client.check_db_flags(start_hn)
416
+
417
+ if backend: # allow beeflow to run on backend node
418
+ check_dependencies(backend=True)
419
+ bee_client.set_backend_status("true") # add flag to db
420
+ else:
421
+ check_dependencies()
375
422
  mgr = init_components()
376
423
  beeflow_log = paths.log_fname('beeflow')
377
424
  sock_path = paths.beeflow_socket()
@@ -397,6 +444,7 @@ def start(foreground: bool = typer.Option(False, '--foreground', '-F',
397
444
 
398
445
  version = importlib.metadata.version("hpc-beeflow")
399
446
  print(f'Starting beeflow {version}...')
447
+ print(f'Running beeflow on {start_hn}')
400
448
  if not foreground:
401
449
  print('Run `beeflow core status` for more information.')
402
450
  # Create the log path if it doesn't exist yet
@@ -415,20 +463,31 @@ def start(foreground: bool = typer.Option(False, '--foreground', '-F',
415
463
  @app.command()
416
464
  def status():
417
465
  """Check the status of beeflow and the components."""
466
+ status_hn = socket.gethostname() # hostname when beeflow core status returned
467
+ bee_client.check_hostname(status_hn)
418
468
  resp = cli_connection.send(paths.beeflow_socket(), {'type': 'status'})
419
469
  if resp is None:
420
- beeflow_log = paths.log_fname('beeflow')
421
- warn('Cannot connect to the beeflow daemon, is it running? Check the '
422
- f'log at "{beeflow_log}".')
470
+ # bee_client.check_hostname(status_hn) # need to remove since checked in line 465?
423
471
  sys.exit(1)
424
472
  print('beeflow components:')
425
473
  for comp, stat in resp['components'].items():
426
474
  print(f'{comp} ... {stat}')
427
475
 
428
476
 
477
+ @app.command()
478
+ def info():
479
+ """Get information about beeflow's installation."""
480
+ version = importlib.metadata.version("hpc-beeflow")
481
+ print(f"Beeflow version: {version}")
482
+ print(f"bee_workflow directory: {paths.workdir()}")
483
+ print(f"Log path: {paths.log_path()}")
484
+
485
+
429
486
  @app.command()
430
487
  def stop(query='yes'):
431
488
  """Stop the current running beeflow daemon."""
489
+ stop_hn = socket.gethostname() # hostname when beeflow core stop returned
490
+ bee_client.check_hostname(stop_hn)
432
491
  # Check workflow states; warn if there are active states, pause running workflows
433
492
  workflow_list = bee_client.get_wf_list()
434
493
  concern_states = {'Running', 'Initializing', 'Waiting'}
@@ -451,15 +510,13 @@ def stop(query='yes'):
451
510
  bee_client.pause(wf_id)
452
511
  resp = cli_connection.send(paths.beeflow_socket(), {'type': 'quit'})
453
512
  if resp is None:
454
- beeflow_log = paths.log_fname('beeflow')
455
- warn('Error: beeflow is not running on this system. It could be '
456
- 'running on a different front end.\n'
457
- f' Check the beeflow log: "{beeflow_log}".')
513
+ # bee_client.check_hostname(stop_hn) # need to remove since checked in line 487?
458
514
  sys.exit(1)
459
515
  # As long as it returned something, we should be good
460
516
  beeflow_log = paths.log_fname('beeflow')
461
517
  if query == "yes":
462
518
  print(f'Beeflow has stopped. Check the log at "{beeflow_log}".')
519
+ bee_client.reset_client_db()
463
520
 
464
521
 
465
522
  def archive_dir(dir_to_archive):
@@ -496,6 +553,8 @@ def reset(archive: bool = typer.Option(False, '--archive', '-a',
496
553
  help='Archive bee_workdir before removal')):
497
554
  """Stop all components and delete the bee_workdir directory."""
498
555
  # Check workflow states; warn if there are active states.
556
+ reset_hn = socket.gethostname()
557
+ bee_client.check_hostname(reset_hn)
499
558
  workflow_list = bee_client.get_wf_list()
500
559
  active_states = {'Running', 'Paused', 'Initializing', 'Waiting'}
501
560
  caution = ""
@@ -516,6 +575,7 @@ def reset(archive: bool = typer.Option(False, '--archive', '-a',
516
575
  Shutdown beeflow and all BEE components.
517
576
  Delete the bee_workdir directory which results in:
518
577
  Removing the archive of all workflows.
578
+ (unless archives is configured elsewhere).
519
579
  Removing the archive of workflow containers
520
580
  (unless container_archive is configured elsewhere).
521
581
  Reset all databases associated with the beeflow app.
@@ -563,19 +623,26 @@ def pull_to_tar(ref, tarball):
563
623
  subprocess.check_call(['ch-convert', '-i', 'ch-image', '-o', 'tar', ref, tarball])
564
624
 
565
625
 
626
+ def build_to_tar(tag, dockerfile, tarball):
627
+ """Build a container from a Dockerfile and convert to tarball."""
628
+ subprocess.check_call(['ch-image', 'build', '-t', tag, '-f', dockerfile, '.'])
629
+ subprocess.check_call(['ch-convert', '-i', 'ch-image', '-o', 'tar', tag, tarball])
630
+
631
+
566
632
  @app.command()
567
633
  def pull_deps(outdir: str = typer.Option('.', '--outdir', '-o',
568
634
  help='directory to store containers in')):
569
635
  """Pull required BEE containers and store in outdir."""
570
636
  load_check_charliecloud()
571
637
  neo4j_path = os.path.join(os.path.realpath(outdir), 'neo4j.tar.gz')
572
- pull_to_tar('neo4j:5.17', neo4j_path)
638
+ neo4j_dockerfile = str(Path(REPO_PATH, "beeflow/data/dockerfiles/Dockerfile.neo4j"))
639
+ build_to_tar('neo4j_image', neo4j_dockerfile, neo4j_path)
573
640
  redis_path = os.path.join(os.path.realpath(outdir), 'redis.tar.gz')
574
641
  pull_to_tar('redis', redis_path)
575
- print()
576
- print('The BEE dependency containers have been successfully downloaded. '
577
- 'Please make sure to set the following options in your config:')
578
- print()
579
- print('[DEFAULT]')
580
- print('neo4j_image =', neo4j_path)
581
- print('redis_image =', redis_path)
642
+
643
+ AlterConfig(changes={'DEFAULT': {'neo4j_image': neo4j_path,
644
+ 'redis_image': redis_path}}).save()
645
+
646
+ dep_dir = container_manager.get_dep_dir()
647
+ if os.path.isdir(dep_dir):
648
+ shutil.rmtree(dep_dir)