Basic Workflow and App Inputs¶
This tutorial extends the previously created “Hello World” workflow and app to process a single input file. The “One-Step Workflow: Hello World” tutorial must be completed, and its resulting “Hello World!” workflow should be committed to a Git repo prior to beginning this tutorial.
Modify the “Hello World!” App¶
Clone the previous “Hello World!” app from the Git repo (be sure to replace Git repo URL with the appropriate URL for your app):
cd ~/geneflow_work
git clone https://github.com/[USER]/hello-world-gf2.git
Note: if the hello-world-gf2
directory still exists with the contents of the previous app tutorial, do a git pull
instead:
cd ~/geneflow_work/hello-world-gf2
git pull
Define an App Input¶
Update the app metadata to reflect the new functionality:
vi ./app.yaml
Change the description
field to indicate a change in the app; add a git
field (with [USER] replaced with your username, and github.com replaced with the appropriate Git service); update the version
field to 0.2
:
# Basic app information
# name: standard GeneFlow app name
name: hello-world-gf
# description: short description for the app
description: Updated hello world GeneFlow app
# git: link to the app's git repo
git: https://github.com/[USER]/hello-world-gf2.git
# version: must be incremented every time this file, or any file in the app
# project is modified
version: '0.2'
Next, update the file
input in the inputs
section of the app.yaml
file. Change the label
and description
of the file
input to Input text file
. Change the required
field to true
and add a test_value
field with value ${SCRIPT_DIR}/data/file.txt
. The test_value
field is only used when running the app’s test script. We will define the /data/file.txt
file in the next section. ${SCRIPT_DIR}
in the context of the test script is the directory in which the test script is located. The updated inputs
section of the app.yaml
file should look like:
inputs:
file:
label: Input Text File
description: Input text file
type: File
required: true
test_value: ${SCRIPT_DIR}/data/file.txt
Finally, change the execution commands of the app in the exec_methods
section.
exec_methods:
- name: environment
if:
- in_path: 'cat'
exec:
- run: cat ${FILE_FULL}
stdout: ${OUTPUT_FULL}
The modified execution block first checks if the cat
command is available (it should be available in all standard Linux systems). It then runs the cat
command to print the contents of the file passed as the file
input. ${FILE_FULL}
is a Bash variable that is automatically defined for the file
input, and represents the full path of the file
input.
Save and close the app.yaml
file.
Add a Test File to the App¶
Previously, we added a file called file.txt
to the test folder. Modify this file so that it contains the string Hello World File Contents!
:
cd ~/geneflow_work/hello-world-gf2/test/data
vi ./file.txt
Make sure the file has the contents:
Hello World File Contents!
Save and close the file.txt
file.
Re-“Make” the App¶
Now that the app.yaml
file has been updated and the test file defined. Rebuild the app with the following commands:
cd ~/geneflow_work/hello-world-gf2
geneflow make-app .
This should re-generate the agave-app-def.json.j2
, hello-world-gf2.sh
, and test.sh
scripts.
Test the App¶
Run the test.sh
script to test the app:
cd ~/geneflow_work/hello-world-gf2/test
./test.sh
You should see output similar to the following:
CMD=/home/[USER]/geneflow_work/hello-world-gf/test/../assets/hello-world-gf.sh --file="/home/[USER]/geneflow_work/hello-world-gf/test/data/file.txt" --output="output.txt" --exec_method="auto"
File: /home/[USER]/geneflow_work/hello-world-gf/test/data/file.txt
Output: output.txt
Execution Method: auto
Detected Execution Method: environment
CMD=cat /home/[USER]/geneflow_work/hello-world-gf/test/data/file.txt >"/home/[USER]/geneflow_work/hello-world-gf/test/output.txt"
Exit code: 0
Exit code: 0
The output.txt
file should have been created in the test directory with the text Hello World File Contents!
. View it with:
cat ./output.txt
And you should see:
Hello World File Contents!
Update the App README¶
Update the app README.rst
file to reflect changes to the app:
cd ~/geneflow_work/hello-world-gf2
vi ./README.rst
Modify the file so it looks like the following:
Hello World! Updated GeneFlow App
=================================
Version: 0.2
This is a basic GeneFlow app with an input.
Inputs
------
1. file: Input text file.
Parameters
----------
1. output: Output text file where "Hello World File Contents!" will be printed.
Commit and Tag the New App¶
Finally, commit the updated app to the Git repo and update its tag to reflect the new version number:
cd ~/geneflow_work/hello-world-gf2
git add -u
git commit -m "update app input"
git tag 0.2
git push --tags origin master
Modify the “Hello World!” Workflow¶
Now that the app has been updated, we can update the “Hello World!” workflow to use the new app.
Checkout the previous “Hello World!” workflow:
cd ~/geneflow_work
git clone https://github.com/[USER]/hello-world-workflow-gf2.git
Note: if the hello-world-workflow-gf2
directory still exists with the contents of the previous workflow tutorial, do a git pull
instead:
cd ~/geneflow_work/hello-world-workflow-gf2
git pull
Update Workflow Metadata¶
Update the workflow metadata by incrementing the version number to 0.2
:
vi ./workflow.yaml
The metadata section should have the line:
version: '0.2'
Update Apps¶
Update the “Apps” section by incrementing the version:
apps:
hello-world:
git: https://github.com/[USERS]/hello-world-gf2.git
version: '0.2'
Be sure to replace the “git” field with the correct Git repo to which you committed the “Hello World!” app.
Define a Workflow Input¶
Update the inputs
section of workflow.yaml
so that the file
input label and description are correct:
inputs:
file:
label: Input Text File
description: Input text file
type: File
enable: true
visible: true
Pass the Workflow Input to the App¶
The steps
section of workflow.yaml
should already be defined to take the correct workflow input:
steps:
hello:
app: hello-world
depend: []
template:
file: ${workflow->file}
output: output.txt
Save and close the workflow.yaml
file.
Update the Workflow README¶
Update the README.rst
file to reflect the new workflow input:
cd ~/geneflow_work/hello-world-workflow-gf2
vi ./README.rst
Modify the file so it looks like the following:
Hello World! One-Step GeneFlow Workflow
=======================================
Version: 0.2
This is a basic one-step GeneFlow workflow that prints the contexts of an input text file to an output text file.
Inputs
------
1. file: Input text file.
Parameters
----------
None
Commit and Tag the New Workflow¶
Commit the new version of the workflow to the Git repo:
cd ~/geneflow_work/hello-world-workflow-gf2
git add -u
git commit -m "updated hello world workflow"
git tag 0.2
git push --tags origin master
Install and Test the Workflow¶
Now that the workflow has been updated and committed to a Git repo, we can install and test it:
cd ~/geneflow_work
geneflow install-workflow -g https://github.com/[USER]/hello-world-workflow-gf2.git -c --make_apps ./test-workflow-0.2
This command installs the updated “Hello World!” one-step workflow, and its updated “Hello World!” app into the directory test-workflow-0.2
. Remember to replace the Git URL with the URL to which you committed the workflow.
Test the workflow to validate its functionality:
geneflow run ./test-workflow-2.0 -o output --in.file=./test-workflow-0.2/data/test.txt
This command runs the workflow in the test-workflow-0.2
directory using the test data and copies the output to the output
directory.
Once complete, you should see a file called output.txt
with the same text as the input test.txt
file, Test Hello World!
:
cat ./output/geneflow-job-[JOB ID]/hello/output.txt
Be sure to replace [JOB ID]
with the ID of the GeneFlow job. The job ID is a randomly generated string and ensures that workflow jobs do not overwrite existing job output. You should see the following text in the output.txt
file:
Test Hello World!
Summary¶
Congratulations! You updated the one-step GeneFlow workflow so that it can handle a basic input file. The next tutorial will expand on this workflow by using an app with piped execution.