From 14c11d0ac25942719986a871b250f3a97dd35d94 Mon Sep 17 00:00:00 2001 From: Thierry Parmentelat Date: Wed, 11 Mar 2009 23:55:30 +0000 Subject: [PATCH] slice page in progress, can renew and manage users --- planetlab/common/actions.php | 54 ++- planetlab/persons/person.php | 2 +- planetlab/persons/persons.php | 2 +- planetlab/slices/slice.php | 544 ++++++++++--------------------- plekit/niftycorner/nifty_init.js | 3 - plekit/php/table.php | 4 + plekit/table/table.js | 13 - 7 files changed, 221 insertions(+), 401 deletions(-) diff --git a/planetlab/common/actions.php b/planetlab/common/actions.php index b7b2bc8..9c519b8 100644 --- a/planetlab/common/actions.php +++ b/planetlab/common/actions.php @@ -69,6 +69,10 @@ $known_actions []= "update-site"; //////////////////////////////////////// slices $known_actions []= "renew-slice"; // expects: slice_id & expires +$known_actions []= 'remove-persons-from-slice'; +// expects: slice_id & person_ids +$known_actions []= 'add-persons-in-slice'; +// expects: slice_id & person_ids //////////////////////////////////////// tag types $known_actions []= "update-tag-type"; @@ -430,18 +434,21 @@ switch ($action) { } //////////////////////////////////////////////////////////// slices - case 'renew_slice': { + case 'renew-slice': { $slice_id = intval ($_POST['slice_id']); $expires = intval ($_POST['expires']); // 8 weeks from now // xxx - $now=date(); + $now=mktime(); + $WEEK=7*24*3600; $WEEKS=8; - $MAX_FUTURE=$WEEKS*7*24*3600; + $MAX_FUTURE=$WEEKS*$WEEK; if ( ($expires-$now) > $MAX_FUTURE) { - drupal_set_error("Cannot renew slice that far in the future, max is $WEEKS from now"); + drupal_set_error("Cannot renew slice that far in the future, max is $WEEKS weeks from now"); plc_redirect(l_slice($slice_id)); } + plc_debug('slice_id',$slice_id); + plc_debug('expires',$expires); if ($api->UpdateSlice ($slice_id, array('expires'=>$expires)) == 1) drupal_set_message("Slice renewed"); else @@ -450,6 +457,45 @@ switch ($action) { break; } + case 'remove-persons-from-slice': { + $slice_id = intval ($_POST['slice_id']); + $person_ids = $_POST['person_ids']; + + $success=true; + $counter=0; + foreach( $person_ids as $person_id ) { + if ($api->DeletePersonFromSlice(intval($person_id),$slice_id) != 1) + $success=false; + else + $counter++; + } + if ($success) + drupal_set_message ("Deleted $counter person(s)"); + else + drupal_set_error ("Could not delete all selected persons, only $counter were removed"); + plc_redirect(l_slice($slice_id)); + break; + } + + case 'add-persons-in-slice': { + $slice_id = intval ($_POST['slice_id']); + $person_ids = $_POST['person_ids']; + + $success=true; + $counter=0; + foreach( $person_ids as $person_id ) { + if ($api->AddPersonToSlice(intval($person_id),$slice_id) != 1) + $success=false; + else + $counter++; + } + if ($success) + drupal_set_message ("Added $counter person(s)"); + else + drupal_set_error ("Could not add all selected persons, only $counter were added"); + plc_redirect(l_slice($slice_id)); + break; + } //////////////////////////////////////////////////////////// tag types diff --git a/planetlab/persons/person.php b/planetlab/persons/person.php index 3154035..5521a40 100644 --- a/planetlab/persons/person.php +++ b/planetlab/persons/person.php @@ -342,7 +342,7 @@ if ($can_manage_roles) { $selectors=$form->role_selectors_excluding($api,$role_ids); $add_role_left_area=$form->select_html("role_id",$selectors,array('label'=>"Choose role")); // add a role : the button - $add_role_right_area=$form->submit_html("add-role-to-person",array('label'=>"Add role")); + $add_role_right_area=$form->submit_html("add-role-to-person","Add role"); $table->cell ($add_role_left_area . $add_role_right_area, $table->columns(),"right"); $table->row_end(); diff --git a/planetlab/persons/persons.php b/planetlab/persons/persons.php index ccc4219..86203bd 100644 --- a/planetlab/persons/persons.php +++ b/planetlab/persons/persons.php @@ -139,7 +139,7 @@ $headers = array ("Peer"=>"string", "Last"=>"string", "Email"=>"string", "Site" => "string", - "Roles"=>"string", + "R"=>"string", "S" => "int", "Status"=>"string", ); diff --git a/planetlab/slices/slice.php b/planetlab/slices/slice.php index 7366067..1259f61 100644 --- a/planetlab/slices/slice.php +++ b/planetlab/slices/slice.php @@ -20,113 +20,16 @@ require_once 'linetabs.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 -

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 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 - $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 '

