diff --git a/perl-xCAT/xCAT/KitPluginUtils.pm b/perl-xCAT/xCAT/KitPluginUtils.pm new file mode 100644 index 000000000..5a612d69e --- /dev/null +++ b/perl-xCAT/xCAT/KitPluginUtils.pm @@ -0,0 +1,199 @@ +#!/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(@_); +} + +