2f915e99f282624098092ecbf18fdb1b6553c1f4
[plewww.git] / planetlab / tags / tag.php
1 <?php
2
3 // Require login
4 require_once 'plc_login.php';
5
6 // Get session and API handles
7 require_once 'plc_session.php';
8 global $plc, $api;
9
10 // Print header
11 require_once 'plc_drupal.php';
12 include 'plc_header.php';
13
14 // Common functions
15 require_once 'plc_functions.php';
16 require_once 'linetabs.php';
17 require_once 'details.php';
18 require_once 'table.php';
19 require_once 'form.php';
20 require_once 'toggle.php';
21
22 // -------------------- 
23 // recognized URL arguments
24 $tag_type_id=intval($_GET['id']);
25 if ( ! $tag_type_id ) { 
26   plc_error('Malformed URL - id not set'); 
27   return;
28  }
29
30 // --- decoration
31 $title="Tag Type";
32 $tabs=array();
33 $tabs []= tab_tags();
34
35 // -------------------- 
36 $tag_types= $api->GetTagTypes( array( $tag_type_id ) );
37 $tag_type=$tag_types[0];
38   
39 $tagname=$tag_type['tagname'];
40 $role_ids= $tag_type['role_ids'];
41 $roles= $tag_type['roles'];
42 $description= $tag_type['description'];
43 $category=$tag_type['category'];
44
45 // where is it used 
46 $filter=array('tag_type_id'=>$tag_type_id);
47 $node_tags=$api->GetNodeTags($filter);
48 $interface_tags=$api->GetInterfaceTags($filter);
49 $person_tags=$api->GetPersonTags($filter);
50 $site_tags=$api->GetSiteTags($filter);
51 // split slice tags into 3 families, whether this applies to the whole slice, or a nodegroup, or a node
52 // using filters for this purpose does not work out very well, maybe a bug in the filter stuff
53 // anyway this is more efficient, and we compute the related node(groups) in the same pass
54 $slice_tags=$api->GetSliceTags(array_merge($filter));
55 $count_slice=0;
56 $count_nodegroup=0;
57 $nodegroup_ids=array();
58 $count_node=0;
59 $node_ids=array();
60 foreach ($slice_tags as $slice_tag) {
61   if ($slice_tag['node_id']) {
62     $node_ids []= $slice_tag['node_id'];
63     $count_node += 1;
64   } else if ($slice_tag['nodegroup_id']) {
65     $nodegroup_ids []= $slice_tag['nodegroup_id'];
66     $count_nodegroup += 1;
67   } else {
68     $count_slice += 1;
69   }
70 }
71
72 $nodes=$api->GetNodes($node_ids,array('hostname','node_id'));
73 $node_hash=array();
74 foreach ($nodes as $node) $node_hash[$node['node_id']]=$node;
75 $nodegroups=$api->GetNodeGroups($nodegroup_ids,array('groupname','nodegroup_id'));
76 $nodegroup_hash=array();
77 foreach ($nodegroups as $nodegroup) $nodegroup_hash[$nodegroup['nodegroup_id']]=$nodegroup;
78
79
80 drupal_set_title("Details for tag type $tagname");
81 plekit_linetabs($tabs);
82
83 //////////////////// details
84 $toggle = new PlekitToggle ('details','Details');
85 $toggle->start();
86 $can_update=plc_is_admin();
87 $details=new PlekitDetails ($can_update);
88
89 $details->form_start(l_actions(),array("action"=>"update-tag-type",
90                                        "tag_type_id"=>$tag_type_id));
91 $details->start();
92 $details->th_td("Name",$tagname,"tagname");
93 $details->th_td("Category",$category,"category",array('width'=>30));
94 $details->th_td("Description",$description,"description",array('width'=>40));
95
96 if ($can_update) 
97   $details->tr_submit('update-tag-type',"Update tag type");
98
99 $details->space();
100 $details->th_td("Used in nodes",count($node_tags));
101 $details->th_td("Used in interfaces",count($interface_tags));
102 $details->th_td("Used in slices/node",$count_node);
103 $details->th_td("Used in slices/nodegroup",$count_nodegroup);
104 $details->th_td("Used in slices",$count_slice);
105
106 $details->end();
107 $details->form_end();
108 $toggle->end();
109
110 //////////////////// roles
111 $form=new PlekitForm(l_actions(), array("tag_type_id"=>$tag_type_id));
112 $form->start();
113
114 $toggle=new PlekitToggle ('roles',count_english($roles,"role"),array('visible'=>get_arg('show_roles',false)));
115 $toggle->start();
116
117 if (! $roles) plc_warning ("This tag type has no role !");
118
119 $can_manage_roles= plc_is_admin();
120
121 $headers=array("Role"=>"string");
122 if ($can_manage_roles) $headers [plc_delete_icon()]="none";
123
124 $table_options=array('search_area'=>false,'pagesize_area'=>false,'notes_area'=>false);
125 $table=new PlekitTable("tag_roles",$headers,0,$table_options);  
126 $table->start();
127   
128 // construct array of role objs
129 $role_objs=array();
130 for ($n=0; $n<count($roles); $n++) {
131   $role_objs[]= array('role_id'=>$role_ids[$n], 'name'=>$roles[$n]);
132 }
133
134 if ($role_objs) foreach ($role_objs as $role_obj) {
135     $table->row_start();
136     $table->cell($role_obj['name']);
137     if ($can_manage_roles) $table->cell ($form->checkbox_html('role_ids[]',$role_obj['role_id']));
138     $table->row_end();
139   }
140
141 // footers : the remove and add buttons
142 if ($can_manage_roles) {
143   
144   // remove
145   $table->tfoot_start();
146   if ($roles) {
147     $table->row_start();
148     $table->cell($form->submit_html("remove-roles-from-tag-type","Remove Roles"),
149                  array('hfill'=>true,'align'=>'right'));
150     $table->row_end();
151   }
152
153   // add
154   // compute the roles that can be added
155   if ($can_manage_roles) 
156     // all roles
157     $exclude_role_ids=array();
158   else
159     // all roles except admin and pi
160     $exclude_role_ids=array(10,20);
161   $possible_roles = roles_except($api->GetRoles(),$exclude_role_ids);
162   $roles_to_add = roles_except ($possible_roles,$role_ids);
163   if ( $roles_to_add ) {
164     $selectors=$form->role_selectors($roles_to_add);
165     $table->row_start();
166     $add_role_left_area=$form->select_html("role_id",$selectors,array('label'=>"Choose role"));
167     // add a role : the button
168     $add_role_right_area=$form->submit_html("add-role-to-tag-type","Add role");
169     $table->cell ($add_role_left_area . $add_role_right_area,
170                   array('hfill'=>true,'align'=>'right'));
171     $table->row_end();
172   }
173 }
174 $table->end();
175 $toggle->end();
176 $form->end();
177
178 //////////////////// the 5 flavours of objects that the tag may be attached to
179
180 // common options for tables below
181 $table_options=array('notes_area'=>false, 'pagesize_area'=>false, 'search_width'=>10);
182
183 // xxx could outline values corresponding to a nodegroup
184 if (count ($node_tags)) {
185   $toggle=new PlekitToggle('tag_nodes',"Nodes");
186   $toggle->start();
187   $table=new PlekitTable ("tag_nodes",array("Hostname"=>"string","value"=>"string"),0,$table_options);
188   $table->start();
189   foreach ($node_tags as $node_tag) {
190     $table->row_start();
191     $table->cell(href(l_node($node_tag['node_id']),$node_tag['hostname']));
192     $table->cell($node_tag['value']);
193     $table->row_end();
194   }
195   $table->end();
196   $toggle->end();
197  }
198
199 if (count ($interface_tags)) {
200   $toggle=new PlekitToggle('tag_interfaces',"Interfaces");
201   $toggle->start();
202   $table=new PlekitTable ("tag_interfaces",array("IP"=>"IPAddress","value"=>"string"),0,$table_options);
203   $table->start();
204   foreach ($interface_tags as $interface_tag) {
205     $table->row_start();
206     $table->cell(href(l_interface($interface_tag['interface_id']),$interface_tag['ip']));
207     $table->cell($interface_tag['value']);
208     $table->row_end();
209   }
210   $table->end();
211   $toggle->end();
212  }
213
214 if (count ($site_tags)) {
215   $toggle=new PlekitToggle('tag_sites',"Sites");
216   $toggle->start();
217   $table=new PlekitTable("tag_sites",array("L"=>"login_base","value"=>"string"),0,$table_options);
218   $table->start();
219   foreach ($site_tags as $site_tag) {
220     $table->row_start();
221     $table->cell(href(l_site($site_tag['site_id']),$site_tag['login_base']));
222     $table->cell($site_tag['value']);
223     $table->row_end();
224   }
225   $table->end();
226   $toggle->end();
227 }
228
229 if (count ($person_tags)) {
230   $toggle=new PlekitToggle('tag_persons',"Persons");
231   $toggle->start();
232   $table=new PlekitTable("tag_persons",array("E"=>"email","value"=>"string"),0,$table_options);
233   $table->start();
234   foreach ($person_tags as $person_tag) {
235     $table->row_start();
236     $table->cell(href(l_person($person_tag['person_id']),$person_tag['email']));
237     $table->cell($person_tag['value']);
238     $table->row_end();
239   }
240   $table->end();
241   $toggle->end();
242 }
243
244 if (count ($slice_tags)) {
245   $toggle=new PlekitToggle('tag_slices',"Slice tags");
246   $toggle->start();
247   $headers=array();
248   $headers["slice"]='string';
249   $headers["value"]='string';
250   $headers["node"]='string';
251   $headers["nodegroup"]='string';
252   $table=new PlekitTable ("tag_slices",$headers,0,$table_options);
253   $table->start();
254   foreach ($slice_tags as $slice_tag) {
255     $table->row_start();
256     $table->cell(href(l_slice($slice_tag['slice_id']),$slice_tag['name']));
257     $table->cell($slice_tag['value']);
258
259     $node_text="all";
260     if ($slice_tag['node_id']) {
261       $node_id=$slice_tag['node_id'];
262       $node=$node_hash[$node_id];
263       $node_text=l_node_obj($node);
264     }
265     $table->cell($node_text);
266
267     $nodegroup_text="all";
268     if ($slice_tag['nodegroup_id']) {
269       $nodegroup_id=$slice_tag['nodegroup_id'];
270       $nodegroup=$nodegroup_hash[$nodegroup_id];
271       $nodegroup_text=l_nodegroup_obj($nodegroup);
272     }
273     $table->cell($nodegroup_text);
274
275     $table->row_end();
276   }
277   $table->end();
278   $toggle->end();
279  }
280
281 //plekit_linetabs ($tabs,"bottom");
282
283 // Print footer
284 include 'plc_footer.php';
285
286 ?>