--- /dev/null
+<!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 — 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> »</li>
+ <li><a href="../../../index.html" accesskey="U">Module code</a> »</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 <http://www.gnu.org/licenses/>.</span>
+<span class="c">#</span>
+<span class="c"># Author: Alina Quereilhac <alina.quereilhac@inria.fr></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">'AddNodeTag'</span><span class="p">,</span> <span class="s">'AddConfFile'</span><span class="p">,</span> <span class="s">'DeletePersonTag'</span><span class="p">,</span> <span class="s">'AddNodeType'</span><span class="p">,</span>
+ <span class="s">'DeleteBootState'</span><span class="p">,</span> <span class="s">'SliceListNames'</span><span class="p">,</span> <span class="s">'DeleteKey'</span><span class="p">,</span><span class="s">'SliceGetTicket'</span><span class="p">,</span>
+ <span class="s">'SliceUsersList'</span><span class="p">,</span> <span class="s">'SliceUpdate'</span><span class="p">,</span> <span class="s">'GetNodeGroups'</span><span class="p">,</span> <span class="s">'SliceCreate'</span><span class="p">,</span>
+ <span class="s">'GetNetworkMethods'</span><span class="p">,</span> <span class="s">'GetNodeFlavour'</span><span class="p">,</span> <span class="s">'DeleteNode'</span><span class="p">,</span> <span class="s">'BootNotifyOwners'</span><span class="p">,</span>
+ <span class="s">'AddPersonKey'</span><span class="p">,</span> <span class="s">'AddNode'</span><span class="p">,</span> <span class="s">'UpdateNodeGroup'</span><span class="p">,</span> <span class="s">'GetAddressTypes'</span><span class="p">,</span>
+ <span class="s">'AddIlink'</span><span class="p">,</span> <span class="s">'DeleteNetworkType'</span><span class="p">,</span> <span class="s">'GetInitScripts'</span><span class="p">,</span> <span class="s">'GenerateNodeConfFile'</span><span class="p">,</span>
+ <span class="s">'AddSite'</span><span class="p">,</span> <span class="s">'BindObjectToPeer'</span><span class="p">,</span> <span class="s">'SliceListUserSlices'</span><span class="p">,</span> <span class="s">'GetPeers'</span><span class="p">,</span>
+ <span class="s">'AddPeer'</span><span class="p">,</span> <span class="s">'DeletePeer'</span><span class="p">,</span> <span class="s">'AddRole'</span><span class="p">,</span> <span class="s">'DeleteRole'</span><span class="p">,</span> <span class="s">'SetPersonPrimarySite'</span><span class="p">,</span>
+ <span class="s">'AddSiteAddress'</span><span class="p">,</span> <span class="s">'SliceDelete'</span><span class="p">,</span> <span class="s">'NotifyPersons'</span><span class="p">,</span> <span class="s">'GetKeyTypes'</span><span class="p">,</span>
+ <span class="s">'GetConfFiles'</span><span class="p">,</span> <span class="s">'GetIlinks'</span><span class="p">,</span> <span class="s">'AddTagType'</span><span class="p">,</span> <span class="s">'GetNodes'</span><span class="p">,</span> <span class="s">'DeleteNodeTag'</span><span class="p">,</span>
+ <span class="s">'DeleteSliceFromNodesWhitelist'</span><span class="p">,</span> <span class="s">'UpdateAddress'</span><span class="p">,</span> <span class="s">'ResetPassword'</span><span class="p">,</span>
+ <span class="s">'AddSliceToNodesWhitelist'</span><span class="p">,</span> <span class="s">'AddRoleToTagType'</span><span class="p">,</span> <span class="s">'AddLeases'</span><span class="p">,</span>
+ <span class="s">'GetAddresses'</span><span class="p">,</span> <span class="s">'AddInitScript'</span><span class="p">,</span> <span class="s">'RebootNode'</span><span class="p">,</span> <span class="s">'GetPCUTypes'</span><span class="p">,</span>
+ <span class="s">'RefreshPeer'</span><span class="p">,</span> <span class="s">'GetBootMedium'</span><span class="p">,</span> <span class="s">'UpdateKey'</span><span class="p">,</span> <span class="s">'UpdatePCU'</span><span class="p">,</span> <span class="s">'GetSession'</span><span class="p">,</span>
+ <span class="s">'AddInterfaceTag'</span><span class="p">,</span> <span class="s">'UpdatePCUType'</span><span class="p">,</span> <span class="s">'GetInterfaces'</span><span class="p">,</span> <span class="s">'SliceExtendedInfo'</span><span class="p">,</span>
+ <span class="s">'SliceNodesList'</span><span class="p">,</span> <span class="s">'DeleteRoleFromTagType'</span><span class="p">,</span> <span class="s">'DeleteSlice'</span><span class="p">,</span> <span class="s">'GetSites'</span><span class="p">,</span>
+ <span class="s">'DeleteMessage'</span><span class="p">,</span> <span class="s">'GetSliceFamily'</span><span class="p">,</span> <span class="s">'GetPlcRelease'</span><span class="p">,</span> <span class="s">'UpdateTagType'</span><span class="p">,</span>
+ <span class="s">'AddSliceInstantiation'</span><span class="p">,</span> <span class="s">'ResolveSlices'</span><span class="p">,</span> <span class="s">'GetSlices'</span><span class="p">,</span>
+ <span class="s">'DeleteRoleFromPerson'</span><span class="p">,</span> <span class="s">'GetSessions'</span><span class="p">,</span> <span class="s">'UpdatePeer'</span><span class="p">,</span> <span class="s">'VerifyPerson'</span><span class="p">,</span>
+ <span class="s">'GetPersonTags'</span><span class="p">,</span> <span class="s">'DeleteKeyType'</span><span class="p">,</span> <span class="s">'AddSlice'</span><span class="p">,</span> <span class="s">'SliceUserAdd'</span><span class="p">,</span>
+ <span class="s">'DeleteSession'</span><span class="p">,</span> <span class="s">'GetMessages'</span><span class="p">,</span> <span class="s">'DeletePCU'</span><span class="p">,</span> <span class="s">'GetPeerData'</span><span class="p">,</span>
+ <span class="s">'DeletePersonFromSite'</span><span class="p">,</span> <span class="s">'DeleteTagType'</span><span class="p">,</span> <span class="s">'GetPCUs'</span><span class="p">,</span> <span class="s">'UpdateLeases'</span><span class="p">,</span>
+ <span class="s">'AddMessage'</span><span class="p">,</span> <span class="s">'DeletePCUProtocolType'</span><span class="p">,</span> <span class="s">'DeleteInterfaceTag'</span><span class="p">,</span>
+ <span class="s">'AddPersonToSite'</span><span class="p">,</span> <span class="s">'GetSlivers'</span><span class="p">,</span> <span class="s">'SliceNodesDel'</span><span class="p">,</span>
+ <span class="s">'DeleteAddressTypeFromAddress'</span><span class="p">,</span> <span class="s">'AddNodeGroup'</span><span class="p">,</span> <span class="s">'GetSliceTags'</span><span class="p">,</span>
+ <span class="s">'DeleteSite'</span><span class="p">,</span> <span class="s">'GetSiteTags'</span><span class="p">,</span> <span class="s">'UpdateMessage'</span><span class="p">,</span> <span class="s">'DeleteSliceFromNodes'</span><span class="p">,</span>
+ <span class="s">'SliceRenew'</span><span class="p">,</span> <span class="s">'UpdatePCUProtocolType'</span><span class="p">,</span> <span class="s">'DeleteSiteTag'</span><span class="p">,</span>
+ <span class="s">'GetPCUProtocolTypes'</span><span class="p">,</span> <span class="s">'GetEvents'</span><span class="p">,</span> <span class="s">'GetSliceTicket'</span><span class="p">,</span> <span class="s">'AddPersonTag'</span><span class="p">,</span>
+ <span class="s">'BootGetNodeDetails'</span><span class="p">,</span> <span class="s">'DeleteInterface'</span><span class="p">,</span> <span class="s">'DeleteNodeGroup'</span><span class="p">,</span>
+ <span class="s">'AddPCUProtocolType'</span><span class="p">,</span> <span class="s">'BootCheckAuthentication'</span><span class="p">,</span> <span class="s">'AddSiteTag'</span><span class="p">,</span>
+ <span class="s">'AddAddressTypeToAddress'</span><span class="p">,</span> <span class="s">'DeleteConfFile'</span><span class="p">,</span> <span class="s">'DeleteInitScript'</span><span class="p">,</span>
+ <span class="s">'DeletePerson'</span><span class="p">,</span> <span class="s">'DeleteIlink'</span><span class="p">,</span> <span class="s">'DeleteAddressType'</span><span class="p">,</span> <span class="s">'AddBootState'</span><span class="p">,</span>
+ <span class="s">'AuthCheck'</span><span class="p">,</span> <span class="s">'NotifySupport'</span><span class="p">,</span> <span class="s">'GetSliceInstantiations'</span><span class="p">,</span> <span class="s">'AddPCUType'</span><span class="p">,</span>
+ <span class="s">'AddPCU'</span><span class="p">,</span> <span class="s">'AddSession'</span><span class="p">,</span> <span class="s">'GetEventObjects'</span><span class="p">,</span> <span class="s">'UpdateSiteTag'</span><span class="p">,</span>
+ <span class="s">'UpdateNodeTag'</span><span class="p">,</span> <span class="s">'AddPerson'</span><span class="p">,</span> <span class="s">'BlacklistKey'</span><span class="p">,</span> <span class="s">'UpdateInitScript'</span><span class="p">,</span>
+ <span class="s">'AddSliceToNodes'</span><span class="p">,</span> <span class="s">'RebootNodeWithPCU'</span><span class="p">,</span> <span class="s">'GetNodeTags'</span><span class="p">,</span> <span class="s">'GetSliceKeys'</span><span class="p">,</span>
+ <span class="s">'GetSliceSshKeys'</span><span class="p">,</span> <span class="s">'AddNetworkMethod'</span><span class="p">,</span> <span class="s">'SliceNodesAdd'</span><span class="p">,</span>
+ <span class="s">'DeletePersonFromSlice'</span><span class="p">,</span> <span class="s">'ReportRunlevel'</span><span class="p">,</span> <span class="s">'GetNetworkTypes'</span><span class="p">,</span>
+ <span class="s">'UpdateSite'</span><span class="p">,</span> <span class="s">'DeleteConfFileFromNodeGroup'</span><span class="p">,</span> <span class="s">'UpdateNode'</span><span class="p">,</span>
+ <span class="s">'DeleteSliceInstantiation'</span><span class="p">,</span> <span class="s">'DeleteSliceTag'</span><span class="p">,</span> <span class="s">'BootUpdateNode'</span><span class="p">,</span>
+ <span class="s">'UpdatePerson'</span><span class="p">,</span> <span class="s">'UpdateConfFile'</span><span class="p">,</span> <span class="s">'SliceUserDel'</span><span class="p">,</span> <span class="s">'DeleteLeases'</span><span class="p">,</span>
+ <span class="s">'AddConfFileToNodeGroup'</span><span class="p">,</span> <span class="s">'UpdatePersonTag'</span><span class="p">,</span> <span class="s">'DeleteConfFileFromNode'</span><span class="p">,</span>
+ <span class="s">'AddPersonToSlice'</span><span class="p">,</span> <span class="s">'UnBindObjectFromPeer'</span><span class="p">,</span> <span class="s">'AddNodeToPCU'</span><span class="p">,</span>
+ <span class="s">'GetLeaseGranularity'</span><span class="p">,</span> <span class="s">'DeletePCUType'</span><span class="p">,</span> <span class="s">'GetTagTypes'</span><span class="p">,</span> <span class="s">'GetNodeTypes'</span><span class="p">,</span>
+ <span class="s">'UpdateInterfaceTag'</span><span class="p">,</span> <span class="s">'GetRoles'</span><span class="p">,</span> <span class="s">'UpdateSlice'</span><span class="p">,</span> <span class="s">'UpdateSliceTag'</span><span class="p">,</span>
+ <span class="s">'AddSliceTag'</span><span class="p">,</span> <span class="s">'AddNetworkType'</span><span class="p">,</span> <span class="s">'AddInterface'</span><span class="p">,</span> <span class="s">'AddAddressType'</span><span class="p">,</span>
+ <span class="s">'AddRoleToPerson'</span><span class="p">,</span> <span class="s">'DeleteNodeType'</span><span class="p">,</span> <span class="s">'GetLeases'</span><span class="p">,</span> <span class="s">'UpdateInterface'</span><span class="p">,</span>
+ <span class="s">'SliceInfo'</span><span class="p">,</span> <span class="s">'DeleteAddress'</span><span class="p">,</span> <span class="s">'SliceTicketGet'</span><span class="p">,</span> <span class="s">'GetPersons'</span><span class="p">,</span>
+ <span class="s">'GetWhitelist'</span><span class="p">,</span> <span class="s">'AddKeyType'</span><span class="p">,</span> <span class="s">'UpdateAddressType'</span><span class="p">,</span> <span class="s">'GetPeerName'</span><span class="p">,</span>
+ <span class="s">'DeleteNetworkMethod'</span><span class="p">,</span> <span class="s">'UpdateIlink'</span><span class="p">,</span> <span class="s">'AddConfFileToNode'</span><span class="p">,</span> <span class="s">'GetKeys'</span><span class="p">,</span>
+ <span class="s">'DeleteNodeFromPCU'</span><span class="p">,</span> <span class="s">'GetInterfaceTags'</span><span class="p">,</span> <span class="s">'GetBootStates'</span><span class="p">,</span>
+ <span class="s">'SetInterfaceSens'</span><span class="p">,</span> <span class="s">'SetNodeLoadm'</span><span class="p">,</span> <span class="s">'GetInterfaceRate'</span><span class="p">,</span> <span class="s">'GetNodeLoadw'</span><span class="p">,</span>
+ <span class="s">'SetInterfaceKey'</span><span class="p">,</span> <span class="s">'GetNodeSlices'</span><span class="p">,</span> <span class="s">'GetNodeLoadm'</span><span class="p">,</span> <span class="s">'SetSliceVref'</span><span class="p">,</span>
+ <span class="s">'GetInterfaceIwpriv'</span><span class="p">,</span> <span class="s">'SetNodeLoadw'</span><span class="p">,</span> <span class="s">'SetNodeSerial'</span><span class="p">,</span>
+ <span class="s">'GetNodePlainBootstrapfs'</span><span class="p">,</span> <span class="s">'SetNodeMEMw'</span><span class="p">,</span> <span class="s">'GetNodeResponse'</span><span class="p">,</span>
+ <span class="s">'SetInterfaceRate'</span><span class="p">,</span> <span class="s">'SetSliceInitscript'</span><span class="p">,</span> <span class="s">'SetNodeFcdistro'</span><span class="p">,</span>
+ <span class="s">'GetNodeLoady'</span><span class="p">,</span> <span class="s">'SetNodeArch'</span><span class="p">,</span> <span class="s">'SetNodeKargs'</span><span class="p">,</span> <span class="s">'SetNodeMEMm'</span><span class="p">,</span>
+ <span class="s">'SetNodeBWy'</span><span class="p">,</span> <span class="s">'SetNodeBWw'</span><span class="p">,</span> <span class="s">'SetInterfaceSecurityMode'</span><span class="p">,</span> <span class="s">'SetNodeBWm'</span><span class="p">,</span>
+ <span class="s">'SetNodeASType'</span><span class="p">,</span> <span class="s">'GetNodeKargs'</span><span class="p">,</span> <span class="s">'GetPersonColumnconf'</span><span class="p">,</span>
+ <span class="s">'GetNodeResponsem'</span><span class="p">,</span> <span class="s">'GetNodeCPUy'</span><span class="p">,</span> <span class="s">'GetNodeCramfs'</span><span class="p">,</span> <span class="s">'SetNodeSlicesw'</span><span class="p">,</span>
+ <span class="s">'SetPersonColumnconf'</span><span class="p">,</span> <span class="s">'SetNodeSlicesy'</span><span class="p">,</span> <span class="s">'GetNodeCPUw'</span><span class="p">,</span> <span class="s">'GetNodeBWy'</span><span class="p">,</span>
+ <span class="s">'GetNodeCPUm'</span><span class="p">,</span> <span class="s">'GetInterfaceDriver'</span><span class="p">,</span> <span class="s">'GetNodeLoad'</span><span class="p">,</span> <span class="s">'GetInterfaceMode'</span><span class="p">,</span>
+ <span class="s">'GetNodeSerial'</span><span class="p">,</span> <span class="s">'SetNodeSlicesm'</span><span class="p">,</span> <span class="s">'SetNodeLoady'</span><span class="p">,</span> <span class="s">'GetNodeReliabilityw'</span><span class="p">,</span>
+ <span class="s">'SetSliceFcdistro'</span><span class="p">,</span> <span class="s">'GetNodeReliabilityy'</span><span class="p">,</span> <span class="s">'SetInterfaceEssid'</span><span class="p">,</span>
+ <span class="s">'SetSliceInitscriptCode'</span><span class="p">,</span> <span class="s">'GetNodeExtensions'</span><span class="p">,</span> <span class="s">'GetSliceOmfControl'</span><span class="p">,</span>
+ <span class="s">'SetNodeCity'</span><span class="p">,</span> <span class="s">'SetInterfaceIfname'</span><span class="p">,</span> <span class="s">'SetNodeHrn'</span><span class="p">,</span> <span class="s">'SetNodeNoHangcheck'</span><span class="p">,</span>
+ <span class="s">'GetNodeNoHangcheck'</span><span class="p">,</span> <span class="s">'GetSliceFcdistro'</span><span class="p">,</span> <span class="s">'SetNodeCountry'</span><span class="p">,</span>
+ <span class="s">'SetNodeKvariant'</span><span class="p">,</span> <span class="s">'GetNodeKvariant'</span><span class="p">,</span> <span class="s">'GetNodeMEMy'</span><span class="p">,</span> <span class="s">'SetInterfaceIwpriv'</span><span class="p">,</span>
+ <span class="s">'GetNodeMEMw'</span><span class="p">,</span> <span class="s">'SetInterfaceBackdoor'</span><span class="p">,</span> <span class="s">'GetInterfaceFreq'</span><span class="p">,</span>
+ <span class="s">'SetInterfaceChannel'</span><span class="p">,</span> <span class="s">'SetInterfaceNw'</span><span class="p">,</span> <span class="s">'GetPersonShowconf'</span><span class="p">,</span>
+ <span class="s">'GetSliceInitscriptCode'</span><span class="p">,</span> <span class="s">'SetNodeMEM'</span><span class="p">,</span> <span class="s">'GetInterfaceEssid'</span><span class="p">,</span> <span class="s">'GetNodeMEMm'</span><span class="p">,</span>
+ <span class="s">'SetInterfaceMode'</span><span class="p">,</span> <span class="s">'SetInterfaceIwconfig'</span><span class="p">,</span> <span class="s">'GetNodeSlicesm'</span><span class="p">,</span> <span class="s">'GetNodeBWm'</span><span class="p">,</span>
+ <span class="s">'SetNodePlainBootstrapfs'</span><span class="p">,</span> <span class="s">'SetNodeRegion'</span><span class="p">,</span> <span class="s">'SetNodeCPU'</span><span class="p">,</span> <span class="s">'GetNodeSlicesw'</span><span class="p">,</span>
+ <span class="s">'SetNodeBW'</span><span class="p">,</span> <span class="s">'SetNodeSlices'</span><span class="p">,</span> <span class="s">'SetNodeCramfs'</span><span class="p">,</span> <span class="s">'GetNodeSlicesy'</span><span class="p">,</span>
+ <span class="s">'GetInterfaceKey'</span><span class="p">,</span> <span class="s">'GetSliceInitscript'</span><span class="p">,</span> <span class="s">'SetNodeCPUm'</span><span class="p">,</span> <span class="s">'SetSliceArch'</span><span class="p">,</span>
+ <span class="s">'SetNodeLoad'</span><span class="p">,</span> <span class="s">'SetNodeResponse'</span><span class="p">,</span> <span class="s">'GetSliceSliverHMAC'</span><span class="p">,</span> <span class="s">'GetNodeBWw'</span><span class="p">,</span>
+ <span class="s">'GetNodeRegion'</span><span class="p">,</span> <span class="s">'SetNodeMEMy'</span><span class="p">,</span> <span class="s">'GetNodeASType'</span><span class="p">,</span> <span class="s">'SetNodePldistro'</span><span class="p">,</span>
+ <span class="s">'GetSliceArch'</span><span class="p">,</span> <span class="s">'GetNodeCountry'</span><span class="p">,</span> <span class="s">'SetSliceOmfControl'</span><span class="p">,</span> <span class="s">'GetNodeHrn'</span><span class="p">,</span>
+ <span class="s">'GetNodeCity'</span><span class="p">,</span> <span class="s">'SetInterfaceAlias'</span><span class="p">,</span> <span class="s">'GetNodeBW'</span><span class="p">,</span> <span class="s">'GetNodePldistro'</span><span class="p">,</span>
+ <span class="s">'GetSlicePldistro'</span><span class="p">,</span> <span class="s">'SetNodeASNumber'</span><span class="p">,</span> <span class="s">'GetSliceHmac'</span><span class="p">,</span> <span class="s">'SetSliceHmac'</span><span class="p">,</span>
+ <span class="s">'GetNodeMEM'</span><span class="p">,</span> <span class="s">'GetNodeASNumber'</span><span class="p">,</span> <span class="s">'GetInterfaceAlias'</span><span class="p">,</span> <span class="s">'GetSliceVref'</span><span class="p">,</span>
+ <span class="s">'GetNodeArch'</span><span class="p">,</span> <span class="s">'GetSliceSshKey'</span><span class="p">,</span> <span class="s">'GetInterfaceKey4'</span><span class="p">,</span> <span class="s">'GetInterfaceKey2'</span><span class="p">,</span>
+ <span class="s">'GetInterfaceKey3'</span><span class="p">,</span> <span class="s">'GetInterfaceKey1'</span><span class="p">,</span> <span class="s">'GetInterfaceBackdoor'</span><span class="p">,</span>
+ <span class="s">'GetInterfaceIfname'</span><span class="p">,</span> <span class="s">'SetSliceSliverHMAC'</span><span class="p">,</span> <span class="s">'SetNodeReliability'</span><span class="p">,</span>
+ <span class="s">'GetNodeCPU'</span><span class="p">,</span> <span class="s">'SetPersonShowconf'</span><span class="p">,</span> <span class="s">'SetNodeExtensions'</span><span class="p">,</span> <span class="s">'SetNodeCPUy'</span><span class="p">,</span>
+ <span class="s">'SetNodeCPUw'</span><span class="p">,</span> <span class="s">'GetNodeResponsew'</span><span class="p">,</span> <span class="s">'SetNodeResponsey'</span><span class="p">,</span> <span class="s">'GetInterfaceSens'</span><span class="p">,</span>
+ <span class="s">'SetNodeResponsew'</span><span class="p">,</span> <span class="s">'GetNodeResponsey'</span><span class="p">,</span> <span class="s">'GetNodeReliability'</span><span class="p">,</span>
+ <span class="s">'GetNodeReliabilitym'</span><span class="p">,</span> <span class="s">'SetNodeResponsem'</span><span class="p">,</span> <span class="s">'SetInterfaceDriver'</span><span class="p">,</span>
+ <span class="s">'GetInterfaceSecurityMode'</span><span class="p">,</span> <span class="s">'SetNodeDeployment'</span><span class="p">,</span> <span class="s">'SetNodeReliabilitym'</span><span class="p">,</span>
+ <span class="s">'GetNodeFcdistro'</span><span class="p">,</span> <span class="s">'SetInterfaceFreq'</span><span class="p">,</span> <span class="s">'GetInterfaceNw'</span><span class="p">,</span>
+ <span class="s">'SetNodeReliabilityy'</span><span class="p">,</span> <span class="s">'SetNodeReliabilityw'</span><span class="p">,</span> <span class="s">'GetInterfaceIwconfig'</span><span class="p">,</span>
+ <span class="s">'SetSlicePldistro'</span><span class="p">,</span> <span class="s">'SetSliceSshKey'</span><span class="p">,</span> <span class="s">'GetNodeDeployment'</span><span class="p">,</span>
+ <span class="s">'GetInterfaceChannel'</span><span class="p">,</span> <span class="s">'SetInterfaceKey2'</span><span class="p">,</span> <span class="s">'SetInterfaceKey3'</span><span class="p">,</span>
+ <span class="s">'SetInterfaceKey1'</span><span class="p">,</span> <span class="s">'SetInterfaceKey4'</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">"PLE"</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">'session'</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">'password'</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">'anonymous'</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">'hostname'</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">"https"</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">'https://</span><span class="si">%s%s</span><span class="s">'</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">'User-agent'</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">'planetlab::Node'</span><span class="p">,</span> <span class="s">'persist_blacklist'</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">"Unsupported REQUIRED methods: </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="p">(</span>
+ <span class="s">", "</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">"Unsupported EXPECTED methods: </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="p">(</span>
+ <span class="s">", "</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">"~"</span><span class="p">),</span> <span class="s">".nepi"</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">"plblacklist.txt"</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">'r'</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">'node_id'</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">'node_id'</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">'shortname'</span><span class="p">,</span><span class="s">'peername'</span><span class="p">,</span><span class="s">'peer_id'</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">'shortname'</span><span class="p">],</span> <span class="n">peer</span><span class="p">[</span><span class="s">'peer_id'</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">'peername'</span><span class="p">],</span> <span class="n">peer</span><span class="p">[</span><span class="s">'peer_id'</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">'peer_id'</span><span class="p">],</span> <span class="n">peer</span><span class="p">[</span><span class="s">'shortname'</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">"""</span>
+<span class="sd"> Returns detailed information on a given node'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"> 'arch', 'pldistro', 'fcdistro', 'deployment', 'extensions'</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"> """</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">"Node must be either a non-unicode string or an int"</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">"""</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"> """</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">'filters'</span><span class="p">,{})</span>
+
+ <span class="k">if</span> <span class="s">'peer'</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">'peer'</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">'__iter__'</span><span class="p">):</span>
+ <span class="c"># we can'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">'peer_id'</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">'filters'</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">'filters'</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">'filters'</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">'filters'</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">'node_ids'</span><span class="p">])[</span><span class="mi">0</span><span class="p">][</span><span class="s">'node_ids'</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">'tagname'</span><span class="p">,</span><span class="s">'value'</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">'slice_id'</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">'slice_id'</span><span class="p">]</span>
+
+ <span class="c"># If it wasn't found, don'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">'vsys_vnet'</span><span class="p">,</span>
+ <span class="n">fields</span><span class="o">=</span><span class="p">(</span><span class="s">'value'</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">'value'</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">'PlanetlabNode'</span><span class="p">,</span> <span class="s">'persist_blacklist'</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">'hostname'</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">'hostname'</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">"~"</span><span class="p">),</span> <span class="s">".nepi"</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">"plblacklist.txt"</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">'w'</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">"</span><span class="si">%s</span><span class="se">\n</span><span class="s">"</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">""" </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"> """</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">""" 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. "www.planet-lab.eu")</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"> """</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">""" 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. "www.planet-lab.eu")</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"> """</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">""" 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"> """</span>
+ <span class="n">skey</span> <span class="o">=</span> <span class="s">""</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> »</li>
+ <li><a href="../../../index.html" >Module code</a> »</li>
+ </ul>
+ </div>
+ <div class="footer">
+ © 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