Code drop of renergy command. This command uses the PPC.pm process to handle the common code

git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@4175 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
daniceexi 2009-09-21 06:33:27 +00:00
parent a276ba5df7
commit 00ce996d74
6 changed files with 503 additions and 13 deletions

250
perl-xCAT/xCAT/PPCenergy.pm Normal file
View File

@ -0,0 +1,250 @@
# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
package xCAT::PPCenergy;
use strict;
use Getopt::Long;
use xCAT::Usage;
use xCAT::NodeRange;
%::QUERY_ATTRS = (
'savingstatus' => 1,
'cappingstatus' => 1,
'cappingmaxmin' => 1,
'cappingvalue' => 1,
'cappingsoftmin' => 1,
'averageAC' => 1,
'averageDC' => 1,
'ambienttemp' => 1,
'exhausttemp' => 1,
'CPUspeed' => 1);
%::SET_ATTRS = (
'savingstatus' => 1,
'cappingstatus' => 1,
'cappingwatt' => 1,
'cappingperc' => 1,
);
$::CIM_CLIENT_PATH = "$::XCATROOT/sbin/xCAT_cim_client";
# Parse the arguments of the command line for renergy command
sub parse_args {
my $request = shift;
my %opt = ();
my $cmd = $request->{command};
my $args = $request->{arg};
my $nodes = $request->{node};
my $query_attrs = (); # The attributes list for query operation
my $set_pair = (); # The attribute need to be set. e.g. savingstatus=on
my $set_flag = (); # Indicate there's setting param in the argv
my $argv_flag = (); # Indicate there's param in the argv
my @notfspnodes = (); # The nodes list which are not fsp
# set the usage subroutine
local *usage = sub {
my $usage_string = xCAT::Usage->getUsage($cmd);
return( [ $_[0], $usage_string] );
};
if ($request->{arg}) {
@ARGV = @{$request->{arg}};
$Getopt::Long::ignorecase = 0;
Getopt::Long::Configure( "bundling" );
if ($nodes) {
if (!GetOptions( 'V' => \$::VERBOSE )) {
return (&usage());
}
if ($::VERBOSE) {
$opt{verbose} = 1;
}
if ($#ARGV < 0) {
return (&usage());
}
# Check the validity of the parameters of Query and Set
foreach my $attr (@ARGV) {
my ($set_attr, $set_value) = split (/=/, $attr);
if ($set_value) {
if ($argv_flag) {
return (&usage());
}
if ($::SET_ATTRS{$set_attr} != 1) {
return (&usage());
}
if ($set_attr eq "savingstatus"
&& ($set_value ne "on" && $set_value ne "off")) {
return (&usage());
} elsif ($set_attr eq "cappingstatus"
&& ($set_value ne "on" && $set_value ne "off")) {
return (&usage());
} elsif ( ($set_attr eq "cappingwatt"
|| $set_attr eq "cappingperc")
&& $set_value =~ /\D/) {
return (&usage());
}
$set_pair = $set_attr."=".$set_value;
$set_flag = 1;
} else {
if ($set_flag) {
return (&usage());
}
}
$argv_flag = 1;
}
if (!$set_flag) {
my @query_list = @ARGV;
if ($query_list[0] eq "all" and $#query_list == 0) {
$query_attrs = "savingstatus,cappingstatus,cappingmaxmin,cappingvalue,cappingsoftmin,averageAC,averageDC,ambienttemp,exhausttemp,CPUspeed";
} else {
my @no_dup_query_list = ();
foreach my $q_attr (@query_list) {
chomp($q_attr);
if ($::QUERY_ATTRS{$q_attr} != 1) {
return (&usage());
}
if (!grep (/$q_attr/, @no_dup_query_list)) {
push @no_dup_query_list, $q_attr;
}
}
$query_attrs = join (',', @no_dup_query_list);
}
}
} else {
# If has not nodes, the -h or -v option must be input
if (!GetOptions( 'h|help' => \$::HELP,
'v|version' => \$::VERSION)) {
return (&usage());
}
if (! ($::HELP || $::VERSION) ) {
return (&usage());
}
if ($::HELP) {
return (&usage());
}
if ($::VERSION) {
my $version_string = xCAT::Usage->getVersion('renergy');
return( [ $_[0], $version_string] );
}
}
} else {
return (&usage());
}
# Check whether the hardware type of nodes are fsp
my $nodetype_tb = xCAT::Table->new('nodetype');
unless ($nodetype_tb) {
return (1, "Error: Cannot open the nodetype table");
}
my $nodetype_v = $nodetype_tb->getNodesAttribs($nodes, ['nodetype']);
foreach my $node (@{$nodes}) {
if ($nodetype_v->{$node}->[0]->{'nodetype'} ne 'fsp') {
push @notfspnodes, $node;
}
}
if (@notfspnodes) {
return (1, "Error: The hardware type of following nodes are not fsp: ".join(',', @notfspnodes));
}
if ($query_attrs) {
$opt{'query'} = $query_attrs;
} elsif ($set_pair) {
$opt{'set'} = $set_pair;
}
$request->{method} = $cmd;
return (\%opt);
}
# Handle the energy query and setting work
sub renergy {
my $request = shift;
my $hcphost = shift;
my $nodehash = shift;
my @return_msg = ();
my $opt = $request->{'opt'};
my $verbose = $opt->{'verbose'};
# Get the User and Password for the HCP
my $user = $request->{$hcphost}{'cred'}[0];
my $password = $request->{$hcphost}{'cred'}[1];
# Get the CEC
my ($node, $attrs) = %$nodehash;
my $cec_name = @$attrs[2];
if ($verbose) {
push @return_msg, [$node, "Attributes of $node:\n User=$user\n Password=$password\n CEC=$cec_name\n", 0];
}
if (! ($user || $password || $cec_name) ) {
return ([[$node, "ERROR: This node lack some mandatory attributes for renergy command.", 1]]);
}
# Check the existence of cim client
if ( (! -f $::CIM_CLIENT_PATH)
|| (! -x $::CIM_CLIENT_PATH) ) {
return ([[$node, "ERROR: Cannot find the xCAT CIM Client [$::CIM_CLIENT_PATH]. Please install the xCAT_cim_client package correctly.", 1]]);
}
# Generate the url path for CIM communication
my $url_path = "https://"."$user".":"."$password"."\@"."$hcphost".":5989";
my $verb_arg = "";
if ($verbose) {
$verb_arg = "-V";
}
# Execute the request
my $cmd = "";
if ($opt->{'set'}) {
$cmd = "$::CIM_CLIENT_PATH $verb_arg -u $url_path -n $cec_name -o $opt->{'set'}";
} elsif ($opt->{'query'}) {
$cmd = "$::CIM_CLIENT_PATH $verb_arg -u $url_path -n $cec_name -o $opt->{'query'}";
}
if ($verbose) {
push @return_msg, [$node, "Run following command: $cmd", 0];
}
# Disable the CHID signal before run the command. Otherwise the
# $? value of `$cmd` will come from handler of CHID signal
$SIG{CHLD} = ();
# Call the xCAT_cim_client to query or set the energy capabilities
my @result = `$cmd 2>&1`;
my $rc = $? >> 8;
foreach my $line (@result) {
chomp($line);
if ($line =~ /^\s*$/) {
next;
}
push @return_msg, [$node, $line, $rc];
}
return \@return_msg;
}
1;

