Skip to content

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).