Add another task
Let’s add another task named t2. You will need to modify the suite definition file and add a new script.
You must also create a file t2.ecf in $HOME/course/test. Simply copy t1.ecf.
First modify the suite definition
Text
It is good practice to suspend your suite before you reload any part of it. In ecFlowUI right click on the suite and select “Suspend”. Once you made your change(specified below) you can right click on the suite and “Resume” it.
# Definition of the suite test
suite test
edit ECF_HOME "$HOME/course" # replace '$HOME' with the path to your home directory
task t1
task t2
endsuite
Note
As before replace $HOME with the real path to your home directory.
Then you must load the file again:
ecflow_client --load test.def
Warning
This will fail because the suite is already loaded.
Because the suite is already defined, you need to delete and reload it first:
ecflow_client --delete=_all_
ecflow_client --load=test.def
Then restart the suite:
ecflow_client --begin=test
Rather than deleting, loading and beginning the suite every time you can replace all or part of the suite for example to replace whole suite.
ecflow_client --replace /test test.def
or to replace part of the suite:
ecflow_client --replace /test/t2 test.def
Python
To delete the suite definition, reload and begin using the Python API:
First update test.py
import os
from ecflow import Defs, Suite, Task, Edit
print("Creating suite definition")
home = os.path.join(os.getenv("HOME"), "course")
defs = Defs(Suite("test", Edit(ECF_HOME=home), Task("t1"), Task("t2")))
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")
To delete all suites in the server and reload modified test.def, we could update client.py
import ecflow
print("Client -> Server: delete, then load a new definition")
try:
ci = ecflow.Client()
ci.delete_all() # clear out the server
ci.load("test.def") # load the definition into the server
ci.begin_suite("test") # start the suite
except RuntimeError as e:
print("Failed:", e)
Rather than deleting, loading and beginning the suite every time you can replace all or part of the suite. (i.e. to replace the whole suite see below)
Additionally we do not want the suite to start straight away. This can be done by suspending the suite in ecflow_ui before reloading. However we will need to remember to do this, each time. To get round this we will suspend the suite use the Python API:
Modify client.py with:
import ecflow
print("Client -> Server: replacing suite '/test' in the server, with a new definition")
try:
ci = ecflow.Client()
ci.suspend("/test") # so that we can resume manually in ecflow_ui
ci.replace(
"/test", "test.def"
) # replace suite /test with suite of same name in test.def
except RuntimeError as e:
print("Failed:", e)
Note
For brevity the examples that follow, will not show the loading of the suite.
What to do
Suspend the suite using ecFlowUI or via python using
ecflow.Client.suspendCreate the new task
Create
t2.ecfby copying fromt1.ecfUpdate python scripts
test.pyandclient.pyor test.defReplace the suite. For Python use:
python3 test.pyor./test.pypython3 client.pyor./client.pyFor text use:
ecflow_client --replace=/test test.defResume the the suite using ecFlowUI
In ecFlowUI, watch the two task running. They should run at the same time