Variable inheritance
The previous section describes how to define a variable for a particular task. When all the tasks in a given family share the same variable value, the value can be defined at the family level. This shared value is then inherited by all the child nodes of the family – this is variable inheritance.
Variables are inherited from the closest parent node. This means that, going from top to bottom, if a variable is redefined lower in the tree, it is said to override the previously defined variable.
Defining the variables is an important part of suite design, considering that any kind
of variable can be overridden, including generated variables. Opting to override a variable,
in particular generated variables, might result in undesired effects (e.g. overridding ECF_HOST
or ECF_PORT could prevent the tasks from contacting back the ecflow_server).
Update Suite Definition
Consider the following suite definition, where the variable SLEEP is defined at the level of the family f1.
# 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
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("Checking job creation: .ecf -> .job0")
print(defs.check_job_creation())
print("Saving definition to file 'test.def'")
defs.save_as_defs("test.def")
Quiz
Considering the following suite, which includes several levels of families and tasks,
determine the value of the variable SLEEP for each task.
suite test
edit SLEEP 100
family f1
edit SLEEP 80
task t1
task t2
edit SLEEP 9
family g1
edit SLEEP 89
task x1
edit SLEEP 10
task x2
endfamily
endfamily
family f2
task t1
task t2
edit SLEEP 77
family g2
task x1
edit SLEEP 12
task x2
endfamily
endfamily
endsuite
Compare the value of the SLEEP used by each of the tasks in the following table:
SLEEP
/test/f1/t1
80
/test/f1/t2
9
/test/f1/g1/x1
10
/test/f1/g1/x2
89
/test/f2/t1
100
/test/f2/t2
77
/test/f2/g2/x1
12
/test/f2/g2/x2
100
What to do