X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=planetlab%2Fslices%2Fslice.php;h=e0868b7361e61aa48bf5519205121ee208b31ea5;hb=e417acbe5b45f14f5f7b0f297a327d2aa18c7038;hp=5797f04c1f0f4e0e8533aadd6c97f5f715b94b41;hpb=d2ec087a2d0f476919f3413585efee6d21d68a7c;p=plewww.git diff --git a/planetlab/slices/slice.php b/planetlab/slices/slice.php index 5797f04..e0868b7 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','32M'); +$profiling = false; +if (get_array($_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; } +$slice_id = intval(get_array($_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"); - return; - } + drupal_set_message("Slice " . $slice_id . " not found"); + return; +} -$slice=$slices[0]; +$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'] ); -$site_id= $slice['site_id']; +$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']; +$person_ids = $slice['person_ids']; // get peers -$peer_id= $slice['peer_id']; -$peers=new Peers ($api); -$local_peer = ! $peer_id; +$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']; +$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('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 $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 = 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; - $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']; - $max_exp= $NOW + ($MAX_WEEKS * $WEEK); // seconds since epoch - - // 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", - array("trigger-bubble"=> - "Enter this zone if you wish to renew your slice", - 'start-visible'=>$visible)); - $toggle->start(); - - // xxx message could take roles into account - if ($site['max_slices']<=0) { - $message= <<< EOF +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
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("No person to add
"; - } else { - $headers=array(); - $headers['email']='string'; - $headers['first']='string'; - $headers['last']='string'; - $headers['R']='string'; - $headers['Add']="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"), - $table->columns(),"right"); - $table->row_end(); - $table->end(); - $form->end(); - } - $toggle_persons->end(); + $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'))); + $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 +//////////////////////////////////////////////////////////// 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 +// (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_columns = array('hostname','node_id','arch'); -$nodes=$api->GetNodes(array('node_id'=>$slice['node_ids']),$node_columns); -$potential_nodes=$api->GetNodes(array('~node_id'=>$slice['node_ids']),$node_columns); - -$show_nodes=true; -if (isset ($_GET['show_nodes'])) $show_nodes=$_GET['show_nodes']; -$toggle=new PlekitToggle ('my-slice-nodes',"Nodes", - array('trigger-bubble'=> - 'Manage nodes attached to this slice', - 'start-visible'=>$show_nodes)); +$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(); + +//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; $i < count($slice_conf); $i++) { + if ($slice_conf[$i] == $slice_id) { + $i++; + $slice_column_configuration = $slice_conf[$i]; + $sliceconf_exists = true; + break; + } else { + $i++; + $slice_column_configuration = $slice_conf[$i]; + } + } +} + +if ($sliceconf_exists == false) { + $column_configuration = $column_configuration . ";" . $slice_id . ";default"; +} + +if ($slice_column_configuration == "") { + $full_configuration = $default_configuration; +} else { + $full_configuration = $default_configuration . "|" . $slice_column_configuration; +} + +//instantiate the column configuration class, which prepares the headers array +$ConfigureColumns = new PlekitColumns($full_configuration, $fix_columns, $tag_columns, $extra_columns); + +$visiblecolumns = $ConfigureColumns->node_tags(); + +$node_columns = array_merge($node_fixed_columns, $visiblecolumns); +$all_nodes = $api->GetNodes(null, $node_columns); + +$ConfigureColumns->fetch_live_data($all_nodes); + +$show_reservable_info = true; +$show_layout_info = '1'; +$show_conf = explode(";", $show_configuration); +foreach ($show_conf as $ss) { + if ($ss == "reservable") { + $show_reservable_info = false; + } else if ($ss == "columns") { + $show_layout_info = '0'; + } + +} + +$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('05: 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'))); $toggle->start(); -////////// nodes currently in -$count=count($nodes); -$toggle_nodes=new PlekitToggle('my-slice-nodes-current', - "$count nodes currently in $name", - array('start-visible'=>!$privileges)); +//////////////////// reservable nodes area +$leases_info = " +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. +TABLE 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, + '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) { - $table->row_start(); - $table->cell(l_node_obj($node)); - $table->cell($node['arch']); - if ($privileges) $table->cell ($form->checkbox_html('node_ids[]',$node['node_id'])); - $table->row_end(); +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']]); + 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(); + } } + // actions area if ($privileges) { - // remove nodes - $table->tfoot_start(); + // remove nodes + $table->tfoot_start(); - $table->row_start(); - $table->cell($form->submit_html ("remove-nodes-from-slice","Remove selected"), - $table->columns(),"right"); - $table->row_end(); - } + $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 ($profiling) { + plc_debug_prof('11: nodes in', count($slice_nodes)); +} + +//////////////////// nodes to add if ($privileges) { - $count=count($potential_nodes); - $toggle_nodes=new PlekitToggle('my-slice-nodes-add', - "$count more nodes available", - array('start-visible'=>false)); - $toggle_nodes->start(); - - if ( ! $potential_nodes ) { - // xxx improve style - echo "
No node to add
"; - } else { - $headers=array(); - $headers['hostname']='string'; - $headers['arch']='string'; - $headers['Add']="none"; - $options = array('notes_area'=>false, - 'search_width'=>15, - 'pagesize'=>20); - - $table=new PlekitTable('add_nodes',$headers,'1',$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(l_node_obj($node)); - $table->cell($node['arch']); - $table->cell ($form->checkbox_html('node_ids[]',$node['node_id'])); - $table->row_end(); - } - // add nodes + $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'))); + $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(); + +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: