From python#

Instead of calling the commandline interface, you can run your workflow from python. Here is a minimal list of operations you can do. Have a look to the woom.cli module for more info.

Initializations#

Import modules:

import logging
import woom.log as wlog
import woom.ext as wext
import woom.tasks as wtasks
import woom.hosts as whosts
import woom.workflow as wworkflow

Initialize the logger:

wlog.setup_logger(console_level="debug", to_file="woom.log")
logger = logging.getLogger("woom")

Setup the workflow#

Load the extension files with load_jinja_filters() and load_validator_functions():

wext.load_jinja_filters("ext/jinja_filters.py") # Jinja filters
wext.load_validator_functions("ext/validator_functions.py") # Configobj validator functions

Alternatively, if your extension files are in the ext/ directory, you can use load_extensions():

wext.load_extensions(".")

Initialize the host manager:

hostmanager = whosts.HostManager()
hostmanager.load_config("hosts.cfg")

Set your host:

host = hostmanager.get_host("datarmor")

Alternatively, you can infer your host thanks to the patterns configuration option if set:

host = hostmanager.infer_host()

Initialize the task manager:

taskmanager = wtasks.TaskManager(host)
taskmanager.load_config("tasks.cfg")

Finally, initialize the workflow:

workflow = wworkflow.Workflow("workflow.cfg", taskmanager)

Operate#

To print an overview, call get_overview():

workflow.show_overview()

If it’s ok, run the workflow with run(). Do it first in fake mode so that it will tell what will be done without doing it:

workflow.run(dry=True)

The run it for real:

workflow.run()

If you just want to re-run tasks that have already run, use the update keyword:

workflow.run(update=True)

To check the status of all workflow tasks and their associated jobs, use show_status():

workflow.show_status()

To show the status of only running jobs, use the running keyword:

workflow.show_status(running=True)

If you wan to kill all your jobs, call kill():

workflow.kill()

You can fine tune which jobs you want to kill:

workflow.kill("1256")                                          # by job id
workflow.kill(task_name="mytask")                              # by task
workflow.kill(cycle="2020-01-01T00:00:00-2020-01-01T06:00:00") # by cycle
workflow.kill(member=1)                                        # by ensemble member id

Filling templates#

If your tasks have a [[fill]] configuration section, you can manually fill templates using fill_templates().

First, set the context for the task you want to fill templates for:

workflow.set_context(task_name="run_model", cycle="2020-01-01T00:00:00", member=1)

Then fill all templates configured for this task:

workflow.fill_templates()

This will render all templates defined in the task’s [[fill]] section and write them to their destination paths.

Alternatively, you can fill a single template directly:

task = workflow.get_task("run_model")
task.set_context(workflow.get_context(task_name="run_model", cycle="2020-01-01T00:00:00"))
task.fill_templates()

See Templating In-Depth for more information about user templates and the fill feature.