hpc-beeflow 0.1.9.dev3__tar.gz → 0.1.10.dev0__tar.gz

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