mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-10-31 19:32:31 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			223 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			223 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
| #! /usr/bin/perl
 | |
| # IBM(c) 2016 EPL license http://www.eclipse.org/legal/epl-v10.html
 | |
| 
 | |
| BEGIN { $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : -d '/opt/xcat' ? '/opt/xcat' : '/usr'; }
 | |
| 
 | |
| use lib "$::XCATROOT/probe/lib/perl";
 | |
| use probe_utils;
 | |
| use File::Basename;
 | |
| use Net::Ping;
 | |
| use Getopt::Long qw(:config no_ignore_case);
 | |
| #use Data::Dumper;
 | |
| use warnings;
 | |
| 
 | |
| my $program_name = basename("$0");
 | |
| my $help;
 | |
| my $installnic;
 | |
| my $test;
 | |
| my $output  = "stdout";
 | |
| my $verbose = 0;
 | |
| my $rst     = 0;
 | |
| 
 | |
| $::USAGE = "Usage:
 | |
|     $program_name -h
 | |
|     $program_name -t
 | |
|     $program_name {-c|-d} [-V]
 | |
| 
 | |
| Description:
 | |
|     Use this command to check if compute nodes have the same images installed as defines in xCAT DB. 
 | |
|     Use this command to check if all compute nodes have the same identical installed. 
 | |
| 
 | |
| Options:
 | |
|     -h : Get usage information of $program_name
 | |
|     -t : To verify if $program_name can work, reserve option for probe framework
 | |
|     -d : To verify compute nodes have the same images installed as defines in xCAT DB. 
 | |
|     -c : To verify compute nodes have the identical images installed.
 | |
|     -V : To print additional debug information.
 | |
| ";
 | |
| 
 | |
| #-------------------------------------
 | |
| # main process
 | |
| #-------------------------------------
 | |
| if (
 | |
|     !GetOptions("--help|h" => \$help,
 | |
|         "t" => \$test,
 | |
|         "V" => \$VERBOSE,
 | |
|         "c" => \$CONSISTENCY_CHECK,
 | |
|         "d" => \$DEFINITION_CHECK))
 | |
| {
 | |
|     probe_utils->send_msg("$output", "f", "Invalid parameter for $program_name");
 | |
|     probe_utils->send_msg("$output", "d", "$::USAGE");
 | |
|     exit 1;
 | |
| }
 | |
| 
 | |
| if ($help) {
 | |
|     if ($output ne "stdout") {
 | |
|         probe_utils->send_msg("$output", "d", "$::USAGE");
 | |
|     } else {
 | |
|         print "$::USAGE";
 | |
|     }
 | |
|     exit 0;
 | |
| }
 | |
| 
 | |
| if ($test) {
 | |
|     probe_utils->send_msg("$output", "o", "Use this command to check if all compute nodes have the same images installed or if compute nodes are installed with the same image as defined on MN.");
 | |
|     exit 0;
 | |
| }
 | |
| 
 | |
| unless (defined($CONSISTENCY_CHECK) || defined($DEFINITION_CHECK)) {
 | |
|     probe_utils->send_msg("$output", "f", "At least one of -c or -d flags is required");
 | |
|     probe_utils->send_msg("$output", "d", "$::USAGE");
 | |
|     exit 1;
 | |
| }
 | |
| 
 | |
| my @nodes = `nodels`;
 | |
