From 1c43c11c8323e10e4fc5d93ae1abca4d1bda700d Mon Sep 17 00:00:00 2001 From: Victor Hu Date: Wed, 27 Sep 2017 15:40:37 -0400 Subject: [PATCH 1/5] Add transition state codes to rpower, this only works when softoff is used as transition states is not accurate on a hard power off --- xCAT-server/lib/xcat/plugins/openbmc.pm | 35 ++++++++++++++++++------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/xCAT-server/lib/xcat/plugins/openbmc.pm b/xCAT-server/lib/xcat/plugins/openbmc.pm index ec43a3ab7..97b2c9e76 100644 --- a/xCAT-server/lib/xcat/plugins/openbmc.pm +++ b/xCAT-server/lib/xcat/plugins/openbmc.pm @@ -241,6 +241,9 @@ my %status_info = ( init_url => "$openbmc_project_url/state/host0/attr/RequestedHostTransition", data => "xyz.openbmc_project.State.Host.Transition.Off", }, + RPOWER_SOFTOFF_RESPONSE => { + process => \&rpower_response, + }, RPOWER_RESET_RESPONSE => { process => \&rpower_response, }, @@ -715,7 +718,7 @@ sub parse_command_status { $next_status{RPOWER_OFF_REQUEST} = "RPOWER_OFF_RESPONSE"; } elsif ($subcommand eq "softoff") { $next_status{LOGIN_RESPONSE} = "RPOWER_SOFTOFF_REQUEST"; - $next_status{RPOWER_SOFTOFF_REQUEST} = "RPOWER_OFF_RESPONSE"; + $next_status{RPOWER_SOFTOFF_REQUEST} = "RPOWER_SOFTOFF_RESPONSE"; } elsif ($subcommand eq "reset") { $next_status{LOGIN_RESPONSE} = "RPOWER_STATUS_REQUEST"; $next_status{RPOWER_STATUS_REQUEST} = "RPOWER_STATUS_RESPONSE"; @@ -1288,9 +1291,13 @@ sub rpower_response { } } - if ($node_info{$node}{cur_status} eq "RPOWER_OFF_RESPONSE") { + if ($node_info{$node}{cur_status} =~ /^RPOWER_OFF_RESPONSE$|^RPOWER_SOFTOFF_RESPONSE$/) { if ($response_info->{'message'} eq $::RESPONSE_OK) { - xCAT::SvrUtils::sendmsg("$::POWER_STATE_OFF", $callback, $node) if (!$next_status{ $node_info{$node}{cur_status} }); + my $power_state = "$::POWER_STATE_OFF"; + if ($node_info{$node}{cur_status} eq "RPOWER_SOFTOFF_RESPONSE") { + $power_state = "$::POWER_STATE_POWERING_OFF"; + } + xCAT::SvrUtils::sendmsg("$power_state", $callback, $node) if (!$next_status{ $node_info{$node}{cur_status} }); $new_status{$::STATUS_POWERING_OFF} = [$node]; } } @@ -1329,12 +1336,24 @@ sub rpower_response { } } + 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} }); + # Transition states + if ($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$/) { @@ -1353,11 +1372,9 @@ sub rpower_response { $all_status = $::POWER_STATE_ON; } elsif ($host_state =~ /Running$/) { # State is on, but check if it is transitioning - if ($host_transition_state =~ /Off$/) { - #xCAT::SvrUtils::sendmsg("$::POWER_STATE_POWERING_OFF", $callback, $node); - # ignore transition state until get stable firmware - xCAT::SvrUtils::sendmsg("$::POWER_STATE_ON", $callback, $node) if (!$next_status{ $node_info{$node}{cur_status} }); - $all_status = $::POWER_STATE_ON; + if ($host_transition_state =~ /Off$/ and $chassis_state =~ /On$/) { + xCAT::SvrUtils::sendmsg("$::POWER_STATE_POWERING_OFF", $callback, $node); + $all_status = $::POWER_STATE_POWERING_OFF; } else { xCAT::SvrUtils::sendmsg("$::POWER_STATE_ON", $callback, $node) if (!$next_status{ $node_info{$node}{cur_status} }); $all_status = $::POWER_STATE_ON; From 78ef2e752e5d0b618924cefdf3fb5164f0ab5cc4 Mon Sep 17 00:00:00 2001 From: Victor Hu Date: Tue, 3 Oct 2017 16:41:29 -0400 Subject: [PATCH 2/5] Add a env variable XCAT_OPENBMC_POWER_TRANSITION=YES, that can be used to turn on and off transition mode --- xCAT-server/lib/xcat/plugins/openbmc.pm | 37 ++++++++++++++++--------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/xCAT-server/lib/xcat/plugins/openbmc.pm b/xCAT-server/lib/xcat/plugins/openbmc.pm index 97b2c9e76..0472b7294 100644 --- a/xCAT-server/lib/xcat/plugins/openbmc.pm +++ b/xCAT-server/lib/xcat/plugins/openbmc.pm @@ -391,6 +391,14 @@ sub preprocess_request { $::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; @@ -1336,19 +1344,22 @@ sub rpower_response { } } - 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$/) { - # Transition states + # Chassis state is Off, but check if we can detect transition states if ($host_state =~ /Off$/ and $host_transition_state =~ /On$/) { xCAT::SvrUtils::sendmsg("$::POWER_STATE_POWERING_ON", $callback, $node); } else { @@ -1357,10 +1368,9 @@ sub rpower_response { $all_status = $::POWER_STATE_OFF; } elsif ($chassis_state =~ /On$/) { if ($host_state =~ /Off$/) { - # State is off, but check if it is transitioning - if ($host_transition_state =~ /On$/) { - #xCAT::SvrUtils::sendmsg("$::POWER_STATE_POWERING_ON", $callback, $node); - # ignore transition state until get stable firmware + # Host State is Off, but if requested, check transition states + if ((defined($::OPENBMC_PWR) and ($::OPENBMC_PWR eq "YES")) and + $host_transition_state =~ /On$/) { xCAT::SvrUtils::sendmsg("$::POWER_STATE_OFF", $callback, $node) if (!$next_status{ $node_info{$node}{cur_status} }); $all_status = $::POWER_STATE_OFF; } else { @@ -1371,8 +1381,9 @@ sub rpower_response { 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$/) { - # State is on, but check if it is transitioning - if ($host_transition_state =~ /Off$/ and $chassis_state =~ /On$/) { + # Host State is Running (On), but if requested, check transition states + 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); $all_status = $::POWER_STATE_POWERING_OFF; } else { From 5b6074c9b490047169729b8aea1816f0a6b0be16 Mon Sep 17 00:00:00 2001 From: Victor Hu Date: Wed, 4 Oct 2017 10:00:54 -0400 Subject: [PATCH 3/5] Add support for OpenBMC to show power state where host is not booted --- xCAT-server/lib/xcat/plugins/openbmc.pm | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/xCAT-server/lib/xcat/plugins/openbmc.pm b/xCAT-server/lib/xcat/plugins/openbmc.pm index 0472b7294..a516c1a63 100644 --- a/xCAT-server/lib/xcat/plugins/openbmc.pm +++ b/xCAT-server/lib/xcat/plugins/openbmc.pm @@ -37,6 +37,7 @@ $::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"; @@ -1368,15 +1369,9 @@ sub rpower_response { $all_status = $::POWER_STATE_OFF; } elsif ($chassis_state =~ /On$/) { if ($host_state =~ /Off$/) { - # Host State is Off, but if requested, check transition states - if ((defined($::OPENBMC_PWR) and ($::OPENBMC_PWR eq "YES")) and - $host_transition_state =~ /On$/) { - xCAT::SvrUtils::sendmsg("$::POWER_STATE_OFF", $callback, $node) if (!$next_status{ $node_info{$node}{cur_status} }); - $all_status = $::POWER_STATE_OFF; - } else { - xCAT::SvrUtils::sendmsg("$::POWER_STATE_OFF", $callback, $node) if (!$next_status{ $node_info{$node}{cur_status} }); - $all_status = $::POWER_STATE_OFF; - } + # 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_ON_HOSTOFF; } 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; From 0026daf6d7d06c5d31ea6aa2e3869cdc4045bf00 Mon Sep 17 00:00:00 2001 From: Victor Hu Date: Wed, 4 Oct 2017 15:12:47 -0400 Subject: [PATCH 4/5] Change the state to powering-on, if transition states is requested --- xCAT-server/lib/xcat/plugins/openbmc.pm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/xCAT-server/lib/xcat/plugins/openbmc.pm b/xCAT-server/lib/xcat/plugins/openbmc.pm index a516c1a63..70707ac9f 100644 --- a/xCAT-server/lib/xcat/plugins/openbmc.pm +++ b/xCAT-server/lib/xcat/plugins/openbmc.pm @@ -1294,7 +1294,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]; } From afd1762417984f892ca7ccae22033488dac6ec20 Mon Sep 17 00:00:00 2001 From: Victor Hu Date: Wed, 4 Oct 2017 15:58:37 -0400 Subject: [PATCH 5/5] Fix another location where the OPENBMC_PWR needs to be checked before printing transition state --- xCAT-server/lib/xcat/plugins/openbmc.pm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xCAT-server/lib/xcat/plugins/openbmc.pm b/xCAT-server/lib/xcat/plugins/openbmc.pm index 70707ac9f..1e72427e9 100644 --- a/xCAT-server/lib/xcat/plugins/openbmc.pm +++ b/xCAT-server/lib/xcat/plugins/openbmc.pm @@ -1365,7 +1365,8 @@ sub rpower_response { } else { if ($chassis_state =~ /Off$/) { # Chassis state is Off, but check if we can detect transition states - if ($host_state =~ /Off$/ and $host_transition_state =~ /On$/) { + 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} });