X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=planetlab%2Fslices%2Fslice.php;h=3564a165ba4c896bca7b8dd1bede17defb3501b8;hb=fdea7e5179eb07d06152d1ae919f638a4ab0176c;hp=0d587efc7a33fb2723ee82a123312df9a3e50d3a;hpb=9b7fb6398d2974b649c3505ddb19e44a933c3e44;p=plewww.git diff --git a/planetlab/slices/slice.php b/planetlab/slices/slice.php index 0d587ef..3564a16 100644 --- a/planetlab/slices/slice.php +++ b/planetlab/slices/slice.php @@ -1,7 +1,5 @@ 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"); @@ -48,6 +55,7 @@ if (empty($slices)) { $slice=$slices[0]; +if ($profiling) plc_debug_prof('01: slice',count($slices)); // pull all node info to vars $name= $slice['name']; $expires = date( "d/m/Y", $slice['expires'] ); @@ -60,21 +68,24 @@ $peer_id= $slice['peer_id']; $peers=new Peers ($api); $local_peer = ! $peer_id; +if ($profiling) plc_debug_prof('02: peers',count($peers)); + // gets site info $sites= $api->GetSites( array( $site_id ) ); $site=$sites[0]; $site_name= $site['name']; $max_slices = $site['max_slices']; +if ($profiling) plc_debug_prof('03: sites',count($sites)); //////////////////////////////////////// building blocks for the renew area // Constants global $DAY; $DAY = 24*60*60; global $WEEK; $WEEK = 7 * $DAY; 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(); +global $NOW; $NOW=time(); -//////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////// 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; @@ -138,31 +149,32 @@ 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 (""); } } @@ -184,7 +196,7 @@ $tags_privileges = $privileges || plc_is_admin(); $tabs=array(); $tabs [] = tab_nodes_slice($slice_id); -$tabs [] = tab_site($site_id); +$tabs [] = tab_site($site); // are these the right privileges for deletion ? if ($privileges) { @@ -216,19 +228,12 @@ if ($local_peer ) { } -//////////////////// details -// default for opening the details section or not ? -if ($local_peer) { - $default_show_details = true; - } else { - $default_show_details = ! $renew_visible; - } - +//////////////////////////////////////////////////////////// tab:details $toggle = new PlekitToggle ('my-slice-details',"Details", array('bubble'=> 'Display and modify details for that slice', - 'visible'=>get_arg('show_details',$default_show_details))); + 'visible'=>get_arg('show_details'))); $toggle->start(); $details=new PlekitDetails($privileges); @@ -251,6 +256,7 @@ $details->th_td('URL',$slice['url'],'url',array('width'=>50)); $details->tr_submit("submit","Update Slice"); $details->th_td('Expires',$expires); $details->th_td('Instantiation',$slice['instantiation']); +$details->th_td("OMF-friendly", ($slice['omf_control'] ? 'Yes' : 'No') . " [to change: see 'omf_control' in the tags section below]"); $details->th_td('Site',l_site_obj($site)); // xxx show the PIs here //$details->th_td('PIs',...); @@ -259,7 +265,7 @@ $details->end(); $details->form_end(); $toggle->end(); -//////////////////// persons +//////////////////////////////////////////////////////////// tab:persons $person_columns = array('email','person_id','first_name','last_name','roles'); // get persons in slice if (!empty($person_ids)) @@ -274,11 +280,12 @@ $potential_persons= $person_columns); $count=count($persons); +if ($profiling) plc_debug_prof('04: persons',count($persons)); $toggle= - new PlekitToggle ('my-slice-persons',"$count Users", + new PlekitToggle ('my-slice-persons',"$count users", array('bubble'=> 'Manage accounts attached to this slice', - 'visible'=>get_arg('show_persons',false))); + 'visible'=>get_arg('show_persons'))); $toggle->start(); ////////// people currently in @@ -288,7 +295,7 @@ $toggle->start(); // show otherwise $toggle_persons = new PlekitToggle ('my-slice-persons-current', "$count people currently in $name", - array('visible'=>get_arg('show_persons_current',!$privileges))); + array('visible'=>get_arg('show_persons_current'))); $toggle_persons->start(); $headers=array(); @@ -330,7 +337,7 @@ if ($privileges) { $count=count($potential_persons); $toggle_persons = new PlekitToggle ('my-slice-persons-add', "$count people may be added to $name", - array('visible'=>get_arg('show_persons_add',false))); + array('visible'=>get_arg('show_persons_add'))); $toggle_persons->start(); if ( ! $potential_persons ) { // xxx improve style @@ -374,7 +381,7 @@ if ($privileges) { } $toggle->end(); -//////////////////////////////////////////////////////////// Nodes +//////////////////////////////////////////////////////////// tab:nodes // the nodes details to display here // (1) we search for the tag types for which 'category' matches 'node*/ui*' // all these tags will then be tentatively displayed in this area @@ -385,56 +392,373 @@ $toggle->end(); // (.) type is passed to the javascript table, for sorting (default is 'string') // minimal list as a start -$node_fixed_columns = array('hostname','node_id','peer_id','slice_ids_whitelist','run_level','boot_state','last_contact'); +$node_fixed_columns = array('hostname','node_id','peer_id','slice_ids_whitelist', 'site_id', + 'run_level','boot_state','last_contact','node_type'); // create a VisibleTags object : basically the list of tag columns to show +//$visibletags = new VisibleTags ($api, 'node'); +//$visiblecolumns = $visibletags->column_names(); + +// optimizing calls to GetNodes +//$all_nodes=$api->GetNodes(NULL,$node_columns); +//$slice_nodes=$api->GetNodes(array('node_id'=>$slice['node_ids']),$node_columns); +//$potential_nodes=$api->GetNodes(array('~node_id'=>$slice['node_ids']),$node_columns); + + +//NEW CODE FOR ENABLING COLUMN CONFIGURATION + +//prepare fix and configurable columns + +$fix_columns = array(); +$fix_columns[]=array('tagname'=>'hostname', 'header'=>'hostname', 'type'=>'string', 'title'=>'The name of the node'); +$fix_columns[]=array('tagname'=>'peer_id', 'header'=>'AU', 'type'=>'string', 'title'=>'Authority'); +$fix_columns[]=array('tagname'=>'run_level', 'header'=>'ST', 'type'=>'string', 'title'=>'Status'); +$fix_columns[]=array('tagname'=>'node_type', 'header'=>'RES', 'type'=>'string', 'title'=>'Reservable'); + +// columns that correspond to the visible tags for nodes (*node/ui*) $visibletags = new VisibleTags ($api, 'node'); -$visiblecolumns = $visibletags->column_names(); -$node_columns=array_merge($node_fixed_columns,$visiblecolumns); -$nodes=$api->GetNodes(array('node_id'=>$slice['node_ids']),$node_columns); -$potential_nodes=$api->GetNodes(array('~node_id'=>$slice['node_ids']),$node_columns); -$count=count($nodes); +$visibletags->columns(); +$tag_columns = $visibletags->headers(); + +//columns that are not defined as extra myslice tags +$extra_columns = array(); +//MyPLC columns +$extra_columns[]=array('tagname'=>'sitename', 'header'=>'SN', 'type'=>'string', 'title'=>'Site name', 'fetched'=>true, 'source'=>'myplc'); +$extra_columns[]=array('tagname'=>'domain', 'header'=>'DN', 'type'=>'string', 'title'=>'Toplevel domain name', 'fetched'=>true, 'source'=>'myplc'); +$extra_columns[]=array('tagname'=>'ipaddress', 'header'=>'IP', 'type'=>'string', 'title'=>'IP Address', 'fetched'=>true, 'source'=>'myplc'); +$extra_columns[]=array('tagname'=>'fcdistro', 'header'=>'OS', 'type'=>'string', 'title'=>'Operating system', 'fetched'=>false, 'source'=>'myplc'); +$extra_columns[]=array('tagname'=>'date_created', 'header'=>'DA', 'source'=>'myplc', 'type'=>'date', 'title'=>'Date added', 'fetched'=>false); +$extra_columns[]=array('tagname'=>'arch', 'header'=>'A', 'source'=>'myplc', 'type'=>'string', 'title'=>'Architecture', 'fetched'=>false); +if (plc_is_admin()) { +$extra_columns[]=array('tagname'=>'deployment', 'header'=>'DL', 'source'=>'myplc', 'type'=>'string', 'title'=>'Deployment', 'fetched'=>false); +} + +//CoMon Live data + +if (MYSLICE_COMON_AVAILABLE) +{ +$extra_columns[]=array('tagname'=>'bwlimit', 'header'=>'BW', 'source'=>'comon', 'type'=>'sortAlphaNumericTop', 'title'=>'Bandwidth limit', 'fetched'=>false); +$extra_columns[]=array('tagname'=>'numcores', 'header'=>'CC', 'source'=>'comon', 'type'=>'sortAlphaNumericTop', 'title'=>'Number of CPU Cores', 'fetched'=>false); +$extra_columns[]=array('tagname'=>'cpuspeed', 'header'=>'CR', 'source'=>'comon', 'type'=>'sortAlphaNumericTop', 'title'=>'CPU clock rate', 'fetched'=>false); +$extra_columns[]=array('tagname'=>'disksize', 'header'=>'DS', 'source'=>'comon', 'type'=>'sortAlphaNumericTop', 'title'=>'Disk size', 'fetched'=>false); +$extra_columns[]=array('tagname'=>'gbfree', 'header'=>'DF', 'source'=>'comon', 'type'=>'sortAlphaNumericTop', 'title'=>'Currently available disk space', 'fetched'=>false); +$extra_columns[]=array('tagname'=>'memsize', 'header'=>'MS', 'source'=>'comon', 'type'=>'sortAlphaNumericTop', 'title'=>'Memory size', 'fetched'=>false); +$extra_columns[]=array('tagname'=>'numslices', 'header'=>'SM', 'source'=>'comon', 'type'=>'sortAlphaNumericTop', 'title'=>'Number of slices in memory', 'fetched'=>false); +$extra_columns[]=array('tagname'=>'uptime', 'header'=>'UT', 'source'=>'comon', 'type'=>'sortAlphaNumericTop', 'title'=>'Continuous uptime until now', 'fetched'=>false); +} + +//TopHat Live data + +if (MYSLICE_TOPHAT_AVAILABLE) +{ +$extra_columns[]=array('tagname'=>'asn', 'header'=>'AS', 'source'=>'tophat', 'type'=>'string', 'title'=>'AS Number', 'fetched'=>false); +$extra_columns[]=array('tagname'=>'city', 'header'=>'LCY', 'source'=>'tophat', 'type'=>'string', 'title'=>'City', 'fetched'=>false); +$extra_columns[]=array('tagname'=>'region', 'header'=>'LRN', 'source'=>'tophat', 'type'=>'string', 'title'=>'Region', 'fetched'=>false); +$extra_columns[]=array('tagname'=>'country', 'header'=>'LCN', 'source'=>'tophat', 'type'=>'string', 'title'=>'Country', 'fetched'=>false); +$extra_columns[]=array('tagname'=>'continent', 'header'=>'LCT', 'source'=>'tophat', 'type'=>'string', 'title'=>'Continent', 'fetched'=>false); +//$extra_columns[]=array('tagname'=>'hopcount', 'header'=>'HC', 'source'=>'tophat', 'type'=>'sortAlphaNumericTop', 'title'=>'Hop count from reference node', 'fetched'=>false); +////$extra_columns[]=array('tagname'=>'rtt', 'header'=>'RTT', 'source'=>'tophat', 'type'=>'sortAlphaNumericTop', 'title'=>'Round trip time from reference node', 'fetched'=>false); +//////$extra_columns[]=array('tagname'=>'agents', 'header'=>'MA', 'source'=>'tophat', 'type'=>'sortAlphaNumericTop', 'title'=>'Co-located measurement agents', 'fetched'=>true); +////$extra_columns[]=array('tagname'=>'agents_sonoma', 'header'=>'MAS', 'source'=>'tophat', 'type'=>'sortAlphaNumericTop', 'title'=>'Co-located SONoMA agents', 'fetched'=>true); +////$extra_columns[]=array('tagname'=>'agents_etomic', 'header'=>'MAE', 'source'=>'tophat', 'type'=>'sortAlphaNumericTop', 'title'=>'Co-located ETOMIC agents', 'fetched'=>true); +////$extra_columns[]=array('tagname'=>'agents_tdmi', 'header'=>'MAT', 'source'=>'tophat', 'type'=>'sortAlphaNumericTop', 'title'=>'Co-located TDMI agents', 'fetched'=>true); +////$extra_columns[]=array('tagname'=>'agents_dimes', 'header'=>'MAD', 'source'=>'tophat', 'type'=>'sortAlphaNumericTop', 'title'=>'Co-located DIMES agents', 'fetched'=>true); +} + + + +//Get user's column configuration + +$first_time_configuration = false; +$default_configuration = "hostname:f|ST:f|AU:f|RES:f"; +//$extra_default = ""; +$column_configuration = ""; +$slice_column_configuration = ""; + +$show_configuration = ""; + +$PersonTags=$api->GetPersonTags (array('person_id'=>$plc->person['person_id'])); +//plc_debug('ptags',$PersonTags); +foreach ($PersonTags as $ptag) { + if ($ptag['tagname'] == 'columnconf') { + $column_configuration = $ptag['value']; + $conf_tag_id = $ptag['person_tag_id']; + } else if ($ptag['tagname'] == 'showconf') { + $show_configuration = $ptag['value']; + $show_tag_id = $ptag['person_tag_id']; + } +} + +$sliceconf_exists = false; +if ($column_configuration == "") { + $first_time_configuration = true; + $column_configuration = $slice_id.";default"; + $sliceconf_exists = true; +} else { + $slice_conf = explode(";",$column_configuration); + for ($i=0; $iTABLE HEADERS
"); +//print_r($table_headers); + +print("
"); +print(""); +print(""); +print(""); +print(""); +print(""); +print(""); +print("HEADERS
"); +//print_r($headers); $table_options = array('notes'=>$notes, 'search_width'=>15, - 'pagesize'=>20); -$table=new PlekitTable('nodes',$headers,'1',$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)); + $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)); - foreach ($visiblecolumns as $tagname) $table->cell($node[$tagname]); + $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(); @@ -453,7 +777,9 @@ if ($privileges) { $table->end(); $toggle_nodes->end(); -////////// nodes to add +if ($profiling) plc_debug_prof('11: nodes in',count($slice_nodes)); + +//////////////////// nodes to add if ($privileges) { $new_potential_nodes = array(); if ($potential_nodes) foreach ($potential_nodes as $node) { @@ -466,37 +792,61 @@ if ($privileges) { $count=count($potential_nodes); $toggle_nodes=new PlekitToggle('my-slice-nodes-add', - "$count more nodes available", - array('visible'=>get_arg('show_nodes_add',false))); + count_english($potential_nodes,"more node") . " available", + array('visible'=>get_arg('show_nodes_add'))); $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'; - $short="ST"; $long=Node::status_footnote(); $type='string'; + $short="-S-"; $long=Node::status_footnote(); $type='string'; $headers[$short]=array('type'=>$type,'title'=>$long); $notes []= "$short = $long"; - // the extra tags + $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()); - $notes=array_merge($notes,$visibletags->notes()); $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)); + $peers->cell($table,$node['peer_id']); list($label,$class) = Node::status_label_class_($node); $table->cell ($label,array('class'=>$class)); - foreach ($visiblecolumns as $tagname) $table->cell($node[$tagname]); + $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(); } @@ -511,17 +861,148 @@ if ($privileges) { } $toggle_nodes->end(); } + $toggle->end(); -//////////////////////////////////////////////////////////// Tags +if ($profiling) plc_debug_prof('12: nodes to add',count($potential_nodes)); + +//////////////////////////////////////// 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_code, initscript) +// * explain the interface : initscript start|stop|restart slicename +// xxx fixme + +$initscript_info=" +There are two ways to attach an initscript to a slice: