Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
HTML
<div class="section" id="how-can-i-test-a-definition-without-writing-scripts">
<span id="test-bench"></span><span id="index-0"></span>
<p>When designing the definition it is often very desirable to
be able to auto generate the <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-ecf-script"><em class="xref std std-term">ecf script</em></a> s. This allows for a lot
of experimentation with <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-suite-definition"><em class="xref std std-term">suite definition</em></a> structure without the chore
of continually keeping the scripts in sync.</p>
<p>The following Python code shows that it is possible to test
<em>any</em> <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-suite-definition"><em class="xref std std-term">suite definition</em></a> without having to create any <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-ecf-script"><em class="xref std std-term">ecf script</em></a> s.</p>
<p>The <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-ecf-script"><em class="xref std std-term">ecf script</em></a> files are auto generated. Hence if the <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-suite-definition"><em class="xref std std-term">suite definition</em></a> contains
<a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-event"><em class="xref std std-term">event</em></a>, <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-meter"><em class="xref std std-term">meter</em></a> or <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-label"><em class="xref std std-term">label</em></a>, the auto generate feature will create scripts
with correct <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-child-command"><em class="xref std std-term">child command</em></a> s to communicate with the server.</p>
<p>The scripts assumes that <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-ecflow-client"><em class="xref std std-term">ecflow_client</em></a> is accessible on $PATH.</p>
<p>To use, copy the contents into a file, say <tt class="file docutils literal"><span class="pre">test_bench.py</span></tt></p>
<div class="highlight-python"><pre>&gt; test_bench.py --help</pre>
</div>
<p>If the server is running locally the typical usage might be</p>
<div class="highlight-python"><pre>&gt; test_bench.py my_test.def --port 4141</pre>
</div>
<div class="highlight-python"><div class="highlight"><pre><span class="c">#!/usr/bin/env python2.7</span>
<span class="c">#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8</span>
<span class="c"># Name        :</span>
<span class="c"># Author      : Avi</span>
<span class="c"># Revision    : $Revision: #10 $</span>
<span class="c">#</span>
<span class="c"># Copyright 2009-2012 ECMWF.</span>
<span class="c"># This software is licensed under the terms of the Apache Licence version 2.0</span>
<span class="c"># which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.</span>
<span class="c"># In applying this licence, ECMWF does not waive the privileges and immunities</span>
<span class="c"># granted to it by virtue of its status as an intergovernmental organisation</span>
<span class="c"># nor does it submit to any jurisdiction.</span>
<span class="c">#////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8</span>

<span class="c"># =============================================================================</span>
<span class="c"># Code for testing *any* definition</span>
<span class="c">#   Since any ad hoc definition will reference local directories in the</span>
<span class="c">#   ECF_ variables, we need to remove them and inject our own.</span>
<span class="c">#</span>
<span class="c">#   This script is re-runnable, and hence will delete suites in the server</span>
<span class="c">#   matching those in the input definition. Hence it is best to use this </span>
<span class="c">#   script with a *test* server to avoid accidentally deleting existing suites </span>
<span class="c">#   of the same name.</span>
<span class="c"># =============================================================================</span>
<span class="kn">import</span> <span class="nn">ecflow</span>
<span class="kn">import</span> <span class="nn">os</span>       <span class="c"># for getenv</span>
<span class="kn">import</span> <span class="nn">shutil</span>   <span class="c"># used to remove directory tree</span>
<span class="kn">import</span> <span class="nn">argparse</span> <span class="c"># for argument parsing     </span>

<span class="k">def</span> <span class="nf">delete_variables_affecting_job_generation</span><span class="p">(</span><span class="n">node</span><span class="p">):</span> 
    <span class="sd">&quot;&quot;&quot;delete customer related ECF variables, these will point to directories</span>
