From 54c783dbd47b17d9003ac7e995352e6556547b5b Mon Sep 17 00:00:00 2001 From: jjhua Date: Fri, 4 Jun 2010 09:05:30 +0000 Subject: [PATCH] 1. add FSPUtils.pm; 2. improve the performace of state action git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@6351 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd --- perl-xCAT/xCAT/FSPUtils.pm | 253 +++++++++++++++++++++++++++++++++++++ perl-xCAT/xCAT/FSPpower.pm | 160 ++++++++++++++++++++++- 2 files changed, 406 insertions(+), 7 deletions(-) create mode 100644 perl-xCAT/xCAT/FSPUtils.pm diff --git a/perl-xCAT/xCAT/FSPUtils.pm b/perl-xCAT/xCAT/FSPUtils.pm new file mode 100644 index 000000000..5aba489d3 --- /dev/null +++ b/perl-xCAT/xCAT/FSPUtils.pm @@ -0,0 +1,253 @@ +#!/usr/bin/env perl +# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html +package xCAT::FSPUtils; + +BEGIN +{ + $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat'; +} + +# if AIX - make sure we include perl 5.8.2 in INC path. +# Needed to find perl dependencies shipped in deps tarball. +if ($^O =~ /^aix/i) { + use lib "/usr/opt/perl5/lib/5.8.2/aix-thread-multi"; + use lib "/usr/opt/perl5/lib/5.8.2"; + use lib "/usr/opt/perl5/lib/site_perl/5.8.2/aix-thread-multi"; + use lib "/usr/opt/perl5/lib/site_perl/5.8.2"; +} + +use lib "$::XCATROOT/lib/perl"; +require xCAT::Table; +use POSIX qw(ceil); +use File::Path; +use Socket; +use strict; +use Symbol; +use IPC::Open3; +use warnings "all"; +require xCAT::InstUtils; +require xCAT::NetworkUtils; +require xCAT::Schema; +require xCAT::Utils; +use Data::Dumper; +require xCAT::NodeRange; +require DBI; + +our @ISA = qw(Exporter); +our @EXPORT_OK = qw(genpassword runcmd3); + +my $utildata; #data to persist locally + + +#------------------------------------------------------------------------------- + +=head3 fsp_api_action + Description: + invoke the fsp_api to perform the functions + + Arguments: + $node_name: + $attrs: an attributes hash + $action: the operations on the fsp, bpa or lpar + $tooltype: 0 for HMC, 1 for HNM + Returns: + Return result of the operation + Globals: + none + Error: + none + Example: + my $res = xCAT::Utils::fsp_api_action( $node_name, $d, "add_connection", $tooltype ); + Comments: + +=cut + +#------------------------------------------------------------------------------- +sub fsp_api_action { + my $node_name = shift; + my $attrs = shift; + my $action = shift; + my $tooltype = shift; +# my $user = "HMC"; +# my $password = "abc123"; + my $fsp_api = ($::XCATROOT) ? "$::XCATROOT/sbin/fsp-api" : "/opt/xcat/sbin/fsp-api"; + my $id = 1; + my $fsp_name = (); + my $fsp_ip = (); + my $target_list=(); + my $type = (); # fsp|lpar -- 0. BPA -- 1 + my @result; + my $Rc = 0 ; + my %outhash = (); + my $res; + + if( !defined($tooltype) ) { + $tooltype = 0; + } + + $id = $$attrs[0]; + $fsp_name = $$attrs[3]; + + my %objhash = (); + $objhash{$fsp_name} = "node"; + my %myhash = xCAT::DBobjUtils->getobjdefs(\%objhash); +# my $password = $myhash{$fsp_name}{"passwd.hscroot"}; + my $password = $myhash{$fsp_name}{"passwd.HMC"}; + #print "fspname:$fsp_name password:$password\n"; + if(!$password ) { + $res = "The password.HMC of $fsp_name in ppcdirect table is empty"; + return ([$node_name, $res, -1]); + } + my $user = "HMC"; + #my $user = "hscroot"; +# my $cred = $request->{$fsp_name}{cred}; +# my $user = @$cred[0]; +# my $password = @$cred[1]; + + if($$attrs[4] =~ /^fsp$/ || $$attrs[4] =~ /^lpar$/) { + $type = 0; + } else { + $type = 1; + } + + ############################ + # Get IP address + ############################ + #$fsp_ip = xCAT::Utils::get_hdwr_ip($fsp_name); + #if($fsp_ip == 0) { + # $res = "Failed to get the $fsp_name\'s ip"; + # return ([$node_name, $res, -1]); + #} + $fsp_ip = getNodeIPaddress( $fsp_name ); + if(!defined($fsp_ip)) { + $res = "Failed to get the $fsp_name\'s ip"; + return ([$node_name, $res, -1]); + } + unless ($fsp_ip =~ /\d+\.\d+\.\d+\.\d+/) { + $res = "Not supporting IPv6 here"; #Not supporting IPv6 here IPV6TODO + return ([$node_name, $res, -1]); + } + + #print "fsp name: $fsp_name\n"; + #print "fsp ip: $fsp_ip\n"; + + my $cmd; + if( $action =~ /^code_update$/) { + $cmd = "$fsp_api -a $action -u $user -p $password -T $tooltype -t $type:$fsp_ip:$id:$node_name: -d /install/packages_fw/"; + } else { + $cmd = "$fsp_api -a $action -u $user -p $password -T $tooltype -t $type:$fsp_ip:$id:$node_name:"; + } + + #print "cmd: $cmd\n"; + $SIG{CHLD} = 'DEFAULT'; + $res = xCAT::Utils->runcmd($cmd, -1); + #$res = "good"; + $Rc = $::RUNCMD_RC; + #$Rc = -1; + ################## + # output the prompt + ################# + #$outhash{ $node_name } = $res; + $res =~ s/$node_name: //; + return( [$node_name,$res, $Rc] ); +} + +#------------------------------------------------------------------------------- + +=head3 fsp_state_action + Description: + invoke the fsp_api to perform the functions(all_lpars_state) + + Arguments: + $node_name: + $attrs: an attributes hash + $action: the operations on the fsp, bpa or lpar + $tooltype: 0 for HMC, 1 for HNM + Returns: + Return result of the operation + Globals: + none + Error: + none + Example: + my $res = xCAT::Utils::fsp_state_action( $cec_bpa, $type, $action, $tooltype ); + Comments: + +=cut + +#------------------------------------------------------------------------------- +sub fsp_state_action { + my $node_name = shift; + my $type_name = shift; + my $action = shift; + my $tooltype = shift; +# my $user = "HMC"; +# my $password = "abc123"; + my $fsp_api = ($::XCATROOT) ? "$::XCATROOT/sbin/fsp-api" : "/opt/xcat/sbin/fsp-api"; + my $id = 0; + my $fsp_name = (); + my $fsp_ip = (); + my $target_list=(); + my $type = (); # fsp|lpar -- 0. BPA -- 1 + my @result; + my $Rc = 0 ; + my %outhash = (); + my @res; + + if( !defined($tooltype) ) { + $tooltype = 0; + } + + $fsp_name = $node_name; + + #my %objhash = (); + #$objhash{$fsp_name} = "node"; + #my %myhash = xCAT::DBobjUtils->getobjdefs(\%objhash); + #my $password = $myhash{$fsp_name}{"passwd.HMC"}; + #if(!$password ) { + # $res = "The password.HMC of $fsp_name in ppcdirect table is empty"; + # return ([$node_name, $res, -1]); + #} + #my $user = "HMC"; + + if($type_name =~ /^fsp$/ || $type_name =~ /^lpar$/) { + $type = 0; + } else { + $type = 1; + } + + ############################ + # Get IP address + ############################ + #$fsp_ip = xCAT::Utils::get_hdwr_ip($fsp_name); + #if($fsp_ip == 0) { + # $res = "Failed to get the $fsp_name\'s ip"; + # return ([$node_name, $res, -1]); + #} + $fsp_ip = xCAT::Utils::getNodeIPaddress( $fsp_name ); + if(!defined($fsp_ip)) { + $res[0] = ["Failed to get the $fsp_name\'s ip"]; + return ([-1, @res]); + } + + #print "fsp name: $fsp_name\n"; + #print "fsp ip: $fsp_ip\n"; + my $cmd; + #$cmd = "$fsp_api -a $action -u $user -p $password -T $tooltype -t $type:$fsp_ip:$id:$node_name:"; + $cmd = "$fsp_api -a $action -T $tooltype -t $type:$fsp_ip:$id:$node_name:"; + $SIG{CHLD} = 'DEFAULT'; + @res = xCAT::Utils->runcmd($cmd, -1); + #$res = "good"; + $Rc = $::RUNCMD_RC; + #$Rc = -1; + ################## + # output the prompt + ################# + #$outhash{ $node_name } = $res; + $res[0] =~ s/$node_name: //; + return( [$Rc,@res] ); +} + + + +1; diff --git a/perl-xCAT/xCAT/FSPpower.pm b/perl-xCAT/xCAT/FSPpower.pm index 94433df27..89e401b22 100644 --- a/perl-xCAT/xCAT/FSPpower.pm +++ b/perl-xCAT/xCAT/FSPpower.pm @@ -9,7 +9,7 @@ use xCAT::MsgUtils; use Data::Dumper; use xCAT::DBobjUtils; use xCAT::PPCpower; - +use xCAT::FSPUtils; ########################################################################## # Parse the command line for options and operands ########################################################################## @@ -18,6 +18,56 @@ sub parse_args { } +########################################################################## +# Builds a hash of CEC/LPAR information returned from FSP +########################################################################## +sub enumerate { + + my $h = shift; + my $mtms = shift; + my %outhash = (); + my %cmds = (); + my $type = (); + my $cec_bpa = (); + ###################################### + # Check for CEC/LPAR/BPAs in list + ###################################### + while (my ($name,$d) = each(%$h) ) { + $cec_bpa = @$d[3]; + $type = @$d[4]; + $cmds{$type} = ($type=~/^lpar$/) ? "all_lpars_state" : "cec_state"; + } + foreach my $type ( keys %cmds ) { + my $action = $cmds{$type}; + my $values = xCAT::FSPUtils::fsp_state_action ($cec_bpa, $type, $action);; + my $Rc = shift(@$values); + ################################## + # Return error + ################################## + if ( $Rc != 0 ) { + return( [$Rc,@$values[0]] ); + } + ################################## + # Save LPARs by id + ################################## + foreach ( @$values ) { + my ($state,$lparid) = split /,/; + + ############################## + # No lparid for fsp/bpa + ############################## + if ( $type =~ /^(fsp|bpa)$/ ) { + $lparid = $type; + } + $outhash{ $lparid } = $state; + } + } + return( [0,\%outhash] ); +} + + + + ########################################################################## @@ -56,7 +106,7 @@ sub powercmd_boot { next; } - my $res = xCAT::Utils::fsp_api_action ($node_name, $d, "state"); + my $res = xCAT::FSPUtils::fsp_api_action ($node_name, $d, "state"); #print "In boot, state\n"; #print Dumper($res); my $Rc = @$res[2]; @@ -78,7 +128,7 @@ sub powercmd_boot { my $state = power_status($data); #print "boot:state:$state\n"; my $op = ($state =~ /^off$/) ? "on" : "reset"; - $res = xCAT::Utils::fsp_api_action ($node_name, $d, $op); + $res = xCAT::FSPUtils::fsp_api_action ($node_name, $d, $op); # @output ... $Rc = @$res[2]; @@ -151,7 +201,7 @@ sub powercmd { next; } } - my $res = xCAT::Utils::fsp_api_action($node_name, $d, $action ); + my $res = xCAT::FSPUtils::fsp_api_action($node_name, $d, $action ); # print "In boot, state\n"; # print Dumper($res); my $Rc = @$res[2]; @@ -204,6 +254,102 @@ sub state { my $prefix = shift; my $convert = shift; my @output = (); + + + #print "------in state--------\n"; + #print Dumper($request); + #print Dumper($hash); + #################################### + # Power commands are grouped by hardware control point + # In FSPpower, the hcp is the related fsp. + #################################### + + # Example of $hash. + #VAR1 = { + # '9110-51A*1075ECF' => { + # 'Server-9110-51A-SN1075ECF' => [ + # 0, + # 0, + # '9110-51A*1075ECF', + # 'fsp1_name', + # 'fsp', + # 0 + # ] + # } + # }; + + my @result = (); + + + if ( !defined( $prefix )) { + $prefix = ""; + } + while (my ($mtms,$h) = each(%$hash) ) { + ###################################### + # Build CEC/LPAR information hash + ###################################### + my $stat = enumerate( $h, $mtms ); + my $Rc = shift(@$stat); + my $data = @$stat[0]; + if($Rc != 0) { + push @result,[$mtms ,$$data[0],$Rc]; + return(\@result); + } + while (my ($name,$d) = each(%$h) ) { + ################################## + # Look up by lparid + ################################## + my $type = @$d[4]; + my $id = ($type=~/^(fsp|bpa)$/) ? $type : @$d[0]; + + ################################## + # Output error + ################################## + if ( $Rc != SUCCESS ) { + push @result, [$name, "$prefix$data",$Rc]; + next; + } + ################################## + # Node not found + ################################## + if ( !exists( $data->{$id} )) { + push @result, [$name, $prefix."Node not found",1]; + next; + } + ################################## + # Output value + ################################## + my $value = $data->{$id}; + + ############################## + # Convert state to on/off + ############################## + if ( defined( $convert )) { + $value = power_status( $value ); + } + push @result, [$name,"$prefix$value",$Rc]; + } + } + return( \@result ); + + +} + + + + + +########################################################################## +# Queries CEC/LPAR power status +########################################################################## +sub state1 { + + my $request = shift; + my $hash = shift; + my $exp = shift; # NOt use + my $prefix = shift; + my $convert = shift; + my @output = (); my $action = "state"; @@ -231,7 +377,8 @@ sub state { foreach my $cec_bpa ( keys %$hash) - { + { + my $node_hash = $hash->{$cec_bpa}; for my $node_name ( keys %$node_hash) @@ -239,13 +386,12 @@ sub state { my $d = $node_hash->{$node_name}; if($$d[4] =~ /^fsp$/ || $$d[4] =~ /^bpa$/) { $action = "cec_state"; - } + } my $stat = xCAT::Utils::fsp_api_action ($node_name, $d, $action); my $Rc = @$stat[2]; my $data = @$stat[1]; my $type = @$d[4]; #my $id = ($type=~/^(fsp|bpa)$/) ? $type : @$d[0]; - ################################## # Output error ##################################