1*** Settings *** 2Documentation Update the BMC code on a target BMC via Redifsh. 3 4# Test Parameters: 5# IMAGE_FILE_PATH The path to the BMC image file. 6# 7# Firmware update states: 8# Enabled Image is installed and either functional or active. 9# Disabled Image installation failed or ready for activation. 10# Updating Image installation currently in progress. 11 12Resource ../../lib/resource.robot 13Resource ../../lib/bmc_redfish_resource.robot 14Resource ../../lib/openbmc_ffdc.robot 15Resource ../../lib/common_utils.robot 16Resource ../../lib/code_update_utils.robot 17Resource ../../lib/redfish_code_update_utils.robot 18Resource ../../lib/utils.robot 19Library ../../lib/gen_robot_valid.py 20Library ../../lib/var_funcs.py 21Library ../../lib/gen_robot_keyword.py 22Library ../../lib/code_update_utils.py 23 24Suite Setup Suite Setup Execution 25Suite Teardown Redfish.Logout 26Test Setup Printn 27Test Teardown FFDC On Test Case Fail 28 29# Force the test to timedout to prevent test hanging. 30Test Timeout 30 minutes 31 32Force Tags BMC_Code_Update 33 34*** Variables *** 35 36${FORCE_UPDATE} ${0} 37${LOOP_COUNT} 20 38 39*** Test Cases *** 40 41Redfish BMC Code Update 42 [Documentation] Update the firmware image. 43 [Tags] Redfish_BMC_Code_Update 44 45 ${image_version}= Get Version Tar ${IMAGE_FILE_PATH} 46 Rprint Vars image_version 47 48 ${bmc_release_info}= Get BMC Release Info 49 ${functional_version}= Set Variable ${bmc_release_info['version_id']} 50 Rprint Vars functional_version 51 52 ${post_code_update_actions}= Get Post Boot Action 53 ${state}= Get Pre Reboot State 54 Rprint Vars state 55 56 # Check if the existing firmware is functional. 57 Pass Execution If '${functional_version}' == '${image_version}' 58 ... The existing ${image_version} firmware is already functional. 59 60 ${sw_inv}= Get Functional Firmware BMC image 61 ${nonfunctional_sw_inv}= Get Non Functional Firmware ${sw_inv} False 62 63 # Redfish active software image API. 64 Run Keyword If not ${FORCE_UPDATE} 65 ... Run Keyword If '${nonfunctional_sw_inv['version']}' == '${image_version}' 66 ... Run Keywords Switch Backup Firmware Image To Functional AND 67 ... Wait For Reboot start_boot_seconds=${state['epoch_seconds']} AND 68 ... Redfish Verify BMC Version ${IMAGE_FILE_PATH} AND 69 ... Pass Execution The firmware ${image_version} is backup image. 70 71 # Firmware inventory record of the given image version. 72 ${image_info}= Get Software Inventory State By Version ${image_version} 73 74 ${image_info_len}= Get Length ${image_info} 75 76 # REST delete the image to fresh code update for a given same image object 77 # which is already ACTIVE but on the alternate side. Irrespective of when 78 # REST is disabled in near future or the below operation fails, is purely 79 # done to give a chance. 80 81 Run Keyword If '${image_info_len}' != 0 82 ... Run Keywords Print Timen 83 ... The ${image_version} version is installed but not functional, try delete and continue firmware update. 84 ... AND 85 ... Run Keyword And Ignore Error 86 ... Delete Software Object /xyz/openbmc_project/software/${image_info['image_id']} 87 88 Redfish Update Firmware 89 90 91Redfish Firmware Update Loop 92 [Documentation] Update the firmware image in loop. 93 [Tags] Redfish_Firmware_Update_Loop 94 [Template] Redfish Firmware Update In Loop 95 96 ${LOOP_COUNT} 97 98 99*** Keywords *** 100 101Suite Setup Execution 102 [Documentation] Do the suite setup. 103 104 Redfish.Login 105 # Delete BMC dump and Error logs. 106 Run Keyword And Ignore Error Delete All BMC Dump 107 Run Keyword And Ignore Error Redfish Delete All BMC Dumps 108 Run Keyword And Ignore Error Redfish Purge Event Log 109 # Checking for file existence. 110 Valid File Path IMAGE_FILE_PATH 111 112 113Redfish Firmware Update In Loop 114 [Documentation] Update the firmware in loop. 115 [Arguments] ${update_loop_count} 116 117 # Description of argument(s): 118 # update_loop_count This value is used to run the firmware update in loop. 119 120 ${before_image_state}= Get BMC Functional Firmware 121 ${temp_update_loop_count}= Evaluate ${update_loop_count} + 1 122 123 FOR ${count} IN RANGE 1 ${temp_update_loop_count} 124 Print Timen ************************************** 125 Print Timen * The Current Loop Count is ${count} of ${update_loop_count} * 126 Print Timen ************************************** 127 Redfish Update Firmware 128 ${sw_inv}= Get Functional Firmware BMC update 129 ${nonfunctional_sw_inv}= Get Non Functional Firmware ${sw_inv} False 130 Run Keyword If ${nonfunctional_sw_inv['functional']} == False 131 ... Set BMC Image Priority To Least ${nonfunctional_sw_inv['version']} ${nonfunctional_sw_inv} 132 Redfish.Login 133 ${sw_inv}= Get Functional Firmware BMC update 134 ${nonfunctional_sw_inv}= Get Non Functional Firmware ${sw_inv} False 135 Delete BMC Image 136 END 137 138 ${after_image_state}= Get BMC Functional Firmware 139 Valid Value before_image_state["version"] ['${after_image_state["version"]}'] 140 141 142Delete BMC Image 143 [Documentation] Delete a BMC image from the BMC flash chip. 144 145 ${software_object}= Get Non Running BMC Software Object 146 Delete Image And Verify ${software_object} ${VERSION_PURPOSE_BMC} 147 148 149Activate Existing Firmware 150 [Documentation] Set firmware image to lower priority. 151 [Arguments] ${image_version} 152 153 # Description of argument(s): 154 # image_version Version of image. 155 156 ${software_inventory_record}= Get Software Inventory State By Version 157 ... ${image_version} 158 ${num_keys}= Get Length ${software_inventory_record} 159 160 Rprint Vars software_inventory_record 161 162 # If no software inventory record was found, there is no existing 163 # firmware for the given version and therefore no action to be taken. 164 Return From Keyword If not ${num_keys} 165 166 # Check if the existing firmware is functional. 167 Pass Execution If ${software_inventory_record['functional']} 168 ... The existing ${image_version} firmware is already functional. 169 170 # If existing firmware is not functional, then set the priority to least. 171 Print Timen The existing ${image_version} firmware is not yet functional. 172 Set BMC Image Priority To Least ${image_version} ${software_inventory_record} 173 174 Pass Execution The existing ${image_version} firmware is now functional. 175 176 177Get Image Priority 178 [Documentation] Get Current Image Priority. 179 [Arguments] ${image_version} 180 181 # Description of argument(s): 182 # image_version The Firmware image version (e.g. 2.8.0-dev-1107-g512028d95). 183 184 ${software_info}= Read Properties 185 ... ${SOFTWARE_VERSION_URI}/enumerate quiet=1 186 # Get only the record associated with our image_version. 187 188 ${software_info}= Filter Struct 189 ... ${software_info} [('Version', '${image_version}')] 190 # Convert from dict to list. 191 ${software_info}= Get Dictionary Values ${software_info} 192 193 [Return] ${software_info[0]['Priority']} 194 195 196Set BMC Image Priority To Least 197 [Documentation] Set BMC image priority to least value. 198 [Arguments] ${image_version} ${software_inventory} 199 200 # Description of argument(s): 201 # image_version The Firmware image version (e.g. 2.8.0-dev-1107-g512028d95). 202 # software_inventory Software inventory details. 203 204 ${least_priority}= Get Least Value Priority Image ${VERSION_PURPOSE_BMC} 205 ${cur_priority}= Get Image Priority ${image_version} 206 Rprint Vars least_priority cur_priority 207 208 Return From Keyword If '${least_priority}' == ${cur_priority} 209 Set Host Software Property 210 ... ${SOFTWARE_VERSION_URI}${software_inventory['image_id']} 211 ... Priority ${least_priority} 212 213 Redfish OBMC Reboot (off) 214 215 216Redfish Update Firmware 217 [Documentation] Update the BMC firmware via redfish interface. 218 219 ${post_code_update_actions}= Get Post Boot Action 220 ${state}= Get Pre Reboot State 221 Rprint Vars state 222 Run Keyword And Ignore Error Set ApplyTime policy=OnReset 223 Redfish Upload Image And Check Progress State 224 ${tar_version}= Get Version Tar ${IMAGE_FILE_PATH} 225 ${image_info}= Get Software Inventory State By Version ${tar_version} 226 Run Key ${post_code_update_actions['${image_info["image_type"]}']['OnReset']} 227 Redfish.Login 228 Redfish Verify BMC Version ${IMAGE_FILE_PATH} 229 230