Aborting a WFL Workload⚓︎
Aborting a workload is done by aborting individual workflows directly with Cromwell.
Tip
This only works with Cromwell! Don't try this script for things running in Terra, it won't work.
Here's a script that can help with that:
# Usage: bash abort.sh QUERY [WFL_URL] [THREADS]
# QUERY is either like `project=PO-123` or `uuid=1a2b3c4d`
# WFL_URL is optionally the WFL to abort workflows from
# Default is the gotc-prod WFL
# THREADS is optionally the number of threads to use to talk to Cromwell
# Default is 2
# Usage: bash abort.sh QUERY [WFL_URL]
# QUERY is either like `project=PO-123` or `uuid=1a2b3c4d`
# WFL_URL is the WFL instance to abort workflows from [default: gotc-prod]
WFL_URL="${2:-https://gotc-prod-wfl.gotc-prod.broadinstitute.org}"
AUTH_HEADER="Authorization: Bearer $(gcloud auth print-access-token)"
getWorkloads () {
# Query -> [Workload]
curl -s -X GET "${WFL_URL}/api/v1/workload?$1" \
-H "${AUTH_HEADER}" \
| jq
}
getWorkflows() {
# Workload -> [Workflow]
uuid=$(jq -r .uuid <<< "$1")
curl -s -X GET "${WFL_URL}/api/v1/workload/${uuid}/workflows" \
-H "${AUTH_HEADER}" \
| jq
}
mapjq () {
jq -c '.[]' <<< "${2}" \
| while read elem; do ${1} "${elem}"; done \
| jq '[ .[] ]'
}
main() {
# Query -> ()
workloads=$(getWorkloads "${1}")
cromwell=$(jq -r 'map(.executor) | .[0]' <<< "$WORKLOAD")
mapjq getWorkflows "${workloads}"
| jq -s 'flatten
| map(select(.status != "Failed" and .status != "Succeeded") | .uuid)
| .[]' \
| xargs -I % -n 1 -P ${3:-2} curl -w "\n" -s -X POST "$CROMWELL/api/workflows/v1/%/abort" \
-H "${AUTH_HEADER}" \
-H "Content-Type: application/json"
}
main "$1"
The 'QUERY' part is like you'd pass to retry.sh.
You don't necessarily need to query WFL for the workload. As of this writing,
the response from /start
or /exec
includes the workflow UUIDs, so if you
stored that response in WORKLOAD
then you could abort it without having
to query WFL (and trigger WFL's potentially lengthy update process).