Add man page for P8 energy; some minor fixes in CIMUtils.pm and energy.pm

This commit is contained in:
daniceexi 2014-12-26 05:58:04 -05:00
parent 630f2c2776
commit 175ac75c8e
4 changed files with 153 additions and 37 deletions

View File

@ -312,6 +312,20 @@ sub set_property
return $ret;
}
# parse the http response
my $ret_value;
my $parser = XML::LibXML->new();
my $resp_doc = $parser->parse_string($ret->{payload});
# check the error message from CIM
my $error_node = $resp_doc->getElementsByTagName("ERROR");
if ($error_node) {
my $msg = $error_node->[0]->getAttribute("DESCRIPTION");
my $errorcode = $error_node->[0]->getAttribute("CODE");
return ({rc => 1, cim_rc => $errorcode, msg => $error_node->[0]->getAttribute("DESCRIPTION")." [cim return code: $errorcode]"});
}
# if no http and cim error, the setting was succeeded
return ($ret);
}

View File

@ -333,12 +333,16 @@ my %usage = (
renergy [-v | --version]
Power 6 server specific :
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 }
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 }
Power 7 server specific :
renergy noderange [-V] { all | { [savingstatus] [dsavingstatus] [cappingstatus] [cappingmaxmin] [cappingvalue] [cappingsoftmin] [averageAC] [averageDC] [ambienttemp] [exhausttemp] [CPUspeed] [syssbpower] [sysIPLtime] [fsavingstatus] [ffoMin] [ffoVmin] [ffoTurbo] [ffoNorm] [ffovalue] } }
renergy noderange [-V] { {savingstatus}={on | off} | {dsavingstatus}={on-norm | on-maxp | off} | {fsavingstatus}={on | off} | {ffovalue}=MHZ | {cappingstatus}={on | off} | {cappingwatt}=watt | {cappingperc}=percentage }
renergy noderange [-V] { all | { [savingstatus] [dsavingstatus] [cappingstatus] [cappingmaxmin] [cappingvalue] [cappingsoftmin] [averageAC] [averageDC] [ambienttemp] [exhausttemp] [CPUspeed] [syssbpower] [sysIPLtime] [fsavingstatus] [ffoMin] [ffoVmin] [ffoTurbo] [ffoNorm] [ffovalue] } }
renergy noderange [-V] { {savingstatus}={on | off} | {dsavingstatus}={on-norm | on-maxp | off} | {fsavingstatus}={on | off} | {ffovalue}=MHZ | {cappingstatus}={on | off} | {cappingwatt}=watt | {cappingperc}=percentage }
Power 8 server specific :
renergy noderange [-V] { all | [savingstatus] [dsavingstatus] [cappingstatus] [cappingmaxmin] [cappingvalue] [cappingsoftmin] [averageAC] [averageAChistory] [averageDC] [averageDChistory] [ambienttemp] [ambienttemphistory] [exhausttemp] [exhausttemphistory] [fanspeed] [fanspeedhistory] [CPUspeed] [CPUspeedhistory] [syssbpower] [sysIPLtime] [fsavingstatus] [ffoMin] [ffoVmin] [ffoTurbo] [ffoNorm] [ffovalue]}
renergy noderange [-V] { savingstatus={on | off} | dsavingstatus={on-norm | on-maxp | off} | fsavingstatus={on | off} | ffovalue=MHZ }
BladeCenter specific :
For Management Modules:

View File