<span class="sd">       that don&#39;t exist. Its ok we will regenerate our own local ones&quot;&quot;&quot;</span>
    <span class="n">var</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">find_variable</span><span class="p">(</span><span class="s">&quot;ECF_HOME&quot;</span><span class="p">)</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">var</span><span class="o">.</span><span class="n">empty</span><span class="p">()</span> <span class="p">:</span>  
        <span class="n">node</span><span class="o">.</span><span class="n">delete_variable</span><span class="p">(</span><span class="s">&quot;ECF_HOME&quot;</span><span class="p">)</span>    
    <span class="n">var</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">find_variable</span><span class="p">(</span><span class="s">&quot;ECF_FILES&quot;</span><span class="p">)</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">var</span><span class="o">.</span><span class="n">empty</span><span class="p">()</span> <span class="p">:</span>  
        <span class="n">node</span><span class="o">.</span><span class="n">delete_variable</span><span class="p">(</span><span class="s">&quot;ECF_FILES&quot;</span><span class="p">)</span>    
    <span class="n">var</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">find_variable</span><span class="p">(</span><span class="s">&quot;ECF_INCLUDE&quot;</span><span class="p">)</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">var</span><span class="o">.</span><span class="n">empty</span><span class="p">()</span> <span class="p">:</span>  
        <span class="n">node</span><span class="o">.</span><span class="n">delete_variable</span><span class="p">(</span><span class="s">&quot;ECF_INCLUDE&quot;</span><span class="p">)</span>    
    <span class="n">var</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">find_variable</span><span class="p">(</span><span class="s">&quot;ECF_JOB_CMD&quot;</span><span class="p">)</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">var</span><span class="o">.</span><span class="n">empty</span><span class="p">()</span> <span class="p">:</span>  
        <span class="n">node</span><span class="o">.</span><span class="n">delete_variable</span><span class="p">(</span><span class="s">&quot;ECF_JOB_CMD&quot;</span><span class="p">)</span>    
    <span class="n">var</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">find_variable</span><span class="p">(</span><span class="s">&quot;ECF_KILL_CMD&quot;</span><span class="p">)</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">var</span><span class="o">.</span><span class="n">empty</span><span class="p">()</span> <span class="p">:</span>  
        <span class="n">node</span><span class="o">.</span><span class="n">delete_variable</span><span class="p">(</span><span class="s">&quot;ECF_KILL_CMD&quot;</span><span class="p">)</span>    
    <span class="n">var</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">find_variable</span><span class="p">(</span><span class="s">&quot;ECF_STATUS_CMD&quot;</span><span class="p">)</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">var</span><span class="o">.</span><span class="n">empty</span><span class="p">()</span> <span class="p">:</span>  
        <span class="n">node</span><span class="o">.</span><span class="n">delete_variable</span><span class="p">(</span><span class="s">&quot;ECF_STATUS_CMD&quot;</span><span class="p">)</span>    
    <span class="n">var</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">find_variable</span><span class="p">(</span><span class="s">&quot;ECF_OUT&quot;</span><span class="p">)</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">var</span><span class="o">.</span><span class="n">empty</span><span class="p">()</span> <span class="p">:</span>  
        <span class="n">node</span><span class="o">.</span><span class="n">delete_variable</span><span class="p">(</span><span class="s">&quot;ECF_OUT&quot;</span><span class="p">)</span>    
      
<span class="k">def</span> <span class="nf">traverse_container</span><span class="p">(</span><span class="n">node_container</span><span class="p">):</span>
    <span class="sd">&quot;&quot;&quot;Recursively traverse definition node hierarchy and delete</span>
<span class="sd">       the variables that affect job generation.</span>
<span class="sd">    &quot;&quot;&quot;</span>
    <span class="n">delete_variables_affecting_job_generation</span><span class="p">(</span><span class="n">node_container</span><span class="p">)</span>
    <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">node_container</span><span class="o">.</span><span class="n">nodes</span><span class="p">:</span>
        <span class="n">delete_variables_affecting_job_generation</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">Task</span><span class="p">):</span>
            <span class="n">traverse_container</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>  
    
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span>
    
    <span class="n">DESC</span> <span class="o">=</span> <span class="s">&quot;&quot;&quot;Will allow any definition to be loaded and played on the server</span>
