From 24fe435929a23909cc75efb34a5f5e4d14f24eb2 Mon Sep 17 00:00:00 2001 From: Panos Date: Fri, 15 Oct 2010 14:51:28 +0200 Subject: [PATCH] Moved nodes2.php to the correct path (sorry for this) --- planetlab/nodes/nodes2.php | 364 +++++++++++++ planetlab/slices/nodes2.php | 985 ------------------------------------ 2 files changed, 364 insertions(+), 985 deletions(-) create mode 100644 planetlab/nodes/nodes2.php delete mode 100644 planetlab/slices/nodes2.php diff --git a/planetlab/nodes/nodes2.php b/planetlab/nodes/nodes2.php new file mode 100644 index 0000000..4311ca1 --- /dev/null +++ b/planetlab/nodes/nodes2.php @@ -0,0 +1,364 @@ + +'); + + +ini_set("memory_limit","64M"); + +// -------------------- +// recognized URL arguments +$peerscope=$_GET['peerscope']; +$pattern=$_GET['pattern']; +$site_id=intval($_GET['site_id']); +$slice_id=intval($_GET['slice_id']); +$person_id=intval($_GET['person_id']); + +// --- decoration +$title="Nodes"; +$tabs=array(); +$tabs []= tab_nodes(); +if (count (plc_my_site_ids()) == 1) { + $tabs []= tab_nodes_mysite(); +} else { + $tabs []= tab_nodes_all_mysite(); +} +$tabs []= tab_nodes_local(); + +// -------------------- +$node_filter=array(); + +////////////////// +// performs sanity check and summarize the result in a single column +function node_status ($node) { + + $messages=array(); + if ($node['node_type'] != 'regular' && $node['node_type'] != 'reservable' ) + $messages []= $node['node_type']; + + // checks on local nodes only + if ( ( ! $node['peer_id']) ) { + // has it got interfaces + if (count($node['interface_ids']) == 0) + $messages []= "No interface"; + } + return plc_vertical_table($messages,'plc-warning'); +} + + +$first_time_configuration = 'false'; + +if (plc_is_admin()) + $default_configuration = "ID:f|hostname:f|ST:f|AU:f|SN|DN|LCN"; +else + $default_configuration = "hostname:f|ST:f|AU:f|SN|LCN|DN"; + +$column_configuration = ""; +$slice_column_configuration = ""; + +$PersonTags=$api->GetPersonTags (array('person_id'=>$plc->person['person_id'])); +//print_r($PersonTags); +foreach ($PersonTags as $ptag) { + if ($ptag['tagname'] == 'columnconf') + { + $column_configuration = $ptag['value']; + $conf_tag_id = $ptag['person_tag_id']; + } +} + +//print("column configuration = ".$column_configuration); + +$nodesconf_exists = false; +if ($column_configuration == "") +{ + $column_configuration = "nodes;default"; + $nodesconf_exists = true; +} +else { + $slice_conf = explode(";",$column_configuration); + for ($i=0; $iOLD"); +//print_r($visiblecolumns); +//$node_columns=array_merge($node_fixed_columns,$visiblecolumns); + + +// server-side filtering - set pattern in $_GET for filtering on hostname +if ($pattern) { + $node_filter['hostname']=$pattern; + $title .= " matching " . $pattern; + } else { + $node_filter['hostname']="*"; + } + +// server-side selection on peerscope +$peerscope=new PeerScope($api,$_GET['peerscope']); +$node_filter=array_merge($node_filter,$peerscope->filter()); +$title .= ' - ' . $peerscope->label(); + +if ($site_id) { + $sites=$api->GetSites(array($site_id)); + $site=$sites[0]; + $name=$site['name']; + $login_base=$site['login_base']; + $title .= t_site($site); + $tabs []= tab_site($site); + $node_filter['site_id']=array($site_id); +} + +if ($slice_id) { + $slices=$api->GetSlices(array($slice_id),array('node_ids','name')); + $slice=$slices[0]; + $title .= t_slice($slice); + $tabs []= tab_slice($slice); + $node_filter['node_id'] = $slice['node_ids']; + } + +// person_id is set : this is mostly oriented towards people managing several sites +if ($person_id) { + // avoid doing a useless call to GetPersons if the person_id is already known though $plc, + // as this is mostly done for the 'all my sites nodes' link + if ($person_id == plc_my_person_id()) { + $person=plc_my_person(); + $site_ids = plc_my_site_ids(); + } else { + // fetch the person's site_ids + $persons = $api->GetPersons(array('person_id'=>$person_id),array('person_id','email','site_ids')); + $person=$persons[0]; + $site_ids=$person['site_ids']; + } + $title .= t_person($person); + $node_filter['site_id']=$site_ids; + } + +// go +$nodes=$api->GetNodes($node_filter,$node_columns); + +// build site_ids - interface_ids +$site_ids=array(); +$interface_ids=array(); +if ($nodes) foreach ($nodes as $node) { + $site_ids []= $node['site_id']; + $interface_ids = array_merge ($interface_ids,$node['interface_ids']); +} + +// fetch related interfaces +$interface_columns=array('ip','node_id','interface_id'); +$interface_filter=array('is_primary'=>TRUE,'interface_id'=>$interface_ids); +$interfaces=$api->GetInterfaces($interface_filter,$interface_columns); + +$interface_hash=array(); +foreach ($interfaces as $interface) $interface_hash[$interface['node_id']]=$interface; + +// fetch related sites +$site_columns=array('site_id','login_base'); +$site_filter=array('site_id'=>$site_ids); +$sites=$api->GetSites($site_filter,$site_columns); + +$site_hash=array(); +foreach ($sites as $site) $site_hash[$site['site_id']]=$site; + +// -------------------- +drupal_set_title($title); + +plekit_linetabs($tabs); + +if ( ! $nodes ) { + drupal_set_message ('No node found'); + return; + } + +$nifty=new PlekitNifty ('','objects-list','big'); +$nifty->start(); +$headers = array (); $offset=0; +$notes=array(); +$notes [] = "For information about the different columns please see the node table layout tab above or mouse over the column headers"; + + +/* +// fixed columns +if (plc_is_admin()) { + $short="I"; $long="node_id"; $type='int'; + $headers[$short]=array('type'=>$type,'title'=>$long); $notes []= "$short = $long"; + $offset=1; + } +$short="P"; $long="Peer"; $type='string'; + $headers[$short]=array('type'=>$type,'title'=>$long); $notes []= "$short = $long"; +$short="D"; $long="toplevel domain name"; $type='string'; + $headers[$short]=array('type'=>$type,'title'=>$long); $notes []= "$short = $long"; +$headers["Site"]="string"; +$headers["Hostname"]="string"; +$short="IP"; $long="IP Address"; $type='sortIPAddress'; + $headers[$short]=array('type'=>$type,'title'=>$long); $notes []= "$short = $long"; +$short="ST"; $long=Node::status_footnote(); $type='string'; + $headers[$short]=array('type'=>$type,'title'=>$long); $notes []= "$short = $long"; +$short="SL"; $long="Number of slivers"; $type='int'; + $headers[$short]=array('type'=>$type,'title'=>$long); $notes []= "$short = $long"; + +$headers=array_merge($headers,$visibletags->headers()); +$notes=array_merge($notes,$visibletags->notes()); +$short="?"; $long="extra status info"; $type='string'; + $headers[$short]=array('type'=>$type,'title'=>$long); $notes []= "$short = $long"; +*/ + +$info_header = array(); +$short="?"; $long="extra status info"; $type='string'; +$info_header[$short]=array('type'=>$type,'title'=>$long, 'label'=>'?', 'header'=>'?', 'visible'=>true); +//$notes []= "$short = $long"; +//$info_header["?"] = "none"; +$headers = array_merge($ConfigureColumns->get_headers(),$info_header); + +//print("