area under construction '; - - // // display form - // echo "

\n"; - // echo "\n"; - -// $message = <<< 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.

-// EOF; -// echo $message; -// -// echo "

NOTE: -// Slices cannot be renewed beyond $max_renewal_length weeks of today ($max_expiration_date).

\n"; -// -// echo "\n"; -// -// echo "\n"; -// -// if( $error['url'] ) -// $url_style= " style='border: 1px solid red;'"; -// echo "URL: ". $error['url'] ."\n"; -// -// if( $error['description'] ) -// $desc_style= " style='border: 1px solid red;'"; -// echo "Description: ". $error['description'] ."\n"; -// -// echo "\n"; -// -// echo "\n\n
Name:". $slice['name'] ."
Expiration Date: $expiration_date
Renewal Length:
\n"; -// -// } -// - } - - $toggle->end(); -} - //////////////////// // Get all columns as we focus on only one entry $slices= $api->GetSlices( array($slice_id)); @@ -156,6 +59,8 @@ $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)) @@ -216,307 +121,188 @@ $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 +//$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; - -?> - - - +//////////////////////////////////////// renewal area +function renew_area ($slice,$site) { + + // Constants + $DAY = 24*60*60; + $WEEK = 7 * $DAY; + $MAX_WEEKS= 8; // weeks from today + $now=mktime(); + $current_exp=$slice['expires']; + $max_exp= $now + ($MAX_WEEKS * $WEEK); // seconds since epoch + + // make this area visible only is the expiration time is less than 10 days from now + $time_left = $current_exp - $now; + $visible = $time_left/$DAY <= 10; + + // 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(); - - - - - - - - - - // 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" ) ); - - 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'] ); - + // 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 ($pis) { - sort_persons( $pis ); } - } - // 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'] ); - } + if ( empty( $selectors ) ) { + plc_warning("Slice cannot be renewed any further into the future, try again closer to expiration date."); + } 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("Slice details for " . $name); - // start form +renew_area ($slice,$site); - if( $peer_id ) { - echo "
\n"; - } +//////////////////// 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')); +$toggle=new PlekitToggle ('persons',"Users",array('trigger-bubble'=>'Manage users attached to this slice','start-visible'=>false)); +$toggle->start(); - // basic slice menu - if( ! $peer_id ) { +////////// people currently in +$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,'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) { - $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 "
\n"; - if (in_array( 10, $_roles )) { - echo plc_event_button("slices","slice",$slice_id); - echo ""; - } - echo plc_comon_button("slice_id",$slice_id); - echo "\n"; - - echo "\n"; - echo "\n"; - - echo "
\n"; - echo "\n"; + // remove users + $table->tfoot_start(); - echo "
\n"; - } + $table->row_start(); + $table->cell($form->submit_html ("remove-persons-from-slice","Remove selected"), + $table->columns(),"right"); + $table->row_end(); + } +$table->end(); - echo "\n - \n - \n - \n"; - - if( gmmktime() > $slice['expires'] ) { - $class1= ' style="color:red;"'; - $msg1= '(slice is expired)'; - } - echo "Expiration: $expires   $msg1\n"; - echo "\n"; - echo "\n"; - $href="'/db/nodes/index.php?slice_id=" . $slice_id . "'"; - printf ("\n",$href,$href,count($node_ids)); - $href="'/db/persons/index.php?slice_id=" . $slice_id . "'"; - printf ("\n",$href,$href,count($person_ids)); - echo "
Slice Name: $name
Description: $description
URL: $url
Instantiation: "; - - echo "
Site: ". $site_info[0]['name'] ."
# NodesTotal %d nodes
# UsersTotal %d users
\n"; - - if ( (!$class1) && in_array( $slice_id, $_person['slice_ids'] ) && (! $peer_id) ) - echo "

Update Information\n"; - - echo "


