add sphinx documentation
[nepi.git] / doc / sphinx / _build / html / _modules / nepi / resources / planetlab / 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.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.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: Alina Quereilhac &lt;alina.quereilhac@inria.fr&gt;</span>
84 <span class="c">#         Lucia Guevgeozian &lt;lucia.guevgeozian_odizzio@inria.fr&gt;</span>
85
86 <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>
87 <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> \
88         <span class="n">ResourceState</span> 
89 <span class="kn">from</span> <span class="nn">nepi.resources.linux.node</span> <span class="kn">import</span> <span class="n">LinuxNode</span>
90 <span class="kn">from</span> <span class="nn">nepi.resources.planetlab.plcapi</span> <span class="kn">import</span> <span class="n">PLCAPIFactory</span> 
91 <span class="kn">from</span> <span class="nn">nepi.util.execfuncs</span> <span class="kn">import</span> <span class="n">lexec</span>
92 <span class="kn">from</span> <span class="nn">nepi.util</span> <span class="kn">import</span> <span class="n">sshfuncs</span>
93
94 <span class="kn">from</span> <span class="nn">random</span> <span class="kn">import</span> <span class="n">randint</span>
95 <span class="kn">import</span> <span class="nn">re</span>
96 <span class="kn">import</span> <span class="nn">os</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 <span class="kn">import</span> <span class="nn">weakref</span>
102
103 <span class="nd">@clsinit_copy</span>
104 <div class="viewcode-block" id="PlanetlabNode"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.node.PlanetlabNode">[docs]</a><span class="k">class</span> <span class="nc">PlanetlabNode</span><span class="p">(</span><span class="n">LinuxNode</span><span class="p">):</span>
105     <span class="n">_rtype</span> <span class="o">=</span> <span class="s">&quot;planetlab::Node&quot;</span>
106     <span class="n">_help</span> <span class="o">=</span> <span class="s">&quot;Controls a PlanetLab host accessible using a SSH key &quot;</span> \
107             <span class="s">&quot;associated to a PlanetLab user account&quot;</span>
108     <span class="n">_platform</span> <span class="o">=</span> <span class="s">&quot;planetlab&quot;</span>
109
110     <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>
111
112     <span class="nd">@classmethod</span>
113     <span class="k">def</span> <span class="nf">_register_attributes</span><span class="p">(</span><span class="n">cls</span><span class="p">):</span>
114         <span class="n">ip</span> <span class="o">=</span> <span class="n">Attribute</span><span class="p">(</span><span class="s">&quot;ip&quot;</span><span class="p">,</span> <span class="s">&quot;PlanetLab host public IP address&quot;</span><span class="p">,</span>
115                     <span class="n">flags</span> <span class="o">=</span> <span class="n">Flags</span><span class="o">.</span><span class="n">Design</span><span class="p">)</span>
116
117         <span class="n">pl_url</span> <span class="o">=</span> <span class="n">Attribute</span><span class="p">(</span><span class="s">&quot;plcApiUrl&quot;</span><span class="p">,</span> <span class="s">&quot;URL of PlanetLab PLCAPI host </span><span class="se">\</span>
118 <span class="s">                    (e.g. www.planet-lab.eu or www.planet-lab.org) &quot;</span><span class="p">,</span>
119                     <span class="n">default</span> <span class="o">=</span> <span class="s">&quot;www.planet-lab.eu&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">Credential</span><span class="p">)</span>
121
122         <span class="n">pl_ptn</span> <span class="o">=</span> <span class="n">Attribute</span><span class="p">(</span><span class="s">&quot;plcApiPattern&quot;</span><span class="p">,</span> <span class="s">&quot;PLC API service regexp pattern </span><span class="se">\</span>
123 <span class="s">                    (e.g. https://</span><span class="si">%(hostname)s</span><span class="s">:443/PLCAPI/ ) &quot;</span><span class="p">,</span>
124                     <span class="n">default</span> <span class="o">=</span> <span class="s">&quot;https://</span><span class="si">%(hostname)s</span><span class="s">:443/PLCAPI/&quot;</span><span class="p">,</span>
125                     <span class="n">flags</span> <span class="o">=</span> <span class="n">Flags</span><span class="o">.</span><span class="n">Design</span><span class="p">)</span>
126     
127         <span class="n">pl_user</span> <span class="o">=</span> <span class="n">Attribute</span><span class="p">(</span><span class="s">&quot;pluser&quot;</span><span class="p">,</span> <span class="s">&quot;PlanetLab account user, as the one to </span><span class="se">\</span>
128 <span class="s">                    authenticate in the website) &quot;</span><span class="p">,</span>
129                     <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>
130
131         <span class="n">pl_password</span> <span class="o">=</span> <span class="n">Attribute</span><span class="p">(</span><span class="s">&quot;plpassword&quot;</span><span class="p">,</span> 
132                         <span class="s">&quot;PlanetLab account password, as </span><span class="se">\</span>
133 <span class="s">                        the one to authenticate in the website) &quot;</span><span class="p">,</span>
134                         <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>
135
136         <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>
137 <span class="s">                discovery. May use wildcards.&quot;</span><span class="p">,</span>
138                 <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>
139
140         <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>
141 <span class="s">                    resource discovery. May use wildcards.&quot;</span><span class="p">,</span>
142                     <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>
143
144         <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>
145 <span class="s">                    resource discovery. May use wildcards.&quot;</span><span class="p">,</span>
146                     <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>
147
148         <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>
149 <span class="s">                        during resource discovery.&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">Enumerate</span><span class="p">,</span>
151                         <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> 
152                                     <span class="s">&quot;i386&quot;</span><span class="p">],</span>
153                         <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>
154
155         <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>
156 <span class="s">                            system during resource discovery.&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">Enumerate</span><span class="p">,</span>
158                             <span class="n">allowed</span> <span class="o">=</span>  <span class="p">[</span><span class="s">&quot;f8&quot;</span><span class="p">,</span>
159                                         <span class="s">&quot;f12&quot;</span><span class="p">,</span>
160                                         <span class="s">&quot;f14&quot;</span><span class="p">,</span>
161                                         <span class="s">&quot;centos&quot;</span><span class="p">,</span>
162                                         <span class="s">&quot;other&quot;</span><span class="p">],</span>
163                             <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>
164
165         <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>
166 <span class="s">                            while picking PlanetLab nodes. Specifies a lower </span><span class="se">\</span>
167 <span class="s">                            acceptable bound.&quot;</span><span class="p">,</span>
168                             <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>
169                             <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>
170                             <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>
171
172         <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>
173 <span class="s">                            while picking PlanetLab nodes. Specifies an upper </span><span class="se">\</span>
174 <span class="s">                            acceptable bound.&quot;</span><span class="p">,</span>
175                             <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>
176                             <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>
177                             <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>
178
179         <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>
180 <span class="s">                            bandwidth while picking PlanetLab nodes. </span><span class="se">\</span>
181 <span class="s">                            Specifies a lower acceptable bound.&quot;</span><span class="p">,</span>
182                             <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>
183                             <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>
184                             <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>
185
186         <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>
187 <span class="s">                            bandwidth while picking PlanetLab nodes. </span><span class="se">\</span>
188 <span class="s">                            Specifies an upper acceptable bound.&quot;</span><span class="p">,</span>
189                             <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>
190                             <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>
191                             <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>
192
193         <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>
194 <span class="s">                    picking PlanetLab nodes. Specifies a lower acceptable </span><span class="se">\</span>
195 <span class="s">                    bound.&quot;</span><span class="p">,</span>
196                     <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>
197                     <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>
198                     <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>
199
200         <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>
201 <span class="s">                    picking PlanetLab nodes. Specifies an upper acceptable </span><span class="se">\</span>
202 <span class="s">                    bound.&quot;</span><span class="p">,</span>
203                     <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>
204                     <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>
205                     <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>
206
207         <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>
208 <span class="s">                    picking PlanetLab nodes. Specifies a lower acceptable </span><span class="se">\</span>
209 <span class="s">                    bound.&quot;</span><span class="p">,</span>
210                     <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>
211                     <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>
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">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>
215 <span class="s">                    picking PlanetLab nodes. Specifies an upper acceptable </span><span class="se">\</span>
216 <span class="s">                    bound.&quot;</span><span class="p">,</span>
217                     <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>
218                     <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>
219                     <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>
220
221         <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>
222 <span class="s">                        information about the node. Values are year,month, </span><span class="se">\</span>
223 <span class="s">                        week, latest&quot;</span><span class="p">,</span>
224                         <span class="n">default</span> <span class="o">=</span> <span class="s">&quot;week&quot;</span><span class="p">,</span>
225                         <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>
226                         <span class="n">allowed</span> <span class="o">=</span> <span class="p">[</span><span class="s">&quot;latest&quot;</span><span class="p">,</span>
227                                     <span class="s">&quot;week&quot;</span><span class="p">,</span>
228                                     <span class="s">&quot;month&quot;</span><span class="p">,</span>
229                                     <span class="s">&quot;year&quot;</span><span class="p">],</span>
230                         <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>
231
232         <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>
233 <span class="s">                        in the user&#39;s home directory under .nepi directory. This file </span><span class="se">\</span>
234 <span class="s">                        contains a list of PL nodes to blacklist, and at the end </span><span class="se">\</span>
235 <span class="s">                        of the experiment execution the new blacklisted nodes are added.&quot;</span><span class="p">,</span>
236                     <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>
237                     <span class="n">default</span> <span class="o">=</span> <span class="bp">False</span><span class="p">,</span>
238                     <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>
239
240         <span class="n">cls</span><span class="o">.</span><span class="n">_register_attribute</span><span class="p">(</span><span class="n">ip</span><span class="p">)</span>
241         <span class="n">cls</span><span class="o">.</span><span class="n">_register_attribute</span><span class="p">(</span><span class="n">pl_url</span><span class="p">)</span>
242         <span class="n">cls</span><span class="o">.</span><span class="n">_register_attribute</span><span class="p">(</span><span class="n">pl_ptn</span><span class="p">)</span>
243         <span class="n">cls</span><span class="o">.</span><span class="n">_register_attribute</span><span class="p">(</span><span class="n">pl_user</span><span class="p">)</span>
244         <span class="n">cls</span><span class="o">.</span><span class="n">_register_attribute</span><span class="p">(</span><span class="n">pl_password</span><span class="p">)</span>
245         <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>
246         <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>
247         <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>
248         <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>
249         <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>
250         <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>
251         <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>
252         <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>
253         <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>
254         <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>
255         <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>
256         <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>
257         <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>
258         <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>
259         <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>
260
261     <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>
262         <span class="nb">super</span><span class="p">(</span><span class="n">PlanetlabNode</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>
263
264         <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>
265         <span class="bp">self</span><span class="o">.</span><span class="n">_plapi</span> <span class="o">=</span> <span class="bp">None</span>
266         <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>
267         <span class="bp">self</span><span class="o">.</span><span class="n">_slicenode</span> <span class="o">=</span> <span class="bp">False</span>
268         <span class="bp">self</span><span class="o">.</span><span class="n">_hostname</span> <span class="o">=</span> <span class="bp">False</span>
269
270         <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>
271             <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>
272             <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>
273
274         <span class="c"># Blacklist file</span>
275         <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>
276         <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>
277         <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>
278             <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>
279                 <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>
280             <span class="k">else</span><span class="p">:</span>
281                 <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>
282                 <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>
283
284     <span class="k">def</span> <span class="nf">_skip_provision</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
285         <span class="n">pl_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;pluser&quot;</span><span class="p">)</span>
286         <span class="n">pl_pass</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;plpassword&quot;</span><span class="p">)</span>
287         <span class="k">if</span> <span class="ow">not</span> <span class="n">pl_user</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">pl_pass</span><span class="p">:</span>
288             <span class="k">return</span> <span class="bp">True</span>
289         <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="bp">False</span>
290     
291     <span class="nd">@property</span>
292 <div class="viewcode-block" id="PlanetlabNode.plapi"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.node.PlanetlabNode.plapi">[docs]</a>    <span class="k">def</span> <span class="nf">plapi</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
293         <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_plapi</span><span class="p">:</span>
294             <span class="n">pl_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;pluser&quot;</span><span class="p">)</span>
295             <span class="n">pl_pass</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;plpassword&quot;</span><span class="p">)</span>
296             <span class="n">pl_url</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;plcApiUrl&quot;</span><span class="p">)</span>
297             <span class="n">pl_ptn</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;plcApiPattern&quot;</span><span class="p">)</span>
298             <span class="n">_plapi</span> <span class="o">=</span> <span class="n">PLCAPIFactory</span><span class="o">.</span><span class="n">get_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_url</span><span class="p">,</span>
299                 <span class="n">pl_ptn</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_ecobj</span><span class="p">())</span>
300             
301             <span class="k">if</span> <span class="ow">not</span> <span class="n">_plapi</span><span class="p">:</span>
302                 <span class="bp">self</span><span class="o">.</span><span class="n">fail_plapi</span><span class="p">()</span>
303         
304             <span class="bp">self</span><span class="o">.</span><span class="n">_plapi</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">_plapi</span><span class="p">)</span>
305
306         <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_plapi</span><span class="p">()</span>
307 </div>
308 <div class="viewcode-block" id="PlanetlabNode.do_discover"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.node.PlanetlabNode.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>
309         <span class="sd">&quot;&quot;&quot;</span>
310 <span class="sd">        Based on the attributes defined by the user, discover the suitable </span>
311 <span class="sd">        nodes for provision.</span>
312 <span class="sd">        &quot;&quot;&quot;</span>
313         <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_skip_provision</span><span class="p">():</span>
314             <span class="nb">super</span><span class="p">(</span><span class="n">PlanetlabNode</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>
315             <span class="k">return</span>
316
317         <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>
318         <span class="k">if</span> <span class="n">hostname</span><span class="p">:</span>
319             <span class="c"># the user specified one particular node to be provisioned</span>
320             <span class="bp">self</span><span class="o">.</span><span class="n">_hostname</span> <span class="o">=</span> <span class="bp">True</span>
321             <span class="n">node_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_nodes_id</span><span class="p">({</span><span class="s">&#39;hostname&#39;</span><span class="p">:</span><span class="n">hostname</span><span class="p">})</span>
322             <span class="n">node_id</span> <span class="o">=</span> <span class="n">node_id</span><span class="o">.</span><span class="n">pop</span><span class="p">()[</span><span class="s">&#39;node_id&#39;</span><span class="p">]</span>
323
324             <span class="c"># check that the node is not blacklisted or being provisioned</span>
325             <span class="c"># by other RM</span>
326             <span class="k">with</span> <span class="n">PlanetlabNode</span><span class="o">.</span><span class="n">lock</span><span class="p">:</span>
327                 <span class="n">plist</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">plapi</span><span class="o">.</span><span class="n">reserved</span><span class="p">()</span>
328                 <span class="n">blist</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">plapi</span><span class="o">.</span><span class="n">blacklisted</span><span class="p">()</span>
329                 <span class="k">if</span> <span class="n">node_id</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">blist</span> <span class="ow">and</span> <span class="n">node_id</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">plist</span><span class="p">:</span>
330                 
331                     <span class="c"># check that is really alive, by performing ping</span>
332                     <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">node_id</span><span class="p">)</span>
333                     <span class="k">if</span> <span class="ow">not</span> <span class="n">ping_ok</span><span class="p">:</span>
334                         <span class="bp">self</span><span class="o">.</span><span class="n">_blacklist_node</span><span class="p">(</span><span class="n">node_id</span><span class="p">)</span>
335                         <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>
336                     <span class="k">else</span><span class="p">:</span>
337                         <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">node_id</span><span class="p">]):</span>
338                             <span class="bp">self</span><span class="o">.</span><span class="n">_slicenode</span> <span class="o">=</span> <span class="bp">True</span>
339                         <span class="bp">self</span><span class="o">.</span><span class="n">_put_node_in_provision</span><span class="p">(</span><span class="n">node_id</span><span class="p">)</span>
340                         <span class="bp">self</span><span class="o">.</span><span class="n">_node_to_provision</span> <span class="o">=</span> <span class="n">node_id</span>
341                 <span class="k">else</span><span class="p">:</span>
342                     <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>
343             <span class="nb">super</span><span class="p">(</span><span class="n">PlanetlabNode</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>
344         
345         <span class="k">else</span><span class="p">:</span>
346             <span class="c"># the user specifies constraints based on attributes, zero, one or </span>
347             <span class="c"># more nodes can match these constraints </span>
348             <span class="n">nodes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_filter_based_on_attributes</span><span class="p">()</span>
349
350             <span class="c"># nodes that are already part of user&#39;s slice have the priority to</span>
351             <span class="c"># provisioned</span>
352             <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">nodes</span><span class="p">)</span>
353             <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">nodes</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>
354             
355             <span class="n">node_id</span> <span class="o">=</span> <span class="bp">None</span>
356             <span class="k">if</span> <span class="n">nodes_inslice</span><span class="p">:</span>
357                 <span class="n">node_id</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_inslice</span><span class="p">)</span>
358                 <span class="bp">self</span><span class="o">.</span><span class="n">_slicenode</span> <span class="o">=</span> <span class="bp">True</span>                
359                 
360             <span class="k">if</span> <span class="ow">not</span> <span class="n">node_id</span><span class="p">:</span>
361                 <span class="c"># Either there were no matching nodes in the user&#39;s slice, or</span>
362                 <span class="c"># the nodes in the slice  were blacklisted or being provisioned</span>
363                 <span class="c"># by other RM. Note nodes_not_inslice is never empty</span>
364                 <span class="n">node_id</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_not_inslice</span><span class="p">)</span>
365                 <span class="bp">self</span><span class="o">.</span><span class="n">_slicenode</span> <span class="o">=</span> <span class="bp">False</span>
366
367             <span class="k">if</span> <span class="n">node_id</span><span class="p">:</span>
368                 <span class="bp">self</span><span class="o">.</span><span class="n">_node_to_provision</span> <span class="o">=</span> <span class="n">node_id</span>
369                 <span class="k">try</span><span class="p">:</span>
370                     <span class="bp">self</span><span class="o">.</span><span class="n">_set_hostname_attr</span><span class="p">(</span><span class="n">node_id</span><span class="p">)</span>
371                     <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>
372                     <span class="nb">super</span><span class="p">(</span><span class="n">PlanetlabNode</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>
373                 <span class="k">except</span><span class="p">:</span>
374                     <span class="k">with</span> <span class="n">PlanetlabNode</span><span class="o">.</span><span class="n">lock</span><span class="p">:</span>
375                         <span class="bp">self</span><span class="o">.</span><span class="n">_blacklist_node</span><span class="p">(</span><span class="n">node_id</span><span class="p">)</span>
376                     <span class="bp">self</span><span class="o">.</span><span class="n">do_discover</span><span class="p">()</span>
377             <span class="k">else</span><span class="p">:</span>
378                <span class="bp">self</span><span class="o">.</span><span class="n">fail_not_enough_nodes</span><span class="p">()</span> 
379             </div>
380 <div class="viewcode-block" id="PlanetlabNode.do_provision"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.node.PlanetlabNode.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>
381         <span class="sd">&quot;&quot;&quot;</span>
382 <span class="sd">        Add node to user&#39;s slice after verifing that the node is functioning</span>
383 <span class="sd">        correctly</span>
384 <span class="sd">        &quot;&quot;&quot;</span>
385         <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_skip_provision</span><span class="p">():</span>
386             <span class="nb">super</span><span class="p">(</span><span class="n">PlanetlabNode</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>
387             <span class="k">return</span>
388
389         <span class="n">provision_ok</span> <span class="o">=</span> <span class="bp">False</span>
390         <span class="n">ssh_ok</span> <span class="o">=</span> <span class="bp">False</span>
391         <span class="n">proc_ok</span> <span class="o">=</span> <span class="bp">False</span>
392         <span class="n">timeout</span> <span class="o">=</span> <span class="mi">1800</span>
393
394         <span class="k">while</span> <span class="ow">not</span> <span class="n">provision_ok</span><span class="p">:</span>
395             <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>
396             <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>
397                 <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>
398                 <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">node</span><span class="p">]):</span>
399                     <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span> <span class="s">&quot;Node added to slice&quot;</span> <span class="p">)</span>
400                 <span class="k">else</span><span class="p">:</span>
401                     <span class="bp">self</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s">&quot; Could not add to slice &quot;</span><span class="p">)</span>
402                     <span class="k">with</span> <span class="n">PlanetlabNode</span><span class="o">.</span><span class="n">lock</span><span class="p">:</span>
403                         <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>
404                     <span class="bp">self</span><span class="o">.</span><span class="n">do_discover</span><span class="p">()</span>
405                     <span class="k">continue</span>
406
407                 <span class="c"># check ssh connection</span>
408                 <span class="n">t</span> <span class="o">=</span> <span class="mi">0</span> 
409                 <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>
410
411                     <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>
412                     <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>
413                     <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>
414                         <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>
415                         <span class="n">t</span> <span class="o">=</span> <span class="n">t</span> <span class="o">+</span> <span class="mi">60</span>
416                         <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>
417                         <span class="k">continue</span>
418                     <span class="k">else</span><span class="p">:</span>
419                         <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>
420                         <span class="n">ssh_ok</span> <span class="o">=</span> <span class="bp">True</span>
421                         <span class="k">continue</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;echo </span><span class="se">\&#39;</span><span class="s">GOOD NODE</span><span class="se">\&#39;</span><span class="s">&#39;</span>
424                 <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>
425                 <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>
426                     <span class="n">ssh_ok</span> <span class="o">=</span> <span class="bp">True</span>
427
428             <span class="k">if</span> <span class="ow">not</span> <span class="n">ssh_ok</span><span class="p">:</span>
429                 <span class="c"># the timeout was reach without establishing ssh connection</span>
430                 <span class="c"># the node is blacklisted, deleted from the slice, and a new</span>
431                 <span class="c"># node to provision is discovered</span>
432                 <span class="k">with</span> <span class="n">PlanetlabNode</span><span class="o">.</span><span class="n">lock</span><span class="p">:</span>
433                     <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>
434                     <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>
435                     <span class="c">#self._delete_node_from_slice(node)</span>
436                 <span class="bp">self</span><span class="o">.</span><span class="n">do_discover</span><span class="p">()</span>
437                 <span class="k">continue</span>
438             
439             <span class="c"># check /proc directory is mounted (ssh_ok = True)</span>
440             <span class="c"># and file system is not read only</span>
441             <span class="k">else</span><span class="p">:</span>
442                 <span class="n">cmd</span> <span class="o">=</span> <span class="s">&#39;mount |grep proc&#39;</span>
443                 <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>
444                 <span class="n">cmd</span> <span class="o">=</span> <span class="s">&#39;touch /tmp/tmpfile; rm /tmp/tmpfile&#39;</span>
445                 <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>
446                 <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> \
447                     <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>
448                     <span class="k">with</span> <span class="n">PlanetlabNode</span><span class="o">.</span><span class="n">lock</span><span class="p">:</span>
449                         <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>
450                         <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>
451                         <span class="c">#self._delete_node_from_slice(node)</span>
452                     <span class="bp">self</span><span class="o">.</span><span class="n">do_discover</span><span class="p">()</span>
453                     <span class="k">continue</span>
454             
455                 <span class="k">else</span><span class="p">:</span>
456                     <span class="n">provision_ok</span> <span class="o">=</span> <span class="bp">True</span>
457                     <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>
458                         <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>            
459                     <span class="c"># set IP attribute</span>
460                     <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">node</span><span class="p">)</span>
461                     <span class="bp">self</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s">&quot;ip&quot;</span><span class="p">,</span> <span class="n">ip</span><span class="p">)</span>
462                     <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>            
463             
464         <span class="nb">super</span><span class="p">(</span><span class="n">PlanetlabNode</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>
465 </div>
466 <div class="viewcode-block" id="PlanetlabNode.do_release"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.node.PlanetlabNode.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>
467         <span class="nb">super</span><span class="p">(</span><span class="n">PlanetlabNode</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>
468         <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>
469             <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot; Releasing PLC API &quot;</span><span class="p">)</span>
470             <span class="bp">self</span><span class="o">.</span><span class="n">plapi</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
471 </div>
472     <span class="k">def</span> <span class="nf">_filter_based_on_attributes</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
473         <span class="sd">&quot;&quot;&quot;</span>
474 <span class="sd">        Retrive the list of nodes ids that match user&#39;s constraints </span>
475 <span class="sd">        &quot;&quot;&quot;</span>
476         <span class="c"># Map user&#39;s defined attributes with tagnames of PlanetLab</span>
477         <span class="n">timeframe</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;timeframe&quot;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
478         <span class="n">attr_to_tags</span> <span class="o">=</span> <span class="p">{</span>
479             <span class="s">&#39;city&#39;</span> <span class="p">:</span> <span class="s">&#39;city&#39;</span><span class="p">,</span>
480             <span class="s">&#39;country&#39;</span> <span class="p">:</span> <span class="s">&#39;country&#39;</span><span class="p">,</span>
481             <span class="s">&#39;region&#39;</span> <span class="p">:</span> <span class="s">&#39;region&#39;</span><span class="p">,</span>
482             <span class="s">&#39;architecture&#39;</span> <span class="p">:</span> <span class="s">&#39;arch&#39;</span><span class="p">,</span>
483             <span class="s">&#39;operatingSystem&#39;</span> <span class="p">:</span> <span class="s">&#39;fcdistro&#39;</span><span class="p">,</span>
484             <span class="s">&#39;minReliability&#39;</span> <span class="p">:</span> <span class="s">&#39;reliability</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">timeframe</span><span class="p">,</span>
485             <span class="s">&#39;maxReliability&#39;</span> <span class="p">:</span> <span class="s">&#39;reliability</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">timeframe</span><span class="p">,</span>
486             <span class="s">&#39;minBandwidth&#39;</span> <span class="p">:</span> <span class="s">&#39;bw</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">timeframe</span><span class="p">,</span>
487             <span class="s">&#39;maxBandwidth&#39;</span> <span class="p">:</span> <span class="s">&#39;bw</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">timeframe</span><span class="p">,</span>
488             <span class="s">&#39;minLoad&#39;</span> <span class="p">:</span> <span class="s">&#39;load</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">timeframe</span><span class="p">,</span>
489             <span class="s">&#39;maxLoad&#39;</span> <span class="p">:</span> <span class="s">&#39;load</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">timeframe</span><span class="p">,</span>
490             <span class="s">&#39;minCpu&#39;</span> <span class="p">:</span> <span class="s">&#39;cpu</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">timeframe</span><span class="p">,</span>
491             <span class="s">&#39;maxCpu&#39;</span> <span class="p">:</span> <span class="s">&#39;cpu</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">timeframe</span><span class="p">,</span>
492         <span class="p">}</span>
493         
494         <span class="n">nodes_id</span> <span class="o">=</span> <span class="p">[]</span>
495         <span class="n">filters</span> <span class="o">=</span> <span class="p">{}</span>
496
497         <span class="k">for</span> <span class="n">attr_name</span><span class="p">,</span> <span class="n">attr_obj</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_attrs</span><span class="o">.</span><span class="n">iteritems</span><span class="p">():</span>
498             <span class="n">attr_value</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="n">attr_name</span><span class="p">)</span>
499             
500             <span class="k">if</span> <span class="n">attr_value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">attr_obj</span><span class="o">.</span><span class="n">has_flag</span><span class="p">(</span><span class="n">Flags</span><span class="o">.</span><span class="n">Filter</span><span class="p">)</span> <span class="ow">and</span> \
501                 <span class="n">attr_name</span> <span class="o">!=</span> <span class="s">&#39;timeframe&#39;</span><span class="p">:</span>
502         
503                 <span class="n">attr_tag</span> <span class="o">=</span> <span class="n">attr_to_tags</span><span class="p">[</span><span class="n">attr_name</span><span class="p">]</span>
504                 <span class="n">filters</span><span class="p">[</span><span class="s">&#39;tagname&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">attr_tag</span>
505
506                 <span class="c"># filter nodes by fixed constraints e.g. operating system</span>
507                 <span class="k">if</span> <span class="ow">not</span> <span class="s">&#39;min&#39;</span> <span class="ow">in</span> <span class="n">attr_name</span> <span class="ow">and</span> <span class="ow">not</span> <span class="s">&#39;max&#39;</span> <span class="ow">in</span> <span class="n">attr_name</span><span class="p">:</span>
508                     <span class="n">filters</span><span class="p">[</span><span class="s">&#39;value&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">attr_value</span>
509                     <span class="n">nodes_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_filter_by_fixed_attr</span><span class="p">(</span><span class="n">filters</span><span class="p">,</span> <span class="n">nodes_id</span><span class="p">)</span>
510
511                 <span class="c"># filter nodes by range constraints e.g. max bandwidth</span>
512                 <span class="k">elif</span> <span class="p">(</span><span class="s">&#39;min&#39;</span> <span class="ow">or</span> <span class="s">&#39;max&#39;</span><span class="p">)</span> <span class="ow">in</span> <span class="n">attr_name</span><span class="p">:</span>
513                     <span class="n">nodes_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_filter_by_range_attr</span><span class="p">(</span><span class="n">attr_name</span><span class="p">,</span> <span class="n">attr_value</span><span class="p">,</span> <span class="n">filters</span><span class="p">,</span> <span class="n">nodes_id</span><span class="p">)</span>
514
515         <span class="k">if</span> <span class="ow">not</span> <span class="n">filters</span><span class="p">:</span>
516             <span class="n">nodes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_nodes_id</span><span class="p">()</span>
517             <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">nodes</span><span class="p">:</span>
518                 <span class="n">nodes_id</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">node</span><span class="p">[</span><span class="s">&#39;node_id&#39;</span><span class="p">])</span>
519         <span class="k">return</span> <span class="n">nodes_id</span>
520                     
521     <span class="k">def</span> <span class="nf">_filter_by_fixed_attr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filters</span><span class="p">,</span> <span class="n">nodes_id</span><span class="p">):</span>
522         <span class="sd">&quot;&quot;&quot;</span>
523 <span class="sd">        Query PLCAPI for nodes ids matching fixed attributes defined by the</span>
524 <span class="sd">        user</span>
525 <span class="sd">        &quot;&quot;&quot;</span>
526         <span class="n">node_tags</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">plapi</span><span class="o">.</span><span class="n">get_node_tags</span><span class="p">(</span><span class="n">filters</span><span class="p">)</span>
527         <span class="k">if</span> <span class="n">node_tags</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
528
529             <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">nodes_id</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
530                 <span class="c"># first attribute being matched</span>
531                 <span class="k">for</span> <span class="n">node_tag</span> <span class="ow">in</span> <span class="n">node_tags</span><span class="p">:</span>
532                     <span class="n">nodes_id</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">node_tag</span><span class="p">[</span><span class="s">&#39;node_id&#39;</span><span class="p">])</span>
533             <span class="k">else</span><span class="p">:</span>
534                 <span class="c"># remove the nodes ids that don&#39;t match the new attribute</span>
535                 <span class="c"># that is being match</span>
536
537                 <span class="n">nodes_id_tmp</span> <span class="o">=</span> <span class="p">[]</span>
538                 <span class="k">for</span> <span class="n">node_tag</span> <span class="ow">in</span> <span class="n">node_tags</span><span class="p">:</span>
539                     <span class="k">if</span> <span class="n">node_tag</span><span class="p">[</span><span class="s">&#39;node_id&#39;</span><span class="p">]</span> <span class="ow">in</span> <span class="n">nodes_id</span><span class="p">:</span>
540                         <span class="n">nodes_id_tmp</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">node_tag</span><span class="p">[</span><span class="s">&#39;node_id&#39;</span><span class="p">])</span>
541
542                 <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">nodes_id_tmp</span><span class="p">):</span>
543                     <span class="n">nodes_id</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">nodes_id</span><span class="p">)</span> <span class="o">&amp;</span> <span class="nb">set</span><span class="p">(</span><span class="n">nodes_id_tmp</span><span class="p">)</span>
544                 <span class="k">else</span><span class="p">:</span>
545                     <span class="c"># no node from before match the new constraint</span>
546                     <span class="bp">self</span><span class="o">.</span><span class="n">fail_discovery</span><span class="p">()</span>
547         <span class="k">else</span><span class="p">:</span>
548             <span class="c"># no nodes match the filter applied</span>
549             <span class="bp">self</span><span class="o">.</span><span class="n">fail_discovery</span><span class="p">()</span>
550
551         <span class="k">return</span> <span class="n">nodes_id</span>
552
553     <span class="k">def</span> <span class="nf">_filter_by_range_attr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">attr_name</span><span class="p">,</span> <span class="n">attr_value</span><span class="p">,</span> <span class="n">filters</span><span class="p">,</span> <span class="n">nodes_id</span><span class="p">):</span>
554         <span class="sd">&quot;&quot;&quot;</span>
555 <span class="sd">        Query PLCAPI for nodes ids matching attributes defined in a certain</span>
556 <span class="sd">        range, by the user</span>
557 <span class="sd">        &quot;&quot;&quot;</span>
558         <span class="n">node_tags</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">plapi</span><span class="o">.</span><span class="n">get_node_tags</span><span class="p">(</span><span class="n">filters</span><span class="p">)</span>
559         <span class="k">if</span> <span class="n">node_tags</span><span class="p">:</span>
560             
561             <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">nodes_id</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
562                 <span class="c"># first attribute being matched</span>
563                 <span class="k">for</span> <span class="n">node_tag</span> <span class="ow">in</span> <span class="n">node_tags</span><span class="p">:</span>
564  
565                    <span class="c"># check that matches the min or max restriction</span>
566                     <span class="k">if</span> <span class="s">&#39;min&#39;</span> <span class="ow">in</span> <span class="n">attr_name</span> <span class="ow">and</span> <span class="n">node_tag</span><span class="p">[</span><span class="s">&#39;value&#39;</span><span class="p">]</span> <span class="o">!=</span> <span class="s">&#39;n/a&#39;</span> <span class="ow">and</span> \
567                         <span class="nb">float</span><span class="p">(</span><span class="n">node_tag</span><span class="p">[</span><span class="s">&#39;value&#39;</span><span class="p">])</span> <span class="o">&gt;</span> <span class="n">attr_value</span><span class="p">:</span>
568                         <span class="n">nodes_id</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">node_tag</span><span class="p">[</span><span class="s">&#39;node_id&#39;</span><span class="p">])</span>
569
570                     <span class="k">elif</span> <span class="s">&#39;max&#39;</span> <span class="ow">in</span> <span class="n">attr_name</span> <span class="ow">and</span> <span class="n">node_tag</span><span class="p">[</span><span class="s">&#39;value&#39;</span><span class="p">]</span> <span class="o">!=</span> <span class="s">&#39;n/a&#39;</span> <span class="ow">and</span> \
571                         <span class="nb">float</span><span class="p">(</span><span class="n">node_tag</span><span class="p">[</span><span class="s">&#39;value&#39;</span><span class="p">])</span> <span class="o">&lt;</span> <span class="n">attr_value</span><span class="p">:</span>
572                         <span class="n">nodes_id</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">node_tag</span><span class="p">[</span><span class="s">&#39;node_id&#39;</span><span class="p">])</span>
573             <span class="k">else</span><span class="p">:</span>
574
575                 <span class="c"># remove the nodes ids that don&#39;t match the new attribute</span>
576                 <span class="c"># that is being match</span>
577                 <span class="n">nodes_id_tmp</span> <span class="o">=</span> <span class="p">[]</span>
578                 <span class="k">for</span> <span class="n">node_tag</span> <span class="ow">in</span> <span class="n">node_tags</span><span class="p">:</span>
579
580                     <span class="c"># check that matches the min or max restriction and was a</span>
581                     <span class="c"># matching previous filters</span>
582                     <span class="k">if</span> <span class="s">&#39;min&#39;</span> <span class="ow">in</span> <span class="n">attr_name</span> <span class="ow">and</span> <span class="n">node_tag</span><span class="p">[</span><span class="s">&#39;value&#39;</span><span class="p">]</span> <span class="o">!=</span> <span class="s">&#39;n/a&#39;</span> <span class="ow">and</span> \
583                         <span class="nb">float</span><span class="p">(</span><span class="n">node_tag</span><span class="p">[</span><span class="s">&#39;value&#39;</span><span class="p">])</span> <span class="o">&gt;</span> <span class="n">attr_value</span> <span class="ow">and</span> \
584                         <span class="n">node_tag</span><span class="p">[</span><span class="s">&#39;node_id&#39;</span><span class="p">]</span> <span class="ow">in</span> <span class="n">nodes_id</span><span class="p">:</span>
585                         <span class="n">nodes_id_tmp</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">node_tag</span><span class="p">[</span><span class="s">&#39;node_id&#39;</span><span class="p">])</span>
586
587                     <span class="k">elif</span> <span class="s">&#39;max&#39;</span> <span class="ow">in</span> <span class="n">attr_name</span> <span class="ow">and</span> <span class="n">node_tag</span><span class="p">[</span><span class="s">&#39;value&#39;</span><span class="p">]</span> <span class="o">!=</span> <span class="s">&#39;n/a&#39;</span> <span class="ow">and</span> \
588                         <span class="nb">float</span><span class="p">(</span><span class="n">node_tag</span><span class="p">[</span><span class="s">&#39;value&#39;</span><span class="p">])</span> <span class="o">&lt;</span> <span class="n">attr_value</span> <span class="ow">and</span> \
589                         <span class="n">node_tag</span><span class="p">[</span><span class="s">&#39;node_id&#39;</span><span class="p">]</span> <span class="ow">in</span> <span class="n">nodes_id</span><span class="p">:</span>
590                         <span class="n">nodes_id_tmp</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">node_tag</span><span class="p">[</span><span class="s">&#39;node_id&#39;</span><span class="p">])</span>
591
592                 <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">nodes_id_tmp</span><span class="p">):</span>
593                     <span class="n">nodes_id</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">nodes_id</span><span class="p">)</span> <span class="o">&amp;</span> <span class="nb">set</span><span class="p">(</span><span class="n">nodes_id_tmp</span><span class="p">)</span>
594                 <span class="k">else</span><span class="p">:</span>
595                     <span class="c"># no node from before match the new constraint</span>
596                     <span class="bp">self</span><span class="o">.</span><span class="n">fail_discovery</span><span class="p">()</span>
597
598         <span class="k">else</span><span class="p">:</span> <span class="c">#TODO CHECK</span>
599             <span class="c"># no nodes match the filter applied</span>
600             <span class="bp">self</span><span class="o">.</span><span class="n">fail_discovery</span><span class="p">()</span>
601
602         <span class="k">return</span> <span class="n">nodes_id</span>
603         
604     <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>
605         <span class="sd">&quot;&quot;&quot;</span>
606 <span class="sd">        From the possible nodes for provision, choose randomly to decrese the</span>
607 <span class="sd">        probability of different RMs choosing the same node for provision</span>
608 <span class="sd">        &quot;&quot;&quot;</span>
609         <span class="n">size</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span>
610         <span class="k">while</span> <span class="n">size</span><span class="p">:</span>
611             <span class="n">size</span> <span class="o">=</span> <span class="n">size</span> <span class="o">-</span> <span class="mi">1</span>
612             <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>
613             <span class="n">node_id</span> <span class="o">=</span> <span class="n">nodes</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>
614             <span class="n">nodes</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">=</span> <span class="n">nodes</span><span class="p">[</span><span class="n">size</span><span class="p">]</span>
615
616             <span class="c"># check the node is not blacklisted or being provision by other RM</span>
617             <span class="c"># and perform ping to check that is really alive</span>
618             <span class="k">with</span> <span class="n">PlanetlabNode</span><span class="o">.</span><span class="n">lock</span><span class="p">:</span>
619
620                 <span class="n">blist</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">plapi</span><span class="o">.</span><span class="n">blacklisted</span><span class="p">()</span>
621                 <span class="n">plist</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">plapi</span><span class="o">.</span><span class="n">reserved</span><span class="p">()</span>
622                 <span class="k">if</span> <span class="n">node_id</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">blist</span> <span class="ow">and</span> <span class="n">node_id</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">plist</span><span class="p">:</span>
623                     <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">node_id</span><span class="p">)</span>
624                     <span class="k">if</span> <span class="ow">not</span> <span class="n">ping_ok</span><span class="p">:</span>
625                         <span class="bp">self</span><span class="o">.</span><span class="n">_set_hostname_attr</span><span class="p">(</span><span class="n">node_id</span><span class="p">)</span>
626                         <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>
627                         <span class="bp">self</span><span class="o">.</span><span class="n">_blacklist_node</span><span class="p">(</span><span class="n">node_id</span><span class="p">)</span>
628                     <span class="k">else</span><span class="p">:</span>
629                         <span class="c"># discovered node for provision, added to provision list</span>
630                         <span class="bp">self</span><span class="o">.</span><span class="n">_put_node_in_provision</span><span class="p">(</span><span class="n">node_id</span><span class="p">)</span>
631                         <span class="k">return</span> <span class="n">node_id</span>
632
633     <span class="k">def</span> <span class="nf">_get_nodes_id</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filters</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
634         <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">plapi</span><span class="o">.</span><span class="n">get_nodes</span><span class="p">(</span><span class="n">filters</span><span class="p">,</span> <span class="n">fields</span><span class="o">=</span><span class="p">[</span><span class="s">&#39;node_id&#39;</span><span class="p">])</span>
635
636     <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">node_id</span><span class="p">):</span>
637         <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>
638         <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>
639         <span class="k">with</span> <span class="n">PlanetlabNode</span><span class="o">.</span><span class="n">lock</span><span class="p">:</span>
640             <span class="n">slice_nodes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">plapi</span><span class="o">.</span><span class="n">get_slice_nodes</span><span class="p">(</span><span class="n">slicename</span><span class="p">)</span>
641             <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot; Previous slice nodes </span><span class="si">%s</span><span class="s"> &quot;</span> <span class="o">%</span> <span class="n">slice_nodes</span><span class="p">)</span>
642             <span class="n">slice_nodes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">node_id</span><span class="p">)</span>
643             <span class="bp">self</span><span class="o">.</span><span class="n">plapi</span><span class="o">.</span><span class="n">add_slice_nodes</span><span class="p">(</span><span class="n">slicename</span><span class="p">,</span> <span class="n">slice_nodes</span><span class="p">)</span>
644
645     <span class="k">def</span> <span class="nf">_delete_node_from_slice</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="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>
647         <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>
648         <span class="bp">self</span><span class="o">.</span><span class="n">plapi</span><span class="o">.</span><span class="n">delete_slice_node</span><span class="p">(</span><span class="n">slicename</span><span class="p">,</span> <span class="p">[</span><span class="n">node</span><span class="p">])</span>
649
650     <span class="k">def</span> <span class="nf">_get_hostname</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
651         <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>
652         <span class="k">if</span> <span class="n">hostname</span><span class="p">:</span>
653             <span class="k">return</span> <span class="n">hostname</span>
654         <span class="n">ip</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;ip&quot;</span><span class="p">)</span>
655         <span class="k">if</span> <span class="n">ip</span><span class="p">:</span>
656             <span class="n">hostname</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">gethostbyaddr</span><span class="p">(</span><span class="n">ip</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
657             <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="n">hostname</span><span class="p">)</span>
658             <span class="k">return</span> <span class="n">hostname</span>
659         <span class="k">else</span><span class="p">:</span>
660             <span class="k">return</span> <span class="bp">None</span>
661
662     <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>
663         <span class="sd">&quot;&quot;&quot;</span>
664 <span class="sd">        Query PLCAPI for the hostname of a certain node id and sets the</span>
665 <span class="sd">        attribute hostname, it will over write the previous value</span>
666 <span class="sd">        &quot;&quot;&quot;</span>
667         <span class="n">hostname</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">plapi</span><span class="o">.</span><span class="n">get_nodes</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="p">[</span><span class="s">&#39;hostname&#39;</span><span class="p">])</span>
668         <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><span class="mi">0</span><span class="p">][</span><span class="s">&#39;hostname&#39;</span><span class="p">])</span>
669
670     <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">nodes_id</span><span class="p">):</span>
671         <span class="sd">&quot;&quot;&quot;</span>
672 <span class="sd">        Query PLCAPI to find out if any node id from nodes_id is in the user&#39;s</span>
673 <span class="sd">        slice</span>
674 <span class="sd">        &quot;&quot;&quot;</span>
675         <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>
676         <span class="n">slice_nodes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">plapi</span><span class="o">.</span><span class="n">get_slice_nodes</span><span class="p">(</span><span class="n">slicename</span><span class="p">)</span>
677         <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">nodes_id</span><span class="p">)</span> <span class="o">&amp;</span> <span class="nb">set</span><span class="p">(</span><span class="n">slice_nodes</span><span class="p">))</span>
678         <span class="k">return</span> <span class="n">nodes_inslice</span>
679
680     <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">node_id</span><span class="p">):</span>
681         <span class="sd">&quot;&quot;&quot;</span>
682 <span class="sd">        Perform ping command on node&#39;s IP matching node id</span>
683 <span class="sd">        &quot;&quot;&quot;</span>
684         <span class="n">ping_ok</span> <span class="o">=</span> <span class="bp">False</span>
685         <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">node_id</span><span class="p">)</span>
686         <span class="k">if</span> <span class="n">ip</span><span class="p">:</span>
687             <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>
688             <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>
689
690             <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>
691             <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>
692                 <span class="n">ping_ok</span> <span class="o">=</span> <span class="bp">True</span>
693        
694         <span class="k">return</span> <span class="n">ping_ok</span> 
695
696     <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">node</span><span class="p">):</span>
697         <span class="sd">&quot;&quot;&quot;</span>
698 <span class="sd">        Add node mal functioning node to blacklist</span>
699 <span class="sd">        &quot;&quot;&quot;</span>
700         <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>
701         <span class="bp">self</span><span class="o">.</span><span class="n">plapi</span><span class="o">.</span><span class="n">blacklist_host</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
702         <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>
703             <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>
704
705     <span class="k">def</span> <span class="nf">_put_node_in_provision</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
706         <span class="sd">&quot;&quot;&quot;</span>
707 <span class="sd">        Add node to the list of nodes being provisioned, in order for other RMs</span>
708 <span class="sd">        to not try to provision the same one again</span>
709 <span class="sd">        &quot;&quot;&quot;</span>
710         <span class="bp">self</span><span class="o">.</span><span class="n">plapi</span><span class="o">.</span><span class="n">reserve_host</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
711
712     <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">node_id</span><span class="p">):</span>
713         <span class="sd">&quot;&quot;&quot;</span>
714 <span class="sd">        Query PLCAPI for the IP of a node with certain node id</span>
715 <span class="sd">        &quot;&quot;&quot;</span>
716         <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> <span class="ow">or</span> \
717             <span class="bp">self</span><span class="o">.</span><span class="n">plapi</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="p">[</span><span class="s">&#39;hostname&#39;</span><span class="p">])[</span><span class="mi">0</span><span class="p">][</span><span class="s">&#39;hostname&#39;</span><span class="p">]</span>
718         <span class="k">try</span><span class="p">:</span>
719             <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>
720         <span class="k">except</span><span class="p">:</span>
721             <span class="c"># Fail while trying to find the IP</span>
722             <span class="k">return</span> <span class="bp">None</span>
723         <span class="k">return</span> <span class="n">ip</span>
724
725 <div class="viewcode-block" id="PlanetlabNode.fail_discovery"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.node.PlanetlabNode.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>
726         <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot;Discovery failed. No candidates found for node&quot;</span>
727         <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>
728         <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">,</span> <span class="n">msg</span>
729 </div>
730 <div class="viewcode-block" id="PlanetlabNode.fail_node_not_alive"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.node.PlanetlabNode.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>
731         <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>
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="PlanetlabNode.fail_node_not_available"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.node.PlanetlabNode.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>
735         <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>
736         <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">,</span> <span class="n">msg</span>
737 </div>
738 <div class="viewcode-block" id="PlanetlabNode.fail_not_enough_nodes"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.node.PlanetlabNode.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>
739         <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot;Not enough nodes available for provisioning&quot;</span>
740         <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">,</span> <span class="n">msg</span>
741 </div>
742 <div class="viewcode-block" id="PlanetlabNode.fail_plapi"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.node.PlanetlabNode.fail_plapi">[docs]</a>    <span class="k">def</span> <span class="nf">fail_plapi</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
743         <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot;Failing while trying to instanciate the PLC API.</span><span class="se">\n</span><span class="s">Set the&quot;</span> <span class="o">+</span> \
744             <span class="s">&quot; attributes pluser and plpassword.&quot;</span>
745         <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">,</span> <span class="n">msg</span>
746 </div>
747 <div class="viewcode-block" id="PlanetlabNode.valid_connection"><a class="viewcode-back" href="../../../../_layout/nepi.resources.planetlab.html#nepi.resources.planetlab.node.PlanetlabNode.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>
748         <span class="c"># TODO: Validate!</span>
749         <span class="k">return</span> <span class="bp">True</span>
750 </pre></div></div></div>
751
752           </div>
753         </div>
754       </div>
755       <div class="clearer"></div>
756     </div>
757     <div class="related">
758       <h3>Navigation</h3>
759       <ul>
760         <li class="right" style="margin-right: 10px">
761           <a href="../../../../genindex.html" title="General Index"
762              >index</a></li>
763         <li class="right" >
764           <a href="../../../../py-modindex.html" title="Python Module Index"
765              >modules</a> |</li>
766         <li><a href="../../../../index.html">NEPI 3.0 documentation</a> &raquo;</li>
767           <li><a href="../../../index.html" >Module code</a> &raquo;</li> 
768       </ul>
769     </div>
770     <div class="footer">
771         &copy; Copyright 2014, Alina Quereilhac, Lucia Guevgeozian Odizzio, Julien Tribino.
772       Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
773     </div>
774   </body>
775 </html>