...
The ecFlow user interface (ecFlowview) uses the same technology and user paradigm as XCDP. The graphical user interface (GUI) is X-Windows based. This places limits on the machines where user interface can be run, since the X windows libraries will require a separate installation. This will be replaced in the near future, with a more intuitive and up to date GUI.
 When ecFlow is released the online documentation and tutorial can be accessed from: http://www.ecmwf.int/publications/manuals/ecflow/
 We welcome feedback on any aspect of ecFlow. Suggestions for further developments will be assessed and, where appropriate, they will be prioritised and fed into future versions.
| Box A. Correct by constructionThe following examples show usage of the new Python API. The API supports a correct by construction approach. For example, adding tasks of the same name at the same level will throw a RuntimeError exception: 
 Example 1
 import ecflow defs = ecflow.Defs() suite = defs.add_suite("s1") suite.add_task("t1") suite.add_task("t1") # RuntimeError exception thrown
 >> RuntimeError: Add Task failed: A task of name 't1' already exist on node SUITE:/s1
 
 Example 2
 Adding dependencies, such as dates, are also checked:
 import ecflow defs = ecflow.Defs() suite = defs.add_suite("s1") task t1 = suite.add_task("t1") t1.add_date(1,14,2007) # day,month,year, month is not valid
 >> IndexError: Invalid Date(day,month,year): the month >=0 and month <= 12, where 0 means wild card
 | 
| Box B. CheckingExpression checkingSome checking has to be deferred until the definition is fully defined. Here is a simple example showing the checking of trigger expressions: | Code Block | 
|---|
 |  |  | import ecflow
defs = ecflow.Defs() 
suite = defs.add_suite("s1");
suite.add_task("t2") 
suite.add_task("t1").add_trigger("t2 == active)") 
assert len(defs.check()) != 0, "Expected Error: miss-matched brackets in expression."  | 
   Job checkingJob creation is the process of locating an '.ecf' script corresponding to a task and then generating a job file. This can be checked before a definition is loaded into the server using the Python API. job| Code Block | 
|---|
 |  |  | # Generate jobs for the ALL tasks in the definition given by variable 'defs' 
# and print errors to standard out. 
import ecflow 
defs = ecflow.Defs() 
suite = defs.add_suite("s1"); 
suite.add_task("t1") | 
 |  
ob_ctrl = JobCreationCtrl() 
defs.check_job_creation( job_ctrl ) 
print job_ctrl.get_error_msg()  | 
 
 Job control provides additional functionality to control which nodes are generated and control over the directory used for job generation.
 Dead lock checkingSimulation allows a suite definition to be checked without the need for scripts or a server. By default the simulation will run for a year before quitting. This can take a couple a seconds to a few minutes depending on the complexity of the suite definition. However, it is most useful where we have a definition which is known to complete. Here is an example which will cause a deadlock that is detectable by the simulator. import os from ecflow import *
 defs = Defs() suite = defs.add_suite("dead_lock") fam = suite.add_family("family") fam.add_task("t1").add_trigger("t2 == complete") fam.add_task("t2").add_trigger("t1 == complete")
 theResult = defs.simulate(); assert len(theResult) != 0, "Expected simulation to return errors, but found none" print theResult
 os.remove("defs.depth") # provides reason why simulation could not complete os.remove("defs.flat") # provides reason why simulation could not complete
 
 Early checking of the suite definition will help to speed up the development of suites.
 | 
| Box C. Boost C++ libraries used in ecFlowBoost-ASIO library is used to provide the core of the client-server implementation. It also provides a deadline timer for polling and support for time outs.Boost-Python library enables seamless interoperability between C++ and the Python programming language.Boost-Program options are used to parse the client and server program options, and they provide the corresponding help strings.Boost-Spirit provides the parsing for expressions. The abstract syntax tree is then created from the spirit nodes.Boost-Test library is used for unit and regression tests of the C++ and Python code.Boost-Date-Time library is used in the suite calendar, time based attributes and polling.Boost-File System library is used for file queries in a platform independent manner.
 |