blob: fafc3c57669b4916844b4e64ba5ef3568fb410f5 [file] [log] [blame]
*** Settings ***
Documentation Update the BMC code on a target BMC via Redifsh.
# Test Parameters:
# IMAGE_FILE_PATH The path to the BMC image file.
#
# Firmware update states:
# Enabled Image is installed and either functional or active.
# Disabled Image installation failed or ready for activation.
# Updating Image installation currently in progress.
Resource ../../lib/resource.robot
Resource ../../lib/bmc_redfish_resource.robot
Resource ../../lib/openbmc_ffdc.robot
Resource ../../lib/common_utils.robot
Resource ../../lib/code_update_utils.robot
Resource ../../lib/redfish_code_update_utils.robot
Resource ../../lib/utils.robot
Library ../../lib/gen_robot_valid.py
Library ../../lib/var_funcs.py
Library ../../lib/gen_robot_keyword.py
Library ../../lib/code_update_utils.py
Suite Setup Suite Setup Execution
Suite Teardown Redfish.Logout
Test Setup Printn
Test Teardown FFDC On Test Case Fail
# Force the test to timedout to prevent test hanging.
Test Timeout 30 minutes
Force Tags BMC_Code_Update
*** Variables ***
${FORCE_UPDATE} ${0}
${LOOP_COUNT} 20
*** Test Cases ***
Redfish BMC Code Update
[Documentation] Update the firmware image.
[Tags] Redfish_BMC_Code_Update
${image_version}= Get Version Tar ${IMAGE_FILE_PATH}
Rprint Vars image_version
${bmc_release_info}= Get BMC Release Info
${functional_version}= Set Variable ${bmc_release_info['version_id']}
Rprint Vars functional_version
${post_code_update_actions}= Get Post Boot Action
${state}= Get Pre Reboot State
Rprint Vars state
# Check if the existing firmware is functional.
Pass Execution If '${functional_version}' == '${image_version}'
... The existing ${image_version} firmware is already functional.
${sw_inv}= Get Functional Firmware BMC image
${nonfunctional_sw_inv}= Get Non Functional Firmware ${sw_inv} False
# Redfish active software image API.
Run Keyword If not ${FORCE_UPDATE}
... Run Keyword If '${nonfunctional_sw_inv['version']}' == '${image_version}'
... Run Keywords Switch Backup Firmware Image To Functional AND
... Wait For Reboot start_boot_seconds=${state['epoch_seconds']} AND
... Redfish Verify BMC Version ${IMAGE_FILE_PATH} AND
... Pass Execution The firmware ${image_version} is backup image.
# Firmware inventory record of the given image version.
${image_info}= Get Software Inventory State By Version ${image_version}
${image_info_len}= Get Length ${image_info}
# REST delete the image to fresh code update for a given same image object
# which is already ACTIVE but on the alternate side. Irrespective of when
# REST is disabled in near future or the below operation fails, is purely
# done to give a chance.
Run Keyword If '${image_info_len}' != 0
... Run Keywords Print Timen
... The ${image_version} version is installed but not functional, try delete and continue firmware update.
... AND
... Run Keyword And Ignore Error
... Delete Software Object /xyz/openbmc_project/software/${image_info['image_id']}
Redfish Update Firmware
Redfish Firmware Update Loop
[Documentation] Update the firmware image in loop.
[Tags] Redfish_Firmware_Update_Loop
[Template] Redfish Firmware Update In Loop
${LOOP_COUNT}
*** Keywords ***
Suite Setup Execution
[Documentation] Do the suite setup.
Redfish.Login
# Delete BMC dump and Error logs.
Run Keyword And Ignore Error Delete All BMC Dump
Run Keyword And Ignore Error Redfish Delete All BMC Dumps
Run Keyword And Ignore Error Redfish Purge Event Log
# Checking for file existence.
Valid File Path IMAGE_FILE_PATH
Redfish Firmware Update In Loop
[Documentation] Update the firmware in loop.
[Arguments] ${update_loop_count}
# Description of argument(s):
# update_loop_count This value is used to run the firmware update in loop.
${before_image_state}= Get BMC Functional Firmware
${temp_update_loop_count}= Evaluate ${update_loop_count} + 1
FOR ${count} IN RANGE 1 ${temp_update_loop_count}
Print Timen **************************************
Print Timen * The Current Loop Count is ${count} of ${update_loop_count} *
Print Timen **************************************
Redfish Update Firmware
${sw_inv}= Get Functional Firmware BMC update
${nonfunctional_sw_inv}= Get Non Functional Firmware ${sw_inv} False
Run Keyword If ${nonfunctional_sw_inv['functional']} == False
... Set BMC Image Priority To Least ${nonfunctional_sw_inv['version']} ${nonfunctional_sw_inv}
Redfish.Login
${sw_inv}= Get Functional Firmware BMC update
${nonfunctional_sw_inv}= Get Non Functional Firmware ${sw_inv} False
Delete BMC Image
END
${after_image_state}= Get BMC Functional Firmware
Valid Value before_image_state["version"] ['${after_image_state["version"]}']
Delete BMC Image
[Documentation] Delete a BMC image from the BMC flash chip.
${software_object}= Get Non Running BMC Software Object
Delete Image And Verify ${software_object} ${VERSION_PURPOSE_BMC}
Activate Existing Firmware
[Documentation] Set firmware image to lower priority.
[Arguments] ${image_version}
# Description of argument(s):
# image_version Version of image.
${software_inventory_record}= Get Software Inventory State By Version
... ${image_version}
${num_keys}= Get Length ${software_inventory_record}
Rprint Vars software_inventory_record
# If no software inventory record was found, there is no existing
# firmware for the given version and therefore no action to be taken.
Return From Keyword If not ${num_keys}
# Check if the existing firmware is functional.
Pass Execution If ${software_inventory_record['functional']}
... The existing ${image_version} firmware is already functional.
# If existing firmware is not functional, then set the priority to least.
Print Timen The existing ${image_version} firmware is not yet functional.
Set BMC Image Priority To Least ${image_version} ${software_inventory_record}
Pass Execution The existing ${image_version} firmware is now functional.
Get Image Priority
[Documentation] Get Current Image Priority.
[Arguments] ${image_version}
# Description of argument(s):
# image_version The Firmware image version (e.g. 2.8.0-dev-1107-g512028d95).
${software_info}= Read Properties
... ${SOFTWARE_VERSION_URI}/enumerate quiet=1
# Get only the record associated with our image_version.
${software_info}= Filter Struct
... ${software_info} [('Version', '${image_version}')]
# Convert from dict to list.
${software_info}= Get Dictionary Values ${software_info}
[Return] ${software_info[0]['Priority']}
Set BMC Image Priority To Least
[Documentation] Set BMC image priority to least value.
[Arguments] ${image_version} ${software_inventory}
# Description of argument(s):
# image_version The Firmware image version (e.g. 2.8.0-dev-1107-g512028d95).
# software_inventory Software inventory details.
${least_priority}= Get Least Value Priority Image ${VERSION_PURPOSE_BMC}
${cur_priority}= Get Image Priority ${image_version}
Rprint Vars least_priority cur_priority
Return From Keyword If '${least_priority}' == ${cur_priority}
Set Host Software Property
... ${SOFTWARE_VERSION_URI}${software_inventory['image_id']}
... Priority ${least_priority}
Redfish OBMC Reboot (off)
Redfish Update Firmware
[Documentation] Update the BMC firmware via redfish interface.
${post_code_update_actions}= Get Post Boot Action
${state}= Get Pre Reboot State
Rprint Vars state
Run Keyword And Ignore Error Set ApplyTime policy=OnReset
Redfish Upload Image And Check Progress State
${tar_version}= Get Version Tar ${IMAGE_FILE_PATH}
${image_info}= Get Software Inventory State By Version ${tar_version}
Run Key ${post_code_update_actions['${image_info["image_type"]}']['OnReset']}
Redfish.Login
Redfish Verify BMC Version ${IMAGE_FILE_PATH}