X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=planetlab%2Ftags%2Ftag.php;h=d4458cfb2f92bd23bbf3fc7210b31de3de4564de;hb=1ce86fd37ce8da9b475847a59394c0241a8dbbff;hp=7d20f19a745f1de723696cee943b2e0cbd691c33;hpb=120af9ebe853831222610e8914fab6ac1341edaf;p=plewww.git diff --git a/planetlab/tags/tag.php b/planetlab/tags/tag.php index 7d20f19..d4458cf 100644 --- a/planetlab/tags/tag.php +++ b/planetlab/tags/tag.php @@ -1,7 +1,5 @@ l_tags(),'bubble'=>"All Tag Types"); +$tabs []= tab_tags(); // -------------------- $tag_types= $api->GetTagTypes( array( $tag_type_id ) ); $tag_type=$tag_types[0]; $tagname=$tag_type['tagname']; -$min_role_id= $tag_type['min_role_id']; +$role_ids= $tag_type['role_ids']; +$roles= $tag_type['roles']; $description= $tag_type['description']; $category=$tag_type['category']; @@ -46,51 +46,145 @@ $category=$tag_type['category']; $filter=array('tag_type_id'=>$tag_type_id); $node_tags=$api->GetNodeTags($filter); $interface_tags=$api->GetInterfaceTags($filter); -$slice_tags=$api->GetSliceTags(array_merge($filter,array("node_id"=>array()))); -$sliver_tags=$api->GetSliceTags(array_merge($filter,array("~node_id"=>array()))); +$person_tags=$api->GetPersonTags($filter); +$site_tags=$api->GetSiteTags($filter); +// split slice tags into 3 families, whether this applies to the whole slice, or a nodegroup, or a node +// using filters for this purpose does not work out very well, maybe a bug in the filter stuff +// anyway this is more efficient, and we compute the related node(groups) in the same pass +$slice_tags=$api->GetSliceTags(array_merge($filter)); +$count_slice=0; +$count_nodegroup=0; +$nodegroup_ids=array(); +$count_node=0; +$node_ids=array(); +foreach ($slice_tags as $slice_tag) { + if ($slice_tag['node_id']) { + $node_ids []= $slice_tag['node_id']; + $count_node += 1; + } else if ($slice_tag['nodegroup_id']) { + $nodegroup_ids []= $slice_tag['nodegroup_id']; + $count_nodegroup += 1; + } else { + $count_slice += 1; + } +} + +$nodes=$api->GetNodes($node_ids,array('hostname','node_id')); +$node_hash=array(); +foreach ($nodes as $node) $node_hash[$node['node_id']]=$node; +$nodegroups=$api->GetNodeGroups($nodegroup_ids,array('groupname','nodegroup_id')); +$nodegroup_hash=array(); +foreach ($nodegroups as $nodegroup) $nodegroup_hash[$nodegroup['nodegroup_id']]=$nodegroup; + drupal_set_title("Details for tag type $tagname"); -plc_tabs($tabs); +plekit_linetabs($tabs); -// ---------- +//////////////////// details +$toggle = new PlekitToggle ('details','Details'); +$toggle->start(); $can_update=plc_is_admin(); -$details=new PlcDetails ($can_update); +$details=new PlekitDetails ($can_update); $details->form_start(l_actions(),array("action"=>"update-tag-type", "tag_type_id"=>$tag_type_id)); $details->start(); $details->th_td("Name",$tagname,"tagname"); -$details->th_td("Category",$category,"category"); -$details->th_td("Description",$description,"description"); - -if ($can_update) { -// select the option corresponding with min_role_id - $selectors = $details->form()->role_selectors($api,"",$min_role_id); - $select_field = $details->form()->select_html("min_role_id",$selectors); - // xxx would need to turn role_id into role name - $details->th_td("Min role",$select_field,"min_role_id",array('input_type'=>'select','value'=>$min_role_id)); - } else { - $details->th_td("Min role",$min_role_id); - } +$details->th_td("Category",$category,"category",array('width'=>30)); +$details->th_td("Description",$description,"description",array('width'=>40)); + if ($can_update) $details->tr_submit('update-tag-type',"Update tag type"); $details->space(); $details->th_td("Used in nodes",count($node_tags)); $details->th_td("Used in interfaces",count($interface_tags)); -$details->th_td("Used in slices",count($slice_tags)); -$details->th_td("Used in slivers",count($sliver_tags)); +$details->th_td("Used in slices/node",$count_node); +$details->th_td("Used in slices/nodegroup",$count_nodegroup); +$details->th_td("Used in slices",$count_slice); $details->end(); $details->form_end(); +$toggle->end(); + +//////////////////// roles +$form=new PlekitForm(l_actions(), array("tag_type_id"=>$tag_type_id)); +$form->start(); + +$toggle=new PlekitToggle ('roles',count_english($roles,"role"),array('visible'=>get_arg('show_roles'))); +$toggle->start(); + +if (! $roles) plc_warning ("This tag type has no role !"); + +$can_manage_roles= plc_is_admin(); + +$headers=array("Role"=>"string"); +if ($can_manage_roles) $headers [plc_delete_icon()]="none"; + +$table_options=array('search_area'=>false,'pagesize_area'=>false,'notes_area'=>false); +$table=new PlekitTable("tag_roles",$headers,0,$table_options); +$table->start(); + +// construct array of role objs +$role_objs=array(); +for ($n=0; $n$role_ids[$n], 'name'=>$roles[$n]); +} + +if ($role_objs) foreach ($role_objs as $role_obj) { + $table->row_start(); + $table->cell($role_obj['name']); + if ($can_manage_roles) $table->cell ($form->checkbox_html('role_ids[]',$role_obj['role_id'])); + $table->row_end(); + } + +// footers : the remove and add buttons +if ($can_manage_roles) { + + // remove + $table->tfoot_start(); + if ($roles) { + $table->row_start(); + $table->cell($form->submit_html("remove-roles-from-tag-type","Remove Roles"), + array('hfill'=>true,'align'=>'right')); + $table->row_end(); + } + + // add + // compute the roles that can be added + if ($can_manage_roles) + // all roles + $exclude_role_ids=array(); + else + // all roles except admin and pi + $exclude_role_ids=array(10,20); + $possible_roles = roles_except($api->GetRoles(),$exclude_role_ids); + $roles_to_add = roles_except ($possible_roles,$role_ids); + if ( $roles_to_add ) { + $selectors=$form->role_selectors($roles_to_add); + $table->row_start(); + $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-tag-type","Add role"); + $table->cell ($add_role_left_area . $add_role_right_area, + array('hfill'=>true,'align'=>'right')); + $table->row_end(); + } +} +$table->end(); +$toggle->end(); +$form->end(); + +//////////////////// the 5 flavours of objects that the tag may be attached to // common options for tables below $table_options=array('notes_area'=>false, 'pagesize_area'=>false, 'search_width'=>10); // xxx could outline values corresponding to a nodegroup if (count ($node_tags)) { - plc_section("Nodes"); - $table=new PlcTable ("tag_nodes",array("Hostname"=>"string","value"=>"string"),0,$table_options); + $toggle=new PlekitToggle('tag_nodes',"Nodes"); + $toggle->start(); + $table=new PlekitTable ("tag_nodes",array("Hostname"=>"string","value"=>"string"),0,$table_options); $table->start(); foreach ($node_tags as $node_tag) { $table->row_start(); @@ -99,11 +193,13 @@ if (count ($node_tags)) { $table->row_end(); } $table->end(); + $toggle->end(); } if (count ($interface_tags)) { - plc_section("Interfaces"); - $table=new PlcTable ("tag_interfaces",array("IP"=>"IPAddress","value"=>"string"),0,$table_options); + $toggle=new PlekitToggle('tag_interfaces',"Interfaces"); + $toggle->start(); + $table=new PlekitTable ("tag_interfaces",array("IP"=>"IPAddress","value"=>"string"),0,$table_options); $table->start(); foreach ($interface_tags as $interface_tag) { $table->row_start(); @@ -112,29 +208,78 @@ if (count ($interface_tags)) { $table->row_end(); } $table->end(); + $toggle->end(); } -// grouping both kinds of slice tags -// xxx don't show hostnames yet -$slice_tags = array_merge ($slice_tags,$sliver_tags); +if (count ($site_tags)) { + $toggle=new PlekitToggle('tag_sites',"Sites"); + $toggle->start(); + $table=new PlekitTable("tag_sites",array("L"=>"login_base","value"=>"string"),0,$table_options); + $table->start(); + foreach ($site_tags as $site_tag) { + $table->row_start(); + $table->cell(href(l_site($site_tag['site_id']),$site_tag['login_base'])); + $table->cell($site_tag['value']); + $table->row_end(); + } + $table->end(); + $toggle->end(); +} + +if (count ($person_tags)) { + $toggle=new PlekitToggle('tag_persons',"Persons"); + $toggle->start(); + $table=new PlekitTable("tag_persons",array("E"=>"email","value"=>"string"),0,$table_options); + $table->start(); + foreach ($person_tags as $person_tag) { + $table->row_start(); + $table->cell(href(l_person($person_tag['person_id']),$person_tag['email'])); + $table->cell($person_tag['value']); + $table->row_end(); + } + $table->end(); + $toggle->end(); +} + if (count ($slice_tags)) { - plc_section("Slice and sliver tags"); - $table=new PlcTable ("tag_slices",array("Slice"=>"string","value"=>"string","Node id"=>"int"),0,$table_options); + $toggle=new PlekitToggle('tag_slices',"Slice tags"); + $toggle->start(); + $headers=array(); + $headers["slice"]='string'; + $headers["value"]='string'; + $headers["node"]='string'; + $headers["nodegroup"]='string'; + $table=new PlekitTable ("tag_slices",$headers,0,$table_options); $table->start(); foreach ($slice_tags as $slice_tag) { $table->row_start(); $table->cell(href(l_slice($slice_tag['slice_id']),$slice_tag['name'])); $table->cell($slice_tag['value']); + $node_text="all"; - // sliver tag - if ($slice_tag['node_id']) - $node_text=l_node($slice_tag['node_id'],$slice_tag['node_id']); + if ($slice_tag['node_id']) { + $node_id=$slice_tag['node_id']; + $node=$node_hash[$node_id]; + $node_text=l_node_obj($node); + } $table->cell($node_text); + + $nodegroup_text="all"; + if ($slice_tag['nodegroup_id']) { + $nodegroup_id=$slice_tag['nodegroup_id']; + $nodegroup=$nodegroup_hash[$nodegroup_id]; + $nodegroup_text=l_nodegroup_obj($nodegroup); + } + $table->cell($nodegroup_text); + $table->row_end(); } $table->end(); + $toggle->end(); } +//plekit_linetabs ($tabs,"bottom"); + // Print footer include 'plc_footer.php';