diff --git a/perl-xCAT/xCAT/CIMUtils.pm b/perl-xCAT/xCAT/CIMUtils.pm index 085095b98..1c49f0102 100644 --- a/perl-xCAT/xCAT/CIMUtils.pm +++ b/perl-xCAT/xCAT/CIMUtils.pm @@ -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); } diff --git a/perl-xCAT/xCAT/Usage.pm b/perl-xCAT/xCAT/Usage.pm index 9ef3b006b..e458cc8f8 100644 --- a/perl-xCAT/xCAT/Usage.pm +++ b/perl-xCAT/xCAT/Usage.pm @@ -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: diff --git a/xCAT-client/pods/man1/renergy.1.pod b/xCAT-client/pods/man1/renergy.1.pod index aec573f92..c6d5a0068 100644 --- a/xCAT-client/pods/man1/renergy.1.pod +++ b/xCAT-client/pods/man1/renergy.1.pod @@ -27,17 +27,35 @@ B =over 2 +B I [-V] { all | [savingstatus] [dsavingstatus] +[cappingstatus] [cappingmaxmin] [cappingvalue] [cappingsoftmin] +[averageAC] [averageDC] [ambienttemp] [exhausttemp] [CPUspeed] +[syssbpower] [sysIPLtime] [fsavingstatus] [ffoMin] [ffoVmin] +[ffoTurbo] [ffoNorm] [ffovalue]} + +B I [-V] { savingstatus={on | off} +| dsavingstatus={on-norm | on-maxp | off} +| fsavingstatus={on | off} | ffovalue=MHZ +| cappingstatus={on | off} | cappingwatt=watt +| cappingperc=percentage } + +=back + +B + +=over 2 + B I [-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 I [-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 command supports IBM POWER6 and POWER7 rack-mounted servers, +B 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 and I 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 server, there's no hardware type restriction. The parameter I needs to be specified for the B command to get the target servers. The I should be a list of CEC node names, blade @@ -234,11 +253,13 @@ will get response immediately. =head1 B -For the system p nodes, the B command depends +For the I and I nodes, the B command depends on the Energy Management Plugin B to communicate with server. B can be downloaded from the IBM web site: http://www.ibm.com/support/fixcentral/. (Other Software -> EM) +NOTE: I nodes don't need this specific energy management package. + For iDataPlex nodes, the B command depends on the Energy Management Plugin B 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 + +Query the historical records which were generated in last one hour for B. + =item B 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 + +Query the historical records which were generated in last one hour for B. + =item B Query the average power consumed (Output). (Unit is watt) +=item B + +Query the historical records which were generated in last one hour for B. + =item B Query the Power Capabilities of the blade server. @@ -380,6 +413,10 @@ guaranteed. Query the effective processor frequency. (Unit is MHz) +=item B + +Query the historical records which were generated in last one hour for B + =item B Query the dynamic power saving status. The result should @@ -410,6 +447,21 @@ B is in turn off status. Query the current exhaust temperature. (Unit is centigrade) +=item B + +Query the historical records which were generated in last one hour for B + +=item B + +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 attribute name. + +=item B + +Query the historical records which were generated in last one hour for B. + =item B 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={B │ B} +=item B={B | B} 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 Query the system power consumed prior to power on. -(Unit is MHz) +(Unit is Watt) =item B @@ -595,7 +647,7 @@ center chassis. =item 1 -Query all the attributes which CEC1,CEC2 supported. +Query all attributes which CEC1,CEC2 supported. B CEC1,CEC2 all @@ -629,6 +681,43 @@ The output of the query operation: =item 2 +Query the B attribute for Power8 CEC. + +B 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 attribute. (Power8 CEC) + +B 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 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%. diff --git a/xCAT-server/lib/xcat/plugins/energy.pm b/xCAT-server/lib/xcat/plugins/energy.pm index 4e0828c9e..339a21804 100644 --- a/xCAT-server/lib/xcat/plugins/energy.pm +++ b/xCAT-server/lib/xcat/plugins/energy.pm @@ -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;