display node's hrn as well
[plewww.git] / planetlab / nodes / node.php
index 11df5b8..f457121 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 
-// $Id$
-
 // Require login
 require_once 'plc_login.php';
 
@@ -29,8 +27,11 @@ $node_id=intval($_GET['id']);
 if ( ! $node_id ) { plc_error('Malformed URL - id not set'); return; }
 
 ////////////////////
-// Get all columns as we focus on only one entry
-$nodes= $api->GetNodes( array($node_id));
+// Need to mention columns explicitly as we want hrn which is a tag
+$columns=array ('hostname','boot_state','run_level','site_id','model','node_type','version',
+               'slice_ids','conf_file_ids','interface_ids','nodegroup_ids','peer_id',
+               'pcu_ids','ports','hrn');
+$nodes= $api->GetNodes( array($node_id),$columns);
 
 if (empty($nodes)) {
   drupal_set_message ("Node " . $node_id . " not found");
@@ -40,12 +41,13 @@ if (empty($nodes)) {
 $node=$nodes[0];
 // node info
 $hostname= $node['hostname'];
+$hrn=$node['hrn'];
 $boot_state= $node['boot_state'];
 $run_level = $node['run_level'];
 $site_id= $node['site_id'];
 $model= $node['model'];
+$node_type= $node['node_type'];
 $version= $node['version'];
-$node_type = $node['node_type'];
 
 // arrays of ids of node info
 $slice_ids= $node['slice_ids'];
@@ -101,7 +103,8 @@ $local_peer= ! $peer_id;
 
   
 // extra privileges to admins, and (pi||tech) on this site
-$privileges = (plc_is_admin () && $local_peer) || ( plc_in_site($site_id) && ( plc_is_pi() || plc_is_tech()));
+$admin_privileges=(plc_is_admin () && $local_peer);
+$privileges =  $admin_privileges || ( plc_in_site($site_id) && ( plc_is_pi() || plc_is_tech()));
   
 $tabs=array();
 // available actions
@@ -133,7 +136,7 @@ $peers->block_start ($peer_id);
   
 $toggle = new PlekitToggle ('node',"Details",
                            array('bubble'=>'Display and modify details for that node',
-                                 'visible'=>get_arg('show_details',true)));
+                                 'visible'=>get_arg('show_details')));
 $toggle->start();
 
 $details=new PlekitDetails($privileges);
