2
0
mirror of https://github.com/xcat2/xcat-core.git synced 2025-05-25 21:22:05 +00:00

Merge pull request #3134 from whowutwut/rvitals_options

Add support for the rvitals option for openbmc based on the defined API
This commit is contained in:
Mark Gurevich 2017-05-30 14:45:53 -04:00 committed by GitHub
commit c5d40aa00b
5 changed files with 75 additions and 16 deletions

View File

@ -56,20 +56,27 @@ BMC specific:
\ **rvitals**\ \ *noderange*\ {\ **temp | voltage | wattage | fanspeed | power | leds | all**\ }
OpenPOWER server specific:
OpenPOWER (IPMI) specific:
==========================
\ **rvitals**\ \ *noderange*\ [\ **temp | voltage | wattage | fanspeed | power | leds | all**\ ]
OpenPOWER (OpenBMC) specific:
=============================
\ **rvitals**\ \ *noderange*\ [\ **temp | voltage | wattage | fanspeed | power | altitude | all**\ ]
*******************
\ **Description**\
*******************
\ **rvitals**\ retrieves hardware vital information from the on-board Service
\ **rvitals**\ Retrieves hardware vital information from the on-board Service
Processor for a single or range of nodes and groups.
@ -133,6 +140,12 @@ Processor for a single or range of nodes and groups.
\ **altitude**\
Retrieves altitude related attributes.
\ **power**\
Retrieves power status.

View File

@ -375,7 +375,6 @@ sub rackenv {
push @result, [ $name, $td, $Rc ];
if (!exists($request->{verbose})) {
#if( $td =~ /^Rack altitude in meters/ ) {
if ($td =~ /^BPA-B total output in watts/) {
last;
}

View File

@ -81,8 +81,10 @@ my %usage = (
rvitals noderange {temp|wattage|fanspeed|leds|summary|all}
BMC specific:
rvitals noderange {temp|voltage|wattage|fanspeed|power|leds|all}
OpenPOWER server specific:
OpenPOWER (IPMI) specific:
rvitals noderange [temp|voltage|wattage|fanspeed|power|leds|all]
OpenPOWER (OpenBMC) specific:
rvitals noderange [temp|voltage|wattage|fanspeed|power|altitude|all]
MIC specific:
rvitals noderange {thermal|all}",
"reventlog" =>

View File

@ -26,13 +26,17 @@ B<rvitals> I<noderange> {B<temp>|B<wattage>|B<fanspeed>|B<leds>|B<summary>|B<all
B<rvitals> I<noderange> {B<temp>|B<voltage>|B<wattage>|B<fanspeed>|B<power>|B<leds>|B<all>}
=head2 OpenPOWER server specific:
=head2 OpenPOWER (IPMI) specific:
B<rvitals> I<noderange> [B<temp>|B<voltage>|B<wattage>|B<fanspeed>|B<power>|B<leds>|B<all>]
=head2 OpenPOWER (OpenBMC) specific:
B<rvitals> I<noderange> [B<temp>|B<voltage>|B<wattage>|B<fanspeed>|B<power>|B<altitude>|B<all>]
=head1 B<Description>
B<rvitals> retrieves hardware vital information from the on-board Service
B<rvitals> Retrieves hardware vital information from the on-board Service
Processor for a single or range of nodes and groups.
=head1 B<Options>
@ -75,6 +79,10 @@ Retrieves rack environmentals.
Retrieves LEDs status.
=item B<altitude>
Retrieves altitude related attributes.
=item B<power>
Retrieves power status.

View File

@ -37,6 +37,8 @@ $::POWER_STATE_POWERING_ON="powering-on";
$::POWER_STATE_QUIESCED="quiesced";
$::POWER_STATE_RESET="reset";
$::NO_ATTRIBUTES_RETURNED="No attributes returned from the BMC.";
sub unsupported {
my $callback = shift;
if (defined($::OPENBMC_DEVEL) && ($::OPENBMC_DEVEL eq "YES")) {
@ -458,7 +460,7 @@ sub parse_args {
} elsif ($command eq "rvitals") {
$check = unsupported($callback); if (ref($check) eq "ARRAY") { return $check; }
$subcommand = "all" if (!defined($ARGV[0]));
unless ($subcommand =~ /^temp$|^voltage$|^wattage$|^fanspeed$|^power$|^leds$|^all$/) {
unless ($subcommand =~ /^temp$|^voltage$|^wattage$|^fanspeed$|^power$|^altitude$|^all$/) {
return ([ 1, "Unsupported command: $command $subcommand" ]);
}
} else {
@ -1209,26 +1211,61 @@ sub rvitals_response {
my $grep_string = $status_info{RVITALS_RESPONSE}{argv};
my $src;
my $content_info;
my $sensor_value;
my @sorted_output;
print "$node: DEBUG Processing command: rvitals $grep_string \n";
print Dumper(%{$response_info->{data}}) . "\n";
print Dumper(%{$response_info->{data}});
foreach my $key_url (keys %{$response_info->{data}}) {
my %content = %{ ${ $response_info->{data} }{$key_url} };
print Dumper(%content) . "\n";
# $key_url is "/xyz/openbmc_project/sensors/xxx/yyy
# For now display xxx/yyy as a label
my ($junk, $label) = split("/sensors/", $key_url);
#
# Calculate the value based on the scale
# Skip over attributes that are not asked to be printed
#
if ($grep_string =~ "temp") {
unless ( $content{Unit} =~ "DegreesC") { next; }
}
if ($grep_string =~ "voltage") {
unless ( $content{Unit} =~ "Volts") { next; }
}
if ($grep_string =~ "wattage") {
unless ( $content{Unit} =~ "Watts") { next; }
}
if ($grep_string =~ "fanspeed") {
unless ( $content{Unit} =~ "RPMS") { next; }
}
if ($grep_string =~ "power") {
unless ( $content{Unit} =~ "Amperes" || $content{Unit} =~ "Joules" || $content{Unit} =~ "Watts" ) { next; }
}
if ($grep_string =~ "altitude") {
unless ( $content{Unit} =~ "Meters" ) { next; }
}
my $label = (split(/\//, $key_url))[ -1 ];
# replace underscore with space, uppercase the first letter
$label =~ s/_/ /g;
$label =~ s/\b(\w)/\U$1/g;
#
# Calculate the adjusted value based on the scale attribute
#
my $calc_value = $content{Value};
if ( $content{Scale} != 0 ) {
$calc_value = ($content{Value} * (10 ** $content{Scale}));
}
$sensor_value = $label . ": " . $calc_value . " " . $sensor_units{ $content{Unit} };
xCAT::SvrUtils::sendmsg("$sensor_value", $callback, $node);
$content_info = $label . ": " . $calc_value . " " . $sensor_units{ $content{Unit} };
push (@sorted_output, $content_info); #Save output in array
}
# If sorted array has any contents, sort it and print it
if (scalar @sorted_output > 0) {
# Sort the output, alpha, then numeric
my @sorted_output = grep {s/(^|\D)0+(\d)/$1$2/g,1} sort
grep {s/(\d+)/sprintf"%06.6d",$1/ge,1} @sorted_output;
xCAT::SvrUtils::sendmsg("$_", $callback, $node) foreach (@sorted_output);
} else {
xCAT::SvrUtils::sendmsg("$::NO_ATTRIBUTES_RETURNED", $callback, $node);
}
if ($next_status{ $node_info{$node}{cur_status} }) {