fix: when created slice doesn't have any nodes and/or users associated
[plewww.git] / planetlab / slices / slice.php
index 24b12da..c58fdc2 100644 (file)
@@ -102,9 +102,9 @@ function renew_area ($slice,$site,$visible) {
   // description and url must be non void
   $toggle=
     new PlekitToggle('renew',"Renew this slice",
-                    array("trigger-bubble"=>
+                    array("bubble"=>
                           "Enter this zone if you wish to renew your slice",
-                          'start-visible'=>$visible));
+                          'visible'=>$visible));
   $toggle->start();
 
   // xxx message could take roles into account
@@ -129,7 +129,7 @@ EOF;
     $selectors = array();
     foreach ( array ( 1 => "One more week", 
                      2 => "Two more weeks", 
-                     3 => "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) {
@@ -174,11 +174,16 @@ EOF;
 }
 
 ////////// 
-drupal_set_title("My slice " . $name);
 
 $am_in_slice = in_array(plc_my_person_id(),$person_ids);
 
-$privileges = ( $local_peer && (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);
@@ -190,7 +195,7 @@ if ($privileges) {
                          '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),
@@ -215,13 +220,18 @@ if ($local_peer ) {
 
 
 //////////////////// details
-$show_details=false;
-if (isset ($_GET['show_details'])) $show_details=$_GET['show_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('trigger-bubble'=>
+                   array('bubble'=>
                          'Display and modify details for that slice',
-                         'start-visible'=>$show_details));
+                         'visible'=>get_arg('show_details',$default_show_details)));
 $toggle->start();
 
 $details=new PlekitDetails($privileges);
@@ -256,16 +266,21 @@ $toggle->end();
 $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),
-                  array('email','person_id','first_name','last_name','roles'));
-$show_persons=false;
-if (isset ($_GET['show_persons'])) $show_persons=$_GET['show_persons'];
+if (empty($persons))
+    $potential_persons=$api->GetPersons(
+        array(),
+        array('email','person_id','first_name','last_name','roles'));
+else
+    $potential_persons=
+        $api->GetPersons(array('~person_id'=>$slice['person_ids'],'peer_id'=>NULL),
+                         array('email','person_id','first_name','last_name','roles'));
+$count=count($persons);
+
 $toggle=
-  new PlekitToggle ('my-slice-persons',"Users",
-                   array('trigger-bubble'=>
+  new PlekitToggle ('my-slice-persons',"$count Users",
+                   array('bubble'=>
                          'Manage accounts attached to this slice',
-                         'start-visible'=>$show_persons));
+                         'visible'=>get_arg('show_persons',false)));
 $toggle->start();
 
 ////////// people currently in
@@ -274,8 +289,8 @@ $toggle->start();
 // so user can chose which section is of interest
 // show otherwise
 $toggle_persons = new PlekitToggle ('my-slice-persons-current',
-                                   "People currently in $name",
-                                   array('start-visible'=>!$privileges));
+                                   "$count people currently in $name",
+                                   array('visible'=>get_arg('show_persons_current',!$privileges)));
 $toggle_persons->start();
 
 $headers=array();
@@ -306,7 +321,7 @@ if ($privileges) {
 
   $table->row_start();
   $table->cell($form->submit_html ("remove-persons-from-slice","Remove selected"),
-              $table->columns(),"right");
+              array('hfill'=>true,'align'=>'right'));
   $table->row_end();
  }
 $table->end();
