require_once 'table.php';
require_once 'details.php';
require_once 'toggle.php';
+require_once 'form.php';
+
+// keep css separate for now
+drupal_set_html_head('
+<link href="/planetlab/css/my_slice.css" rel="stylesheet" type="text/css" />
+');
+
+// -------------------- admins potentially need to get full list of users
+ini_set('memory_limit','32M');
// --------------------
// recognized URL arguments
$slice_id=intval($_GET['id']);
if ( ! $slice_id ) { plc_error('Malformed URL - id not set'); return; }
-function renew_area ($slice,$site) {
-
- // Constants
- $week= 7 * 24 * 60 * 60; // seconds
- $max_renewal_length= 8; // weeks from today
- $max_expiration= mktime() + ($max_renewal_length * $week); // seconds since epoch
- $max_expiration_date= gmstrftime("%A %b-%d-%y %T %Z", $max_expiration);
-
- // the renew area
- // 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'=>true));
- $toggle->start();
-
- // xxx message could take roles into account
- if ($site['max_slices']<=0) {
- $message= <<< EOF
-<p>Slice creation and renewal have been temporarily disabled for your
-site. This may have occurred because your site's nodes have been down
-or unreachable for several weeks, and multiple attempts to contact
-your site's PI(s) and Technical Contact(s) have all failed. If so,
-contact your site's PI(s) and Technical Contact(s) and ask them to
-bring up your site's nodes. Please visit your <a
-href='/db/sites/index.php?id=$site_id'>site details</a> page to find
-out more about your site's nodes, and how to contact your site's PI(s)
-and Technical Contact(s).</p>
-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
- $renewal_lengths = array();
- foreach ( array ( 1 => "One more week",
- 2 => "Two more weeks",
- 4 => "One more month" ) as $weeks => $text ) {
- if (($slice [ 'expires' ] + ($weeks * $week)) < $max_expiration) {
- $renewal_lengths [ $weeks ] = "$text (" .
- gmstrftime( "%A %b-%d-%y %T %Z", $slice [ 'expires' ] + ( $weeks * $week ) )
- . ")";
- }
- }
-
- if ( empty( $renewal_lengths ) ) {
- plc_warning("Slice cannot be renewed any further into the future, try again closer to expiration date.");
- } else {
- // clean vars
- $expiration_date = gmstrftime( "%A %b-%d-%y %T %Z", $slice [ 'expires' ] );
- echo '<p> area under construction </a>';
-
- // // display form
- // echo "<form action='/db/slices/renew_slice.php' method='post'>\n";
- // echo "<input type=hidden name='id' value='$slice_id'><input type=hidden name='expires' value='". $slice['expires'] ."'>\n";
-
-// $message = <<< EOF
-// <p>You must provide a short description as well as a link to a project website before renewing it.
-// Do <span class='bold'>not</span> 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.</p>
-// EOF;
-// echo $message;
-//
-// echo "<p><span class='bold'>NOTE:</span>
-// Slices cannot be renewed beyond $max_renewal_length weeks of today ($max_expiration_date).</p>\n";
-//
-// echo "<table cellpadding=2><tbody>\n";
-//
-// echo "<tr><th>Name:</th><td colspan=2>". $slice['name'] ."</td></tr>\n";
-//
-// if( $error['url'] )
-// $url_style= " style='border: 1px solid red;'";
-// echo "<tr><th$url_style>URL: </th><td$url_style><input size=50 name='url' value='". $slice['url'] ."' /></td><td$url_style><font color=red>". $error['url'] ."</font></td></tr>\n";
-//
-// if( $error['description'] )
-// $desc_style= " style='border: 1px solid red;'";
-// echo "<tr><th$desc_style>Description: </th><td$desc_style><textarea name='description' rows=5 cols=40>". $slice['description'] ."</textarea></td><td$desc_style><font color=red>". $error['description'] ."</font></td></tr>\n";
-//
-// echo "<tr><th>Expiration Date: </th><td colspan=2>$expiration_date</td></tr>\n";
-//
-// echo "<tr><th>Renewal Length: </th><td colspan=2><select name='expire_len'>";
-//
-// // create drop down of lengths to choose
-// foreach ($renewal_lengths as $weeks => $text) {
-// echo "<option value='$weeks'";
-// if( $weeks == $expire_len )
-// echo " selected";
-// echo ">$text</option>\n";
- }
-//
-// echo "</select></td></tr>\n<tr><td colspan=3 align=center><input type=submit value='Renew Slice' name='submitted'></td></tr>\n</tbody></table>\n";
-//
-// }
-//
- }
-
- $toggle->end();
-}
-
////////////////////
// Get all columns as we focus on only one entry
$slices= $api->GetSlices( array($slice_id));
// get peers
$peer_id= $slice['peer_id'];
$peers=new Peers ($api);
+$local_peer = ! $peer_id;
// 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'));
+
+//////////////////////////////////////// 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'];
+ $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("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
+<p class='my-slice-renewal'>Slice creation and renewal have been temporarily disabled for your
+<site. This may have occurred because your site's nodes have been down
+or unreachable for several weeks, and multiple attempts to contact
+your site's PI(s) and Technical Contact(s) have all failed. If so,
+contact your site's PI(s) and Technical Contact(s) and ask them to
+bring up your site's nodes. Please visit your <a
+href='/db/sites/index.php?id=$site_id'>site details</a> page to find
+out more about your site's nodes, and how to contact your site's PI(s)
+and Technical Contact(s).</p>
+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
+<div class='plc-warning renewal'>
+Slice cannot be renewed any further into the future, try again closer to expiration date.
+</div>
+EOF;
+ } else {
+ print <<< EOF
+<div class='my-slice-renewal'>
+<p>You must provide a short description as well as a link to a project website before renewing it.
+Do <span class='bold'>not</span> 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.</p>
+<p><span class='bold'>NOTE:</span>
+Slices cannot be renewed beyond another $max_renewal_weeks week(s) ($max_renewal_date).
+</p>
+</div>
+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();
+}
+
//////////
-drupal_set_title("Details for slice " . $name);
-$local_peer= ! $peer_id;
$am_in_slice = in_array(plc_my_person_id(),$person_ids);
-$privileges = (plc_is_admin() || $am_in_slice);
+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));
$tabs=array();
$tabs [] = tab_nodes_slice($slice_id);
'method'=>'post',
'values'=>array('action'=>'delete-slice','slice_id'=>$slice_id),
'bubble'=>"Delete slice $name",
- 'confirm'=>'Are you sure to delete $name');
+ 'confirm'=>"Are you sure to delete slice $name");
$tabs["Events"]=array_merge(tablook_event(),
array('url'=>l_event("Slice","slice",$slice_id),
////////////////////////////////////////
$peers->block_start($peer_id);
-$toggle = new PlekitToggle ('slice',"Details",
- array('trigger-bubble'=>'Display and modify details for that slice'));
+//////////////////////////////////////// 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));
+$details->form_start(l_actions(),array('action'=>'update-slice',
+ 'slice_id'=>$slice_id,
+ 'name'=>$name));
$details->start();
if (! $local_peer) {
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('Site',l_site_obj($site));
+// xxx show the PIs here
+//$details->th_td('PIs',...);
$details->end();
$details->form_end();
$toggle->end();
-renew_area ($slice,$site);
-
-$peers->block_end($peer_id);
-
-//////////////////// users
-
-//////////////////// nodes
-
-//////////////////// tags
-
-// Print footer
-include 'plc_footer.php';
-
-return;
-
-?>
-
-
-
-
-
-
-
-
-
-
-
+//////////////////// persons
+$person_columns = array('email','person_id','first_name','last_name','roles');
+$persons=$api->GetPersons(array('person_id'=>$slice['person_ids']));
+// just propose to add everyone else,
+// 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),
+ $person_columns);
+$count=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();
- // gets all persons from site_id
- // person info
- if( !empty( $person_ids ) )
- $persons= $api->GetPersons( $site_info[0]['person_ids'] , array( "person_id", "role_ids", "first_name", "last_name", "email" ) );
+ $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();
- if( $persons ) {
- // gets site contacts pis stores in dict
- foreach( $persons as $person )
- if( in_array( "20", $person['role_ids'] ) ) {
- $pis[]= array( "email" => $person['email'], "first_name" => $person['first_name'], "last_name" => $person['last_name'], "person_id" => $person['person_id'] );
-
+////////// 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 "<p class='not-relevant'>No person to add</p>";
+ } 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();
}
- if ($pis) {
- sort_persons( $pis );
- }
+ // 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();
- // slice tag info
- if( !empty( $slice_tag_ids ) )
- $slice_attibs= $api->GetSliceTags( $slice_tag_ids,
- array( "slice_tag_id", "tag_type_id", "value", "description", "min_role_id", "node_id" ) );
-
- // gets tag type info and combines it to form all tag info array
- if( $slice_attibs ) {
- foreach( $slice_attibs as $slice_attib ) {
- $tag_type= $api->GetTagTypes( array( $slice_attib['tag_type_id'] ),
- array( "tag_type_id", "tagname", "description" ) );
-
- $tags[]= array( "slice_tag_id" => $slice_attib['slice_tag_id'],
- "tag_type_id" => $slice_attib['tag_type_id'],
- "tagname" => $tag_type[0]['tagname'],
- "value" => $slice_attib['value'],
- "description" => $slice_attib['description'],
- "min_role_id" => $slice_attib['min_role_id'],
- "node_id" => $slice_attib['node_id'] );
- }
-
- }
+//////////////////// nodes
+// 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);
+$count=count($nodes);
+
+$toggle=new PlekitToggle ('my-slice-nodes',"$count Nodes",
+ array('bubble'=>
+ 'Manage nodes attached to this slice',
+ 'visible'=>get_arg('show_nodes',false)));
+$toggle->start();
- drupal_set_title("Slice details for " . $name);
- // start form
+////////// nodes currently in
+$count=count($nodes);
+$toggle_nodes=new PlekitToggle('my-slice-nodes-current',
+ "$count nodes currently in $name",
+ array('visible'=>get_arg('show_nodes_current',!$privileges)));
+$toggle_nodes->start();
+
+$headers=array();
+$headers['peer']='string';
+$headers['hostname']='string';
+$headers['arch']='string';
+if ($privileges) $headers[plc_delete_icon()]="none";
+
+$table_options = array('notes_area'=>false,
+ 'search_width'=>15,
+ 'pagesize'=>20);
+$table=new PlekitTable('nodes',$headers,'0',$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();
+ $peers->cell($table,$node['peer_id']);
+ $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();
+}
+// actions area
+if ($privileges) {
- if( $peer_id ) {
- echo "<div class='plc-foreign'>\n";
- }
+ // remove nodes
+ $table->tfoot_start();
- // basic slice menu
- if( ! $peer_id ) {
+ $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();
- $actions= array( ''=>'Choose Action' );
-
- if( in_array( 10, $_roles )
- || ( in_array( 20, $_roles ) && in_array( $site_id, $_person['site_ids'] ) )
- || in_array( $slice_id, $_person['slice_ids'] ) ) {
- $actions['renew']= "Renew $name";
- $actions['nodes']= "Manage Nodes";
- }
- if ( in_array( 10, $_roles )
- || ( in_array( 20, $_roles ) && in_array( $site_id, $_person['site_ids'] ) ) ) {
- $actions['users']= "Manage Users";
- $actions['delete']= "Delete $name";
- }
-
- echo "<table><tr><td>\n";
- if (in_array( 10, $_roles )) {
- echo plc_event_button("slices","slice",$slice_id);
- echo "</td><td>";
- }
- echo plc_comon_button("slice_id",$slice_id);
- echo "</td><td>\n";
-
- echo "<form action='/db/slices/slice_action.php' method='post'>\n";
- echo "<input type=hidden name=slice_id value=$slice_id>\n";
-
- echo "<select name='actions' onChange=\"submit();\">\n";
- foreach( $actions as $key => $val ) {
- echo "<option value='$key'";
-
- if( $key == $_POST['actions'] )
- echo " selected";
-
- echo ">$val\n";
- }
+////////// nodes to add
+if ($privileges) {
+ $count=count($potential_nodes);
+ $toggle_nodes=new PlekitToggle('my-slice-nodes-add',
+ "$count more nodes available",
+ array('visible'=>get_arg('show_persons_add',false)));
+ $toggle_nodes->start();
+
+ if ( ! $potential_nodes ) {
+ // xxx improve style
+ echo "<p class='not-relevant'>No node to add</p>";
+ } else {
+ $headers=array();
+ $headers['peer']='string';
+ $headers['hostname']='string';
+ $headers['arch']='string';
+ $headers['+']="none";
- echo "</select><br />\n";
- echo "</form>\n";
-
- echo "</td></tr></table>\n";
+ $table=new PlekitTable('add_nodes',$headers,'1', $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(l_node_obj($node));
+ $table->cell($node['arch']);
+ $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();
- echo "<table cellpadding=3><tbody>\n
- <tr><th>Slice Name: </th><td> $name </td></tr>\n
- <tr><th>Description: </th><td> $description </td></tr>\n
- <tr><th>URL: </th><td> <a href='$url'>$url</a> </td></tr>\n";
-
- if( gmmktime() > $slice['expires'] ) {
- $class1= ' style="color:red;"';
- $msg1= '(slice is expired)';
- }
- echo "<tr><th$class1>Expiration: </th><td$class1> $expires $msg1</td></tr>\n";
- echo "<tr><th>Instantiation: </th><td><select name='instantiation' onChange=\"submit();\"\n";
- echo "<option value='delegated'";
- if( $instantiation == 'delegated' ) echo " selected";
- echo ">delegated</option>";
- echo "<option value='plc-instantiated'";
- if( $instantiation == 'plc-instantiated' ) echo " selected";
- echo ">plc-instantiated</option>";
- echo "<option value='not-instantiated'";
- if( $instantiation == 'not-instantiated' ) echo " selected";
- echo ">not-instantiated</option>";
- echo "</select>";
-
- echo "</td></tr>\n";
- echo "<tr><th>Site: </th><td> <a href='/db/sites/index.php?id=$site_id'>". $site_info[0]['name'] ."</a></td></tr>\n";
- $href="'/db/nodes/index.php?slice_id=" . $slice_id . "'";
- printf ("<tr><th> <a href=%s># Nodes</a></th><td><a href=%s>Total %d nodes</a></td>\n",$href,$href,count($node_ids));
- $href="'/db/persons/index.php?slice_id=" . $slice_id . "'";
- printf ("<tr><th> <a href=%s># Users</a></th><td><a href=%s>Total %d users</a></td>\n",$href,$href,count($person_ids));
- echo "</tbody></table>\n";
-
- if ( (!$class1) && in_array( $slice_id, $_person['slice_ids'] ) && (! $peer_id) )
- echo "<p><a href='update_slice.php?id=$slice_id'>Update Information</a>\n";
-
- echo "<br /><hr />\n";
-
-
- // slice tags
- if( $tags ) {
-
- // builds 2 arrays, one for tags, one for slivers
- foreach( $tags as $tag ) {
- if( empty( $tag['node_id'] ) ) {
- $slice_tag[]= $tag;
+//////////////////////////////////////////////////////////// Tags
+if ( $local_peer ) {
+ $tags=$api->GetSliceTags (array('slice_id'=>$slice_id));
+ 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 ($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']) {
+ $nodes = $api->GetNodes(array('node_id'=>$tag['node_id']));
+ if($nodes) {
+ $node = $nodes[0];
+ $node_name = $node['hostname'];
+ }
}
- else {
- $sliver_tag[]= $tag;
- $sliver_nodes[]= $tag['node_id'];
+ $nodegroup_name="n/a";
+ if ($tag['nodegroup_id']) {
+ $nodegroup=$api->GetNodeGroups(array('nodegroup_id'=>$tag['nodegroup_id']));
+ if ($nodegroup) {
+ $nodegroup = $nodegroup[0];
+ $nodegroup_name = $nodegroup['groupname'];
+ }
}
+ $table->row_start();
+ $table->cell(l_tag_obj($tag));
+ $table->cell($tag['value']);
+ $table->cell($node_name);
+ $table->cell($nodegroup_name);
+ if ($privileges) $table->cell ($form->checkbox_html('slice_tag_ids[]',$tag['slice_tag_id']));
+ $table->row_end();
}
}
-
- // Get node info for those slivers
- $sliver_node_info= $api->GetNodes( $sliver_nodes, array( "node_id", "hostname" ) );
-
- if( $sliver_node_info ) {
- foreach( $sliver_node_info as $sliv_node ) {
- $new_sliver_node_info[$sliv_node['node_id']]= $sliv_node;
- }
- }
-
- if( $peer_id ) {
- echo "<br /></div>\n";
- }
-
- // slice tags
- $is_admin=in_array( 10, $_roles );
- $is_in_slice=in_array( $slice_id, $_person['slice_ids'] );
- $is_pi=in_array( 20, $_roles );
- if( $slice_tag ) {
- echo "<table cellpadding=3><caption class='list_set'>Slice Tags</caption>";
- echo "<thead><tr>";
- if( $is_admin )
- echo "<th></th>";
- echo "<th>Tag</th><th>Value</th><th>Description</th>";
- echo "</tr></thead><tbody>\n";
-
- foreach( $tags as $tag ) {
- // ignore sliver tags at this stage
- if( empty( $tag['node_id'] ) ) {
- echo("<tr>");
- if( $is_admin ) {
- printf("<td>");
- sprintf($label,"\\n [ %s = %s] \\n from %s",$tag['tagname'],$tag['value'],$name);
- // xxx this is deprecated
- echo plc_delete_link_button ('tag_action.php?rem_id=' . $tag['slice_tag_id'],
- $label);
- echo "</td>";
- }
- if( $is_admin || ($is_pi && $is_in_slice) ) {
- printf ("<td><a href='tags.php?type=slice?id=%s'>%s</a></td>",
- $tag['slice_tag_id'],$tag['tagname']);
- } else {
- printf("<td>%s</td>",$tag['tagname']);
- }
- printf("<td align=center>%s</td><td>%s</td>",
- $tag['value'],$tag['description']);
- echo "</tr>";
- }
- }
-
+ if ($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();
- echo "</tbody></table>\n";
-
- }
- if( $is_admin || ($is_pi && $is_in_slice) )
- echo "<a href='tags.php?type=slice&add=$slice_id'>Add a Slice Tag</a>\n";
-
-
-
- // sliver tags
- if( $sliver_tag ) {
- echo "<table cellpadding=3><caption class='list_set'>Sliver Tags</caption>";
- echo "<thead><tr>";
- if( $is_admin )
- echo "<th></th>";
- echo "<th>Tag</th><th>Value</th><th>Description</th><th>Node</th>";
- echo "</tr></thead><tbody>\n";
-
- foreach( $tags as $tag ) {
- $nodename=$new_sliver_node_info[$tag['node_id']]['hostname'];
- // consider only sliver tags at this stage
- if( !empty( $tag['node_id'] ) ) {
- echo("<tr>");
- if( $is_admin ) {
- echo("<td>");
- $label=sprintf("\\n [ %s = %s ] \\n from %s \\n on node %s",
- $tag['tagname'],$tag['value'],$name,$nodename);
- echo plc_delete_link_label('/db/nodes/sliver_action.php?rem_id=' . $tag['slice_tag_id'],
- $label);
- echo "</td>";
- }
- if( $is_admin ) {
- printf("<td><a href='tags.php?type=slice&id=%s'>%s</a></td>",$tag['slice_tag_id'],$tag['tagname']);
- } else {
- printf("<td>%s</td>",$tag['tagname']);
- }
- printf("<td align=center>%s</td><td>%s</td><td><a href='/db/nodes/index.php?id=%s'>%s</a></td>",
- $tag['value'],$tag['description'],$tag['node_id'],$nodename);
-
- echo "</tr>";
- }
+ $table->row_start();
+ function tag_selector ($tag) {
+ return array("display"=>$tag['tagname'],"value"=>$tag['tag_type_id']);
}
-
- echo "</tbody></table>\n";
+ $all_tags= $api->GetTagTypes( array ("category"=>"slice*"), array("tagname","tag_type_id"));
+ $selector_tag=array_map("tag_selector",$all_tags);
- }
-
- echo "<br /><hr />\n";
-
- if( $pis && !$peer_id ) {
- // site contacts
- echo "<h5>Contacts</h5>\n";
-
- $pi_rows= count( $pis );
- $tech_rows= count( $techs );
- $table_row= 0;
-
- echo "<table cellpadding=2><tbody>";
- if( $pis ) {
- echo "<tr><td rowspan=$pi_rows><strong>PI's:</strong> </td>\n";
-
- foreach( $pis as $pi ) {
- if( $table_row != 0 )
- echo "<tr>";
- printf("<td><a href='/db/persons/index.php?id=%s'>%s %s</td><td><a href='mailto:%s'>%s</a></td></tr>\n",
- $pi['person_id'],$pi['first_name'],$pi['last_name'],$pi['email'],$pi['email']);
- $table_row++;
- }
-
+ 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);
- echo "</table>\n<br /><hr />\n";
+ function nodegroup_selector($ng) {
+ return array("display"=>$ng["groupname"],"value"=>$ng['nodegroup_id']);
+ }
+ $all_nodegroups = $api->GetNodeGroups( array("groupname"=>"*"), array("groupname","nodegroup_id"));
+ $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();
}
-
-
- echo "<p><a href='index.php'>Back to slice list</a></div>\n";
+
+ $form->end();
+ $table->end();
+ $toggle->end();
+}
+
+
+//////////////////////// renew slice
+if ($local_peer ) {
+ if ( ! $renew_visible) renew_area ($slice,$site,false);
}
+$peers->block_end($peer_id);
+
+// Print footer
+include 'plc_footer.php';
+
+?>