1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
|
.. index::
single: Variable inheritance (tutorial)
.. _tutorial-variable-inheritance:
Variable inheritance
=====================
The previous section describes how to define a :term:`variable` for a particular :term:`task`.
When all the tasks in a given :term:`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 :term:`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 :term:`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 :code:`ECF_HOST`
or :code:`ECF_PORT` could prevent the tasks from contacting back the :term:`ecflow_server`).
Update Suite Definition
-----------------------
Consider the following :term:`suite definition`, where the variable :code:`SLEEP` is defined at the level of the family :code:`f1`.
.. tabs::
.. tab:: Text
.. code-block:: shell
# 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
.. note::
The :term:`variable` :code:`SLEEP`, in the example above, could have been defined at the
level of the :term:`suite`, achieving the same results.
.. tab:: Python
.. literalinclude:: src/variable-inheritance.py
:language: python
:caption: $HOME/course/test.py
Quiz
----
Considering the following suite, which includes several levels of families and tasks,
determine the value of the variable :code:`SLEEP` for each task.
.. code-block:: shell
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 :code:`SLEEP` used by each of the tasks in the following table:
============== ======
:term:`node` 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**
#. Modify the suite definition to include the variable :code:`SLEEP`, as shown above.
#. Replace the :term:`suite`, using:
.. tabs::
.. tab:: Text
.. code-block:: shell
ecflow_client --suspend /test
ecflow_client --replace /test test.def
.. tab:: Python
.. code-block:: shell
python3 test.py
python3 client.py
#. Observe the task execution in :term:`ecflow_ui`.
|