\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']; - } +////////// people to add +if ($privileges) { + $headers=array(); + $headers['email']='string'; + $headers['first']='string'; + $headers['last']='string'; + $headers['R']='string'; + $headers['Add']="none"; + $table=new PlekitTable('add_persons',$headers,'1',array('caption'=>'Users to add', + 'search_area'=>false, + 'notes_area'=>false)); + // 'pagesize'=>5)); + $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(); - // Get node info for those slivers - $sliver_node_info= $api->GetNodes( $sliver_nodes, array( "node_id", "hostname" ) ); +$toggle->end(); - if( $sliver_node_info ) { - foreach( $sliver_node_info as $sliv_node ) { - $new_sliver_node_info[$sliv_node['node_id']]= $sliv_node; - } - } +//////////////////// nodes - if( $peer_id ) { - echo "
\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 ""; - echo ""; - if( $is_admin ) - echo ""; - echo ""; - echo "\n"; - - foreach( $tags as $tag ) { - // ignore sliver tags at this stage - if( empty( $tag['node_id'] ) ) { - echo(""); - if( $is_admin ) { - printf(""; - } - if( $is_admin || ($is_pi && $is_in_slice) ) { - printf ("", - $tag['slice_tag_id'],$tag['tagname']); - } else { - printf("",$tag['tagname']); - } - printf("", - $tag['value'],$tag['description']); - echo ""; - } - } +//////////////////// tags - - echo "
Slice Tags
TagValueDescription
"); - 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 "%s%s%s%s
\n"; +$peers->block_end($peer_id); - } - if( $is_admin || ($is_pi && $is_in_slice) ) - echo "Add a Slice Tag\n"; - - - - // sliver tags - if( $sliver_tag ) { - echo ""; - echo ""; - if( $is_admin ) - echo ""; - echo ""; - echo "\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(""); - if( $is_admin ) { - echo(""; - } - if( $is_admin ) { - printf("",$tag['slice_tag_id'],$tag['tagname']); - } else { - printf("",$tag['tagname']); - } - printf("", - $tag['value'],$tag['description'],$tag['node_id'],$nodename); - - echo ""; - } - } +// Print footer +include 'plc_footer.php'; - echo "
Sliver Tags
TagValueDescriptionNode
"); - $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 "%s%s%s%s%s
\n"; - - } - - echo "

\n"; - - if( $pis && !$peer_id ) { - // site contacts - echo "
Contacts
\n"; - - $pi_rows= count( $pis ); - $tech_rows= count( $techs ); - $table_row= 0; - - echo ""; - if( $pis ) { - echo "\n"; - - foreach( $pis as $pi ) { - if( $table_row != 0 ) - echo ""; - printf("\n", - $pi['person_id'],$pi['first_name'],$pi['last_name'],$pi['email'],$pi['email']); - $table_row++; - } - - } - - echo "
PI's:  
%s %s%s
\n

\n"; - - } - - - echo "

Back to slice list\n"; - } +return; + +?> diff --git a/plekit/niftycorner/nifty_init.js b/plekit/niftycorner/nifty_init.js index d027e00..49aa5d2 100644 --- a/plekit/niftycorner/nifty_init.js +++ b/plekit/niftycorner/nifty_init.js @@ -11,12 +11,9 @@ var nifty_inited = false; function nifty_init () { - window.console.log('initing - 1'); if ( nifty_inited ) return; - window.console.log('initing - 2'); var elements=document.getElementsByClassName('nifty-medium'); for (var i=0; icaption=$options['caption']; if (array_key_exists('search_area',$options)) $this->search_area=$options['search_area']; if (array_key_exists('pagesize_area',$options)) $this->pagesize_area=$options['pagesize_area']; if (array_key_exists('notes_area',$options)) $this->notes_area=$options['notes_area']; @@ -101,6 +103,8 @@ EOF; if ($this->search_area) print $this->search_area_html (); + if ($this->caption) + print " $this->caption "; print ""; foreach ($this->headers as $label => $type) { switch ($type) { diff --git a/plekit/table/table.js b/plekit/table/table.js index 5851acd..8656af9 100644 --- a/plekit/table/table.js +++ b/plekit/table/table.js @@ -136,7 +136,6 @@ function plekit_table_filter (table_id,pattern_id,and_id) { var previous_pattern=table['previous_pattern']; var previous_mode=table['previous_mode']; if ( (previous_pattern == pattern_text) && (previous_mode == and_if_true) ) { - window.console.log ('no change in pattern'); return; } @@ -145,14 +144,12 @@ function plekit_table_filter (table_id,pattern_id,and_id) { var searches=new Array(); var patterns=new Array(); for (var i=0; i < pattern_texts.length; i++) { - window.console.log ('compiled ' + i + '-th pattern = [' + pattern_texts[i] + ']'); // ignore case searches[i]=pattern_texts[i].toLowerCase(); patterns[i]=new RegExp(pattern_texts[i],"i"); } // scan rows, elaborate 'visible' - window.console.log ('we have ' + rows.length + ' rows'); for (var row_index = 0; row_index < rows.length ; row_index++) { var tr=rows[row_index]; var visible=false; @@ -199,11 +196,6 @@ function plekit_table_filter (table_id,pattern_id,and_id) { // optimize useless calls to init, by comparing # of matching entries var previous_matching=table['previous_matching']; if (matching_entries == previous_matching) { - window.console.log ('same # of matching entries - skipped redisplay'); - window.console.log ("plekit_table_filter: " + - match_attempts + " matches - " + - matching_entries + " lines - " - + "match=" + match_ms + " ms"); return; } @@ -212,11 +204,6 @@ function plekit_table_filter (table_id,pattern_id,and_id) { tablePaginater.init(table_id); var end2=(new Date).getTime(); var paginate_ms=end2-end; - window.console.log ("plekit_table_filter: " + - match_attempts + " matches - " + - matching_entries + " lines - " - + "match=" + match_ms + " ms - " - + "paginate=" + paginate_ms + " ms"); } -- 2.47.0