HEADERS"); +//print_r($headers); + +$toggle_nodes=new PlekitToggle('nodes-column-configuration', + "Node table layout", + array('visible'=>'1')); +$toggle_nodes->start(); +print("

"); +print(""); +print(""); +print(""); +print(""); +print("
"); +//print(""); +print(""); +$ConfigureColumns->configuration_panel_html(true); +$ConfigureColumns->javascript_init(); +$toggle_nodes->end(); + +$table_options = array('notes'=>$notes, + 'search_width'=>15, + 'pagesize'=>20, + 'configurable'=>true); + +# initial sort on hostnames +$table=new PlekitTable ("nodes",$headers,3+$offset, $table_options); +$table->start(); + +$peers = new Peers ($api); +// write rows +foreach ($nodes as $node) { + //$node_obj = new Node ($node); + $hostname=$node['hostname']; + $node_id=$node['node_id']; + $site_id=$node['site_id']; + $site=$site_hash[$site_id]; + $login_base = $site['login_base']; + $ip=$interface_hash[$node['node_id']]['ip']; + $interface_id=$interface_hash[$node['node_id']]['interface_id']; + $peer_id=$node['peer_id']; + + $table->row_start(); + $table->cell($node['node_id'], array('display'=>'none')); + if (plc_is_admin()) $table->cell(l_node_t($node_id,$node_id)); + $table->cell (l_node_t($node_id,$hostname)); + $peers->cell ($table,$peer_id); + //$table->cell (topdomain($hostname)); + $node['domain'] = topdomain($hostname); + //$table->cell (l_site_t($site_id,$login_base)); + $node['sitename'] = l_site_t($site_id,$login_base); + //$table->cell (l_interface_t($interface_id,$ip),array('only-if'=> !$peer_id)); + $node['ipaddress'] = l_interface_t($interface_id,$ip); + list($label,$class) = Node::status_label_class_($node); + $table->cell ($label,array('class'=>$class)); + //$table->cell (count($node['slice_ids'])); + //foreach ($visiblecolumns as $tagname) $table->cell($node[$tagname]); + $ConfigureColumns->cells($table, $node); + $table->cell (node_status($node)); + $table->row_end(); + +} + +$table->end(); +$nifty->end(); + +//plekit_linetabs ($tabs,"bottom"); + +// Print footer +include 'plc_footer.php'; + +?> diff --git a/planetlab/slices/nodes2.php b/planetlab/slices/nodes2.php deleted file mode 100644 index 2862f1b..0000000 --- a/planetlab/slices/nodes2.php +++ /dev/null @@ -1,985 +0,0 @@ - - -'); - -// -------------------- admins potentially need to get full list of users -ini_set('memory_limit','32M'); - -$profiling=false; -if ($_GET['profiling']) $profiling=true; - -if ($profiling) plc_debug_prof_start(); - -// -------------------- -// recognized URL arguments -$slice_id=intval($_GET['id']); -if ( ! $slice_id ) { plc_error('Malformed URL - id not set'); return; } - -//////////////////// -// 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"); - return; - } - -$slice=$slices[0]; - -if ($profiling) plc_debug_prof('2: slice',count($slices)); -// pull all node info to vars -$name= $slice['name']; -$expires = date( "d/m/Y", $slice['expires'] ); -$site_id= $slice['site_id']; - -$person_ids=$slice['person_ids']; - -// get peers -$peer_id= $slice['peer_id']; -$peers=new Peers ($api); -$local_peer = ! $peer_id; - -if ($profiling) plc_debug_prof('3: 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('4: 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(); - -//////////////////////////////////////////////////////////// -// 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; - $current_exp=$slice['expires']; - - $time_left = $current_exp - $NOW; - $visible = $time_left/$DAY <= $GRACE_DAYS; - return $visible; -} - -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',"Expires $current_text - Renew this slice", - array("bubble"=> - "Enter this zone if you wish to renew your slice", - 'visible'=>$visible)); - $toggle->start(); - - // xxx message could take roles into account - if ($site['max_slices']<=0) { - $message= <<< EOF -

