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(@_);
|
||
|
}
|
||
|
|
||
|
|