Horizontal Navigation Bar |
---|
Button Group |
---|
Button Hyperlink |
---|
title | Previous |
---|
type | standard |
---|
url | https://confluence.ecmwf.int/display/ECFLOW/Add+an+event |
---|
|
Button Hyperlink |
---|
title | Up |
---|
type | standard |
---|
url | https://confluence.ecmwf.int/display/ECFLOW/Going+Further |
---|
|
Button Hyperlink |
---|
title | Next |
---|
type | standard |
---|
url | https://confluence.ecmwf.int/display/ECFLOW/Add+a+meter |
---|
|
|
|
Sometimes a task should not be run when a certain condition is met.The condition can be signalled by an event. For example, event t2:b
might indicate that task t2 did not manage to produce the expected result, so
we do not need to run task t4.
This has a similar syntax to the trigger keyword but sets a task complete expression evaluation takes precedence over the trigger.
Completes can be between tasks, between families, or both.
It can be used in conjunction with a trigger. For example:
...
Definition of the suite test.
suite test
edit ECF_INCLUDE "$HOME/course" # replace '$HOME' with the path to your home directory
edit ECF_HOME "$HOME/course"
family f1
edit SLEEP 20
task t1
task t2
trigger t1 eq complete |
...
# task t2 will only start when task t1 |
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
task t3
trigger t2:a # task t3 will start when event a is set in task t2
task t4
trigger t2 eq complete # task t4 will start when task t2 is complete
complete t2:b # task t4 will complete if event b is set in task t2
endfamily
endsuite |
Python
Code Block |
---|
language | py |
---|
title | $HOME/course/test.py |
---|
|
import os
from ecflow import Defs,Suite,Family,Task,Edit,Trigger,Complete,Event
def create_family_f1():
return Family("f1",
Edit(SLEEP= 20),
Task("t1"),
Task("t2",
Trigger("t1 == complete"),
Event("a"),
Event("b")),
Task("t3",
Trigger("t2:a")),
Task("t4",
Trigger("t2 == complete"),
Complete("t2:b")))
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") |
What to do
- Update test.def or test.py to add a complete expression to task t4
- Replace the suite
python: python3 test.py; python3 client.py
text: ecflow_client --suspend=/test ; ecflow_client --replace=/test test.def - Observe the tasks in ecflow_ui
- See the triggers by selecting t4
- See the trigger relation by clicking on the arrow
- See the triggers in the tree, using the Show menu
- Note the icon indicating that the task has not run
- To check the triggers modify task t2 so that event b is not triggered; task t4 should run when t2 completes.
Horizontal Navigation Bar |
---|
Button Group |
---|
Button Hyperlink |
---|
title | Previous |
---|
type | standard |
---|
url | https://confluence.ecmwf.int/display/ECFLOW/Add+an+event |
---|
|
Button Hyperlink |
---|
title | Up |
---|
type | standard |
---|
url | https://confluence.ecmwf.int/display/ECFLOW/Going+Further |
---|
|
Button Hyperlink |
---|
title | Next |
---|
type | standard |
---|
url | https://confluence.ecmwf.int/display/ECFLOW/Add+a+meter |
---|
|
| would be:</p>
<div ><div ><pre><span >#!/usr/bin/env python2.5</span>
<span >import</span> <span >os</span>
<span >import</span> <span >ecflow</span>
<span >def</span> <span >create_family_f1</span><span >():</span>
<span >f1</span> <span >=</span> <span >ecflow</span><span >.</span><span >Family</span><span >(</span><span >"f1"</span><span >)</span>
<span >f1</span><span >.</span><span >add_variable</span><span >(</span><span >"SLEEP"</span><span >,</span><span >20</span><span >)</span>
<span >f1</span><span >.</span><span >add_task</span><span >(</span><span >"t1"</span><span >)</span>
<span >t2</span> <span >=</span> <span >f1</span><span >.</span><span >add_task</span><span >(</span><span >"t2"</span><span >)</span>
<span >t2</span><span >.</span><span >add_trigger</span><span >(</span><span >"t1 eq complete"</span><span >)</span>
<span >t2</span><span >.</span><span >add_event</span><span >(</span><span >"a"</span><span >)</span>
<span >t2</span><span >.</span><span >add_event</span><span >(</span><span >"b"</span><span >)</span>
<span >t3</span> <span >=</span> <span >f1</span><span >.</span><span >add_task</span><span >(</span><span >"t3"</span><span >)</span>
<span >t3</span><span >.</span><span >add_trigger</span><span >(</span><span >"t2:a"</span><span >)</span>
<span >t4</span> <span >=</span> <span >f1</span><span >.</span><span >add_task</span><span >(</span><span >"t4"</span><span >)</span>
<span >t4</span><span >.</span><span >add_trigger</span><span >(</span><span >"t2 eq complete"</span><span >)</span>
<span >t4</span><span >.</span><span >add_complete</span><span >(</span><span >"t2:b"</span><span >)</span>
<span >return</span> <span >f1</span>
<span >defs</span> <span >=</span> <span >ecflow</span><span >.</span><span >Defs</span><span >(</span><span >"test.def"</span><span >)</span>
<span >suite</span> <span >=</span> <span >defs</span><span >.</span><span >add_suite</span><span >(</span><span >"test"</span><span >)</span>
<span >suite</span><span >.</span><span >add_variable</span><span >(</span><span >"ECF_INCLUDE"</span><span >,</span><span >os</span><span >.</span><span >getenv</span><span >(</span><span >"HOME"</span><span >)</span> <span >+</span> <span >"/course"</span><span >)</span>
<span >suite</span><span >.</span><span >add_variable</span><span >(</span><span >"ECF_HOME "</span><span >,</span><span >os</span><span >.</span><span >getenv</span><span >(</span><span >"HOME"</span><span >)</span> <span >+</span> <span >"/course"</span><span >)</span>
<span >suite</span><span >.</span><span >add_family</span><span >(</span> <span >create_family_f1</span><span >()</span> <span >)</span>
</pre></div>
</div>
<div >
<div >Completes are used to declare dependencies between two tasks.</div>
<div >For instance, complete <strong>t2:b</strong> might indicate that a specific</div>
<div >event has not occurred so we do not need to run task <strong>t4</strong>.</div>
</div>
<div >
<div >When <a href="/wiki/display/ECFLOW/Glossary#term-ecf-server"><em >ecf_server</em></a> tries to start a <a href="/wiki/display/ECFLOW/Glossary#term-task"><em >task</em></a>, it evaluates the <a href="/wiki/display/ECFLOW/Glossary#term-trigger"><em >trigger</em></a></div>
<div >and <a href="/wiki/display/ECFLOW/Glossary#term-complete-trigger"><em >complete trigger</em></a> expressions. If the <a href="/wiki/display/ECFLOW/Glossary#term-complete-trigger"><em >complete trigger</em></a> condition is correct,</div>
<div >the task will set itself <a href="/wiki/display/ECFLOW/Glossary#term-complete"><em >complete</em></a>.</div>
</div>
<p><a href="/wiki/display/ECFLOW/Glossary#term-complete-trigger"><em >complete trigger</em></a> evaluation takes precedence over the <a href="/wiki/display/ECFLOW/Glossary#term-trigger"><em >trigger</em></a>.</p>
<p>Completes can be between tasks, between families, or both.</p>
<p>What to do:</p>
<ol >
<li>Edit the <a href="/wiki/display/ECFLOW/Glossary#term-suite-definition"><em >suite definition</em></a> file or python to add a complete to task <strong>t4</strong></li>
<li>Load the definition again</li>
<li>Observe the tasks in <a href="/wiki/display/ECFLOW/Glossary#term-ecflowview"><em >ecFlowview</em></a></li>
<li>See the triggers by selecting <strong>t4</strong> and clicking on the <img alt="triggers" src="/wiki/download/attachments/7373012/triggers.jpg" /> icon</li>
<li>See the trigger relation by clicking on the arrow</li>
<li>See the triggers in the tree, using the Show menu</li>
<li>Note the icon indicating that the task has not run</li>
<li>You can modify task <strong>t2</strong> to check that task <strong>t4</strong> will run when the event is not set</li>
</ol>
</div>
|