Slice creation and renewal have been temporarily disabled for your -site details page to find -out more about your site's nodes, and how to contact your site's PI(s) -and Technical Contact(s).

-EOF; - echo $message; - - } else { - // xxx this is a rough cut and paste from the former UI - // showing a datepicker view could be considered as well with some extra work - // calculate possible extension lengths - $selectors = array(); - foreach ( array ( 1 => "One more week", - 2 => "Two more weeks", - 3 => "Three more weeks", - 4 => "One more month" ) as $weeks => $text ) { - $candidate_exp = $current_exp + $weeks*$WEEK; - if ( $candidate_exp < $max_exp) { - $selectors []= array('display'=>"$text (" . gmstrftime("%A %b-%d-%y %T %Z", $candidate_exp) . ")", - 'value'=>$candidate_exp); - $max_renewal_weeks=$weeks; - $max_renewal_date= gmstrftime("%A %b-%d-%y %T %Z", $candidate_exp); - } - } - - if ( empty( $selectors ) ) { - print <<< EOF -
-Slices annot be renewed more than $MAX_WEEKS weeks from now, i.e. not beyond $max_text. -For this reason, the current slice cannot be renewed any further into the future, try again closer to expiration date. -
-EOF; - } else { - print <<< EOF -
-

You must provide a short description, -as well as a link to a project website, before renewing it. - -
Please make sure to provide reasonable details on -the kind of traffic, and copyrights if relevant. -Do not provide bogus information; if a complaint is lodged against -your slice and your PlanetLab Operations Center 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). -

