Use the templating system#
About#
This example demonstrates how to customize woom’s job script generation by extending the built-in templates.
Woom automatically generates job scripts for each task using default templates. This example shows how to override and extend these templates to add custom functionality.
The example customizes two templates:
templates/job.sh - Custom job script header:
Uses
{% extends "!job.sh" %}to inherit from the built-in job template (the!prefix refers to woom’s internal templates)Overrides the
{% block header %}section to add workflow metadataUses
{{ super() }}to include the parent template’s content before adding custom linesDemonstrates accessing workflow context variables like
app_name,app_conf,app_exp, andtask.name
templates/env.sh - Custom environment setup:
Extends the built-in environment template
Adds a custom
OMP_NUM_THREADSconfiguration in the{% block env_vars %}sectionCreates a new
{% block custom %}with utility functions likelog_message()Shows how to add reusable bash functions for task scripts
This example is essential for users who need to customize job script headers, add environment setup, integrate with specific HPC systems, or add logging and debugging utilities.
Path: examples/academic/templates.
Configuring#
workflow.cfg#[app]
name=CROCO
conf=MANGA
exp=exp23
[cycles]
begin_date=2020-01-01
end_date=2020-01-02
[stages]
[[cycles]]
run=run_croco
tasks.cfg#[run_croco]
[[content]]
commandline=echo croco
hosts.cfg#[local]
# defaults
Running#
Overview#
Let’s have an overview of stages before running the workflow.
$ woom show overview
##################################### APP ######################################
name: CROCO
conf: MANGA
exp: exp23
################################## TASK TREE ###################################
cycles:
- run: run_croco
#################################### CYCLES ####################################
2020-01-01T00:00:00+00:00 -> 2020-01-02T00:00:00+00:00 (1 days 00:00:00)
################################### ENSEMBLE ###################################
no member
Dry run#
Now let’s run the workflow in test (dry) and debug modes.
$ woom run --log-no-color --log-level debug --dry-run
woom.log : DEBUG *** STARTED LOG SESSION ***
woom.cli : DEBUG Run the workflow
woom.cli : DEBUG Loading extensions
woom.cli : INFO No extension to load
woom.cli : DEBUG Load workflow config: /home/docs/checkouts/readthedocs.org/user_builds/woom/checkouts/latest/examples/academic/templates/workflow.cfg
woom.cli : INFO Loaded workflow config
woom.cli : INFO App name: CROCO
woom.cli : INFO App conf: MANGA
woom.cli : INFO App exp: exp23
woom.cli : DEBUG Initialize the host manager
woom.cli : INFO Initialized the host manager
woom.cli : DEBUG Load hosts config file: hosts.cfg
woom.cli : INFO Loaded hosts config file: hosts.cfg
woom.cli : DEBUG Infer host
woom.cli : INFO Infered host: local
woom.cli : DEBUG Initialize the task manager
woom.cli : INFO Initialized the task manager
woom.cli : DEBUG Load the task config file: tasks.cfg
woom.cli : INFO Loaded the task config file: tasks.cfg
woom.cli : DEBUG Initialize the workflow
woom.workflow: DEBUG Task tree:
cycles:
- run: run_croco
woom.workflow: INFO User templates directory enabled: /home/docs/checkouts/readthedocs.org/user_builds/woom/checkouts/latest/examples/academic/templates/templates
woom.cli : INFO Initialized the workflow
woom.cli : INFO Successfully setup the workflow!
woom.cli : DEBUG Run the workflow
woom.workflow: DEBUG Running the workflow in fake mode
woom.workflow: DEBUG Entering stage: prolog
woom.workflow: DEBUG No sequence of task. Skipping...
woom.workflow: DEBUG Entering stage: cycles
woom.workflow: INFO Single cycle with unique date: 2020-01-01 00:00:00+00:00
woom.workflow: DEBUG Running cycle: 2020-01-01T00:00:00+00:00 -> 2020-01-02T00:00:00+00:00 (1 days 00:00:00)
woom.workflow: DEBUG Entering sequence: run
woom.workflow: DEBUG Running task: cycles/run/run_croco
woom.workflow: DEBUG Task path: CROCO/MANGA/exp23/2020-01-01T00:00:00+00:00-2020-01-02T00:00:00+00:00/run_croco
woom.workflow: DEBUG Cleaning task: cycles/run/run_croco
woom.workflow: DEBUG Creating directory: /home/docs/checkouts/readthedocs.org/user_builds/woom/checkouts/latest/examples/academic/templates/jobs/CROCO/MANGA/exp23/2020-01-01T00:00:00+00:00-2020-01-02T00:00:00+00:00
woom.workflow: INFO Created directory: /home/docs/checkouts/readthedocs.org/user_builds/woom/checkouts/latest/examples/academic/templates/jobs/CROCO/MANGA/exp23/2020-01-01T00:00:00+00:00-2020-01-02T00:00:00+00:00
woom.job : INFO Started job manager: BackgroundJobManager()
woom.workflow: DEBUG Submitting task: cycles/run/run_croco
woom.workflow: DEBUG Dependencies:
woom.workflow: DEBUG Creating directory: /home/docs/checkouts/readthedocs.org/user_builds/woom/checkouts/latest/examples/academic/templates/jobs/CROCO/MANGA/exp23/2020-01-01T00:00:00+00:00-2020-01-02T00:00:00+00:00/run_croco
woom.workflow: INFO Created directory: /home/docs/checkouts/readthedocs.org/user_builds/woom/checkouts/latest/examples/academic/templates/jobs/CROCO/MANGA/exp23/2020-01-01T00:00:00+00:00-2020-01-02T00:00:00+00:00/run_croco
woom.workflow: INFO Fake submission: CROCO/MANGA/exp23/2020-01-01T00:00:00+00:00-2020-01-02T00:00:00+00:00/run_croco → bash /home/docs/checkouts/readthedocs.org/user_builds/woom/checkouts/latest/examples/academic/templates/jobs/CROCO/MANGA/exp23/2020-01-01T00:00:00+00:00-2020-01-02T00:00:00+00:00/run_croco/job.sh
woom.workflow: DEBUG Fake submission:
--------------- submission command ---------------
bash /home/docs/checkouts/readthedocs.org/user_builds/woom/checkouts/latest/examples/academic/templates/jobs/CROCO/MANGA/exp23/2020-01-01T00:00:00+00:00-2020-01-02T00:00:00+00:00/run_croco/job.sh
-------------- batch script content --------------
#!/bin/bash
# Prolog
set -eo pipefail
# - handler for graceful termination
on_sigterm() {
echo "Received termination signal, cleaning up..."
# Just exit cleanly, let on_exit handle status
exit 0
}
# - handler for killing termination
on_sigkill() {
echo "Received kill signal, cleaning up..." >&2
# Just exit cleanly, let on_exit handle status
exit 1
}
# - handler for exit (always called)
on_exit() {
status=$?
if [ ! -f "/home/docs/checkouts/readthedocs.org/user_builds/woom/checkouts/latest/examples/academic/templates/jobs/CROCO/MANGA/exp23/2020-01-01T00:00:00+00:00-2020-01-02T00:00:00+00:00/run_croco/job.terminating" ]; then
echo $status > "/home/docs/checkouts/readthedocs.org/user_builds/woom/checkouts/latest/examples/academic/templates/jobs/CROCO/MANGA/exp23/2020-01-01T00:00:00+00:00-2020-01-02T00:00:00+00:00/run_croco/job.status"
fi
exit $status
}
trap on_sigterm SIGKILL
trap on_sigkill SIGTERM SIGINT
trap on_exit EXIT
# Workflow: CROCO
# Configuration: MANGA
# Experiment: exp23
# Task: run_croco
# Environment variables
export WOOM_TASK_NAME="run_croco"
export WOOM_RUN_DIR="/home/docs/woom/scratch/woom/CROCO/MANGA/exp23/2020-01-01T00:00:00+00:00-2020-01-02T00:00:00+00:00/run_croco"
export WOOM_WORKFLOW="/home/docs/checkouts/readthedocs.org/user_builds/woom/checkouts/latest/examples/academic/templates/workflow.cfg"
export WOOM_HOST="local"
export WOOM_TASKMANAGER="/home/docs/checkouts/readthedocs.org/user_builds/woom/envs/latest/lib/python3.11/site-packages/woom/tasks.cfg:/home/docs/checkouts/readthedocs.org/user_builds/woom/checkouts/latest/examples/academic/templates/tasks.cfg"
export WOOM_JOBMANAGER="BackgroundJobManager"
export WOOM_TASK_TREE_CYCLES_RUN="['run_croco']"
export WOOM_CYCLES="2020-01-01T00:00:00+00:00-2020-01-02T00:00:00+00:00"
export WOOM_NMEMBERS="0"
export WOOM_MEMBERS=""
export WOOM_PATHS_PATH="/home/docs/checkouts/readthedocs.org/user_builds/woom/checkouts/latest/examples/academic/templates/bin"
export WOOM_PATHS_PYTHONPATH="/home/docs/checkouts/readthedocs.org/user_builds/woom/checkouts/latest/examples/academic/templates/lib/python"
export WOOM_PATHS_LIBRARY_PATH="/home/docs/checkouts/readthedocs.org/user_builds/woom/checkouts/latest/examples/academic/templates/lib"
export WOOM_PATHS_INCLUDE_PATH="/home/docs/checkouts/readthedocs.org/user_builds/woom/checkouts/latest/examples/academic/templates/include"
export WOOM_APP_PATH="CROCO/MANGA/exp23"
export WOOM_APP_NAME="CROCO"
export WOOM_APP_CONF="MANGA"
export WOOM_APP_EXP="exp23"
export WOOM_CYCLES_BEGIN_DATE="2020-01-01T00:00:00+00:00"
export WOOM_CYCLES_END_DATE="2020-01-02T00:00:00+00:00"
export WOOM_CYCLES_ROUND=""
export WOOM_CYCLES_FREQ=""
export WOOM_CYCLES_NCYCLES="0"
export WOOM_CYCLES_INDEP="0"
export WOOM_CYCLES_AS_INTERVALS="1"
export WOOM_CYCLES_HORIZON=""
export WOOM_SCRATCH_DIR="/home/docs/woom/scratch"
export WOOM_WORK_DIR="/home/docs/woom/work"
export WOOM_WORKFLOW_DIR="/home/docs/checkouts/readthedocs.org/user_builds/woom/checkouts/latest/examples/academic/templates"
export WOOM_LOG_DIR="/home/docs/checkouts/readthedocs.org/user_builds/woom/checkouts/latest/examples/academic/templates/log"
export WOOM_CYCLE="2020-01-01T00:00:00+00:00-2020-01-02T00:00:00+00:00"
export WOOM_CYCLE_BEGIN_DATE="2020-01-01T00:00:00+00:00"
export WOOM_CYCLE_LABEL="2020-01-01T00:00:00+00:00 -> 2020-01-02T00:00:00+00:00 (1 days 00:00:00)"
export WOOM_CYCLE_TOKEN="2020-01-01T00:00:00+00:00-2020-01-02T00:00:00+00:00"
export WOOM_CYCLE_END_DATE="2020-01-02T00:00:00+00:00"
export WOOM_CYCLE_DURATION="P1DT0H0M0S"
export WOOM_CYCLE_IS_FIRST="1"
export WOOM_CYCLE_IS_LAST="1"
export WOOM_CYCLE_NEXT=""
export WOOM_CYCLE_PREV=""
export WOOM_MEMBER=""
export WOOM_TASK="run_croco"
export WOOM_TASK_PATH="CROCO/MANGA/exp23/2020-01-01T00:00:00+00:00-2020-01-02T00:00:00+00:00/run_croco"
export WOOM_TASK_RUN_DIR="/home/docs/woom/scratch/woom/CROCO/MANGA/exp23/2020-01-01T00:00:00+00:00-2020-01-02T00:00:00+00:00/run_croco"
export WOOM_TASK_SUBMISSION_DIR="/home/docs/checkouts/readthedocs.org/user_builds/woom/checkouts/latest/examples/academic/templates/jobs/CROCO/MANGA/exp23/2020-01-01T00:00:00+00:00-2020-01-02T00:00:00+00:00/run_croco"
export WOOM_TASK_SCRIPT_PATH="/home/docs/checkouts/readthedocs.org/user_builds/woom/checkouts/latest/examples/academic/templates/jobs/CROCO/MANGA/exp23/2020-01-01T00:00:00+00:00-2020-01-02T00:00:00+00:00/run_croco/job.sh"
export WOOM_SUBMISSION_DIR="/home/docs/checkouts/readthedocs.org/user_builds/woom/checkouts/latest/examples/academic/templates/jobs/CROCO/MANGA/exp23/2020-01-01T00:00:00+00:00-2020-01-02T00:00:00+00:00/run_croco"
export WOOM_SCRIPT_PATH="/home/docs/checkouts/readthedocs.org/user_builds/woom/checkouts/latest/examples/academic/templates/jobs/CROCO/MANGA/exp23/2020-01-01T00:00:00+00:00-2020-01-02T00:00:00+00:00/run_croco/job.sh"
export WOOM_TASK_ENV=""
export WOOM_ENV=""
export WOOM_TASK_CONTEXT_JSON="/home/docs/checkouts/readthedocs.org/user_builds/woom/checkouts/latest/examples/academic/templates/jobs/CROCO/MANGA/exp23/2020-01-01T00:00:00+00:00-2020-01-02T00:00:00+00:00/run_croco/context.json"
export WOOM_CONTEXT_JSON="/home/docs/checkouts/readthedocs.org/user_builds/woom/checkouts/latest/examples/academic/templates/jobs/CROCO/MANGA/exp23/2020-01-01T00:00:00+00:00-2020-01-02T00:00:00+00:00/run_croco/context.json"
export PATH=/home/docs/checkouts/readthedocs.org/user_builds/woom/checkouts/latest/examples/academic/templates/bin:$PATH
export PYTHONPATH=/home/docs/checkouts/readthedocs.org/user_builds/woom/checkouts/latest/examples/academic/templates/lib/python:$PYTHONPATH
export LIBRARY_PATH=/home/docs/checkouts/readthedocs.org/user_builds/woom/checkouts/latest/examples/academic/templates/lib:$LIBRARY_PATH
export INCLUDE_PATH=/home/docs/checkouts/readthedocs.org/user_builds/woom/checkouts/latest/examples/academic/templates/include:$INCLUDE_PATH
export OMP_NUM_THREADS=${SLURM_CPUS_PER_TASK:-4}
# Utilities
function log_message() {
echo "[$(date +%Y-%m-%d_%H:%M:%S)] $*" | \
tee -a ${WOOM_LOG_DIR}/custom.log
}
# Initialization
log_message "Environment is initialized for ${WOOM_TASK_NAME}"
# Go to run dir
{ mkdir -p /home/docs/woom/scratch/woom/CROCO/MANGA/exp23/2020-01-01T00:00:00+00:00-2020-01-02T00:00:00+00:00/run_croco; cd /home/docs/woom/scratch/woom/CROCO/MANGA/exp23/2020-01-01T00:00:00+00:00-2020-01-02T00:00:00+00:00/run_croco; } || exit 1
# Run the commandline(s)
echo croco
--------------------------------------------------
woom.workflow: INFO Submitted task: cycles/run/run_croco with job id 932510
woom.workflow: INFO Successfully submitted cycle: 2020-01-01T00:00:00+00:00 -> 2020-01-02T00:00:00+00:00 (1 days 00:00:00)
woom.workflow: DEBUG Entering stage: epilog
woom.workflow: DEBUG No sequence of task. Skipping...
woom.workflow: DEBUG Terminating non-blocking jobs
woom.cli : INFO Successfully ran the workflow!
Normal run#
And finally in run it.
$ woom run --log-no-color
woom.cli : INFO No extension to load
woom.cli : INFO Loaded workflow config
woom.cli : INFO App name: CROCO
woom.cli : INFO App conf: MANGA
woom.cli : INFO App exp: exp23
woom.cli : INFO Initialized the host manager
woom.cli : INFO Loaded hosts config file: hosts.cfg
woom.cli : INFO Infered host: local
woom.cli : INFO Initialized the task manager
woom.cli : INFO Loaded the task config file: tasks.cfg
woom.workflow: INFO User templates directory enabled: /home/docs/checkouts/readthedocs.org/user_builds/woom/checkouts/latest/examples/academic/templates/templates
woom.cli : INFO Initialized the workflow
woom.cli : INFO Successfully setup the workflow!
woom.workflow: INFO Single cycle with unique date: 2020-01-01 00:00:00+00:00
woom.workflow: INFO Created directory: /home/docs/checkouts/readthedocs.org/user_builds/woom/checkouts/latest/examples/academic/templates/jobs/CROCO/MANGA/exp23/2020-01-01T00:00:00+00:00-2020-01-02T00:00:00+00:00
woom.job : INFO Started job manager: BackgroundJobManager()
woom.workflow: INFO Created directory: /home/docs/checkouts/readthedocs.org/user_builds/woom/checkouts/latest/examples/academic/templates/jobs/CROCO/MANGA/exp23/2020-01-01T00:00:00+00:00-2020-01-02T00:00:00+00:00/run_croco
woom.workflow: INFO Created batch script: /home/docs/checkouts/readthedocs.org/user_builds/woom/checkouts/latest/examples/academic/templates/jobs/CROCO/MANGA/exp23/2020-01-01T00:00:00+00:00-2020-01-02T00:00:00+00:00/run_croco/job.sh
woom.workflow: INFO Submitted task: cycles/run/run_croco with job id 953
woom.workflow: INFO Successfully submitted cycle: 2020-01-01T00:00:00+00:00 -> 2020-01-02T00:00:00+00:00 (1 days 00:00:00)
woom.cli : INFO Successfully ran the workflow!
Check status#
Check what is running or finished.
$ woom show status
╭──────────┬─────────┬───────────┬─────────────────────────────────────────────────────┬──────────────────────────────────────────────────────────────────────────────────────╮
│ STATUS │ JOBID │ TASK │ CYCLE │ SUBMISSION DIR │
├──────────┼─────────┼───────────┼─────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────────────────────┤
│ SUCCESS │ 953 │ run_croco │ 2020-01-01T00:00:00+00:00-2020-01-02T00:00:00+00:00 │ jobs/CROCO/MANGA/exp23/2020-01-01T00:00:00+00:00-2020-01-02T00:00:00+00:00/run_croco │
╰──────────┴─────────┴───────────┴─────────────────────────────────────────────────────┴──────────────────────────────────────────────────────────────────────────────────────╯
Show run directories#
Show where tasks were executed.
$ woom show run_dirs
╭───────────┬─────────────────────────────────────────────────────┬──────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ TASK │ CYCLE │ RUN DIR │
├───────────┼─────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ run_croco │ 2020-01-01T00:00:00+00:00-2020-01-02T00:00:00+00:00 │ /home/docs/woom/scratch/woom/CROCO/MANGA/exp23/2020-01-01T00:00:00+00:00-2020-01-02T00:00:00+00:00/run_croco │
╰───────────┴─────────────────────────────────────────────────────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────╯