Using embedded triggers
This section provides a exercise showing the use of embedded triggers.
These are trigger expressions embedded within the task scrips using the --wait command.
Whilst the expression is not true, the job will hold i.e. continue to wait.
Whenever possible, giving preference to triggers on the suite definition is considered a better approach, as this allows extra validation upon creation, whereas embedded triggers are checked at run time.
Update Task Script
Consider the task t2.ecf script as follows:
%include <head.h>
ecflow_client --wait="t1 == complete" # wait for expression to become true
%include <tail.h>
Update Suite Definition
Consider the following suite definition, with no trigger on task t2.
# Definition of the suite test.
suite test
edit ECF_INCLUDE "{{HOME}}/course" # replace '{{HOME}}' appropriately
edit ECF_HOME "{{HOME}}/course"
family f1
edit SLEEP 20
task t1
task t2
endfamily
endsuite
import os
from ecflow import Defs, Suite, Family, Task, Edit, Trigger
def create_family_f1():
return Family("f1", Edit(SLEEP=20), Task("t1"), Task("t2"))
print("Creating suite definition")
home = os.path.join(os.getenv("HOME"), "course")
defs = Defs(Suite("test", Edit(ECF_INCLUDE=home, ECF_HOME=home), create_family_f1()))
print(defs)
print("check trigger expressions")
check = defs.check()
assert len(check) == 0, check
print("Checking job creation: .ecf -> .job0")
print(defs.check_job_creation())
print("Saving definition to file 'test.def'")
defs.save_as_defs("test.def")
What to do
Modify the task script and the suite definition as shown above.
Replace the suite, using:
ecflow_client --suspend /test ecflow_client --replace /test test.def
python3 test.py python3 client.py
Observe the tasks in ecflow_ui.
Notice the wait icon on task t2.
Introduce an error in the wait expression and requeue the suite. Observe how the job now aborts:
ecflow_client --wait="t == complete" # Error: no node with name `t`
Introduce an impossible expression in the wait expression and requeue the suite. What is the effect?
ecflow_client --wait="1 == 0"