git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@14149 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
		
			
				
	
	
		
			200 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			200 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| #!/usr/bin/env perl
 | |
| ## IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
 | |
| 
 | |
| package xCAT::KitPluginUtils;
 | |
| 
 | |
| BEGIN
 | |
| {
 | |
|     $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat';
 | |
| }
 | |
| 
 | |
| use lib "$::XCATROOT/lib/perl";
 | |
| 
 | |
| use strict;
 | |
| use warnings;
 | |
| 
 | |
| require xCAT::Table;
 | |
| 
 | |
| 
 | |
| #-------------------------------------------------------
 | |
| 
 | |
| =head3  get_kits_used_by_nodes
 | |
| 
 | |
|     Get the kits used by a list of nodes. A node uses a kit
 | |
|     if one or more of the kit's components are installed
 | |
|     on the node.
 | |
| 
 | |
|     Arguments: list of node names (ref)
 | |
| 
 | |
|     Returns: Return hash table which indexes the node names
 | |
|     by kitname (ref)
 | |
|     e.g., 
 | |
|          { "kitname1" => ["node11","node12",...],
 | |
|            "kitname2" => ["node21","node22",...]
 | |
|            ...
 | |
|          }
 | |
| 
 | |
|     Examples: 
 | |
|         my @nodes = ("node11", "node12",...);
 | |
|         my $result = xCAT::KitPluginUtils->get_kits_used_by_nodes(\@nodes);
 | |
| 
 | |
| =cut
 | |
| 
 | |
| #-------------------------------------------------------
 | |
| 
 | |
| sub get_kits_used_by_nodes {
 | |
| 
 | |
|     my $class = shift;
 | |
|     my $nodes = shift;
 | |
| 
 | |
|     # Group the nodes by what osimage they use
 | |
|     my $tablename = "nodetype";
 | |
|     my $table = xCAT::Table->new($tablename);
 | |
|     my $ent = $table->getNodesAttribs($nodes, ["provmethod"]);
 | |
|     
 | |
|     my $osimage_to_nodes = {};
 | |
|     foreach my $node (keys(%$ent)) {
 | |
|         my $provmethod = $ent->{$node}->[0]->{"provmethod"};
 | |
|         if (defined($provmethod)) {
 | |
|             push(@{ $osimage_to_nodes->{$provmethod} }, $node);
 | |
|        }
 | |
|     }
 | |
| 
 | |
|     # Group the osimages by what kits they use
 | |
|     my @osimages = keys(%$osimage_to_nodes);
 | |
|     my $kits_to_osimages = xCAT::KitPluginUtils->get_kits_used_by_osimages(\@osimages);
 | |
| 
 | |
| 
 | |
|     # Group nodes by kit
 | |
|     my $kits_to_nodes = {};
 | |
|     foreach my $kit (keys(%$kits_to_osimages)) {
 | |
|         my $tmphash = {};
 | |
|         my $osimages = $kits_to_osimages->{$kit};
 | |
|         foreach my $osimage (@$osimages) {
 | |
|             # Store nodes as hash keys to eliminate duplicates
 | |
|             my @nodes = @{ $osimage_to_nodes->{$osimage} };
 | |
|             @$tmphash{@nodes} = ();
 | |
|         }
 | |
|         my @nodes = keys(%$tmphash);
 | |
|         $kits_to_nodes->{$kit} = \@nodes;
 | |
|     }
 | |
| 
 | |
|     return $kits_to_nodes;
 | |
| }
 | |
| 
 | |
| 
 | |
| #-------------------------------------------------------
 | |
| 
 | |
| =head3  get_kits_used_by_osimages
 | |
| 
 | |
|     Get the kits used by a list of osimages. An osimage
 | |
|     uses a kit if one or more of the kit's components 
 | |
|     are associated with the osimage.
 | |
| 
 | |
|     Arguments: list of osimage names (ref)
 | |
| 
 | |
|     Returns: Return hash table which indexes the osimage
 | |
|     names by kitname (ref)
 | |
|     e.g., 
 | |
|          { "kitname1" => ["osimage11","osimage12",...],
 | |
|            "kitname2" => ["osimage21","osimage22",...]
 | |
|            ...
 | |
|          }
 | |
| 
 | |
|     Examples: 
 | |
|       my @osimages = ("osimage11","osimage12", ...);
 | |
