add sphinx documentation
[nepi.git] / doc / sphinx / _build / html / _modules / nepi / resources / planetlab / sfa_node.html
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
4
5 <html xmlns="http://www.w3.org/1999/xhtml">
6   <head>
7     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
8     
9     <title>nepi.resources.planetlab.sfa_node &mdash; NEPI 3.0 documentation</title>
10     
11     <link rel="stylesheet" href="../../../../_static/sphinxdoc.css" type="text/css" />
12     <link rel="stylesheet" href="../../../../_static/pygments.css" type="text/css" />
13     
14     <script type="text/javascript">
15       var DOCUMENTATION_OPTIONS = {
16         URL_ROOT:    '../../../../',
17         VERSION:     '3.0',
18         COLLAPSE_INDEX: false,
19         FILE_SUFFIX: '.html',
20         HAS_SOURCE:  true
21       };
22     </script>
23     <script type="text/javascript" src="../../../../_static/jquery.js"></script>
24     <script type="text/javascript" src="../../../../_static/underscore.js"></script>
25     <script type="text/javascript" src="../../../../_static/doctools.js"></script>
26     <link rel="top" title="NEPI 3.0 documentation" href="../../../../index.html" />
27     <link rel="up" title="Module code" href="../../../index.html" /> 
28   </head>
29   <body>
30     <div class="related">
31       <h3>Navigation</h3>
32       <ul>
33         <li class="right" style="margin-right: 10px">
34           <a href="../../../../genindex.html" title="General Index"
35              accesskey="I">index</a></li>
36         <li class="right" >
37           <a href="../../../../py-modindex.html" title="Python Module Index"
38              >modules</a> |</li>
39         <li><a href="../../../../index.html">NEPI 3.0 documentation</a> &raquo;</li>
40           <li><a href="../../../index.html" accesskey="U">Module code</a> &raquo;</li> 
41       </ul>
42     </div>
43       <div class="sphinxsidebar">
44         <div class="sphinxsidebarwrapper">
45 <div id="searchbox" style="display: none">
46   <h3>Quick search</h3>
47     <form class="search" action="../../../../search.html" method="get">
48       <input type="text" name="q" />
49       <input type="submit" value="Go" />
50       <input type="hidden" name="check_keywords" value="yes" />
51       <input type="hidden" name="area" value="default" />
52     </form>
53     <p class="searchtip" style="font-size: 90%">
54     Enter search terms or a module, class or function name.
55     </p>
56 </div>
57 <script type="text/javascript">$('#searchbox').show(0);</script>
58         </div>
59       </div>
60
61     <div class="document">
62       <div class="documentwrapper">
63         <div class="bodywrapper">
64           <div class="body">
65             
66   <h1>Source code for nepi.resources.planetlab.sfa_node</h1><div class="highlight"><pre>
67 <span class="c">#</span>
68 <span class="c">#    NEPI, a framework to manage network experiments</span>
69 <span class="c">#    Copyright (C) 2013 INRIA</span>
70 <span class="c">#</span>
71 <span class="c">#    This program is free software: you can redistribute it and/or modify</span>
72 <span class="c">#    it under the terms of the GNU General Public License version 2 as</span>
73 <span class="c">#    published by the Free Software Foundation;</span>
74 <span class="c">#</span>
75 <span class="c">#    This program is distributed in the hope that it will be useful,</span>
76 <span class="c">#    but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
77 <span class="c">#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span>
78 <span class="c">#    GNU General Public License for more details.</span>
79 <span class="c">#</span>
80 <span class="c">#    You should have received a copy of the GNU General Public License</span>
81 <span class="c">#    along with this program.  If not, see &lt;http://www.gnu.org/licenses/&gt;.</span>
82 <span class="c">#</span>
83 <span class="c"># Author: Lucia Guevgeozian &lt;lucia.guevgeozian_odizzio@inria.fr&gt;</span>
84
85 <span class="kn">from</span> <span class="nn">nepi.execution.attribute</span> <span class="kn">import</span> <span class="n">Attribute</span><span class="p">,</span> <span class="n">Flags</span><span class="p">,</span> <span class="n">Types</span>
86 <span class="kn">from</span> <span class="nn">nepi.execution.resource</span> <span class="kn">import</span> <span class="n">ResourceManager</span><span class="p">,</span> <span class="n">clsinit_copy</span><span class="p">,</span> \
87         <span class="n">ResourceState</span>
88 <span class="kn">from</span> <span class="nn">nepi.resources.linux.node</span> <span class="kn">import</span> <span class="n">LinuxNode</span>
89 <span class="kn">from</span> <span class="nn">nepi.util.sfaapi</span> <span class="kn">import</span> <span class="n">SFAAPIFactory</span> 
90 <span class="kn">from</span> <span class="nn">nepi.util.execfuncs</span> <span class="kn">import</span> <span class="n">lexec</span>
91 <span class="kn">from</span> <span class="nn">nepi.util</span> <span class="kn">import</span> <span class="n">sshfuncs</span>
92
93 <span class="kn">from</span> <span class="nn">random</span> <span class="kn">import</span> <span class="n">randint</span>
94 <span class="kn">import</span> <span class="nn">re</span>
95 <span class="kn">import</span> <span class="nn">os</span>
96 <span class="kn">import</span> <span class="nn">weakref</span>
97 <span class="kn">import</span> <span class="nn">time</span>
98 <span class="kn">import</span> <span class="nn">socket</span>
99 <span class="kn">import</span> <span class="nn">threading</span>
100 <span class="kn">import</span> <span class="nn">datetime</span>
101
102 <span class="nd">@clsinit_copy</span>
103 <div class="viewcode-block" id="PlanetlabSfaNode"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.sfa_node.PlanetlabSfaNode">[docs]</a><span class="k">class</span> <span class="nc">PlanetlabSfaNode</span><span class="p">(</span><span class="n">LinuxNode</span><span class="p">):</span>
104     <span class="n">_rtype</span> <span class="o">=</span> <span class="s">&quot;planetlab::sfa::Node&quot;</span>
105     <span class="n">_help</span> <span class="o">=</span> <span class="s">&quot;Controls a PlanetLab host accessible using a SSH key &quot;</span> \
106             <span class="s">&quot;and provisioned using SFA&quot;</span>
107     <span class="n">_platform</span> <span class="o">=</span> <span class="s">&quot;planetlab&quot;</span>
108
109     <span class="nd">@classmethod</span>
110     <span class="k">def</span> <span class="nf">_register_attributes</span><span class="p">(</span><span class="n">cls</span><span class="p">):</span>
111
112         <span class="n">sfa_user</span> <span class="o">=</span> <span class="n">Attribute</span><span class="p">(</span><span class="s">&quot;sfauser&quot;</span><span class="p">,</span> <span class="s">&quot;SFA user&quot;</span><span class="p">,</span>
113                     <span class="n">flags</span> <span class="o">=</span> <span class="n">Flags</span><span class="o">.</span><span class="n">Credential</span><span class="p">)</span>
114
115         <span class="n">sfa_private_key</span> <span class="o">=</span> <span class="n">Attribute</span><span class="p">(</span><span class="s">&quot;sfaPrivateKey&quot;</span><span class="p">,</span> <span class="s">&quot;SFA path to the private key </span><span class="se">\</span>
116 <span class="s">                            used to generate the user credential&quot;</span><span class="p">)</span>
117
118         <span class="n">city</span> <span class="o">=</span> <span class="n">Attribute</span><span class="p">(</span><span class="s">&quot;city&quot;</span><span class="p">,</span> <span class="s">&quot;Constrain location (city) during resource </span><span class="se">\</span>
119 <span class="s">                discovery. May use wildcards.&quot;</span><span class="p">,</span>
120                 <span class="n">flags</span> <span class="o">=</span> <span class="n">Flags</span><span class="o">.</span><span class="n">Filter</span><span class="p">)</span>
121
122         <span class="n">country</span> <span class="o">=</span> <span class="n">Attribute</span><span class="p">(</span><span class="s">&quot;country&quot;</span><span class="p">,</span> <span class="s">&quot;Constrain location (country) during </span><span class="se">\</span>
123 <span class="s">                    resource discovery. May use wildcards.&quot;</span><span class="p">,</span>
124                     <span class="n">flags</span> <span class="o">=</span> <span class="n">Flags</span><span class="o">.</span><span class="n">Filter</span><span class="p">)</span>
125
126         <span class="n">region</span> <span class="o">=</span> <span class="n">Attribute</span><span class="p">(</span><span class="s">&quot;region&quot;</span><span class="p">,</span> <span class="s">&quot;Constrain location (region) during </span><span class="se">\</span>
127 <span class="s">                    resource discovery. May use wildcards.&quot;</span><span class="p">,</span>
128                     <span class="n">flags</span> <span class="o">=</span> <span class="n">Flags</span><span class="o">.</span><span class="n">Filter</span><span class="p">)</span>
129
130         <span class="n">architecture</span> <span class="o">=</span> <span class="n">Attribute</span><span class="p">(</span><span class="s">&quot;architecture&quot;</span><span class="p">,</span> <span class="s">&quot;Constrain architecture </span><span class="se">\</span>
131 <span class="s">                        during resource discovery.&quot;</span><span class="p">,</span>
132                         <span class="nb">type</span> <span class="o">=</span> <span class="n">Types</span><span class="o">.</span><span class="n">Enumerate</span><span class="p">,</span>
133                         <span class="n">allowed</span> <span class="o">=</span> <span class="p">[</span><span class="s">&quot;x86_64&quot;</span><span class="p">,</span> 
134                                     <span class="s">&quot;i386&quot;</span><span class="p">],</span>
135                         <span class="n">flags</span> <span class="o">=</span> <span class="n">Flags</span><span class="o">.</span><span class="n">Filter</span><span class="p">)</span>
136
137         <span class="n">operating_system</span> <span class="o">=</span> <span class="n">Attribute</span><span class="p">(</span><span class="s">&quot;operatingSystem&quot;</span><span class="p">,</span> <span class="s">&quot;Constrain operating </span><span class="se">\</span>
138 <span class="s">                            system during resource discovery.&quot;</span><span class="p">,</span>
139                             <span class="nb">type</span> <span class="o">=</span> <span class="n">Types</span><span class="o">.</span><span class="n">Enumerate</span><span class="p">,</span>
140                             <span class="n">allowed</span> <span class="o">=</span>  <span class="p">[</span><span class="s">&quot;f8&quot;</span><span class="p">,</span>
141                                         <span class="s">&quot;f12&quot;</span><span class="p">,</span>
142                                         <span class="s">&quot;f14&quot;</span><span class="p">,</span>
143                                         <span class="s">&quot;centos&quot;</span><span class="p">,</span>
144                                         <span class="s">&quot;other&quot;</span><span class="p">],</span>
145                             <span class="n">flags</span> <span class="o">=</span> <span class="n">Flags</span><span class="o">.</span><span class="n">Filter</span><span class="p">)</span>
146
147         <span class="n">min_reliability</span> <span class="o">=</span> <span class="n">Attribute</span><span class="p">(</span><span class="s">&quot;minReliability&quot;</span><span class="p">,</span> <span class="s">&quot;Constrain reliability </span><span class="se">\</span>
148 <span class="s">                            while picking PlanetLab nodes. Specifies a lower </span><span class="se">\</span>
149 <span class="s">                            acceptable bound.&quot;</span><span class="p">,</span>
150                             <span class="nb">type</span> <span class="o">=</span> <span class="n">Types</span><span class="o">.</span><span class="n">Double</span><span class="p">,</span>
151                             <span class="nb">range</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">100</span><span class="p">),</span>
152                             <span class="n">flags</span> <span class="o">=</span> <span class="n">Flags</span><span class="o">.</span><span class="n">Filter</span><span class="p">)</span>
153
154         <span class="n">max_reliability</span> <span class="o">=</span> <span class="n">Attribute</span><span class="p">(</span><span class="s">&quot;maxReliability&quot;</span><span class="p">,</span> <span class="s">&quot;Constrain reliability </span><span class="se">\</span>
155 <span class="s">                            while picking PlanetLab nodes. Specifies an upper </span><span class="se">\</span>
156 <span class="s">                            acceptable bound.&quot;</span><span class="p">,</span>
157                             <span class="nb">type</span> <span class="o">=</span> <span class="n">Types</span><span class="o">.</span><span class="n">Double</span><span class="p">,</span>
158                             <span class="nb">range</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">100</span><span class="p">),</span>
159                             <span class="n">flags</span> <span class="o">=</span> <span class="n">Flags</span><span class="o">.</span><span class="n">Filter</span><span class="p">)</span>
160
161         <span class="n">min_bandwidth</span> <span class="o">=</span> <span class="n">Attribute</span><span class="p">(</span><span class="s">&quot;minBandwidth&quot;</span><span class="p">,</span> <span class="s">&quot;Constrain available </span><span class="se">\</span>
162 <span class="s">                            bandwidth while picking PlanetLab nodes. </span><span class="se">\</span>
163 <span class="s">                            Specifies a lower acceptable bound.&quot;</span><span class="p">,</span>
164                             <span class="nb">type</span> <span class="o">=</span> <span class="n">Types</span><span class="o">.</span><span class="n">Double</span><span class="p">,</span>
165                             <span class="nb">range</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="o">**</span><span class="mi">31</span><span class="p">),</span>
166                             <span class="n">flags</span> <span class="o">=</span> <span class="n">Flags</span><span class="o">.</span><span class="n">Filter</span><span class="p">)</span>
167
168         <span class="n">max_bandwidth</span> <span class="o">=</span> <span class="n">Attribute</span><span class="p">(</span><span class="s">&quot;maxBandwidth&quot;</span><span class="p">,</span> <span class="s">&quot;Constrain available </span><span class="se">\</span>
169 <span class="s">                            bandwidth while picking PlanetLab nodes. </span><span class="se">\</span>
170 <span class="s">                            Specifies an upper acceptable bound.&quot;</span><span class="p">,</span>
171                             <span class="nb">type</span> <span class="o">=</span> <span class="n">Types</span><span class="o">.</span><span class="n">Double</span><span class="p">,</span>
172                             <span class="nb">range</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="o">**</span><span class="mi">31</span><span class="p">),</span>
173                             <span class="n">flags</span> <span class="o">=</span> <span class="n">Flags</span><span class="o">.</span><span class="n">Filter</span><span class="p">)</span>
174
175         <span class="n">min_load</span> <span class="o">=</span> <span class="n">Attribute</span><span class="p">(</span><span class="s">&quot;minLoad&quot;</span><span class="p">,</span> <span class="s">&quot;Constrain node load average while </span><span class="se">\</span>
176 <span class="s">                    picking PlanetLab nodes. Specifies a lower acceptable </span><span class="se">\</span>
177 <span class="s">                    bound.&quot;</span><span class="p">,</span>
178                     <span class="nb">type</span> <span class="o">=</span> <span class="n">Types</span><span class="o">.</span><span class="n">Double</span><span class="p">,</span>
179                     <span class="nb">range</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="o">**</span><span class="mi">31</span><span class="p">),</span>
180                     <span class="n">flags</span> <span class="o">=</span> <span class="n">Flags</span><span class="o">.</span><span class="n">Filter</span><span class="p">)</span>
181
182         <span class="n">max_load</span> <span class="o">=</span> <span class="n">Attribute</span><span class="p">(</span><span class="s">&quot;maxLoad&quot;</span><span class="p">,</span> <span class="s">&quot;Constrain node load average while </span><span class="se">\</span>
183 <span class="s">                    picking PlanetLab nodes. Specifies an upper acceptable </span><span class="se">\</span>
184 <span class="s">                    bound.&quot;</span><span class="p">,</span>
185                     <span class="nb">type</span> <span class="o">=</span> <span class="n">Types</span><span class="o">.</span><span class="n">Double</span><span class="p">,</span>
186                     <span class="nb">range</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="o">**</span><span class="mi">31</span><span class="p">),</span>
187                     <span class="n">flags</span> <span class="o">=</span> <span class="n">Flags</span><span class="o">.</span><span class="n">Filter</span><span class="p">)</span>
188
189         <span class="n">min_cpu</span> <span class="o">=</span> <span class="n">Attribute</span><span class="p">(</span><span class="s">&quot;minCpu&quot;</span><span class="p">,</span> <span class="s">&quot;Constrain available cpu time while </span><span class="se">\</span>
190 <span class="s">                    picking PlanetLab nodes. Specifies a lower acceptable </span><span class="se">\</span>
191 <span class="s">                    bound.&quot;</span><span class="p">,</span>
192                     <span class="nb">type</span> <span class="o">=</span> <span class="n">Types</span><span class="o">.</span><span class="n">Double</span><span class="p">,</span>
193                     <span class="nb">range</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">100</span><span class="p">),</span>
194                     <span class="n">flags</span> <span class="o">=</span> <span class="n">Flags</span><span class="o">.</span><span class="n">Filter</span><span class="p">)</span>
195
196         <span class="n">max_cpu</span> <span class="o">=</span> <span class="n">Attribute</span><span class="p">(</span><span class="s">&quot;maxCpu&quot;</span><span class="p">,</span> <span class="s">&quot;Constrain available cpu time while </span><span class="se">\</span>
197 <span class="s">                    picking PlanetLab nodes. Specifies an upper acceptable </span><span class="se">\</span>
198 <span class="s">                    bound.&quot;</span><span class="p">,</span>
199                     <span class="nb">type</span> <span class="o">=</span> <span class="n">Types</span><span class="o">.</span><span class="n">Double</span><span class="p">,</span>
200                     <span class="nb">range</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">100</span><span class="p">),</span>
201                     <span class="n">flags</span> <span class="o">=</span> <span class="n">Flags</span><span class="o">.</span><span class="n">Filter</span><span class="p">)</span>
202
203         <span class="n">timeframe</span> <span class="o">=</span> <span class="n">Attribute</span><span class="p">(</span><span class="s">&quot;timeframe&quot;</span><span class="p">,</span> <span class="s">&quot;Past time period in which to check</span><span class="se">\</span>
204 <span class="s">                        information about the node. Values are year,month, </span><span class="se">\</span>
205 <span class="s">                        week, latest&quot;</span><span class="p">,</span>
206                         <span class="n">default</span> <span class="o">=</span> <span class="s">&quot;week&quot;</span><span class="p">,</span>
207                         <span class="nb">type</span> <span class="o">=</span> <span class="n">Types</span><span class="o">.</span><span class="n">Enumerate</span><span class="p">,</span>
208                         <span class="n">allowed</span> <span class="o">=</span> <span class="p">[</span><span class="s">&quot;latest&quot;</span><span class="p">,</span>
209                                     <span class="s">&quot;week&quot;</span><span class="p">,</span>
210                                     <span class="s">&quot;month&quot;</span><span class="p">,</span>
211                                     <span class="s">&quot;year&quot;</span><span class="p">],</span>
212                         <span class="n">flags</span> <span class="o">=</span> <span class="n">Flags</span><span class="o">.</span><span class="n">Filter</span><span class="p">)</span>
213
214         <span class="n">plblacklist</span> <span class="o">=</span> <span class="n">Attribute</span><span class="p">(</span><span class="s">&quot;persist_blacklist&quot;</span><span class="p">,</span> <span class="s">&quot;Take into account the file plblacklist </span><span class="se">\</span>
215 <span class="s">                        in the user&#39;s home directory under .nepi directory. This file </span><span class="se">\</span>
216 <span class="s">                        contains a list of PL nodes to blacklist, and at the end </span><span class="se">\</span>
217 <span class="s">                        of the experiment execution the new blacklisted nodes are added.&quot;</span><span class="p">,</span>
218                     <span class="nb">type</span> <span class="o">=</span> <span class="n">Types</span><span class="o">.</span><span class="n">Bool</span><span class="p">,</span>
219                     <span class="n">default</span> <span class="o">=</span> <span class="bp">False</span><span class="p">,</span>
220                     <span class="n">flags</span> <span class="o">=</span> <span class="n">Flags</span><span class="o">.</span><span class="n">Global</span><span class="p">)</span>
221
222         <span class="n">cls</span><span class="o">.</span><span class="n">_register_attribute</span><span class="p">(</span><span class="n">sfa_user</span><span class="p">)</span>
223         <span class="n">cls</span><span class="o">.</span><span class="n">_register_attribute</span><span class="p">(</span><span class="n">sfa_private_key</span><span class="p">)</span>
224         <span class="n">cls</span><span class="o">.</span><span class="n">_register_attribute</span><span class="p">(</span><span class="n">city</span><span class="p">)</span>
225         <span class="n">cls</span><span class="o">.</span><span class="n">_register_attribute</span><span class="p">(</span><span class="n">country</span><span class="p">)</span>
226         <span class="n">cls</span><span class="o">.</span><span class="n">_register_attribute</span><span class="p">(</span><span class="n">region</span><span class="p">)</span>
227         <span class="n">cls</span><span class="o">.</span><span class="n">_register_attribute</span><span class="p">(</span><span class="n">architecture</span><span class="p">)</span>
228         <span class="n">cls</span><span class="o">.</span><span class="n">_register_attribute</span><span class="p">(</span><span class="n">operating_system</span><span class="p">)</span>
229         <span class="n">cls</span><span class="o">.</span><span class="n">_register_attribute</span><span class="p">(</span><span class="n">min_reliability</span><span class="p">)</span>
230         <span class="n">cls</span><span class="o">.</span><span class="n">_register_attribute</span><span class="p">(</span><span class="n">max_reliability</span><span class="p">)</span>
231         <span class="n">cls</span><span class="o">.</span><span class="n">_register_attribute</span><span class="p">(</span><span class="n">min_bandwidth</span><span class="p">)</span>
232         <span class="n">cls</span><span class="o">.</span><span class="n">_register_attribute</span><span class="p">(</span><span class="n">max_bandwidth</span><span class="p">)</span>
233         <span class="n">cls</span><span class="o">.</span><span class="n">_register_attribute</span><span class="p">(</span><span class="n">min_load</span><span class="p">)</span>
234         <span class="n">cls</span><span class="o">.</span><span class="n">_register_attribute</span><span class="p">(</span><span class="n">max_load</span><span class="p">)</span>
235         <span class="n">cls</span><span class="o">.</span><span class="n">_register_attribute</span><span class="p">(</span><span class="n">min_cpu</span><span class="p">)</span>
236         <span class="n">cls</span><span class="o">.</span><span class="n">_register_attribute</span><span class="p">(</span><span class="n">max_cpu</span><span class="p">)</span>
237         <span class="n">cls</span><span class="o">.</span><span class="n">_register_attribute</span><span class="p">(</span><span class="n">timeframe</span><span class="p">)</span>
238         <span class="n">cls</span><span class="o">.</span><span class="n">_register_attribute</span><span class="p">(</span><span class="n">plblacklist</span><span class="p">)</span>
239
240     <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ec</span><span class="p">,</span> <span class="n">guid</span><span class="p">):</span>
241         <span class="nb">super</span><span class="p">(</span><span class="n">PlanetlabSfaNode</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">ec</span><span class="p">,</span> <span class="n">guid</span><span class="p">)</span>
242         
243         <span class="bp">self</span><span class="o">.</span><span class="n">_ecobj</span> <span class="o">=</span> <span class="n">weakref</span><span class="o">.</span><span class="n">ref</span><span class="p">(</span><span class="n">ec</span><span class="p">)</span>
244         <span class="bp">self</span><span class="o">.</span><span class="n">_sfaapi</span> <span class="o">=</span> <span class="bp">None</span>
245         <span class="bp">self</span><span class="o">.</span><span class="n">_node_to_provision</span> <span class="o">=</span> <span class="bp">None</span>
246         <span class="bp">self</span><span class="o">.</span><span class="n">_slicenode</span> <span class="o">=</span> <span class="bp">False</span>
247         <span class="bp">self</span><span class="o">.</span><span class="n">_hostname</span> <span class="o">=</span> <span class="bp">False</span>
248
249         <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;gateway&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;gatewayUser&quot;</span><span class="p">):</span>
250             <span class="bp">self</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s">&quot;gateway&quot;</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
251             <span class="bp">self</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s">&quot;gatewayUser&quot;</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
252
253         <span class="c"># Blacklist file for PL nodes</span>
254         <span class="n">nepi_home</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expanduser</span><span class="p">(</span><span class="s">&quot;~&quot;</span><span class="p">),</span> <span class="s">&quot;.nepi&quot;</span><span class="p">)</span>
255         <span class="n">plblacklist_file</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">nepi_home</span><span class="p">,</span> <span class="s">&quot;plblacklist.txt&quot;</span><span class="p">)</span>
256         <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">plblacklist_file</span><span class="p">):</span>
257             <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isdir</span><span class="p">(</span><span class="n">nepi_home</span><span class="p">):</span>
258                 <span class="nb">open</span><span class="p">(</span><span class="n">plblacklist_file</span><span class="p">,</span> <span class="s">&#39;w&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
259             <span class="k">else</span><span class="p">:</span>
260                 <span class="n">os</span><span class="o">.</span><span class="n">makedirs</span><span class="p">(</span><span class="n">nepi_home</span><span class="p">)</span>
261                 <span class="nb">open</span><span class="p">(</span><span class="n">plblacklist_file</span><span class="p">,</span> <span class="s">&#39;w&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
262
263     <span class="k">def</span> <span class="nf">_skip_provision</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
264         <span class="n">sfa_user</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;sfauser&quot;</span><span class="p">)</span>
265         <span class="k">if</span> <span class="ow">not</span> <span class="n">sfa_user</span><span class="p">:</span>
266             <span class="k">return</span> <span class="bp">True</span>
267         <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="bp">False</span>
268     
269     <span class="nd">@property</span>
270 <div class="viewcode-block" id="PlanetlabSfaNode.sfaapi"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.sfa_node.PlanetlabSfaNode.sfaapi">[docs]</a>    <span class="k">def</span> <span class="nf">sfaapi</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
271         <span class="sd">&quot;&quot;&quot;</span>
272 <span class="sd">        Property to instanciate the SFA API based in sfi client.</span>
273 <span class="sd">        For each SFA method called this instance is used.</span>
274 <span class="sd">        &quot;&quot;&quot;</span>
275         <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sfaapi</span><span class="p">:</span>
276             <span class="n">sfa_user</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;sfauser&quot;</span><span class="p">)</span>
277             <span class="n">sfa_sm</span> <span class="o">=</span> <span class="s">&quot;http://sfa3.planet-lab.eu:12346/&quot;</span>
278             <span class="n">sfa_auth</span> <span class="o">=</span> <span class="s">&#39;.&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">sfa_user</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&#39;.&#39;</span><span class="p">)[:</span><span class="mi">2</span><span class="p">])</span>
279             <span class="n">sfa_registry</span> <span class="o">=</span> <span class="s">&quot;http://sfa3.planet-lab.eu:12345/&quot;</span>
280             <span class="n">sfa_private_key</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;sfaPrivateKey&quot;</span><span class="p">)</span>
281
282             <span class="n">_sfaapi</span> <span class="o">=</span> <span class="n">SFAAPIFactory</span><span class="o">.</span><span class="n">get_api</span><span class="p">(</span><span class="n">sfa_user</span><span class="p">,</span> <span class="n">sfa_auth</span><span class="p">,</span> 
283                 <span class="n">sfa_registry</span><span class="p">,</span> <span class="n">sfa_sm</span><span class="p">,</span> <span class="n">sfa_private_key</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_ecobj</span><span class="p">())</span>
284
285             <span class="k">if</span> <span class="ow">not</span> <span class="n">_sfaapi</span><span class="p">:</span>
286                 <span class="bp">self</span><span class="o">.</span><span class="n">fail_sfaapi</span><span class="p">()</span>
287     
288             <span class="bp">self</span><span class="o">.</span><span class="n">_sfaapi</span> <span class="o">=</span> <span class="n">weakref</span><span class="o">.</span><span class="n">ref</span><span class="p">(</span><span class="n">_sfaapi</span><span class="p">)</span>
289
290         <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sfaapi</span><span class="p">()</span>
291 </div>
292 <div class="viewcode-block" id="PlanetlabSfaNode.do_discover"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.sfa_node.PlanetlabSfaNode.do_discover">[docs]</a>    <span class="k">def</span> <span class="nf">do_discover</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
293         <span class="sd">&quot;&quot;&quot;</span>
294 <span class="sd">        Based on the attributes defined by the user, discover the suitable </span>
295 <span class="sd">        nodes for provision.</span>
296 <span class="sd">        &quot;&quot;&quot;</span>
297         <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_skip_provision</span><span class="p">():</span>
298             <span class="nb">super</span><span class="p">(</span><span class="n">PlanetlabSfaNode</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">do_discover</span><span class="p">()</span>
299             <span class="k">return</span>
300
301         <span class="n">nodes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sfaapi</span><span class="o">.</span><span class="n">get_resources_hrn</span><span class="p">()</span>
302
303         <span class="n">hostname</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_hostname</span><span class="p">()</span>
304         <span class="k">if</span> <span class="n">hostname</span><span class="p">:</span>
305             <span class="c"># the user specified one particular node to be provisioned</span>
306             <span class="bp">self</span><span class="o">.</span><span class="n">_hostname</span> <span class="o">=</span> <span class="bp">True</span>
307             <span class="n">host_hrn</span> <span class="o">=</span> <span class="n">nodes</span><span class="p">[</span><span class="n">hostname</span><span class="p">]</span>
308
309             <span class="c"># check that the node is not blacklisted or being provisioned</span>
310             <span class="c"># by other RM</span>
311             <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_blacklisted</span><span class="p">(</span><span class="n">host_hrn</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reserved</span><span class="p">(</span><span class="n">host_hrn</span><span class="p">):</span>
312                 <span class="c"># Node in reservation</span>
313                 <span class="n">ping_ok</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_do_ping</span><span class="p">(</span><span class="n">hostname</span><span class="p">)</span>
314                 <span class="k">if</span> <span class="ow">not</span> <span class="n">ping_ok</span><span class="p">:</span>
315                     <span class="bp">self</span><span class="o">.</span><span class="n">_blacklist_node</span><span class="p">(</span><span class="n">host_hrn</span><span class="p">)</span>
316                     <span class="bp">self</span><span class="o">.</span><span class="n">fail_node_not_alive</span><span class="p">(</span><span class="n">hostname</span><span class="p">)</span>
317                 <span class="k">else</span><span class="p">:</span>
318                     <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_check_if_in_slice</span><span class="p">([</span><span class="n">host_hrn</span><span class="p">]):</span>
319                         <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;The node </span><span class="si">%s</span><span class="s"> is already in the slice&quot;</span> <span class="o">%</span> <span class="n">hostname</span><span class="p">)</span>
320                         <span class="bp">self</span><span class="o">.</span><span class="n">_slicenode</span> <span class="o">=</span> <span class="bp">True</span>
321                     <span class="bp">self</span><span class="o">.</span><span class="n">_node_to_provision</span> <span class="o">=</span> <span class="n">host_hrn</span>
322             <span class="k">else</span><span class="p">:</span>
323                 <span class="bp">self</span><span class="o">.</span><span class="n">fail_node_not_available</span><span class="p">(</span><span class="n">hostname</span><span class="p">)</span>
324             <span class="nb">super</span><span class="p">(</span><span class="n">PlanetlabSfaNode</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">do_discover</span><span class="p">()</span>
325
326         <span class="k">else</span><span class="p">:</span>
327             <span class="n">hosts_hrn</span> <span class="o">=</span> <span class="n">nodes</span><span class="o">.</span><span class="n">values</span><span class="p">()</span>
328             <span class="n">nodes_inslice</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_check_if_in_slice</span><span class="p">(</span><span class="n">hosts_hrn</span><span class="p">)</span>
329             <span class="n">nodes_not_inslice</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">hosts_hrn</span><span class="p">)</span> <span class="o">-</span> <span class="nb">set</span><span class="p">(</span><span class="n">nodes_inslice</span><span class="p">))</span>
330             <span class="n">host_hrn</span> <span class="o">=</span> <span class="bp">None</span>
331             <span class="k">if</span> <span class="n">nodes_inslice</span><span class="p">:</span>
332                 <span class="n">host_hrn</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_choose_random_node</span><span class="p">(</span><span class="n">nodes</span><span class="p">,</span> <span class="n">nodes_inslice</span><span class="p">)</span>
333                 <span class="bp">self</span><span class="o">.</span><span class="n">_slicenode</span> <span class="o">=</span> <span class="bp">True</span>          
334
335             <span class="k">if</span> <span class="ow">not</span> <span class="n">host_hrn</span><span class="p">:</span>
336                 <span class="c"># Either there were no matching nodes in the user&#39;s slice, or</span>
337                 <span class="c"># the nodes in the slice  were blacklisted or being provisioned</span>
338                 <span class="c"># by other RM. Note nodes_not_inslice is never empty</span>
339                 <span class="n">host_hrn</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_choose_random_node</span><span class="p">(</span><span class="n">nodes</span><span class="p">,</span> <span class="n">nodes_not_inslice</span><span class="p">)</span>
340                 <span class="bp">self</span><span class="o">.</span><span class="n">_slicenode</span> <span class="o">=</span> <span class="bp">False</span>
341
342             <span class="k">if</span> <span class="n">host_hrn</span><span class="p">:</span>
343                 <span class="bp">self</span><span class="o">.</span><span class="n">_node_to_provision</span> <span class="o">=</span> <span class="n">host_hrn</span>
344                 <span class="k">try</span><span class="p">:</span>
345                     <span class="bp">self</span><span class="o">.</span><span class="n">_set_hostname_attr</span><span class="p">(</span><span class="n">host_hrn</span><span class="p">)</span>
346                     <span class="bp">self</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot; Selected node to provision &quot;</span><span class="p">)</span>
347                     <span class="nb">super</span><span class="p">(</span><span class="n">PlanetlabSfaNode</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">do_discover</span><span class="p">()</span>
348                 <span class="k">except</span><span class="p">:</span>
349                     <span class="bp">self</span><span class="o">.</span><span class="n">_blacklist_node</span><span class="p">(</span><span class="n">host_hrn</span><span class="p">)</span>
350                     <span class="bp">self</span><span class="o">.</span><span class="n">do_discover</span><span class="p">()</span>
351             <span class="k">else</span><span class="p">:</span>
352                <span class="bp">self</span><span class="o">.</span><span class="n">fail_not_enough_nodes</span><span class="p">()</span> 
353     </div>
354     <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="n">host_hrn</span><span class="p">):</span>
355         <span class="sd">&quot;&quot;&quot;</span>
356 <span class="sd">        Check in the SFA API that the node is not in the blacklist.</span>
357 <span class="sd">        &quot;&quot;&quot;</span>
358         <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">sfaapi</span><span class="o">.</span><span class="n">blacklisted</span><span class="p">(</span><span class="n">host_hrn</span><span class="p">):</span>
359            <span class="k">return</span> <span class="bp">True</span>
360         <span class="k">return</span> <span class="bp">False</span>
361
362     <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="n">host_hrn</span><span class="p">):</span>
363         <span class="sd">&quot;&quot;&quot;</span>
364 <span class="sd">        Check in the SFA API that the node is not in the reserved</span>
365 <span class="sd">        list.</span>
366 <span class="sd">        &quot;&quot;&quot;</span>
367         <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">sfaapi</span><span class="o">.</span><span class="n">reserved</span><span class="p">(</span><span class="n">host_hrn</span><span class="p">):</span>
368             <span class="k">return</span> <span class="bp">True</span>
369         <span class="k">return</span> <span class="bp">False</span>
370             
371 <div class="viewcode-block" id="PlanetlabSfaNode.do_provision"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.sfa_node.PlanetlabSfaNode.do_provision">[docs]</a>    <span class="k">def</span> <span class="nf">do_provision</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
372         <span class="sd">&quot;&quot;&quot;</span>
373 <span class="sd">        Add node to user&#39;s slice and verifing that the node is functioning</span>
374 <span class="sd">        correctly. Check ssh, file system.</span>
375 <span class="sd">        &quot;&quot;&quot;</span>
376         <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_skip_provision</span><span class="p">():</span>
377             <span class="nb">super</span><span class="p">(</span><span class="n">PlanetlabSfaNode</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">do_provision</span><span class="p">()</span>
378             <span class="k">return</span>
379
380         <span class="n">provision_ok</span> <span class="o">=</span> <span class="bp">False</span>
381         <span class="n">ssh_ok</span> <span class="o">=</span> <span class="bp">False</span>
382         <span class="n">proc_ok</span> <span class="o">=</span> <span class="bp">False</span>
383         <span class="n">timeout</span> <span class="o">=</span> <span class="mi">1800</span>
384
385         <span class="k">while</span> <span class="ow">not</span> <span class="n">provision_ok</span><span class="p">:</span>
386             <span class="n">node</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_node_to_provision</span>
387             <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_slicenode</span><span class="p">:</span>
388                 <span class="bp">self</span><span class="o">.</span><span class="n">_add_node_to_slice</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
389             
390                 <span class="c"># check ssh connection</span>
391                 <span class="n">t</span> <span class="o">=</span> <span class="mi">0</span> 
392                 <span class="k">while</span> <span class="n">t</span> <span class="o">&lt;</span> <span class="n">timeout</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">ssh_ok</span><span class="p">:</span>
393
394                     <span class="n">cmd</span> <span class="o">=</span> <span class="s">&#39;echo </span><span class="se">\&#39;</span><span class="s">GOOD NODE</span><span class="se">\&#39;</span><span class="s">&#39;</span>
395                     <span class="p">((</span><span class="n">out</span><span class="p">,</span> <span class="n">err</span><span class="p">),</span> <span class="n">proc</span><span class="p">)</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span>
396                     <span class="k">if</span> <span class="n">out</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&quot;GOOD NODE&quot;</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
397                         <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span> <span class="s">&quot;No SSH connection, waiting 60s&quot;</span> <span class="p">)</span>
398                         <span class="n">t</span> <span class="o">=</span> <span class="n">t</span> <span class="o">+</span> <span class="mi">60</span>
399                         <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">60</span><span class="p">)</span>
400                         <span class="k">continue</span>
401                     <span class="k">else</span><span class="p">:</span>
402                         <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span> <span class="s">&quot;SSH OK&quot;</span> <span class="p">)</span>
403                         <span class="n">ssh_ok</span> <span class="o">=</span> <span class="bp">True</span>
404                         <span class="k">continue</span>
405             <span class="k">else</span><span class="p">:</span>
406                 <span class="n">cmd</span> <span class="o">=</span> <span class="s">&#39;echo </span><span class="se">\&#39;</span><span class="s">GOOD NODE</span><span class="se">\&#39;</span><span class="s">&#39;</span>
407                 <span class="p">((</span><span class="n">out</span><span class="p">,</span> <span class="n">err</span><span class="p">),</span> <span class="n">proc</span><span class="p">)</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span>
408                 <span class="k">if</span> <span class="ow">not</span> <span class="n">out</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&quot;GOOD NODE&quot;</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
409                     <span class="n">ssh_ok</span> <span class="o">=</span> <span class="bp">True</span>
410
411             <span class="k">if</span> <span class="ow">not</span> <span class="n">ssh_ok</span><span class="p">:</span>
412                 <span class="c"># the timeout was reach without establishing ssh connection</span>
413                 <span class="c"># the node is blacklisted, deleted from the slice, and a new</span>
414                 <span class="c"># node to provision is discovered</span>
415                 <span class="bp">self</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s">&quot; Could not SSH login &quot;</span><span class="p">)</span>
416                 <span class="bp">self</span><span class="o">.</span><span class="n">_blacklist_node</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
417                 <span class="bp">self</span><span class="o">.</span><span class="n">do_discover</span><span class="p">()</span>
418                 <span class="k">continue</span>
419             
420             <span class="c"># check /proc directory is mounted (ssh_ok = True)</span>
421             <span class="c"># and file system is not read only</span>
422             <span class="k">else</span><span class="p">:</span>
423                 <span class="n">cmd</span> <span class="o">=</span> <span class="s">&#39;mount |grep proc&#39;</span>
424                 <span class="p">((</span><span class="n">out1</span><span class="p">,</span> <span class="n">err1</span><span class="p">),</span> <span class="n">proc1</span><span class="p">)</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span>
425                 <span class="n">cmd</span> <span class="o">=</span> <span class="s">&#39;touch /tmp/tmpfile; rm /tmp/tmpfile&#39;</span>
426                 <span class="p">((</span><span class="n">out2</span><span class="p">,</span> <span class="n">err2</span><span class="p">),</span> <span class="n">proc2</span><span class="p">)</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span>
427                 <span class="k">if</span> <span class="n">out1</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">&quot;/proc type proc&quot;</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="ow">or</span> \
428                     <span class="s">&quot;Read-only file system&quot;</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">in</span> <span class="n">err2</span><span class="o">.</span><span class="n">lower</span><span class="p">():</span>
429                     <span class="bp">self</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s">&quot; Corrupted file system &quot;</span><span class="p">)</span>
430                     <span class="bp">self</span><span class="o">.</span><span class="n">_blacklist_node</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
431                     <span class="bp">self</span><span class="o">.</span><span class="n">do_discover</span><span class="p">()</span>
432                     <span class="k">continue</span>
433             
434                 <span class="k">else</span><span class="p">:</span>
435                     <span class="n">provision_ok</span> <span class="o">=</span> <span class="bp">True</span>
436                     <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;hostname&#39;</span><span class="p">):</span>
437                         <span class="bp">self</span><span class="o">.</span><span class="n">_set_hostname_attr</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>            
438                     <span class="bp">self</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot; Node provisioned &quot;</span><span class="p">)</span>            
439             
440         <span class="nb">super</span><span class="p">(</span><span class="n">PlanetlabSfaNode</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">do_provision</span><span class="p">()</span>
441 </div>
442 <div class="viewcode-block" id="PlanetlabSfaNode.do_release"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.sfa_node.PlanetlabSfaNode.do_release">[docs]</a>    <span class="k">def</span> <span class="nf">do_release</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
443         <span class="nb">super</span><span class="p">(</span><span class="n">PlanetlabSfaNode</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">do_release</span><span class="p">()</span>
444         <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">state</span> <span class="o">==</span> <span class="n">ResourceState</span><span class="o">.</span><span class="n">RELEASED</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_skip_provision</span><span class="p">():</span>
445             <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot; Releasing SFA API &quot;</span><span class="p">)</span>
446             <span class="bp">self</span><span class="o">.</span><span class="n">sfaapi</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
447
448 <span class="c">#    def _filter_based_on_attributes(self):</span>
449 <span class="c">#        &quot;&quot;&quot;</span>
450 <span class="c">#        Retrive the list of nodes hrn that match user&#39;s constraints </span>
451 <span class="c">#        &quot;&quot;&quot;</span>
452 <span class="c">#        # Map user&#39;s defined attributes with tagnames of PlanetLab</span>
453 <span class="c">#        timeframe = self.get(&quot;timeframe&quot;)[0]</span>
454 <span class="c">#        attr_to_tags = {</span>
455 <span class="c">#            &#39;city&#39; : &#39;city&#39;,</span>
456 <span class="c">#            &#39;country&#39; : &#39;country&#39;,</span>
457 <span class="c">#            &#39;region&#39; : &#39;region&#39;,</span>
458 <span class="c">#            &#39;architecture&#39; : &#39;arch&#39;,</span>
459 <span class="c">#            &#39;operatingSystem&#39; : &#39;fcdistro&#39;,</span>
460 <span class="c">#            &#39;minReliability&#39; : &#39;reliability%s&#39; % timeframe,</span>
461 <span class="c">#            &#39;maxReliability&#39; : &#39;reliability%s&#39; % timeframe,</span>
462 <span class="c">#            &#39;minBandwidth&#39; : &#39;bw%s&#39; % timeframe,</span>
463 <span class="c">#            &#39;maxBandwidth&#39; : &#39;bw%s&#39; % timeframe,</span>
464 <span class="c">#            &#39;minLoad&#39; : &#39;load%s&#39; % timeframe,</span>
465 <span class="c">#            &#39;maxLoad&#39; : &#39;load%s&#39; % timeframe,</span>
466 <span class="c">#            &#39;minCpu&#39; : &#39;cpu%s&#39; % timeframe,</span>
467 <span class="c">#            &#39;maxCpu&#39; : &#39;cpu%s&#39; % timeframe,</span>
468 <span class="c">#        }</span>
469 <span class="c">#        </span>
470 <span class="c">#        nodes_hrn = []</span>
471 <span class="c">#        filters = {}</span>
472 <span class="c">#</span>
473 <span class="c">#        for attr_name, attr_obj in self._attrs.iteritems():</span>
474 <span class="c">#            attr_value = self.get(attr_name)</span>
475 <span class="c">#            </span>
476 <span class="c">#            if attr_value is not None and attr_obj.has_flag(Flags.Filter) and \</span>
477 <span class="c">#                attr_name != &#39;timeframe&#39;:</span>
478 <span class="c">#        </span>
479 <span class="c">#                attr_tag = attr_to_tags[attr_name]</span>
480 <span class="c">#                filters[&#39;tagname&#39;] = attr_tag</span>
481 <span class="c">#</span>
482 <span class="c">#                # filter nodes by fixed constraints e.g. operating system</span>
483 <span class="c">#                if not &#39;min&#39; in attr_name and not &#39;max&#39; in attr_name:</span>
484 <span class="c">#                    filters[&#39;value&#39;] = attr_value</span>
485 <span class="c">#                    nodes_hrn = self._filter_by_fixed_attr(filters, nodes_hrn)</span>
486 <span class="c">#</span>
487 <span class="c">#                # filter nodes by range constraints e.g. max bandwidth</span>
488 <span class="c">#                elif (&#39;min&#39; or &#39;max&#39;) in attr_name:</span>
489 <span class="c">#                    nodes_hrn = self._filter_by_range_attr(attr_name, attr_value, filters, nodes_hrn)</span>
490 <span class="c">#</span>
491 <span class="c">#        if not filters:</span>
492 <span class="c">#            nodes = self.sfaapi.get_resources_hrn()</span>
493 <span class="c">#            for node in nodes:</span>
494 <span class="c">#                nodes_hrn.append(node[node.key()])</span>
495 <span class="c">#        return nodes_hrn</span>
496 <span class="c">#                    </span>
497 <span class="c">#    def _filter_by_fixed_attr(self, filters, nodes_hrn):</span>
498 <span class="c">#        &quot;&quot;&quot;</span>
499 <span class="c">#        Query SFA API for nodes matching fixed attributes defined by the</span>
500 <span class="c">#        user</span>
501 <span class="c">#        &quot;&quot;&quot;</span>
502 <span class="c">#        pass</span>
503 <span class="c">##        node_tags = self.sfaapi.get_resources_tags(filters)</span>
504 <span class="c">##        if node_tags is not None:</span>
505 <span class="c">##</span>
506 <span class="c">##            if len(nodes_id) == 0:</span>
507 <span class="c">##                # first attribute being matched</span>
508 <span class="c">##                for node_tag in node_tags:</span>
509 <span class="c">##                    nodes_id.append(node_tag[&#39;node_id&#39;])</span>
510 <span class="c">##            else:</span>
511 <span class="c">##                # remove the nodes ids that don&#39;t match the new attribute</span>
512 <span class="c">##                # that is being match</span>
513 <span class="c">##</span>
514 <span class="c">##                nodes_id_tmp = []</span>
515 <span class="c">##                for node_tag in node_tags:</span>
516 <span class="c">##                    if node_tag[&#39;node_id&#39;] in nodes_id:</span>
517 <span class="c">##                        nodes_id_tmp.append(node_tag[&#39;node_id&#39;])</span>
518 <span class="c">##</span>
519 <span class="c">##                if len(nodes_id_tmp):</span>
520 <span class="c">##                    nodes_id = set(nodes_id) &amp; set(nodes_id_tmp)</span>
521 <span class="c">##                else:</span>
522 <span class="c">##                    # no node from before match the new constraint</span>
523 <span class="c">##                    self.fail_discovery()</span>
524 <span class="c">##        else:</span>
525 <span class="c">##            # no nodes match the filter applied</span>
526 <span class="c">##            self.fail_discovery()</span>
527 <span class="c">##</span>
528 <span class="c">##        return nodes_id</span>
529 <span class="c">#</span>
530 <span class="c">#    def _filter_by_range_attr(self, attr_name, attr_value, filters, nodes_id):</span>
531 <span class="c">#        &quot;&quot;&quot;</span>
532 <span class="c">#        Query PLCAPI for nodes ids matching attributes defined in a certain</span>
533 <span class="c">#        range, by the user</span>
534 <span class="c">#        &quot;&quot;&quot;</span>
535 <span class="c">#        pass</span>
536 <span class="c">##        node_tags = self.plapi.get_node_tags(filters)</span>
537 <span class="c">##        if node_tags:</span>
538 <span class="c">##            </span>
539 <span class="c">##            if len(nodes_id) == 0:</span>
540 <span class="c">##                # first attribute being matched</span>
541 <span class="c">##                for node_tag in node_tags:</span>
542 <span class="c">## </span>
543 <span class="c">##                   # check that matches the min or max restriction</span>
544 <span class="c">##                    if &#39;min&#39; in attr_name and node_tag[&#39;value&#39;] != &#39;n/a&#39; and \</span>
545 <span class="c">##                        float(node_tag[&#39;value&#39;]) &gt; attr_value:</span>
546 <span class="c">##                        nodes_id.append(node_tag[&#39;node_id&#39;])</span>
547 <span class="c">##</span>
548 <span class="c">##                    elif &#39;max&#39; in attr_name and node_tag[&#39;value&#39;] != &#39;n/a&#39; and \</span>
549 <span class="c">##                        float(node_tag[&#39;value&#39;]) &lt; attr_value:</span>
550 <span class="c">##                        nodes_id.append(node_tag[&#39;node_id&#39;])</span>
551 <span class="c">##            else:</span>
552 <span class="c">##</span>
553 <span class="c">##                # remove the nodes ids that don&#39;t match the new attribute</span>
554 <span class="c">##                # that is being match</span>
555 <span class="c">##                nodes_id_tmp = []</span>
556 <span class="c">##                for node_tag in node_tags:</span>
557 <span class="c">##</span>
558 <span class="c">##                    # check that matches the min or max restriction and was a</span>
559 <span class="c">##                    # matching previous filters</span>
560 <span class="c">##                    if &#39;min&#39; in attr_name and node_tag[&#39;value&#39;] != &#39;n/a&#39; and \</span>
561 <span class="c">##                        float(node_tag[&#39;value&#39;]) &gt; attr_value and \</span>
562 <span class="c">##                        node_tag[&#39;node_id&#39;] in nodes_id:</span>
563 <span class="c">##                        nodes_id_tmp.append(node_tag[&#39;node_id&#39;])</span>
564 <span class="c">##</span>
565 <span class="c">##                    elif &#39;max&#39; in attr_name and node_tag[&#39;value&#39;] != &#39;n/a&#39; and \</span>
566 <span class="c">##                        float(node_tag[&#39;value&#39;]) &lt; attr_value and \</span>
567 <span class="c">##                        node_tag[&#39;node_id&#39;] in nodes_id:</span>
568 <span class="c">##                        nodes_id_tmp.append(node_tag[&#39;node_id&#39;])</span>
569 <span class="c">##</span>
570 <span class="c">##                if len(nodes_id_tmp):</span>
571 <span class="c">##                    nodes_id = set(nodes_id) &amp; set(nodes_id_tmp)</span>
572 <span class="c">##                else:</span>
573 <span class="c">##                    # no node from before match the new constraint</span>
574 <span class="c">##                    self.fail_discovery()</span>
575 <span class="c">##</span>
576 <span class="c">##        else: #TODO CHECK</span>
577 <span class="c">##            # no nodes match the filter applied</span>
578 <span class="c">##            self.fail_discovery()</span>
579 <span class="c">##</span>
580 <span class="c">##        return nodes_id</span>
581         </div>
582     <span class="k">def</span> <span class="nf">_choose_random_node</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">nodes</span><span class="p">,</span> <span class="n">hosts_hrn</span><span class="p">):</span>
583         <span class="sd">&quot;&quot;&quot;</span>
584 <span class="sd">        From the possible nodes for provision, choose randomly to decrese the</span>
585 <span class="sd">        probability of different RMs choosing the same node for provision</span>
586 <span class="sd">        &quot;&quot;&quot;</span>
587         <span class="n">size</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">hosts_hrn</span><span class="p">)</span>
588         <span class="k">while</span> <span class="n">size</span><span class="p">:</span>
589             <span class="n">size</span> <span class="o">=</span> <span class="n">size</span> <span class="o">-</span> <span class="mi">1</span>
590             <span class="n">index</span> <span class="o">=</span> <span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
591             <span class="n">host_hrn</span> <span class="o">=</span> <span class="n">hosts_hrn</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>
592             <span class="n">hosts_hrn</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">=</span> <span class="n">hosts_hrn</span><span class="p">[</span><span class="n">size</span><span class="p">]</span>
593
594             <span class="c"># check the node is not blacklisted or being provision by other RM</span>
595             <span class="c"># and perform ping to check that is really alive</span>
596             <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_blacklisted</span><span class="p">(</span><span class="n">host_hrn</span><span class="p">):</span>
597                 <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reserved</span><span class="p">(</span><span class="n">host_hrn</span><span class="p">):</span>
598                     <span class="k">print</span> <span class="bp">self</span><span class="o">.</span><span class="n">sfaapi</span><span class="o">.</span><span class="n">_reserved</span> <span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">guid</span>
599                     <span class="k">for</span> <span class="n">hostname</span><span class="p">,</span> <span class="n">hrn</span> <span class="ow">in</span> <span class="n">nodes</span><span class="o">.</span><span class="n">iteritems</span><span class="p">():</span>
600                         <span class="k">if</span> <span class="n">host_hrn</span> <span class="o">==</span> <span class="n">hrn</span><span class="p">:</span>
601                             <span class="k">print</span> <span class="s">&#39;hostname&#39;</span> <span class="p">,</span><span class="n">hostname</span>
602                             <span class="n">ping_ok</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_do_ping</span><span class="p">(</span><span class="n">hostname</span><span class="p">)</span>
603                 
604                     <span class="k">if</span> <span class="ow">not</span> <span class="n">ping_ok</span><span class="p">:</span>
605                         <span class="bp">self</span><span class="o">.</span><span class="n">_set_hostname_attr</span><span class="p">(</span><span class="n">hostname</span><span class="p">)</span>
606                         <span class="bp">self</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s">&quot; Node not responding PING &quot;</span><span class="p">)</span>
607                         <span class="bp">self</span><span class="o">.</span><span class="n">_blacklist_node</span><span class="p">(</span><span class="n">host_hrn</span><span class="p">)</span>
608                     <span class="k">else</span><span class="p">:</span>
609                         <span class="c"># discovered node for provision, added to provision list</span>
610                         <span class="bp">self</span><span class="o">.</span><span class="n">_node_to_provision</span> <span class="o">=</span> <span class="n">host_hrn</span>
611                         <span class="k">return</span> <span class="n">host_hrn</span>
612
613 <span class="c">#    def _get_nodes_id(self, filters=None):</span>
614 <span class="c">#        return self.plapi.get_nodes(filters, fields=[&#39;node_id&#39;])</span>
615 <span class="c">#</span>
616     <span class="k">def</span> <span class="nf">_add_node_to_slice</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">host_hrn</span><span class="p">):</span>
617         <span class="sd">&quot;&quot;&quot;</span>
618 <span class="sd">        Add node to slice, using SFA API.</span>
619 <span class="sd">        &quot;&quot;&quot;</span>
620         <span class="bp">self</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot; Adding node to slice &quot;</span><span class="p">)</span>
621         <span class="n">slicename</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;username&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39;_&#39;</span><span class="p">,</span> <span class="s">&#39;.&#39;</span><span class="p">)</span>
622         <span class="n">slicename</span> <span class="o">=</span> <span class="s">&#39;ple.&#39;</span> <span class="o">+</span> <span class="n">slicename</span>
623         <span class="bp">self</span><span class="o">.</span><span class="n">sfaapi</span><span class="o">.</span><span class="n">add_resource_to_slice</span><span class="p">(</span><span class="n">slicename</span><span class="p">,</span> <span class="n">host_hrn</span><span class="p">)</span>
624
625     <span class="k">def</span> <span class="nf">_delete_from_slice</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
626         <span class="sd">&quot;&quot;&quot;</span>
627 <span class="sd">        Delete every node from slice, using SFA API.</span>
628 <span class="sd">        Sfi client doesn&#39;t work for particular node urns.</span>
629 <span class="sd">        &quot;&quot;&quot;</span>
630         <span class="bp">self</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s">&quot; Deleting node from slice &quot;</span><span class="p">)</span>
631         <span class="n">slicename</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;username&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39;_&#39;</span><span class="p">,</span> <span class="s">&#39;.&#39;</span><span class="p">)</span>
632         <span class="n">slicename</span> <span class="o">=</span> <span class="s">&#39;ple.&#39;</span> <span class="o">+</span> <span class="n">slicename</span>
633         <span class="bp">self</span><span class="o">.</span><span class="n">sfaapi</span><span class="o">.</span><span class="n">remove_all_from_slice</span><span class="p">(</span><span class="n">slicename</span><span class="p">)</span>
634
635     <span class="k">def</span> <span class="nf">_get_hostname</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
636         <span class="sd">&quot;&quot;&quot;</span>
637 <span class="sd">        Get the attribute hostname.</span>
638 <span class="sd">        &quot;&quot;&quot;</span>
639         <span class="n">hostname</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;hostname&quot;</span><span class="p">)</span>
640         <span class="k">if</span> <span class="n">hostname</span><span class="p">:</span>
641             <span class="k">return</span> <span class="n">hostname</span>
642         <span class="k">else</span><span class="p">:</span>
643             <span class="k">return</span> <span class="bp">None</span>
644
645     <span class="k">def</span> <span class="nf">_set_hostname_attr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
646         <span class="sd">&quot;&quot;&quot;</span>
647 <span class="sd">        Query SFAAPI for the hostname of a certain host hrn and sets the</span>
648 <span class="sd">        attribute hostname, it will over write the previous value.</span>
649 <span class="sd">        &quot;&quot;&quot;</span>
650         <span class="n">hosts_hrn</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sfaapi</span><span class="o">.</span><span class="n">get_resources_hrn</span><span class="p">()</span>
651         <span class="k">for</span> <span class="n">hostname</span><span class="p">,</span> <span class="n">hrn</span>  <span class="ow">in</span> <span class="n">hosts_hrn</span><span class="o">.</span><span class="n">iteritems</span><span class="p">():</span>
652             <span class="k">if</span> <span class="n">hrn</span> <span class="o">==</span> <span class="n">node</span><span class="p">:</span>
653                 <span class="bp">self</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s">&quot;hostname&quot;</span><span class="p">,</span> <span class="n">hostname</span><span class="p">)</span>
654
655     <span class="k">def</span> <span class="nf">_check_if_in_slice</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">hosts_hrn</span><span class="p">):</span>
656         <span class="sd">&quot;&quot;&quot;</span>
657 <span class="sd">        Check using SFA API if any host hrn from hosts_hrn is in the user&#39;s</span>
658 <span class="sd">        slice.</span>
659 <span class="sd">        &quot;&quot;&quot;</span>
660         <span class="n">slicename</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;username&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39;_&#39;</span><span class="p">,</span> <span class="s">&#39;.&#39;</span><span class="p">)</span>
661         <span class="n">slicename</span> <span class="o">=</span> <span class="s">&#39;ple.&#39;</span> <span class="o">+</span> <span class="n">slicename</span>
662         <span class="n">slice_nodes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sfaapi</span><span class="o">.</span><span class="n">get_slice_resources</span><span class="p">(</span><span class="n">slicename</span><span class="p">)[</span><span class="s">&#39;resource&#39;</span><span class="p">]</span>
663         <span class="k">if</span> <span class="n">slice_nodes</span><span class="p">:</span>
664             <span class="n">slice_nodes_hrn</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sfaapi</span><span class="o">.</span><span class="n">get_resources_hrn</span><span class="p">(</span><span class="n">slice_nodes</span><span class="p">)</span><span class="o">.</span><span class="n">values</span><span class="p">()</span>
665         <span class="k">else</span><span class="p">:</span> <span class="n">slice_nodes_hrn</span> <span class="o">=</span> <span class="p">[]</span>
666         <span class="n">nodes_inslice</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">hosts_hrn</span><span class="p">)</span> <span class="o">&amp;</span> <span class="nb">set</span><span class="p">(</span><span class="n">slice_nodes_hrn</span><span class="p">))</span>
667         <span class="k">return</span> <span class="n">nodes_inslice</span>
668
669     <span class="k">def</span> <span class="nf">_do_ping</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">hostname</span><span class="p">):</span>
670         <span class="sd">&quot;&quot;&quot;</span>
671 <span class="sd">        Perform ping command on node&#39;s IP matching hostname.</span>
672 <span class="sd">        &quot;&quot;&quot;</span>
673         <span class="n">ping_ok</span> <span class="o">=</span> <span class="bp">False</span>
674         <span class="n">ip</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_ip</span><span class="p">(</span><span class="n">hostname</span><span class="p">)</span>
675         <span class="k">if</span> <span class="n">ip</span><span class="p">:</span>
676             <span class="n">command</span> <span class="o">=</span> <span class="s">&quot;ping -c4 </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">ip</span>
677             <span class="p">(</span><span class="n">out</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span> <span class="o">=</span> <span class="n">lexec</span><span class="p">(</span><span class="n">command</span><span class="p">)</span>
678
679             <span class="n">m</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="s">&quot;(\d+)% packet loss&quot;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">out</span><span class="p">))</span>
680             <span class="k">if</span> <span class="n">m</span> <span class="ow">and</span> <span class="nb">int</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">groups</span><span class="p">()[</span><span class="mi">0</span><span class="p">])</span> <span class="o">&lt;</span> <span class="mi">50</span><span class="p">:</span>
681                 <span class="n">ping_ok</span> <span class="o">=</span> <span class="bp">True</span>
682
683         <span class="k">return</span> <span class="n">ping_ok</span>
684
685     <span class="k">def</span> <span class="nf">_blacklist_node</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">host_hrn</span><span class="p">):</span>
686         <span class="sd">&quot;&quot;&quot;</span>
687 <span class="sd">        Add mal functioning node to blacklist (in SFA API).</span>
688 <span class="sd">        &quot;&quot;&quot;</span>
689         <span class="bp">self</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s">&quot; Blacklisting malfunctioning node &quot;</span><span class="p">)</span>
690         <span class="bp">self</span><span class="o">.</span><span class="n">sfaapi</span><span class="o">.</span><span class="n">blacklist_resource</span><span class="p">(</span><span class="n">host_hrn</span><span class="p">)</span>
691         <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_hostname</span><span class="p">:</span>
692             <span class="bp">self</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s">&#39;hostname&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
693
694     <span class="k">def</span> <span class="nf">_reserve</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">host_hrn</span><span class="p">):</span>
695         <span class="sd">&quot;&quot;&quot;</span>
696 <span class="sd">        Add node to the list of nodes being provisioned, in order for other RMs</span>
697 <span class="sd">        to not try to provision the same one again.</span>
698 <span class="sd">        &quot;&quot;&quot;</span>
699         <span class="bp">self</span><span class="o">.</span><span class="n">sfaapi</span><span class="o">.</span><span class="n">reserve_resource</span><span class="p">(</span><span class="n">host_hrn</span><span class="p">)</span>
700
701     <span class="k">def</span> <span class="nf">_get_ip</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">hostname</span><span class="p">):</span>
702         <span class="sd">&quot;&quot;&quot;</span>
703 <span class="sd">        Query cache for the IP of a node with certain hostname</span>
704 <span class="sd">        &quot;&quot;&quot;</span>
705         <span class="k">try</span><span class="p">:</span>
706             <span class="n">ip</span> <span class="o">=</span> <span class="n">sshfuncs</span><span class="o">.</span><span class="n">gethostbyname</span><span class="p">(</span><span class="n">hostname</span><span class="p">)</span>
707         <span class="k">except</span><span class="p">:</span>
708             <span class="c"># Fail while trying to find the IP</span>
709             <span class="k">return</span> <span class="bp">None</span>
710         <span class="k">return</span> <span class="n">ip</span>
711
712 <div class="viewcode-block" id="PlanetlabSfaNode.fail_discovery"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.sfa_node.PlanetlabSfaNode.fail_discovery">[docs]</a>    <span class="k">def</span> <span class="nf">fail_discovery</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
713         <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot;Discovery failed. No candidates found for node&quot;</span>
714         <span class="bp">self</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
715         <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">,</span> <span class="n">msg</span>
716 </div>
717 <div class="viewcode-block" id="PlanetlabSfaNode.fail_node_not_alive"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.sfa_node.PlanetlabSfaNode.fail_node_not_alive">[docs]</a>    <span class="k">def</span> <span class="nf">fail_node_not_alive</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">hostname</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
718         <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot;Node </span><span class="si">%s</span><span class="s"> not alive&quot;</span> <span class="o">%</span> <span class="n">hostname</span>
719         <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">,</span> <span class="n">msg</span>
720     </div>
721 <div class="viewcode-block" id="PlanetlabSfaNode.fail_node_not_available"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.sfa_node.PlanetlabSfaNode.fail_node_not_available">[docs]</a>    <span class="k">def</span> <span class="nf">fail_node_not_available</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">hostname</span><span class="p">):</span>
722         <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot;Node </span><span class="si">%s</span><span class="s"> not available for provisioning&quot;</span> <span class="o">%</span> <span class="n">hostname</span>
723         <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">,</span> <span class="n">msg</span>
724 </div>
725 <div class="viewcode-block" id="PlanetlabSfaNode.fail_not_enough_nodes"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.sfa_node.PlanetlabSfaNode.fail_not_enough_nodes">[docs]</a>    <span class="k">def</span> <span class="nf">fail_not_enough_nodes</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
726         <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot;Not enough nodes available for provisioning&quot;</span>
727         <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">,</span> <span class="n">msg</span>
728 </div>
729 <div class="viewcode-block" id="PlanetlabSfaNode.fail_sfaapi"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.sfa_node.PlanetlabSfaNode.fail_sfaapi">[docs]</a>    <span class="k">def</span> <span class="nf">fail_sfaapi</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
730         <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot;Failing while trying to instanciate the SFA API.</span><span class="se">\n</span><span class="s">Set the&quot;</span> <span class="o">+</span> \
731             <span class="s">&quot; attributes sfauser and sfaPrivateKey.&quot;</span>
732         <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">,</span> <span class="n">msg</span>
733 </div>
734 <div class="viewcode-block" id="PlanetlabSfaNode.valid_connection"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.sfa_node.PlanetlabSfaNode.valid_connection">[docs]</a>    <span class="k">def</span> <span class="nf">valid_connection</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">guid</span><span class="p">):</span>
735         <span class="c"># TODO: Validate!</span>
736         <span class="k">return</span> <span class="bp">True</span>
737 </pre></div></div></div>
738
739           </div>
740         </div>
741       </div>
742       <div class="clearer"></div>
743     </div>
744     <div class="related">
745       <h3>Navigation</h3>
746       <ul>
747         <li class="right" style="margin-right: 10px">
748           <a href="../../../../genindex.html" title="General Index"
749              >index</a></li>
750         <li class="right" >
751           <a href="../../../../py-modindex.html" title="Python Module Index"
752              >modules</a> |</li>
753         <li><a href="../../../../index.html">NEPI 3.0 documentation</a> &raquo;</li>
754           <li><a href="../../../index.html" >Module code</a> &raquo;</li> 
755       </ul>
756     </div>
757     <div class="footer">
758         &copy; Copyright 2014, Alina Quereilhac, Lucia Guevgeozian Odizzio, Julien Tribino.
759       Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
760     </div>
761   </body>
762 </html>