-
-EOF; - - $form = new PlekitForm (l_actions(), - array('action'=>'renew-slice', - 'slice_id'=>$slice['slice_id'])); - $form->start(); - print $form->label_html('expires','Duration'); - print $form->select_html('expires',$selectors,array('label'=>'Pick one')); - print $form->submit_html('renew-button','Renew'); - $form->end(); - } - } - - $toggle->end(); -} - -//////////////////////////////////////////////////////////// - -$am_in_slice = in_array(plc_my_person_id(),$person_ids); - -if ($am_in_slice) { - drupal_set_title("My slice " . $name); - } else { - drupal_set_title("Slice " . $name); -} - -$privileges = ( $local_peer && (plc_is_admin() || plc_is_pi() || $am_in_slice)); -$tags_privileges = $privileges || plc_is_admin(); - -$tabs=array(); -$tabs [] = tab_nodes_slice($slice_id); -$tabs [] = tab_site($site); - -// are these the right privileges for deletion ? -if ($privileges) { - $tabs ['Delete']= array('url'=>l_actions(), - 'method'=>'post', - 'values'=>array('action'=>'delete-slice','slice_id'=>$slice_id), - 'bubble'=>"Delete slice $name", - 'confirm'=>"Are you sure to delete slice $name"); - - $tabs["Events"]=array_merge(tablook_event(), - array('url'=>l_event("Slice","slice",$slice_id), - 'bubble'=>"Events for slice $name")); - $tabs["Comon"]=array_merge(tablook_comon(), - array('url'=>l_comon("slice_id",$slice_id), - 'bubble'=>"Comon page about slice $name")); -} - -plekit_linetabs($tabs); - -//////////////////////////////////////// -$peers->block_start($peer_id); - -//////////////////////////////////////// renewal area -// (1) close to expiration : show on top and open - -if ($local_peer ) { - $renew_visible = renew_needed ($slice); - if ($renew_visible) renew_area ($slice,$site,true); - } - - -//////////////////// details -// default for opening the details section or not ? -if ($local_peer) { - $default_show_details = true; - } else { - $default_show_details = ! $renew_visible; - } - -$toggle = - new PlekitToggle ('my-slice-details',"Details", - array('bubble'=> - 'Display and modify details for that slice', - 'visible'=>get_arg('show_details',$default_show_details))); -$toggle->start(); - -$details=new PlekitDetails($privileges); -$details->form_start(l_actions(),array('action'=>'update-slice', - 'slice_id'=>$slice_id, - 'name'=>$name)); - -$details->start(); -if (! $local_peer) { - $details->th_td("Peer",$peers->peer_link($peer_id)); - $details->space(); - } - - -$details->th_td('Name',$slice['name']); -$details->th_td('Description',$slice['description'],'description', - array('input_type'=>'textarea', - 'width'=>50,'height'=>5)); -$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',...); -$details->end(); - -$details->form_end(); -$toggle->end(); - -//////////////////// persons -$person_columns = array('email','person_id','first_name','last_name','roles'); -// get persons in slice -if (!empty($person_ids)) - $persons=$api->GetPersons(array('person_id'=>$slice['person_ids']),$person_columns); -// just propose to add everyone else -// xxx this is maybe too much for admins as it slows stuff down -// as regular persons can see only a fraction of the db anyway -$potential_persons= - $api->GetPersons(array('~person_id'=>$slice['person_ids'], - 'peer_id'=>NULL, - 'enabled'=>true), - $person_columns); -$count=count($persons); - -if ($profiling) plc_debug_prof('4: persons',count($persons)); -$toggle= - new PlekitToggle ('my-slice-persons',"$count Users", - array('bubble'=> - 'Manage accounts attached to this slice', - 'visible'=>get_arg('show_persons',false))); -$toggle->start(); - -////////// people currently in -// visible: -// hide if both current+add are included -// so user can chose which section is of interest -// show otherwise -$toggle_persons = new PlekitToggle ('my-slice-persons-current', - "$count people currently in $name", - array('visible'=>get_arg('show_persons_current',!$privileges))); -$toggle_persons->start(); - -$headers=array(); -$headers['email']='string'; -$headers['first']='string'; -$headers['last']='string'; -$headers['R']='string'; -if ($privileges) $headers[plc_delete_icon()]="none"; -$table=new PlekitTable('persons',$headers,'0', - array('notes_area'=>false)); -$form=new PlekitForm(l_actions(),array('slice_id'=>$slice['slice_id'])); -$form->start(); -$table->start(); -if ($persons) foreach ($persons as $person) { - $table->row_start(); - $table->cell(l_person_obj($person)); - $table->cell($person['first_name']); - $table->cell($person['last_name']); - $table->cell(plc_vertical_table ($person['roles'])); - if ($privileges) $table->cell ($form->checkbox_html('person_ids[]',$person['person_id'])); - $table->row_end(); -} -// actions area -if ($privileges) { - - // remove persons - $table->tfoot_start(); - - $table->row_start(); - $table->cell($form->submit_html ("remove-persons-from-slice","Remove selected"), - array('hfill'=>true,'align'=>'right')); - $table->row_end(); - } -$table->end(); -$toggle_persons->end(); - -////////// people to add -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))); - $toggle_persons->start(); - if ( ! $potential_persons ) { - // xxx improve style - echo "

