add sphinx documentation
[nepi.git] / doc / sphinx / _build / html / _modules / nepi / execution / resource.html
diff --git a/doc/sphinx/_build/html/_modules/nepi/execution/resource.html b/doc/sphinx/_build/html/_modules/nepi/execution/resource.html
new file mode 100644 (file)
index 0000000..dd535d7
--- /dev/null
@@ -0,0 +1,1326 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    
+    <title>nepi.execution.resource &mdash; NEPI 3.0 documentation</title>
+    
+    <link rel="stylesheet" href="../../../_static/sphinxdoc.css" type="text/css" />
+    <link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
+    
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    '../../../',
+        VERSION:     '3.0',
+        COLLAPSE_INDEX: false,
+        FILE_SUFFIX: '.html',
+        HAS_SOURCE:  true
+      };
+    </script>
+    <script type="text/javascript" src="../../../_static/jquery.js"></script>
+    <script type="text/javascript" src="../../../_static/underscore.js"></script>
+    <script type="text/javascript" src="../../../_static/doctools.js"></script>
+    <link rel="top" title="NEPI 3.0 documentation" href="../../../index.html" />
+    <link rel="up" title="Module code" href="../../index.html" /> 
+  </head>
+  <body>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="../../../genindex.html" title="General Index"
+             accesskey="I">index</a></li>
+        <li class="right" >
+          <a href="../../../py-modindex.html" title="Python Module Index"
+             >modules</a> |</li>
+        <li><a href="../../../index.html">NEPI 3.0 documentation</a> &raquo;</li>
+          <li><a href="../../index.html" accesskey="U">Module code</a> &raquo;</li> 
+      </ul>
+    </div>
+      <div class="sphinxsidebar">
+        <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+  <h3>Quick search</h3>
+    <form class="search" action="../../../search.html" method="get">
+      <input type="text" name="q" />
+      <input type="submit" value="Go" />
+      <input type="hidden" name="check_keywords" value="yes" />
+      <input type="hidden" name="area" value="default" />
+    </form>
+    <p class="searchtip" style="font-size: 90%">
+    Enter search terms or a module, class or function name.
+    </p>
+</div>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+        </div>
+      </div>
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body">
+            
+  <h1>Source code for nepi.execution.resource</h1><div class="highlight"><pre>
+<span class="c">#</span>
+<span class="c">#    NEPI, a framework to manage network experiments</span>
+<span class="c">#    Copyright (C) 2013 INRIA</span>
+<span class="c">#</span>
+<span class="c">#    This program is free software: you can redistribute it and/or modify</span>
+<span class="c">#    it under the terms of the GNU General Public License version 2 as</span>
+<span class="c">#    published by the Free Software Foundation;</span>
+<span class="c">#</span>
+<span class="c">#    This program is distributed in the hope that it will be useful,</span>
+<span class="c">#    but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
+<span class="c">#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span>
+<span class="c">#    GNU General Public License for more details.</span>
+<span class="c">#</span>
+<span class="c">#    You should have received a copy of the GNU General Public License</span>
+<span class="c">#    along with this program.  If not, see &lt;http://www.gnu.org/licenses/&gt;.</span>
+<span class="c">#</span>
+<span class="c"># Author: Alina Quereilhac &lt;alina.quereilhac@inria.fr&gt;</span>
+
+<span class="kn">from</span> <span class="nn">nepi.util.timefuncs</span> <span class="kn">import</span> <span class="n">tnow</span><span class="p">,</span> <span class="n">tdiff</span><span class="p">,</span> <span class="n">tdiffsec</span><span class="p">,</span> <span class="n">stabsformat</span>
+<span class="kn">from</span> <span class="nn">nepi.util.logger</span> <span class="kn">import</span> <span class="n">Logger</span>
+<span class="kn">from</span> <span class="nn">nepi.execution.attribute</span> <span class="kn">import</span> <span class="n">Attribute</span><span class="p">,</span> <span class="n">Flags</span><span class="p">,</span> <span class="n">Types</span>
+<span class="kn">from</span> <span class="nn">nepi.execution.trace</span> <span class="kn">import</span> <span class="n">TraceAttr</span>
+
+<span class="kn">import</span> <span class="nn">copy</span>
+<span class="kn">import</span> <span class="nn">functools</span>
+<span class="kn">import</span> <span class="nn">logging</span>
+<span class="kn">import</span> <span class="nn">os</span>
+<span class="kn">import</span> <span class="nn">pkgutil</span>
+<span class="kn">import</span> <span class="nn">sys</span>
+<span class="kn">import</span> <span class="nn">threading</span>
+<span class="kn">import</span> <span class="nn">weakref</span>
+
+<div class="viewcode-block" id="ResourceAction"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceAction">[docs]</a><span class="k">class</span> <span class="nc">ResourceAction</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot; Action that a user can order to a Resource Manager</span>
+<span class="sd">   </span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="n">DEPLOY</span> <span class="o">=</span> <span class="mi">0</span>
+    <span class="n">START</span> <span class="o">=</span> <span class="mi">1</span>
+    <span class="n">STOP</span> <span class="o">=</span> <span class="mi">2</span>
+</div>
+<div class="viewcode-block" id="ResourceState"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceState">[docs]</a><span class="k">class</span> <span class="nc">ResourceState</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot; State of a Resource Manager</span>
+<span class="sd">   </span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="n">NEW</span> <span class="o">=</span> <span class="mi">0</span>
+    <span class="n">DISCOVERED</span> <span class="o">=</span> <span class="mi">1</span>
+    <span class="n">RESERVED</span> <span class="o">=</span> <span class="mi">2</span>
+    <span class="n">PROVISIONED</span> <span class="o">=</span> <span class="mi">3</span>
+    <span class="n">READY</span> <span class="o">=</span> <span class="mi">4</span>
+    <span class="n">STARTED</span> <span class="o">=</span> <span class="mi">5</span>
+    <span class="n">STOPPED</span> <span class="o">=</span> <span class="mi">6</span>
+    <span class="n">FAILED</span> <span class="o">=</span> <span class="mi">7</span>
+    <span class="n">RELEASED</span> <span class="o">=</span> <span class="mi">8</span>
+</div>
+<span class="n">ResourceState2str</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">({</span>
+    <span class="n">ResourceState</span><span class="o">.</span><span class="n">NEW</span> <span class="p">:</span> <span class="s">&quot;NEW&quot;</span><span class="p">,</span>
+    <span class="n">ResourceState</span><span class="o">.</span><span class="n">DISCOVERED</span> <span class="p">:</span> <span class="s">&quot;DISCOVERED&quot;</span><span class="p">,</span>
+    <span class="n">ResourceState</span><span class="o">.</span><span class="n">RESERVED</span> <span class="p">:</span> <span class="s">&quot;RESERVED&quot;</span><span class="p">,</span>
+    <span class="n">ResourceState</span><span class="o">.</span><span class="n">PROVISIONED</span> <span class="p">:</span> <span class="s">&quot;PROVISIONED&quot;</span><span class="p">,</span>
+    <span class="n">ResourceState</span><span class="o">.</span><span class="n">READY</span> <span class="p">:</span> <span class="s">&quot;READY&quot;</span><span class="p">,</span>
+    <span class="n">ResourceState</span><span class="o">.</span><span class="n">STARTED</span> <span class="p">:</span> <span class="s">&quot;STARTED&quot;</span><span class="p">,</span>
+    <span class="n">ResourceState</span><span class="o">.</span><span class="n">STOPPED</span> <span class="p">:</span> <span class="s">&quot;STOPPED&quot;</span><span class="p">,</span>
+    <span class="n">ResourceState</span><span class="o">.</span><span class="n">FAILED</span> <span class="p">:</span> <span class="s">&quot;FAILED&quot;</span><span class="p">,</span>
+    <span class="n">ResourceState</span><span class="o">.</span><span class="n">RELEASED</span> <span class="p">:</span> <span class="s">&quot;RELEASED&quot;</span><span class="p">,</span>
+    <span class="p">})</span>
+
+<div class="viewcode-block" id="clsinit"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.clsinit">[docs]</a><span class="k">def</span> <span class="nf">clsinit</span><span class="p">(</span><span class="n">cls</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot; Initializes template information (i.e. attributes and traces)</span>
+<span class="sd">    on classes derived from the ResourceManager class.</span>
+
+<span class="sd">    It is used as a decorator in the class declaration as follows:</span>
+
+<span class="sd">        @clsinit</span>
+<span class="sd">        class MyResourceManager(ResourceManager):</span>
+<span class="sd">        </span>
+<span class="sd">            ...</span>
+
+<span class="sd">     &quot;&quot;&quot;</span>
+
+    <span class="n">cls</span><span class="o">.</span><span class="n">_clsinit</span><span class="p">()</span>
+    <span class="k">return</span> <span class="n">cls</span>
+</div>
+<div class="viewcode-block" id="clsinit_copy"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.clsinit_copy">[docs]</a><span class="k">def</span> <span class="nf">clsinit_copy</span><span class="p">(</span><span class="n">cls</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot; Initializes template information (i.e. attributes and traces)</span>
+<span class="sd">    on classes derived from the ResourceManager class.</span>
+<span class="sd">    It differs from the clsinit method in that it forces inheritance</span>
+<span class="sd">    of attributes and traces from the parent class.</span>
+
+<span class="sd">    It is used as a decorator in the class declaration as follows:</span>
+
+<span class="sd">        @clsinit</span>
+<span class="sd">        class MyResourceManager(ResourceManager):</span>
+<span class="sd">        </span>
+<span class="sd">            ...</span>
+
+
+<span class="sd">    clsinit_copy should be prefered to clsinit when creating new</span>
+<span class="sd">    ResourceManager child classes.</span>
+
+<span class="sd">    &quot;&quot;&quot;</span>
+    
+    <span class="n">cls</span><span class="o">.</span><span class="n">_clsinit_copy</span><span class="p">()</span>
+    <span class="k">return</span> <span class="n">cls</span>
+</div>
+<div class="viewcode-block" id="failtrap"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.failtrap">[docs]</a><span class="k">def</span> <span class="nf">failtrap</span><span class="p">(</span><span class="n">func</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot; Decorator function for instance methods that should set the </span>
+<span class="sd">    RM state to FAILED when an error is raised. The methods that must be</span>
+<span class="sd">    decorated are: discover, reserved, provision, deploy, start, stop.</span>
+
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">def</span> <span class="nf">wrapped</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
+        <span class="k">try</span><span class="p">:</span>
+            <span class="k">return</span> <span class="n">func</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
+        <span class="k">except</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">fail</span><span class="p">()</span>
+            
+            <span class="kn">import</span> <span class="nn">traceback</span>
+            <span class="n">err</span> <span class="o">=</span> <span class="n">traceback</span><span class="o">.</span><span class="n">format_exc</span><span class="p">()</span>
+            <span class="n">logger</span> <span class="o">=</span> <span class="n">Logger</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_rtype</span><span class="p">)</span>
+            <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
+            <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s">&quot;SETTING guid </span><span class="si">%d</span><span class="s"> to state FAILED&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">guid</span><span class="p">)</span>
+            <span class="k">raise</span>
+    
+    <span class="k">return</span> <span class="n">wrapped</span>
+</div>
+<span class="nd">@clsinit</span>
+<div class="viewcode-block" id="ResourceManager"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager">[docs]</a><span class="k">class</span> <span class="nc">ResourceManager</span><span class="p">(</span><span class="n">Logger</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot; Base clase for all ResourceManagers. </span>
+<span class="sd">    </span>
+<span class="sd">    A ResourceManger is specific to a resource type (e.g. Node, </span>
+<span class="sd">    Switch, Application, etc) on a specific platform (e.g. PlanetLab, </span>
+<span class="sd">    OMF, etc).</span>
+
+<span class="sd">    The ResourceManager instances are responsible for interacting with</span>
+<span class="sd">    and controlling concrete (physical or virtual) resources in the </span>
+<span class="sd">    experimental platforms.</span>
+<span class="sd">    </span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="n">_rtype</span> <span class="o">=</span> <span class="s">&quot;Resource&quot;</span>
+    <span class="n">_attributes</span> <span class="o">=</span> <span class="bp">None</span>
+    <span class="n">_traces</span> <span class="o">=</span> <span class="bp">None</span>
+    <span class="n">_help</span> <span class="o">=</span> <span class="bp">None</span>
+    <span class="n">_platform</span> <span class="o">=</span> <span class="bp">None</span>
+    <span class="n">_reschedule_delay</span> <span class="o">=</span> <span class="s">&quot;0.5s&quot;</span>
+
+    <span class="nd">@classmethod</span>
+    <span class="k">def</span> <span class="nf">_register_attribute</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">attr</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Resource subclasses will invoke this method to add a </span>
+<span class="sd">        resource attribute</span>
+
+<span class="sd">        &quot;&quot;&quot;</span>
+        
+        <span class="n">cls</span><span class="o">.</span><span class="n">_attributes</span><span class="p">[</span><span class="n">attr</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">attr</span>
+
+    <span class="nd">@classmethod</span>
+    <span class="k">def</span> <span class="nf">_remove_attribute</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Resource subclasses will invoke this method to remove a </span>
+<span class="sd">        resource attribute</span>
+
+<span class="sd">        &quot;&quot;&quot;</span>
+        
+        <span class="k">del</span> <span class="n">cls</span><span class="o">.</span><span class="n">_attributes</span><span class="p">[</span><span class="n">name</span><span class="p">]</span>
+
+    <span class="nd">@classmethod</span>
+    <span class="k">def</span> <span class="nf">_register_trace</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">trace</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Resource subclasses will invoke this method to add a </span>
+<span class="sd">        resource trace</span>
+
+<span class="sd">        &quot;&quot;&quot;</span>
+        
+        <span class="n">cls</span><span class="o">.</span><span class="n">_traces</span><span class="p">[</span><span class="n">trace</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">trace</span>
+
+    <span class="nd">@classmethod</span>
+    <span class="k">def</span> <span class="nf">_remove_trace</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Resource subclasses will invoke this method to remove a </span>
+<span class="sd">        resource trace</span>
+
+<span class="sd">        &quot;&quot;&quot;</span>
+        
+        <span class="k">del</span> <span class="n">cls</span><span class="o">.</span><span class="n">_traces</span><span class="p">[</span><span class="n">name</span><span class="p">]</span>
+
+    <span class="nd">@classmethod</span>
+    <span class="k">def</span> <span class="nf">_register_attributes</span><span class="p">(</span><span class="n">cls</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Resource subclasses will invoke this method to register</span>
+<span class="sd">        resource attributes.</span>
+
+<span class="sd">        This method should be overriden in the RMs that define</span>
+<span class="sd">        attributes.</span>
+
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">critical</span> <span class="o">=</span> <span class="n">Attribute</span><span class="p">(</span><span class="s">&quot;critical&quot;</span><span class="p">,</span> 
+                <span class="s">&quot;Defines whether the resource is critical. &quot;</span>
+                <span class="s">&quot;A failure on a critical resource will interrupt &quot;</span>
+                <span class="s">&quot;the experiment. &quot;</span><span class="p">,</span>
+                <span class="nb">type</span> <span class="o">=</span> <span class="n">Types</span><span class="o">.</span><span class="n">Bool</span><span class="p">,</span>
+                <span class="n">default</span> <span class="o">=</span> <span class="bp">True</span><span class="p">,</span>
+                <span class="n">flags</span> <span class="o">=</span> <span class="n">Flags</span><span class="o">.</span><span class="n">Design</span><span class="p">)</span>
+        <span class="n">hard_release</span> <span class="o">=</span> <span class="n">Attribute</span><span class="p">(</span><span class="s">&quot;hardRelease&quot;</span><span class="p">,</span> 
+                <span class="s">&quot;Forces removal of all result files and directories associated &quot;</span>
+                <span class="s">&quot;to the RM upon resource release. After release the RM will &quot;</span>
+                <span class="s">&quot;be removed from the EC and the results will not longer be &quot;</span>
+                <span class="s">&quot;accessible&quot;</span><span class="p">,</span>
+                <span class="nb">type</span> <span class="o">=</span> <span class="n">Types</span><span class="o">.</span><span class="n">Bool</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">flags</span> <span class="o">=</span> <span class="n">Flags</span><span class="o">.</span><span class="n">Design</span><span class="p">)</span>
+
+        <span class="n">cls</span><span class="o">.</span><span class="n">_register_attribute</span><span class="p">(</span><span class="n">critical</span><span class="p">)</span>
+        <span class="n">cls</span><span class="o">.</span><span class="n">_register_attribute</span><span class="p">(</span><span class="n">hard_release</span><span class="p">)</span>
+        
+    <span class="nd">@classmethod</span>
+    <span class="k">def</span> <span class="nf">_register_traces</span><span class="p">(</span><span class="n">cls</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Resource subclasses will invoke this method to register</span>
+<span class="sd">        resource traces</span>
+
+<span class="sd">        This method should be overridden in the RMs that define traces.</span>
+<span class="sd">        </span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        
+        <span class="k">pass</span>
+
+    <span class="nd">@classmethod</span>
+    <span class="k">def</span> <span class="nf">_clsinit</span><span class="p">(</span><span class="n">cls</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; ResourceManager classes have different attributes and traces.</span>
+<span class="sd">        Attribute and traces are stored in &#39;class attribute&#39; dictionaries.</span>
+<span class="sd">        When a new ResourceManager class is created, the _clsinit method is </span>
+<span class="sd">        called to create a new instance of those dictionaries and initialize </span>
+<span class="sd">        them.</span>
+<span class="sd">        </span>
+<span class="sd">        The _clsinit method is called by the clsinit decorator method.</span>
+<span class="sd">        </span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        
+        <span class="c"># static template for resource attributes</span>
+        <span class="n">cls</span><span class="o">.</span><span class="n">_attributes</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>
+        <span class="n">cls</span><span class="o">.</span><span class="n">_register_attributes</span><span class="p">()</span>
+
+        <span class="c"># static template for resource traces</span>
+        <span class="n">cls</span><span class="o">.</span><span class="n">_traces</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>
+        <span class="n">cls</span><span class="o">.</span><span class="n">_register_traces</span><span class="p">()</span>
+
+    <span class="nd">@classmethod</span>
+    <span class="k">def</span> <span class="nf">_clsinit_copy</span><span class="p">(</span><span class="n">cls</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Same as _clsinit, except that after creating new instances of the</span>
+<span class="sd">        dictionaries it copies all the attributes and traces from the parent </span>
+<span class="sd">        class.</span>
+<span class="sd">        </span>
+<span class="sd">        The _clsinit_copy method is called by the clsinit_copy decorator method.</span>
+<span class="sd">        </span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="c"># static template for resource attributes</span>
+        <span class="n">cls</span><span class="o">.</span><span class="n">_attributes</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="n">cls</span><span class="o">.</span><span class="n">_attributes</span><span class="p">)</span>
+        <span class="n">cls</span><span class="o">.</span><span class="n">_register_attributes</span><span class="p">()</span>
+
+        <span class="c"># static template for resource traces</span>
+        <span class="n">cls</span><span class="o">.</span><span class="n">_traces</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="n">cls</span><span class="o">.</span><span class="n">_traces</span><span class="p">)</span>
+        <span class="n">cls</span><span class="o">.</span><span class="n">_register_traces</span><span class="p">()</span>
+
+    <span class="nd">@classmethod</span>
+<div class="viewcode-block" id="ResourceManager.get_rtype"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.get_rtype">[docs]</a>    <span class="k">def</span> <span class="nf">get_rtype</span><span class="p">(</span><span class="n">cls</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Returns the type of the Resource Manager</span>
+
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="n">cls</span><span class="o">.</span><span class="n">_rtype</span>
+</div>
+    <span class="nd">@classmethod</span>
+<div class="viewcode-block" id="ResourceManager.get_attributes"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.get_attributes">[docs]</a>    <span class="k">def</span> <span class="nf">get_attributes</span><span class="p">(</span><span class="n">cls</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Returns a copy of the attributes</span>
+
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="n">cls</span><span class="o">.</span><span class="n">_attributes</span><span class="o">.</span><span class="n">values</span><span class="p">())</span>
+</div>
+    <span class="nd">@classmethod</span>
+<div class="viewcode-block" id="ResourceManager.get_attribute"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.get_attribute">[docs]</a>    <span class="k">def</span> <span class="nf">get_attribute</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Returns a copy of the attribute with name &#39;name&#39;</span>
+
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="n">cls</span><span class="o">.</span><span class="n">_attributes</span><span class="p">[</span><span class="n">name</span><span class="p">])</span>
+</div>
+    <span class="nd">@classmethod</span>
+<div class="viewcode-block" id="ResourceManager.get_traces"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.get_traces">[docs]</a>    <span class="k">def</span> <span class="nf">get_traces</span><span class="p">(</span><span class="n">cls</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Returns a copy of the traces</span>
+
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="n">cls</span><span class="o">.</span><span class="n">_traces</span><span class="o">.</span><span class="n">values</span><span class="p">())</span>
+</div>
+    <span class="nd">@classmethod</span>
+<div class="viewcode-block" id="ResourceManager.get_help"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.get_help">[docs]</a>    <span class="k">def</span> <span class="nf">get_help</span><span class="p">(</span><span class="n">cls</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Returns the description of the type of Resource</span>
+
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="n">cls</span><span class="o">.</span><span class="n">_help</span>
+</div>
+    <span class="nd">@classmethod</span>
+<div class="viewcode-block" id="ResourceManager.get_platform"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.get_platform">[docs]</a>    <span class="k">def</span> <span class="nf">get_platform</span><span class="p">(</span><span class="n">cls</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Returns the identified of the platform (i.e. testbed type)</span>
+<span class="sd">        for the Resource</span>
+
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="n">cls</span><span class="o">.</span><span class="n">_platform</span>
+</div>
+    <span class="nd">@classmethod</span>
+<div class="viewcode-block" id="ResourceManager.get_global"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.get_global">[docs]</a>    <span class="k">def</span> <span class="nf">get_global</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Returns the value of a global attribute</span>
+<span class="sd">            Global attribute meaning an attribute for </span>
+<span class="sd">            all the resources from a rtype</span>
+
+<span class="sd">        :param name: Name of the attribute</span>
+<span class="sd">        :type name: str</span>
+<span class="sd">        :rtype: str</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">global_attr</span> <span class="o">=</span> <span class="n">cls</span><span class="o">.</span><span class="n">_attributes</span><span class="p">[</span><span class="n">name</span><span class="p">]</span>
+        <span class="k">return</span> <span class="n">global_attr</span><span class="o">.</span><span class="n">value</span>
+</div>
+    <span class="nd">@classmethod</span>
+<div class="viewcode-block" id="ResourceManager.set_global"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.set_global">[docs]</a>    <span class="k">def</span> <span class="nf">set_global</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Set value for a global attribute</span>
+
+<span class="sd">        :param name: Name of the attribute</span>
+<span class="sd">        :type name: str</span>
+<span class="sd">        :param name: Value of the attribute</span>
+<span class="sd">        :type name: str</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">global_attr</span> <span class="o">=</span> <span class="n">cls</span><span class="o">.</span><span class="n">_attributes</span><span class="p">[</span><span class="n">name</span><span class="p">]</span>
+        <span class="n">global_attr</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">value</span>
+        <span class="k">return</span> <span class="n">value</span>
+</div>
+    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ec</span><span class="p">,</span> <span class="n">guid</span><span class="p">):</span>
+        <span class="nb">super</span><span class="p">(</span><span class="n">ResourceManager</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_rtype</span><span class="p">())</span>
+        
+        <span class="bp">self</span><span class="o">.</span><span class="n">_guid</span> <span class="o">=</span> <span class="n">guid</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_ec</span> <span class="o">=</span> <span class="n">weakref</span><span class="o">.</span><span class="n">ref</span><span class="p">(</span><span class="n">ec</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_connections</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_conditions</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span> 
+
+        <span class="c"># the resource instance gets a copy of all attributes</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_attrs</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_attributes</span><span class="p">)</span>
+
+        <span class="c"># the resource instance gets a copy of all traces</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_trcs</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_traces</span><span class="p">)</span>
+
+        <span class="c"># Each resource is placed on a deployment group by the EC</span>
+        <span class="c"># during deployment</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">deployment_group</span> <span class="o">=</span> <span class="bp">None</span>
+
+        <span class="bp">self</span><span class="o">.</span><span class="n">_start_time</span> <span class="o">=</span> <span class="bp">None</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_stop_time</span> <span class="o">=</span> <span class="bp">None</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_discover_time</span> <span class="o">=</span> <span class="bp">None</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_reserved_time</span> <span class="o">=</span> <span class="bp">None</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_provision_time</span> <span class="o">=</span> <span class="bp">None</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_ready_time</span> <span class="o">=</span> <span class="bp">None</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_release_time</span> <span class="o">=</span> <span class="bp">None</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_failed_time</span> <span class="o">=</span> <span class="bp">None</span>
+
+        <span class="bp">self</span><span class="o">.</span><span class="n">_state</span> <span class="o">=</span> <span class="n">ResourceState</span><span class="o">.</span><span class="n">NEW</span>
+
+        <span class="c"># instance lock to synchronize exclusive state change methods (such</span>
+        <span class="c"># as deploy and release methods), in order to prevent them from being </span>
+        <span class="c"># executed at the same time and corrupt internal resource state</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_release_lock</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Lock</span><span class="p">()</span>
+
+    <span class="nd">@property</span>
+<div class="viewcode-block" id="ResourceManager.guid"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.guid">[docs]</a>    <span class="k">def</span> <span class="nf">guid</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Returns the global unique identifier of the RM &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_guid</span>
+</div>
+    <span class="nd">@property</span>
+<div class="viewcode-block" id="ResourceManager.ec"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.ec">[docs]</a>    <span class="k">def</span> <span class="nf">ec</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Returns the Experiment Controller of the RM &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_ec</span><span class="p">()</span>
+</div>
+    <span class="nd">@property</span>
+<div class="viewcode-block" id="ResourceManager.connections"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.connections">[docs]</a>    <span class="k">def</span> <span class="nf">connections</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Returns the set of guids of connected RMs &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_connections</span>
+</div>
+    <span class="nd">@property</span>
+<div class="viewcode-block" id="ResourceManager.conditions"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.conditions">[docs]</a>    <span class="k">def</span> <span class="nf">conditions</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Returns the conditions to which the RM is subjected to.</span>
+<span class="sd">        </span>
+<span class="sd">        This method returns a dictionary of conditions lists indexed by</span>
+<span class="sd">        a ResourceAction.</span>
+<span class="sd">        </span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_conditions</span>
+</div>
+    <span class="nd">@property</span>
+<div class="viewcode-block" id="ResourceManager.start_time"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.start_time">[docs]</a>    <span class="k">def</span> <span class="nf">start_time</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Returns the start time of the RM as a timestamp &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_start_time</span>
+</div>
+    <span class="nd">@property</span>
+<div class="viewcode-block" id="ResourceManager.stop_time"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.stop_time">[docs]</a>    <span class="k">def</span> <span class="nf">stop_time</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Returns the stop time of the RM as a timestamp &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_stop_time</span>
+</div>
+    <span class="nd">@property</span>
+<div class="viewcode-block" id="ResourceManager.discover_time"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.discover_time">[docs]</a>    <span class="k">def</span> <span class="nf">discover_time</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Returns the discover time of the RM as a timestamp &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_discover_time</span>
+</div>
+    <span class="nd">@property</span>
+<div class="viewcode-block" id="ResourceManager.reserved_time"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.reserved_time">[docs]</a>    <span class="k">def</span> <span class="nf">reserved_time</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Returns the reserved time of the RM as a timestamp &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reserved_time</span>
+</div>
+    <span class="nd">@property</span>
+<div class="viewcode-block" id="ResourceManager.provision_time"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.provision_time">[docs]</a>    <span class="k">def</span> <span class="nf">provision_time</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Returns the provision time of the RM as a timestamp &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_provision_time</span>
+</div>
+    <span class="nd">@property</span>
+<div class="viewcode-block" id="ResourceManager.ready_time"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.ready_time">[docs]</a>    <span class="k">def</span> <span class="nf">ready_time</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Returns the deployment time of the RM as a timestamp &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_ready_time</span>
+</div>
+    <span class="nd">@property</span>
+<div class="viewcode-block" id="ResourceManager.release_time"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.release_time">[docs]</a>    <span class="k">def</span> <span class="nf">release_time</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Returns the release time of the RM as a timestamp &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_release_time</span>
+</div>
+    <span class="nd">@property</span>
+<div class="viewcode-block" id="ResourceManager.failed_time"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.failed_time">[docs]</a>    <span class="k">def</span> <span class="nf">failed_time</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Returns the time failure occurred for the RM as a timestamp &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_failed_time</span>
+</div>
+    <span class="nd">@property</span>
+<div class="viewcode-block" id="ResourceManager.state"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.state">[docs]</a>    <span class="k">def</span> <span class="nf">state</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Get the current state of the RM &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_state</span>
+</div>
+    <span class="nd">@property</span>
+<div class="viewcode-block" id="ResourceManager.reschedule_delay"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.reschedule_delay">[docs]</a>    <span class="k">def</span> <span class="nf">reschedule_delay</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Returns default reschedule delay &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reschedule_delay</span>
+</div>
+<div class="viewcode-block" id="ResourceManager.log_message"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.log_message">[docs]</a>    <span class="k">def</span> <span class="nf">log_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msg</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Returns the log message formatted with added information.</span>
+
+<span class="sd">        :param msg: text message</span>
+<span class="sd">        :type msg: str</span>
+<span class="sd">        :rtype: str</span>
+
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="s">&quot; </span><span class="si">%s</span><span class="s"> guid </span><span class="si">%d</span><span class="s"> - </span><span class="si">%s</span><span class="s"> &quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_rtype</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">guid</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="ResourceManager.register_connection"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.register_connection">[docs]</a>    <span class="k">def</span> <span class="nf">register_connection</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">guid</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Registers a connection to the RM identified by guid</span>
+
+<span class="sd">        This method should not be overridden. Specific functionality</span>
+<span class="sd">        should be added in the do_connect method.</span>
+
+<span class="sd">        :param guid: Global unique identified of the RM to connect to</span>
+<span class="sd">        :type guid: int</span>
+
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">valid_connection</span><span class="p">(</span><span class="n">guid</span><span class="p">):</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">do_connect</span><span class="p">(</span><span class="n">guid</span><span class="p">)</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">_connections</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">guid</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="ResourceManager.unregister_connection"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.unregister_connection">[docs]</a>    <span class="k">def</span> <span class="nf">unregister_connection</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">guid</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Removes a registered connection to the RM identified by guid</span>
+<span class="sd">        </span>
+<span class="sd">        This method should not be overridden. Specific functionality</span>
+<span class="sd">        should be added in the do_disconnect method.</span>
+
+<span class="sd">        :param guid: Global unique identified of the RM to connect to</span>
+<span class="sd">        :type guid: int</span>
+
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="n">guid</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_connections</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">do_disconnect</span><span class="p">(</span><span class="n">guid</span><span class="p">)</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">_connections</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">guid</span><span class="p">)</span>
+</div>
+    <span class="nd">@failtrap</span>
+<div class="viewcode-block" id="ResourceManager.discover"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.discover">[docs]</a>    <span class="k">def</span> <span class="nf">discover</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Performs resource discovery.</span>
+<span class="sd">        </span>
+<span class="sd">        This  method is responsible for selecting an individual resource</span>
+<span class="sd">        matching user requirements.</span>
+
+<span class="sd">        This method should not be overridden directly. Specific functionality</span>
+<span class="sd">        should be added in the do_discover method.</span>
+
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">_release_lock</span><span class="p">:</span>
+            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_state</span> <span class="o">!=</span> <span class="n">ResourceState</span><span class="o">.</span><span class="n">RELEASED</span><span class="p">:</span>
+                <span class="bp">self</span><span class="o">.</span><span class="n">do_discover</span><span class="p">()</span>
+</div>
+    <span class="nd">@failtrap</span>
+<div class="viewcode-block" id="ResourceManager.reserve"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.reserve">[docs]</a>    <span class="k">def</span> <span class="nf">reserve</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Performs resource reserve.</span>
+<span class="sd">        </span>
+<span class="sd">        This  method is responsible for reserving an individual resource</span>
+<span class="sd">        matching user requirements.</span>
+
+<span class="sd">        This method should not be overridden directly. Specific functionality</span>
+<span class="sd">        should be added in the do_reserved method.</span>
+
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">_release_lock</span><span class="p">:</span>
+            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_state</span> <span class="o">!=</span> <span class="n">ResourceState</span><span class="o">.</span><span class="n">RELEASED</span><span class="p">:</span>
+                <span class="bp">self</span><span class="o">.</span><span class="n">do_reserve</span><span class="p">()</span>
+</div>
+    <span class="nd">@failtrap</span>
+<div class="viewcode-block" id="ResourceManager.provision"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.provision">[docs]</a>    <span class="k">def</span> <span class="nf">provision</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Performs resource provisioning.</span>
+
+<span class="sd">        This  method is responsible for provisioning one resource.</span>
+<span class="sd">        After this method has been successfully invoked, the resource</span>
+<span class="sd">        should be accessible/controllable by the RM.</span>
+
+<span class="sd">        This method should not be overridden directly. Specific functionality</span>
+<span class="sd">        should be added in the do_provision method.</span>
+
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">_release_lock</span><span class="p">:</span>
+            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_state</span> <span class="o">!=</span> <span class="n">ResourceState</span><span class="o">.</span><span class="n">RELEASED</span><span class="p">:</span>
+                <span class="bp">self</span><span class="o">.</span><span class="n">do_provision</span><span class="p">()</span>
+</div>
+    <span class="nd">@failtrap</span>
+<div class="viewcode-block" id="ResourceManager.configure"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.configure">[docs]</a>    <span class="k">def</span> <span class="nf">configure</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Performs resource configuration.</span>
+
+<span class="sd">        This  method is responsible for configuring one resource.</span>
+<span class="sd">        After this method has been successfully invoked, the resource</span>
+<span class="sd">        should be set up to start the experimentation.</span>
+
+<span class="sd">        This method should not be overridden directly. Specific functionality</span>
+<span class="sd">        should be added in the do_configure method.</span>
+
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">_release_lock</span><span class="p">:</span>
+            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_state</span> <span class="o">!=</span> <span class="n">ResourceState</span><span class="o">.</span><span class="n">RELEASED</span><span class="p">:</span>
+                <span class="bp">self</span><span class="o">.</span><span class="n">do_configure</span><span class="p">()</span>
+</div>
+    <span class="nd">@failtrap</span>
+<div class="viewcode-block" id="ResourceManager.start"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.start">[docs]</a>    <span class="k">def</span> <span class="nf">start</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Starts the RM (e.g. launch remote process).</span>
+<span class="sd">    </span>
+<span class="sd">        There is no standard start behavior. Some RMs will not need to perform</span>
+<span class="sd">        any actions upon start.</span>
+
+<span class="sd">        This method should not be overridden directly. Specific functionality</span>
+<span class="sd">        should be added in the do_start method.</span>
+
+<span class="sd">        &quot;&quot;&quot;</span>
+
+        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">state</span> <span class="ow">in</span> <span class="p">[</span><span class="n">ResourceState</span><span class="o">.</span><span class="n">READY</span><span class="p">,</span> <span class="n">ResourceState</span><span class="o">.</span><span class="n">STOPPED</span><span class="p">]:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s">&quot;Wrong state </span><span class="si">%s</span><span class="s"> for start&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">state</span><span class="p">)</span>
+            <span class="k">return</span>
+
+        <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">_release_lock</span><span class="p">:</span>
+            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_state</span> <span class="o">!=</span> <span class="n">ResourceState</span><span class="o">.</span><span class="n">RELEASED</span><span class="p">:</span>
+                <span class="bp">self</span><span class="o">.</span><span class="n">do_start</span><span class="p">()</span>
+</div>
+    <span class="nd">@failtrap</span>
+<div class="viewcode-block" id="ResourceManager.stop"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.stop">[docs]</a>    <span class="k">def</span> <span class="nf">stop</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Interrupts the RM, stopping any tasks the RM was performing.</span>
+<span class="sd">     </span>
+<span class="sd">        There is no standard stop behavior. Some RMs will not need to perform</span>
+<span class="sd">        any actions upon stop.</span>
+<span class="sd">    </span>
+<span class="sd">        This method should not be overridden directly. Specific functionality</span>
+<span class="sd">        should be added in the do_stop method.</span>
+<span class="sd">      </span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">state</span> <span class="ow">in</span> <span class="p">[</span><span class="n">ResourceState</span><span class="o">.</span><span class="n">STARTED</span><span class="p">]:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s">&quot;Wrong state </span><span class="si">%s</span><span class="s"> for stop&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">state</span><span class="p">)</span>
+            <span class="k">return</span>
+        
+        <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">_release_lock</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">do_stop</span><span class="p">()</span>
+</div>
+    <span class="nd">@failtrap</span>
+<div class="viewcode-block" id="ResourceManager.deploy"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.deploy">[docs]</a>    <span class="k">def</span> <span class="nf">deploy</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Execute all steps required for the RM to reach the state READY.</span>
+
+<span class="sd">        This method is responsible for deploying the resource (and invoking </span>
+<span class="sd">        the discover and provision methods).</span>
+<span class="sd"> </span>
+<span class="sd">        This method should not be overridden directly. Specific functionality</span>
+<span class="sd">        should be added in the do_deploy method.</span>
+<span class="sd">       </span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">state</span> <span class="o">&gt;</span> <span class="n">ResourceState</span><span class="o">.</span><span class="n">READY</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s">&quot;Wrong state </span><span class="si">%s</span><span class="s"> for deploy&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">state</span><span class="p">)</span>
+            <span class="k">return</span>
+
+        <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">_release_lock</span><span class="p">:</span>
+            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_state</span> <span class="o">!=</span> <span class="n">ResourceState</span><span class="o">.</span><span class="n">RELEASED</span><span class="p">:</span>
+                <span class="bp">self</span><span class="o">.</span><span class="n">do_deploy</span><span class="p">()</span>
+</div>
+<div class="viewcode-block" id="ResourceManager.release"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.release">[docs]</a>    <span class="k">def</span> <span class="nf">release</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Perform actions to free resources used by the RM.</span>
+<span class="sd">  </span>
+<span class="sd">        This  method is responsible for releasing resources that were</span>
+<span class="sd">        used during the experiment by the RM.</span>
+
+<span class="sd">        This method should not be overridden directly. Specific functionality</span>
+<span class="sd">        should be added in the do_release method.</span>
+<span class="sd">      </span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">_release_lock</span><span class="p">:</span>
+            <span class="k">try</span><span class="p">:</span>
+                <span class="bp">self</span><span class="o">.</span><span class="n">do_release</span><span class="p">()</span>
+            <span class="k">except</span><span class="p">:</span>
+                <span class="bp">self</span><span class="o">.</span><span class="n">set_released</span><span class="p">()</span>
+
+                <span class="kn">import</span> <span class="nn">traceback</span>
+                <span class="n">err</span> <span class="o">=</span> <span class="n">traceback</span><span class="o">.</span><span class="n">format_exc</span><span class="p">()</span>
+                <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot; </span><span class="si">%s</span><span class="s"> guid </span><span class="si">%d</span><span class="s"> ----- FAILED TO RELEASE ----- </span><span class="se">\n</span><span class="s"> </span><span class="si">%s</span><span class="s"> &quot;</span> <span class="o">%</span> <span class="p">(</span>
+                        <span class="bp">self</span><span class="o">.</span><span class="n">_rtype</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">guid</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
+                <span class="n">logger</span> <span class="o">=</span> <span class="n">Logger</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_rtype</span><span class="p">)</span>
+                <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="ResourceManager.fail"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.fail">[docs]</a>    <span class="k">def</span> <span class="nf">fail</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Sets the RM to state FAILED.</span>
+
+<span class="sd">        This method should not be overridden directly. Specific functionality</span>
+<span class="sd">        should be added in the do_fail method.</span>
+
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">_release_lock</span><span class="p">:</span>
+            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_state</span> <span class="o">!=</span> <span class="n">ResourceState</span><span class="o">.</span><span class="n">RELEASED</span><span class="p">:</span>
+                <span class="bp">self</span><span class="o">.</span><span class="n">do_fail</span><span class="p">()</span>
+</div>
+<div class="viewcode-block" id="ResourceManager.set"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.set">[docs]</a>    <span class="k">def</span> <span class="nf">set</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Set the value of the attribute</span>
+
+<span class="sd">        :param name: Name of the attribute</span>
+<span class="sd">        :type name: str</span>
+<span class="sd">        :param name: Value of the attribute</span>
+<span class="sd">        :type name: str</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">attr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_attrs</span><span class="p">[</span><span class="n">name</span><span class="p">]</span>
+        <span class="n">attr</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">value</span>
+        <span class="k">return</span> <span class="n">value</span>
+</div>
+<div class="viewcode-block" id="ResourceManager.get"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.get">[docs]</a>    <span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Returns the value of the attribute</span>
+
+<span class="sd">        :param name: Name of the attribute</span>
+<span class="sd">        :type name: str</span>
+<span class="sd">        :rtype: str</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">attr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_attrs</span><span class="p">[</span><span class="n">name</span><span class="p">]</span>
+
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        A.Q. Commenting due to performance impact</span>
+<span class="sd">        if attr.has_flag(Flags.Global):</span>
+<span class="sd">            self.warning( &quot;Attribute %s is global. Use get_global instead.&quot; % name)</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+            
+        <span class="k">return</span> <span class="n">attr</span><span class="o">.</span><span class="n">value</span>
+</div>
+<div class="viewcode-block" id="ResourceManager.has_changed"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.has_changed">[docs]</a>    <span class="k">def</span> <span class="nf">has_changed</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Returns the True is the value of the attribute</span>
+<span class="sd">            has been modified by the user.</span>
+
+<span class="sd">        :param name: Name of the attribute</span>
+<span class="sd">        :type name: str</span>
+<span class="sd">        :rtype: str</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">attr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_attrs</span><span class="p">[</span><span class="n">name</span><span class="p">]</span>
+        <span class="k">return</span> <span class="n">attr</span><span class="o">.</span><span class="n">has_changed</span>
+</div>
+<div class="viewcode-block" id="ResourceManager.has_flag"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.has_flag">[docs]</a>    <span class="k">def</span> <span class="nf">has_flag</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">flag</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Returns true if the attribute has the flag &#39;flag&#39;</span>
+
+<span class="sd">        :param flag: Flag to be checked</span>
+<span class="sd">        :type flag: Flags</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">attr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_attrs</span><span class="p">[</span><span class="n">name</span><span class="p">]</span>
+        <span class="k">return</span> <span class="n">attr</span><span class="o">.</span><span class="n">has_flag</span><span class="p">(</span><span class="n">flag</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="ResourceManager.has_attribute"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.has_attribute">[docs]</a>    <span class="k">def</span> <span class="nf">has_attribute</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Returns true if the RM has an attribute with name</span>
+
+<span class="sd">        :param name: name of the attribute</span>
+<span class="sd">        :type name: string</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_attrs</span>
+</div>
+<div class="viewcode-block" id="ResourceManager.enable_trace"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.enable_trace">[docs]</a>    <span class="k">def</span> <span class="nf">enable_trace</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Explicitly enable trace generation</span>
+
+<span class="sd">        :param name: Name of the trace</span>
+<span class="sd">        :type name: str</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">trace</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_trcs</span><span class="p">[</span><span class="n">name</span><span class="p">]</span>
+        <span class="n">trace</span><span class="o">.</span><span class="n">enabled</span> <span class="o">=</span> <span class="bp">True</span>
+    </div>
+<div class="viewcode-block" id="ResourceManager.trace_enabled"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.trace_enabled">[docs]</a>    <span class="k">def</span> <span class="nf">trace_enabled</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;Returns True if trace is enables </span>
+
+<span class="sd">        :param name: Name of the trace</span>
+<span class="sd">        :type name: str</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">trace</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_trcs</span><span class="p">[</span><span class="n">name</span><span class="p">]</span>
+        <span class="k">return</span> <span class="n">trace</span><span class="o">.</span><span class="n">enabled</span>
+ </div>
+<div class="viewcode-block" id="ResourceManager.trace"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.trace">[docs]</a>    <span class="k">def</span> <span class="nf">trace</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">attr</span> <span class="o">=</span> <span class="n">TraceAttr</span><span class="o">.</span><span class="n">ALL</span><span class="p">,</span> <span class="n">block</span> <span class="o">=</span> <span class="mi">512</span><span class="p">,</span> <span class="n">offset</span> <span class="o">=</span> <span class="mi">0</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Get information on collected trace</span>
+
+<span class="sd">        :param name: Name of the trace</span>
+<span class="sd">        :type name: str</span>
+
+<span class="sd">        :param attr: Can be one of:</span>
+<span class="sd">                         - TraceAttr.ALL (complete trace content), </span>
+<span class="sd">                         - TraceAttr.STREAM (block in bytes to read starting at offset), </span>
+<span class="sd">                         - TraceAttr.PATH (full path to the trace file),</span>
+<span class="sd">                         - TraceAttr.SIZE (size of trace file). </span>
+<span class="sd">        :type attr: str</span>
+
+<span class="sd">        :param block: Number of bytes to retrieve from trace, when attr is TraceAttr.STREAM </span>
+<span class="sd">        :type name: int</span>
+
+<span class="sd">        :param offset: Number of &#39;blocks&#39; to skip, when attr is TraceAttr.STREAM </span>
+<span class="sd">        :type name: int</span>
+
+<span class="sd">        :rtype: str</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">pass</span>
+</div>
+<div class="viewcode-block" id="ResourceManager.register_condition"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.register_condition">[docs]</a>    <span class="k">def</span> <span class="nf">register_condition</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">action</span><span class="p">,</span> <span class="n">group</span><span class="p">,</span> <span class="n">state</span><span class="p">,</span> <span class="n">time</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Registers a condition on the resource manager to allow execution </span>
+<span class="sd">        of &#39;action&#39; only after &#39;time&#39; has elapsed from the moment all resources </span>
+<span class="sd">        in &#39;group&#39; reached state &#39;state&#39;</span>
+
+<span class="sd">        :param action: Action to restrict to condition (either &#39;START&#39; or &#39;STOP&#39;)</span>
+<span class="sd">        :type action: str</span>
+<span class="sd">        :param group: Group of RMs to wait for (list of guids)</span>
+<span class="sd">        :type group: int or list of int</span>
+<span class="sd">        :param state: State to wait for on all RM in group. (either &#39;STARTED&#39;, &#39;STOPPED&#39; or &#39;READY&#39;)</span>
+<span class="sd">        :type state: str</span>
+<span class="sd">        :param time: Time to wait after &#39;state&#39; is reached on all RMs in group. (e.g. &#39;2s&#39;)</span>
+<span class="sd">        :type time: str</span>
+
+<span class="sd">        &quot;&quot;&quot;</span>
+
+        <span class="k">if</span> <span class="ow">not</span> <span class="n">action</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">conditions</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">_conditions</span><span class="p">[</span><span class="n">action</span><span class="p">]</span> <span class="o">=</span> <span class="nb">list</span><span class="p">()</span>
+        
+        <span class="n">conditions</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">conditions</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">action</span><span class="p">)</span>
+
+        <span class="c"># For each condition to register a tuple of (group, state, time) is </span>
+        <span class="c"># added to the &#39;action&#39; list</span>
+        <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">group</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
+            <span class="n">group</span> <span class="o">=</span> <span class="p">[</span><span class="n">group</span><span class="p">]</span>
+
+        <span class="n">conditions</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">group</span><span class="p">,</span> <span class="n">state</span><span class="p">,</span> <span class="n">time</span><span class="p">))</span>
+</div>
+<div class="viewcode-block" id="ResourceManager.unregister_condition"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.unregister_condition">[docs]</a>    <span class="k">def</span> <span class="nf">unregister_condition</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">group</span><span class="p">,</span> <span class="n">action</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Removed conditions for a certain group of guids</span>
+
+<span class="sd">        :param action: Action to restrict to condition (either &#39;START&#39;, &#39;STOP&#39; or &#39;READY&#39;)</span>
+<span class="sd">        :type action: str</span>
+
+<span class="sd">        :param group: Group of RMs to wait for (list of guids)</span>
+<span class="sd">        :type group: int or list of int</span>
+
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="c"># For each condition a tuple of (group, state, time) is </span>
+        <span class="c"># added to the &#39;action&#39; list</span>
+        <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">group</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
+            <span class="n">group</span> <span class="o">=</span> <span class="p">[</span><span class="n">group</span><span class="p">]</span>
+
+        <span class="k">for</span> <span class="n">act</span><span class="p">,</span> <span class="n">conditions</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">conditions</span><span class="o">.</span><span class="n">iteritems</span><span class="p">():</span>
+            <span class="k">if</span> <span class="n">action</span> <span class="ow">and</span> <span class="n">act</span> <span class="o">!=</span> <span class="n">action</span><span class="p">:</span>
+                <span class="k">continue</span>
+
+            <span class="k">for</span> <span class="n">condition</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">conditions</span><span class="p">):</span>
+                <span class="p">(</span><span class="n">grp</span><span class="p">,</span> <span class="n">state</span><span class="p">,</span> <span class="n">time</span><span class="p">)</span> <span class="o">=</span> <span class="n">condition</span>
+
+                <span class="c"># If there is an intersection between grp and group,</span>
+                <span class="c"># then remove intersected elements</span>
+                <span class="n">intsec</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">group</span><span class="p">)</span><span class="o">.</span><span class="n">intersection</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">grp</span><span class="p">))</span>
+                <span class="k">if</span> <span class="n">intsec</span><span class="p">:</span>
+                    <span class="n">idx</span> <span class="o">=</span> <span class="n">conditions</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">condition</span><span class="p">)</span>
+                    <span class="n">newgrp</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">grp</span><span class="p">)</span>
+                    <span class="n">newgrp</span><span class="o">.</span><span class="n">difference_update</span><span class="p">(</span><span class="n">intsec</span><span class="p">)</span>
+                    <span class="n">conditions</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">newgrp</span><span class="p">,</span> <span class="n">state</span><span class="p">,</span> <span class="n">time</span><span class="p">)</span>
+                 </div>
+<div class="viewcode-block" id="ResourceManager.get_connected"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.get_connected">[docs]</a>    <span class="k">def</span> <span class="nf">get_connected</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">rtype</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Returns the list of RM with the type &#39;rtype&#39;</span>
+
+<span class="sd">        :param rtype: Type of the RM we look for</span>
+<span class="sd">        :type rtype: str</span>
+<span class="sd">        :return: list of guid</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">connected</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="n">rclass</span> <span class="o">=</span> <span class="n">ResourceFactory</span><span class="o">.</span><span class="n">get_resource_type</span><span class="p">(</span><span class="n">rtype</span><span class="p">)</span>
+        <span class="k">for</span> <span class="n">guid</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">connections</span><span class="p">:</span>
+            <span class="n">rm</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ec</span><span class="o">.</span><span class="n">get_resource</span><span class="p">(</span><span class="n">guid</span><span class="p">)</span>
+            <span class="k">if</span> <span class="ow">not</span> <span class="n">rtype</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">rm</span><span class="p">,</span> <span class="n">rclass</span><span class="p">):</span>
+                <span class="n">connected</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">rm</span><span class="p">)</span>
+        <span class="k">return</span> <span class="n">connected</span>
+</div>
+<div class="viewcode-block" id="ResourceManager.is_rm_instance"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.is_rm_instance">[docs]</a>    <span class="k">def</span> <span class="nf">is_rm_instance</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">rtype</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Returns True if the RM is instance of &#39;rtype&#39;</span>
+
+<span class="sd">        :param rtype: Type of the RM we look for</span>
+<span class="sd">        :type rtype: str</span>
+<span class="sd">        :return: True|False</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">rclass</span> <span class="o">=</span> <span class="n">ResourceFactory</span><span class="o">.</span><span class="n">get_resource_type</span><span class="p">(</span><span class="n">rtype</span><span class="p">)</span>
+        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">rclass</span><span class="p">):</span>
+            <span class="k">return</span> <span class="bp">True</span>
+        <span class="k">return</span> <span class="bp">False</span>
+</div>
+    <span class="nd">@failtrap</span>
+    <span class="k">def</span> <span class="nf">_needs_reschedule</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">group</span><span class="p">,</span> <span class="n">state</span><span class="p">,</span> <span class="n">time</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Internal method that verify if &#39;time&#39; has elapsed since </span>
+<span class="sd">        all elements in &#39;group&#39; have reached state &#39;state&#39;.</span>
+
+<span class="sd">        :param group: Group of RMs to wait for (list of guids)</span>
+<span class="sd">        :type group: int or list of int</span>
+<span class="sd">        :param state: State to wait for on all RM in group. (either &#39;STARTED&#39;, &#39;STOPPED&#39; or &#39;READY&#39;)</span>
+<span class="sd">        :type state: str</span>
+<span class="sd">        :param time: Time to wait after &#39;state&#39; is reached on all RMs in group. (e.g. &#39;2s&#39;)</span>
+<span class="sd">        :type time: str</span>
+
+<span class="sd">        .. note : time should be written like &quot;2s&quot; or &quot;3m&quot; with s for seconds, m for minutes, h for hours, ...</span>
+<span class="sd">        If for example, you need to wait 2min 30sec, time could be &quot;150s&quot; or &quot;2.5m&quot;.</span>
+<span class="sd">        For the moment, 2m30s is not a correct syntax.</span>
+
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">reschedule</span> <span class="o">=</span> <span class="bp">False</span>
+        <span class="n">delay</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">reschedule_delay</span> 
+
+        <span class="c"># check state and time elapsed on all RMs</span>
+        <span class="k">for</span> <span class="n">guid</span> <span class="ow">in</span> <span class="n">group</span><span class="p">:</span>
+            <span class="n">rm</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ec</span><span class="o">.</span><span class="n">get_resource</span><span class="p">(</span><span class="n">guid</span><span class="p">)</span>
+            
+            <span class="c"># If one of the RMs this resource needs to wait for has FAILED</span>
+            <span class="c"># and is critical we raise an exception</span>
+            <span class="k">if</span> <span class="n">rm</span><span class="o">.</span><span class="n">state</span> <span class="o">==</span> <span class="n">ResourceState</span><span class="o">.</span><span class="n">FAILED</span><span class="p">:</span>
+                <span class="k">if</span> <span class="ow">not</span> <span class="n">rm</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;critical&#39;</span><span class="p">):</span>
+                    <span class="k">continue</span>
+                <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot;Resource can not wait for FAILED RM </span><span class="si">%d</span><span class="s">. Setting Resource to FAILED&quot;</span>
+                <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">,</span> <span class="n">msg</span>
+
+            <span class="c"># If the RM state is lower than the requested state we must</span>
+            <span class="c"># reschedule (e.g. if RM is READY but we required STARTED).</span>
+            <span class="k">if</span> <span class="n">rm</span><span class="o">.</span><span class="n">state</span> <span class="o">&lt;</span> <span class="n">state</span><span class="p">:</span>
+                <span class="n">reschedule</span> <span class="o">=</span> <span class="bp">True</span>
+                <span class="k">break</span>
+
+            <span class="c"># If there is a time restriction, we must verify the</span>
+            <span class="c"># restriction is satisfied </span>
+            <span class="k">if</span> <span class="n">time</span><span class="p">:</span>
+                <span class="k">if</span> <span class="n">state</span> <span class="o">==</span> <span class="n">ResourceState</span><span class="o">.</span><span class="n">DISCOVERED</span><span class="p">:</span>
+                    <span class="n">t</span> <span class="o">=</span> <span class="n">rm</span><span class="o">.</span><span class="n">discover_time</span>
+                <span class="k">elif</span> <span class="n">state</span> <span class="o">==</span> <span class="n">ResourceState</span><span class="o">.</span><span class="n">RESERVED</span><span class="p">:</span>
+                    <span class="n">t</span> <span class="o">=</span> <span class="n">rm</span><span class="o">.</span><span class="n">reserved_time</span>
+                <span class="k">elif</span> <span class="n">state</span> <span class="o">==</span> <span class="n">ResourceState</span><span class="o">.</span><span class="n">PROVISIONED</span><span class="p">:</span>
+                    <span class="n">t</span> <span class="o">=</span> <span class="n">rm</span><span class="o">.</span><span class="n">provision_time</span>
+                <span class="k">elif</span> <span class="n">state</span> <span class="o">==</span> <span class="n">ResourceState</span><span class="o">.</span><span class="n">READY</span><span class="p">:</span>
+                    <span class="n">t</span> <span class="o">=</span> <span class="n">rm</span><span class="o">.</span><span class="n">ready_time</span>
+                <span class="k">elif</span> <span class="n">state</span> <span class="o">==</span> <span class="n">ResourceState</span><span class="o">.</span><span class="n">STARTED</span><span class="p">:</span>
+                    <span class="n">t</span> <span class="o">=</span> <span class="n">rm</span><span class="o">.</span><span class="n">start_time</span>
+                <span class="k">elif</span> <span class="n">state</span> <span class="o">==</span> <span class="n">ResourceState</span><span class="o">.</span><span class="n">STOPPED</span><span class="p">:</span>
+                    <span class="n">t</span> <span class="o">=</span> <span class="n">rm</span><span class="o">.</span><span class="n">stop_time</span>
+                <span class="k">elif</span> <span class="n">state</span> <span class="o">==</span> <span class="n">ResourceState</span><span class="o">.</span><span class="n">RELEASED</span><span class="p">:</span>
+                    <span class="n">t</span> <span class="o">=</span> <span class="n">rm</span><span class="o">.</span><span class="n">release_time</span>
+                <span class="k">else</span><span class="p">:</span>
+                    <span class="k">break</span>
+
+                <span class="c"># time already elapsed since RM changed state</span>
+                <span class="n">waited</span> <span class="o">=</span> <span class="s">&quot;</span><span class="si">%f</span><span class="s">s&quot;</span> <span class="o">%</span> <span class="n">tdiffsec</span><span class="p">(</span><span class="n">tnow</span><span class="p">(),</span> <span class="n">t</span><span class="p">)</span>
+
+                <span class="c"># time still to wait</span>
+                <span class="n">wait</span> <span class="o">=</span> <span class="n">tdiffsec</span><span class="p">(</span><span class="n">stabsformat</span><span class="p">(</span><span class="n">time</span><span class="p">),</span> <span class="n">stabsformat</span><span class="p">(</span><span class="n">waited</span><span class="p">))</span>
+
+                <span class="k">if</span> <span class="n">wait</span> <span class="o">&gt;</span> <span class="mf">0.001</span><span class="p">:</span>
+                    <span class="n">reschedule</span> <span class="o">=</span> <span class="bp">True</span>
+                    <span class="n">delay</span> <span class="o">=</span> <span class="s">&quot;</span><span class="si">%f</span><span class="s">s&quot;</span> <span class="o">%</span> <span class="n">wait</span>
+                    <span class="k">break</span>
+
+        <span class="k">return</span> <span class="n">reschedule</span><span class="p">,</span> <span class="n">delay</span>
+
+<div class="viewcode-block" id="ResourceManager.set_with_conditions"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.set_with_conditions">[docs]</a>    <span class="k">def</span> <span class="nf">set_with_conditions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">group</span><span class="p">,</span> <span class="n">state</span><span class="p">,</span> <span class="n">time</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Set value &#39;value&#39; on attribute with name &#39;name&#39; when &#39;time&#39; </span>
+<span class="sd">        has elapsed since all elements in &#39;group&#39; have reached state</span>
+<span class="sd">        &#39;state&#39;</span>
+
+<span class="sd">        :param name: Name of the attribute to set</span>
+<span class="sd">        :type name: str</span>
+<span class="sd">        :param name: Value of the attribute to set</span>
+<span class="sd">        :type name: str</span>
+<span class="sd">        :param group: Group of RMs to wait for (list of guids)</span>
+<span class="sd">        :type group: int or list of int</span>
+<span class="sd">        :param state: State to wait for on all RM in group. (either &#39;STARTED&#39;, &#39;STOPPED&#39; or &#39;READY&#39;)</span>
+<span class="sd">        :type state: str</span>
+<span class="sd">        :param time: Time to wait after &#39;state&#39; is reached on all RMs in group. (e.g. &#39;2s&#39;)</span>
+<span class="sd">        :type time: str</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+
+        <span class="n">reschedule</span> <span class="o">=</span> <span class="bp">False</span>
+        <span class="n">delay</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">reschedule_delay</span> 
+
+        <span class="c">## evaluate if set conditions are met</span>
+
+        <span class="c"># only can set with conditions after the RM is started</span>
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">state</span> <span class="o">!=</span> <span class="n">ResourceState</span><span class="o">.</span><span class="n">STARTED</span><span class="p">:</span>
+            <span class="n">reschedule</span> <span class="o">=</span> <span class="bp">True</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="n">reschedule</span><span class="p">,</span> <span class="n">delay</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_needs_reschedule</span><span class="p">(</span><span class="n">group</span><span class="p">,</span> <span class="n">state</span><span class="p">,</span> <span class="n">time</span><span class="p">)</span>
+
+        <span class="k">if</span> <span class="n">reschedule</span><span class="p">:</span>
+            <span class="n">callback</span> <span class="o">=</span> <span class="n">functools</span><span class="o">.</span><span class="n">partial</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">set_with_conditions</span><span class="p">,</span> 
+                    <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">group</span><span class="p">,</span> <span class="n">state</span><span class="p">,</span> <span class="n">time</span><span class="p">)</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">ec</span><span class="o">.</span><span class="n">schedule</span><span class="p">(</span><span class="n">delay</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="ResourceManager.start_with_conditions"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.start_with_conditions">[docs]</a>    <span class="k">def</span> <span class="nf">start_with_conditions</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Starts RM when all the conditions in self.conditions for</span>
+<span class="sd">        action &#39;START&#39; are satisfied.</span>
+
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="c">#import pdb;pdb.set_trace()</span>
+
+        <span class="n">reschedule</span> <span class="o">=</span> <span class="bp">False</span>
+        <span class="n">delay</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">reschedule_delay</span> 
+
+
+        <span class="c">## evaluate if conditions to start are met</span>
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">ec</span><span class="o">.</span><span class="n">abort</span><span class="p">:</span>
+            <span class="k">return</span> 
+
+        <span class="c"># Can only start when RM is either STOPPED or READY</span>
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">state</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="n">ResourceState</span><span class="o">.</span><span class="n">STOPPED</span><span class="p">,</span> <span class="n">ResourceState</span><span class="o">.</span><span class="n">READY</span><span class="p">]:</span>
+            <span class="n">reschedule</span> <span class="o">=</span> <span class="bp">True</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;---- RESCHEDULING START ---- state </span><span class="si">%s</span><span class="s"> &quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">state</span> <span class="p">)</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="n">start_conditions</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">conditions</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">ResourceAction</span><span class="o">.</span><span class="n">START</span><span class="p">,</span> <span class="p">[])</span>
+            
+            <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;---- START CONDITIONS ---- </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">start_conditions</span><span class="p">)</span> 
+            
+            <span class="c"># Verify all start conditions are met</span>
+            <span class="k">for</span> <span class="p">(</span><span class="n">group</span><span class="p">,</span> <span class="n">state</span><span class="p">,</span> <span class="n">time</span><span class="p">)</span> <span class="ow">in</span> <span class="n">start_conditions</span><span class="p">:</span>
+                <span class="c"># Uncomment for debug</span>
+                <span class="c">#unmet = []</span>
+                <span class="c">#for guid in group:</span>
+                <span class="c">#    rm = self.ec.get_resource(guid)</span>
+                <span class="c">#    unmet.append((guid, rm._state))</span>
+                <span class="c">#</span>
+                <span class="c">#self.debug(&quot;---- WAITED STATES ---- %s&quot; % unmet )</span>
+
+                <span class="n">reschedule</span><span class="p">,</span> <span class="n">delay</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_needs_reschedule</span><span class="p">(</span><span class="n">group</span><span class="p">,</span> <span class="n">state</span><span class="p">,</span> <span class="n">time</span><span class="p">)</span>
+                <span class="k">if</span> <span class="n">reschedule</span><span class="p">:</span>
+                    <span class="k">break</span>
+
+        <span class="k">if</span> <span class="n">reschedule</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">ec</span><span class="o">.</span><span class="n">schedule</span><span class="p">(</span><span class="n">delay</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">start_with_conditions</span><span class="p">)</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;----- STARTING ---- &quot;</span><span class="p">)</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
+</div>
+<div class="viewcode-block" id="ResourceManager.stop_with_conditions"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.stop_with_conditions">[docs]</a>    <span class="k">def</span> <span class="nf">stop_with_conditions</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Stops RM when all the conditions in self.conditions for</span>
+<span class="sd">        action &#39;STOP&#39; are satisfied.</span>
+
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">reschedule</span> <span class="o">=</span> <span class="bp">False</span>
+        <span class="n">delay</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">reschedule_delay</span> 
+
+        <span class="c">## evaluate if conditions to stop are met</span>
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">ec</span><span class="o">.</span><span class="n">abort</span><span class="p">:</span>
+            <span class="k">return</span> 
+
+        <span class="c"># only can stop when RM is STARTED</span>
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">state</span> <span class="o">!=</span> <span class="n">ResourceState</span><span class="o">.</span><span class="n">STARTED</span><span class="p">:</span>
+            <span class="n">reschedule</span> <span class="o">=</span> <span class="bp">True</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;---- RESCHEDULING STOP ---- state </span><span class="si">%s</span><span class="s"> &quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">state</span> <span class="p">)</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot; ---- STOP CONDITIONS ---- </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> 
+                    <span class="bp">self</span><span class="o">.</span><span class="n">conditions</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">ResourceAction</span><span class="o">.</span><span class="n">STOP</span><span class="p">))</span>
+
+            <span class="n">stop_conditions</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">conditions</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">ResourceAction</span><span class="o">.</span><span class="n">STOP</span><span class="p">,</span> <span class="p">[])</span> 
+            <span class="k">for</span> <span class="p">(</span><span class="n">group</span><span class="p">,</span> <span class="n">state</span><span class="p">,</span> <span class="n">time</span><span class="p">)</span> <span class="ow">in</span> <span class="n">stop_conditions</span><span class="p">:</span>
+                <span class="n">reschedule</span><span class="p">,</span> <span class="n">delay</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_needs_reschedule</span><span class="p">(</span><span class="n">group</span><span class="p">,</span> <span class="n">state</span><span class="p">,</span> <span class="n">time</span><span class="p">)</span>
+                <span class="k">if</span> <span class="n">reschedule</span><span class="p">:</span>
+                    <span class="k">break</span>
+
+        <span class="k">if</span> <span class="n">reschedule</span><span class="p">:</span>
+            <span class="n">callback</span> <span class="o">=</span> <span class="n">functools</span><span class="o">.</span><span class="n">partial</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">stop_with_conditions</span><span class="p">)</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">ec</span><span class="o">.</span><span class="n">schedule</span><span class="p">(</span><span class="n">delay</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot; ----- STOPPING ---- &quot;</span><span class="p">)</span> 
+            <span class="bp">self</span><span class="o">.</span><span class="n">stop</span><span class="p">()</span>
+</div>
+<div class="viewcode-block" id="ResourceManager.deploy_with_conditions"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.deploy_with_conditions">[docs]</a>    <span class="k">def</span> <span class="nf">deploy_with_conditions</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Deploy RM when all the conditions in self.conditions for</span>
+<span class="sd">        action &#39;READY&#39; are satisfied.</span>
+
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">reschedule</span> <span class="o">=</span> <span class="bp">False</span>
+        <span class="n">delay</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">reschedule_delay</span> 
+
+        <span class="c">## evaluate if conditions to deploy are met</span>
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">ec</span><span class="o">.</span><span class="n">abort</span><span class="p">:</span>
+            <span class="k">return</span> 
+
+        <span class="c"># only can deploy when RM is either NEW, DISCOVERED or PROVISIONED </span>
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">state</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="n">ResourceState</span><span class="o">.</span><span class="n">NEW</span><span class="p">,</span> <span class="n">ResourceState</span><span class="o">.</span><span class="n">DISCOVERED</span><span class="p">,</span>
+                <span class="n">ResourceState</span><span class="o">.</span><span class="n">RESERVED</span><span class="p">,</span> <span class="n">ResourceState</span><span class="o">.</span><span class="n">PROVISIONED</span><span class="p">]:</span>
+            <span class="c">#### XXX: A.Q. IT SHOULD FAIL IF DEPLOY IS CALLED IN OTHER STATES!</span>
+            <span class="n">reschedule</span> <span class="o">=</span> <span class="bp">True</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;---- RESCHEDULING DEPLOY ---- state </span><span class="si">%s</span><span class="s"> &quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">state</span> <span class="p">)</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="n">deploy_conditions</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">conditions</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">ResourceAction</span><span class="o">.</span><span class="n">DEPLOY</span><span class="p">,</span> <span class="p">[])</span>
+            
+            <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;---- DEPLOY CONDITIONS ---- </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">deploy_conditions</span><span class="p">)</span> 
+            
+            <span class="c"># Verify all start conditions are met</span>
+            <span class="k">for</span> <span class="p">(</span><span class="n">group</span><span class="p">,</span> <span class="n">state</span><span class="p">,</span> <span class="n">time</span><span class="p">)</span> <span class="ow">in</span> <span class="n">deploy_conditions</span><span class="p">:</span>
+                <span class="c"># Uncomment for debug</span>
+                <span class="c">#unmet = []</span>
+                <span class="c">#for guid in group:</span>
+                <span class="c">#    rm = self.ec.get_resource(guid)</span>
+                <span class="c">#    unmet.append((guid, rm._state))</span>
+                
+                <span class="c">#self.debug(&quot;---- WAITED STATES ---- %s&quot; % unmet )</span>
+
+                <span class="n">reschedule</span><span class="p">,</span> <span class="n">delay</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_needs_reschedule</span><span class="p">(</span><span class="n">group</span><span class="p">,</span> <span class="n">state</span><span class="p">,</span> <span class="n">time</span><span class="p">)</span>
+                <span class="k">if</span> <span class="n">reschedule</span><span class="p">:</span>
+                    <span class="k">break</span>
+
+        <span class="k">if</span> <span class="n">reschedule</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">ec</span><span class="o">.</span><span class="n">schedule</span><span class="p">(</span><span class="n">delay</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">deploy_with_conditions</span><span class="p">)</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;----- DEPLOYING ---- &quot;</span><span class="p">)</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">deploy</span><span class="p">()</span>
+</div>
+<div class="viewcode-block" id="ResourceManager.do_connect"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.do_connect">[docs]</a>    <span class="k">def</span> <span class="nf">do_connect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">guid</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Performs actions that need to be taken upon associating RMs.</span>
+<span class="sd">        This method should be redefined when necessary in child classes.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">pass</span>
+</div>
+<div class="viewcode-block" id="ResourceManager.do_disconnect"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.do_disconnect">[docs]</a>    <span class="k">def</span> <span class="nf">do_disconnect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">guid</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Performs actions that need to be taken upon disassociating RMs.</span>
+<span class="sd">        This method should be redefined when necessary in child classes.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">pass</span>
+</div>
+<div class="viewcode-block" id="ResourceManager.valid_connection"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.valid_connection">[docs]</a>    <span class="k">def</span> <span class="nf">valid_connection</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">guid</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;Checks whether a connection with the other RM</span>
+<span class="sd">        is valid.</span>
+<span class="sd">        This method need to be redefined by each new Resource Manager.</span>
+
+<span class="sd">        :param guid: Guid of the current Resource Manager</span>
+<span class="sd">        :type guid: int</span>
+<span class="sd">        :rtype:  Boolean</span>
+
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="c"># TODO: Validate!</span>
+        <span class="k">return</span> <span class="bp">True</span>
+</div>
+<div class="viewcode-block" id="ResourceManager.do_discover"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.do_discover">[docs]</a>    <span class="k">def</span> <span class="nf">do_discover</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">set_discovered</span><span class="p">()</span>
+</div>
+<div class="viewcode-block" id="ResourceManager.do_reserve"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.do_reserve">[docs]</a>    <span class="k">def</span> <span class="nf">do_reserve</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">set_reserved</span><span class="p">()</span>
+</div>
+<div class="viewcode-block" id="ResourceManager.do_provision"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.do_provision">[docs]</a>    <span class="k">def</span> <span class="nf">do_provision</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">set_provisioned</span><span class="p">()</span>
+</div>
+<div class="viewcode-block" id="ResourceManager.do_configure"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.do_configure">[docs]</a>    <span class="k">def</span> <span class="nf">do_configure</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">pass</span>
+</div>
+<div class="viewcode-block" id="ResourceManager.do_start"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.do_start">[docs]</a>    <span class="k">def</span> <span class="nf">do_start</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">set_started</span><span class="p">()</span>
+</div>
+<div class="viewcode-block" id="ResourceManager.do_stop"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.do_stop">[docs]</a>    <span class="k">def</span> <span class="nf">do_stop</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">set_stopped</span><span class="p">()</span>
+</div>
+<div class="viewcode-block" id="ResourceManager.do_deploy"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.do_deploy">[docs]</a>    <span class="k">def</span> <span class="nf">do_deploy</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">set_ready</span><span class="p">()</span>
+</div>
+<div class="viewcode-block" id="ResourceManager.do_release"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.do_release">[docs]</a>    <span class="k">def</span> <span class="nf">do_release</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">set_released</span><span class="p">()</span>
+</div>
+<div class="viewcode-block" id="ResourceManager.do_fail"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.do_fail">[docs]</a>    <span class="k">def</span> <span class="nf">do_fail</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">set_failed</span><span class="p">()</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">ec</span><span class="o">.</span><span class="n">inform_failure</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">guid</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="ResourceManager.set_started"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.set_started">[docs]</a>    <span class="k">def</span> <span class="nf">set_started</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">time</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Mark ResourceManager as STARTED &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">set_state</span><span class="p">(</span><span class="n">ResourceState</span><span class="o">.</span><span class="n">STARTED</span><span class="p">,</span> <span class="s">&quot;_start_time&quot;</span><span class="p">,</span> <span class="n">time</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;----- STARTED ---- &quot;</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="ResourceManager.set_stopped"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.set_stopped">[docs]</a>    <span class="k">def</span> <span class="nf">set_stopped</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">time</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Mark ResourceManager as STOPPED &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">set_state</span><span class="p">(</span><span class="n">ResourceState</span><span class="o">.</span><span class="n">STOPPED</span><span class="p">,</span> <span class="s">&quot;_stop_time&quot;</span><span class="p">,</span> <span class="n">time</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;----- STOPPED ---- &quot;</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="ResourceManager.set_ready"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.set_ready">[docs]</a>    <span class="k">def</span> <span class="nf">set_ready</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">time</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Mark ResourceManager as READY &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">set_state</span><span class="p">(</span><span class="n">ResourceState</span><span class="o">.</span><span class="n">READY</span><span class="p">,</span> <span class="s">&quot;_ready_time&quot;</span><span class="p">,</span> <span class="n">time</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;----- READY ---- &quot;</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="ResourceManager.set_released"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.set_released">[docs]</a>    <span class="k">def</span> <span class="nf">set_released</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">time</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Mark ResourceManager as REALEASED &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">set_state</span><span class="p">(</span><span class="n">ResourceState</span><span class="o">.</span><span class="n">RELEASED</span><span class="p">,</span> <span class="s">&quot;_release_time&quot;</span><span class="p">,</span> <span class="n">time</span><span class="p">)</span>
+
+        <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot; </span><span class="si">%s</span><span class="s"> guid </span><span class="si">%d</span><span class="s"> ----- RELEASED ----- &quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_rtype</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">guid</span><span class="p">)</span>
+        <span class="n">logger</span> <span class="o">=</span> <span class="n">Logger</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_rtype</span><span class="p">)</span>
+        <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="ResourceManager.set_failed"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.set_failed">[docs]</a>    <span class="k">def</span> <span class="nf">set_failed</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">time</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Mark ResourceManager as FAILED &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">set_state</span><span class="p">(</span><span class="n">ResourceState</span><span class="o">.</span><span class="n">FAILED</span><span class="p">,</span> <span class="s">&quot;_failed_time&quot;</span><span class="p">,</span> <span class="n">time</span><span class="p">)</span>
+
+        <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot; </span><span class="si">%s</span><span class="s"> guid </span><span class="si">%d</span><span class="s"> ----- FAILED ----- &quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_rtype</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">guid</span><span class="p">)</span>
+        <span class="n">logger</span> <span class="o">=</span> <span class="n">Logger</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_rtype</span><span class="p">)</span>
+        <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="ResourceManager.set_discovered"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.set_discovered">[docs]</a>    <span class="k">def</span> <span class="nf">set_discovered</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">time</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Mark ResourceManager as DISCOVERED &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">set_state</span><span class="p">(</span><span class="n">ResourceState</span><span class="o">.</span><span class="n">DISCOVERED</span><span class="p">,</span> <span class="s">&quot;_discover_time&quot;</span><span class="p">,</span> <span class="n">time</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;----- DISCOVERED ---- &quot;</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="ResourceManager.set_reserved"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.set_reserved">[docs]</a>    <span class="k">def</span> <span class="nf">set_reserved</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">time</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Mark ResourceManager as RESERVED &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">set_state</span><span class="p">(</span><span class="n">ResourceState</span><span class="o">.</span><span class="n">RESERVED</span><span class="p">,</span> <span class="s">&quot;_reserved_time&quot;</span><span class="p">,</span> <span class="n">time</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;----- RESERVED ---- &quot;</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="ResourceManager.set_provisioned"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.set_provisioned">[docs]</a>    <span class="k">def</span> <span class="nf">set_provisioned</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">time</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Mark ResourceManager as PROVISIONED &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">set_state</span><span class="p">(</span><span class="n">ResourceState</span><span class="o">.</span><span class="n">PROVISIONED</span><span class="p">,</span> <span class="s">&quot;_provision_time&quot;</span><span class="p">,</span> <span class="n">time</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;----- PROVISIONED ---- &quot;</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="ResourceManager.set_state"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.set_state">[docs]</a>    <span class="k">def</span> <span class="nf">set_state</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">state</span><span class="p">,</span> <span class="n">state_time_attr</span><span class="p">,</span> <span class="n">time</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Set the state of the RM while keeping a trace of the time &quot;&quot;&quot;</span>
+
+        <span class="c"># Ensure that RM state will not change after released</span>
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_state</span> <span class="o">==</span> <span class="n">ResourceState</span><span class="o">.</span><span class="n">RELEASED</span><span class="p">:</span>
+            <span class="k">return</span> 
+
+        <span class="n">time</span> <span class="o">=</span> <span class="n">time</span> <span class="ow">or</span> <span class="n">tnow</span><span class="p">()</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">set_state_time</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">state_time_attr</span><span class="p">,</span> <span class="n">time</span><span class="p">)</span>
+  </div>
+<div class="viewcode-block" id="ResourceManager.set_state_time"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceManager.set_state_time">[docs]</a>    <span class="k">def</span> <span class="nf">set_state_time</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">state</span><span class="p">,</span> <span class="n">state_time_attr</span><span class="p">,</span> <span class="n">time</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Set the time for the RM state change &quot;&quot;&quot;</span>
+        <span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">state_time_attr</span><span class="p">,</span> <span class="n">time</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_state</span> <span class="o">=</span> <span class="n">state</span>
+</div></div>
+<div class="viewcode-block" id="ResourceFactory"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceFactory">[docs]</a><span class="k">class</span> <span class="nc">ResourceFactory</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+    <span class="n">_resource_types</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>
+
+    <span class="nd">@classmethod</span>
+<div class="viewcode-block" id="ResourceFactory.resource_types"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceFactory.resource_types">[docs]</a>    <span class="k">def</span> <span class="nf">resource_types</span><span class="p">(</span><span class="n">cls</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;Return the type of the Class&quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="n">cls</span><span class="o">.</span><span class="n">_resource_types</span>
+</div>
+    <span class="nd">@classmethod</span>
+<div class="viewcode-block" id="ResourceFactory.get_resource_type"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceFactory.get_resource_type">[docs]</a>    <span class="k">def</span> <span class="nf">get_resource_type</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">rtype</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;Return the type of the Class&quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="n">cls</span><span class="o">.</span><span class="n">_resource_types</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">rtype</span><span class="p">)</span>
+</div>
+    <span class="nd">@classmethod</span>
+<div class="viewcode-block" id="ResourceFactory.register_type"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceFactory.register_type">[docs]</a>    <span class="k">def</span> <span class="nf">register_type</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">rclass</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;Register a new Ressource Manager&quot;&quot;&quot;</span>
+        <span class="n">cls</span><span class="o">.</span><span class="n">_resource_types</span><span class="p">[</span><span class="n">rclass</span><span class="o">.</span><span class="n">get_rtype</span><span class="p">()]</span> <span class="o">=</span> <span class="n">rclass</span>
+</div>
+    <span class="nd">@classmethod</span>
+<div class="viewcode-block" id="ResourceFactory.create"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.ResourceFactory.create">[docs]</a>    <span class="k">def</span> <span class="nf">create</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">rtype</span><span class="p">,</span> <span class="n">ec</span><span class="p">,</span> <span class="n">guid</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;Create a new instance of a Ressource Manager&quot;&quot;&quot;</span>
+        <span class="n">rclass</span> <span class="o">=</span> <span class="n">cls</span><span class="o">.</span><span class="n">_resource_types</span><span class="p">[</span><span class="n">rtype</span><span class="p">]</span>
+        <span class="k">return</span> <span class="n">rclass</span><span class="p">(</span><span class="n">ec</span><span class="p">,</span> <span class="n">guid</span><span class="p">)</span>
+</div></div>
+<div class="viewcode-block" id="populate_factory"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.populate_factory">[docs]</a><span class="k">def</span> <span class="nf">populate_factory</span><span class="p">():</span>
+    <span class="sd">&quot;&quot;&quot;Find and rgister all available RMs</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="c"># Once the factory is populated, don&#39;t repopulate</span>
+    <span class="k">if</span> <span class="ow">not</span> <span class="n">ResourceFactory</span><span class="o">.</span><span class="n">resource_types</span><span class="p">():</span>
+        <span class="k">for</span> <span class="n">rclass</span> <span class="ow">in</span> <span class="n">find_types</span><span class="p">():</span>
+            <span class="n">ResourceFactory</span><span class="o">.</span><span class="n">register_type</span><span class="p">(</span><span class="n">rclass</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="find_types"><a class="viewcode-back" href="../../../_layout/nepi.execution.html#nepi.execution.resource.find_types">[docs]</a><span class="k">def</span> <span class="nf">find_types</span><span class="p">():</span>
+    <span class="sd">&quot;&quot;&quot;Look into the different folders to find all the </span>
+<span class="sd">    availables Resources Managers</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="n">search_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;NEPI_SEARCH_PATH&quot;</span><span class="p">,</span> <span class="s">&quot;&quot;</span><span class="p">)</span>
+    <span class="n">search_path</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">search_path</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&quot; &quot;</span><span class="p">))</span>
+   
+    <span class="kn">import</span> <span class="nn">inspect</span>
+    <span class="kn">import</span> <span class="nn">nepi.resources</span> 
+    <span class="n">path</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">dirname</span><span class="p">(</span><span class="n">nepi</span><span class="o">.</span><span class="n">resources</span><span class="o">.</span><span class="n">__file__</span><span class="p">)</span>
+    <span class="n">search_path</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
+
+    <span class="n">types</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
+
+    <span class="k">for</span> <span class="n">importer</span><span class="p">,</span> <span class="n">modname</span><span class="p">,</span> <span class="n">ispkg</span> <span class="ow">in</span> <span class="n">pkgutil</span><span class="o">.</span><span class="n">walk_packages</span><span class="p">(</span><span class="n">search_path</span><span class="p">,</span> 
+            <span class="n">prefix</span> <span class="o">=</span> <span class="s">&quot;nepi.resources.&quot;</span><span class="p">):</span>
+
+        <span class="n">loader</span> <span class="o">=</span> <span class="n">importer</span><span class="o">.</span><span class="n">find_module</span><span class="p">(</span><span class="n">modname</span><span class="p">)</span>
+        
+        <span class="k">try</span><span class="p">:</span>
+            <span class="c"># Notice: Repeated calls to load_module will act as a reload of the module</span>
+            <span class="k">if</span> <span class="n">modname</span> <span class="ow">in</span> <span class="n">sys</span><span class="o">.</span><span class="n">modules</span><span class="p">:</span>
+                <span class="n">module</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">modules</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">modname</span><span class="p">)</span>
+            <span class="k">else</span><span class="p">:</span>
+                <span class="n">module</span> <span class="o">=</span> <span class="n">loader</span><span class="o">.</span><span class="n">load_module</span><span class="p">(</span><span class="n">modname</span><span class="p">)</span>
+
+            <span class="k">for</span> <span class="n">attrname</span> <span class="ow">in</span> <span class="nb">dir</span><span class="p">(</span><span class="n">module</span><span class="p">):</span>
+                <span class="k">if</span> <span class="n">attrname</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">&quot;_&quot;</span><span class="p">):</span>
+                    <span class="k">continue</span>
+
+                <span class="n">attr</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">module</span><span class="p">,</span> <span class="n">attrname</span><span class="p">)</span>
+
+                <span class="k">if</span> <span class="n">attr</span> <span class="o">==</span> <span class="n">ResourceManager</span><span class="p">:</span>
+                    <span class="k">continue</span>
+
+                <span class="k">if</span> <span class="ow">not</span> <span class="n">inspect</span><span class="o">.</span><span class="n">isclass</span><span class="p">(</span><span class="n">attr</span><span class="p">):</span>
+                    <span class="k">continue</span>
+
+                <span class="k">if</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">attr</span><span class="p">,</span> <span class="n">ResourceManager</span><span class="p">):</span>
+                    <span class="n">types</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">attr</span><span class="p">)</span>
+
+                    <span class="k">if</span> <span class="ow">not</span> <span class="n">modname</span> <span class="ow">in</span> <span class="n">sys</span><span class="o">.</span><span class="n">modules</span><span class="p">:</span>
+                        <span class="n">sys</span><span class="o">.</span><span class="n">modules</span><span class="p">[</span><span class="n">modname</span><span class="p">]</span> <span class="o">=</span> <span class="n">module</span>
+
+        <span class="k">except</span><span class="p">:</span>
+            <span class="kn">import</span> <span class="nn">traceback</span>
+            <span class="kn">import</span> <span class="nn">logging</span>
+            <span class="n">err</span> <span class="o">=</span> <span class="n">traceback</span><span class="o">.</span><span class="n">format_exc</span><span class="p">()</span>
+            <span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="s">&quot;Resource.find_types()&quot;</span><span class="p">)</span>
+            <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s">&quot;Error while loading Resource Managers </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">err</span><span class="p">)</span>
+
+    <span class="k">return</span> <span class="n">types</span>
+</pre></div></div>
+
+          </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="../../../genindex.html" title="General Index"
+             >index</a></li>
+        <li class="right" >
+          <a href="../../../py-modindex.html" title="Python Module Index"
+             >modules</a> |</li>
+        <li><a href="../../../index.html">NEPI 3.0 documentation</a> &raquo;</li>
+          <li><a href="../../index.html" >Module code</a> &raquo;</li> 
+      </ul>
+    </div>
+    <div class="footer">
+        &copy; Copyright 2014, Alina Quereilhac, Lucia Guevgeozian Odizzio, Julien Tribino.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
+    </div>
+  </body>
+</html>
\ No newline at end of file