<?php
-// $Id: index.php 12104 2009-02-19 18:41:19Z thierry $
+// $Id$
// Require login
require_once 'plc_login.php';
require_once 'table.php';
require_once 'details.php';
require_once 'toggle.php';
+require_once 'form.php';
+
+// -------------------- 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("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
+<p class='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 => "Two 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='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;
////////////////////////////////////////
$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
$toggle = new PlekitToggle ('slice',"Details",
array('trigger-bubble'=>'Display and modify details for that slice'));
$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) {
$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->tr_submit("submit","Update Slice");
$details->end();
$details->form_end();
$toggle->end();
-renew_area ($slice,$site);
-
-$peers->block_end($peer_id);
-
//////////////////// users
+$persons=$api->GetPersons(array('person_id'=>$slice['person_ids']));
+// just propose to add evryone else, regular users can see only a fraction of the db anyway
+$potential_persons=$api->GetPersons(array('~person_id'=>$slice['person_ids'],'peer_id'=>NULL),
+ array('email','person_id','first_name','last_name','roles'));
+$show_users=false;
+if ( $_GET['show_users']) $show_users=true;
+$toggle=new PlekitToggle ('persons',"Users",array('trigger-bubble'=>'Manage users attached to this slice','start-visible'=>$show_users));
+$toggle->start();
-//////////////////// nodes
-
-//////////////////// tags
-
-// Print footer
-include 'plc_footer.php';
-
-return;
-
-?>
-
-
-
-
-
-
-
-
-
-
-
-
-
+////////// people currently in
+$headers=array();
+$headers['email']='string';
+$headers['first']='string';
+$headers['last']='string';
+$headers['R']='string';
+if ($privileges) $headers[plc_delete_icon()]="none";
+// xxx caption currently broken, messes pagination
+$table=new PlekitTable('persons',$headers,'1',array(//'caption'=>'Current users',
+ 'search_area'=>false,
+ 'notes_area'=>false,
+ 'pagesize_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) {
- // 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" ) );
+ // remove users
+ $table->tfoot_start();
- 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'] );
-
- }
- if ($pis) {
- sort_persons( $pis );
- }
- }
+ $table->row_start();
+ $table->cell($form->submit_html ("remove-persons-from-slice","Remove selected"),
+ $table->columns(),"right");
+ $table->row_end();
+ }
+$table->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'] );
+////////// people to add
+if ($privileges) {
+ $headers=array();
+ $headers['email']='string';
+ $headers['first']='string';
+ $headers['last']='string';
+ $headers['R']='string';
+ $headers['Add']="none";
+ // xxx caption currently broken, messes pagination
+ $options = array(//'caption'=>'Users to add',
+ '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,'1',$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();
- }
-
- drupal_set_title("Slice details for " . $name);
- // start form
-
- if( $peer_id ) {
- echo "<div class='plc-foreign'>\n";
- }
-
- // basic slice menu
- if( ! $peer_id ) {
-
- $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";
- }
-
- echo "</select><br />\n";
- echo "</form>\n";
+$toggle->end();
- echo "</td></tr></table>\n";
- }
+//////////////////// nodes
- 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;
- }
- else {
- $sliver_tag[]= $tag;
- $sliver_nodes[]= $tag['node_id'];
- }
- }
- }
+//////////////////// tags
- // Get node info for those slivers
- $sliver_node_info= $api->GetNodes( $sliver_nodes, array( "node_id", "hostname" ) );
+if ($local_peer ) {
+ if ( ! $renew_visible) renew_area ($slice,$site,false);
+ }
- if( $sliver_node_info ) {
- foreach( $sliver_node_info as $sliv_node ) {
- $new_sliver_node_info[$sliv_node['node_id']]= $sliv_node;
- }
- }
+if ($renew_visible) renew_area ($slice,$site,true);
- 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>";
- }
- }
+$peers->block_end($peer_id);
-
- echo "</tbody></table>\n";
+// Print footer
+include 'plc_footer.php';
- }
- 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>";
- }
- }
+return;
- echo "</tbody></table>\n";
-
- }
-
- 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++;
- }
-
- }
-
- echo "</table>\n<br /><hr />\n";
-
- }
-
-
- echo "<p><a href='index.php'>Back to slice list</a></div>\n";
- }
+?>