From a97149756b90301ecfc84de301313be9c6eff549 Mon Sep 17 00:00:00 2001 From: XuWei Date: Wed, 25 Oct 2017 01:46:55 -0400 Subject: [PATCH] modified depending on comments --- xCAT-server/lib/xcat/plugins/openbmc.pm | 54 +++++++++++++++++++------ 1 file changed, 42 insertions(+), 12 deletions(-) diff --git a/xCAT-server/lib/xcat/plugins/openbmc.pm b/xCAT-server/lib/xcat/plugins/openbmc.pm index 6d28b8a2f..b43e1e8b6 100644 --- a/xCAT-server/lib/xcat/plugins/openbmc.pm +++ b/xCAT-server/lib/xcat/plugins/openbmc.pm @@ -41,7 +41,9 @@ $::BEACON_STATE_ON = "on"; # String constants for rpower states $::POWER_STATE_OFF = "off"; $::POWER_STATE_ON = "on"; +$::POWER_STATE_ON_HOSTOFF = "on (Chassis)"; $::POWER_STATE_POWERING_OFF = "powering-off"; +$::POWER_STATE_POWERING_ON = "powering-on"; $::POWER_STATE_QUIESCED = "quiesced"; $::POWER_STATE_RESET = "reset"; $::POWER_STATE_REBOOT = "reboot"; @@ -418,6 +420,15 @@ sub preprocess_request { } else { $::OPENBMC_FW = $request->{environment}->{XCAT_OPENBMC_FIRMWARE}; } + + # Provide a way to turn on and off transition state processing, default to off + if (ref($request->{environment}) eq 'ARRAY' and ref($request->{environment}->[0]->{XCAT_OPENBMC_POWER_TRANSITION}) eq 'ARRAY') { + $::OPENBMC_PWR = $request->{environment}->[0]->{XCAT_OPENBMC_POWER_TRANSITION}->[0]; + } elsif (ref($request->{environment}) eq 'ARRAY') { + $::OPENBMC_PWR = $request->{environment}->[0]->{XCAT_OPENBMC_POWER_TRANSITION}; + } else { + $::OPENBMC_PWR = $request->{environment}->{XCAT_OPENBMC_POWER_TRANSITION}; + } ############################################## $callback = shift; @@ -1416,6 +1427,7 @@ sub rpower_response { my $node = shift; my $response = shift; my %new_status = (); + my $max_retry_times = 5; my $response_info = decode_json $response->content; @@ -1425,7 +1437,11 @@ sub rpower_response { if ($status_info{RPOWER_ON_RESPONSE}{argv}) { xCAT::SvrUtils::sendmsg("$::POWER_STATE_RESET", $callback, $node); } else { - xCAT::SvrUtils::sendmsg("$::POWER_STATE_ON", $callback, $node); + if (defined($::OPENBMC_PWR) and ($::OPENBMC_PWR eq "YES")) { + xCAT::SvrUtils::sendmsg("$::STATUS_POWERING_ON", $callback, $node); + } else { + xCAT::SvrUtils::sendmsg("$::POWER_STATE_ON", $callback, $node); + } } $new_status{$::STATUS_POWERING_ON} = [$node]; } @@ -1476,30 +1492,44 @@ sub rpower_response { } } - # Print this debug only if testing transition states - print "$node: DEBUG State CurrentBMCState=$bmc_state\n"; - print "$node: DEBUG State RequestedBMCTransition=$bmc_transition_state\n"; - print "$node: DEBUG State CurrentPowerState=$chassis_state\n"; - print "$node: DEBUG State RequestedPowerTransition=$chassis_transition_state\n"; - print "$node: DEBUG State CurrentHostState=$host_state\n"; - print "$node: DEBUG State RequestedHostTransition=$host_transition_state\n"; + if (defined($::OPENBMC_PWR) and ($::OPENBMC_PWR eq "YES")) { + # Print this debug only if testing transition states + print "$node: DEBUG State CurrentBMCState=$bmc_state\n"; + print "$node: DEBUG State RequestedBMCTransition=$bmc_transition_state\n"; + print "$node: DEBUG State CurrentPowerState=$chassis_state\n"; + print "$node: DEBUG State RequestedPowerTransition=$chassis_transition_state\n"; + print "$node: DEBUG State CurrentHostState=$host_state\n"; + print "$node: DEBUG State RequestedHostTransition=$host_transition_state\n"; + } if (defined $status_info{RPOWER_STATUS_RESPONSE}{argv} and $status_info{RPOWER_STATUS_RESPONSE}{argv} =~ /bmcstate$/) { my $bmc_short_state = (split(/\./, $bmc_state))[-1]; xCAT::SvrUtils::sendmsg("BMC $bmc_short_state", $callback, $node); } else { if ($chassis_state =~ /Off$/) { - xCAT::SvrUtils::sendmsg("$::POWER_STATE_OFF", $callback, $node) if (!$next_status{ $node_info{$node}{cur_status} }); + # Chassis state is Off, but check if we can detect transition states + if ((defined($::OPENBMC_PWR) and ($::OPENBMC_PWR eq "YES")) and + $host_state =~ /Off$/ and $host_transition_state =~ /On$/) { + xCAT::SvrUtils::sendmsg("$::POWER_STATE_POWERING_ON", $callback, $node); + } else { + xCAT::SvrUtils::sendmsg("$::POWER_STATE_OFF", $callback, $node) if (!$next_status{ $node_info{$node}{cur_status} }); + } $all_status = $::POWER_STATE_OFF; } elsif ($chassis_state =~ /On$/) { if ($host_state =~ /Off$/) { - xCAT::SvrUtils::sendmsg("$::POWER_STATE_OFF", $callback, $node) if (!$next_status{ $node_info{$node}{cur_status} }); + # This is a debug scenario where the chassis is powered on but hostboot is not + xCAT::SvrUtils::sendmsg("$::POWER_STATE_ON_HOSTOFF", $callback, $node) if (!$next_status{ $node_info{$node}{cur_status} }); $all_status = $::POWER_STATE_OFF; } elsif ($host_state =~ /Quiesced$/) { xCAT::SvrUtils::sendmsg("$::POWER_STATE_QUIESCED", $callback, $node) if (!$next_status{ $node_info{$node}{cur_status} }); $all_status = $::POWER_STATE_ON; } elsif ($host_state =~ /Running$/) { - xCAT::SvrUtils::sendmsg("$::POWER_STATE_ON", $callback, $node) if (!$next_status{ $node_info{$node}{cur_status} }); + if ((defined($::OPENBMC_PWR) and ($::OPENBMC_PWR eq "YES")) and + $host_transition_state =~ /Off$/ and $chassis_state =~ /On$/) { + xCAT::SvrUtils::sendmsg("$::POWER_STATE_POWERING_OFF", $callback, $node); + } else { + xCAT::SvrUtils::sendmsg("$::POWER_STATE_ON", $callback, $node) if (!$next_status{ $node_info{$node}{cur_status} }); + } $all_status = $::POWER_STATE_ON; } else { xCAT::SvrUtils::sendmsg("Unexpected host state=$host_state", $callback, $node) if (!$next_status{ $node_info{$node}{cur_status} }); @@ -1519,7 +1549,7 @@ sub rpower_response { } else { $node_info{$node}{cur_status} = $next_status{ $node_info{$node}{cur_status} }{ON}; $node_info{$node}{retry_times}++; - if ($node_info{$node}{retry_times} >= 5) { + if ($node_info{$node}{retry_times} >= $max_retry_times) { xCAT::SvrUtils::sendmsg("Internal Error, failed to rpower off, please try again", $callback, $node); $node_info{$node}{cur_status} = ""; $wait_node_num--;