No person to add

"; - } else { - $headers=array(); - $headers['email']='string'; - $headers['first']='string'; - $headers['last']='string'; - $headers['R']='string'; - $headers['+']="none"; - $options = array('notes_area'=>false, - 'search_width'=>15, - 'pagesize'=>8); - // show search for admins only as other people won't get that many names to add - if ( ! plc_is_admin() ) $options['search_area']=false; - - $table=new PlekitTable('add_persons',$headers,'0',$options); - $form=new PlekitForm(l_actions(),array('slice_id'=>$slice['slice_id'])); - $form->start(); - $table->start(); - if ($potential_persons) foreach ($potential_persons as $person) { - $table->row_start(); - $table->cell(l_person_obj($person)); - $table->cell($person['first_name']); - $table->cell($person['last_name']); - $table->cell(plc_vertical_table ($person['roles'])); - $table->cell ($form->checkbox_html('person_ids[]',$person['person_id'])); - $table->row_end(); - } - // add users - $table->tfoot_start(); - $table->row_start(); - $table->cell($form->submit_html ("add-persons-in-slice","Add selected"), - array('hfill'=>true,'align'=>'right')); - $table->row_end(); - $table->end(); - $form->end(); - } - $toggle_persons->end(); -} -$toggle->end(); - -//////////////////////////////////////////////////////////// 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 -// (2) further information can also be optionally specified in the category: -// (.) we split the category with '/' and search for assignments of the form var=value -// (.) header can be set to supersede the column header (default is tagname) -// (.) rank can be used for ordering the columns (default is tagname) -// (.) 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', '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'); -$visibletags->columns(); -$tag_columns = $visibletags->headers(); - -// extra columns that are not tags (for the moment not sorted correctly) - -$extra_columns = array(); -$extra_columns[]=array('tagname'=>'sitename', 'header'=>'SN', 'type'=>'string', 'title'=>'Site name', 'fetched'=>true); -$extra_columns[]=array('tagname'=>'domain', 'header'=>'DN', 'type'=>'string', 'title'=>'Toplevel domain name', 'fetched'=>true); -$extra_columns[]=array('tagname'=>'ipaddress', 'header'=>'IP', 'type'=>'string', 'title'=>'IP Address', 'fetched'=>true); - -//get user's column configuration - -$first_time_configuration = 'false'; -$default_configuration = "hostname:f|ST:f|AU:f|RES:f"; -$column_configuration = ""; -$slice_column_configuration = ""; - -$show_configuration = "reservable:yes"; -$slice_show_configuration = ""; -$show_reservable_message = ""; - -$PersonTags=$api->GetPersonTags (array('person_id'=>$plc->person['person_id'])); -//print_r($PersonTags); -foreach ($PersonTags as $ptag) { - if ($ptag['tagname'] == 'columnconf') - { - $column_configuration = $ptag['value']; - $conf_tag_id = $ptag['person_tag_id']; - } - if ($ptag['tagname'] == 'showconf') - { - $show_configuration = $ptag['value']; - $show_tag_id = $ptag['person_tag_id']; - } -} - -//print("
person column configuration = ".$column_configuration); - -$sliceconf_exists = false; -if ($column_configuration == "") -{ - $column_configuration = $slice_id.";default"; - $sliceconf_exists = true; -} -else { - $slice_conf = explode(";",$column_configuration); - for ($i=0; $islice configuration = ".$slice_column_configuration); - -//instantiate the column configuration class, which prepares the headers array - -if ($slice_column_configuration == "") - $full_configuration = $default_configuration; -else - $full_configuration = $default_configuration."|".$slice_column_configuration; - -$ConfigureColumns =new PlekitColumns($full_configuration, $fix_columns, $tag_columns, $extra_columns); - -$visiblecolumns = $ConfigureColumns->node_tags(); - -$node_columns=array_merge($node_fixed_columns,$visiblecolumns); -//print_r($node_columns); -$all_nodes=$api->GetNodes(NULL,$node_columns); - -//print("
person show configuration = ".$show_configuration); - -$show_conf = explode(";",$show_configuration); -for ($i=0; $islice show configuration = ".$slice_show_configuration); - -$slice_nodes=array(); -$potential_nodes=array(); -$reservable_nodes=array(); -foreach ($all_nodes as $node) { - if (in_array($node['node_id'],$slice['node_ids'])) { - $slice_nodes[]=$node; - if ($node['node_type']=='reservable') $reservable_nodes[]=$node; - } else { - $potential_nodes[]=$node; - } -} -if ($profiling) plc_debug_prof('5: nodes',count($slice_nodes)); -//////////////////// -// outline the number of reservable nodes -$nodes_message=count_english($slice_nodes,"node"); -if (count($reservable_nodes)) $nodes_message .= " (" . count($reservable_nodes) . " reservable)"; -$toggle=new PlekitToggle ('my-slice-nodes',$nodes_message, - array('bubble'=> - 'Manage nodes attached to this slice', - 'visible'=>get_arg('show_nodes',false))); -$toggle->start(); - -////////// show a notice to people having attached a reservable node -if (count($reservable_nodes) && $privileges) { - $mark=reservable_mark(); - 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. -
-Please note that as of August 2010 this feature is experimental. -Feedback is appreciated at devel@planet-lab.org -
hide message -
- -EOF; -} - -//////////////////// reservable nodes area -$count=count($reservable_nodes); -if ($count && $privileges) { - // having reservable nodes in white lists looks a bit off scope for now... - $toggle_nodes=new PlekitToggle('my-slice-nodes-reserve', - "Leases - " . count($reservable_nodes) . " reservable node(s)", - array('visible'=>get_arg('show_nodes_resa',false))); - $toggle_nodes->start(); - $grain=$api->GetLeaseGranularity(); - if ($profiling) plc_debug_prof('6 granul',$grain); - // where to start from, expressed as an offset in hours from now - $resa_offset=$_GET['resa_offset']; - if ( ! $resa_offset ) $resa_offset=0; - $rough_start=time()+$resa_offset*3600; - // xxx should be configurable - $resa_slots=$_GET['resa_slots']; - if ( ! $resa_slots ) $resa_slots = 36; - // for now, show the next 72 hours, or 72 grains, which ever is smaller - $duration=$resa_slots*$grain; - $steps=$duration/$grain; - $start=intval($rough_start/$grain)*$grain; - $end=$rough_start+$duration; - $lease_columns=array('lease_id','name','t_from','t_until','hostname','name'); - $leases=$api->GetLeases(array(']t_until'=>$rough_start,'[t_from'=>$end,'-SORT'=>'t_from'),$lease_columns); - if ($profiling) plc_debug_prof('7 leases',count($leases)); - // hash nodes -> leases - $host_hash=array(); - foreach ($leases as $lease) { - $hostname=$lease['hostname']; - if ( ! $host_hash[$hostname] ) { - $host_hash[$hostname]=array(); - } - // resync within the table - $lease['nfrom']=($lease['t_from']-$start)/$grain; - $lease['nuntil']=($lease['t_until']-$start)/$grain; - $host_hash[$hostname] []= $lease; - } - # leases_data is the name used by leases.js to locate this table - echo ""; - # pass (slice_id,slicename) as the [0,0] coordinate as thead>tr>td - echo ""; - # the timeslot headers read (timestamp,label) - $day_names=array('Su','M','Tu','W','Th','F','Sa'); - for ($i=0; $i<$steps; $i++) { - $timestamp=($start+$i*$grain); - $day=$day_names[intval(strftime("%w",$timestamp))]; - $label=$day . strftime(" %H:%M",$timestamp); - // expose in each header cell the full timestamp, and how to display it - use & as a separator*/ - echo ""; - } - echo ""; - // todo - sort on hostnames - function sort_hostname ($a,$b) { return ($a['hostname']<$b['hostname'])?-1:1;} - usort($reservable_nodes,sort_hostname); - foreach ($reservable_nodes as $node) { - echo ""; - $hostname=$node['hostname']; - $leases=$host_hash[$hostname]; - $counter=0; - while ($counter<$steps) { - if ($leases && ($leases[0]['nfrom']<=$counter)) { - $lease=array_shift($leases); - /* nicer display, merge two consecutive leases for the same slice - avoid doing that for now, as it might makes things confusing */ - /* while ($leases && ($leases[0]['name']==$lease['name']) && ($leases[0]['nfrom']==$lease['nuntil'])) { - $lease['nuntil']=$leases[0]['nuntil']; - array_shift($leases); - }*/ - $duration=$lease['nuntil']-$counter; - echo ""; - $counter=$lease['nuntil']; - } else { - echo ""; - $counter+=1; - } - } - echo ""; - } - echo "
" . $slice['slice_id'] . '&' . $slice['name'] . "" . implode("&",array($timestamp,$label)) . "
". $node['hostname'] . "" . $lease['lease_id'] . '&' . $lease['name'] . "
\n"; - - // the general layout for the scheduler - echo <<< EOF -
- -
- - -
-EOF; - - $toggle_nodes->end(); - } - - -//////////////////// node configuration panel - -$toggle_nodes=new PlekitToggle('my-slice-nodes-configuration', - "Node table layout", - array('visible'=>'1')); -$toggle_nodes->start(); - -//usort ($table_headers, create_function('$col1,$col2','return strcmp($col1["header"],$col2["header"]);')); -//print("

