X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=planetlab%2Fnodes%2Fnode.php;h=b89041df3c4934afea5467596c9411a4ccc43648;hb=4334c753c477317997eef4d6d8c8bc1316a4be3d;hp=d58317ae9d616d3ebfb7a3785005fdf021528132;hpb=8dfeb8aa13ccfe89e04ca7e290f0dfbd10e1b5ab;p=plewww.git diff --git a/planetlab/nodes/node.php b/planetlab/nodes/node.php index d58317a..b89041d 100644 --- a/planetlab/nodes/node.php +++ b/planetlab/nodes/node.php @@ -16,10 +16,11 @@ include 'plc_header.php'; // Common functions require_once 'plc_functions.php'; require_once 'plc_peers.php'; -require_once 'plc_minitabs.php'; -require_once 'plc_tables.php'; -require_once 'plc_details.php'; -require_once 'plc_forms.php'; +require_once 'linetabs.php'; +require_once 'table.php'; +require_once 'details.php'; +require_once 'form.php'; +require_once 'toggle.php'; require_once 'plc_objects.php'; // -------------------- @@ -40,6 +41,7 @@ $node=$nodes[0]; // node info $hostname= $node['hostname']; $boot_state= $node['boot_state']; +$run_level = $node['run_level']; $site_id= $node['site_id']; $model= $node['model']; $version= $node['version']; @@ -50,7 +52,6 @@ $slice_ids= $node['slice_ids']; $conf_file_ids= $node['conf_file_ids']; $interface_ids= $node['interface_ids']; $nodegroup_ids= $node['nodegroup_ids']; -$pcu_ids= $node['pcu_ids']; // get peers $peer_id = $node['peer_id']; @@ -85,17 +86,13 @@ if( !empty( $interface_ids ) ) if( !empty( $nodegroup_ids ) ) $nodegroups= $api->GetNodeGroups( $nodegroup_ids, array("groupname","tag_type_id","value")); -// xxx Thierry : remaining stuff -// (*) events: should display the latest events relating to that node. -// disabling call to GetEvents, that gets the session deleted in the DB -// (*) conf_files: is fetched but not displayed -if( !empty( $conf_file_ids ) ) - $conf_files= $api->GetConfFiles( $conf_file_ids ); -// (*) idem for PCUs -// gets pcu and port info key to both is $pcu_id -// turning this off: GetPCUs is not allowed to users, and we don't show PCUs yet anyway -//if( !empty( $pcu_ids ) ) -// $PCUs= $api->GetPCUs( $pcu_ids ); +// Thierry : remaining stuff +// (*) events: xxx todo xxx for admins xxx +// should display the latest events relating to that node. +// historically we had to turn this off at some point as GetEvents was getting the session deleted in the DB +// (*) conf_files: xxx todo xxx for admins xxx +//if( !empty( $conf_file_ids ) ) +// $conf_files= $api->GetConfFiles( $conf_file_ids ); //////////////////// display node info @@ -110,18 +107,17 @@ $tabs=array(); // available actions $tabs [] = tab_nodes_site($site_id); $tabs [] = tab_site($site_id); -$tabs [] = tab_nodes(); +//$tabs [] = tab_nodes(); if ( $local_peer && $privileges ) { + $tabs["Add Interface"]=array('url'=>l_interface_add($node_id), + 'bubble'=>"Define new network interface on $hostname"); $tabs['Delete'] = array ('url'=>l_actions(), 'method'=>'POST', 'values'=>array('action'=>'delete-node','node_id'=>$node_id), 'bubble'=>"Delete node $hostname", - 'confirm'=>'Are you sure to delete ' . $hostname. ' ?'); - // xxx subject to roles - $tabs["Add Interface"]=array('url'=>l_interface_add($node_id), - 'bubble'=>"Define new network interface on $hostname"); + 'confirm'=>'Are you sure to delete ' . $hostname); $tabs["Events"]=array_merge(tablook_event(), array('url'=>l_event("Node","node",$node_id), 'bubble'=>"Events for node $hostname")); @@ -130,12 +126,17 @@ if ( $local_peer && $privileges ) { 'bubble'=>"Comon page about node $hostname")); } -plc_tabs($tabs); +plekit_linetabs($tabs); // show gray background on foreign objects : start a
with proper class $peers->block_start ($peer_id); -$details=new PlcDetails($privileges); +$toggle = new PlekitToggle ('node',"Details", + array('bubble'=>'Display and modify details for that node', + 'visible'=>get_arg('show_details',true))); +$toggle->start(); + +$details=new PlekitDetails($privileges); $details->start(); if ( ! $local_peer) { $details->th_td("Peer",$peers->peer_link($peer_id)); @@ -143,12 +144,88 @@ if ( ! $local_peer) { } $details->form_start(l_actions(),array("action"=>"update-node", "node_id"=>$node_id)); -$details->th_td("Hostname",$hostname,"hostname"); +// xxx can hostname really be changed like this without breaking the rest, bootcd .. ? +//$details->th_td("Hostname",$hostname,"hostname"); +$details->th_td("Hostname",$hostname); $details->th_td("Model",$model,"model"); $details->tr_submit("submit","Update Node"); $details->form_end(); if ($privileges) $details->space(); +//////////////////// +// PCU stuff - not too sure why, but GetPCUs is not exposed to the 'user' role +$display_pcus = (plc_is_admin() || plc_is_pi() || plc_is_tech()); +if ($display_pcus) { + $pcu_ids= $node['pcu_ids']; + $ports= $node['ports']; + // avoid 2 API calls : get all site PCUs and then search from there + function search_pcu ($site_pcus,$pcu_id) { + if ($site_pcus) foreach ($site_pcus as $site_pcu) if ($site_pcu['pcu_id']==$pcu_id) return $site_pcu; + return FALSE; + } + $site_pcus = $api->GetPCUs(array('site_id'=>$site_id)); + // not sure what the exact semantics is, but I expect pcu_ids and ports should have same cardinality + if (count ($pcu_ids) != count ($ports)) + $pcu_string = "Unexpected condition: " . count($pcu_ids) . " pcu_ids and " . count($ports) . " ports"; + else if (count($pcu_ids) == 0) + $pcu_string = plc_warning_html("No PCU !"); + else if (count($pcu_ids) == 1) { + $pcu_id=$pcu_ids[0]; + $port=$ports[0]; + $pcu_columns = array('hostname'); + $pcu=search_pcu($site_pcus,$pcu_id); + if ( ! $pcu ) + $pcu_string = "Cannot find PCU " . $pcu_id; + else + $pcu_string = $pcu['hostname'] . " on port " . $port; + } else + $pcu_string = plc_warning_html("More than one PCU attached ? "); + + + $details->form_start(l_actions(),array("action"=>"attach-pcu","node_id"=>$node_id)); + // prepare selectors + if (! $site_pcus) { + $pcu_update_area = "This site has no PCU - " . href ( l_pcu_add(), "add one here"); + } else { + $pcu_add_link = href (l_pcu_add(),plc_add_icon()); + + // first option in pcus + if ($pcu_ids) + $none_detach = 'Detach'; + else + $none_detach='None'; + $pcu_selectors = array(array('display'=>$none_detach,'value'=>-1)); + // one option per site pcu + foreach ($site_pcus as $site_pcu) { + $selector=array('display'=>$site_pcu['hostname'],'value'=>$site_pcu['pcu_id']); + if ($pcu_id == $site_pcu['pcu_id']) $selector['selected']=true; + $pcu_selectors []= $selector; + } + $pcu_chooser = $details->form()->select_html('pcu_id',$pcu_selectors); + + function port_selector ($i,$port) { + $selector = array ('display'=>'port ' . $i, 'value'=>$i); + if ($i == $port) $selector['selected'] = true; + return $selector; + } + $port_selectors = array () ; + $available_ports =range(1,8); + foreach ($available_ports as $available_port) + $port_selectors []= port_selector ($available_port,$port); + $port_chooser = $details->form()->select_html('port',$port_selectors); + + $pcu_attach_button = + $details->form()->submit_html('attach_pcu',"Attach PCU"); + + $pcu_update_area = $pcu_add_link . " " . $pcu_chooser . " " . $port_chooser . " " . $pcu_attach_button; + } + + $details->th_td("PCU",plc_vertical_table(array($pcu_string,$pcu_update_area))); + $details->form_end(); + $details->space(); + } + +//////////////////// type & version $details->th_td("Type",$node_type); $details->th_td("Version",$version); // let's use plc_objects @@ -159,16 +236,17 @@ $details->th_td("Last update",$Node->lastUpdated()); // boot area $details->space (); +$details->th_td ("Observed Boot state",$run_level . ( $Node->stale() ? " -- stale value" : "" )); if ( ! ($local_peer && $privileges)) { // just display it $boot_value=$boot_state; } else { $boot_value=""; - $boot_form = new PlcForm (l_actions(), array("node_id"=>$node_id, + $boot_form = new PlekitForm (l_actions(), array("node_id"=>$node_id, "action"=>"node-boot-state")); $boot_value .= $boot_form->start_html(); - $states = array( 'boot'=>'Boot', 'safeboot'=>'SafeBoot', 'failboot'=>'FailBoot', - 'disabled' => 'Disabled', 'install'=>'Install', 'reinstall'=>'Reinstall'); + $states = array( 'boot'=>'Boot', 'safeboot'=>'SafeBoot', + 'disabled' => 'Disabled', 'reinstall'=>'Reinstall'); $selectors=array(); foreach ($states as $dbname=>$displayname) { $selector=array("display"=>$displayname, "value"=>$dbname); @@ -178,18 +256,19 @@ if ( ! ($local_peer && $privileges)) { $boot_value .= $boot_form->select_html("boot_state",$selectors,array('autosubmit'=>true)); $boot_value .= $boot_form->end_html(); } -$details->th_td ("Boot state",$boot_value); +$details->th_td ("Preferred Boot state",$boot_value); // same here for the download area if ( $local_peer && $privileges) { $download_value=""; - $download_form = new PlcForm (l_actions_download(),array("node_id"=>$node_id)); + $download_form = new PlekitForm (l_actions_download(),array("node_id"=>$node_id)); $download_value .= $download_form->start_html(); $selectors = array( array("display"=>"-- All in one images --","disabled"=>true), array("value"=>"download-node-iso","display"=>"Download ISO image for $hostname"), - array("value"=>"download-node-usb","display"=>"Download USB image for $hostname<"), + array("value"=>"download-node-usb","display"=>"Download USB image for $hostname"), + array("value"=>"download-node-usb-partition", "display"=>"Download partitioned, USB image for $hostname"), array("display"=>"-- Floppy + generic image --","disabled"=>true), array("value"=>"download-node-floppy","display"=>"Download Floppy file for $hostname"), array("value"=>"download-generic-iso","display"=>"Download generic ISO image (requires floppy)"), @@ -198,6 +277,7 @@ if ( $local_peer && $privileges) { array('label'=>"Download mode",'autosubmit'=>true)); $download_value .= $download_form->end_html(); $details->th_td ("Download",$download_value); + } // site info and all site nodes @@ -212,20 +292,62 @@ foreach ($site_node_hash as $hash_node_id => $hash_hostname) { $details->th_tds ("All site nodes",$nodes_area); $details->end (); +$toggle->end(); -$form=new PlcForm (l_actions(), array('node_id'=>$node_id)); +$form=new PlekitForm (l_actions(), array('node_id'=>$node_id)); $form->start(); +//////////////////////////////////////////////////////////// slivers +{ + $toggle=new PlekitToggle ('slices',count_english_warning($slices,'sliver'), + array('bubble'=>'Review slices running on that node', + 'visible'=>get_arg('show_slices',false))); + $toggle->start(); + if ( ! $slices ) { + plc_warning ("This node is not associated to any slice"); + } else { + $headers=array(); + $headers['Peer']="string"; + $headers['Slice Name']="string"; + $headers['Sliver']="string"; + $reasonable_page=10; + $table_options = array('notes_area'=>false,"search_width"=>10,'pagesize'=>$reasonable_page); + if (count ($slices) <= $reasonable_page) { + $table_options['search_area']=false; + $table_options['pagesize_area']=false; + } + $table=new PlekitTable("node_slices",$headers,1,$table_options); + $table->start(); + + foreach ($slices as $slice) { + $table->row_start(); + $peers->cell ($table,$slice['peer_id']); + $table->cell (l_slice_t ($slice['slice_id'],$slice['name'])); + # xxx l_sliver not implemented yet - what should we show exactly ? + $table->cell (l_sliver_t ($node_id,$slice['slice_id'],'sliver tags')); + $table->row_end(); + } + $table->end(); + } + $toggle->end(); +} + //////////////////////////////////////////////////////////// Tags -// get tags +// tags section if ( $local_peer ) { $tags=$api->GetNodeTags (array('node_id'=>$node_id)); function get_tagname ($tag) { return $tag['tagname'];} + // xxx looks like tech-only see an error here, + // might be that GetNodeTags is not accessible or something $tagnames = array_map ("get_tagname",$tags); $nodegroups_hash=plc_nodegroup_global_hash($api,$tagnames); - plc_section("Tags"); + $toggle = new PlekitToggle ('tags',count_english_warning($tags,'tag'), + array('bubble'=>'Inspect and set tags on that node', + 'visible'=>get_arg('show_tags',false))); + $toggle->start(); + $headers=array("Name"=>"string", "Value"=>"string", "Nodegroup"=>"string", @@ -233,7 +355,7 @@ if ( $local_peer ) { if (plc_is_admin()) $headers[plc_delete_icon()]="none"; $table_options=array("notes_area"=>false,"pagesize_area"=>false,"search_width"=>10); - $table=new PlcTable("node_tags",$headers,0,$table_options); + $table=new PlekitTable("node_tags",$headers,0,$table_options); $table->start(); if ($tags) foreach ($tags as $tag) { // does this match a nodegroup ? @@ -257,7 +379,7 @@ if ( $local_peer ) { $table->row_start(); $table->cell($form->submit_html("delete-node-tags","Remove Tags"), // use the whole columns and right adjust - $table->columns(), "right"); + array('hfill'=>true,'align'=>'right')); $table->row_end(); // set tag area @@ -269,17 +391,20 @@ if ( $local_peer ) { $selector=array_map("tag_selector",$all_tags); $table->cell($form->select_html("tag_type_id",$selector,array('label'=>"Choose"))); $table->cell($form->text_html("value","",array('width'=>8))); - $table->cell($form->submit_html("set-tag-on-node","Set Tag"),2,"left"); + $table->cell($form->submit_html("set-tag-on-node","Set Tag"),array('columns'=>2,'align'=>'left')); $table->row_end(); } $table->end(); - } + $toggle->end(); +} //////////////////////////////////////////////////////////// interfaces if ( $local_peer ) { - - plc_section ("Interfaces"); + $toggle=new PlekitToggle ('interfaces',count_english_warning($interfaces,'interface'), + array('bubble'=>'Inspect and tune interfaces on that node', + 'visible'=>get_arg('show_interfaces',false))); + $toggle->start(); // display interfaces if( ! $interfaces ) { echo '

'; @@ -297,7 +422,7 @@ if ( $local_peer ) { if ( $privileges ) $headers[plc_delete_icon()]='string'; $table_options=array('search_area'=>false,"pagesize_area"=>false,'notes_area'=>false); - $table=new PlcTable("node_interfaces",$headers,2,$table_options); + $table=new PlekitTable("node_interfaces",$headers,2,$table_options); $table->start(); foreach ( $interfaces as $interface ) { @@ -334,44 +459,16 @@ if ( $local_peer ) { if ($privileges) { $table->tfoot_start(); $table->row_start(); - $add_button=new PlcFormButton (l_interface_add($node_id),"add_interface","Add interface","GET"); + $add_button=new PlekitFormButton (l_interface_add($node_id),"add","Add Interface","GET"); // we should have 6 cols, use 3 for the left (new) and the rest for the right (remove) - $table->cell($add_button->html(), 3,"left"); - $table->cell($form->submit_html("delete-interfaces","Remove Interfaces"), $table->columns()-3,"right"); + $table->cell($add_button->html(),array('columns'=> 3,'align'=>'left')); + $table->cell($form->submit_html("delete-interfaces","Remove Interfaces"), + array('columns'=>$table->columns()-3,'align'=>'right')); $table->row_end(); } $table->end(); } - } - -//////////////////////////////////////////////////////////// slices -// display slices - -plc_section ("Slices"); -if ( ! $slices ) { - plc_warning ("This node is not associated to any slice"); - } else { - $headers=array(); - $headers['Peer']="string"; - $headers['Name']="string"; - $headers['Slivers']="string"; - $reasonable_page=10; - $table_options = array('notes_area'=>false,"search_width"=>10,'pagesize'=>$reasonable_page); - if (count ($slices) <= $reasonable_page) { - $table_options['search_area']=false; - $table_options['pagesize_area']=false; - } - $table=new PlcTable("node_slices",$headers,1,$table_options); - $table->start(); - - foreach ($slices as $slice) { - $table->row_start(); - $table->cell ($peers->shortname($peer_id)); - $table->cell (l_slice_t ($slice['slice_id'],$slice['name'])); - $table->cell (l_sliver_t ($node_id,$slice['slice_id'],'view')); - $table->row_end(); - } - $table->end(); + $toggle->end(); } $form->end(); @@ -379,6 +476,7 @@ $form->end(); //////////////////////////////////////////////////////////// $peers->block_end($peer_id); +//plekit_linetabs ($tabs,"bottom"); // Print footer include 'plc_footer.php';