add sphinx documentation
[nepi.git] / doc / sphinx / _build / html / _modules / nepi / resources / planetlab / plcapi.html
diff --git a/doc/sphinx/_build/html/_modules/nepi/resources/planetlab/plcapi.html b/doc/sphinx/_build/html/_modules/nepi/resources/planetlab/plcapi.html
new file mode 100644 (file)
index 0000000..0a560cb
--- /dev/null
@@ -0,0 +1,676 @@
+<!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.resources.planetlab.plcapi &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.resources.planetlab.plcapi</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">import</span> <span class="nn">functools</span>
+<span class="kn">import</span> <span class="nn">hashlib</span>
+<span class="kn">import</span> <span class="nn">socket</span>
+<span class="kn">import</span> <span class="nn">os</span>
+<span class="kn">import</span> <span class="nn">time</span>
+<span class="kn">import</span> <span class="nn">threading</span>
+<span class="kn">import</span> <span class="nn">xmlrpclib</span>
+
+<span class="k">def</span> <span class="nf">_retry</span><span class="p">(</span><span class="n">fn</span><span class="p">):</span>
+    <span class="k">def</span> <span class="nf">rv</span><span class="p">(</span><span class="o">*</span><span class="n">p</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
+        <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">5</span><span class="p">):</span>
+            <span class="k">try</span><span class="p">:</span>
+                <span class="k">return</span> <span class="n">fn</span><span class="p">(</span><span class="o">*</span><span class="n">p</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>
+            <span class="k">except</span> <span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">error</span><span class="p">,</span> <span class="ne">IOError</span><span class="p">,</span> <span class="ne">OSError</span><span class="p">):</span>
+                <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="n">x</span><span class="o">*</span><span class="mi">5</span><span class="o">+</span><span class="mi">5</span><span class="p">)</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="k">return</span> <span class="n">fn</span> <span class="p">(</span><span class="o">*</span><span class="n">p</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>
+    <span class="k">return</span> <span class="n">rv</span>
+
+<div class="viewcode-block" id="PLCAPI"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.plcapi.PLCAPI">[docs]</a><span class="k">class</span> <span class="nc">PLCAPI</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+
+    <span class="n">_expected_methods</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span>
+        <span class="p">[</span><span class="s">&#39;AddNodeTag&#39;</span><span class="p">,</span> <span class="s">&#39;AddConfFile&#39;</span><span class="p">,</span> <span class="s">&#39;DeletePersonTag&#39;</span><span class="p">,</span> <span class="s">&#39;AddNodeType&#39;</span><span class="p">,</span>
+         <span class="s">&#39;DeleteBootState&#39;</span><span class="p">,</span> <span class="s">&#39;SliceListNames&#39;</span><span class="p">,</span> <span class="s">&#39;DeleteKey&#39;</span><span class="p">,</span><span class="s">&#39;SliceGetTicket&#39;</span><span class="p">,</span> 
+         <span class="s">&#39;SliceUsersList&#39;</span><span class="p">,</span> <span class="s">&#39;SliceUpdate&#39;</span><span class="p">,</span> <span class="s">&#39;GetNodeGroups&#39;</span><span class="p">,</span> <span class="s">&#39;SliceCreate&#39;</span><span class="p">,</span> 
+         <span class="s">&#39;GetNetworkMethods&#39;</span><span class="p">,</span> <span class="s">&#39;GetNodeFlavour&#39;</span><span class="p">,</span> <span class="s">&#39;DeleteNode&#39;</span><span class="p">,</span> <span class="s">&#39;BootNotifyOwners&#39;</span><span class="p">,</span>
+         <span class="s">&#39;AddPersonKey&#39;</span><span class="p">,</span> <span class="s">&#39;AddNode&#39;</span><span class="p">,</span> <span class="s">&#39;UpdateNodeGroup&#39;</span><span class="p">,</span> <span class="s">&#39;GetAddressTypes&#39;</span><span class="p">,</span>
+         <span class="s">&#39;AddIlink&#39;</span><span class="p">,</span> <span class="s">&#39;DeleteNetworkType&#39;</span><span class="p">,</span> <span class="s">&#39;GetInitScripts&#39;</span><span class="p">,</span> <span class="s">&#39;GenerateNodeConfFile&#39;</span><span class="p">,</span>
+         <span class="s">&#39;AddSite&#39;</span><span class="p">,</span> <span class="s">&#39;BindObjectToPeer&#39;</span><span class="p">,</span> <span class="s">&#39;SliceListUserSlices&#39;</span><span class="p">,</span> <span class="s">&#39;GetPeers&#39;</span><span class="p">,</span>
+         <span class="s">&#39;AddPeer&#39;</span><span class="p">,</span> <span class="s">&#39;DeletePeer&#39;</span><span class="p">,</span> <span class="s">&#39;AddRole&#39;</span><span class="p">,</span> <span class="s">&#39;DeleteRole&#39;</span><span class="p">,</span> <span class="s">&#39;SetPersonPrimarySite&#39;</span><span class="p">,</span>
+         <span class="s">&#39;AddSiteAddress&#39;</span><span class="p">,</span> <span class="s">&#39;SliceDelete&#39;</span><span class="p">,</span> <span class="s">&#39;NotifyPersons&#39;</span><span class="p">,</span> <span class="s">&#39;GetKeyTypes&#39;</span><span class="p">,</span>
+         <span class="s">&#39;GetConfFiles&#39;</span><span class="p">,</span> <span class="s">&#39;GetIlinks&#39;</span><span class="p">,</span> <span class="s">&#39;AddTagType&#39;</span><span class="p">,</span> <span class="s">&#39;GetNodes&#39;</span><span class="p">,</span> <span class="s">&#39;DeleteNodeTag&#39;</span><span class="p">,</span>
+         <span class="s">&#39;DeleteSliceFromNodesWhitelist&#39;</span><span class="p">,</span> <span class="s">&#39;UpdateAddress&#39;</span><span class="p">,</span> <span class="s">&#39;ResetPassword&#39;</span><span class="p">,</span> 
+         <span class="s">&#39;AddSliceToNodesWhitelist&#39;</span><span class="p">,</span> <span class="s">&#39;AddRoleToTagType&#39;</span><span class="p">,</span> <span class="s">&#39;AddLeases&#39;</span><span class="p">,</span>
+         <span class="s">&#39;GetAddresses&#39;</span><span class="p">,</span> <span class="s">&#39;AddInitScript&#39;</span><span class="p">,</span> <span class="s">&#39;RebootNode&#39;</span><span class="p">,</span> <span class="s">&#39;GetPCUTypes&#39;</span><span class="p">,</span> 
+         <span class="s">&#39;RefreshPeer&#39;</span><span class="p">,</span> <span class="s">&#39;GetBootMedium&#39;</span><span class="p">,</span> <span class="s">&#39;UpdateKey&#39;</span><span class="p">,</span> <span class="s">&#39;UpdatePCU&#39;</span><span class="p">,</span> <span class="s">&#39;GetSession&#39;</span><span class="p">,</span>
+         <span class="s">&#39;AddInterfaceTag&#39;</span><span class="p">,</span> <span class="s">&#39;UpdatePCUType&#39;</span><span class="p">,</span> <span class="s">&#39;GetInterfaces&#39;</span><span class="p">,</span> <span class="s">&#39;SliceExtendedInfo&#39;</span><span class="p">,</span>
+         <span class="s">&#39;SliceNodesList&#39;</span><span class="p">,</span> <span class="s">&#39;DeleteRoleFromTagType&#39;</span><span class="p">,</span> <span class="s">&#39;DeleteSlice&#39;</span><span class="p">,</span> <span class="s">&#39;GetSites&#39;</span><span class="p">,</span>
+         <span class="s">&#39;DeleteMessage&#39;</span><span class="p">,</span> <span class="s">&#39;GetSliceFamily&#39;</span><span class="p">,</span> <span class="s">&#39;GetPlcRelease&#39;</span><span class="p">,</span> <span class="s">&#39;UpdateTagType&#39;</span><span class="p">,</span>
+         <span class="s">&#39;AddSliceInstantiation&#39;</span><span class="p">,</span> <span class="s">&#39;ResolveSlices&#39;</span><span class="p">,</span> <span class="s">&#39;GetSlices&#39;</span><span class="p">,</span>
+         <span class="s">&#39;DeleteRoleFromPerson&#39;</span><span class="p">,</span> <span class="s">&#39;GetSessions&#39;</span><span class="p">,</span> <span class="s">&#39;UpdatePeer&#39;</span><span class="p">,</span> <span class="s">&#39;VerifyPerson&#39;</span><span class="p">,</span>
+         <span class="s">&#39;GetPersonTags&#39;</span><span class="p">,</span> <span class="s">&#39;DeleteKeyType&#39;</span><span class="p">,</span> <span class="s">&#39;AddSlice&#39;</span><span class="p">,</span> <span class="s">&#39;SliceUserAdd&#39;</span><span class="p">,</span>
+         <span class="s">&#39;DeleteSession&#39;</span><span class="p">,</span> <span class="s">&#39;GetMessages&#39;</span><span class="p">,</span> <span class="s">&#39;DeletePCU&#39;</span><span class="p">,</span> <span class="s">&#39;GetPeerData&#39;</span><span class="p">,</span>
+         <span class="s">&#39;DeletePersonFromSite&#39;</span><span class="p">,</span> <span class="s">&#39;DeleteTagType&#39;</span><span class="p">,</span> <span class="s">&#39;GetPCUs&#39;</span><span class="p">,</span> <span class="s">&#39;UpdateLeases&#39;</span><span class="p">,</span>
+         <span class="s">&#39;AddMessage&#39;</span><span class="p">,</span> <span class="s">&#39;DeletePCUProtocolType&#39;</span><span class="p">,</span> <span class="s">&#39;DeleteInterfaceTag&#39;</span><span class="p">,</span>
+         <span class="s">&#39;AddPersonToSite&#39;</span><span class="p">,</span> <span class="s">&#39;GetSlivers&#39;</span><span class="p">,</span> <span class="s">&#39;SliceNodesDel&#39;</span><span class="p">,</span>
+         <span class="s">&#39;DeleteAddressTypeFromAddress&#39;</span><span class="p">,</span> <span class="s">&#39;AddNodeGroup&#39;</span><span class="p">,</span> <span class="s">&#39;GetSliceTags&#39;</span><span class="p">,</span>
+         <span class="s">&#39;DeleteSite&#39;</span><span class="p">,</span> <span class="s">&#39;GetSiteTags&#39;</span><span class="p">,</span> <span class="s">&#39;UpdateMessage&#39;</span><span class="p">,</span> <span class="s">&#39;DeleteSliceFromNodes&#39;</span><span class="p">,</span>
+         <span class="s">&#39;SliceRenew&#39;</span><span class="p">,</span> <span class="s">&#39;UpdatePCUProtocolType&#39;</span><span class="p">,</span> <span class="s">&#39;DeleteSiteTag&#39;</span><span class="p">,</span>
+         <span class="s">&#39;GetPCUProtocolTypes&#39;</span><span class="p">,</span> <span class="s">&#39;GetEvents&#39;</span><span class="p">,</span> <span class="s">&#39;GetSliceTicket&#39;</span><span class="p">,</span> <span class="s">&#39;AddPersonTag&#39;</span><span class="p">,</span>
+         <span class="s">&#39;BootGetNodeDetails&#39;</span><span class="p">,</span> <span class="s">&#39;DeleteInterface&#39;</span><span class="p">,</span> <span class="s">&#39;DeleteNodeGroup&#39;</span><span class="p">,</span>
+         <span class="s">&#39;AddPCUProtocolType&#39;</span><span class="p">,</span> <span class="s">&#39;BootCheckAuthentication&#39;</span><span class="p">,</span> <span class="s">&#39;AddSiteTag&#39;</span><span class="p">,</span>
+         <span class="s">&#39;AddAddressTypeToAddress&#39;</span><span class="p">,</span> <span class="s">&#39;DeleteConfFile&#39;</span><span class="p">,</span> <span class="s">&#39;DeleteInitScript&#39;</span><span class="p">,</span>
+         <span class="s">&#39;DeletePerson&#39;</span><span class="p">,</span> <span class="s">&#39;DeleteIlink&#39;</span><span class="p">,</span> <span class="s">&#39;DeleteAddressType&#39;</span><span class="p">,</span> <span class="s">&#39;AddBootState&#39;</span><span class="p">,</span>
+         <span class="s">&#39;AuthCheck&#39;</span><span class="p">,</span> <span class="s">&#39;NotifySupport&#39;</span><span class="p">,</span> <span class="s">&#39;GetSliceInstantiations&#39;</span><span class="p">,</span> <span class="s">&#39;AddPCUType&#39;</span><span class="p">,</span>
+         <span class="s">&#39;AddPCU&#39;</span><span class="p">,</span> <span class="s">&#39;AddSession&#39;</span><span class="p">,</span> <span class="s">&#39;GetEventObjects&#39;</span><span class="p">,</span> <span class="s">&#39;UpdateSiteTag&#39;</span><span class="p">,</span> 
+         <span class="s">&#39;UpdateNodeTag&#39;</span><span class="p">,</span> <span class="s">&#39;AddPerson&#39;</span><span class="p">,</span> <span class="s">&#39;BlacklistKey&#39;</span><span class="p">,</span> <span class="s">&#39;UpdateInitScript&#39;</span><span class="p">,</span>
+         <span class="s">&#39;AddSliceToNodes&#39;</span><span class="p">,</span> <span class="s">&#39;RebootNodeWithPCU&#39;</span><span class="p">,</span> <span class="s">&#39;GetNodeTags&#39;</span><span class="p">,</span> <span class="s">&#39;GetSliceKeys&#39;</span><span class="p">,</span>
+         <span class="s">&#39;GetSliceSshKeys&#39;</span><span class="p">,</span> <span class="s">&#39;AddNetworkMethod&#39;</span><span class="p">,</span> <span class="s">&#39;SliceNodesAdd&#39;</span><span class="p">,</span>
+         <span class="s">&#39;DeletePersonFromSlice&#39;</span><span class="p">,</span> <span class="s">&#39;ReportRunlevel&#39;</span><span class="p">,</span> <span class="s">&#39;GetNetworkTypes&#39;</span><span class="p">,</span>
+         <span class="s">&#39;UpdateSite&#39;</span><span class="p">,</span> <span class="s">&#39;DeleteConfFileFromNodeGroup&#39;</span><span class="p">,</span> <span class="s">&#39;UpdateNode&#39;</span><span class="p">,</span>
+         <span class="s">&#39;DeleteSliceInstantiation&#39;</span><span class="p">,</span> <span class="s">&#39;DeleteSliceTag&#39;</span><span class="p">,</span> <span class="s">&#39;BootUpdateNode&#39;</span><span class="p">,</span>
+         <span class="s">&#39;UpdatePerson&#39;</span><span class="p">,</span> <span class="s">&#39;UpdateConfFile&#39;</span><span class="p">,</span> <span class="s">&#39;SliceUserDel&#39;</span><span class="p">,</span> <span class="s">&#39;DeleteLeases&#39;</span><span class="p">,</span>
+         <span class="s">&#39;AddConfFileToNodeGroup&#39;</span><span class="p">,</span> <span class="s">&#39;UpdatePersonTag&#39;</span><span class="p">,</span> <span class="s">&#39;DeleteConfFileFromNode&#39;</span><span class="p">,</span>
+         <span class="s">&#39;AddPersonToSlice&#39;</span><span class="p">,</span> <span class="s">&#39;UnBindObjectFromPeer&#39;</span><span class="p">,</span> <span class="s">&#39;AddNodeToPCU&#39;</span><span class="p">,</span>
+         <span class="s">&#39;GetLeaseGranularity&#39;</span><span class="p">,</span> <span class="s">&#39;DeletePCUType&#39;</span><span class="p">,</span> <span class="s">&#39;GetTagTypes&#39;</span><span class="p">,</span> <span class="s">&#39;GetNodeTypes&#39;</span><span class="p">,</span>
+         <span class="s">&#39;UpdateInterfaceTag&#39;</span><span class="p">,</span> <span class="s">&#39;GetRoles&#39;</span><span class="p">,</span> <span class="s">&#39;UpdateSlice&#39;</span><span class="p">,</span> <span class="s">&#39;UpdateSliceTag&#39;</span><span class="p">,</span>
+         <span class="s">&#39;AddSliceTag&#39;</span><span class="p">,</span> <span class="s">&#39;AddNetworkType&#39;</span><span class="p">,</span> <span class="s">&#39;AddInterface&#39;</span><span class="p">,</span> <span class="s">&#39;AddAddressType&#39;</span><span class="p">,</span>
+         <span class="s">&#39;AddRoleToPerson&#39;</span><span class="p">,</span> <span class="s">&#39;DeleteNodeType&#39;</span><span class="p">,</span> <span class="s">&#39;GetLeases&#39;</span><span class="p">,</span> <span class="s">&#39;UpdateInterface&#39;</span><span class="p">,</span>
+         <span class="s">&#39;SliceInfo&#39;</span><span class="p">,</span> <span class="s">&#39;DeleteAddress&#39;</span><span class="p">,</span> <span class="s">&#39;SliceTicketGet&#39;</span><span class="p">,</span> <span class="s">&#39;GetPersons&#39;</span><span class="p">,</span>
+         <span class="s">&#39;GetWhitelist&#39;</span><span class="p">,</span> <span class="s">&#39;AddKeyType&#39;</span><span class="p">,</span> <span class="s">&#39;UpdateAddressType&#39;</span><span class="p">,</span> <span class="s">&#39;GetPeerName&#39;</span><span class="p">,</span>
+         <span class="s">&#39;DeleteNetworkMethod&#39;</span><span class="p">,</span> <span class="s">&#39;UpdateIlink&#39;</span><span class="p">,</span> <span class="s">&#39;AddConfFileToNode&#39;</span><span class="p">,</span> <span class="s">&#39;GetKeys&#39;</span><span class="p">,</span>
+         <span class="s">&#39;DeleteNodeFromPCU&#39;</span><span class="p">,</span> <span class="s">&#39;GetInterfaceTags&#39;</span><span class="p">,</span> <span class="s">&#39;GetBootStates&#39;</span><span class="p">,</span>
+         <span class="s">&#39;SetInterfaceSens&#39;</span><span class="p">,</span> <span class="s">&#39;SetNodeLoadm&#39;</span><span class="p">,</span> <span class="s">&#39;GetInterfaceRate&#39;</span><span class="p">,</span> <span class="s">&#39;GetNodeLoadw&#39;</span><span class="p">,</span>
+         <span class="s">&#39;SetInterfaceKey&#39;</span><span class="p">,</span> <span class="s">&#39;GetNodeSlices&#39;</span><span class="p">,</span> <span class="s">&#39;GetNodeLoadm&#39;</span><span class="p">,</span> <span class="s">&#39;SetSliceVref&#39;</span><span class="p">,</span>
+         <span class="s">&#39;GetInterfaceIwpriv&#39;</span><span class="p">,</span> <span class="s">&#39;SetNodeLoadw&#39;</span><span class="p">,</span> <span class="s">&#39;SetNodeSerial&#39;</span><span class="p">,</span>
+         <span class="s">&#39;GetNodePlainBootstrapfs&#39;</span><span class="p">,</span> <span class="s">&#39;SetNodeMEMw&#39;</span><span class="p">,</span> <span class="s">&#39;GetNodeResponse&#39;</span><span class="p">,</span>
+         <span class="s">&#39;SetInterfaceRate&#39;</span><span class="p">,</span> <span class="s">&#39;SetSliceInitscript&#39;</span><span class="p">,</span> <span class="s">&#39;SetNodeFcdistro&#39;</span><span class="p">,</span>
+         <span class="s">&#39;GetNodeLoady&#39;</span><span class="p">,</span> <span class="s">&#39;SetNodeArch&#39;</span><span class="p">,</span> <span class="s">&#39;SetNodeKargs&#39;</span><span class="p">,</span> <span class="s">&#39;SetNodeMEMm&#39;</span><span class="p">,</span>
+         <span class="s">&#39;SetNodeBWy&#39;</span><span class="p">,</span> <span class="s">&#39;SetNodeBWw&#39;</span><span class="p">,</span> <span class="s">&#39;SetInterfaceSecurityMode&#39;</span><span class="p">,</span> <span class="s">&#39;SetNodeBWm&#39;</span><span class="p">,</span>
+         <span class="s">&#39;SetNodeASType&#39;</span><span class="p">,</span> <span class="s">&#39;GetNodeKargs&#39;</span><span class="p">,</span> <span class="s">&#39;GetPersonColumnconf&#39;</span><span class="p">,</span>
+         <span class="s">&#39;GetNodeResponsem&#39;</span><span class="p">,</span> <span class="s">&#39;GetNodeCPUy&#39;</span><span class="p">,</span> <span class="s">&#39;GetNodeCramfs&#39;</span><span class="p">,</span> <span class="s">&#39;SetNodeSlicesw&#39;</span><span class="p">,</span>
+         <span class="s">&#39;SetPersonColumnconf&#39;</span><span class="p">,</span> <span class="s">&#39;SetNodeSlicesy&#39;</span><span class="p">,</span> <span class="s">&#39;GetNodeCPUw&#39;</span><span class="p">,</span> <span class="s">&#39;GetNodeBWy&#39;</span><span class="p">,</span> 
+         <span class="s">&#39;GetNodeCPUm&#39;</span><span class="p">,</span> <span class="s">&#39;GetInterfaceDriver&#39;</span><span class="p">,</span> <span class="s">&#39;GetNodeLoad&#39;</span><span class="p">,</span> <span class="s">&#39;GetInterfaceMode&#39;</span><span class="p">,</span>
+         <span class="s">&#39;GetNodeSerial&#39;</span><span class="p">,</span> <span class="s">&#39;SetNodeSlicesm&#39;</span><span class="p">,</span> <span class="s">&#39;SetNodeLoady&#39;</span><span class="p">,</span> <span class="s">&#39;GetNodeReliabilityw&#39;</span><span class="p">,</span>
+         <span class="s">&#39;SetSliceFcdistro&#39;</span><span class="p">,</span> <span class="s">&#39;GetNodeReliabilityy&#39;</span><span class="p">,</span> <span class="s">&#39;SetInterfaceEssid&#39;</span><span class="p">,</span>
+         <span class="s">&#39;SetSliceInitscriptCode&#39;</span><span class="p">,</span> <span class="s">&#39;GetNodeExtensions&#39;</span><span class="p">,</span> <span class="s">&#39;GetSliceOmfControl&#39;</span><span class="p">,</span>
+         <span class="s">&#39;SetNodeCity&#39;</span><span class="p">,</span> <span class="s">&#39;SetInterfaceIfname&#39;</span><span class="p">,</span> <span class="s">&#39;SetNodeHrn&#39;</span><span class="p">,</span> <span class="s">&#39;SetNodeNoHangcheck&#39;</span><span class="p">,</span> 
+         <span class="s">&#39;GetNodeNoHangcheck&#39;</span><span class="p">,</span> <span class="s">&#39;GetSliceFcdistro&#39;</span><span class="p">,</span> <span class="s">&#39;SetNodeCountry&#39;</span><span class="p">,</span>
+         <span class="s">&#39;SetNodeKvariant&#39;</span><span class="p">,</span> <span class="s">&#39;GetNodeKvariant&#39;</span><span class="p">,</span> <span class="s">&#39;GetNodeMEMy&#39;</span><span class="p">,</span> <span class="s">&#39;SetInterfaceIwpriv&#39;</span><span class="p">,</span>
+         <span class="s">&#39;GetNodeMEMw&#39;</span><span class="p">,</span> <span class="s">&#39;SetInterfaceBackdoor&#39;</span><span class="p">,</span> <span class="s">&#39;GetInterfaceFreq&#39;</span><span class="p">,</span>
+         <span class="s">&#39;SetInterfaceChannel&#39;</span><span class="p">,</span> <span class="s">&#39;SetInterfaceNw&#39;</span><span class="p">,</span> <span class="s">&#39;GetPersonShowconf&#39;</span><span class="p">,</span>
+         <span class="s">&#39;GetSliceInitscriptCode&#39;</span><span class="p">,</span> <span class="s">&#39;SetNodeMEM&#39;</span><span class="p">,</span> <span class="s">&#39;GetInterfaceEssid&#39;</span><span class="p">,</span> <span class="s">&#39;GetNodeMEMm&#39;</span><span class="p">,</span>
+         <span class="s">&#39;SetInterfaceMode&#39;</span><span class="p">,</span> <span class="s">&#39;SetInterfaceIwconfig&#39;</span><span class="p">,</span> <span class="s">&#39;GetNodeSlicesm&#39;</span><span class="p">,</span> <span class="s">&#39;GetNodeBWm&#39;</span><span class="p">,</span>
+         <span class="s">&#39;SetNodePlainBootstrapfs&#39;</span><span class="p">,</span> <span class="s">&#39;SetNodeRegion&#39;</span><span class="p">,</span> <span class="s">&#39;SetNodeCPU&#39;</span><span class="p">,</span> <span class="s">&#39;GetNodeSlicesw&#39;</span><span class="p">,</span>
+         <span class="s">&#39;SetNodeBW&#39;</span><span class="p">,</span> <span class="s">&#39;SetNodeSlices&#39;</span><span class="p">,</span> <span class="s">&#39;SetNodeCramfs&#39;</span><span class="p">,</span> <span class="s">&#39;GetNodeSlicesy&#39;</span><span class="p">,</span>
+         <span class="s">&#39;GetInterfaceKey&#39;</span><span class="p">,</span> <span class="s">&#39;GetSliceInitscript&#39;</span><span class="p">,</span> <span class="s">&#39;SetNodeCPUm&#39;</span><span class="p">,</span> <span class="s">&#39;SetSliceArch&#39;</span><span class="p">,</span>
+         <span class="s">&#39;SetNodeLoad&#39;</span><span class="p">,</span> <span class="s">&#39;SetNodeResponse&#39;</span><span class="p">,</span> <span class="s">&#39;GetSliceSliverHMAC&#39;</span><span class="p">,</span> <span class="s">&#39;GetNodeBWw&#39;</span><span class="p">,</span>
+         <span class="s">&#39;GetNodeRegion&#39;</span><span class="p">,</span> <span class="s">&#39;SetNodeMEMy&#39;</span><span class="p">,</span> <span class="s">&#39;GetNodeASType&#39;</span><span class="p">,</span> <span class="s">&#39;SetNodePldistro&#39;</span><span class="p">,</span>
+         <span class="s">&#39;GetSliceArch&#39;</span><span class="p">,</span> <span class="s">&#39;GetNodeCountry&#39;</span><span class="p">,</span> <span class="s">&#39;SetSliceOmfControl&#39;</span><span class="p">,</span> <span class="s">&#39;GetNodeHrn&#39;</span><span class="p">,</span> 
+         <span class="s">&#39;GetNodeCity&#39;</span><span class="p">,</span> <span class="s">&#39;SetInterfaceAlias&#39;</span><span class="p">,</span> <span class="s">&#39;GetNodeBW&#39;</span><span class="p">,</span> <span class="s">&#39;GetNodePldistro&#39;</span><span class="p">,</span>
+         <span class="s">&#39;GetSlicePldistro&#39;</span><span class="p">,</span> <span class="s">&#39;SetNodeASNumber&#39;</span><span class="p">,</span> <span class="s">&#39;GetSliceHmac&#39;</span><span class="p">,</span> <span class="s">&#39;SetSliceHmac&#39;</span><span class="p">,</span>
+         <span class="s">&#39;GetNodeMEM&#39;</span><span class="p">,</span> <span class="s">&#39;GetNodeASNumber&#39;</span><span class="p">,</span> <span class="s">&#39;GetInterfaceAlias&#39;</span><span class="p">,</span> <span class="s">&#39;GetSliceVref&#39;</span><span class="p">,</span>
+         <span class="s">&#39;GetNodeArch&#39;</span><span class="p">,</span> <span class="s">&#39;GetSliceSshKey&#39;</span><span class="p">,</span> <span class="s">&#39;GetInterfaceKey4&#39;</span><span class="p">,</span> <span class="s">&#39;GetInterfaceKey2&#39;</span><span class="p">,</span>
+         <span class="s">&#39;GetInterfaceKey3&#39;</span><span class="p">,</span> <span class="s">&#39;GetInterfaceKey1&#39;</span><span class="p">,</span> <span class="s">&#39;GetInterfaceBackdoor&#39;</span><span class="p">,</span>
+         <span class="s">&#39;GetInterfaceIfname&#39;</span><span class="p">,</span> <span class="s">&#39;SetSliceSliverHMAC&#39;</span><span class="p">,</span> <span class="s">&#39;SetNodeReliability&#39;</span><span class="p">,</span>
+         <span class="s">&#39;GetNodeCPU&#39;</span><span class="p">,</span> <span class="s">&#39;SetPersonShowconf&#39;</span><span class="p">,</span> <span class="s">&#39;SetNodeExtensions&#39;</span><span class="p">,</span> <span class="s">&#39;SetNodeCPUy&#39;</span><span class="p">,</span> 
+         <span class="s">&#39;SetNodeCPUw&#39;</span><span class="p">,</span> <span class="s">&#39;GetNodeResponsew&#39;</span><span class="p">,</span> <span class="s">&#39;SetNodeResponsey&#39;</span><span class="p">,</span> <span class="s">&#39;GetInterfaceSens&#39;</span><span class="p">,</span>
+         <span class="s">&#39;SetNodeResponsew&#39;</span><span class="p">,</span> <span class="s">&#39;GetNodeResponsey&#39;</span><span class="p">,</span> <span class="s">&#39;GetNodeReliability&#39;</span><span class="p">,</span>
+         <span class="s">&#39;GetNodeReliabilitym&#39;</span><span class="p">,</span> <span class="s">&#39;SetNodeResponsem&#39;</span><span class="p">,</span> <span class="s">&#39;SetInterfaceDriver&#39;</span><span class="p">,</span>
+         <span class="s">&#39;GetInterfaceSecurityMode&#39;</span><span class="p">,</span> <span class="s">&#39;SetNodeDeployment&#39;</span><span class="p">,</span> <span class="s">&#39;SetNodeReliabilitym&#39;</span><span class="p">,</span>
+         <span class="s">&#39;GetNodeFcdistro&#39;</span><span class="p">,</span> <span class="s">&#39;SetInterfaceFreq&#39;</span><span class="p">,</span> <span class="s">&#39;GetInterfaceNw&#39;</span><span class="p">,</span>
+         <span class="s">&#39;SetNodeReliabilityy&#39;</span><span class="p">,</span> <span class="s">&#39;SetNodeReliabilityw&#39;</span><span class="p">,</span> <span class="s">&#39;GetInterfaceIwconfig&#39;</span><span class="p">,</span>
+         <span class="s">&#39;SetSlicePldistro&#39;</span><span class="p">,</span> <span class="s">&#39;SetSliceSshKey&#39;</span><span class="p">,</span> <span class="s">&#39;GetNodeDeployment&#39;</span><span class="p">,</span>
+         <span class="s">&#39;GetInterfaceChannel&#39;</span><span class="p">,</span> <span class="s">&#39;SetInterfaceKey2&#39;</span><span class="p">,</span> <span class="s">&#39;SetInterfaceKey3&#39;</span><span class="p">,</span>
+         <span class="s">&#39;SetInterfaceKey1&#39;</span><span class="p">,</span> <span class="s">&#39;SetInterfaceKey4&#39;</span><span class="p">])</span>
+     
+    <span class="n">_required_methods</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
+
+    <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">username</span><span class="p">,</span> <span class="n">password</span><span class="p">,</span> <span class="n">hostname</span><span class="p">,</span> <span class="n">urlpattern</span><span class="p">,</span> <span class="n">ec</span><span class="p">,</span> <span class="n">proxy</span><span class="p">,</span> <span class="n">session_key</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span> 
+            <span class="n">local_peer</span> <span class="o">=</span> <span class="s">&quot;PLE&quot;</span><span class="p">):</span>
+
+        <span class="bp">self</span><span class="o">.</span><span class="n">_blacklist</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">_reserved</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">_nodes_cache</span> <span class="o">=</span> <span class="bp">None</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_already_cached</span> <span class="o">=</span> <span class="bp">False</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_ecobj</span> <span class="o">=</span> <span class="n">ec</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">count</span> <span class="o">=</span> <span class="mi">1</span> 
+
+        <span class="k">if</span> <span class="n">session_key</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">auth</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">AuthMethod</span><span class="o">=</span><span class="s">&#39;session&#39;</span><span class="p">,</span> <span class="n">session</span><span class="o">=</span><span class="n">session_key</span><span class="p">)</span>
+        <span class="k">elif</span> <span class="n">username</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">password</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">auth</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">AuthMethod</span><span class="o">=</span><span class="s">&#39;password&#39;</span><span class="p">,</span> <span class="n">Username</span><span class="o">=</span><span class="n">username</span><span class="p">,</span> <span class="n">AuthString</span><span class="o">=</span><span class="n">password</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">auth</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">AuthMethod</span><span class="o">=</span><span class="s">&#39;anonymous&#39;</span><span class="p">)</span>
+        
+        <span class="bp">self</span><span class="o">.</span><span class="n">_local_peer</span> <span class="o">=</span> <span class="n">local_peer</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_url</span> <span class="o">=</span> <span class="n">urlpattern</span> <span class="o">%</span> <span class="p">{</span><span class="s">&#39;hostname&#39;</span><span class="p">:</span><span class="n">hostname</span><span class="p">}</span>
+
+        <span class="k">if</span> <span class="p">(</span><span class="n">proxy</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">):</span>
+            <span class="kn">import</span> <span class="nn">urllib2</span>
+            <span class="k">class</span> <span class="nc">HTTPSProxyTransport</span><span class="p">(</span><span class="n">xmlrpclib</span><span class="o">.</span><span class="n">Transport</span><span class="p">):</span>
+                <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">proxy</span><span class="p">,</span> <span class="n">use_datetime</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+                    <span class="n">opener</span> <span class="o">=</span> <span class="n">urllib2</span><span class="o">.</span><span class="n">build_opener</span><span class="p">(</span><span class="n">urllib2</span><span class="o">.</span><span class="n">ProxyHandler</span><span class="p">({</span><span class="s">&quot;https&quot;</span> <span class="p">:</span> <span class="n">proxy</span><span class="p">}))</span>
+                    <span class="n">xmlrpclib</span><span class="o">.</span><span class="n">Transport</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">use_datetime</span><span class="p">)</span>
+                    <span class="bp">self</span><span class="o">.</span><span class="n">opener</span> <span class="o">=</span> <span class="n">opener</span>
+
+                <span class="k">def</span> <span class="nf">request</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">handler</span><span class="p">,</span> <span class="n">request_body</span><span class="p">,</span> <span class="n">verbose</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+                    <span class="n">req</span> <span class="o">=</span> <span class="n">urllib2</span><span class="o">.</span><span class="n">Request</span><span class="p">(</span><span class="s">&#39;https://</span><span class="si">%s%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">handler</span><span class="p">),</span> <span class="n">request_body</span><span class="p">)</span>
+                    <span class="n">req</span><span class="o">.</span><span class="n">add_header</span><span class="p">(</span><span class="s">&#39;User-agent&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">user_agent</span><span class="p">)</span>
+                    <span class="bp">self</span><span class="o">.</span><span class="n">verbose</span> <span class="o">=</span> <span class="n">verbose</span>
+                    <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">parse_response</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">opener</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">req</span><span class="p">))</span>
+
+            <span class="bp">self</span><span class="o">.</span><span class="n">_proxy_transport</span> <span class="o">=</span> <span class="k">lambda</span> <span class="p">:</span> <span class="n">HTTPSProxyTransport</span><span class="p">(</span><span class="n">proxy</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">_proxy_transport</span> <span class="o">=</span> <span class="k">lambda</span> <span class="p">:</span> <span class="bp">None</span>
+        
+        <span class="bp">self</span><span class="o">.</span><span class="n">threadlocal</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">local</span><span class="p">()</span>
+
+        <span class="c"># Load blacklist from file</span>
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_ecobj</span><span class="o">.</span><span class="n">get_global</span><span class="p">(</span><span class="s">&#39;planetlab::Node&#39;</span><span class="p">,</span> <span class="s">&#39;persist_blacklist&#39;</span><span class="p">):</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">_set_blacklist</span><span class="p">()</span>
+
+    <span class="nd">@property</span>
+<div class="viewcode-block" id="PLCAPI.api"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.plcapi.PLCAPI.api">[docs]</a>    <span class="k">def</span> <span class="nf">api</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="c"># Cannot reuse same proxy in all threads, py2.7 is not threadsafe</span>
+        <span class="k">return</span> <span class="n">xmlrpclib</span><span class="o">.</span><span class="n">ServerProxy</span><span class="p">(</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">_url</span> <span class="p">,</span>
+            <span class="n">transport</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_proxy_transport</span><span class="p">(),</span>
+            <span class="n">allow_none</span> <span class="o">=</span> <span class="bp">True</span><span class="p">)</span>
+        </div>
+    <span class="nd">@property</span>
+<div class="viewcode-block" id="PLCAPI.mcapi"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.plcapi.PLCAPI.mcapi">[docs]</a>    <span class="k">def</span> <span class="nf">mcapi</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">try</span><span class="p">:</span>
+            <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">threadlocal</span><span class="o">.</span><span class="n">mc</span>
+        <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
+            <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">api</span>
+        </div>
+<div class="viewcode-block" id="PLCAPI.test"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.plcapi.PLCAPI.test">[docs]</a>    <span class="k">def</span> <span class="nf">test</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="c"># TODO: Use nepi utils Logger instead of warning!!</span>
+        <span class="kn">import</span> <span class="nn">warnings</span>
+        
+        <span class="c"># validate XMLRPC server checking supported API calls</span>
+        <span class="n">methods</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">_retry</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">mcapi</span><span class="o">.</span><span class="n">system</span><span class="o">.</span><span class="n">listMethods</span><span class="p">)())</span>
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_required_methods</span> <span class="o">-</span> <span class="n">methods</span><span class="p">:</span>
+            <span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="s">&quot;Unsupported REQUIRED methods: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span>
+                <span class="s">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">sorted</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_required_methods</span> <span class="o">-</span> <span class="n">methods</span><span class="p">)),</span> <span class="p">)</span> <span class="p">)</span>
+            <span class="k">return</span> <span class="bp">False</span>
+
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_expected_methods</span> <span class="o">-</span> <span class="n">methods</span><span class="p">:</span>
+            <span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="s">&quot;Unsupported EXPECTED methods: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span>
+                <span class="s">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">sorted</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_expected_methods</span> <span class="o">-</span> <span class="n">methods</span><span class="p">)),</span> <span class="p">)</span> <span class="p">)</span>
+        
+        <span class="k">try</span><span class="p">:</span>
+            <span class="c"># test authorization</span>
+            <span class="n">network_types</span> <span class="o">=</span> <span class="n">_retry</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">mcapi</span><span class="o">.</span><span class="n">GetNetworkTypes</span><span class="p">)(</span><span class="bp">self</span><span class="o">.</span><span class="n">auth</span><span class="p">)</span>
+        <span class="k">except</span> <span class="p">(</span><span class="n">xmlrpclib</span><span class="o">.</span><span class="n">ProtocolError</span><span class="p">,</span> <span class="n">xmlrpclib</span><span class="o">.</span><span class="n">Fault</span><span class="p">),</span><span class="n">e</span><span class="p">:</span>
+            <span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">))</span>
+        
+        <span class="k">return</span> <span class="bp">True</span>
+</div>
+    <span class="k">def</span> <span class="nf">_set_blacklist</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="n">nepi_home</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">join</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expanduser</span><span class="p">(</span><span class="s">&quot;~&quot;</span><span class="p">),</span> <span class="s">&quot;.nepi&quot;</span><span class="p">)</span>
+        <span class="n">plblacklist_file</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">nepi_home</span><span class="p">,</span> <span class="s">&quot;plblacklist.txt&quot;</span><span class="p">)</span>
+        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">plblacklist_file</span><span class="p">,</span> <span class="s">&#39;r&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
+            <span class="n">hosts_tobl</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()</span>
+            <span class="k">if</span> <span class="n">hosts_tobl</span><span class="p">:</span>
+                <span class="n">nodes_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_nodes</span><span class="p">(</span><span class="n">hosts_tobl</span><span class="p">,</span> <span class="p">[</span><span class="s">&#39;node_id&#39;</span><span class="p">])</span>
+                <span class="k">for</span> <span class="n">node_id</span> <span class="ow">in</span> <span class="n">nodes_id</span><span class="p">:</span>
+                    <span class="bp">self</span><span class="o">.</span><span class="n">_blacklist</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">node_id</span><span class="p">[</span><span class="s">&#39;node_id&#39;</span><span class="p">])</span>
+    
+    <span class="nd">@property</span>
+<div class="viewcode-block" id="PLCAPI.network_types"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.plcapi.PLCAPI.network_types">[docs]</a>    <span class="k">def</span> <span class="nf">network_types</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">try</span><span class="p">:</span>
+            <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_network_types</span>
+        <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">_network_types</span> <span class="o">=</span> <span class="n">_retry</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">mcapi</span><span class="o">.</span><span class="n">GetNetworkTypes</span><span class="p">)(</span><span class="bp">self</span><span class="o">.</span><span class="n">auth</span><span class="p">)</span>
+            <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_network_types</span>
+    </div>
+    <span class="nd">@property</span>
+<div class="viewcode-block" id="PLCAPI.peer_map"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.plcapi.PLCAPI.peer_map">[docs]</a>    <span class="k">def</span> <span class="nf">peer_map</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">try</span><span class="p">:</span>
+            <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_peer_map</span>
+        <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
+            <span class="n">peers</span> <span class="o">=</span> <span class="n">_retry</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">mcapi</span><span class="o">.</span><span class="n">GetPeers</span><span class="p">)(</span><span class="bp">self</span><span class="o">.</span><span class="n">auth</span><span class="p">,</span> <span class="p">{},</span> <span class="p">[</span><span class="s">&#39;shortname&#39;</span><span class="p">,</span><span class="s">&#39;peername&#39;</span><span class="p">,</span><span class="s">&#39;peer_id&#39;</span><span class="p">])</span>
+            
+            <span class="bp">self</span><span class="o">.</span><span class="n">_peer_map</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span>
+                <span class="p">(</span><span class="n">peer</span><span class="p">[</span><span class="s">&#39;shortname&#39;</span><span class="p">],</span> <span class="n">peer</span><span class="p">[</span><span class="s">&#39;peer_id&#39;</span><span class="p">])</span>
+                <span class="k">for</span> <span class="n">peer</span> <span class="ow">in</span> <span class="n">peers</span>
+            <span class="p">)</span>
+
+            <span class="bp">self</span><span class="o">.</span><span class="n">_peer_map</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
+                <span class="p">(</span><span class="n">peer</span><span class="p">[</span><span class="s">&#39;peername&#39;</span><span class="p">],</span> <span class="n">peer</span><span class="p">[</span><span class="s">&#39;peer_id&#39;</span><span class="p">])</span>
+                <span class="k">for</span> <span class="n">peer</span> <span class="ow">in</span> <span class="n">peers</span>
+            <span class="p">)</span>
+
+            <span class="bp">self</span><span class="o">.</span><span class="n">_peer_map</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
+                <span class="p">(</span><span class="n">peer</span><span class="p">[</span><span class="s">&#39;peer_id&#39;</span><span class="p">],</span> <span class="n">peer</span><span class="p">[</span><span class="s">&#39;shortname&#39;</span><span class="p">])</span>
+                <span class="k">for</span> <span class="n">peer</span> <span class="ow">in</span> <span class="n">peers</span>
+            <span class="p">)</span>
+
+            <span class="bp">self</span><span class="o">.</span><span class="n">_peer_map</span><span class="p">[</span><span class="bp">None</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_local_peer</span>
+            <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_peer_map</span>
+</div>
+<div class="viewcode-block" id="PLCAPI.get_node_flavour"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.plcapi.PLCAPI.get_node_flavour">[docs]</a>    <span class="k">def</span> <span class="nf">get_node_flavour</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Returns detailed information on a given node&#39;s flavour,</span>
+<span class="sd">        i.e. its base installation.</span>
+
+<span class="sd">        This depends on the global PLC settings in the PLC_FLAVOUR area,</span>
+<span class="sd">        optionnally overridden by any of the following tags if set on that node:</span>
+<span class="sd">        &#39;arch&#39;, &#39;pldistro&#39;, &#39;fcdistro&#39;, &#39;deployment&#39;, &#39;extensions&#39;</span>
+<span class="sd">        </span>
+<span class="sd">        Params:</span>
+<span class="sd">        </span>
+<span class="sd">            * node : int or string</span>
+<span class="sd">                - int, Node identifier</span>
+<span class="sd">                - string, Fully qualified hostname</span>
+<span class="sd">        </span>
+<span class="sd">        Returns:</span>
+
+<span class="sd">            struct</span>
+<span class="sd">                * extensions : array of string, extensions to add to the base install</span>
+<span class="sd">                * fcdistro : string, the fcdistro this node should be based upon</span>
+<span class="sd">                * nodefamily : string, the nodefamily this node should be based upon</span>
+<span class="sd">                * plain : boolean, use plain bootstrapfs image if set (for tests)  </span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="nb">int</span><span class="p">,</span> <span class="nb">long</span><span class="p">)):</span>
+            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">,</span> <span class="s">&quot;Node must be either a non-unicode string or an int&quot;</span>
+        <span class="k">return</span> <span class="n">_retry</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">mcapi</span><span class="o">.</span><span class="n">GetNodeFlavour</span><span class="p">)(</span><span class="bp">self</span><span class="o">.</span><span class="n">auth</span><span class="p">,</span> <span class="n">node</span><span class="p">)</span>
+    </div>
+<div class="viewcode-block" id="PLCAPI.get_nodes"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.plcapi.PLCAPI.get_nodes">[docs]</a>    <span class="k">def</span> <span class="nf">get_nodes</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node_id_or_name</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span> <span class="n">fields</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Returns an array of structs containing details about nodes. </span>
+<span class="sd">        If node_id_or_name is specified and is an array of node identifiers</span>
+<span class="sd">        or hostnames,  or the filters keyword argument with struct of node</span>
+<span class="sd">        attributes, or node attributes by keyword argument,</span>
+<span class="sd">        only nodes matching the filter will be returned.</span>
+
+<span class="sd">        If fields is specified, only the specified details will be returned. </span>
+<span class="sd">        NOTE that if fields is unspecified, the complete set of native fields are</span>
+<span class="sd">        returned, which DOES NOT include tags at this time.</span>
+
+<span class="sd">        Some fields may only be viewed by admins.</span>
+<span class="sd">        </span>
+<span class="sd">        Special params:</span>
+<span class="sd">            </span>
+<span class="sd">            fields: an optional list of fields to retrieve. The default is all.</span>
+<span class="sd">            </span>
+<span class="sd">            filters: an optional mapping with custom filters, which is the only</span>
+<span class="sd">                way to support complex filters like negation and numeric comparisons.</span>
+<span class="sd">                </span>
+<span class="sd">            peer: a string (or sequence of strings) with the name(s) of peers</span>
+<span class="sd">                to filter - or None for local nodes.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="n">fields</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+            <span class="n">fieldstuple</span> <span class="o">=</span> <span class="p">(</span><span class="n">fields</span><span class="p">,)</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="n">fieldstuple</span> <span class="o">=</span> <span class="p">()</span>
+
+        <span class="k">if</span> <span class="n">node_id_or_name</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+            <span class="k">return</span> <span class="n">_retry</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">mcapi</span><span class="o">.</span><span class="n">GetNodes</span><span class="p">)(</span><span class="bp">self</span><span class="o">.</span><span class="n">auth</span><span class="p">,</span> <span class="n">node_id_or_name</span><span class="p">,</span> <span class="o">*</span><span class="n">fieldstuple</span><span class="p">)</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="n">filters</span> <span class="o">=</span> <span class="n">kw</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s">&#39;filters&#39;</span><span class="p">,{})</span>
+            
+            <span class="k">if</span> <span class="s">&#39;peer&#39;</span> <span class="ow">in</span> <span class="n">kw</span><span class="p">:</span>
+                <span class="n">peer</span> <span class="o">=</span> <span class="n">kw</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s">&#39;peer&#39;</span><span class="p">)</span>
+                
+                <span class="n">name_to_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">peer_map</span><span class="o">.</span><span class="n">get</span>
+                
+                <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">peer</span><span class="p">,</span> <span class="s">&#39;__iter__&#39;</span><span class="p">):</span>
+                    <span class="c"># we can&#39;t mix local and external nodes, so</span>
+                    <span class="c"># split and re-issue recursively in that case</span>
+                    <span class="k">if</span> <span class="bp">None</span> <span class="ow">in</span> <span class="n">peer</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">_local_peer</span> <span class="ow">in</span> <span class="n">peer</span><span class="p">:</span>
+                        <span class="k">if</span> <span class="bp">None</span> <span class="ow">in</span> <span class="n">peer</span><span class="p">:</span>    
+                            <span class="n">peer</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="bp">None</span><span class="p">)</span>
+
+                        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_local_peer</span> <span class="ow">in</span> <span class="n">peer</span><span class="p">:</span>
+                            <span class="n">peer</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_local_peer</span><span class="p">)</span>
+
+                        <span class="k">return</span> <span class="p">(</span>
+                            <span class="bp">self</span><span class="o">.</span><span class="n">get_nodes</span><span class="p">(</span><span class="n">node_id_or_name</span><span class="p">,</span> <span class="n">fields</span><span class="p">,</span>
+                                    <span class="n">filters</span> <span class="o">=</span> <span class="n">filters</span><span class="p">,</span> <span class="n">peer</span><span class="o">=</span><span class="n">peer</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span> <span class="o">+</span> \
+                            <span class="bp">self</span><span class="o">.</span><span class="n">get_nodes</span><span class="p">(</span><span class="n">node_id_or_name</span><span class="p">,</span> <span class="n">fields</span><span class="p">,</span> 
+                                    <span class="n">filters</span> <span class="o">=</span> <span class="n">filters</span><span class="p">,</span> <span class="n">peer</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>
+                         <span class="p">)</span>
+                    <span class="k">else</span><span class="p">:</span>
+                        <span class="n">peer_filter</span> <span class="o">=</span> <span class="nb">map</span><span class="p">(</span><span class="n">name_to_id</span><span class="p">,</span> <span class="n">peer</span><span class="p">)</span>
+
+                <span class="k">elif</span> <span class="n">peer</span> <span class="ow">is</span> <span class="bp">None</span> <span class="ow">or</span> <span class="n">peer</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">_local_peer</span><span class="p">:</span>
+                    <span class="n">peer_filter</span> <span class="o">=</span> <span class="bp">None</span>
+                <span class="k">else</span><span class="p">:</span>
+                    <span class="n">peer_filter</span> <span class="o">=</span> <span class="n">name_to_id</span><span class="p">(</span><span class="n">peer</span><span class="p">)</span>
+                
+                <span class="n">filters</span><span class="p">[</span><span class="s">&#39;peer_id&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">peer_filter</span>
+            
+            <span class="n">filters</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">kw</span><span class="p">)</span>
+
+            <span class="k">if</span> <span class="ow">not</span> <span class="n">filters</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">fieldstuple</span><span class="p">:</span>
+                <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_nodes_cache</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_already_cached</span><span class="p">:</span>
+                    <span class="bp">self</span><span class="o">.</span><span class="n">_already_cached</span> <span class="o">=</span> <span class="bp">True</span>
+                    <span class="bp">self</span><span class="o">.</span><span class="n">_nodes_cache</span> <span class="o">=</span> <span class="n">_retry</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">mcapi</span><span class="o">.</span><span class="n">GetNodes</span><span class="p">)(</span><span class="bp">self</span><span class="o">.</span><span class="n">auth</span><span class="p">)</span>
+                <span class="k">elif</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_nodes_cache</span><span class="p">:</span>
+                    <span class="k">while</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_nodes_cache</span><span class="p">:</span>
+                        <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>
+                <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_nodes_cache</span>
+
+            <span class="k">return</span> <span class="n">_retry</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">mcapi</span><span class="o">.</span><span class="n">GetNodes</span><span class="p">)(</span><span class="bp">self</span><span class="o">.</span><span class="n">auth</span><span class="p">,</span> <span class="n">filters</span><span class="p">,</span> <span class="o">*</span><span class="n">fieldstuple</span><span class="p">)</span>
+    </div>
+<div class="viewcode-block" id="PLCAPI.get_node_tags"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.plcapi.PLCAPI.get_node_tags">[docs]</a>    <span class="k">def</span> <span class="nf">get_node_tags</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node_tag_id</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span> <span class="n">fields</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
+        <span class="k">if</span> <span class="n">fields</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+            <span class="n">fieldstuple</span> <span class="o">=</span> <span class="p">(</span><span class="n">fields</span><span class="p">,)</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="n">fieldstuple</span> <span class="o">=</span> <span class="p">()</span>
+
+        <span class="k">if</span> <span class="n">node_tag_id</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+            <span class="k">return</span> <span class="n">_retry</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">mcapi</span><span class="o">.</span><span class="n">GetNodeTags</span><span class="p">)(</span><span class="bp">self</span><span class="o">.</span><span class="n">auth</span><span class="p">,</span> <span class="n">node_tag_id</span><span class="p">,</span>
+                    <span class="o">*</span><span class="n">fieldstuple</span><span class="p">)</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="n">filters</span> <span class="o">=</span> <span class="n">kw</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s">&#39;filters&#39;</span><span class="p">,{})</span>
+            <span class="n">filters</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">kw</span><span class="p">)</span>
+            <span class="k">return</span> <span class="n">_retry</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">mcapi</span><span class="o">.</span><span class="n">GetNodeTags</span><span class="p">)(</span><span class="bp">self</span><span class="o">.</span><span class="n">auth</span><span class="p">,</span> <span class="n">filters</span><span class="p">,</span>
+                    <span class="o">*</span><span class="n">fieldstuple</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="PLCAPI.get_slice_tags"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.plcapi.PLCAPI.get_slice_tags">[docs]</a>    <span class="k">def</span> <span class="nf">get_slice_tags</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">slice_tag_id</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span> <span class="n">fields</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
+        <span class="k">if</span> <span class="n">fields</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+            <span class="n">fieldstuple</span> <span class="o">=</span> <span class="p">(</span><span class="n">fields</span><span class="p">,)</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="n">fieldstuple</span> <span class="o">=</span> <span class="p">()</span>
+
+        <span class="k">if</span> <span class="n">slice_tag_id</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+            <span class="k">return</span> <span class="n">_retry</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">mcapi</span><span class="o">.</span><span class="n">GetSliceTags</span><span class="p">)(</span><span class="bp">self</span><span class="o">.</span><span class="n">auth</span><span class="p">,</span> <span class="n">slice_tag_id</span><span class="p">,</span>
+                    <span class="o">*</span><span class="n">fieldstuple</span><span class="p">)</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="n">filters</span> <span class="o">=</span> <span class="n">kw</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s">&#39;filters&#39;</span><span class="p">,{})</span>
+            <span class="n">filters</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">kw</span><span class="p">)</span>
+            <span class="k">return</span> <span class="n">_retry</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">mcapi</span><span class="o">.</span><span class="n">GetSliceTags</span><span class="p">)(</span><span class="bp">self</span><span class="o">.</span><span class="n">auth</span><span class="p">,</span> <span class="n">filters</span><span class="p">,</span>
+                    <span class="o">*</span><span class="n">fieldstuple</span><span class="p">)</span>
+    </div>
+<div class="viewcode-block" id="PLCAPI.get_interfaces"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.plcapi.PLCAPI.get_interfaces">[docs]</a>    <span class="k">def</span> <span class="nf">get_interfaces</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interface_id_or_ip</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span> <span class="n">fields</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
+        <span class="k">if</span> <span class="n">fields</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+            <span class="n">fieldstuple</span> <span class="o">=</span> <span class="p">(</span><span class="n">fields</span><span class="p">,)</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="n">fieldstuple</span> <span class="o">=</span> <span class="p">()</span>
+
+        <span class="k">if</span> <span class="n">interface_id_or_ip</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+            <span class="k">return</span> <span class="n">_retry</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">mcapi</span><span class="o">.</span><span class="n">GetInterfaces</span><span class="p">)(</span><span class="bp">self</span><span class="o">.</span><span class="n">auth</span><span class="p">,</span>
+                    <span class="n">interface_id_or_ip</span><span class="p">,</span> <span class="o">*</span><span class="n">fieldstuple</span><span class="p">)</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="n">filters</span> <span class="o">=</span> <span class="n">kw</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s">&#39;filters&#39;</span><span class="p">,{})</span>
+            <span class="n">filters</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">kw</span><span class="p">)</span>
+            <span class="k">return</span> <span class="n">_retry</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">mcapi</span><span class="o">.</span><span class="n">GetInterfaces</span><span class="p">)(</span><span class="bp">self</span><span class="o">.</span><span class="n">auth</span><span class="p">,</span> <span class="n">filters</span><span class="p">,</span>
+                    <span class="o">*</span><span class="n">fieldstuple</span><span class="p">)</span>
+        </div>
+<div class="viewcode-block" id="PLCAPI.get_slices"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.plcapi.PLCAPI.get_slices">[docs]</a>    <span class="k">def</span> <span class="nf">get_slices</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">slice_id_or_name</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span> <span class="n">fields</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
+        <span class="k">if</span> <span class="n">fields</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+            <span class="n">fieldstuple</span> <span class="o">=</span> <span class="p">(</span><span class="n">fields</span><span class="p">,)</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="n">fieldstuple</span> <span class="o">=</span> <span class="p">()</span>
+
+        <span class="k">if</span> <span class="n">slice_id_or_name</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+            <span class="k">return</span> <span class="n">_retry</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">mcapi</span><span class="o">.</span><span class="n">GetSlices</span><span class="p">)(</span><span class="bp">self</span><span class="o">.</span><span class="n">auth</span><span class="p">,</span> <span class="n">slice_id_or_name</span><span class="p">,</span>
+                    <span class="o">*</span><span class="n">fieldstuple</span><span class="p">)</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="n">filters</span> <span class="o">=</span> <span class="n">kw</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s">&#39;filters&#39;</span><span class="p">,{})</span>
+            <span class="n">filters</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">kw</span><span class="p">)</span>
+            <span class="k">return</span> <span class="n">_retry</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">mcapi</span><span class="o">.</span><span class="n">GetSlices</span><span class="p">)(</span><span class="bp">self</span><span class="o">.</span><span class="n">auth</span><span class="p">,</span> <span class="n">filters</span><span class="p">,</span>
+                    <span class="o">*</span><span class="n">fieldstuple</span><span class="p">)</span>
+        </div>
+<div class="viewcode-block" id="PLCAPI.update_slice"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.plcapi.PLCAPI.update_slice">[docs]</a>    <span class="k">def</span> <span class="nf">update_slice</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">slice_id_or_name</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
+        <span class="k">return</span> <span class="n">_retry</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">mcapi</span><span class="o">.</span><span class="n">UpdateSlice</span><span class="p">)(</span><span class="bp">self</span><span class="o">.</span><span class="n">auth</span><span class="p">,</span> <span class="n">slice_id_or_name</span><span class="p">,</span> <span class="n">kw</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="PLCAPI.delete_slice_node"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.plcapi.PLCAPI.delete_slice_node">[docs]</a>    <span class="k">def</span> <span class="nf">delete_slice_node</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">slice_id_or_name</span><span class="p">,</span> <span class="n">node_id_or_hostname</span><span class="p">):</span>
+        <span class="k">return</span> <span class="n">_retry</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">mcapi</span><span class="o">.</span><span class="n">DeleteSliceFromNodes</span><span class="p">)(</span><span class="bp">self</span><span class="o">.</span><span class="n">auth</span><span class="p">,</span> <span class="n">slice_id_or_name</span><span class="p">,</span> <span class="n">node_id_or_hostname</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="PLCAPI.start_multicall"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.plcapi.PLCAPI.start_multicall">[docs]</a>    <span class="k">def</span> <span class="nf">start_multicall</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">threadlocal</span><span class="o">.</span><span class="n">mc</span> <span class="o">=</span> <span class="n">xmlrpclib</span><span class="o">.</span><span class="n">MultiCall</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">mcapi</span><span class="p">)</span>
+    </div>
+<div class="viewcode-block" id="PLCAPI.finish_multicall"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.plcapi.PLCAPI.finish_multicall">[docs]</a>    <span class="k">def</span> <span class="nf">finish_multicall</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="n">mc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">threadlocal</span><span class="o">.</span><span class="n">mc</span>
+        <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">threadlocal</span><span class="o">.</span><span class="n">mc</span>
+        <span class="k">return</span> <span class="n">_retry</span><span class="p">(</span><span class="n">mc</span><span class="p">)()</span>
+</div>
+<div class="viewcode-block" id="PLCAPI.get_slice_nodes"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.plcapi.PLCAPI.get_slice_nodes">[docs]</a>    <span class="k">def</span> <span class="nf">get_slice_nodes</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">slicename</span><span class="p">):</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_slices</span><span class="p">(</span><span class="n">slicename</span><span class="p">,</span> <span class="p">[</span><span class="s">&#39;node_ids&#39;</span><span class="p">])[</span><span class="mi">0</span><span class="p">][</span><span class="s">&#39;node_ids&#39;</span><span class="p">]</span>
+</div>
+<div class="viewcode-block" id="PLCAPI.add_slice_nodes"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.plcapi.PLCAPI.add_slice_nodes">[docs]</a>    <span class="k">def</span> <span class="nf">add_slice_nodes</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">slicename</span><span class="p">,</span> <span class="n">nodes</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">update_slice</span><span class="p">(</span><span class="n">slicename</span><span class="p">,</span> <span class="n">nodes</span><span class="o">=</span><span class="n">nodes</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="PLCAPI.get_node_info"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.plcapi.PLCAPI.get_node_info">[docs]</a>    <span class="k">def</span> <span class="nf">get_node_info</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node_id</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">start_multicall</span><span class="p">()</span>
+        <span class="n">info</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_nodes</span><span class="p">(</span><span class="n">node_id</span><span class="p">)</span>
+        <span class="n">tags</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_node_tags</span><span class="p">(</span><span class="n">node_id</span><span class="o">=</span><span class="n">node_id</span><span class="p">,</span> <span class="n">fields</span><span class="o">=</span><span class="p">(</span><span class="s">&#39;tagname&#39;</span><span class="p">,</span><span class="s">&#39;value&#39;</span><span class="p">))</span>
+        <span class="n">info</span><span class="p">,</span> <span class="n">tags</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">finish_multicall</span><span class="p">()</span>
+        <span class="k">return</span> <span class="n">info</span><span class="p">,</span> <span class="n">tags</span>
+</div>
+<div class="viewcode-block" id="PLCAPI.get_slice_id"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.plcapi.PLCAPI.get_slice_id">[docs]</a>    <span class="k">def</span> <span class="nf">get_slice_id</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">slicename</span><span class="p">):</span>
+        <span class="n">slice_id</span> <span class="o">=</span> <span class="bp">None</span>
+        <span class="n">slices</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_slices</span><span class="p">(</span><span class="n">slicename</span><span class="p">,</span> <span class="n">fields</span><span class="o">=</span><span class="p">(</span><span class="s">&#39;slice_id&#39;</span><span class="p">,))</span>
+        <span class="k">if</span> <span class="n">slices</span><span class="p">:</span>
+            <span class="n">slice_id</span> <span class="o">=</span> <span class="n">slices</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s">&#39;slice_id&#39;</span><span class="p">]</span>
+
+        <span class="c"># If it wasn&#39;t found, don&#39;t remember this failure, keep trying</span>
+        <span class="k">return</span> <span class="n">slice_id</span>
+</div>
+<div class="viewcode-block" id="PLCAPI.get_slice_vnet_sys_tag"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.plcapi.PLCAPI.get_slice_vnet_sys_tag">[docs]</a>    <span class="k">def</span> <span class="nf">get_slice_vnet_sys_tag</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">slicename</span><span class="p">):</span>
+        <span class="n">slicetags</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_slice_tags</span><span class="p">(</span>
+            <span class="n">name</span> <span class="o">=</span> <span class="n">slicename</span><span class="p">,</span>
+            <span class="n">tagname</span> <span class="o">=</span> <span class="s">&#39;vsys_vnet&#39;</span><span class="p">,</span>
+            <span class="n">fields</span><span class="o">=</span><span class="p">(</span><span class="s">&#39;value&#39;</span><span class="p">,))</span>
+
+        <span class="k">if</span> <span class="n">slicetags</span><span class="p">:</span>
+            <span class="k">return</span> <span class="n">slicetags</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s">&#39;value&#39;</span><span class="p">]</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="k">return</span> <span class="bp">None</span>
+</div>
+<div class="viewcode-block" id="PLCAPI.blacklist_host"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.plcapi.PLCAPI.blacklist_host">[docs]</a>    <span class="k">def</span> <span class="nf">blacklist_host</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node_id</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_blacklist</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">node_id</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="PLCAPI.blacklisted"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.plcapi.PLCAPI.blacklisted">[docs]</a>    <span class="k">def</span> <span class="nf">blacklisted</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_blacklist</span> 
+</div>
+<div class="viewcode-block" id="PLCAPI.unblacklist_host"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.plcapi.PLCAPI.unblacklist_host">[docs]</a>    <span class="k">def</span> <span class="nf">unblacklist_host</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node_id</span><span class="p">):</span>
+        <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">_blacklist</span><span class="p">[</span><span class="n">node_id</span><span class="p">]</span>
+</div>
+<div class="viewcode-block" id="PLCAPI.reserve_host"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.plcapi.PLCAPI.reserve_host">[docs]</a>    <span class="k">def</span> <span class="nf">reserve_host</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node_id</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_reserved</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">node_id</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="PLCAPI.reserved"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.plcapi.PLCAPI.reserved">[docs]</a>    <span class="k">def</span> <span class="nf">reserved</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reserved</span>
+</div>
+<div class="viewcode-block" id="PLCAPI.unreserve_host"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.plcapi.PLCAPI.unreserve_host">[docs]</a>    <span class="k">def</span> <span class="nf">unreserve_host</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node_id</span><span class="p">):</span>
+        <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reserved</span><span class="p">[</span><span class="n">node_id</span><span class="p">]</span>
+</div>
+<div class="viewcode-block" id="PLCAPI.release"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.plcapi.PLCAPI.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="bp">self</span><span class="o">.</span><span class="n">count</span> <span class="o">-=</span> <span class="mi">1</span>
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">count</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
+            <span class="n">blacklist</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_blacklist</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">_blacklist</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">_reserved</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
+            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_ecobj</span><span class="o">.</span><span class="n">get_global</span><span class="p">(</span><span class="s">&#39;PlanetlabNode&#39;</span><span class="p">,</span> <span class="s">&#39;persist_blacklist&#39;</span><span class="p">):</span>
+                <span class="k">if</span> <span class="n">blacklist</span><span class="p">:</span>
+                    <span class="n">to_blacklist</span> <span class="o">=</span> <span class="nb">list</span><span class="p">()</span>
+                    <span class="n">hostnames</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_nodes</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">blacklist</span><span class="p">),</span> <span class="p">[</span><span class="s">&#39;hostname&#39;</span><span class="p">])</span>
+                    <span class="k">for</span> <span class="n">hostname</span> <span class="ow">in</span> <span class="n">hostnames</span><span class="p">:</span>
+                        <span class="n">to_blacklist</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">hostname</span><span class="p">[</span><span class="s">&#39;hostname&#39;</span><span class="p">])</span>
+    
+                    <span class="n">nepi_home</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">join</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expanduser</span><span class="p">(</span><span class="s">&quot;~&quot;</span><span class="p">),</span> <span class="s">&quot;.nepi&quot;</span><span class="p">)</span>
+                    <span class="n">plblacklist_file</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">nepi_home</span><span class="p">,</span> <span class="s">&quot;plblacklist.txt&quot;</span><span class="p">)</span>
+    
+                    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">plblacklist_file</span><span class="p">,</span> <span class="s">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
+                        <span class="k">for</span> <span class="n">host</span> <span class="ow">in</span> <span class="n">to_blacklist</span><span class="p">:</span>
+                            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&quot;</span><span class="si">%s</span><span class="se">\n</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">host</span><span class="p">)</span>
+    
+</div></div>
+<div class="viewcode-block" id="PLCAPIFactory"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.plcapi.PLCAPIFactory">[docs]</a><span class="k">class</span> <span class="nc">PLCAPIFactory</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot; </span>
+<span class="sd">    .. note::</span>
+
+<span class="sd">        It allows PlanetLab RMs sharing a same slice, to use a same plcapi instance,</span>
+<span class="sd">        and to sincronize blacklisted and reserved hosts.</span>
+
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="c"># use lock to avoid concurrent access to the Api list at the same times by 2 different threads</span>
+    <span class="n">_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="n">_apis</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>
+
+    <span class="nd">@classmethod</span> 
+<div class="viewcode-block" id="PLCAPIFactory.get_api"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.plcapi.PLCAPIFactory.get_api">[docs]</a>    <span class="k">def</span> <span class="nf">get_api</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">pl_user</span><span class="p">,</span> <span class="n">pl_pass</span><span class="p">,</span> <span class="n">pl_host</span><span class="p">,</span>
+            <span class="n">pl_ptn</span><span class="p">,</span> <span class="n">ec</span><span class="p">,</span> <span class="n">proxy</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Get existing PLCAPI instance</span>
+
+<span class="sd">        :param pl_user: Planelab user name (used for web login)</span>
+<span class="sd">        :type pl_user: str</span>
+<span class="sd">        :param pl_pass: Planetlab password (used for web login)</span>
+<span class="sd">        :type pl_pass: str</span>
+<span class="sd">        :param pl_host: Planetlab registry host (e.g. &quot;www.planet-lab.eu&quot;)</span>
+<span class="sd">        :type pl_host: str</span>
+<span class="sd">        :param pl_ptn: XMLRPC service pattern (e.g. https://%(hostname)s:443/PLCAPI/)</span>
+<span class="sd">        :type pl_ptn: str</span>
+<span class="sd">        :param proxy: Proxy service url</span>
+<span class="sd">        :type pl_ptn: str</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="n">pl_user</span> <span class="ow">and</span> <span class="n">pl_pass</span> <span class="ow">and</span> <span class="n">pl_host</span><span class="p">:</span>
+            <span class="n">key</span> <span class="o">=</span> <span class="n">cls</span><span class="o">.</span><span class="n">_make_key</span><span class="p">(</span><span class="n">pl_user</span><span class="p">,</span> <span class="n">pl_host</span><span class="p">)</span>
+            <span class="k">with</span> <span class="n">cls</span><span class="o">.</span><span class="n">_lock</span><span class="p">:</span>
+                <span class="n">api</span> <span class="o">=</span> <span class="n">cls</span><span class="o">.</span><span class="n">_apis</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
+                <span class="k">if</span> <span class="ow">not</span> <span class="n">api</span><span class="p">:</span>
+                    <span class="n">api</span> <span class="o">=</span> <span class="n">cls</span><span class="o">.</span><span class="n">create_api</span><span class="p">(</span><span class="n">pl_user</span><span class="p">,</span> <span class="n">pl_pass</span><span class="p">,</span> <span class="n">pl_host</span><span class="p">,</span> <span class="n">pl_ptn</span><span class="p">,</span> <span class="n">ec</span><span class="p">,</span> <span class="n">proxy</span><span class="p">)</span>
+                <span class="k">else</span><span class="p">:</span>
+                    <span class="n">api</span><span class="o">.</span><span class="n">count</span> <span class="o">+=</span> <span class="mi">1</span>
+                <span class="k">return</span> <span class="n">api</span>
+        <span class="k">return</span> <span class="bp">None</span>
+</div>
+    <span class="nd">@classmethod</span> 
+<div class="viewcode-block" id="PLCAPIFactory.create_api"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.plcapi.PLCAPIFactory.create_api">[docs]</a>    <span class="k">def</span> <span class="nf">create_api</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">pl_user</span><span class="p">,</span> <span class="n">pl_pass</span><span class="p">,</span> <span class="n">pl_host</span><span class="p">,</span>
+            <span class="n">pl_ptn</span><span class="p">,</span> <span class="n">ec</span><span class="p">,</span> <span class="n">proxy</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Create an PLCAPI instance</span>
+
+<span class="sd">        :param pl_user: Planelab user name (used for web login)</span>
+<span class="sd">        :type pl_user: str</span>
+<span class="sd">        :param pl_pass: Planetlab password (used for web login)</span>
+<span class="sd">        :type pl_pass: str</span>
+<span class="sd">        :param pl_host: Planetlab registry host (e.g. &quot;www.planet-lab.eu&quot;)</span>
+<span class="sd">        :type pl_host: str</span>
+<span class="sd">        :param pl_ptn: XMLRPC service pattern (e.g. https://%(hostname)s:443/PLCAPI/)</span>
+<span class="sd">        :type pl_ptn: str</span>
+<span class="sd">        :param proxy: Proxy service url</span>
+<span class="sd">        :type pl_ptn: str</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">api</span> <span class="o">=</span> <span class="n">PLCAPI</span><span class="p">(</span><span class="n">username</span> <span class="o">=</span> <span class="n">pl_user</span><span class="p">,</span> <span class="n">password</span> <span class="o">=</span> <span class="n">pl_pass</span><span class="p">,</span> <span class="n">hostname</span> <span class="o">=</span> <span class="n">pl_host</span><span class="p">,</span>
+            <span class="n">urlpattern</span> <span class="o">=</span> <span class="n">pl_ptn</span><span class="p">,</span> <span class="n">ec</span> <span class="o">=</span> <span class="n">ec</span><span class="p">,</span> <span class="n">proxy</span> <span class="o">=</span> <span class="n">proxy</span><span class="p">)</span>
+        <span class="n">key</span> <span class="o">=</span> <span class="n">cls</span><span class="o">.</span><span class="n">_make_key</span><span class="p">(</span><span class="n">pl_user</span><span class="p">,</span> <span class="n">pl_host</span><span class="p">)</span>
+        <span class="n">cls</span><span class="o">.</span><span class="n">_apis</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">api</span>
+        <span class="k">return</span> <span class="n">api</span>
+</div>
+    <span class="nd">@classmethod</span> 
+    <span class="k">def</span> <span class="nf">_make_key</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot; Hash the credentials in order to create a key</span>
+
+<span class="sd">        :param args: list of arguments used to create the hash (user, host, port, ...)</span>
+<span class="sd">        :type args: list of args</span>
+
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">skey</span> <span class="o">=</span> <span class="s">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">args</span><span class="p">))</span>
+        <span class="k">return</span> <span class="n">hashlib</span><span class="o">.</span><span class="n">md5</span><span class="p">(</span><span class="n">skey</span><span class="p">)</span><span class="o">.</span><span class="n">hexdigest</span><span class="p">()</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