GetSlices( array($slice_id));
if (empty($slices)) {
drupal_set_message ("Slice " . $slice_id . " not found");
return;
}
$slice=$slices[0];
// pull all node info to vars
$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'];
// 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
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 => "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
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.
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).
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);
$tabs=array();
$tabs [] = tab_nodes_slice($slice_id);
$tabs [] = tab_site($site_id);
// 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 $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
$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,
'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->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();
//////////////////// 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();
////////// 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) {
// remove users
$table->tfoot_start();
$table->row_start();
$table->cell($form->submit_html ("remove-persons-from-slice","Remove selected"),
$table->columns(),"right");
$table->row_end();
}
$table->end();
////////// 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();
$toggle->end();
//////////////////// nodes
//////////////////// tags
if ($local_peer ) {
if ( ! $renew_visible) renew_area ($slice,$site,false);
}
if ($renew_visible) renew_area ($slice,$site,true);
$peers->block_end($peer_id);
// Print footer
include 'plc_footer.php';
return;
?>