TABLE HEADERS

"); -//print_r($table_headers); - -print("

"); -print(""); -print(""); -print(""); -print(""); -print(""); -print("
"); -print(""); -print(""); - -$ConfigureColumns->configuration_panel_html(true); - -$ConfigureColumns->javascript_init(); - -$toggle_nodes->end(); - - -$all_sites=$api->GetSites(NULL, array('site_id','login_base')); -$site_hash=array(); -foreach ($all_sites as $site) $site_hash[$site['site_id']]=$site['login_base']; - -$interface_columns=array('ip','node_id','interface_id'); -$interface_filter=array('is_primary'=>TRUE); -$interfaces=$api->GetInterfaces($interface_filter,$interface_columns); - -$interface_hash=array(); -foreach ($interfaces as $interface) $interface_hash[$interface['node_id']]=$interface; - - - - - -//////////////////// nodes currently in -$toggle_nodes=new PlekitToggle('my-slice-nodes-current', - count_english($slice_nodes,"node") . " currently in $name", - array('visible'=>get_arg('show_nodes_current',!$privileges))); -$toggle_nodes->start(); - -$headers=array(); -$notes=array(); -//$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"; - -/* -$headers['peer']='string'; -$headers['hostname']='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()); - -if ($privileges) $headers[plc_delete_icon()]="none"; -*/ - -$edit_header = array(); -if ($privileges) $edit_header[plc_delete_icon()]="none"; -$headers = array_merge($ConfigureColumns->get_headers(),$edit_header); - -//print("