@ -27,17 +27,35 @@ B<Power 7 server specific :>
=over 2
B<renergy> I<noderange> [-V] { all | [savingstatus] [dsavingstatus]
[cappingstatus] [cappingmaxmin] [cappingvalue] [cappingsoftmin]
[averageAC] [averageDC] [ambienttemp] [exhausttemp] [CPUspeed]
[syssbpower] [sysIPLtime] [fsavingstatus] [ffoMin] [ffoVmin]
[ffoTurbo] [ffoNorm] [ffovalue]}
B<renergy> I<noderange> [-V] { savingstatus={on | off}
| dsavingstatus={on-norm | on-maxp | off}
| fsavingstatus={on | off} | ffovalue=MHZ
| cappingstatus={on | off} | cappingwatt=watt
| cappingperc=percentage }
=back
B<Power 8 server specific :>
=over 2
B<renergy> I<noderange> [-V] { all | [savingstatus] [dsavingstatus]
[cappingstatus] [cappingmaxmin] [cappingvalue] [cappingsoftmin]
[averageAC] [averageDC] [ambienttemp] [exhausttemp] [CPUspeed]
[averageAC] [averageAChistory] [averageDC] [averageDChistory]
[ambienttemp] [ambienttemphistory] [exhausttemp] [exhausttemphistory]
[fanspeed] [fanspeedhistory] [CPUspeed] [CPUspeedhistory]
[syssbpower] [sysIPLtime] [fsavingstatus] [ffoMin] [ffoVmin]
[ffoTurbo] [ffoNorm] [ffovalue]}
B<renergy> I<noderange> [-V] { savingstatus={on | off}
| dsavingstatus={on-norm | on-maxp | off}
| fsavingstatus={on | off} | ffovalue=MHZ
| cappingstatus={on | off} | cappingwatt=watt
| cappingperc=percentage }
| fsavingstatus={on | off} | ffovalue=MHZ }
=back
@ -127,10 +145,11 @@ user can query and set the power saving and power capping status, and also can
query the average consumed energy, the ambient and exhaust temperature,
the processor frequency for a server.
B<renergy> command supports IBM POWER6 and POWER7 rack-mounted servers,
B<renergy> command supports IBM POWER6, POWER7 and POWER8 rack-mounted servers,
BladeCenter management modules, blade servers, and iDataPlex servers.
For system p rack-mounted servers, the following specific hardware types are supported:
For I<Power6> and I<Power7> rack-mounted servers, the following specific hardware types are supported:
I<8203-E4A>, I<8204-E8A>, I<9125-F2A>, I<8233-E8B>, I<8236-E8C>.
For I<Power8> server, there's no hardware type restriction.
The parameter I<noderange> needs to be specified for the B<renergy> command to
get the target servers. The I<noderange> should be a list of CEC node names, blade
@ -234,11 +253,13 @@ will get response immediately.
=head1 B<PREREQUISITES>
For the system p nodes, the B<renergy> command depends
For the I<Power6> and I<Power7> nodes, the B<renergy> command depends
on the Energy Management Plugin B<xCAT-pEnergy> to
communicate with server. B<xCAT-pEnergy> can be downloaded from the IBM web site:
http://www.ibm.com/support/fixcentral/. (Other Software -> EM)
NOTE: I<Power8> nodes don't need this specific energy management package.
For iDataPlex nodes, the B<renergy> command depends
on the Energy Management Plugin B<xCAT-xEnergy> to
communicate with server. This plugin must be requested from IBM.
@ -282,6 +303,10 @@ management module node.
Query the current ambient temperature. (Unit is centigrade)
=item B<ambienttemphistory>
Query the historical records which were generated in last one hour for B<ambienttemp>.
=item B<availableDC>
Query the total DC power available for the entire blade center chassis.
@ -298,10 +323,18 @@ averageAC is the total AC power being consumed by all modules
in the chassis. It also includes power consumed by the Chassis
Cooling Devices for BCH chassis.
=item B<averageAChistory>
Query the historical records which were generated in last one hour for B<averageAC>.
=item B<averageDC>
Query the average power consumed (Output). (Unit is watt)
=item B<averageDChistory>
Query the historical records which were generated in last one hour for B<averageDC>.
=item B<capability>
Query the Power Capabilities of the blade server.
@ -380,6 +413,10 @@ guaranteed.
Query the effective processor frequency. (Unit is MHz)
=item B<CPUspeedhistory>
Query the historical records which were generated in last one hour for B<CPUspeed>
=item B<dsavingstatus>
Query the dynamic power saving status. The result should
@ -410,6 +447,21 @@ B<savingstatus> is in turn off status.
Query the current exhaust temperature. (Unit is centigrade)
=item B<exhausttemphistory>
Query the historical records which were generated in last one hour for B<exhausttemp>
=item B<fanspeed>
Query the fan speed for all the fans which installed in this node. (Unit is RPM - Rotations Per Minute))
If there are multiple fans for a node, multiple lines will be output. And a fan name in bracket will be
appended after B<fanspped> attribute name.
=item B<fanspeedhistory>
Query the historical records which were generated in last one hour for B<fanspeed>.
=item B<ffoMin>
Query the minimum cpu frequency which can be set for FFO. (Fixed
@ -455,7 +507,7 @@ The ffovalue setting operation needs about 1 minute to take effect.
Query the status of FFO. The result should be 'on' or 'off'.
'on' - enable; 'off' - disable.
=item B<fsavingstatus>={B<on> B<off>}
=item B<fsavingstatus>={B<on> | B<off>}
Set the status of FFO. The value must be 'on' or 'off'.
@ -574,7 +626,7 @@ Query the time used from FSP standby to OS standby.
=item B<syssbpower>
Query the system power consumed prior to power on.
(Unit is MHz)
(Unit is Watt)
=item B<thermaloutput>
@ -595,7 +647,7 @@ center chassis.
=item 1
Query all the attributes which CEC1,CEC2 supported.
Query all attributes which CEC1,CEC2 supported.
B<renergy> CEC1,CEC2 all
@ -629,6 +681,43 @@ The output of the query operation:
=item 2
Query the B<fanspeed> attribute for Power8 CEC.
B<renergy> CEC1 fanspeed
The output of the query operation:
CEC1: fanspeed (Fan U78CB.001.WZS00MA-A1 00002101): 5947 RPM
CEC1: fanspeed (Fan U78CB.001.WZS00MA-A2 00002103): 6081 RPM
CEC1: fanspeed (Fan U78CB.001.WZS00MA-A3 00002105): 6108 RPM
CEC1: fanspeed (Fan U78CB.001.WZS00MA-A4 00002107): 6000 RPM
CEC1: fanspeed (Fan U78CB.001.WZS00MA-A5 00002109): 6013 RPM
CEC1: fanspeed (Fan U78CB.001.WZS00MA-A6 0000210B): 6013 RPM
CEC1: fanspeed (Fan U78CB.001.WZS00MA-E1 0000210C): 4992 RPM
CEC1: fanspeed (Fan U78CB.001.WZS00MA-E2 0000210D): 5016 RPM
=item 3
Query the historical records for the B<CPUspeed> attribute. (Power8 CEC)
B<renergy> CEC1 CPUspeedhistory
The output of the query operation:
CEC1: CPUspeedhistory: 2027 MHZ: 20141226042900
CEC1: CPUspeedhistory: 2027 MHZ: 20141226042930
CEC1: CPUspeedhistory: 2244 MHZ: 20141226043000
CEC1: CPUspeedhistory: 2393 MHZ: 20141226043030
CEC1: CPUspeedhistory: 2393 MHZ: 20141226043100
CEC1: CPUspeedhistory: 2393 MHZ: 20141226043130
CEC1: CPUspeedhistory: 2393 MHZ: 20141226043200
CEC1: CPUspeedhistory: 2393 MHZ: 20141226043230
CEC1: CPUspeedhistory: 2393 MHZ: 20141226043300
CEC1: CPUspeedhistory: 2393 MHZ: 20141226043330
...
=item 4
Query all the attirbutes for management module node MM1. (For chassis)
B<renergy> MM1 all
@ -658,7 +747,7 @@ The output of the query operation:
in this power domain.
mm1: thermaloutput: 9717.376000 BTU/hour
=item 3
=item 5
Query all the attirbutes for blade server node blade1.
@ -674,7 +763,7 @@ The output of the query operation:
blade1: maxCPUspeed: 4204MHZ
blade1: savingstatus: off
=item 4
=item 6
Query the attributes savingstatus, cappingstatus
and CPUspeed for server CEC1.
@ -687,7 +776,7 @@ The output of the query operation:
CEC1: cappingstatus: on
CEC1: CPUspeed: 3621 MHz
=item 5
=item 7
Turn on the power saving function of CEC1.
@ -698,7 +787,7 @@ The output of the setting operation:
CEC1: Set savingstatus succeeded.
CEC1: This setting may need some minutes to take effect.
=item 6
=item 8
Set the power capping value base on the percentage of the
max-min capping value. Here, set it to 50%.

View File

@ -194,6 +194,10 @@ sub parse_args {
# replace the 'all' with all valid attribute
if ($attr eq "all") {
foreach my $q_attr (keys %QUERY_ATTRS) {
# do not include 'history' related attributes for all keyword
if ($q_attr =~ /history$/) {
next;
}
if (!grep (/^$q_attr$/, @query_list)) {
push @query_list, $q_attr;
}
@ -657,6 +661,7 @@ sub run_cim
return 1;
}
}
delete $http_params->{timeout};
# check whether the primary ip of fsp is the IP we are accessing
if (defined ($value->[0]->{property}->{PrimaryFSP_IP}->{value}) && $value->[0]->{property}->{PrimaryFSP_IP}->{value} ne $http_params->{ip}) {
# run against the standby fsp, do the next one
@ -806,13 +811,13 @@ sub run_cim
my @ffo_point_value = split (',', $query_pum_value->{FixedFrequencyPointValues});
foreach my $index (0..$#ffo_point) {
if ($ffo_point[$index] eq '2' && $attr eq 'ffoNorm') { # Norminal
push @output, "$node: $attr: $ffo_point_value[$index]";
push @output, "$node: $attr: $ffo_point_value[$index] MHZ";
} elsif ($ffo_point[$index] eq '3' && $attr eq 'ffoTurbo') { # Turbo
push @output, "$node: $attr: $ffo_point_value[$index]";
push @output, "$node: $attr: $ffo_point_value[$index] MHZ";
} elsif ($ffo_point[$index] eq '4' && $attr eq 'ffoVmin') { # Vmin
push @output, "$node: $attr: $ffo_point_value[$index]";
push @output, "$node: $attr: $ffo_point_value[$index] MHZ";
} elsif ($ffo_point[$index] eq '5' && $attr eq 'ffoMin') { # Min
push @output, "$node: $attr: $ffo_point_value[$index]";
push @output, "$node: $attr: $ffo_point_value[$index] MHZ";
}
}
} else {
@ -828,9 +833,9 @@ sub run_cim
if ($query_pum_flag) {
if (defined ($query_pum_value->{FixedFrequencyOverrideFreq})) {
if ($query_pum_value->{FixedFrequencyOverrideFreq} eq '4294967295') {
push @output, "$node: $attr: 0";
push @output, "$node: $attr: 0 MHZ";
} else {
push @output, "$node: $attr: $query_pum_value->{FixedFrequencyOverrideFreq}";
push @output, "$node: $attr: $query_pum_value->{FixedFrequencyOverrideFreq} MHZ";
}
} else {
push @output, "$node: $attr: na";
@ -845,9 +850,9 @@ sub run_cim
if ($attr =~ /^(syssbpower|sysIPLtime)$/) {
if ($query_drawer_flag) {
if (defined ($query_drawer_value->{AverageTimeToIPL}) && $attr eq "sysIPLtime") {
push @output, "$node: $attr: $query_drawer_value->{AverageTimeToIPL}";
push @output, "$node: $attr: $query_drawer_value->{AverageTimeToIPL} S";
} elsif (defined ($query_drawer_value->{StandbyPowerUtilization}) && $attr eq "syssbpower") {
push @output, "$node: $attr: $query_drawer_value->{StandbyPowerUtilization}";
push @output, "$node: $attr: $query_drawer_value->{StandbyPowerUtilization} W";
} else {
push @output, "$node: $attr: na";
}
@ -863,11 +868,11 @@ sub run_cim
my @times = sort keys %{$tmphash->{$ins}->{MetricValue}};
if ($attr eq "ambienttemp") {
#push @output, "$node: $attr ($tmphash->{$ins}->{MeasuredElementName}): $tmphash->{$ins}->{MetricValue}->{$times[-1]}";
push @output, "$node: $attr: $tmphash->{$ins}->{MetricValue}->{$times[-1]}";
push @output, "$node: $attr: $tmphash->{$ins}->{MetricValue}->{$times[-1]} C";
} else {
foreach my $time (@times) {
#push @output, "$node: $attr ($tmphash->{$ins}->{MeasuredElementName}): $tmphash->{$ins}->{MetricValue}->{$time}: $time";
push @output, "$node: $attr: $tmphash->{$ins}->{MetricValue}->{$time}: $time";
push @output, "$node: $attr: $tmphash->{$ins}->{MetricValue}->{$time} C: $time";
}
}
}
@ -879,11 +884,11 @@ sub run_cim
my @times = sort keys %{$tmphash->{$ins}->{MetricValue}};
if ($attr eq "exhausttemp") {
#push @output, "$node: $attr ($tmphash->{$ins}->{MeasuredElementName}): $tmphash->{$ins}->{MetricValue}->{$times[-1]}";
push @output, "$node: $attr: $tmphash->{$ins}->{MetricValue}->{$times[-1]}";
push @output, "$node: $attr: $tmphash->{$ins}->{MetricValue}->{$times[-1]} C";
} else {
foreach my $time (@times) {
#push @output, "$node: $attr ($tmphash->{$ins}->{MeasuredElementName}): $tmphash->{$ins}->{MetricValue}->{$time}: $time";
push @output, "$node: $attr: $tmphash->{$ins}->{MetricValue}->{$time}: $time";
push @output, "$node: $attr: $tmphash->{$ins}->{MetricValue}->{$time} C: $time";
}
}
}
@ -895,11 +900,11 @@ sub run_cim
my @times = sort keys %{$tmphash->{$ins}->{MetricValue}};
if ($attr eq "CPUspeed") {
#push @output, "$node: $attr ($tmphash->{$ins}->{MeasuredElementName}): $tmphash->{$ins}->{MetricValue}->{$times[-1]}";
push @output, "$node: $attr: $tmphash->{$ins}->{MetricValue}->{$times[-1]}";
push @output, "$node: $attr: $tmphash->{$ins}->{MetricValue}->{$times[-1]} MHZ";
} else {
foreach my $time (@times) {
#push @output, "$node: $attr ($tmphash->{$ins}->{MeasuredElementName}): $tmphash->{$ins}->{MetricValue}->{$time}: $time";
push @output, "$node: $attr: $tmphash->{$ins}->{MetricValue}->{$time}: $time";
push @output, "$node: $attr: $tmphash->{$ins}->{MetricValue}->{$time} MHZ: $time";
}
}
}
@ -910,10 +915,10 @@ sub run_cim
if ($ins =~ /FansSpeed/) {
my @times = sort keys %{$tmphash->{$ins}->{MetricValue}};
if ($attr eq "fanspeed") {
push @output, "$node: $attr ($tmphash->{$ins}->{MeasuredElementName}): $tmphash->{$ins}->{MetricValue}->{$times[-1]}";
push @output, "$node: $attr ($tmphash->{$ins}->{MeasuredElementName}): $tmphash->{$ins}->{MetricValue}->{$times[-1]} RPM";
} else {
foreach my $time (@times) {
push @output, "$node: $attr ($tmphash->{$ins}->{MeasuredElementName}): $tmphash->{$ins}->{MetricValue}->{$time}: $time";
push @output, "$node: $attr ($tmphash->{$ins}->{MeasuredElementName}): $tmphash->{$ins}->{MetricValue}->{$time} RPM: $time";
}
}
}
@ -925,10 +930,10 @@ sub run_cim
my @times = sort keys %{$tmphash->{$tmpattr}->{MetricValue}};
if ($attr =~ /history$/) {
foreach my $time (@times) {
push @output, "$node: $attr: $tmphash->{$tmpattr}->{MetricValue}->{$time}: $time";
push @output, "$node: $attr: $tmphash->{$tmpattr}->{MetricValue}->{$time} W: $time";
}
} else {
push @output, "$node: $attr: $tmphash->{$attr}->{MetricValue}->{$times[-1]}";
push @output, "$node: $attr: $tmphash->{$attr}->{MetricValue}->{$times[-1]} W";
}
}
}
@ -1008,7 +1013,11 @@ sub run_cim
# Display the output
my $rsp;
push @{$rsp->{data}}, @output;
if ($query_list && $query_list !~ /history/) {
push @{$rsp->{data}}, sort (@output);
} else {
push @{$rsp->{data}}, @output;
}
xCAT::MsgUtils->message("I", $rsp, $callback);
return 0;