Repository: lanl/BEE (language: python)

Issue:
Configurable listen ports for BEEWorkflowManager, BEETaskManager, and client
Modify beeflow/server/server.py to use the BeeConfig class to allow the user to configure a listen port. Modify beeflow/client/client.py to also use the BeeConfig class to find the configured BEEWorkflowManager port.


Discussion / hints:

Fix patch:
diff --git a/.github/workflows/pylama.yml b/.github/workflows/pylama.yml
index af4de9a65..f06efc8fd 100644
--- a/.github/workflows/pylama.yml
+++ b/.github/workflows/pylama.yml
@@ -19,4 +19,4 @@ jobs:
       - name: Lint
         run: |
           pip install pylama 2>&1 >/dev/null
-          pylama src/
+          pylama beeflow/
diff --git a/.gitignore b/.gitignore
index aaf176541..105c91fd3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,3 +13,4 @@ poetry.lock
 .env
 .venv
 docs/sphinx/_build
+dist
diff --git a/README.rst b/README.rst
index fd1b05831..52eb645ae 100644
--- a/README.rst
+++ b/README.rst
@@ -35,7 +35,7 @@ If using `git --version` >= 2.9:
 Otherwise:
     cp .githooks/* .git/hooks/
 
-Using these git hooks will ensure your contributions adhere to style guidelines required for contribution. You will need to repeat these steps for every `BEE_Private` repo you clone.
+Using these git hooks will ensure your contributions adhere to style guidelines required for contribution. You will need to repeat these steps for every `BEE` repo you clone.
 
 Mail List and Contact
 ==========================
diff --git a/src/beeflow/cli.py b/beeflow/cli.py
similarity index 100%
rename from src/beeflow/cli.py
rename to beeflow/cli.py
diff --git a/src/beeflow/client/README.md b/beeflow/client/README.md
similarity index 100%
rename from src/beeflow/client/README.md
rename to beeflow/client/README.md
diff --git a/src/beeflow/client/bee_client.py b/beeflow/client/bee_client.py
similarity index 100%
rename from src/beeflow/client/bee_client.py
rename to beeflow/client/bee_client.py
diff --git a/src/beeflow/cloud_launcher.py b/beeflow/cloud_launcher.py
similarity index 100%
rename from src/beeflow/cloud_launcher.py
rename to beeflow/cloud_launcher.py
diff --git a/src/beeflow/common/README.md b/beeflow/common/README.md
similarity index 100%
rename from src/beeflow/common/README.md
rename to beeflow/common/README.md
diff --git a/src/beeflow/common/build/README.md b/beeflow/common/build/README.md
similarity index 99%
rename from src/beeflow/common/build/README.md
rename to beeflow/common/build/README.md
index defbe59ba..bc0d4cb1b 100644
--- a/src/beeflow/common/build/README.md
+++ b/beeflow/common/build/README.md
@@ -95,7 +95,7 @@ a.process_docker_pull('git.lanl.gov:5050/qwofford/containerhub/lstopo',force=Tru
 from beeflow.common.build.container_drivers import CharliecloudBuildDriver
 from beeflow.common.wf_data import Task
 task = Task(name='hi',base_command=['hi','hello'],
-                 requirements={'DockerRequirement':{'dockerFile':'src/beeflow/data/dockerfiles/Dockerfile.builder_demo',
+                 requirements={'DockerRequirement':{'dockerFile':'beeflow/data/dockerfiles/Dockerfile.builder_demo',
                                                     'beeflow:containerName':'my_fun_container:sillytag'}},
                  hints=None,
                  workflow_id=42,
diff --git a/src/beeflow/common/build/build_driver.py b/beeflow/common/build/build_driver.py
similarity index 100%
rename from src/beeflow/common/build/build_driver.py
rename to beeflow/common/build/build_driver.py
diff --git a/src/beeflow/common/build/container_drivers.py b/beeflow/common/build/container_drivers.py
similarity index 100%
rename from src/beeflow/common/build/container_drivers.py
rename to beeflow/common/build/container_drivers.py
diff --git a/src/beeflow/common/build_interfaces.py b/beeflow/common/build_interfaces.py
similarity index 100%
rename from src/beeflow/common/build_interfaces.py
rename to beeflow/common/build_interfaces.py
diff --git a/src/beeflow/common/cli.py b/beeflow/common/cli.py
similarity index 100%
rename from src/beeflow/common/cli.py
rename to beeflow/common/cli.py
diff --git a/src/beeflow/common/cloud/README.md b/beeflow/common/cloud/README.md
similarity index 100%
rename from src/beeflow/common/cloud/README.md
rename to beeflow/common/cloud/README.md
diff --git a/src/beeflow/common/cloud/__init__.py b/beeflow/common/cloud/__init__.py
similarity index 100%
rename from src/beeflow/common/cloud/__init__.py
rename to beeflow/common/cloud/__init__.py
diff --git a/src/beeflow/common/cloud/chameleoncloud.py b/beeflow/common/cloud/chameleoncloud.py
similarity index 100%
rename from src/beeflow/common/cloud/chameleoncloud.py
rename to beeflow/common/cloud/chameleoncloud.py
diff --git a/src/beeflow/common/cloud/cloud.py b/beeflow/common/cloud/cloud.py
similarity index 100%
rename from src/beeflow/common/cloud/cloud.py
rename to beeflow/common/cloud/cloud.py
diff --git a/src/beeflow/common/cloud/constants.py b/beeflow/common/cloud/constants.py
similarity index 100%
rename from src/beeflow/common/cloud/constants.py
rename to beeflow/common/cloud/constants.py
diff --git a/src/beeflow/common/cloud/google.py b/beeflow/common/cloud/google.py
similarity index 100%
rename from src/beeflow/common/cloud/google.py
rename to beeflow/common/cloud/google.py
diff --git a/src/beeflow/common/cloud/openstack.py b/beeflow/common/cloud/openstack.py
similarity index 100%
rename from src/beeflow/common/cloud/openstack.py
rename to beeflow/common/cloud/openstack.py
diff --git a/src/beeflow/common/cloud/provider.py b/beeflow/common/cloud/provider.py
similarity index 100%
rename from src/beeflow/common/cloud/provider.py
rename to beeflow/common/cloud/provider.py
diff --git a/src/beeflow/common/config_driver.py b/beeflow/common/config_driver.py
similarity index 99%
rename from src/beeflow/common/config_driver.py
rename to beeflow/common/config_driver.py
index 785d74ec5..043cb422f 100644
--- a/src/beeflow/common/config_driver.py
+++ b/beeflow/common/config_driver.py
@@ -130,7 +130,7 @@ def get(cls, sec_name, opt_name):
             raise RuntimeError(
                 f'Option {sec_name}::{opt_name} was not found. Please contact '
                 'a BEE developer or check the validation code in '
-                'src/beeflow/common/config_driver.py.'
+                'beeflow/common/config_driver.py.'
             ) from None
 
     @staticmethod
diff --git a/src/beeflow/common/config_validator.py b/beeflow/common/config_validator.py
similarity index 100%
rename from src/beeflow/common/config_validator.py
rename to beeflow/common/config_validator.py
diff --git a/src/beeflow/common/crt/charliecloud_driver.py b/beeflow/common/crt/charliecloud_driver.py
similarity index 100%
rename from src/beeflow/common/crt/charliecloud_driver.py
rename to beeflow/common/crt/charliecloud_driver.py
diff --git a/src/beeflow/common/crt/crt_driver.py b/beeflow/common/crt/crt_driver.py
similarity index 100%
rename from src/beeflow/common/crt/crt_driver.py
rename to beeflow/common/crt/crt_driver.py
diff --git a/src/beeflow/common/crt/singularity_driver.py b/beeflow/common/crt/singularity_driver.py
similarity index 100%
rename from src/beeflow/common/crt/singularity_driver.py
rename to beeflow/common/crt/singularity_driver.py
diff --git a/src/beeflow/common/crt_interface.py b/beeflow/common/crt_interface.py
similarity index 100%
rename from src/beeflow/common/crt_interface.py
rename to beeflow/common/crt_interface.py
diff --git a/src/beeflow/common/gdb/DESIGN.md b/beeflow/common/gdb/DESIGN.md
similarity index 100%
rename from src/beeflow/common/gdb/DESIGN.md
rename to beeflow/common/gdb/DESIGN.md
diff --git a/src/beeflow/common/gdb/gdb_driver.py b/beeflow/common/gdb/gdb_driver.py
similarity index 100%
rename from src/beeflow/common/gdb/gdb_driver.py
rename to beeflow/common/gdb/gdb_driver.py
diff --git a/src/beeflow/common/gdb/neo4j_cypher.py b/beeflow/common/gdb/neo4j_cypher.py
similarity index 100%
rename from src/beeflow/common/gdb/neo4j_cypher.py
rename to beeflow/common/gdb/neo4j_cypher.py
diff --git a/src/beeflow/common/gdb/neo4j_driver.py b/beeflow/common/gdb/neo4j_driver.py
similarity index 100%
rename from src/beeflow/common/gdb/neo4j_driver.py
rename to beeflow/common/gdb/neo4j_driver.py
diff --git a/src/beeflow/common/gdb_interface.py b/beeflow/common/gdb_interface.py
similarity index 100%
rename from src/beeflow/common/gdb_interface.py
rename to beeflow/common/gdb_interface.py
diff --git a/src/beeflow/common/log.py b/beeflow/common/log.py
similarity index 100%
rename from src/beeflow/common/log.py
rename to beeflow/common/log.py
diff --git a/src/beeflow/common/parser/.gitignore b/beeflow/common/parser/.gitignore
similarity index 100%
rename from src/beeflow/common/parser/.gitignore
rename to beeflow/common/parser/.gitignore
diff --git a/src/beeflow/common/parser/README.md b/beeflow/common/parser/README.md
similarity index 100%
rename from src/beeflow/common/parser/README.md
rename to beeflow/common/parser/README.md
diff --git a/src/beeflow/common/parser/__init__.py b/beeflow/common/parser/__init__.py
similarity index 100%
rename from src/beeflow/common/parser/__init__.py
rename to beeflow/common/parser/__init__.py
diff --git a/src/beeflow/common/parser/parser.py b/beeflow/common/parser/parser.py
similarity index 100%
rename from src/beeflow/common/parser/parser.py
rename to beeflow/common/parser/parser.py
diff --git a/src/beeflow/common/wf_data.py b/beeflow/common/wf_data.py
similarity index 100%
rename from src/beeflow/common/wf_data.py
rename to beeflow/common/wf_data.py
diff --git a/src/beeflow/common/wf_interface.py b/beeflow/common/wf_interface.py
similarity index 100%
rename from src/beeflow/common/wf_interface.py
rename to beeflow/common/wf_interface.py
diff --git a/src/beeflow/common/wf_profiler.py b/beeflow/common/wf_profiler.py
similarity index 100%
rename from src/beeflow/common/wf_profiler.py
rename to beeflow/common/wf_profiler.py
diff --git a/src/beeflow/common/worker/README.md b/beeflow/common/worker/README.md
similarity index 100%
rename from src/beeflow/common/worker/README.md
rename to beeflow/common/worker/README.md
diff --git a/src/beeflow/common/worker/__init__.py b/beeflow/common/worker/__init__.py
similarity index 100%
rename from src/beeflow/common/worker/__init__.py
rename to beeflow/common/worker/__init__.py
diff --git a/src/beeflow/common/worker/lsf_worker.py b/beeflow/common/worker/lsf_worker.py
similarity index 100%
rename from src/beeflow/common/worker/lsf_worker.py
rename to beeflow/common/worker/lsf_worker.py
diff --git a/src/beeflow/common/worker/simple_worker.py b/beeflow/common/worker/simple_worker.py
similarity index 100%
rename from src/beeflow/common/worker/simple_worker.py
rename to beeflow/common/worker/simple_worker.py
diff --git a/src/beeflow/common/worker/slurm_worker.py b/beeflow/common/worker/slurm_worker.py
similarity index 100%
rename from src/beeflow/common/worker/slurm_worker.py
rename to beeflow/common/worker/slurm_worker.py
diff --git a/src/beeflow/common/worker/worker.py b/beeflow/common/worker/worker.py
similarity index 100%
rename from src/beeflow/common/worker/worker.py
rename to beeflow/common/worker/worker.py
diff --git a/src/beeflow/common/worker_interface.py b/beeflow/common/worker_interface.py
similarity index 100%
rename from src/beeflow/common/worker_interface.py
rename to beeflow/common/worker_interface.py
diff --git a/src/beeflow/data/cloud_templates/dora.jinja b/beeflow/data/cloud_templates/dora.jinja
similarity index 98%
rename from src/beeflow/data/cloud_templates/dora.jinja
rename to beeflow/data/cloud_templates/dora.jinja
index e4018ab8f..7e970350c 100644
--- a/src/beeflow/data/cloud_templates/dora.jinja
+++ b/beeflow/data/cloud_templates/dora.jinja
@@ -28,8 +28,8 @@ install_bee()
     local git_branch=$4
     mkdir -p $bee_dir
     cd $bee_dir
-    git clone https://$auth_token:x-oauth-basic@github.com/lanl/BEE_Private.git || exit 1
-    cd BEE_Private
+    git clone https://$auth_token:x-oauth-basic@github.com/lanl/BEE.git || exit 1
+    cd BEE
     git checkout $git_branch
     python3 -m venv venv
     . venv/bin/activate
@@ -43,7 +43,7 @@ install_bee()
     cat >> /bee/tm <<EOF
 #!/bin/sh
 . /etc/profile
-cd /bee/BEE_Private
+cd /bee/BEE
 . ./venv/bin/activate
 exec python -m beeflow.task_manager $conf
 EOF
diff --git a/src/beeflow/data/cloud_templates/dora.yaml b/beeflow/data/cloud_templates/dora.yaml
similarity index 92%
rename from src/beeflow/data/cloud_templates/dora.yaml
rename to beeflow/data/cloud_templates/dora.yaml
index ece6a4173..8caec0488 100644
--- a/src/beeflow/data/cloud_templates/dora.yaml
+++ b/beeflow/data/cloud_templates/dora.yaml
@@ -1,5 +1,5 @@
 # Location of the jinja template file
-template_file: /home/jtronge/BEE_Private/templates/dora.jinja
+template_file: /home/jtronge/BEE/templates/dora.jinja
 # Private key file for logging onto the remote instance
 private_key_file: ...
 bee_user: debian
diff --git a/src/beeflow/data/cwl/README.md b/beeflow/data/cwl/README.md
similarity index 100%
rename from src/beeflow/data/cwl/README.md
rename to beeflow/data/cwl/README.md
diff --git a/src/beeflow/data/cwl/bee_workflows/README.md b/beeflow/data/cwl/bee_workflows/README.md
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/README.md
rename to beeflow/data/cwl/bee_workflows/README.md
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-ci/README.md b/beeflow/data/cwl/bee_workflows/clamr-ci/README.md
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-ci/README.md
rename to beeflow/data/cwl/bee_workflows/clamr-ci/README.md
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-ci/clamr.cwl b/beeflow/data/cwl/bee_workflows/clamr-ci/clamr.cwl
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-ci/clamr.cwl
rename to beeflow/data/cwl/bee_workflows/clamr-ci/clamr.cwl
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-ci/clamr_job.json b/beeflow/data/cwl/bee_workflows/clamr-ci/clamr_job.json
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-ci/clamr_job.json
rename to beeflow/data/cwl/bee_workflows/clamr-ci/clamr_job.json
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-ci/clamr_job.yml b/beeflow/data/cwl/bee_workflows/clamr-ci/clamr_job.yml
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-ci/clamr_job.yml
rename to beeflow/data/cwl/bee_workflows/clamr-ci/clamr_job.yml
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-ci/clamr_wf.cwl b/beeflow/data/cwl/bee_workflows/clamr-ci/clamr_wf.cwl
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-ci/clamr_wf.cwl
rename to beeflow/data/cwl/bee_workflows/clamr-ci/clamr_wf.cwl
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-ci/ffmpeg.cwl b/beeflow/data/cwl/bee_workflows/clamr-ci/ffmpeg.cwl
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-ci/ffmpeg.cwl
rename to beeflow/data/cwl/bee_workflows/clamr-ci/ffmpeg.cwl
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-checkpoint/README.md b/beeflow/data/cwl/bee_workflows/clamr-wf-checkpoint/README.md
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-checkpoint/README.md
rename to beeflow/data/cwl/bee_workflows/clamr-wf-checkpoint/README.md
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-checkpoint/clamr.cwl b/beeflow/data/cwl/bee_workflows/clamr-wf-checkpoint/clamr.cwl
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-checkpoint/clamr.cwl
rename to beeflow/data/cwl/bee_workflows/clamr-wf-checkpoint/clamr.cwl
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-checkpoint/clamr_job.json b/beeflow/data/cwl/bee_workflows/clamr-wf-checkpoint/clamr_job.json
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-checkpoint/clamr_job.json
rename to beeflow/data/cwl/bee_workflows/clamr-wf-checkpoint/clamr_job.json
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-checkpoint/clamr_job.yml b/beeflow/data/cwl/bee_workflows/clamr-wf-checkpoint/clamr_job.yml
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-checkpoint/clamr_job.yml
rename to beeflow/data/cwl/bee_workflows/clamr-wf-checkpoint/clamr_job.yml
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-checkpoint/clamr_job_long.yml b/beeflow/data/cwl/bee_workflows/clamr-wf-checkpoint/clamr_job_long.yml
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-checkpoint/clamr_job_long.yml
rename to beeflow/data/cwl/bee_workflows/clamr-wf-checkpoint/clamr_job_long.yml
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-checkpoint/clamr_wf.cwl b/beeflow/data/cwl/bee_workflows/clamr-wf-checkpoint/clamr_wf.cwl
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-checkpoint/clamr_wf.cwl
rename to beeflow/data/cwl/bee_workflows/clamr-wf-checkpoint/clamr_wf.cwl
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-checkpoint/ffmpeg.cwl b/beeflow/data/cwl/bee_workflows/clamr-wf-checkpoint/ffmpeg.cwl
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-checkpoint/ffmpeg.cwl
rename to beeflow/data/cwl/bee_workflows/clamr-wf-checkpoint/ffmpeg.cwl
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/README.md b/beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/README.md
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/README.md
rename to beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/README.md
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/clamr.cwl b/beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/clamr.cwl
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/clamr.cwl
rename to beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/clamr.cwl
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/clamr_job.json b/beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/clamr_job.json
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/clamr_job.json
rename to beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/clamr_job.json
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/clamr_job.yml b/beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/clamr_job.yml
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/clamr_job.yml
rename to beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/clamr_job.yml
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/clamr_wf.cwl b/beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/clamr_wf.cwl
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/clamr_wf.cwl
rename to beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/clamr_wf.cwl
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/ffmpeg.cwl b/beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/ffmpeg.cwl
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/ffmpeg.cwl
rename to beeflow/data/cwl/bee_workflows/clamr-wf-chicoma/ffmpeg.cwl
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/README.md b/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/README.md
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/README.md
rename to beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/README.md
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/lsf-charliecloud/README.md b/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/lsf-charliecloud/README.md
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/lsf-charliecloud/README.md
rename to beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/lsf-charliecloud/README.md
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/lsf-charliecloud/cf-summit.cwl b/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/lsf-charliecloud/cf-summit.cwl
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/lsf-charliecloud/cf-summit.cwl
rename to beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/lsf-charliecloud/cf-summit.cwl
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/README.md b/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/README.md
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/README.md
rename to beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/README.md
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/cf-darwin.cwl b/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/cf-darwin.cwl
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/cf-darwin.cwl
rename to beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/cf-darwin.cwl
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/cf-no-owrite.cwl b/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/cf-no-owrite.cwl
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/cf-no-owrite.cwl
rename to beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/cf-no-owrite.cwl
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/cf.cwl b/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/cf.cwl
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/cf.cwl
rename to beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/cf.cwl
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/copyContainer_containerName.cwl b/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/copyContainer_containerName.cwl
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/copyContainer_containerName.cwl
rename to beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/copyContainer_containerName.cwl
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/dockerFile_containerName.cwl b/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/dockerFile_containerName.cwl
similarity index 92%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/dockerFile_containerName.cwl
rename to beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/dockerFile_containerName.cwl
index 0cfdf3c9a..f47e95922 100644
--- a/src/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/dockerFile_containerName.cwl
+++ b/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/dockerFile_containerName.cwl
@@ -29,7 +29,7 @@ steps:
       baseCommand: "/CLAMR/clamr_cpuonly -n 32 -l 3 -t 5000 -i 10 -g 25 -G png"
       hints:
         DockerRequirement:
-          dockerFile: "src/beeflow/data/dockerfiles/Dockerfile.clamr-lanl-x86_64"
+          dockerFile: "beeflow/data/dockerfiles/Dockerfile.clamr-lanl-x86_64"
           beeflow:containerName: "foo2"
     in:
       infile: infile
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/dockerPull.cwl b/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/dockerPull.cwl
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/dockerPull.cwl
rename to beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-charliecloud/dockerPull.cwl
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-singularity/README.md b/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-singularity/README.md
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-singularity/README.md
rename to beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-singularity/README.md
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-singularity/cf-singularity.cwl b/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-singularity/cf-singularity.cwl
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-singularity/cf-singularity.cwl
rename to beeflow/data/cwl/bee_workflows/clamr-wf-noyaml/slurm-singularity/cf-singularity.cwl
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-singularity/README.md b/beeflow/data/cwl/bee_workflows/clamr-wf-singularity/README.md
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-singularity/README.md
rename to beeflow/data/cwl/bee_workflows/clamr-wf-singularity/README.md
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-singularity/clamr.cwl b/beeflow/data/cwl/bee_workflows/clamr-wf-singularity/clamr.cwl
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-singularity/clamr.cwl
rename to beeflow/data/cwl/bee_workflows/clamr-wf-singularity/clamr.cwl
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-singularity/clamr_job.json b/beeflow/data/cwl/bee_workflows/clamr-wf-singularity/clamr_job.json
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-singularity/clamr_job.json
rename to beeflow/data/cwl/bee_workflows/clamr-wf-singularity/clamr_job.json
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-singularity/clamr_job.yml b/beeflow/data/cwl/bee_workflows/clamr-wf-singularity/clamr_job.yml
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-singularity/clamr_job.yml
rename to beeflow/data/cwl/bee_workflows/clamr-wf-singularity/clamr_job.yml
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-singularity/clamr_wf.cwl b/beeflow/data/cwl/bee_workflows/clamr-wf-singularity/clamr_wf.cwl
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-singularity/clamr_wf.cwl
rename to beeflow/data/cwl/bee_workflows/clamr-wf-singularity/clamr_wf.cwl
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-singularity/ffmpeg.cwl b/beeflow/data/cwl/bee_workflows/clamr-wf-singularity/ffmpeg.cwl
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-singularity/ffmpeg.cwl
rename to beeflow/data/cwl/bee_workflows/clamr-wf-singularity/ffmpeg.cwl
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-summit/README.md b/beeflow/data/cwl/bee_workflows/clamr-wf-summit/README.md
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-summit/README.md
rename to beeflow/data/cwl/bee_workflows/clamr-wf-summit/README.md
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-summit/clamr.cwl b/beeflow/data/cwl/bee_workflows/clamr-wf-summit/clamr.cwl
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-summit/clamr.cwl
rename to beeflow/data/cwl/bee_workflows/clamr-wf-summit/clamr.cwl
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-summit/clamr_job.json b/beeflow/data/cwl/bee_workflows/clamr-wf-summit/clamr_job.json
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-summit/clamr_job.json
rename to beeflow/data/cwl/bee_workflows/clamr-wf-summit/clamr_job.json
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-summit/clamr_job.yml b/beeflow/data/cwl/bee_workflows/clamr-wf-summit/clamr_job.yml
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-summit/clamr_job.yml
rename to beeflow/data/cwl/bee_workflows/clamr-wf-summit/clamr_job.yml
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-summit/clamr_wf.cwl b/beeflow/data/cwl/bee_workflows/clamr-wf-summit/clamr_wf.cwl
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-summit/clamr_wf.cwl
rename to beeflow/data/cwl/bee_workflows/clamr-wf-summit/clamr_wf.cwl
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-summit/ffmpeg.cwl b/beeflow/data/cwl/bee_workflows/clamr-wf-summit/ffmpeg.cwl
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-summit/ffmpeg.cwl
rename to beeflow/data/cwl/bee_workflows/clamr-wf-summit/ffmpeg.cwl
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-use-container/README.md b/beeflow/data/cwl/bee_workflows/clamr-wf-use-container/README.md
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-use-container/README.md
rename to beeflow/data/cwl/bee_workflows/clamr-wf-use-container/README.md
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-use-container/clamr.cwl b/beeflow/data/cwl/bee_workflows/clamr-wf-use-container/clamr.cwl
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-use-container/clamr.cwl
rename to beeflow/data/cwl/bee_workflows/clamr-wf-use-container/clamr.cwl
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-use-container/clamr_job.json b/beeflow/data/cwl/bee_workflows/clamr-wf-use-container/clamr_job.json
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-use-container/clamr_job.json
rename to beeflow/data/cwl/bee_workflows/clamr-wf-use-container/clamr_job.json
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-use-container/clamr_job.yml b/beeflow/data/cwl/bee_workflows/clamr-wf-use-container/clamr_job.yml
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-use-container/clamr_job.yml
rename to beeflow/data/cwl/bee_workflows/clamr-wf-use-container/clamr_job.yml
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-use-container/clamr_wf.cwl b/beeflow/data/cwl/bee_workflows/clamr-wf-use-container/clamr_wf.cwl
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-use-container/clamr_wf.cwl
rename to beeflow/data/cwl/bee_workflows/clamr-wf-use-container/clamr_wf.cwl
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf-use-container/ffmpeg.cwl b/beeflow/data/cwl/bee_workflows/clamr-wf-use-container/ffmpeg.cwl
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf-use-container/ffmpeg.cwl
rename to beeflow/data/cwl/bee_workflows/clamr-wf-use-container/ffmpeg.cwl
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf/README.md b/beeflow/data/cwl/bee_workflows/clamr-wf/README.md
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf/README.md
rename to beeflow/data/cwl/bee_workflows/clamr-wf/README.md
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf/clamr.cwl b/beeflow/data/cwl/bee_workflows/clamr-wf/clamr.cwl
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf/clamr.cwl
rename to beeflow/data/cwl/bee_workflows/clamr-wf/clamr.cwl
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf/clamr_job.json b/beeflow/data/cwl/bee_workflows/clamr-wf/clamr_job.json
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf/clamr_job.json
rename to beeflow/data/cwl/bee_workflows/clamr-wf/clamr_job.json
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf/clamr_job.yml b/beeflow/data/cwl/bee_workflows/clamr-wf/clamr_job.yml
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf/clamr_job.yml
rename to beeflow/data/cwl/bee_workflows/clamr-wf/clamr_job.yml
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf/clamr_wf.cwl b/beeflow/data/cwl/bee_workflows/clamr-wf/clamr_wf.cwl
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf/clamr_wf.cwl
rename to beeflow/data/cwl/bee_workflows/clamr-wf/clamr_wf.cwl
diff --git a/src/beeflow/data/cwl/bee_workflows/clamr-wf/ffmpeg.cwl b/beeflow/data/cwl/bee_workflows/clamr-wf/ffmpeg.cwl
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/clamr-wf/ffmpeg.cwl
rename to beeflow/data/cwl/bee_workflows/clamr-wf/ffmpeg.cwl
diff --git a/src/beeflow/data/cwl/bee_workflows/comd-mpi/comd.cwl b/beeflow/data/cwl/bee_workflows/comd-mpi/comd.cwl
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/comd-mpi/comd.cwl
rename to beeflow/data/cwl/bee_workflows/comd-mpi/comd.cwl
diff --git a/src/beeflow/data/cwl/bee_workflows/comd-mpi/comd.yml b/beeflow/data/cwl/bee_workflows/comd-mpi/comd.yml
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/comd-mpi/comd.yml
rename to beeflow/data/cwl/bee_workflows/comd-mpi/comd.yml
diff --git a/src/beeflow/data/cwl/bee_workflows/comd-mpi/comd_bin.cwl b/beeflow/data/cwl/bee_workflows/comd-mpi/comd_bin.cwl
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/comd-mpi/comd_bin.cwl
rename to beeflow/data/cwl/bee_workflows/comd-mpi/comd_bin.cwl
diff --git a/src/beeflow/data/cwl/bee_workflows/lulesh-mpi/lulesh.cwl b/beeflow/data/cwl/bee_workflows/lulesh-mpi/lulesh.cwl
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/lulesh-mpi/lulesh.cwl
rename to beeflow/data/cwl/bee_workflows/lulesh-mpi/lulesh.cwl
diff --git a/src/beeflow/data/cwl/bee_workflows/lulesh-mpi/lulesh.yml b/beeflow/data/cwl/bee_workflows/lulesh-mpi/lulesh.yml
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/lulesh-mpi/lulesh.yml
rename to beeflow/data/cwl/bee_workflows/lulesh-mpi/lulesh.yml
diff --git a/src/beeflow/data/cwl/bee_workflows/nwchem-mpi/README.md b/beeflow/data/cwl/bee_workflows/nwchem-mpi/README.md
similarity index 87%
rename from src/beeflow/data/cwl/bee_workflows/nwchem-mpi/README.md
rename to beeflow/data/cwl/bee_workflows/nwchem-mpi/README.md
index 9b9c70163..2fdf02f80 100644
--- a/src/beeflow/data/cwl/bee_workflows/nwchem-mpi/README.md
+++ b/beeflow/data/cwl/bee_workflows/nwchem-mpi/README.md
@@ -2,7 +2,7 @@
 
 This is a simple example MPI workflow that should run on x86 systems.  The
 client script needs to first package up this directory:
-`src/beeflow/data/cwl/bee_workflows/nwchem-mpi`.  Then you should be able to
+`beeflow/data/cwl/bee_workflows/nwchem-mpi`.  Then you should be able to
 submit the workflow to the WFM after packaging with the client as well. An
 example submission is below with the `nwchem.cwl` and `nwchem.yml` files
 specified.
@@ -39,6 +39,6 @@ At this point the job can then be started just as with any other workflow.
 
 This workflow pulls the x86 container from DockerHub, so if the container is not
 working for some reason, I've included an example Dockerfile that should build
-with Charliecloud. See `src/beeflow/data/dockerfiles/Dockerfile.nwchem-x86_64`.
+with Charliecloud. See `beeflow/data/dockerfiles/Dockerfile.nwchem-x86_64`.
 NWChem is a massive program, so the build may take upwards of an hour depending
 on the system.
diff --git a/src/beeflow/data/cwl/bee_workflows/nwchem-mpi/nwchem.cwl b/beeflow/data/cwl/bee_workflows/nwchem-mpi/nwchem.cwl
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/nwchem-mpi/nwchem.cwl
rename to beeflow/data/cwl/bee_workflows/nwchem-mpi/nwchem.cwl
diff --git a/src/beeflow/data/cwl/bee_workflows/nwchem-mpi/nwchem.yml b/beeflow/data/cwl/bee_workflows/nwchem-mpi/nwchem.yml
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/nwchem-mpi/nwchem.yml
rename to beeflow/data/cwl/bee_workflows/nwchem-mpi/nwchem.yml
diff --git a/src/beeflow/data/cwl/bee_workflows/nwchem-mpi/nwchem_bin.cwl b/beeflow/data/cwl/bee_workflows/nwchem-mpi/nwchem_bin.cwl
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/nwchem-mpi/nwchem_bin.cwl
rename to beeflow/data/cwl/bee_workflows/nwchem-mpi/nwchem_bin.cwl
diff --git a/src/beeflow/data/cwl/bee_workflows/simple-workflows/README.md b/beeflow/data/cwl/bee_workflows/simple-workflows/README.md
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/simple-workflows/README.md
rename to beeflow/data/cwl/bee_workflows/simple-workflows/README.md
diff --git a/src/beeflow/data/cwl/bee_workflows/simple-workflows/cancel.cwl b/beeflow/data/cwl/bee_workflows/simple-workflows/cancel.cwl
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/simple-workflows/cancel.cwl
rename to beeflow/data/cwl/bee_workflows/simple-workflows/cancel.cwl
diff --git a/src/beeflow/data/cwl/bee_workflows/simple-workflows/grep-wordcount/README.md b/beeflow/data/cwl/bee_workflows/simple-workflows/grep-wordcount/README.md
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/simple-workflows/grep-wordcount/README.md
rename to beeflow/data/cwl/bee_workflows/simple-workflows/grep-wordcount/README.md
diff --git a/src/beeflow/data/cwl/bee_workflows/simple-workflows/grep-wordcount/gc-nc.cwl b/beeflow/data/cwl/bee_workflows/simple-workflows/grep-wordcount/gc-nc.cwl
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/simple-workflows/grep-wordcount/gc-nc.cwl
rename to beeflow/data/cwl/bee_workflows/simple-workflows/grep-wordcount/gc-nc.cwl
diff --git a/src/beeflow/data/cwl/bee_workflows/simple-workflows/grep-wordcount/gc.cwl b/beeflow/data/cwl/bee_workflows/simple-workflows/grep-wordcount/gc.cwl
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/simple-workflows/grep-wordcount/gc.cwl
rename to beeflow/data/cwl/bee_workflows/simple-workflows/grep-wordcount/gc.cwl
diff --git a/src/beeflow/data/cwl/bee_workflows/simple-workflows/grep-wordcount/lorem.txt b/beeflow/data/cwl/bee_workflows/simple-workflows/grep-wordcount/lorem.txt
similarity index 100%
rename from src/beeflow/data/cwl/bee_workflows/simple-workflows/grep-wordcount/lorem.txt
rename to beeflow/data/cwl/bee_workflows/simple-workflows/grep-wordcount/lorem.txt
diff --git a/src/beeflow/data/cwl/cwl_validation/README.md b/beeflow/data/cwl/cwl_validation/README.md
similarity index 100%
rename from src/beeflow/data/cwl/cwl_validation/README.md
rename to beeflow/data/cwl/cwl_validation/README.md
diff --git a/src/beeflow/data/cwl/cwl_validation/builder/dockerFile.cwl b/beeflow/data/cwl/cwl_validation/builder/dockerFile.cwl
similarity index 100%
rename from src/beeflow/data/cwl/cwl_validation/builder/dockerFile.cwl
rename to beeflow/data/cwl/cwl_validation/builder/dockerFile.cwl
diff --git a/src/beeflow/data/cwl/cwl_validation/builder/dockerPull.cwl b/beeflow/data/cwl/cwl_validation/builder/dockerPull.cwl
similarity index 100%
rename from src/beeflow/data/cwl/cwl_validation/builder/dockerPull.cwl
rename to beeflow/data/cwl/cwl_validation/builder/dockerPull.cwl
diff --git a/src/beeflow/data/cwl/cwl_validation/grep-wordcount/gc.cwl b/beeflow/data/cwl/cwl_validation/grep-wordcount/gc.cwl
similarity index 100%
rename from src/beeflow/data/cwl/cwl_validation/grep-wordcount/gc.cwl
rename to beeflow/data/cwl/cwl_validation/grep-wordcount/gc.cwl
diff --git a/src/beeflow/data/cwl/cwl_validation/grep-wordcount/lorem.txt b/beeflow/data/cwl/cwl_validation/grep-wordcount/lorem.txt
similarity index 100%
rename from src/beeflow/data/cwl/cwl_validation/grep-wordcount/lorem.txt
rename to beeflow/data/cwl/cwl_validation/grep-wordcount/lorem.txt
diff --git a/src/beeflow/data/cwl/cwl_validation/helloworld.cwl b/beeflow/data/cwl/cwl_validation/helloworld.cwl
similarity index 100%
rename from src/beeflow/data/cwl/cwl_validation/helloworld.cwl
rename to beeflow/data/cwl/cwl_validation/helloworld.cwl
diff --git a/src/beeflow/data/cwl/cwl_validation/helloworld_input.yaml b/beeflow/data/cwl/cwl_validation/helloworld_input.yaml
similarity index 100%
rename from src/beeflow/data/cwl/cwl_validation/helloworld_input.yaml
rename to beeflow/data/cwl/cwl_validation/helloworld_input.yaml
diff --git a/src/beeflow/data/dockerfiles/Dockerfile.builder_demo b/beeflow/data/dockerfiles/Dockerfile.builder_demo
similarity index 100%
rename from src/beeflow/data/dockerfiles/Dockerfile.builder_demo
rename to beeflow/data/dockerfiles/Dockerfile.builder_demo
diff --git a/src/beeflow/data/dockerfiles/Dockerfile.clamr-ffmpeg b/beeflow/data/dockerfiles/Dockerfile.clamr-ffmpeg
similarity index 100%
rename from src/beeflow/data/dockerfiles/Dockerfile.clamr-ffmpeg
rename to beeflow/data/dockerfiles/Dockerfile.clamr-ffmpeg
diff --git a/src/beeflow/data/dockerfiles/Dockerfile.clamr-lanl-x86_64 b/beeflow/data/dockerfiles/Dockerfile.clamr-lanl-x86_64
similarity index 100%
rename from src/beeflow/data/dockerfiles/Dockerfile.clamr-lanl-x86_64
rename to beeflow/data/dockerfiles/Dockerfile.clamr-lanl-x86_64
diff --git a/src/beeflow/data/dockerfiles/Dockerfile.clamr-ppc64le b/beeflow/data/dockerfiles/Dockerfile.clamr-ppc64le
similarity index 100%
rename from src/beeflow/data/dockerfiles/Dockerfile.clamr-ppc64le
rename to beeflow/data/dockerfiles/Dockerfile.clamr-ppc64le
diff --git a/src/beeflow/data/dockerfiles/Dockerfile.comd-x86_64 b/beeflow/data/dockerfiles/Dockerfile.comd-x86_64
similarity index 100%
rename from src/beeflow/data/dockerfiles/Dockerfile.comd-x86_64
rename to beeflow/data/dockerfiles/Dockerfile.comd-x86_64
diff --git a/src/beeflow/data/dockerfiles/Dockerfile.deb9ompi-x86_64 b/beeflow/data/dockerfiles/Dockerfile.deb9ompi-x86_64
similarity index 100%
rename from src/beeflow/data/dockerfiles/Dockerfile.deb9ompi-x86_64
rename to beeflow/data/dockerfiles/Dockerfile.deb9ompi-x86_64
diff --git a/src/beeflow/data/dockerfiles/Dockerfile.lulesh-x86_64 b/beeflow/data/dockerfiles/Dockerfile.lulesh-x86_64
similarity index 100%
rename from src/beeflow/data/dockerfiles/Dockerfile.lulesh-x86_64
rename to beeflow/data/dockerfiles/Dockerfile.lulesh-x86_64
diff --git a/src/beeflow/data/dockerfiles/Dockerfile.neo4j-ppc64le b/beeflow/data/dockerfiles/Dockerfile.neo4j-ppc64le
similarity index 100%
rename from src/beeflow/data/dockerfiles/Dockerfile.neo4j-ppc64le
rename to beeflow/data/dockerfiles/Dockerfile.neo4j-ppc64le
diff --git a/src/beeflow/data/dockerfiles/Dockerfile.nwchem-x86_64 b/beeflow/data/dockerfiles/Dockerfile.nwchem-x86_64
similarity index 100%
rename from src/beeflow/data/dockerfiles/Dockerfile.nwchem-x86_64
rename to beeflow/data/dockerfiles/Dockerfile.nwchem-x86_64
diff --git a/src/beeflow/data/dockerfiles/Dockerfile.vaspompi-x86_64 b/beeflow/data/dockerfiles/Dockerfile.vaspompi-x86_64
similarity index 100%
rename from src/beeflow/data/dockerfiles/Dockerfile.vaspompi-x86_64
rename to beeflow/data/dockerfiles/Dockerfile.vaspompi-x86_64
diff --git a/src/beeflow/data/dockerfiles/README.md b/beeflow/data/dockerfiles/README.md
similarity index 100%
rename from src/beeflow/data/dockerfiles/README.md
rename to beeflow/data/dockerfiles/README.md
diff --git a/src/beeflow/data/dockerfiles/comd-pmix-support/Dockerfile.comd-x86_64-wpmix b/beeflow/data/dockerfiles/comd-pmix-support/Dockerfile.comd-x86_64-wpmix
similarity index 100%
rename from src/beeflow/data/dockerfiles/comd-pmix-support/Dockerfile.comd-x86_64-wpmix
rename to beeflow/data/dockerfiles/comd-pmix-support/Dockerfile.comd-x86_64-wpmix
diff --git a/src/beeflow/data/dockerfiles/comd-pmix-support/Dockerfile.debian b/beeflow/data/dockerfiles/comd-pmix-support/Dockerfile.debian
similarity index 100%
rename from src/beeflow/data/dockerfiles/comd-pmix-support/Dockerfile.debian
rename to beeflow/data/dockerfiles/comd-pmix-support/Dockerfile.debian
diff --git a/src/beeflow/data/dockerfiles/comd-pmix-support/Dockerfile.openmpi-3.1.5 b/beeflow/data/dockerfiles/comd-pmix-support/Dockerfile.openmpi-3.1.5
similarity index 100%
rename from src/beeflow/data/dockerfiles/comd-pmix-support/Dockerfile.openmpi-3.1.5
rename to beeflow/data/dockerfiles/comd-pmix-support/Dockerfile.openmpi-3.1.5
diff --git a/src/beeflow/data/dockerfiles/comd-pmix-support/README.md b/beeflow/data/dockerfiles/comd-pmix-support/README.md
similarity index 100%
rename from src/beeflow/data/dockerfiles/comd-pmix-support/README.md
rename to beeflow/data/dockerfiles/comd-pmix-support/README.md
diff --git a/src/beeflow/data/dockerfiles/comd-pmix-support/dont-init-ucx-on-intel-cray.patch b/beeflow/data/dockerfiles/comd-pmix-support/dont-init-ucx-on-intel-cray.patch
similarity index 100%
rename from src/beeflow/data/dockerfiles/comd-pmix-support/dont-init-ucx-on-intel-cray.patch
rename to beeflow/data/dockerfiles/comd-pmix-support/dont-init-ucx-on-intel-cray.patch
diff --git a/src/beeflow/data/job_templates/README.md b/beeflow/data/job_templates/README.md
similarity index 100%
rename from src/beeflow/data/job_templates/README.md
rename to beeflow/data/job_templates/README.md
diff --git a/src/beeflow/data/job_templates/lsf-submit.jinja b/beeflow/data/job_templates/lsf-submit.jinja
similarity index 100%
rename from src/beeflow/data/job_templates/lsf-submit.jinja
rename to beeflow/data/job_templates/lsf-submit.jinja
diff --git a/src/beeflow/data/job_templates/slurm-pmix_v3.jinja b/beeflow/data/job_templates/slurm-pmix_v3.jinja
similarity index 100%
rename from src/beeflow/data/job_templates/slurm-pmix_v3.jinja
rename to beeflow/data/job_templates/slurm-pmix_v3.jinja
diff --git a/src/beeflow/data/job_templates/slurm-submit-timelimit.jinja b/beeflow/data/job_templates/slurm-submit-timelimit.jinja
similarity index 100%
rename from src/beeflow/data/job_templates/slurm-submit-timelimit.jinja
rename to beeflow/data/job_templates/slurm-submit-timelimit.jinja
diff --git a/src/beeflow/data/job_templates/slurm-submit.jinja b/beeflow/data/job_templates/slurm-submit.jinja
similarity index 100%
rename from src/beeflow/data/job_templates/slurm-submit.jinja
rename to beeflow/data/job_templates/slurm-submit.jinja
diff --git a/src/beeflow/scheduler/README.md b/beeflow/scheduler/README.md
similarity index 100%
rename from src/beeflow/scheduler/README.md
rename to beeflow/scheduler/README.md
diff --git a/src/beeflow/scheduler/algorithms.py b/beeflow/scheduler/algorithms.py
similarity index 100%
rename from src/beeflow/scheduler/algorithms.py
rename to beeflow/scheduler/algorithms.py
diff --git a/src/beeflow/scheduler/evaluate.py b/beeflow/scheduler/evaluate.py
similarity index 100%
rename from src/beeflow/scheduler/evaluate.py
rename to beeflow/scheduler/evaluate.py
diff --git a/src/beeflow/scheduler/mars.py b/beeflow/scheduler/mars.py
similarity index 100%
rename from src/beeflow/scheduler/mars.py
rename to beeflow/scheduler/mars.py
diff --git a/src/beeflow/scheduler/mars_util.py b/beeflow/scheduler/mars_util.py
similarity index 100%
rename from src/beeflow/scheduler/mars_util.py
rename to beeflow/scheduler/mars_util.py
diff --git a/src/beeflow/scheduler/resource_allocation.py b/beeflow/scheduler/resource_allocation.py
similarity index 100%
rename from src/beeflow/scheduler/resource_allocation.py
rename to beeflow/scheduler/resource_allocation.py
diff --git a/src/beeflow/scheduler/scheduler.py b/beeflow/scheduler/scheduler.py
similarity index 100%
rename from src/beeflow/scheduler/scheduler.py
rename to beeflow/scheduler/scheduler.py
diff --git a/src/beeflow/scheduler/scheduler.yaml b/beeflow/scheduler/scheduler.yaml
similarity index 100%
rename from src/beeflow/scheduler/scheduler.yaml
rename to beeflow/scheduler/scheduler.yaml
diff --git a/src/beeflow/scheduler/serializable.py b/beeflow/scheduler/serializable.py
similarity index 100%
rename from src/beeflow/scheduler/serializable.py
rename to beeflow/scheduler/serializable.py
diff --git a/src/beeflow/scheduler/task.py b/beeflow/scheduler/task.py
similarity index 100%
rename from src/beeflow/scheduler/task.py
rename to beeflow/scheduler/task.py
diff --git a/src/beeflow/scheduler/train.py b/beeflow/scheduler/train.py
similarity index 100%
rename from src/beeflow/scheduler/train.py
rename to beeflow/scheduler/train.py
diff --git a/src/beeflow/start_gdb.py b/beeflow/start_gdb.py
similarity index 100%
rename from src/beeflow/start_gdb.py
rename to beeflow/start_gdb.py
diff --git a/src/beeflow/task_manager.py b/beeflow/task_manager.py
similarity index 100%
rename from src/beeflow/task_manager.py
rename to beeflow/task_manager.py
diff --git a/src/beeflow/wf_manager.py b/beeflow/wf_manager.py
similarity index 100%
rename from src/beeflow/wf_manager.py
rename to beeflow/wf_manager.py
diff --git a/ci/README.md b/ci/README.md
new file mode 100644
index 000000000..804943650
--- /dev/null
+++ b/ci/README.md
@@ -0,0 +1,25 @@
+# CI code
+
+This directory contains all the scripts that are needed for configuring and
+running BEE on a CI machine. The scripts here are as follows:
+
+* `env.sh`: CI environment set up
+* `bee_install.sh`: script for installing BEE
+* `bee_start.sh`: start script for BEE
+* `deps_install.sh`: BEE external dependency install script (this installs
+                     distro libs, as well as slurm)
+* `slurm_start.sh`: script for configuring and launching a single-machine slurm
+                    set up
+* `integration_test.sh`: external script for setting up the environment for the
+                         integration test
+* `integration_test.py`: actual Python integration testing code
+
+Note: The only script that you should be able to run locally without problems is
+`integration_test.py`. The rest are designed for the CI environment and will
+likely not work on a local machine.
+
+## Integration tests
+
+The integrations tests are written as a Python script `integration_test.py`.
+This test can be run locally after you've started BEE with `beeflow`, by just
+launching the script `./ci/integration_test.py`.
diff --git a/ci/bee_install.sh b/ci/bee_install.sh
index d978ed381..b3d7d581a 100755
--- a/ci/bee_install.sh
+++ b/ci/bee_install.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Setup, install and run BEE.
+# Setup and install BEE.
 
 . ./ci/env.sh
 
@@ -27,7 +27,7 @@ poetry install -E cloud_extras -E scheduler_extras || exit 1
 # BEE Configuration
 mkdir -p ~/.config/beeflow
 JOB_TEMPLATE=$HOME/.config/beeflow/submit.jinja
-cp src/beeflow/data/job_templates/slurm-submit.jinja $JOB_TEMPLATE
+cp beeflow/data/job_templates/slurm-submit.jinja $JOB_TEMPLATE
 cat >> ~/.config/beeflow/bee.conf <<EOF
 # BEE CONFIGURATION FILE #
 [DEFAULT]
diff --git a/docs/ECPMilestones/ECPFY20STNS01-4-Completion.pdf b/docs/ECPMilestones/ECPFY20STNS01-4-Completion.pdf
deleted file mode 100644
index 42ce6f976..000000000
Binary files a/docs/ECPMilestones/ECPFY20STNS01-4-Completion.pdf and /dev/null differ
diff --git a/docs/ECPMilestones/STNS01-6-2020-03-31-BEE-P6-3.pdf b/docs/ECPMilestones/STNS01-6-2020-03-31-BEE-P6-3.pdf
deleted file mode 100644
index 0948da56f..000000000
Binary files a/docs/ECPMilestones/STNS01-6-2020-03-31-BEE-P6-3.pdf and /dev/null differ
diff --git a/docs/sphinx/conf.py b/docs/sphinx/conf.py
index f8a5ae49d..3f130d234 100644
--- a/docs/sphinx/conf.py
+++ b/docs/sphinx/conf.py
@@ -25,7 +25,7 @@
 
 # The full version, including alpha/beta/rc tags
 # Release version from pypoetry.toml Needs poetry environment to run correctly
-version = importlib.metadata.version("beeflow")
+version = importlib.metadata.version("hpc-beeflow")
 
 html_logo = "images/logos/BEEGrey.jpg"
 # -- General configuration ---------------------------------------------------
diff --git a/docs/sphinx/examples.rst b/docs/sphinx/examples.rst
index c16fadef7..2c566ac2f 100644
--- a/docs/sphinx/examples.rst
+++ b/docs/sphinx/examples.rst
@@ -98,7 +98,7 @@ The archived workflow with associated standard job outputs will be in the **bee_
 .. code-block::
 
     graphics_output - a directory containing the graphics png files.
-    total_execution_time.log
+    total_execution_time.log - log generated by Clamr
     CLAMR_movie.mp4 - The final movie
 
 The other outputs are in the archive of the workflow.
diff --git a/docs/sphinx/images/clamr-step.png b/docs/sphinx/images/clamr-step.png
index 3fa2773a4..5444f916c 100644
Binary files a/docs/sphinx/images/clamr-step.png and b/docs/sphinx/images/clamr-step.png differ
diff --git a/docs/sphinx/images/src/clamr-step.pptx b/docs/sphinx/images/src/clamr-step.pptx
index f6157bcdb..b4e7da8f0 100644
Binary files a/docs/sphinx/images/src/clamr-step.pptx and b/docs/sphinx/images/src/clamr-step.pptx differ
diff --git a/docs/sphinx/installation.rst b/docs/sphinx/installation.rst
index f9d55375e..d4c66a110 100644
--- a/docs/sphinx/installation.rst
+++ b/docs/sphinx/installation.rst
@@ -32,7 +32,7 @@ BEE is a PyPI package that can be installed using pip. On an HPC cluster you may
 
 .. code-block::
 
-    pip install beeflow
+    pip install hpc-beeflow
 
 An alternative is to use a Poetry environment, but we suggest this only for developers.
 For more information click on the Developer's Guide in this documentation.
diff --git a/examples/clamr-ffmpeg-build.tgz b/examples/clamr-ffmpeg-build.tgz
index bf80b9790..b7dcf4676 100644
Binary files a/examples/clamr-ffmpeg-build.tgz and b/examples/clamr-ffmpeg-build.tgz differ
diff --git a/examples/clamr-ffmpeg-build/clamr_wf.cwl b/examples/clamr-ffmpeg-build/clamr_wf.cwl
index a54c662ea..6fb198181 100644
--- a/examples/clamr-ffmpeg-build/clamr_wf.cwl
+++ b/examples/clamr-ffmpeg-build/clamr_wf.cwl
@@ -52,7 +52,7 @@ steps:
     out: [clamr_stdout, outdir, time_log]
     hints:
         DockerRequirement:
-            dockerFile: "src/beeflow/data/dockerfiles/Dockerfile.clamr-ffmpeg"
+            dockerFile: "beeflow/data/dockerfiles/Dockerfile.clamr-ffmpeg"
             beeflow:containerName: "clamr-ffmpeg"
 
   ffmpeg:
@@ -71,5 +71,5 @@ steps:
     out: [movie]
     hints:
         DockerRequirement:
-            dockerFile: "src/beeflow/data/dockerfiles/Dockerfile.clamr-ffmpeg"
+            dockerFile: "beeflow/data/dockerfiles/Dockerfile.clamr-ffmpeg"
             beeflow:containerName: "clamr-ffmpeg"
diff --git a/pyproject.toml b/pyproject.toml
index 38ae4297e..aa5805d16 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,8 +1,9 @@
 [tool.poetry]
-name = "beeflow"
+name = "hpc-beeflow"
 version = "0.1.0rc1"
 description = "A software package for containerizing HPC applications and managing job workflow"
 
+
 authors = [
     "BEE-LANL Dev Team <bee-dev@lanl.gov>"
 ]
@@ -32,12 +33,15 @@ classifiers = [
     "Programming Language :: Python :: Implementation :: CPython",
     "Topic :: Scientific/Engineering",
     "Topic :: System :: Clustering",
-    "Topic :: System :: Database",
     "Topic :: System :: Distributed Computing",
     "Topic :: System :: Logging",
     "Topic :: System :: Monitoring"
 ]
 
+packages = [
+    { include = "beeflow" }
+]
+
 [tool.poetry.scripts]
 beeflow = 'beeflow.cli:main'
 bee_client = 'beeflow.client.bee_client:main'
diff --git a/setup.cfg b/setup.cfg
index 91d4ed45b..b3c12f718 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -15,7 +15,7 @@ ignore = R0902,R0903,R0904,R0912,R0913,R0914,R0916,W0603,W1203,C0413
 
 [pylama:pylint]
 max_line_length = 99
-good_names = i,j,k,v,t,m,s,n,x,y,ax,ex,fp,id,tx,fn,pi,Run,_
+good_names = i,j,k,v,t,m,s,n,x,y,ax,ex,fp,id,tx,fn,pi,wf,Run,_
 
 [pylama:pycodestyle]
 max_line_length = 99


Test patch:
diff --git a/src/beeflow/tests/README.md b/beeflow/tests/README.md
similarity index 100%
rename from src/beeflow/tests/README.md
rename to beeflow/tests/README.md
diff --git a/src/beeflow/tests/cf.cwl b/beeflow/tests/cf.cwl
similarity index 100%
rename from src/beeflow/tests/cf.cwl
rename to beeflow/tests/cf.cwl
diff --git a/src/beeflow/tests/clamr-wf/clamr.cwl b/beeflow/tests/clamr-wf/clamr.cwl
similarity index 100%
rename from src/beeflow/tests/clamr-wf/clamr.cwl
rename to beeflow/tests/clamr-wf/clamr.cwl
diff --git a/src/beeflow/tests/clamr-wf/clamr_job.json b/beeflow/tests/clamr-wf/clamr_job.json
similarity index 100%
rename from src/beeflow/tests/clamr-wf/clamr_job.json
rename to beeflow/tests/clamr-wf/clamr_job.json
diff --git a/src/beeflow/tests/clamr-wf/clamr_job.yml b/beeflow/tests/clamr-wf/clamr_job.yml
similarity index 100%
rename from src/beeflow/tests/clamr-wf/clamr_job.yml
rename to beeflow/tests/clamr-wf/clamr_job.yml
diff --git a/src/beeflow/tests/clamr-wf/clamr_wf.cwl b/beeflow/tests/clamr-wf/clamr_wf.cwl
similarity index 100%
rename from src/beeflow/tests/clamr-wf/clamr_wf.cwl
rename to beeflow/tests/clamr-wf/clamr_wf.cwl
diff --git a/src/beeflow/tests/clamr-wf/ffmpeg.cwl b/beeflow/tests/clamr-wf/ffmpeg.cwl
similarity index 100%
rename from src/beeflow/tests/clamr-wf/ffmpeg.cwl
rename to beeflow/tests/clamr-wf/ffmpeg.cwl
diff --git a/src/beeflow/tests/clamr-wf/mv_script.cwl b/beeflow/tests/clamr-wf/mv_script.cwl
similarity index 100%
rename from src/beeflow/tests/clamr-wf/mv_script.cwl
rename to beeflow/tests/clamr-wf/mv_script.cwl
diff --git a/src/beeflow/tests/clamr-wf/mv_script.sh b/beeflow/tests/clamr-wf/mv_script.sh
similarity index 100%
rename from src/beeflow/tests/clamr-wf/mv_script.sh
rename to beeflow/tests/clamr-wf/mv_script.sh
diff --git a/src/beeflow/tests/mocks.py b/beeflow/tests/mocks.py
similarity index 100%
rename from src/beeflow/tests/mocks.py
rename to beeflow/tests/mocks.py
diff --git a/src/beeflow/tests/test_cloud.py b/beeflow/tests/test_cloud.py
similarity index 100%
rename from src/beeflow/tests/test_cloud.py
rename to beeflow/tests/test_cloud.py
diff --git a/src/beeflow/tests/test_config_validator.py b/beeflow/tests/test_config_validator.py
similarity index 100%
rename from src/beeflow/tests/test_config_validator.py
rename to beeflow/tests/test_config_validator.py
diff --git a/src/beeflow/tests/test_parser.py b/beeflow/tests/test_parser.py
similarity index 100%
rename from src/beeflow/tests/test_parser.py
rename to beeflow/tests/test_parser.py
diff --git a/src/beeflow/tests/test_scheduler.py b/beeflow/tests/test_scheduler.py
similarity index 100%
rename from src/beeflow/tests/test_scheduler.py
rename to beeflow/tests/test_scheduler.py
diff --git a/src/beeflow/tests/test_scheduler_mars.py b/beeflow/tests/test_scheduler_mars.py
similarity index 100%
rename from src/beeflow/tests/test_scheduler_mars.py
rename to beeflow/tests/test_scheduler_mars.py
diff --git a/src/beeflow/tests/test_scheduler_resource_allocation.py b/beeflow/tests/test_scheduler_resource_allocation.py
similarity index 100%
rename from src/beeflow/tests/test_scheduler_resource_allocation.py
rename to beeflow/tests/test_scheduler_resource_allocation.py
diff --git a/src/beeflow/tests/test_scheduler_rest.py b/beeflow/tests/test_scheduler_rest.py
similarity index 100%
rename from src/beeflow/tests/test_scheduler_rest.py
rename to beeflow/tests/test_scheduler_rest.py
diff --git a/src/beeflow/tests/test_slurm_worker.py b/beeflow/tests/test_slurm_worker.py
similarity index 100%
rename from src/beeflow/tests/test_slurm_worker.py
rename to beeflow/tests/test_slurm_worker.py
diff --git a/src/beeflow/tests/test_tm.py b/beeflow/tests/test_tm.py
similarity index 100%
rename from src/beeflow/tests/test_tm.py
rename to beeflow/tests/test_tm.py
diff --git a/src/beeflow/tests/test_wf_interface.py b/beeflow/tests/test_wf_interface.py
similarity index 100%
rename from src/beeflow/tests/test_wf_interface.py
rename to beeflow/tests/test_wf_interface.py
diff --git a/src/beeflow/tests/test_wf_manager.py b/beeflow/tests/test_wf_manager.py
similarity index 100%
rename from src/beeflow/tests/test_wf_manager.py
rename to beeflow/tests/test_wf_manager.py
diff --git a/ci/integration_test.py b/ci/integration_test.py
index 736dca637..2260c3ad3 100755
--- a/ci/integration_test.py
+++ b/ci/integration_test.py
@@ -1,11 +1,15 @@
 #!/usr/bin/env python
 """CI workflow run script."""
-from beeflow.common.config_driver import BeeConfig as bc
-from beeflow.client import bee_client
 import subprocess
 import os
-import time
+import shutil
 import sys
+import time
+import uuid
+import yaml
+
+from beeflow.common.config_driver import BeeConfig as bc
+from beeflow.client import bee_client
 
 
 # Max time of each workflow
@@ -48,32 +52,49 @@ def build(self):
 class Workflow:
     """Workflow CI class for interacting with BEE."""
 
-    def __init__(self, name, path, main_cwl, job_file, check_fn, containers):
+    def __init__(self, name, path, tarball, main_cwl, job_file, containers, check_cleanup_fn=None):
         """Workflow constructor."""
         self.name = name
         self.path = path
+        self.tarball = tarball
         self.main_cwl = main_cwl
         self.job_file = job_file
-        self.check_fn = check_fn
         self.containers = containers
+        self.check_cleanup_fn = check_cleanup_fn
+
+    def check_cleanup(self, fn):
+        """Check cleanup decorator function."""
+
+        def decorator():
+            """Decorate the input function fn."""
+            fn()
+
+        self.check_cleanup_fn = fn
+        return decorator
 
     def run(self):
         """Attempt to submit, start and run the workflow to completion."""
+        try:
+            self._run()
+        finally:
+            self.check_cleanup_fn()
+
+    def _run(self):
+        """Attempt to submit, start and run the workflow to completion (internal version)."""
         # Build all the containers first
         print('Building all containers')
         for ctr in self.containers:
             ctr.build()
-        out_tarball = f'{self.name}.tgz'
-        print('Creating the workflow tarball', out_tarball)
+        print('Creating the workflow tarball', self.tarball)
         try:
-            subprocess.check_call(['tar', '-C', os.path.dirname(self.path), '-czf', out_tarball,
+            subprocess.check_call(['tar', '-C', os.path.dirname(self.path), '-czf', self.tarball,
                                    os.path.basename(self.path)])
         except subprocess.CalledProcessError as error:
             raise CIError(
                 f'workflow tar cmd: {error}'
             ) from None
         try:
-            wf_id = bee_client.submit(self.name, out_tarball, self.main_cwl, self.job_file)
+            wf_id = bee_client.submit(self.name, self.tarball, self.main_cwl, self.job_file)
             bee_client.start(wf_id)
             time.sleep(2)
             t = 0
@@ -84,13 +105,12 @@ def run(self):
             raise CIError(*error.args) from None
         if t >= TIMEOUT:
             raise CIError('timeout exceeded')
-        self.check_fn()
 
 
-def test_workflows(workflows):
+def test_workflows(wfls):
     """Test run all workflows."""
     results = {}
-    for wfl in workflows:
+    for wfl in wfls:
         try:
             wfl.run()
         except CIError as error:
@@ -99,11 +119,11 @@ def test_workflows(workflows):
             results[wfl.name] = None
 
     print('######## WORKFLOW RESULTS ########')
-    fails = sum(1 if results[name] is not None else 0 for name in results)
+    fails = sum(1 if result is not None else 0 for name, result in results.items())
     passes = len(results) - fails
     print(f'{passes} passes, {fails} fails')
-    for name in results:
-        error = results[name]
+    for name, result in results.items():
+        error = result
         if error is not None:
             print(f'{name}: {error}')
     print('##################################')
@@ -113,21 +133,291 @@ def test_workflows(workflows):
 # Initialize BEE's config system
 bc.init()
 
-# Workflow check functions
-def check_clamr():
-    """Ensure that CLAMR was successful."""
-    path = os.path.expanduser('~/CLAMR_movie.mp4')
+
+def ch_image_delete(img_name):
+    """Execute a ch-image delete [img_name]."""
+    try:
+        subprocess.check_call(['ch-image', 'delete', img_name])
+    except subprocess.CalledProcessError:
+        raise CIError(
+            f'failed when calling `ch-image delete {img_name}` to clean up'
+        ) from None
+
+
+def ch_image_list():
+    """Execute a ch-image list and return the images."""
+    try:
+        res = subprocess.run(['ch-image', 'list'], stdout=subprocess.PIPE, check=True)
+        output = res.stdout.decode(encoding='utf-8')
+        images = [img for img in output.split('\n') if img]
+        return images
+    except subprocess.CalledProcessError as err:
+        raise CIError(f'failed when calling `ch-image list`: {err}') from err
+
+
+def check_path_exists(path):
+    """Check that the specified path exists."""
     if not os.path.exists(path):
-        raise CIError(f'CLAMR: missing output file "{path}"')
+        raise CIError(f'expected file "{path}" does not exist')
+
+
+#
+# Inline workflow generation code
+#
+
+
+def generate_builder_workflow(output_path, docker_requirement, main_input):
+    """Generate a base workflow to be used for testing the builder."""
+    os.makedirs(output_path, exist_ok=True)
+    main_cwl_file = 'workflow.cwl'
+    main_cwl_data = {
+        'cwlVersion': 'v1.0',
+        'class': 'Workflow',
+        'inputs': {
+            'main_input': 'string',
+        },
+        'outputs': {
+            'main_output': {
+                'outputSource': 'step0/step_output',
+                'type': 'File',
+            },
+        },
+        'steps': {
+            'step0': {
+                'run': 'step0.cwl',
+                'in': {
+                    'step_input': 'main_input',
+                },
+                'out': ['step_output'],
+                'hints': {
+                    'DockerRequirement': docker_requirement,
+                },
+            }
+        },
+    }
+    with open(os.path.join(output_path, main_cwl_file), 'w', encoding='utf-8') as fp:
+        yaml.dump(main_cwl_data, fp, Dumper=yaml.CDumper)
+
+    step0_file = 'step0.cwl'
+    step0_data = {
+        'cwlVersion': 'v1.0',
+        'class': 'CommandLineTool',
+        'baseCommand': 'touch',
+        'inputs': {
+            'step_input': {
+                'type': 'string',
+                'inputBinding': {
+                    'position': 1,
+                },
+            },
+        },
+        'outputs': {
+            'step_output': {
+                'type': 'stdout',
+            }
+        },
+        'stdout': 'output.txt',
+    }
+    with open(os.path.join(output_path, step0_file), 'w', encoding='utf-8') as fp:
+        yaml.dump(step0_data, fp, Dumper=yaml.CDumper)
+
+    job_file = 'job.yml'
+    job_data = {
+        'main_input': main_input,
+    }
+    with open(os.path.join(output_path, job_file), 'w', encoding='utf-8') as fp:
+        yaml.dump(job_data, fp, Dumper=yaml.CDumper)
+
+    return (main_cwl_file, job_file)
+
+
+BASE_CONTAINER = 'alpine'
+SIMPLE_DOCKERFILE = """
+# Dummy docker file that really doesn't do much
+FROM alpine
+
+# Install something that has minimal dependencies
+RUN apk update && apk add bzip2
+"""
+# Dump the Dockerfile to a path that the later code can reference
+DOCKER_FILE_PATH = os.path.join('/tmp', f'Dockerfile-{uuid.uuid4().hex}')
+with open(DOCKER_FILE_PATH, 'w', encoding='utf-8') as docker_file_fp:
+    docker_file_fp.write(SIMPLE_DOCKERFILE)
+
+#
+# Workflows setup
+#
+
+
+WORKFLOWS = []
+
+# Remove an existing base container
+if BASE_CONTAINER in ch_image_list():
+    ch_image_delete(BASE_CONTAINER)
+
+
+# `beeflow:copyContainer` workflow
+CC_CONTAINER_PATH = f'/tmp/copy_container-{uuid.uuid4().hex}.tar.gz'
+CC_CONTAINER_NAME = 'copy-container'
+CC_CONTAINER = Container(CC_CONTAINER_NAME, DOCKER_FILE_PATH, CC_CONTAINER_PATH)
+CC_WORKFLOW_PATH = os.path.join('/tmp', f'bee-cc-workflow-{uuid.uuid4().hex}')
+CC_WORKFLOW_TARBALL = f'{CC_WORKFLOW_PATH}.tgz'
+CC_MAIN_INPUT = 'copy_container'
+CC_DOCKER_REQUIREMENT = {
+    'beeflow:copyContainer': CC_CONTAINER_PATH,
+}
+CC_MAIN_CWL, CC_JOB_FILE = generate_builder_workflow(CC_WORKFLOW_PATH, CC_DOCKER_REQUIREMENT,
+                                                     CC_MAIN_INPUT)
+CC_WORKFLOW = Workflow('copy-container', CC_WORKFLOW_PATH, CC_WORKFLOW_TARBALL,
+                       main_cwl=CC_MAIN_CWL, job_file=CC_JOB_FILE, containers=[CC_CONTAINER])
+WORKFLOWS.append(CC_WORKFLOW)
+
+
+@CC_WORKFLOW.check_cleanup
+def copy_container_check_cleanup():
+    """Ensure that using `beeflow:copyContainer` was successful and then do cleanup."""
+    # Ensure the output file was created
+    path = os.path.expanduser(f'~/{CC_MAIN_INPUT}')
+    check_path_exists(path)
+    os.remove(path)
+    # Ensure that the container has been copied into the archive
+    container_archive = bc.get('builder', 'container_archive')
+    basename = os.path.basename(CC_CONTAINER_PATH)
+    path = os.path.join(container_archive, basename)
+    check_path_exists(path)
+    os.remove(path)
+    ch_image_delete(BASE_CONTAINER)
+    ch_image_delete(CC_CONTAINER_NAME)
+    # Delete the generated container
+    shutil.rmtree(CC_WORKFLOW_PATH)
+    os.remove(CC_CONTAINER_PATH)
+    os.remove(CC_WORKFLOW_TARBALL)
+
+
+# `beeflow:useContainer` workflow
+USE_CONTAINER_PATH = os.path.expanduser(f'~/use_container-{uuid.uuid4().hex}.tar.gz')
+USE_CONTAINER_NAME = 'use-container'
+USE_CONTAINER = Container(USE_CONTAINER_NAME, DOCKER_FILE_PATH, USE_CONTAINER_PATH)
+USE_CONTAINER_WORKFLOW_PATH = os.path.join('/tmp', f'bee-use-ctr-workflow-{uuid.uuid4().hex}')
+USE_CONTAINER_WORKFLOW_TARBALL = f'{USE_CONTAINER_WORKFLOW_PATH}.tgz'
+USE_CONTAINER_MAIN_INPUT = 'use_ctr'
+USE_CONTAINER_DOCKER_REQUIREMENT = {
+    'beeflow:useContainer': USE_CONTAINER_PATH,
+}
+USE_CONTAINER_MAIN_CWL, USE_CONTAINER_JOB_FILE = generate_builder_workflow(
+    USE_CONTAINER_WORKFLOW_PATH,
+    USE_CONTAINER_DOCKER_REQUIREMENT,
+    USE_CONTAINER_MAIN_INPUT,
+)
+USE_CONTAINER_WORKFLOW = Workflow('use-container', USE_CONTAINER_WORKFLOW_PATH,
+                                  USE_CONTAINER_WORKFLOW_TARBALL, main_cwl=USE_CONTAINER_MAIN_CWL,
+                                  job_file=USE_CONTAINER_JOB_FILE, containers=[USE_CONTAINER])
+WORKFLOWS.append(USE_CONTAINER_WORKFLOW)
+
+
+@USE_CONTAINER_WORKFLOW.check_cleanup
+def use_ctr_check_cleanup():
+    """Check that the `beeflow:useContainer` example worked properly and then clean up."""
+    path = os.path.expanduser(f'~/{USE_CONTAINER_MAIN_INPUT}')
+    check_path_exists(path)
+    os.remove(path)
+    # This container should not have been copied into the container archive
+    container_archive = bc.get('builder', 'container_archive')
+    basename = os.path.basename(USE_CONTAINER_PATH)
+    path = os.path.join(container_archive, basename)
+    if os.path.exists(path):
+        raise CIError(
+            f'the container "{basename}" was copied into the container archive, but shouldn\'t '
+            'have been'
+        )
+    ch_image_delete(BASE_CONTAINER)
+    ch_image_delete(USE_CONTAINER_NAME)
+    # Delete both the workflow path and the container generated
+    shutil.rmtree(USE_CONTAINER_WORKFLOW_PATH)
+    os.remove(USE_CONTAINER_PATH)
+    os.remove(USE_CONTAINER_WORKFLOW_TARBALL)
+
+
+# `dockerFile` workflow
+DF_WORKFLOW_PATH = os.path.join('/tmp', f'bee-df-workflow-{uuid.uuid4().hex}')
+DF_WORKFLOW_TARBALL = f'{DF_WORKFLOW_PATH}.tgz'
+DF_CONTAINER_NAME = 'docker_file_test'
+DF_DOCKER_REQUIREMENT = {
+    'dockerFile': DOCKER_FILE_PATH,
+    'beeflow:containerName': DF_CONTAINER_NAME,
+}
+DF_MAIN_INPUT = 'docker_file'
+DF_MAIN_CWL, DF_JOB_FILE = generate_builder_workflow(DF_WORKFLOW_PATH, DF_DOCKER_REQUIREMENT,
+                                                     DF_MAIN_INPUT)
+DF_WORKFLOW = Workflow('docker-file', DF_WORKFLOW_PATH, DF_WORKFLOW_TARBALL, main_cwl=DF_MAIN_CWL,
+                       job_file=DF_JOB_FILE, containers=[])
+WORKFLOWS.append(DF_WORKFLOW)
+
+
+@DF_WORKFLOW.check_cleanup
+def docker_file_check_cleanup():
+    """Ensure that the `dockerFile` example ran properly and then clean up."""
+    path = os.path.expanduser(f'~/{DF_MAIN_INPUT}')
+    check_path_exists(path)
+    os.remove(path)
+    # The container should have been copied into the archive
+    container_archive = bc.get('builder', 'container_archive')
+    tarball = f'{DF_CONTAINER_NAME}.tar.gz'
+    path = os.path.join(container_archive, tarball)
+    check_path_exists(path)
+    os.remove(path)
+    # Check that the container is listed
+    images = ch_image_list()
+    if DF_CONTAINER_NAME not in images:
+        raise CIError(f'cannot find expected container "{DF_CONTAINER_NAME}"')
+    ch_image_delete(BASE_CONTAINER)
+    ch_image_delete(DF_CONTAINER_NAME)
+    # Delete the generated workflow
+    shutil.rmtree(DF_WORKFLOW_PATH)
+    os.remove(DF_WORKFLOW_TARBALL)
+
+
+# `dockerPull` workflow
+DP_WORKFLOW_PATH = os.path.join('/tmp', f'bee-dp-workflow-{uuid.uuid4().hex}')
+DP_WORKFLOW_TARBALL = f'{DP_WORKFLOW_PATH}.tgz'
+DP_CONTAINER_NAME = BASE_CONTAINER
+DP_DOCKER_REQUIREMENT = {
+    'dockerPull': DP_CONTAINER_NAME,
+}
+DP_MAIN_INPUT = 'docker_pull'
+DP_MAIN_CWL, DP_JOB_FILE = generate_builder_workflow(DP_WORKFLOW_PATH, DP_DOCKER_REQUIREMENT,
+                                                     DP_MAIN_INPUT)
+DP_WORKFLOW = Workflow('docker-pull', DP_WORKFLOW_PATH, DP_WORKFLOW_TARBALL, main_cwl=DP_MAIN_CWL,
+                       job_file=DP_JOB_FILE, containers=[])
+WORKFLOWS.append(DP_WORKFLOW)
+
 
+@DP_WORKFLOW.check_cleanup
+def docker_pull_check_cleanup():
+    """Check that the `dockerPull` option was successful and then do cleanup."""
+    path = os.path.expanduser(f'~/{DP_MAIN_INPUT}')
+    check_path_exists(path)
+    os.remove(path)
+    # Check that the image tarball is in the archive
+    container_archive = bc.get('builder', 'container_archive')
+    path = os.path.join(container_archive, f'{DP_CONTAINER_NAME}.tar.gz')
+    check_path_exists(path)
+    os.remove(path)
+    # Check for the image with `ch-image list`
+    images = ch_image_list()
+    if DP_CONTAINER_NAME not in images:
+        raise CIError(f'could not find expected container "{DP_CONTAINER_NAME}"')
+    ch_image_delete(DP_CONTAINER_NAME)
+    # Delete the workflow path
+    shutil.rmtree(DP_WORKFLOW_PATH)
+    os.remove(DP_WORKFLOW_TARBALL)
 
-# Set up containers and workflows
-clamr_ctr = Container('clamr', 'src/beeflow/data/dockerfiles/Dockerfile.clamr-ffmpeg',
-                      '/tmp/clamr.tar.gz')
-workflows = [
-    Workflow('clamr', './src/beeflow/data/cwl/bee_workflows/clamr-ci', main_cwl='clamr_wf.cwl',
-             job_file='clamr_job.yml', check_fn=check_clamr, containers=[clamr_ctr]),
-]
 
 # Run the workflows and then show completion results
-sys.exit(test_workflows(workflows))
+ret = test_workflows(WORKFLOWS)
+# General clean up
+os.remove(DOCKER_FILE_PATH)
+sys.exit(ret)
+# Ignore W0231: This is a user-defined exception and I don't think we need to call
+#               __init__ on the base class.
+# pylama:ignore=W0231