<span class="s">            This is done by:</span>
<span class="s">            o Remove existing ECF_ variables that affect job generation. </span>
<span class="s">              i.e variables that refer to customer specific directories are removed</span>
<span class="s">            o Allows ECF_HOME to specified, defaults to ./CUSTOMER/ECF_HOME</span>
<span class="s">            o Generates the scripts(.ecf files) automatically based on the definition.</span>
<span class="s">              i.e if a task has events,meters,labels then the client request for these are</span>
<span class="s">              automatically injected in the generated .ecf script files</span>
<span class="s">            o Will clear out existing data both on disk and on the server to allow </span>
<span class="s">              multiple re-runs of this script. ** If this is an issue please use</span>
<span class="s">              a test server **</span>
<span class="s">            o All suites are put into a suspended state. This allows the GUI to resume them</span>
<span class="s">            o The server is restarted and suites are begun</span>
<span class="s">            This programs assumes that ecflow module is accessible.</span>
<span class="s">            &quot;&quot;&quot;</span>    
    <span class="n">PARSER</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="n">DESC</span><span class="p">,</span>  
                                     <span class="n">formatter_class</span><span class="o">=</span><span class="n">argparse</span><span class="o">.</span><span class="n">RawDescriptionHelpFormatter</span><span class="p">)</span>
    <span class="n">PARSER</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s">&#39;defs_file&#39;</span><span class="p">,</span> 
                        <span class="n">help</span><span class="o">=</span><span class="s">&quot;The definition file&quot;</span><span class="p">)</span>
    <span class="n">PARSER</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s">&#39;--host&#39;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s">&quot;localhost&quot;</span><span class="p">,</span>   
                        <span class="n">help</span><span class="o">=</span><span class="s">&quot;The name of the host machine, defaults to &#39;localhost&#39;&quot;</span><span class="p">)</span>
    <span class="n">PARSER</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s">&#39;--port&#39;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s">&quot;3141&quot;</span><span class="p">,</span>   
                        <span class="n">help</span><span class="o">=</span><span class="s">&quot;The port on the host, defaults to 3141&quot;</span><span class="p">)</span>
    <span class="n">PARSER</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s">&#39;--ecf_home&#39;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s">&quot;CUSTOMER/ECF_HOME&quot;</span><span class="p">,</span>
                        <span class="n">help</span><span class="o">=</span><span class="s">&quot;Directory to be used for generated scripts(ECF_HOME), defaults to ./CUSTOMER/ECF_HOME&quot;</span><span class="p">)</span>
    <span class="n">PARSER</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s">&#39;--verbose&#39;</span><span class="p">,</span> <span class="n">nargs</span><span class="o">=</span><span class="s">&#39;?&#39;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">const</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">bool</span><span class="p">,</span>
                        <span class="n">help</span><span class="o">=</span><span class="s">&quot;Show verbose output&quot;</span><span class="p">)</span>
    <span class="n">ARGS</span> <span class="o">=</span> <span class="n">PARSER</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span>
    <span class="n">ARGS</span><span class="o">.</span><span class="n">defs_file</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expandvars</span><span class="p">(</span><span class="n">ARGS</span><span class="o">.</span><span class="n">defs_file</span><span class="p">)</span> <span class="c"># expand references to any environment variables</span>
    <span class="k">print</span> <span class="n">ARGS</span>    
    
    <span class="c"># If running on local work space, use /Pyext/test/data/CUSTOMER/ECF_HOME as ecf_home</span>
    <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">getenv</span><span class="p">(</span><span class="s">&quot;WK&quot;</span><span class="p">)</span> <span class="o">!=</span> <span class="bp">None</span><span class="p">:</span>
        <span class="n">ARGS</span><span class="o">.</span><span class="n">ecf_home</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">getenv</span><span class="p">(</span><span class="s">&quot;WK&quot;</span><span class="p">)</span> <span class="o">+</span> <span class="s">&quot;/Pyext/test/data/CUSTOMER/ECF_HOME&quot;</span>
        <span class="k">if</span> <span class="n">ARGS</span><span class="o">.</span><span class="n">verbose</span><span class="p">:</span>
            <span class="k">print</span> <span class="s">&quot;Workspace is defined&quot;</span> 
            <span class="k">print</span> <span class="s">&quot;Using ECF_HOME=&quot;</span> <span class="o">+</span> <span class="n">ARGS</span><span class="o">.</span><span class="n">ecf_home</span>
            <span class="k">print</span> <span class="s">&quot;using /Client/bin/gcc\-4.5/debug/ecflow_client&quot;</span>
        
    <span class="k">if</span> <span class="n">ARGS</span><span class="o">.</span><span class="n">verbose</span><span class="p">:</span> 
        <span class="k">print</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">loading the definition from the input arguments(&quot;</span> <span class="o">+</span> <span class="n">ARGS</span><span class="o">.</span><span class="n">defs_file</span> <span class="o">+</span> <span class="s">&quot;)</span><span class="se">\n</span><span class="s">&quot;</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="n">DEFS</span> <span class="o">=</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">Defs</span><span class="p">(</span><span class="n">ARGS</span><span class="o">.</span><span class="n">defs_file</span><span class="p">)</span>
    <span class="k">except</span> <span class="ne">RuntimeError</span><span class="p">,</span> <span class="n">ex</span><span class="p">:</span>
        <span class="k">print</span> <span class="s">&quot;   ecflow.Defs(&quot;</span> <span class="o">+</span> <span class="n">ARGS</span><span class="o">.</span><span class="n">defs_file</span> <span class="o">+</span> <span class="s">&quot;) failed:</span><span class="se">\n</span><span class="s">&quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">ex</span><span class="p">)</span>
        <span class="nb">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
    
    <span class="k">if</span> <span class="n">ARGS</span><span class="o">.</span><span class="n">verbose</span><span class="p">:</span> 
        <span class="k">print</span> <span class="s">&quot;remove test data associated with the DEFS, so we start fresh, Allows rerun&quot;</span>
    <span class="k">for</span> <span class="n">suite</span> <span class="ow">in</span> <span class="n">DEFS</span><span class="o">.</span><span class="n">suites</span><span class="p">:</span>
        <span class="n">dir_to_remove</span> <span class="o">=</span> <span class="n">ARGS</span><span class="o">.</span><span class="n">ecf_home</span> <span class="o">+</span> <span class="n">suite</span><span class="o">.</span><span class="n">get_abs_node_path</span><span class="p">()</span>
        <span class="k">if</span> <span class="n">ARGS</span><span class="o">.</span><span class="n">verbose</span><span class="p">:</span> 
            <span class="k">print</span> <span class="s">&quot;   Deleting directory: &quot;</span> <span class="o">+</span> <span class="n">dir_to_remove</span> <span class="o">+</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span>
        <span class="n">shutil</span><span class="o">.</span><span class="n">rmtree</span><span class="p">(</span><span class="n">dir_to_remove</span><span class="p">,</span> <span class="bp">True</span><span class="p">)</span>  
        
    <span class="k">if</span> <span class="n">ARGS</span><span class="o">.</span><span class="n">verbose</span><span class="p">:</span> 
        <span class="k">print</span> <span class="s">&quot;remove remote reference to ECF_HOME and ECF_INCLUDE, since we inject or own</span><span class="se">\n</span><span class="s">&quot;</span>
    <span class="k">for</span> <span class="n">suite</span> <span class="ow">in</span> <span class="n">DEFS</span><span class="o">.</span><span class="n">suites</span><span class="p">:</span>
        <span class="n">traverse_container</span><span class="p">(</span><span class="n">suite</span><span class="p">)</span>
  
    <span class="k">if</span> <span class="n">ARGS</span><span class="o">.</span><span class="n">verbose</span><span class="p">:</span> 
        <span class="k">print</span> <span class="s">&quot;add variables required for script generation, for all suites</span><span class="se">\n</span><span class="s">&quot;</span>
    <span class="n">DEFS</span><span class="o">.</span><span class="n">add_variable</span><span class="p">(</span><span class="s">&quot;ECF_HOME&quot;</span><span class="p">,</span> <span class="n">ARGS</span><span class="o">.</span><span class="n">ecf_home</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">getenv</span><span class="p">(</span><span class="s">&quot;WK&quot;</span><span class="p">)</span> <span class="o">!=</span> <span class="bp">None</span><span class="p">:</span> 
        <span class="n">DEFS</span><span class="o">.</span><span class="n">add_variable</span><span class="p">(</span><span class="s">&quot;ECF_CLIENT_EXE_PATH&quot;</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">getenv</span><span class="p">(</span><span class="s">&quot;WK&quot;</span><span class="p">)</span> <span class="o">+</span> <span class="s">&quot;/Client/bin/gcc\-4.5/debug/ecflow_client&quot;</span><span class="p">)</span>
    <span class="n">DEFS</span><span class="o">.</span><span class="n">add_variable</span><span class="p">(</span><span class="s">&quot;SLEEP&quot;</span><span class="p">,</span> <span class="s">&quot;10&quot;</span><span class="p">)</span>  <span class="c"># not strictly required since default is 1 second</span>
    <span class="n">DEFS</span><span class="o">.</span><span class="n">add_variable</span><span class="p">(</span><span class="s">&quot;ECF_INCLUDE&quot;</span><span class="p">,</span> <span class="n">ARGS</span><span class="o">.</span><span class="n">ecf_home</span> <span class="o">+</span> <span class="s">&quot;/includes&quot;</span><span class="p">)</span>


    <span class="k">if</span> <span class="n">ARGS</span><span class="o">.</span><span class="n">verbose</span><span class="p">:</span> 
        <span class="k">print</span> <span class="s">&quot;Place all suites into suspended state, so they can be started by the GUI</span><span class="se">\n</span><span class="s">&quot;</span>  
    <span class="k">for</span> <span class="n">suite</span> <span class="ow">in</span> <span class="n">DEFS</span><span class="o">.</span><span class="n">suites</span><span class="p">:</span>
        <span class="n">suite</span><span class="o">.</span><span class="n">add_defstatus</span><span class="p">(</span><span class="n">ecflow</span><span class="o">.</span><span class="n">DState</span><span class="o">.</span><span class="n">suspended</span><span class="p">)</span>
    
    <span class="c"># ecflow.PrintStyle.set_style(ecflow.Style.STATE)</span>
    <span class="k">if</span> <span class="n">ARGS</span><span class="o">.</span><span class="n">verbose</span><span class="p">:</span> 
        <span class="k">print</span> <span class="n">DEFS</span>

    <span class="k">if</span> <span class="n">ARGS</span><span class="o">.</span><span class="n">verbose</span><span class="p">:</span> 
        <span class="k">print</span> <span class="s">&quot;Generating script files(.ecf) from the definition&quot;</span>
    <span class="n">DEFS</span><span class="o">.</span><span class="n">generate_scripts</span><span class="p">()</span>

    <span class="k">if</span> <span class="n">ARGS</span><span class="o">.</span><span class="n">verbose</span><span class="p">:</span> 
        <span class="k">print</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">checking script file generation, pre-processing &amp; variable substitution</span><span class="se">\n</span><span class="s">&quot;</span>
    <span class="n">JOB_CTRL</span> <span class="o">=</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">JobCreationCtrl</span><span class="p">()</span>
    <span class="n">DEFS</span><span class="o">.</span><span class="n">check_job_creation</span><span class="p">(</span><span class="n">JOB_CTRL</span><span class="p">)</span>       
    <span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">JOB_CTRL</span><span class="o">.</span><span class="n">get_error_msg</span><span class="p">())</span> <span class="o">==</span> <span class="mi">0</span><span class="p">,</span> <span class="n">JOB_CTRL</span><span class="o">.</span><span class="n">get_error_msg</span><span class="p">()</span>
    
    <span class="c"># ===========================================================================</span>
    <span class="n">CL</span> <span class="o">=</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">Client</span><span class="p">(</span><span class="n">ARGS</span><span class="o">.</span><span class="n">host</span><span class="p">,</span> <span class="n">ARGS</span><span class="o">.</span><span class="n">port</span><span class="p">)</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="k">if</span> <span class="n">ARGS</span><span class="o">.</span><span class="n">verbose</span><span class="p">:</span> 
            <span class="k">print</span> <span class="s">&quot;check server &quot;</span> <span class="o">+</span> <span class="n">ARGS</span><span class="o">.</span><span class="n">host</span> <span class="o">+</span> <span class="s">&quot;:&quot;</span> <span class="o">+</span> <span class="n">ARGS</span><span class="o">.</span><span class="n">port</span> <span class="o">+</span> <span class="s">&quot; is running&quot;</span>
        <span class="n">CL</span><span class="o">.</span><span class="n">ping</span><span class="p">()</span> 

        <span class="k">if</span> <span class="n">ARGS</span><span class="o">.</span><span class="n">verbose</span><span class="p">:</span> 
            <span class="k">print</span> <span class="s">&quot;start the server running&quot;</span>
        <span class="n">CL</span><span class="o">.</span><span class="n">restart_server</span><span class="p">()</span> 

        <span class="k">if</span> <span class="n">ARGS</span><span class="o">.</span><span class="n">verbose</span><span class="p">:</span> 
            <span class="k">print</span> <span class="s">&quot;Remove suites associated with this DEFS, allows rerun&quot;</span>
        <span class="k">try</span><span class="p">:</span>
            <span class="k">for</span> <span class="n">suite</span> <span class="ow">in</span> <span class="n">DEFS</span><span class="o">.</span><span class="n">suites</span><span class="p">:</span>
                <span class="n">CL</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="n">suite</span><span class="o">.</span><span class="n">get_abs_node_path</span><span class="p">(),</span> <span class="bp">True</span><span class="p">)</span>
        <span class="k">except</span> <span class="ne">RuntimeError</span><span class="p">,</span> <span class="n">ex</span><span class="p">:</span>
            <span class="k">pass</span> <span class="c"># For first run this will fail, hence ignore</span>
        
        <span class="k">if</span> <span class="n">ARGS</span><span class="o">.</span><span class="n">verbose</span><span class="p">:</span> 
            <span class="k">print</span> <span class="s">&quot;Load the definition into &quot;</span> <span class="o">+</span> <span class="n">ARGS</span><span class="o">.</span><span class="n">host</span> <span class="o">+</span> <span class="s">&quot;:&quot;</span> <span class="o">+</span> <span class="n">ARGS</span><span class="o">.</span><span class="n">port</span>
        <span class="n">CL</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">DEFS</span><span class="p">)</span> 
        
        <span class="k">if</span> <span class="n">ARGS</span><span class="o">.</span><span class="n">verbose</span><span class="p">:</span> 
            <span class="k">print</span> <span class="s">&quot;Begin all suites. They should be suspended.&quot;</span>
        <span class="k">print</span> <span class="s">&quot;Loaded suites:&quot;</span>
        <span class="k">for</span> <span class="n">suite</span> <span class="ow">in</span> <span class="n">DEFS</span><span class="o">.</span><span class="n">suites</span><span class="p">:</span>
            <span class="n">CL</span><span class="o">.</span><span class="n">begin_suite</span><span class="p">(</span><span class="n">suite</span><span class="o">.</span><span class="n">name</span><span class="p">())</span>
            <span class="k">print</span> <span class="s">&quot;   &quot;</span> <span class="o">+</span> <span class="n">suite</span><span class="o">.</span><span class="n">name</span><span class="p">()</span>
        <span class="k">print</span> <span class="s">&quot;into server &quot;</span> <span class="o">+</span> <span class="n">ARGS</span><span class="o">.</span><span class="n">host</span> \
                             <span class="o">+</span> <span class="s">&quot;:&quot;</span> <span class="o">+</span> <span class="n">ARGS</span><span class="o">.</span><span class="n">port</span> <span class="o">+</span> <span class="s">&quot;, please view the playable suites in the GUI&quot;</span>
    <span class="k">except</span> <span class="ne">RuntimeError</span><span class="p">,</span> <span class="n">ex</span><span class="p">:</span>
        <span class="k">print</span> <span class="s">&quot;Error: &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">ex</span><span class="p">)</span>
</pre></div>
</div>
</div>