Merge branch 'master' of ssh://git.onelab.eu/git/plewww
[plewww.git] / planetlab / nodes / nodes.php
1 <?php
2
3 // $Id$
4
5 // Require login
6 require_once 'plc_login.php';
7
8 // Get session and API handles
9 require_once 'plc_session.php';
10 global $plc, $api;
11
12 // Print header
13 require_once 'plc_drupal.php';
14 include 'plc_header.php';
15
16 // Common functions
17 require_once 'plc_functions.php';
18 require_once 'plc_objects.php';
19 require_once 'plc_peers.php';
20 require_once 'plc_visibletags2.php';
21 require_once 'linetabs.php';
22 require_once 'table2.php';
23 require_once 'nifty.php';
24 require_once 'toggle.php';
25 require_once 'columns.php';
26
27 // keep css separate for now
28 drupal_set_html_head('
29 <link href="/planetlab/css/my_slice.css" rel="stylesheet" type="text/css" />
30 ');
31
32
33 ini_set("memory_limit","64M");
34
35 // -------------------- 
36 // recognized URL arguments
37 $peerscope=$_GET['peerscope'];
38 $pattern=$_GET['pattern'];
39 $site_id=intval($_GET['site_id']);
40 $slice_id=intval($_GET['slice_id']);
41 $person_id=intval($_GET['person_id']);
42
43 // --- decoration
44 $title="Nodes";
45 $tabs=array();
46 $tabs []= tab_nodes();
47 if (count (plc_my_site_ids()) == 1) {
48     $tabs []= tab_nodes_mysite();
49 } else {
50     $tabs []= tab_nodes_all_mysite();
51 }
52 $tabs []= tab_nodes_local();
53
54 // -------------------- 
55 $node_filter=array();
56
57 //////////////////
58 // performs sanity check and summarize the result in a single column
59 function node_status ($node) {
60
61   $messages=array();
62   if ($node['node_type'] != 'regular' && $node['node_type'] != 'reservable' ) 
63     $messages []= $node['node_type'];
64
65   // checks on local nodes only
66   if ( ( ! $node['peer_id']) ) {
67     // has it got interfaces 
68     if (count($node['interface_ids']) == 0) 
69       $messages []= "No interface";
70   }
71   return plc_vertical_table($messages,'plc-warning');
72 }
73
74
75 $first_time_configuration = 'false';
76
77 if (plc_is_admin()) 
78         $default_configuration = "ID:f|hostname:f|ST:f|AU:f";
79 else
80         $default_configuration = "hostname:f|ST:f|AU:f";
81
82 //$extra_default = "LCN|DN|R|L|OS|MS|SN";
83 $column_configuration = "";
84 $slice_column_configuration = "";
85
86 $PersonTags=$api->GetPersonTags (array('person_id'=>$plc->person['person_id']));
87 //print_r($PersonTags);
88 foreach ($PersonTags as $ptag) {
89         if ($ptag['tagname'] == 'columnconf')
90         {
91                 $column_configuration = $ptag['value'];
92                 $conf_tag_id = $ptag['person_tag_id'];
93         }
94 }
95
96 //print("column configuration = ".$column_configuration);
97
98 $nodesconf_exists = false;
99 if ($column_configuration == "")
100 {
101         $column_configuration = "nodes;default";
102         $nodesconf_exists = true;
103 }
104 else {
105         $slice_conf = explode(";",$column_configuration);
106         for ($i=0; $i<count($slice_conf); $i++ ) {
107                 if ($slice_conf[$i] == "nodes")
108                 {
109                         $i++;
110                         $slice_column_configuration = $slice_conf[$i];
111                         $nodesconf_exists = true;
112                         break;
113                 }
114                 else
115                 {
116                         $i++;
117                         $slice_column_configuration = $slice_conf[$i];
118                 }
119         }
120 }
121
122 if ($nodesconf_exists == false)
123         $column_configuration = $column_configuration.";nodes;default";
124 //panos: need to define an "empty" configuration here (for the moment A column
125 //will be added by default the first time
126
127
128 if ($slice_column_configuration == "" || $slice_column_configuration == "default")
129         $full_configuration = $default_configuration;
130         
131 else
132         $full_configuration = $default_configuration."|".$slice_column_configuration;
133
134 //print("full configuration = ".$full_configuration);
135
136 // fetch nodes 
137 $node_fixed_columns=array('hostname','node_type','site_id','node_id','boot_state','last_contact','interface_ids','peer_id', 'slice_ids');
138
139 $fix_columns = array();
140 if (plc_is_admin()) 
141 $fix_columns[]=array('tagname'=>'node_id', 'header'=>'ID', 'type'=>'string', 'title'=>'The ID the node');
142 $fix_columns[]=array('tagname'=>'hostname', 'header'=>'hostname', 'type'=>'string', 'title'=>'The name of the node');
143 $fix_columns[]=array('tagname'=>'peer_id', 'header'=>'AU', 'type'=>'string', 'title'=>'Authority');
144 $fix_columns[]=array('tagname'=>'run_level', 'header'=>'ST', 'type'=>'string', 'title'=>'Status');
145 //$fix_columns[]=array('tagname'=>'node_type', 'header'=>'RES', 'type'=>'string', 'title'=>'Reservable');
146
147
148 $visibletags = new VisibleTags ($api, 'node');
149 $visibletags->columns();
150 $tag_columns = $visibletags->headers();
151
152 $extra_columns = array();
153 $extra_columns[]=array('tagname'=>'sitename', 'header'=>'SN', 'type'=>'string', 'title'=>'Site name', 'fetched'=>true);
154 $extra_columns[]=array('tagname'=>'domain', 'header'=>'DN', 'type'=>'string', 'title'=>'Toplevel domain name', 'fetched'=>true);
155 $extra_columns[]=array('tagname'=>'ipaddress', 'header'=>'IP', 'type'=>'string', 'title'=>'IP Address', 'fetched'=>true);
156 $extra_columns[]=array('tagname'=>'fcdistro', 'header'=>'OS', 'type'=>'string', 'title'=>'Operating system', 'fetched'=>false);
157
158 $ConfigureColumns =new PlekitColumns($full_configuration, $fix_columns, $tag_columns, $extra_columns);
159
160 $visiblecolumns = $ConfigureColumns->node_tags();
161
162 $node_columns=array_merge($node_fixed_columns,$visiblecolumns);
163
164 //$visibletags = new VisibleTags ($api, 'node');
165 //$visiblecolumns = $visibletags->column_names();
166 //print("<p>OLD");
167 //print_r($visiblecolumns);
168 //$node_columns=array_merge($node_fixed_columns,$visiblecolumns);
169
170
171 // server-side filtering - set pattern in $_GET for filtering on hostname
172 if ($pattern) {
173   $node_filter['hostname']=$pattern;
174   $title .= " matching " . $pattern;
175  } else {
176   $node_filter['hostname']="*";
177  }
178
179 // server-side selection on peerscope
180 $peerscope=new PeerScope($api,$_GET['peerscope']);
181 $node_filter=array_merge($node_filter,$peerscope->filter());
182 $title .= ' - ' . $peerscope->label();
183
184 if ($site_id) {
185   $sites=$api->GetSites(array($site_id));
186   $site=$sites[0];
187   $name=$site['name'];
188   $login_base=$site['login_base'];
189   $title .= t_site($site);
190   $tabs []= tab_site($site);
191   $node_filter['site_id']=array($site_id);
192 }
193
194 if ($slice_id) {
195   $slices=$api->GetSlices(array($slice_id),array('node_ids','name'));
196   $slice=$slices[0];
197   $title .= t_slice($slice);
198   $tabs []= tab_slice($slice);
199   $node_filter['node_id'] = $slice['node_ids'];
200  }
201
202 // person_id is set : this is mostly oriented towards people managing several sites
203 if ($person_id) {
204   // avoid doing a useless call to GetPersons if the person_id is already known though $plc,
205   // as this is mostly done for the 'all my sites nodes' link
206   if ($person_id == plc_my_person_id()) { 
207     $person=plc_my_person();
208     $site_ids = plc_my_site_ids();
209   } else {
210     // fetch the person's site_ids
211     $persons = $api->GetPersons(array('person_id'=>$person_id),array('person_id','email','site_ids'));
212     $person=$persons[0];
213     $site_ids=$person['site_ids'];
214   }
215   $title .= t_person($person);
216   $node_filter['site_id']=$site_ids;
217  }
218
219 // go
220 $nodes=$api->GetNodes($node_filter,$node_columns);
221
222 // build site_ids - interface_ids
223 $site_ids=array();
224 $interface_ids=array();
225 if ($nodes) foreach ($nodes as $node) {
226   $site_ids []= $node['site_id'];
227   $interface_ids = array_merge ($interface_ids,$node['interface_ids']);
228 }
229
230 // fetch related interfaces
231 $interface_columns=array('ip','node_id','interface_id');
232 $interface_filter=array('is_primary'=>TRUE,'interface_id'=>$interface_ids);
233 $interfaces=$api->GetInterfaces($interface_filter,$interface_columns);
234
235 $interface_hash=array();
236 foreach ($interfaces as $interface) $interface_hash[$interface['node_id']]=$interface;
237
238 // fetch related sites
239 $site_columns=array('site_id','login_base');
240 $site_filter=array('site_id'=>$site_ids);
241 $sites=$api->GetSites($site_filter,$site_columns);
242
243 $site_hash=array();
244 foreach ($sites as $site) $site_hash[$site['site_id']]=$site;
245
246 // --------------------
247 drupal_set_title($title);
248
249 plekit_linetabs($tabs);
250
251 if ( ! $nodes ) {
252   drupal_set_message ('No node found');
253   return;
254  }
255   
256 $nifty=new PlekitNifty ('','objects-list','big');
257 $nifty->start();
258 $headers = array (); $offset=0;
259 $notes=array();
260 $notes [] = "For information about the different columns please see the <b>node table layout</b> tab above or <b>mouse over</b> the column headers";
261
262
263 /*
264 // fixed columns
265 if (plc_is_admin()) { 
266   $short="I"; $long="node_id"; $type='int'; 
267         $headers[$short]=array('type'=>$type,'title'=>$long); $notes []= "$short = $long";
268   $offset=1; 
269  }
270 $short="P"; $long="Peer"; $type='string'; 
271         $headers[$short]=array('type'=>$type,'title'=>$long); $notes []= "$short = $long";
272 $short="D"; $long="toplevel domain name"; $type='string'; 
273         $headers[$short]=array('type'=>$type,'title'=>$long); $notes []= "$short = $long";
274 $headers["Site"]="string";
275 $headers["Hostname"]="string";
276 $short="IP"; $long="IP Address"; $type='sortIPAddress'; 
277         $headers[$short]=array('type'=>$type,'title'=>$long); $notes []= "$short = $long";
278 $short="ST"; $long=Node::status_footnote(); $type='string'; 
279         $headers[$short]=array('type'=>$type,'title'=>$long); $notes []= "$short = $long";
280 $short="SL"; $long="Number of slivers"; $type='int'; 
281         $headers[$short]=array('type'=>$type,'title'=>$long); $notes []= "$short = $long";
282
283 $headers=array_merge($headers,$visibletags->headers());
284 $notes=array_merge($notes,$visibletags->notes());
285 $short="?"; $long="extra status info"; $type='string'; 
286         $headers[$short]=array('type'=>$type,'title'=>$long); $notes []= "$short = $long";
287 */
288
289 $info_header = array();
290 $short="?"; $long="extra status info"; $type='string'; 
291 $info_header[$short]=array('type'=>$type,'title'=>$long, 'label'=>'?', 'header'=>'?', 'visible'=>true); 
292 //$notes []= "$short = $long";
293 //$info_header["?"] = "none";
294 $headers = array_merge($ConfigureColumns->get_headers(),$info_header);
295
296 //print("<p>HEADERS");
297 //print_r($headers);
298
299 $toggle_nodes=new PlekitToggle('nodes-column-configuration',
300                                "Node table layout",
301                                array('visible'=>'1'));
302 $toggle_nodes->start();
303 print("<div id='debug'></div>");
304 print("<input type='hidden' id='slice_id' value='nodes' />");
305 print("<input type='hidden' id='person_id' value='".$plc->person['person_id']."' />");
306 print("<input type='hidden' id='conf_tag_id' value='".$conf_tag_id."' />");
307 print("<input type='hidden' id='column_configuration' value='".$slice_column_configuration."' />");
308 print("<br><input type='hidden' size=80 id='full_column_configuration' value='".$column_configuration."' />");
309 //print("<input type='hidden' id='previousConf' value='".$slice_column_configuration."'></input>");
310 print("<input type='hidden' id='defaultConf' value='".$default_configuration."'></input>");
311 $ConfigureColumns->configuration_panel_html(true);
312 $ConfigureColumns->javascript_init();
313 $toggle_nodes->end();
314
315 $table_options = array('notes'=>$notes,
316                        'search_width'=>15,
317                        'pagesize'=>20,
318                         'configurable'=>true);
319
320 # initial sort on hostnames
321 $table=new PlekitTable ("nodes",$headers,3+$offset, $table_options);
322 $table->start();
323
324 $peers = new Peers ($api);
325 // write rows
326 foreach ($nodes as $node) {
327   //$node_obj = new Node ($node);
328   $hostname=$node['hostname'];
329   $node_id=$node['node_id'];
330   $site_id=$node['site_id'];
331   $site=$site_hash[$site_id];
332   $login_base = $site['login_base'];
333   $ip=$interface_hash[$node['node_id']]['ip'];
334   $interface_id=$interface_hash[$node['node_id']]['interface_id'];
335   $peer_id=$node['peer_id'];
336   
337   $table->row_start();
338   $table->cell($node['node_id'], array('display'=>'none'));
339   if (plc_is_admin()) $table->cell(l_node_t($node_id,$node_id));
340   $table->cell (l_node_t($node_id,$hostname));
341   $peers->cell ($table,$peer_id);
342   //$table->cell (topdomain($hostname));
343   $node['domain'] = topdomain($hostname);
344   //$table->cell (l_site_t($site_id,$login_base));
345   $node['sitename'] = l_site_t($site_id,$login_base);
346   //$table->cell (l_interface_t($interface_id,$ip),array('only-if'=> !$peer_id));
347   $node['ipaddress'] = l_interface_t($interface_id,$ip);
348   list($label,$class) = Node::status_label_class_($node);
349   $table->cell ($label,array('class'=>$class));
350   //$table->cell (count($node['slice_ids']));
351   //foreach ($visiblecolumns as $tagname) $table->cell($node[$tagname]);
352   $ConfigureColumns->cells($table, $node);
353   $table->cell (node_status($node));
354   $table->row_end();
355   
356 }
357
358 $table->end();
359 $nifty->end();
360
361 //plekit_linetabs ($tabs,"bottom");
362
363 // Print footer
364 include 'plc_footer.php';
365
366 ?>
367