Page History
HTML |
---|
<p id="extern"><span id="index-0"></span>SMS triggers are checked from the client side. It is simple to reach a
situation where triggers are not valid from the server side, and
trigger related task may remain queued (deadlock).</p>
<p>To prevent that to happen, ecFlow triggers check is more robust:</p>
<ul class="simple">
<li>triggers must be consistent from the client side.</li>
<li>‘extern’ shall only refer to an external suite’s node</li>
<li>server may be requested to confirm that all triggers are referring
to an existing node, in already loaded suites.</li>
</ul>
<p>As it is with the SMS, a ecFlow suite can be shared for team work. It is
suite design and management skill to decide how to split the suite for
a good collaboration within team members.</p>
<p>At ECMWF, operational suites are defined in files describing the full content.
* the definition file is split into different python modules for</p>
<blockquote>
<div><ul class="simple">
<li>observations retrieval</li>
<li>analysis and forecast</li>
<li>products generation and dissemination</li>
<li>plots generation</li>
</ul>
</div></blockquote>
<ul class="simple">
<li>then a python script is in charge to put all things together and to create the suite</li>
<li>the user decides to load the full suite, only a subt-ree from the suite or to load it as an e-suite (test suite)</li>
<li>a SCM is used to identify the modules edited by different users, merge their updates, resolve the conflicts or allow them to work in an branched version or the suite for the next release.</li></ul></li>
</ul>
<p>The following example shows that with ecflow</p>
<ul class="simple">
<li>a master definition file may provide the suite structure (multi1.def), with the right setting of inlimits, limits, triggers,</li>
<li>a developer in charge of adding test tasks to the suite may update it with a task test2, below an agreed family (/multi/main/00/test),</li>
<li>another tester may add some other tests as a different suite, triggered from ‘multi’ suite.</li>
</ul>
<img alt="../../_images/ecflowviewmap.png" src="../../_images/ecflowviewmap.png" />
<div class="section" id="client-commands-to-load-and-replace">
<div class="highlight-bash"><div class="highlight"><pre> ecflow_client --load multi1.def
ecflow_client --replace /multi/main/00/test/fc_complete/test2 multi2.def
ecflow_client --replace /test20121123 multi3.def
python TestBench.py multi1.def
python TestBench.py multi3.def
</pre></div>
</div>
<div class="section" id="multi1-def-suite-structure-definition">
<h2>multi1.def: suite structure definition<a class="headerlink" href="#multi1-def-suite-structure-definition" title="Permalink to this headline">¶</a></h2>
<div class="highlight-bash"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93</pre></div></td><td class="code"><div class="highlight"><pre>suite limits
defstatus <span class="nb">complete</span>
<span class="nb"> </span>limit power6 120
limit power7 120
limit prod 10
limit diss 10
limit <span class="nb">test </span>10
endsuite
suite multi
family main
inlimit /limits:power6
repeat date YMD 20120101 20301212
family 00
family obs;
task get;
endfamily
family ana
trigger obs eq <span class="nb">complete</span>
<span class="nb"> </span>task ifs
endfamily
family <span class="nb">fc</span>
<span class="nb"> </span>trigger ana eq <span class="nb">complete</span>
<span class="nb"> </span>task model
meter step -1 120
endfamily
family prod
inlimit /limits:prod
family 000;
trigger /multi/main/00/fc/model:step gt 0 or /multi/main/00/fc/model eq <span class="nb">complete</span>
<span class="nb"> </span>task gen; endfamily
family 012;
trigger /multi/main/00/fc/model:step gt 12 or /multi/main/00/fc/model eq <span class="nb">complete</span>
<span class="nb"> </span>task gen; endfamily
family 024;
trigger /multi/main/00/fc/model:step gt 24 or /multi/main/00/fc/model eq <span class="nb">complete</span>
<span class="nb"> </span>task gen; endfamily
family 048;
trigger /multi/main/00/fc/model:step gt 48 or /multi/main/00/fc/model eq <span class="nb">complete</span>
<span class="nb"> </span>task gen; endfamily
family 096;
trigger /multi/main/00/fc/model:step gt 96 or /multi/main/00/fc/model eq <span class="nb">complete</span>
<span class="nb"> </span>task gen; endfamily
family 120;
trigger /multi/main/00/fc/model:step gt 120 or /multi/main/00/fc/model eq <span class="nb">complete</span>
<span class="nb"> </span>task gen; endfamily
endfamily prod
family diss
inlimit /limits:diss
family 000;
trigger /multi/main/00/prod/000 eq <span class="nb">complete</span>
<span class="nb"> </span>task gen; endfamily
family 012;
trigger /multi/main/00/prod/012 eq <span class="nb">complete</span>
<span class="nb"> </span>task gen; endfamily
family 024;
trigger /multi/main/00/prod/024 eq <span class="nb">complete</span>
<span class="nb"> </span>task gen; endfamily
family 048;
trigger /multi/main/00/prod/048 eq <span class="nb">complete</span>
<span class="nb"> </span>task gen; endfamily
family 096;
trigger /multi/main/00/prod/096 eq <span class="nb">complete</span>
<span class="nb"> </span>task gen; endfamily
family 120;
trigger /multi/main/00/prod/120 eq <span class="nb">complete</span>
<span class="nb"> </span>task gen; endfamily
endfamily diss
family <span class="nb">test</span>
<span class="nb"> </span>inlimit /limits:test
family fc_complete
trigger /multi/main/00/fc eq <span class="nb">complete</span>
<span class="nb"> </span>task test1
endfamily
family prod_complete
trigger /multi/main/00/prod eq <span class="nb">complete</span>
<span class="nb"> </span>task test1
endfamily
family diss
trigger /multi/main/00/diss eq <span class="nb">complete</span>
<span class="nb"> </span>task test1
endfamily
endfamily
</pre></div>
</td></tr></table></div>
</div>
<div class="section" id="multi2-def-task-and-family-addition-for-intra-suite-test">
<h2>multi2.def: task and family addition for intra-suite test<a class="headerlink" href="#multi2-def-task-and-family-addition-for-intra-suite-test" title="Permalink to this headline">¶</a></h2>
<div class="highlight-bash"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18</pre></div></td><td class="code"><div class="highlight"><pre>extern /limits:test
suite multi
defstatus suspended
family main
family 00
family <span class="nb">test</span>
<span class="nb"> </span>family fc_complete
task test2
family fam_test
trigger test2 eq <span class="nb">complete</span>
<span class="nb"> </span>task prepare
task process
trigger prepare eq <span class="nb">complete</span>
<span class="nb"> </span>task push
trigger process eq <span class="nb">complete</span>
</pre></div>
</td></tr></table></div>
</div>
<div class="section" id="multi3-def-standalone-test-triggered-by-multi-suite">
<h2>multi3.def: standalone test triggered by ‘multi’ suite<a class="headerlink" href="#multi3-def-standalone-test-triggered-by-multi-suite" title="Permalink to this headline">¶</a></h2>
<div class="highlight-bash"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11</pre></div></td><td class="code"><div class="highlight"><pre>extern /limits:test
extern /multi/main/00/fc/model:step
extern /multi/main:YMD
suite test20121123
defstatus suspended <span class="c"># so that it can be changed manually to queued</span>
repeat date YMD 20120101 20301212
family <span class="nb">test</span>
<span class="nb"> </span>repeat integer STEP 0 120
trigger /multi/main:YMD gt /test20121123:YMD or <span class="o">(</span>/multi/main:YMD eq /test20121123:YMD and <span class="o">(</span>/multi/main/00/fc/model:step ge /test20121123/test:STEP or /multi/main/00/fc/model eq <span class="nb">complete</span><span class="o">))</span>
task run
</pre></div>
</td></tr></table></div>
</div>
</div>
|