| @nodes = grep(s/^[\s]+|[\s]*$//g, @nodes);
 | |
| 
 | |
| my @pingable_nodes;
 | |
| my @diskless_nodes;
 | |
| my $na = "N/A";
 | |
| 
 | |
| # First, extract diskless nodes
 | |
| foreach (@nodes) {
 | |
|     my $lsdef_provmethod = `lsdef $_ -i provmethod -c`;
 | |
|     if ($lsdef_provmethod =~ /netboot/) {
 | |
|         push(@diskless_nodes, $_);
 | |
|         probe_utils->send_msg("$output", "d", "$_ is diskless");
 | |
|     }
 | |
| }
 | |
| 
 | |
| # Next, check if all diskless nodes are pingable
 | |
| my $p = Net::Ping->new();
 | |
| foreach (@diskless_nodes) {
 | |
|     if ($p->ping($_, 2)) {
 | |
|         probe_utils->send_msg("$output", "o", "Pinging $_");
 | |
|         push(@pingable_nodes, $_);
 | |
|     }
 | |
|     else {
 | |
|         probe_utils->send_msg("$output", "f", "Pinging $_");
 | |
|     }
 | |
|     sleep(1);
 | |
| }
 | |
| $p->close();
 | |
| 
 | |
| my $defined_UUID = $na;
 | |
| my %node_running_image_uuid_hash;
 | |
| my %node_defined_image_uuid_hash;
 | |
| my %node_running_image_name_hash;
 | |
| my %node_defined_image_name_hash;
 | |
| 
 | |
| foreach (@pingable_nodes) {
 | |
|     probe_utils->send_msg("$output", "d", "---- Gathering information from node $_ ----");
 | |
| 
 | |
|     # Next, from all pingable nodes get the IMAGENAME and IMAGEUUID entries from xcatinfo file
 | |
|     my $output = `xdsh $_ "cat /opt/xcat/xcatinfo"`;
 | |
|     my $xcatinfo_image_UUID = ` echo "$output" | awk -F"=" '/IMAGEUUID/ {gsub(/'"'"'/,"",\$2); print \$2}'`;
 | |
|     my $xcatinfo_image_name = ` echo "$output" | awk -F"=" '/IMAGENAME/ {gsub(/'"'"'/,"",\$2); print \$2}'`;
 | |
|     chomp($xcatinfo_image_UUID);
 | |
|     chomp($xcatinfo_image_name);
 | |
|     if (length($xcatinfo_image_UUID) <= 0) {
 | |
|         $xcatinfo_image_UUID = $na;
 | |
|     }
 | |
|     if (length($xcatinfo_image_name) <= 0) {
 | |
|         $xcatinfo_image_name = $na;
 | |
|     }
 | |
|     $node_running_image_uuid_hash{$_} = $xcatinfo_image_UUID;
 | |
|     $node_running_image_name_hash{$_} = $xcatinfo_image_name;
 | |
|     print "Node $_ is running image $node_running_image_name_hash{$_} with UUID $node_running_image_uuid_hash{$_} \n" if ($VERBOSE);
 | |
| 
 | |
|     # Next, get UUID from rootimg directory xcatinfo file of the provmethod osimage
 | |
|     my $lsdef_provmethod = `lsdef $_ -i provmethod -c | cut -d "=" -f 2`;
 | |
|     chomp($lsdef_provmethod);
 | |
|     my $rootimagedir = $na;
 | |
|     if (length($lsdef_provmethod) > 0) {
 | |
|         $rootimagedir = `lsdef -t osimage $lsdef_provmethod -i rootimgdir -c | cut -d "=" -f 2`;
 | |
|         chomp($rootimagedir);
 | |
|         if (length($rootimagedir) > 0) {
 | |
|             $defined_UUID = `awk -F"'" '/IMAGEUUID/ {print \$2}' $rootimagedir/rootimg/opt/xcat/xcatinfo`;
 | |
|             chomp($defined_UUID);
 | |
|             if (length($defined_UUID) < 1) {
 | |
|                 $defined_UUID = $na;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
|     else {
 | |
|         $lsdef_provmethod = $na;
 | |
|     }
 | |
|     $node_defined_image_uuid_hash{$_} = $defined_UUID;
 | |
|     $node_defined_image_name_hash{$_} = $lsdef_provmethod;
 | |
|     print "Node $_ has defined image $lsdef_provmethod at $rootimagedir with UUID $defined_UUID\n" if ($VERBOSE);
 | |
| }
 | |
| 
 | |
| # Information gathering is done. Now do veification checking.
 | |
| 
 | |
| # Probe verification step 1 - make sure all nodes are installed with the osimage name and imageUUID as defined on MN
 | |
| if ($DEFINITION_CHECK) {
 | |
|     foreach (@pingable_nodes) {
 | |
|         my $msg;
 | |
|         my $status;
 | |
|         if (($node_running_image_name_hash{$_} eq $node_defined_image_name_hash{$_}) &&
 | |
|             ($node_running_image_uuid_hash{$_} eq $node_defined_image_uuid_hash{$_})) {
 | |
|             if ($node_running_image_uuid_hash{$_} eq $na) {
 | |
|                 $msg = "$_: Not able to determine installed os image name or uuid";
 | |
|                 $status = "f";
 | |
|             }
 | |
|             else {
 | |
|                 $msg    = "OS image installed on compute node $_ matches the image defined for it on management node";
 | |
|                 $status = "o";
 | |
|             }
 | |
|         }
 | |
|         else {
 | |
|             $msg = "$_: Unmatched os image name or image UUID.\n         Defined: name = $node_defined_image_name_hash{$_}" .
 | |
| " uuid = $node_defined_image_uuid_hash{$_}\n         Installed: name = $node_running_image_name_hash{$_}" .
 | |
|               " uuid = $node_running_image_uuid_hash{$_}";
 | |
|             $status = "f";
 | |
|         }
 | |
|         probe_utils->send_msg("$output", "$status", "$msg");
 | |
|     }
 | |
| }
 | |
| 
 | |
| # Probe verification step 2 - make sure all nodes are installed with the same osimage name and imageUUID
 | |
| if ($CONSISTENCY_CHECK) {
 | |
|     my $msg    = "Undefined";
 | |
|     my $status = "f";
 | |
|     my $image_name_and_uuid;
 | |
|     my $image_uuid;
 | |
|     my %unique_image_hash;
 | |
| 
 | |
|     # Go throug the nodes and build a hash of key=image_name+image_uuid and value of nodename
 | |
|     foreach (@pingable_nodes) {
 | |
|         $image_name_and_uuid = $node_running_image_name_hash{$_} . ":" . $node_running_image_uuid_hash{$_};
 | |
|         unless (exists $unique_image_hash{$image_name_and_uuid}) {
 | |
|             $unique_image_hash{$image_name_and_uuid} = $_;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     # print Dumper(\%unique_image_hash);
 | |
|     # If there is more then one key in the hash, nodes have multiple images.
 | |
|     my $number_of_keys = keys %unique_image_hash;
 | |
|     if ($number_of_keys == 1) {
 | |
|         my @image_names = keys %unique_image_hash;
 | |
|         if ($image_names[0] =~ /$na/) {
 | |
|             $msg = "Not able to determine os image name or uuid of the image installed on any compute node.";
 | |
|             $status = "f";
 | |
|         }
 | |
|         else {
 | |
|             $msg = "All compute nodes have the same os image installed: @image_names.";
 | |
|             $status = "o";
 | |
|         }
 | |
|     }
 | |
|     else {
 | |
|         my $node_image_table;
 | |
|         foreach $compute_node (keys %node_running_image_name_hash) {
 | |
|             $node_image_table .= sprintf("%-15s %-30s : %-20s\n", $compute_node, $node_running_image_name_hash{$compute_node}, $node_running_image_uuid_hash{$compute_node});
 | |
|         }
 | |
|         $msg = "Not all compute nodes are installed with the same os image.\n" . $node_image_table;
 | |
|         $status = "f";
 | |
|     }
 | |
| 
 | |
|     probe_utils->send_msg("$output", "$status", "$msg");
 | |
| }
 | |
| 
 | |
| exit 0;
 |