View File

@ -159,6 +159,12 @@ my %usage = (
"Usage:
lshwconn [-h|--help]
lshwconn noderange [-V|--verbose]",
"renergy" =>
"Usage:
renergy [-h | --help]
renergy [-v | --version]
renergy noderange [-V] {all | {[savingstatus] [cappingstatus] [cappingmaxmin] [cappingvalue] [cappingsoftmin] [averageAC] [averageDC] [ambienttemp] [exhausttemp] [CPUspeed]}}
renergy noderange [-V] {{savingstatus}={on | off} | {cappingstatus}={on | off} | {cappingwatt}=watt | {cappingperc}=percentage}",
);
my $vers = xCAT::Utils->Version();
my %version = (
@ -178,7 +184,8 @@ my %version = (
"chvm" => "$vers",
"rmvm" => "$vers",
"lsslp" => "$vers",
"rflash" => "$vers"
"rflash" => "$vers",
"renergy" => "$vers"
);
#--------------------------------------------------------------------------------

View File

@ -0,0 +1,205 @@
=head1 B<NAME>
B<renergy> - remote energy management tool
=head1 B<SYNOPSIS>
B<renergy> [-h | --help]
B<renergy> [-v | --version]
B<renergy> noderange [-V] {all | {[savingstatus]
[cappingstatus] [cappingmaxmin] [cappingvalue]
[cappingsoftmin] [averageAC] [averageDC]
[ambienttemp] [exhausttemp] [CPUspeed]}}
B<renergy> noderange [-V] {{savingstatus}={on | off}
| {cappingstatus}={on | off} | {cappingwatt}=watt
| {cappingperc}=percentage}
=head1 B<DESCRIPTION>
This renergy command can be used to manage the energy attributes of
a machine. Presently, it only supports IBM POWER6 rack-mounted servers.
Note: The keyword 'server' in this document is identical to
'rack-mounted server'.
The parameter 'noderange' can be a list of server's name (CEC's name).
Note: Lpar's name is not acceptable.
Renergy command can accept multiple attributes to query. If only
keywords list is specified, without the '=', it displays the current
value.
Renergy command only can set one attribute once running.
For the attributes that not supported by certain server, the return
value will be 'na'.
Prerequisite:
Before running the Renergy command, a prerequisite package
B<xCAT_cim_client> needs to be downloaded form IBM web site and installed.
Note:
Each query operation for attribute CPUspeed, averageAC or averageDC
costs about 30 Second to complete the operation. Query others attributes
will get response immediately.
The energy capability of specific hardware:
8204-E8A
Supports attributes: all
9125-F2A, 9119-FHA
Supports attributes: savingstatus,CPUspeed,ambienttemp,
exhausttemp,averageAC
9117-MMA (cpu speed should quicker than 4G)
Supports attributes: powersaving
=head1 B<OPTIONS>
-h | --help
Display the usage message.
-v | --version
Display the version information.
-V
Display the Verbose information.
all
Query all of the energy attributes.
savingstatus
Query the Power Saving status. The result should be
'on' or 'off'.
Note: To support the power saving attribute, POWER6
processors should greater than or equal to 4.0 GHz.
savingstatus={on | off}
Set the Power Saving status. The value must be 'on'
or 'off'.
Note: The setting value needs about 2 minutes to take
effect.
cappingstatus
Query the Power Capping status. The result should be
'on' of 'off'.
cappingstatus={on | off}
Set the Power Capping status. The value must be 'on'
or 'off'.
cappingwatt=watt
Set the Power Capping value base on the watt unit.
If the 'watt' > maximum of cappingmaxmin or 'watt'
< minimum of cappingmaxmim, The setting operation
will fail.
cappingperc=percentage
Set the Power Capping value base on the percentage of
the max-min capping value.
cappingmaxmin
Query the maximum and minimum of Power Capping value
that can be set for a machine. (Unit is watt)
cappingvalue
Query the current Power Capping value. (Unit is watt)
cappingsoftmin
Query the minimum value that can be assigned to Pcap
without guaranteed enforceability. (Unit is watt)
averageAC
Query the average power consumed (Input). (Unit is watt)
Note: For HI and HE server, the value of attribute
averageAC is the aggregate for all of the servers in the
rack.
averageDC
Query the average power consumed (Output). (Unit is
watt)
ambienttemp
Query the current ambient temperature. (Unit is B0C)
exhausttemp
Query the current exhaust temperature. (Unit is B0C)
CPUspeed
Query the effective CPU speed. (Unit is MHz)
=head1 B<RETURN VALUE>
0 The command completed successfully.
1 An error has occurred.
=head1 B<EXAMPLES>
1. Query all the attributes which CEC1,CEC2 supported
B<renergy> CEC1,CEC2 all
The output of the query operation:
CEC1: savingstatus: on
CEC1: cappingstatus: on
CEC1: cappingmin: 782 W
CEC1: cappingmax: 850 W
CEC1: cappingvalue: 816 W
CEC1: cappingsoftmin: 200 W
CEC1: averageAC: 430 W
CEC1: averageDC: 364 W
CEC1: ambienttemp: 25 C
CEC1: exhausttemp: 32 C
CEC1: CPUspeed: 3621 MHz
CEC2: savingstatus: off
CEC2: cappingstatus: off
CEC2: cappingmin: na
CEC2: cappingmax: na
CEC2: cappingvalue: na
CEC2: cappingsoftmin: na
CEC2: averageAC: na
CEC2: averageDC: na
CEC2: ambienttemp: na
CEC2: exhausttemp: na
CEC2: CPUspeed: na
2. Query the attributes savingstatus, cappingstatus
and CPUspeed of server CEC1
B<renergy> CEC1 savingstatus,cappingstatus,CPUspeed
The output of the query operation:
CEC1: savingstatus: off
CEC1: cappingstatus: on
CEC1: CPUspeed: 3621 MHz
3. Turn on the Power saving function of CEC1
B<renergy> CEC1 savingstatus=on
The output of the setting operation:
CEC1: Set savingstatus succeeded.
CEC1: This setting may need some minutes to take effect.
4. Set the Power Capping value base on the percentage of the
max-min capping value
B<renergy> CEC1 -s cappingperc=50
If the maximum capping value of the CEC1 is 850w, and the
minimum capping value of the CEC1 is 782w, the Power Capping
value will be set as ((850-782)*50% + 782) = 816w.
The output of the setting operation:
CEC1: Set cappingperc succeeded.
CEC1: cappingvalue: 816
=head1 B<FILES>
/opt/xcat/bin/renergy

