X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=planetlab%2Fslices%2Fslice.php;h=0ca222d91fa057b5030a9e0e98d7cae5a6186a46;hb=9a861118daa28fe79fec7fc2f24a5511a8e7cd69;hp=5fa2d4b7eff6001840d6edfa3bfca1f088bebf56;hpb=b28944eb770d3391635f23e6568b03ba1e6db257;p=plewww.git diff --git a/planetlab/slices/slice.php b/planetlab/slices/slice.php index 5fa2d4b..0ca222d 100644 --- a/planetlab/slices/slice.php +++ b/planetlab/slices/slice.php @@ -1,7 +1,5 @@ + '); // -------------------- admins potentially need to get full list of users -ini_set('memory_limit','48M'); +ini_set('memory_limit','32M'); +//error_reporting(0); + +$profiling=false; +if ($_GET['profiling']) $profiling=true; + +if ($profiling) plc_debug_prof_start(); // -------------------- // recognized URL arguments @@ -36,8 +45,10 @@ $slice_id=intval($_GET['id']); if ( ! $slice_id ) { plc_error('Malformed URL - id not set'); return; } //////////////////// -// Get all columns as we focus on only one entry -$slices= $api->GetSlices( array($slice_id)); +// have to name columns b/c we need the non-native 'omf_control' column +$slice_columns=array('slice_id','name','peer_id','site_id','person_ids','node_ids','expires', + 'url','description','instantiation','omf_control'); +$slices= $api->GetSlices( array($slice_id), $slice_columns); if (empty($slices)) { drupal_set_message ("Slice " . $slice_id . " not found"); @@ -46,33 +57,28 @@ if (empty($slices)) { $slice=$slices[0]; +if ($profiling) plc_debug_prof('1: slice',count($slices)); // pull all node info to vars $name= $slice['name']; $expires = date( "d/m/Y", $slice['expires'] ); $site_id= $slice['site_id']; -//$node_ids=$slice['node_ids']; $person_ids=$slice['person_ids']; -//$slice_tag_ids= $slice['slice_tag_ids']; // get peers $peer_id= $slice['peer_id']; $peers=new Peers ($api); $local_peer = ! $peer_id; +if ($profiling) plc_debug_prof('2: peers',count($peers)); + // gets site info $sites= $api->GetSites( array( $site_id ) ); $site=$sites[0]; $site_name= $site['name']; $max_slices = $site['max_slices']; -// xxx PIs -//$pis=$api->GetPersons(...) - -// get all persons info -if (!empty($person_ids)) - $persons=$api->GetPersons($person_ids,array('email','enabled')); - +if ($profiling) plc_debug_prof('3: sites',count($sites)); //////////////////////////////////////// building blocks for the renew area // Constants global $DAY; $DAY = 24*60*60; @@ -81,7 +87,7 @@ global $MAX_WEEKS; $MAX_WEEKS= 8; // weeks from today global $GRACE_DAYS; $GRACE_DAYS=10; // days for renewal promoted on top global $NOW; $NOW=mktime(); - +//////////////////////////////////////////////////////////// utility for the renew tab // make the renew area on top and open if the expiration time is less than 10 days from now function renew_needed ($slice) { global $DAY, $NOW, $GRACE_DAYS; @@ -96,12 +102,14 @@ function renew_area ($slice,$site,$visible) { global $DAY, $WEEK, $MAX_WEEKS, $GRACE_DAYS, $NOW; $current_exp=$slice['expires']; + $current_text = gmstrftime("%A %b-%d-%y %T %Z", $current_exp); $max_exp= $NOW + ($MAX_WEEKS * $WEEK); // seconds since epoch + $max_text = gmstrftime("%A %b-%d-%y %T %Z", $max_exp); // xxx some extra code needed to enable this area only if the slice description is OK: // description and url must be non void $toggle= - new PlekitToggle('renew',"Renew this slice", + new PlekitToggle('renew',"Expires $current_text - Renew this slice", array("bubble"=> "Enter this zone if you wish to renew your slice", 'visible'=>$visible)); @@ -142,38 +150,40 @@ EOF; if ( empty( $selectors ) ) { print <<< EOF -
You must provide a short description as well as a link to a project website before renewing it. -Do not provide bogus information; if a complaint is lodged against your slice -and PlanetLab Operations is unable to determine what the normal behavior of your slice is, -your slice may be deleted to resolve the complaint.
-NOTE: -Slices cannot be renewed beyond another $max_renewal_weeks week(s) ($max_renewal_date). +Important: Please take this opportunity to review and update your slice information in the Details tab. +
+PlanetLab's security model requires that anyone who is concerned about a slice's activity be able to immediately learn about that slice. The details that you provide are your public explanation about why the slice behaves as it does. Be sure to describe the kind of traffic that your slice generates, and how it handles material that is under copyright, if relevant. +
+The PlanetLab Operations Centres regularly respond to concerns raised by third parties about site behaviour. Most incidents are resolved rapidly based upon the publicly posted slice details. However, when these details are not sufficiently clear or accurate, and we cannot immediately reach the slice owner, we must delete the slice.
-NOTE: Slices cannot be renewed beyond another $max_renewal_weeks week(s) ($max_renewal_date).
"); +print ("
+You have attached one or more reservable nodes to your slice.
+Reservable nodes show up with the '$mark' mark.
+Your slivers will be available only during timeslots
+where you have obtained leases.
+You can manage your leases in the tab below.
+ +This feature is still experimental; feedback is appreciated at devel@planet-lab.org + | + |
TABLE HEADERS
"); +//print_r($table_headers); + +print("
"); +print(""); +print(""); +print(""); +print(""); +print(""); +print(""); +print("+This tab allows you to customize the columns in the node tables, below. Information on the nodes comes from a variety of monitoring sources. If you, as either a user or a provider of monitoring data, would like to see additional columns made available, please send us your request in mail to support@myslice.info. You can find more information about the MySlice project at http://trac.myslice.info. + | + |
HEADERS
"); +//print_r($headers); + +$table_options = array('notes'=>$notes, 'search_width'=>15, - 'pagesize'=>20); -$table=new PlekitTable('nodes',$headers,'0',$table_options); + 'pagesize'=>20, + 'configurable'=>true); + +$table=new PlekitTable('nodes',$headers,NULL,$table_options); $form=new PlekitForm(l_actions(),array('slice_id'=>$slice['slice_id'])); $form->start(); $table->start(); -if ($nodes) foreach ($nodes as $node) { +if ($slice_nodes) foreach ($slice_nodes as $node) { $table->row_start(); - $peers->cell($table,$node['peer_id']); + +$table->cell($node['node_id'], array('display'=>'none')); + $table->cell(l_node_obj($node)); - $table->cell($node['arch']); + $peers->cell($table,$node['peer_id']); + $run_level=$node['run_level']; + list($label,$class) = Node::status_label_class_($node); + $table->cell ($label,array('class'=>$class)); + $table->cell( ($node['node_type']=='reservable')?reservable_mark():"" ); + + $hostname=$node['hostname']; + $ip=$interface_hash[$node['node_id']]['ip']; + $interface_id=$interface_hash[$node['node_id']]['interface_id']; + +//extra columns +$node['domain'] = topdomain($hostname); +$node['sitename'] = l_site_t($node['site_id'],$site_hash[$node['site_id']]); +if ($interface_id) + $node['ipaddress'] = l_interface_t($interface_id,$ip); + else + $node['ipaddress'] = "n/a"; + + //foreach ($visiblecolumns as $tagname) $table->cell($node[$tagname]); + $ConfigureColumns->cells($table, $node); + if ($privileges) $table->cell ($form->checkbox_html('node_ids[]',$node['node_id'])); $table->row_end(); } @@ -433,34 +795,74 @@ if ($privileges) { $table->end(); $toggle_nodes->end(); -////////// nodes to add +//////////////////// nodes to add if ($privileges) { + $new_potential_nodes = array(); + if ($potential_nodes) foreach ($potential_nodes as $node) { + $emptywl=empty($node['slice_ids_whitelist']); + $inwl = (!emptywl) and in_array($slice['slice_id'],$node['slice_ids_whitelist']); + if ($emptywl or $inwl) + $new_potential_nodes[]=$node; + } + $potential_nodes=$new_potential_nodes; + $count=count($potential_nodes); $toggle_nodes=new PlekitToggle('my-slice-nodes-add', - "$count more nodes available", - array('visible'=>get_arg('show_persons_add',false))); + count_english($potential_nodes,"more node") . " available", + array('visible'=>get_arg('show_nodes_add',false))); $toggle_nodes->start(); - if ( ! $potential_nodes ) { - // xxx improve style - echo "
No node to add
"; - } else { + if ( $potential_nodes ) { $headers=array(); + $notes=array(); + + +/* $headers['peer']='string'; $headers['hostname']='string'; - $headers['arch']='string'; + $short="-S-"; $long=Node::status_footnote(); $type='string'; + $headers[$short]=array('type'=>$type,'title'=>$long); $notes []= "$short = $long"; + $short=reservable_mark(); $long=reservable_legend(); $type='string'; + $headers[$short]=array('type'=>$type,'title'=>$long); $notes []= "$short = $long"; + // the extra tags, configured for the UI + $headers=array_merge($headers,$visibletags->headers()); $headers['+']="none"; +*/ + + $add_header = array(); + $add_header['+']="none"; + $headers = array_merge($ConfigureColumns->get_headers(),$add_header); + + //$notes=array_merge($notes,$visibletags->notes()); +$notes [] = "For information about the different columns please see the node table layout tab above or mouse over the column headers"; - $table=new PlekitTable('add_nodes',$headers,'1', $table_options); + $table=new PlekitTable('add_nodes',$headers,NULL, $table_options); $form=new PlekitForm(l_actions(), array('slice_id'=>$slice['slice_id'])); $form->start(); $table->start(); if ($potential_nodes) foreach ($potential_nodes as $node) { $table->row_start(); - $peers->cell($table,$node['peer_id']); + +$table->cell($node['node_id'], array('display'=>'none')); + $table->cell(l_node_obj($node)); - $table->cell($node['arch']); + $peers->cell($table,$node['peer_id']); + list($label,$class) = Node::status_label_class_($node); + $table->cell ($label,array('class'=>$class)); + $table->cell( ($node['node_type']=='reservable')?reservable_mark():"" ); + + //extra columns + $hostname=$node['hostname']; + $ip=$interface_hash[$node['node_id']]['ip']; + $interface_id=$interface_hash[$node['node_id']]['interface_id']; + $node['domain'] = topdomain($hostname); + $node['sitename'] = l_site_t($node['site_id'],$site_hash[$node['site_id']]); + $node['ipaddress'] = l_interface_t($interface_id,$ip); + + //foreach ($visiblecolumns as $tagname) $table->cell($node[$tagname]); + $ConfigureColumns->cells($table, $node); + $table->cell ($form->checkbox_html('node_ids[]',$node['node_id'])); $table->row_end(); } @@ -475,16 +877,109 @@ if ($privileges) { } $toggle_nodes->end(); } + $toggle->end(); -//////////////////////////////////////////////////////////// Tags -if ( $local_peer ) { - $tags=$api->GetSliceTags (array('slice_id'=>$slice_id)); +//////////////////////////////////////// retrieve all slice tags +$tags=$api->GetSliceTags (array('slice_id'=>$slice_id)); +//////////////////////////////////////////////////////////// tab:initscripts +// xxx fixme +// * add a message on how to use this: +// * explain the 2 mechanisms (initscript_body, initscript) +// * explain the interface : initscript start|stop|restart slicename +// xxx fixme + +$shared_initscripts=$api->GetInitScripts(array('-SORT'=>'name'),array('name')); +//$shared_initscripts=$api->GetInitScripts(); +if ($profiling) plc_debug_prof('6 initscripts',count($initscripts)); +// xxx expose this even on foreign slices for now +if ($local_peer) { + $initscript=''; + $initscript_body=''; + if ($tags) foreach ($tags as $tag) { + if ($tag['tagname']=='initscript') { + if ($initscript!='') drupal_set_error("multiple occurrences of 'initscript' tag"); + $initscript=$tag['value']; + } + if ($tag['tagname']=='initscript_body') { + if ($initscript_body!='') drupal_set_error("multiple occurrences of 'initscript_body' tag"); + $initscript_body=$tag['value']; + // plc_debug_txt('retrieved body',$initscript_body); + } + } + $label="No initscript"; + $trimmed=trim($initscript_body); + if (!empty($trimmed)) $label="Initscript : slice-specific (" . substr($initscript_body,0,20) . " ...)"; + else if (!empty($initscript)) $label="Initscript: shared " . $initscript; + + $toggle = new PlekitToggle('slice-initscripts',$label, + array('bubble'=>'Manage initscript on that slice', + 'visible'=>get_arg('show_initscripts',false))); + $toggle->start(); + + $details=new PlekitDetails(TRUE); + $details->form_start(l_actions(),array('action'=>'update-initscripts', + 'slice_id'=>$slice_id, + 'name'=>$name, + 'previous-initscript'=>$initscript, + 'previous-initscript-body'=>$initscript_body)); + $details->start(); + // comppute a pulldown with available names + $selectors=array(); + $is_found=FALSE; + if ($shared_initscripts) foreach ($shared_initscripts as $is) { + $is_selector=array('display'=>$is['name'],'value'=>$is['name']); + if ($is['name']==$initscript) { + $is_selector['selected']=TRUE; + $is_found=TRUE; + } + $selectors[]=$is_selector; + } + // display a warning when initscript references an unknown script + $details->tr_submit('unused','Update initscripts'); + ////////// by name + $details->th_td("shared initscript name", + $details->form()->select_html('initscript',$selectors,array('label'=>'none')), + 'initscript', + array('input_type'=>'select')); + if ($initscript && ! $is_found) + // xxx better rendering ? + $details->th_td('WARNING',plc_warning_html("Current name '" . $initscript . "' is not a known shared initscript name")); + ////////// by contents + $script_height=8; + $script_width=60; + if ($initscript_body) { + $text=explode("\n",$initscript_body); + $script_height=count($text); + $script_width=10; + foreach ($text as $line) $script_width=max($script_width,strlen($line)); + } + $details->th_td('slice initscript',$initscript_body,'initscript-body', + array('input_type'=>'textarea', 'width'=>$script_width,'height'=>$script_height)); + $details->th_td('Howto',"xxx yourscript start|stop|restart slicename"); + $details->tr_submit('unused','Update initscripts'); + $details->form_end(); + $details->end(); + $toggle->end(); +} + +//////////////////////////////////////////////////////////// tab:tags +// very wide values get abbreviated +$tag_value_threshold=24; +// xxx fixme +// * this area could use a help message about some special tags: +// * initscript-related should be taken out +// * sliverauth-related (ssh_key & hmac) should have a toggle to hide or show +// xxx fixme + +// xxx expose this even on foreign slices for now +//if ( $local_peer ) { + if ($profiling) plc_debug_prof('7 slice tags',count($tags)); function get_tagname ($tag) { return $tag['tagname'];} $tagnames = array_map ("get_tagname",$tags); $toggle = new PlekitToggle ('slice-tags',count_english_warning($tags,'tag'), - array('bubble'=>'Inspect and set tags on tat slice', + array('bubble'=>'Inspect and set tags on that slice', 'visible'=>get_arg('show_tags',false))); $toggle->start(); @@ -493,7 +988,7 @@ if ( $local_peer ) { "Value"=>"string", "Node"=>"string", "NodeGroup"=>"string"); - if ($privileges) $headers[plc_delete_icon()]="none"; + if ($tags_privileges) $headers[plc_delete_icon()]="none"; $table_options=array("notes_area"=>false,"pagesize_area"=>false,"search_width"=>10); $table=new PlekitTable("slice_tags",$headers,'0',$table_options); @@ -502,33 +997,45 @@ if ( $local_peer ) { $form->start(); $table->start(); if ($tags) { + // Get hostnames for nodes in a single pass + $_node_ids = array(); + foreach ($tags as $tag) { + if ($tag['node_id']) { + array_push($_node_ids, $tag['node_id']); + } + } + $_nodes = $api->GetNodes(array('node_id' => $_node_ids), array('node_id', 'hostname')); + $_hostnames = array(); + foreach ($_nodes as $_node) { + $_hostnames[$_node['node_id']] = $_node['hostname']; + } + + // Loop through tags again to display foreach ($tags as $tag) { $node_name = "ALL"; if ($tag['node_id']) { - $nodes = $api->GetNodes(array('node_id'=>$tag['node_id'])); - if($nodes) { - $node = $nodes[0]; - $node_name = $node['hostname']; - } + $node_name = $_hostnames[$tag['node_id']]; } $nodegroup_name="n/a"; if ($tag['nodegroup_id']) { - $nodegroup=$api->GetNodeGroups(array('nodegroup_id'=>$tag['nodegroup_id'])); + $nodegroups=$api->GetNodeGroups(array('nodegroup_id'=>$tag['nodegroup_id'])); + if ($profiling) plc_debug_prof('8 nodegroup for slice tag',$nodegroup); if ($nodegroup) { - $nodegroup = $nodegroup[0]; + $nodegroup = $nodegroups[0]; $nodegroup_name = $nodegroup['groupname']; } } $table->row_start(); $table->cell(l_tag_obj($tag)); - $table->cell($tag['value']); + // very wide values get abbreviated + $table->cell(truncate_and_popup($tag['value'],$tag_value_threshold)); $table->cell($node_name); $table->cell($nodegroup_name); - if ($privileges) $table->cell ($form->checkbox_html('slice_tag_ids[]',$tag['slice_tag_id'])); + if ($tags_privileges) $table->cell ($form->checkbox_html('slice_tag_ids[]',$tag['slice_tag_id'])); $table->row_end(); } } - if ($privileges) { + if ($tags_privileges) { $table->tfoot_start(); $table->row_start(); $table->cell($form->submit_html ("delete-slice-tags","Remove selected"), @@ -539,19 +1046,20 @@ if ( $local_peer ) { function tag_selector ($tag) { return array("display"=>$tag['tagname'],"value"=>$tag['tag_type_id']); } - $all_tags= $api->GetTagTypes( array ("category"=>"slice*"), array("tagname","tag_type_id")); + $all_tags= $api->GetTagTypes( array ("category"=>"slice*","-SORT"=>"+tagname"), array("tagname","tag_type_id")); + if ($profiling) plc_debug_prof('9 tagtypes',count($all_tags)); $selector_tag=array_map("tag_selector",$all_tags); function node_selector($node) { return array("display"=>$node["hostname"],"value"=>$node['node_id']); } - $all_nodes = $api->GetNodes( array ("node_id" => $slice['node_ids']), array("hostname","node_id")); - $selector_node=array_map("node_selector",$all_nodes); + $selector_node=array_map("node_selector",$slice_nodes); function nodegroup_selector($ng) { return array("display"=>$ng["groupname"],"value"=>$ng['nodegroup_id']); } $all_nodegroups = $api->GetNodeGroups( array("groupname"=>"*"), array("groupname","nodegroup_id")); + if ($profiling) plc_debug_prof('10 nodegroups',count($all_nodegroups)); $selector_nodegroup=array_map("nodegroup_selector",$all_nodegroups); $table->cell($form->select_html("tag_type_id",$selector_tag,array('label'=>"Choose Tag"))); @@ -562,19 +1070,21 @@ if ( $local_peer ) { $table->row_end(); } - $form->end(); $table->end(); + $form->end(); $toggle->end(); -} +//} -//////////////////////// renew slice +//////////////////////////////////////////////////////////// tab:renew if ($local_peer ) { if ( ! $renew_visible) renew_area ($slice,$site,false); } $peers->block_end($peer_id); +if ($profiling) plc_debug_prof_end(); + // Print footer include 'plc_footer.php';