|       my $result = xCAT::KitPluginUtils->get_kits_used_by_osimages(\@osimages);
 | |
| 
 | |
| =cut
 | |
| 
 | |
| #-------------------------------------------------------
 | |
| 
 | |
| sub get_kits_used_by_osimages {
 | |
| 
 | |
|     my $class = shift;
 | |
|     my $osimages = shift;
 | |
| 
 | |
|     # Get the kit components used by each osimage
 | |
|     my $tablename = "osimage";
 | |
|     my $table = xCAT::Table->new($tablename);
 | |
| 
 | |
|     my $osimages_str = join ",", map {'\''.$_.'\''} @$osimages;
 | |
|     my $filter_stmt = sprintf("imagename in (%s)", $osimages_str);
 | |
|     my @table_rows = $table->getAllAttribsWhere($filter_stmt, ("imagename", "kitcomponents"));
 | |
| 
 | |
|     my $kitcomps_to_osimages = {};
 | |
|     foreach my $row (@table_rows) {
 | |
|         if (defined($row->{kitcomponents})) {
 | |
|             my @kitcomps = split(/,/, $row->{kitcomponents});
 | |
|             foreach my $kitcomp (@kitcomps) {
 | |
|                 push(@{ $kitcomps_to_osimages->{$kitcomp} }, $row->{imagename});
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     # Get the kit for each kit component
 | |
|     $tablename = "kitcomponent";
 | |
|     $table = xCAT::Table->new($tablename);
 | |
| 
 | |
|     my $kitcomps_str = join ",", map {'\''.$_.'\''} keys(%$kitcomps_to_osimages);
 | |
|     $filter_stmt = sprintf("kitcompname in (%s)", $kitcomps_str);
 | |
|     @table_rows = $table->getAllAttribsWhere($filter_stmt, ("kitcompname", "kitname"));
 | |
| 
 | |
|     my $kits_to_kitcomps = {};
 | |
|     foreach my $row (@table_rows) {
 | |
|         my $kitname = $row->{kitname};
 | |
|         my $kitcompname = $row->{kitcompname};
 | |
|         push(@{ $kits_to_kitcomps->{$kitname} }, $kitcompname);
 | |
|     }
 | |
| 
 | |
|     # Match up kits to osimages
 | |
| 
 | |
|     my $kits_to_osimages = {};
 | |
|     foreach my $kit (keys(%$kits_to_kitcomps)) {
 | |
|         my $tmphash = {};
 | |
|         my $kitcomps = $kits_to_kitcomps->{$kit};
 | |
|         foreach my $kitcomp (@$kitcomps) {
 | |
|             # Store osimages as hash keys to eliminate duplicates
 | |
|             my @osimages = @{ $kitcomps_to_osimages->{$kitcomp} };
 | |
|             @$tmphash{@osimages} = ();
 | |
|         }
 | |
|         my @osimages = keys(%$tmphash);
 | |
|         $kits_to_osimages->{$kit} = \@osimages;
 | |
|     }
 | |
| 
 | |
|     return $kits_to_osimages;
 | |
| }
 | |
| 
 | |
| 
 | |
| #-------------------------------------------------------
 | |
| 
 | |
| =head3  get_kits_used_by_image_profiles
 | |
| 
 | |
|     Get the kits used by a list of image profiles.
 | |
| 
 | |
|     Arguments: list of image profile names (ref)
 | |
| 
 | |
|     Returns: Return hash table which indexes the image 
 | |
|     profile names by kitname (ref)
 | |
|     e.g., 
 | |
|          { "kitname1" => ["imgprofile11","imgprofile12",...],
 | |
|            "kitname2" => ["imgprofile21","imgprofile22",...]
 | |
|            ...
 | |
|          }
 | |
| 
 | |
|     Examples: 
 | |
|       my @imgprofiles = ("imgprofile11","imgprofile12",...);
 | |
|       my $result = xCAT::KitPluginUtils->get_kits_used_by_image_profiles(\@imgprofiles);
 | |
| 
 | |
| =cut
 | |
| 
 | |
| #-------------------------------------------------------
 | |
| 
 | |
| sub get_kits_used_by_image_profiles {
 | |
| 
 | |
|     my $class = shift;
 | |
|     return xCAT::KitPluginUtils->get_kits_used_by_osimages(@_);
 | |
| }
 | |
| 
 | |
| 
 |