In this exercise we will use one of the command line features of ecflow.
We will use query command, to determine the state of a node, event, meter. An alternative to the query command would be use the python api.
The general format is:
ecflow_client --query arg1 arg2 arg3
Where:
- arg1 = [ state | event | meter | label | variable | trigger | limit | limit_max ]
- arg2 = <path> | <path>:name where name is name of a event, meter,limit or variable
- arg3 = trigger expression (optional) | prev | next # prev,next only used when arg1 is repeat
Here are some examples using the query command:
- state=$(ecflow_client --query state /path/to/node) # return node state
- dstate=$(ecflow_client --query dstate /path/to/node) # state that can includes suspended
value=$(ecflow_client --query repeat /path/to/node ) # return the current value as a string
value=$(ecflow_client --query repeat /path/to/node prev ) # return the previous value as a string, does not modify real repeat
value=$(ecflow_client --query repeat /path/to/node next) # return the next value as a string, does not modify real repeat
- event=$(ecflow_client --query event /path/to/task/with/event:event_name) # return set | clear to standard out
- meter=$(ecflow_client --query meter /path/to/task/with/meter:meter_name) # returns the current value of the meter
- value=$(ecflow_client --query variable /path/to/task/with/var:var_name ) # returns the variable value
limit_value=$(ecflow_client --query limit /path/to/task/with/limit:limit_name) # returns the current value of the limit
limit_max=$(ecflow_client --query limit_max /path/to/task/with/limit:limit_name) # returns the max value of the limit
- label_value=$(ecflow_client --query label %ECF_NAME%:label_name) # returns the current value of the label
- value=$(ecflow_client --query trigger /path/to/node/with/trigger \"/suite/task == complete\") # return true if expression evaluates false otherwise
Ecf Script
We will create new query.
%include <head.h>
meter=$(ecflow_client --query meter /test/f1/t1:progress)
while [[ $meter -lt 100 ]]
do
sleep 2
meter=$(ecflow_client --query meter /test/f1/t1:progress)
eventa=$(ecflow_client --query event /test/f1/t2:a)
eventb=$(ecflow_client --query event /test/f1/t2:b)
t5_state=$(ecflow_client --query state /test/f1/t5)
ecflow_client --label=query "meter($meter) eventa($eventa) eventb($eventb) t5_state($t5_state)"
done
%include <tail.h>
Text
# 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
meter progress 1 100 90
task t2
trigger t1 eq complete
event a
event b
task t3
trigger t2:a
task t4
trigger t2 eq complete
complete t2:b
task t5
trigger t1:progress ge 30
task t6
trigger t1:progress ge 60
task t7
trigger t1:progress ge 90
task query
label query ""
endfamily
endsuite
Python
import os
from ecflow import Defs,Suite,Family,Task,Edit,Trigger,Complete,Event,Meter
def create_family_f1():
return Family("f1",
Edit(SLEEP=20),
Task("t1", Meter("progress", 1, 100, 90)),
Task("t2", Trigger("t1 == complete"), Event("a"), Event("b")),
Task("t3", Trigger("t2:a")),
Task("t4", Trigger("t2 == complete"), Complete("t2:b")),
Task("t5", Trigger("t1:progress ge 30")),
Task("t6", Trigger("t1:progress ge 60")),
Task("t7", Trigger("t1:progress ge 90")),
Task("query",Label("query","")))
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
- Go back to the previous where we finished adding a meter.
- Edit the definition file or python to add the modifications.
- create file query.ecf to call ecflow_client –meter
- 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
Modify query.ecf, to use ecflow_client --query variable, and show this variable in the query label.
Although a variable is accessible in the script by using %VAR%, ecflow_client --query variable might be useful for a different server