@@ -147,11 +150,23 @@ $details->form_start(l_actions(),array("action"=>"update-node", "node_id"=>$node
 // xxx can hostname really be changed like this without breaking the rest, bootcd .. ?
 //$details->th_td("Hostname",$hostname,"hostname"); 
 $details->th_td("Hostname",$hostname); 
+if ($hrn) $details->th_td("SFA hrn",$hrn);
+else $details->tr("SFA hrn not set","center");
 $details->th_td("Model",$model,"model");
+// reservation ?
+if ( $admin_privileges) {
+  $reservation_value = $details->form->select_html("node_type",
+                                                  node_type_selectors ($api, $node_type));
+} else {
+  $reservation_value = node_type_display ($api,$node_type);
+}
+$details->th_td("Reservation",$reservation_value);
+
 $details->tr_submit("submit","Update Node");
 $details->form_end();
 if ($privileges) $details->space();
 
+$display_reboot_button = FALSE;
 ////////////////////
 // PCU stuff - not too sure why, but GetPCUs is not exposed to the 'user' role
 $display_pcus = ( $local_peer && (plc_is_admin() || plc_is_pi() || plc_is_tech()));
@@ -174,9 +189,15 @@ if ($display_pcus) {
     $port=$ports[0];
     $pcu_columns = array('hostname');
     $pcu=search_pcu($site_pcus,$pcu_id);
-    if ( ! $pcu ) 
+    if ( ! $pcu ) {
       $pcu_string = plc_error_html("Cannot find PCU " . $pcu_id);
-    // else : regular case - don't set pcu_string
+    } else {
+      // else : regular case - don't set pcu_string
+      // NOTE: temporarily only offer the reboot_button for DC7x00, DRAC, and HPiLO PCU models
+      if ( $pcu['model'] == "IntelAMT" || $pcu['model'] == "DRAC" || $pcu['model'] == "HPiLO" ){
+        $display_reboot_button = TRUE;
+      }
+    }
   } else 
     $pcu_string = plc_warning_html("More than one PCU attached ? ");
 
@@ -227,12 +248,51 @@ if ($display_pcus) {
     
   $details->th_td("PCU",$pcu_value_area);
   $details->form_end();
-  $details->space();
  }
 
+//////////////////// Reboot Node
+if ( $display_reboot_button ) 
+{
+    if ( ! empty($_SESSION['messages']) ) {
+        $msg = $_SESSION['messages']['status'][0];
+    } else {
+        $msg = "";
+    }
+    $body="Hello,
+
+This message is a template from the 'Report a problem' link on the node details page.
+
+I've experienced a problem rebooting $hostname with the pcu_id $pcu_id; 
+
+    http://".PLC_WWW_HOST."/db/sites/pcu.php?id=$pcu_id
+    http://".PLC_WWW_HOST."/db/nodes/node.php?id=$node_id\n\n";
+
+    if ( $msg != "" ) {
+        $body .= "The last time I tried, it returned:\n    $msg\n\n";
+    }
+    $body .= "And, this is what I've tried, which leads me to believe that there is a bug on your side:";
+
+    $url=rawurlencode($body);
+    $email = "<font style='font-size: smaller'>><a href=\"mailto:".PLC_MAIL_SUPPORT_ADDRESS."?Subject=Reporting a problem rebooting $hostname&Body=$url\">Report a problem</a></font>";
+
+    // NOTE: not sure how to make the buttons display side-by-side...
+    $reboot = $details->form_start_html(l_actions(),array("action"=>"reboot-node-with-pcu",
+                                "node_id"=>$node_id, "hostname"=>$hostname, "test"=>FALSE));
+    $reboot .= $email . $details->form->submit_html("submit","Reboot Node");
+    $reboot .= $details->form_end_html();
+
+    $reboot .= $details->form_start_html(l_actions(),array("action"=>"reboot-node-with-pcu",
+                                "node_id"=>$node_id, "hostname"=>$hostname, "test"=>TRUE));
+    $reboot .= $details->form->submit_html("submit","Test PCU");
+    $reboot .= $details->form_end_html();
+
+    $details->tr($reboot, "right");
+
+}
+$details->space();
+
 //////////////////// type & version
-$details->th_td("Type",$node_type);
-$details->th_td("Version",$version);
+$details->th_td("CD Version",$version);
 // let's use plc_objects
 $Node = new Node($node);
 $details->th_td("Date created",$Node->dateCreated());
@@ -308,7 +368,7 @@ $form->start();
 {
   $toggle=new PlekitToggle ('slices',count_english_warning($slices,'sliver'),
                            array('bubble'=>'Review slices running on that node',
-                                 'visible'=>get_arg('show_slices',false)));
+                                 'visible'=>get_arg('show_slices')));
   $toggle->start();
   if ( ! $slices  ) {
     plc_warning ("This node is not associated to any slice");
@@ -349,9 +409,9 @@ if ( $local_peer ) {
   $tagnames = array_map ("get_tagname",$tags);
   $nodegroups_hash=plc_nodegroup_global_hash($api,$tagnames);
   
-  $toggle = new PlekitToggle ('tags',count_english_warning($tags,'tag'),
+  $toggle = new PlekitToggle ('tags',count_english($tags,'tag'),
                              array('bubble'=>'Inspect and set tags on that node',
-                                   'visible'=>get_arg('show_tags',false)));
+                                   'visible'=>get_arg('show_tags')));
   $toggle->start();
 
   $headers=array("Name"=>"string",
@@ -391,7 +451,7 @@ if ( $local_peer ) {
     // set tag area
     $table->row_start();
     // get list of tag names in the node/* category    
-    $all_tags= $api->GetTagTypes( array ("category"=>"node*"), array("tagname","tag_type_id"));
+    $all_tags= $api->GetTagTypes( array ("category"=>"node*","-SORT"=>"tagname"), array("tagname","tag_type_id"));
     // xxx cannot use onchange=submit() - would need to somehow pass action name 
     function tag_selector ($tag) { return array("display"=>$tag['tagname'],"value"=>$tag['tag_type_id']); }
     $selector=array_map("tag_selector",$all_tags);
@@ -409,14 +469,14 @@ if ( $local_peer ) {
 if ( $local_peer ) {
   $toggle=new PlekitToggle ('interfaces',count_english_warning($interfaces,'interface'),
                            array('bubble'=>'Inspect and tune interfaces on that node',
-                                 'visible'=>get_arg('show_interfaces',false)));
+                                 'visible'=>get_arg('show_interfaces')));
   $toggle->start();
   // display interfaces
   if( ! $interfaces ) {
     echo '<p>';
     plc_warning_html("This node has no interface");
     echo "Please add an interface to make this a usable PLC node.</p>\n";
-  } else {
+  } // else { // show this unconditionnally as otherwise there's no mean to create one..
 
     // display a hostname column iff at least one interface has a hostname
     $need_hostname=false;
@@ -432,6 +492,8 @@ if ( $local_peer ) {
     $headers["Type"]="string";
     $headers["MAC"]="string";
     $headers["bw limit"]="sortBandwidth";
+    $headers["tags"]=array('type'=>'int',
+                          'title'=>"number of tags set on interface");
     // a single symbol, marking 'p' for primary and a delete button for non-primary
     if ( $privileges ) $headers[plc_delete_icon()]='string';
 
@@ -439,7 +501,7 @@ if ( $local_peer ) {
     $table=new PlekitTable("node_interfaces",$headers,$sort_column,$table_options);
     $table->start();
        
-    foreach ( $interfaces as $interface ) {
+    if ($interfaces) foreach ( $interfaces as $interface ) {
       $interface_id= $interface['interface_id'];
       $interface_ip= $interface['ip'];
 
@@ -451,6 +513,8 @@ if ( $local_peer ) {
       $table->cell($interface['type']);
       $table->cell($interface['mac']);
       $table->cell(pretty_bandwidth($interface['bwlimit']));
+      $table->cell(href(l_interface_tags($interface_id),
+                       count($interface['interface_tag_ids'])));
       if ( $privileges ) {
        if ($interface['is_primary']) {
          $table->cell(plc_bubble("p","Cannot delete a primary interface"));
@@ -473,7 +537,7 @@ if ( $local_peer ) {
       $table->row_end();
     }
     $table->end();
-  }
+    //  }
   $toggle->end();
  }