@@ -314,9 +329,10 @@ $toggle_persons->end();
 
 ////////// people to add
 if ($privileges) {
+  $count=count($potential_persons);
   $toggle_persons = new PlekitToggle ('my-slice-persons-add',
-                                     "People to add to $name",
-                                     array('start-visible'=>false));
+                                     "$count people may be added to $name",
+                                     array('visible'=>get_arg('show_persons_add',false)));
   $toggle_persons->start();
   if ( ! $potential_persons ) {
     // xxx improve style
@@ -327,7 +343,7 @@ if ($privileges) {
     $headers['first']='string';
     $headers['last']='string';
     $headers['R']='string';
-    $headers['Add']="none";
+    $headers['+']="none";
     $options = array('notes_area'=>false,
                     'search_width'=>15,
                     'pagesize'=>8);
@@ -351,7 +367,7 @@ if ($privileges) {
     $table->tfoot_start();
     $table->row_start();
     $table->cell($form->submit_html ("add-persons-in-slice","Add selected"),
-                $table->columns(),"right");
+                array('hfill'=>true,'align'=>'right'));
     $table->row_end();
     $table->end();
     $form->end();
@@ -364,33 +380,43 @@ $toggle->end();
 // 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'=>
+if (empty($nodes))
+    $potential_nodes=$api->GetNodes(array(),
+                                    $node_columns);
+else
+    $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',
-                               'start-visible'=>$show_nodes));
+                               'visible'=>get_arg('show_nodes',false)));
 $toggle->start();
 
 ////////// nodes currently in
+$count=count($nodes);
 $toggle_nodes=new PlekitToggle('my-slice-nodes-current',
-                              "Nodes currently in $name",
-                              array('start-visible'=>!$privileges));
+                              "$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=new PlekitTable('nodes',$headers,'0',
-                      array('notes_area'=>false));
+
+$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']));
@@ -404,7 +430,7 @@ if ($privileges) {
 
   $table->row_start();
   $table->cell($form->submit_html ("remove-nodes-from-slice","Remove selected"),
-              $table->columns(),"right");
+              array('hfill'=>true,'align'=>'right'));
   $table->row_end();
  }
 $table->end();
@@ -412,9 +438,10 @@ $toggle_nodes->end();
 
 ////////// nodes to add
 if ($privileges) {
+  $count=count($potential_nodes);
   $toggle_nodes=new PlekitToggle('my-slice-nodes-add',
-                                "Nodes to add to $name",
-                                array('start-visible'=>false));
+                                "$count more nodes available",
+                                array('visible'=>get_arg('show_persons_add',false)));
   $toggle_nodes->start();
 
   if ( ! $potential_nodes ) {
@@ -422,20 +449,19 @@ if ($privileges) {
     echo "<p class='not-relevant'>No node to add</p>";
   } else {
     $headers=array();
+    $headers['peer']='string';
     $headers['hostname']='string';
     $headers['arch']='string';
-    $headers['Add']="none";
-    $options = array('notes_area'=>false,
-                    'search_width'=>15,
-                    'pagesize'=>20);
+    $headers['+']="none";
     
-    $table=new PlekitTable('add_nodes',$headers,'1',$options);
+    $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']));
@@ -445,7 +471,7 @@ if ($privileges) {
     $table->tfoot_start();
     $table->row_start();
     $table->cell($form->submit_html ("add-nodes-in-slice","Add selected"),
-                $table->columns(),"right");
+                array('hfill'=>true,'align'=>'right'));
     $table->row_end();
     $table->end();
     $form->end();
@@ -454,8 +480,98 @@ if ($privileges) {
 }
 $toggle->end();
 
-//////////////////// tags
+//////////////////////////////////////////////////////////// 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'];
+        }
+      }
+      $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();
+    }
+  }
+  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();
+    
+    $table->row_start();
+    function tag_selector ($tag) {
+      return array("display"=>$tag['tagname'],"value"=>$tag['tag_type_id']);
+    }
+    $all_tags= $api->GetTagTypes( array ("category"=>"slice*"), array("tagname","tag_type_id"));
+    $selector_tag=array_map("tag_selector",$all_tags);
+    
+    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);
+    
+    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();
+  }
+    
+  $form->end();
+  $table->end();
+  $toggle->end();
+}
+
 
+//////////////////////// renew slice
 if ($local_peer ) {
   if ( ! $renew_visible) renew_area ($slice,$site,false);
  }