HEADERS

"); -//print_r($headers); - -$table_options = array('notes'=>$notes, - 'search_width'=>15, - '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 ($slice_nodes) foreach ($slice_nodes as $node) { - $table->row_start(); - -$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)); - $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']]); -$node['ipaddress'] = l_interface_t($interface_id,$ip); - - - //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(); -} -// actions area -if ($privileges) { - - // remove nodes - $table->tfoot_start(); - - $table->row_start(); - $table->cell($form->submit_html ("remove-nodes-from-slice","Remove selected"), - array('hfill'=>true,'align'=>'right')); - $table->row_end(); - } -$table->end(); -$toggle_nodes->end(); - -//////////////////// 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_english($potential_nodes,"more node") . " available", - array('visible'=>get_arg('show_nodes_add',false))); - $toggle_nodes->start(); - - if ( $potential_nodes ) { - $headers=array(); - $notes=array(); - - -/* - $headers['peer']='string'; - $headers['hostname']='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,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(); - -$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)); - $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(); - } - // add nodes - $table->tfoot_start(); - $table->row_start(); - $table->cell($form->submit_html ("add-nodes-in-slice","Add selected"), - array('hfill'=>true,'align'=>'right')); - $table->row_end(); - $table->end(); - $form->end(); - } - $toggle_nodes->end(); -} - -$toggle->end(); - -// very wide values get abbreviated -$tag_value_threshold=24; -//////////////////////////////////////////////////////////// Tags -//if ( $local_peer ) { - $tags=$api->GetSliceTags (array('slice_id'=>$slice_id)); - if ($profiling) plc_debug_prof('8 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', - 'visible'=>get_arg('show_tags',false))); - $toggle->start(); - - $headers=array( - "Name"=>"string", - "Value"=>"string", - "Node"=>"string", - "NodeGroup"=>"string"); - 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); - $form=new PlekitForm(l_actions(), - array('slice_id'=>$slice['slice_id'])); - $form->start(); - $table->start(); - if ($tags) { - foreach ($tags as $tag) { - $node_name = "ALL"; - if ($tag['node_id']) { - $tag_nodes = $api->GetNodes(array('node_id'=>$tag['node_id'])); - if ($profiling) plc_debug_prof('9 node for slice tag',count($tag_nodes)); - if($tag_nodes) { - $node = $tag_nodes[0]; - $node_name = $node['hostname']; - } - } - $nodegroup_name="n/a"; - if ($tag['nodegroup_id']) { - $nodegroups=$api->GetNodeGroups(array('nodegroup_id'=>$tag['nodegroup_id'])); - if ($profiling) plc_debug_prof('10 nodegroup for slice tag',$nodegroup); - if ($nodegroup) { - $nodegroup = $nodegroups[0]; - $nodegroup_name = $nodegroup['groupname']; - } - } - $table->row_start(); - $table->cell(l_tag_obj($tag)); - // very wide values get abbreviated - $table->cell(truncate_and_popup($tag['value'],$tag_value_threshold)); - $table->cell($node_name); - $table->cell($nodegroup_name); - if ($tags_privileges) $table->cell ($form->checkbox_html('slice_tag_ids[]',$tag['slice_tag_id'])); - $table->row_end(); - } - } - if ($tags_privileges) { - $table->tfoot_start(); - $table->row_start(); - $table->cell($form->submit_html ("delete-slice-tags","Remove selected"), - array('hfill'=>true,'align'=>'right')); - $table->row_end(); - - $table->row_start(); - function tag_selector ($tag) { - return array("display"=>$tag['tagname'],"value"=>$tag['tag_type_id']); - } - $all_tags= $api->GetTagTypes( array ("category"=>"slice*","-SORT"=>"+tagname"), array("tagname","tag_type_id")); - if ($profiling) plc_debug_prof('11 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']); - } - $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('13 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"))); - $table->cell($form->text_html("value","",array('width'=>8))); - $table->cell($form->select_html("node_id",$selector_node,array('label'=>"All Nodes"))); - $table->cell($form->select_html("nodegroup_id",$selector_nodegroup,array('label'=>"No Nodegroup"))); - $table->cell($form->submit_html("add-slice-tag","Set Tag"),array('columns'=>2,'align'=>'left')); - $table->row_end(); - } - - $table->end(); - $form->end(); - $toggle->end(); -//} - - -//////////////////////// renew slice -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'; - -?> -- 2.43.0