View File

@ -34,10 +34,11 @@ my %modules = (
getmacs => "xCAT::PPCmac",
reventlog => "xCAT::PPClog",
rspconfig => "xCAT::PPCcfg",
rflash => "xCAT::PPCrflash",
mkhwconn => "xCAT::PPCconn",
rmhwconn => "xCAT::PPCconn",
lshwconn => "xCAT::PPCconn"
rflash => "xCAT::PPCrflash",
mkhwconn => "xCAT::PPCconn",
rmhwconn => "xCAT::PPCconn",
lshwconn => "xCAT::PPCconn",
renergy => "xCAT::PPCenergy"
);
##########################################
@ -589,11 +590,12 @@ sub preprocess_nodes {
# rscan - Nodes are hardware control pts
# Direct-attached FSP
########################################
if (( !$request->{hcp} && ($request->{hcp} ne "hmc" )) and
(( $request->{command} =~ /^(rscan|rspconfig)$/ ) or
($request->{hwtype} eq "fsp" or $request->{hwtype} eq "bpa" ) or
($request->{command} eq 'lshwconn' and $request->{nodetype} eq 'hmc'))
) {
if (( !$request->{hcp} && ($request->{hcp} ne "hmc" ))
and ($request->{command} !~ /^renergy$/)
and (( $request->{command} =~ /^(rscan|rspconfig)$/ )
or ($request->{hwtype} eq "fsp" or $request->{hwtype} eq "bpa" )
or ($request->{command} eq 'lshwconn' and $request->{nodetype} eq 'hmc'))
) {
my $result = resolve_hcp( $request, $noderange );
return( $result );
}
@ -712,7 +714,7 @@ sub preprocess_nodes {
# single CEC, the CEC itself will serialize
# them - fork one process per CEC.
##########################################
elsif ( $method =~ /^powercmd/ ) {
elsif ( $method =~ /^powercmd/ || $method =~ /^renergy/ ) {
while (my ($hcp,$hash) = each(%nodehash) ) {
while (my ($mtms,$h) = each(%$hash) ) {
push @nodegroup,[$hcp,$h];
@ -1026,6 +1028,30 @@ sub invoke_cmd {
my $verbose_log;
my @outhash;
########################################
# If the request command is renergy, just
# uses the xCAT CIM Client to handle it
########################################
if ( $request->{command} eq "renergy" ) {
my $result = &runcmd($request, $host, $nodes);
########################################
# Format and send back to parent
########################################
foreach ( @$result ) {
my %output;
$output{node}->[0]->{name}->[0] = @$_[0];
$output{node}->[0]->{data}->[0]->{contents}->[0] = @$_[1];
$output{errorcode} = @$_[2];
push @outhash, \%output;
}
my $out = $request->{pipe};
print $out freeze( [@outhash] );
print $out "\nENDOFFREEZE6sK4ci\n";
return;
}
########################################
# Direct-attached FSP handler
########################################

View File

@ -15,7 +15,8 @@ sub handled_commands {
rspconfig => 'nodehm:mgt',
mkhwconn => 'nodehm:mgt',
rmhwconn => 'nodehm:mgt',
lshwconn => 'nodehm:mgt'
lshwconn => 'nodehm:mgt',
renergy => 'nodehm:mgt'
};
}

View File

@ -24,7 +24,8 @@ sub handled_commands {
rflash => 'nodehm:mgt',
mkhwconn => 'nodehm:mgt',
rmhwconn => 'nodehm:mgt',
lshwconn => 'nodehm:mgt'
lshwconn => 'nodehm:mgt',
renergy => 'nodehm.mgt'
};
}