Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.


Horizontal Navigation Bar


Button Group

Button Hyperlink
titlePrevious
typestandard
urlhttps://confluence.ecmwf.int/display/ECFLOW/Going+Further
Button Hyperlink
titleUp
typestandard
urlhttps://confluence.ecmwf.int/display/ECFLOW/Going+Further
Button Hyperlink
titleNext
typestandard
urlhttps://confluence.ecmwf.int/display/ECFLOW/Families


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 ecflow_ui 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.


Code Block
# 

...

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:


Code Block
languagebash
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:


Code Block
languagebash
ecflow_client --delete=_all_

...

ecflow_client --load=test.

...

def


Then restart the suite:

Code Block
languagebash
 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.


Code Block
languagebash
 ecflow_client --replace

...

=/test test.

...

def


or to replace part of the suite:

Code Block
languagebash
 ecflow_client --replace

...

=/test/t2 test.

...

def


Python

To delete the suite definition, reload and begin using the Client Server API: First update test.py to add task t2

Code Block
languagepy
title$HOME/course/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 the modified test.def, we could update client.py

Code Block
languagepy
title$HOME/course/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 around this we will
suspend the suite use the Client Server API:
Modify client.py with:


Code Block
languagepy
title$HOME/course/client.py
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

  1. Suspend the suite using ecflow_ui or via python by modifying your client.py to add ecflow.Client.suspend
  2. Create a new task
  3. Create t2.ecf by copying from t1.ecf
  4. Update python scripts test.py and client.py or test.def
  5. Replace the suite
    python: python3 test.py     |  ./test.py
                  python3 client.py  |  ./client.py
    text:      ecflow_client --replace=/test test.def
  6. Resume the suite using ecflow_ui
  7. In ecflow_ui watch the two tasks running. They should run at the same time
       
Horizontal Navigation Bar


Button Group

Button Hyperlink
titlePrevious
typestandard
urlhttps://confluence.ecmwf.int/display/ECFLOW/Going+Further
Button Hyperlink
titleUp
typestandard
urlhttps://confluence.ecmwf.int/display/ECFLOW/Going+Further
Button Hyperlink
titleNext
typestandard
urlhttps://confluence.ecmwf.int/display/ECFLOW/Families

<span class="n">ci</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&quot;/test&quot;</span><span class="p">,</span> <span class="s">&quot;test.def&quot;</span><span class="p">)</span> <span class="k">except</span> <span class="ne">RuntimeError</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="k">print</span> <span class="s">&quot;Failed: &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> </pre></div> </div> <div class="admonition note"> <p class="first admonition-title">Note</p> <p class="last">For <strong>brevity</strong> the examples that follow, will not show the loading of the suite.</p> </div> <p><strong>What to do:</strong></p> <ol class="arabic simple"> <li>Suspend the suite using <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-ecflowview"><em class="xref std std-term">ecflowview</em></a> or via python using <a class="reference internal" href="/wiki/display/ECFLOW/ecFlow+Python+Api#ecflow.Client.suspend" title="ecflow.Client.suspend"><tt class="xref py py-class docutils literal"><span class="pre">ecflow.Client.suspend</span></tt></a></li> <li>Create the new task</li> <li>Create <tt class="file docutils literal"><span class="pre">t2.ecf</span></tt> by copying from <tt class="file docutils literal"><span class="pre">t1.ecf</span></tt></li> <li>Update python scripts <tt class="file docutils literal"><span class="pre">test.py</span></tt> and <tt class="file docutils literal"><span class="pre">client.py</span></tt></li> <li>Begin/replace the suite</li> <li>Resume the the suite using <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-ecflowview"><em class="xref std std-term">ecflowview</em></a></li> <li>In <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-ecflowview"><em class="xref std std-term">ecflowview</em></a>, watch the two task running. They should run at the same time</li> </ol> </div> </div>