mirror of
https://github.com/xcat2/xcat-core.git
synced 2026-03-27 20:33:29 +00:00
Merge pull request #4051 from whowutwut/rflash_error_failed
[OpenBMC] Enhance ERROR checking on the rflash code if the upload step does not succeed
This commit is contained in:
@@ -45,6 +45,8 @@ $::POWER_STATE_REBOOT = "reboot";
|
||||
$::UPLOAD_FILE = "";
|
||||
$::UPLOAD_FILE_VERSION = "";
|
||||
$::RSETBOOT_URL_PATH = "boot";
|
||||
# To improve the output to users, store this value as a global
|
||||
$::UPLOAD_AND_ACTIVATE = 0;
|
||||
|
||||
$::NO_ATTRIBUTES_RETURNED = "No attributes returned from the BMC.";
|
||||
|
||||
@@ -910,7 +912,6 @@ sub parse_command_status {
|
||||
my $upload = 0;
|
||||
my $activate = 0;
|
||||
my $update_file;
|
||||
my $upload_and_activate = 0;
|
||||
|
||||
foreach $subcommand (@$subcommands) {
|
||||
if ($subcommand =~ /-c|--check/) {
|
||||
@@ -953,11 +954,11 @@ sub parse_command_status {
|
||||
if ($activate) {
|
||||
# Activate flag was specified together with a update file. We want to
|
||||
# upload the file and activate it.
|
||||
$upload_and_activate = 1;
|
||||
$::UPLOAD_AND_ACTIVATE = 1;
|
||||
$activate = 0;
|
||||
}
|
||||
|
||||
if ($check_version | $upload_and_activate) {
|
||||
if ($check_version | $::UPLOAD_AND_ACTIVATE) {
|
||||
# Extract Host version for the update file
|
||||
my $firmware_version_in_file = `$grep_cmd $version_tag $::UPLOAD_FILE`;
|
||||
my $purpose_version_in_file = `$grep_cmd $purpose_tag $::UPLOAD_FILE`;
|
||||
@@ -1020,12 +1021,16 @@ sub parse_command_status {
|
||||
$next_status{"RFLASH_SET_PRIORITY_REQUEST"} = "RFLASH_SET_PRIORITY_RESPONSE";
|
||||
$next_status{"RFLASH_SET_PRIORITY_RESPONSE"} = "RFLASH_UPDATE_CHECK_STATE_REQUEST";
|
||||
}
|
||||
if ($upload_and_activate) {
|
||||
if ($::UPLOAD_AND_ACTIVATE) {
|
||||
# Upload specified update file to BMC
|
||||
$next_status{LOGIN_RESPONSE} = "RFLASH_FILE_UPLOAD_REQUEST";
|
||||
$next_status{"RFLASH_FILE_UPLOAD_REQUEST"} = "RFLASH_FILE_UPLOAD_RESPONSE";
|
||||
$next_status{"RFLASH_FILE_UPLOAD_RESPONSE"} = "RFLASH_UPDATE_CHECK_ID_REQUEST";
|
||||
$next_status{"RFLASH_UPDATE_CHECK_ID_REQUEST"} = "RFLASH_UPDATE_CHECK_ID_RESPONSE";
|
||||
#
|
||||
# This code is different from the "activate" flow above because the CHECK_ID_RESPONSE contains
|
||||
# the activation flow after we successfully obtain the ID for the firmware piece that was uploaded.
|
||||
#
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2048,10 +2053,14 @@ sub rflash_response {
|
||||
xCAT::SvrUtils::sendmsg("", $callback, $node); #Separate output in case more than 1 endpoint
|
||||
}
|
||||
if ($node_info{$node}{cur_status} eq "RFLASH_FILE_UPLOAD_RESPONSE") {
|
||||
# Special processing for file upload. At this point we do not know how to
|
||||
# form a proper file upload request. It always fails with "Method not allowed" error.
|
||||
# If that happens, just call the curl commands for now.
|
||||
# TODO remove this block when proper request can be generated
|
||||
#
|
||||
# Special processing for file upload
|
||||
#
|
||||
# Unable to form a proper file upload request to the BMC, it fails with: 405 Method Not Allowed
|
||||
# For now, always upload using curl commands.
|
||||
#
|
||||
# TODO: Remove this block when proper request can be generated
|
||||
#
|
||||
if ($::UPLOAD_FILE) {
|
||||
my $request_url = "$http_protocol://" . $node_info{$node}{bmc};
|
||||
my $content_login = '{ "data": [ "' . $node_info{$node}{username} .'", "' . $node_info{$node}{password} . '" ] }';
|
||||
@@ -2068,11 +2077,19 @@ sub rflash_response {
|
||||
if ($h->{message} eq $::RESPONSE_OK) {
|
||||
# Login successfull, upload the file
|
||||
xCAT::SvrUtils::sendmsg("Uploading $::UPLOAD_FILE ...", $callback, $node);
|
||||
if ($xcatdebugmode) {
|
||||
my $debugmsg = "RFLASH_FILE_UPLOAD_RESPONSE: CMD: $curl_upload_cmd";
|
||||
process_debug_info($node, $debugmsg);
|
||||
}
|
||||
my $curl_upload_result = `$curl_upload_cmd`;
|
||||
$h = from_json($curl_upload_result); # convert command output to hash
|
||||
if ($h->{message} eq $::RESPONSE_OK) {
|
||||
# Upload successfull
|
||||
xCAT::SvrUtils::sendmsg("Successful, use -l option to list.", $callback, $node);
|
||||
# Upload successful, display message
|
||||
if ($::UPLOAD_AND_ACTIVATE) {
|
||||
xCAT::SvrUtils::sendmsg("Upload successful. Attempting to activate firmware: $::UPLOAD_FILE_VERSION", $callback, $node);
|
||||
} else {
|
||||
xCAT::SvrUtils::sendmsg("Successful, use -l option to list.", $callback, $node);
|
||||
}
|
||||
# Try to logoff, no need to check result, as there is nothing else to do if failure
|
||||
my $curl_logout_result = `$curl_logout_cmd`;
|
||||
}
|
||||
@@ -2141,7 +2158,13 @@ sub rflash_response {
|
||||
my $activation_state;
|
||||
my $progress_state;
|
||||
my $priority_state;
|
||||
my $found_match = 0;
|
||||
my $debugmsg;
|
||||
|
||||
if ($xcatdebugmode) {
|
||||
$debugmsg = "CHECK_ID_RESPONSE: Looking for software ID: $::UPLOAD_FILE_VERSION...";
|
||||
process_debug_info($node, $debugmsg);
|
||||
}
|
||||
# Look through all the software entries and find the id of the one that matches
|
||||
# the version of the uploaded file. Once found, set up request/response hash entries
|
||||
# to activate that image.
|
||||
@@ -2151,7 +2174,12 @@ sub rflash_response {
|
||||
$update_id = (split(/\//, $key_url))[ -1 ];
|
||||
if (defined($content{Version}) and $content{Version}) {
|
||||
$update_version = $content{Version};
|
||||
if ($xcatdebugmode) {
|
||||
$debugmsg = "CHECK_ID_RESPONSE: key_url=$key_url version=$update_version";
|
||||
process_debug_info($node, $debugmsg);
|
||||
}
|
||||
if ($update_version eq $::UPLOAD_FILE_VERSION) {
|
||||
$found_match = 1;
|
||||
# Found a match of uploaded file version with the image in software/enumerate
|
||||
|
||||
# Set the image id for the activation request
|
||||
@@ -2174,6 +2202,9 @@ sub rflash_response {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!$found_match) {
|
||||
xCAT::SvrUtils::sendmsg([1,"Could not find firmware $::UPLOAD_FILE_VERSION to activate."], $callback, $node);
|
||||
}
|
||||
}
|
||||
|
||||
if ($node_info{$node}{cur_status} eq "RFLASH_DELETE_IMAGE_RESPONSE") {
|
||||
|
||||
Reference in New Issue
Block a user