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 ${num_records} > 0 66 ... Run Keyword If '${nonfunctional_sw_inv['version']}' == '${image_version}' 67 ... Run Keywords Switch Backup Firmware Image To Functional AND 68 ... Wait For Reboot start_boot_seconds=${state['epoch_seconds']} AND 69 ... Redfish Verify BMC Version ${IMAGE_FILE_PATH} AND 70 ... Pass Execution The firmware ${image_version} is backup image. 71 72 # Firmware inventory record of the given image version. 73 ${image_info}= Get Software Inventory State By Version ${image_version} 74 75 ${image_info_len}= Get Length ${image_info} 76 77 # REST delete the image to fresh code update for a given same image object 78 # which is already ACTIVE but on the alternate side. Irrespective of when 79 # REST is disabled in near future or the below operation fails, is purely 80 # done to give a chance. 81 82 Run Keyword If '${image_info_len}' != 0 83 ... Run Keywords Print Timen 84 ... The ${image_version} version is installed but not functional, delete and continue update. 85 ... AND 86 ... Run Keyword And Ignore Error 87 ... Delete Software Object /xyz/openbmc_project/software/${image_info['image_id']} 88 89 Redfish Update Firmware 90 91 92Redfish Firmware Update Loop 93 [Documentation] Update the firmware image in loop. 94 [Tags] Redfish_Firmware_Update_Loop 95 [Template] Redfish Firmware Update In Loop 96 97 ${LOOP_COUNT} 98 99 100*** Keywords *** 101 102Suite Setup Execution 103 [Documentation] Do the suite setup. 104 105 Redfish.Login 106 # Delete BMC dump and Error logs. 107 Run Keyword And Ignore Error Delete All BMC Dump 108 Run Keyword And Ignore Error Redfish Delete All BMC Dumps 109 Run Keyword And Ignore Error Redfish Purge Event Log 110 # Checking for file existence. 111 Valid File Path IMAGE_FILE_PATH 112 113 114Redfish Firmware Update In Loop 115 [Documentation] Update the firmware in loop. 116 [Arguments] ${update_loop_count} 117 118 # Description of argument(s): 119 # update_loop_count This value is used to run the firmware update in loop. 120 121 ${before_image_state}= Get BMC Functional Firmware 122 ${temp_update_loop_count}= Evaluate ${update_loop_count} + 1 123 124 FOR ${count} IN RANGE 1 ${temp_update_loop_count} 125 Print Timen ************************************** 126 Print Timen * The Current Loop Count is ${count} of ${update_loop_count} * 127 Print Timen ************************************** 128 Redfish Update Firmware 129 ${sw_inv}= Get Functional Firmware BMC update 130 ${nonfunctional_sw_inv}= Get Non Functional Firmware ${sw_inv} False 131 Run Keyword If ${nonfunctional_sw_inv['functional']} == False 132 ... Set BMC Image Priority To Least ${nonfunctional_sw_inv['version']} ${nonfunctional_sw_inv} 133 Redfish.Login 134 ${sw_inv}= Get Functional Firmware BMC update 135 ${nonfunctional_sw_inv}= Get Non Functional Firmware ${sw_inv} False 136 Delete BMC Image 137 END 138 139 ${after_image_state}= Get BMC Functional Firmware 140 Valid Value before_image_state["version"] ['${after_image_state["version"]}'] 141 142 143Delete BMC Image 144 [Documentation] Delete a BMC image from the BMC flash chip. 145 146 ${software_object}= Get Non Running BMC Software Object 147 Delete Image And Verify ${software_object} ${VERSION_PURPOSE_BMC} 148 149 150Activate Existing Firmware 151 [Documentation] Set firmware image to lower priority. 152 [Arguments] ${image_version} 153 154 # Description of argument(s): 155 # image_version Version of image. 156 157 ${software_inventory_record}= Get Software Inventory State By Version 158 ... ${image_version} 159 ${num_keys}= Get Length ${software_inventory_record} 160 161 Rprint Vars software_inventory_record 162 163 # If no software inventory record was found, there is no existing 164 # firmware for the given version and therefore no action to be taken. 165 Return From Keyword If not ${num_keys} 166 167 # Check if the existing firmware is functional. 168 Pass Execution If ${software_inventory_record['functional']} 169 ... The existing ${image_version} firmware is already functional. 170 171 # If existing firmware is not functional, then set the priority to least. 172 Print Timen The existing ${image_version} firmware is not yet functional. 173 Set BMC Image Priority To Least ${image_version} ${software_inventory_record} 174 175 Pass Execution The existing ${image_version} firmware is now functional. 176 177 178Get Image Priority 179 [Documentation] Get Current Image Priority. 180 [Arguments] ${image_version} 181 182 # Description of argument(s): 183 # image_version The Firmware image version (e.g. 2.8.0-dev-1107-g512028d95). 184 185 ${software_info}= Read Properties 186 ... ${SOFTWARE_VERSION_URI}/enumerate quiet=1 187 # Get only the record associated with our image_version. 188 189 ${software_info}= Filter Struct 190 ... ${software_info} [('Version', '${image_version}')] 191 # Convert from dict to list. 192 ${software_info}= Get Dictionary Values ${software_info} 193 194 [Return] ${software_info[0]['Priority']} 195 196 197Set BMC Image Priority To Least 198 [Documentation] Set BMC image priority to least value. 199 [Arguments] ${image_version} ${software_inventory} 200 201 # Description of argument(s): 202 # image_version The Firmware image version (e.g. 2.8.0-dev-1107-g512028d95). 203 # software_inventory Software inventory details. 204 205 ${least_priority}= Get Least Value Priority Image ${VERSION_PURPOSE_BMC} 206 ${cur_priority}= Get Image Priority ${image_version} 207 Rprint Vars least_priority cur_priority 208 209 Return From Keyword If '${least_priority}' == ${cur_priority} 210 Set Host Software Property 211 ... ${SOFTWARE_VERSION_URI}${software_inventory['image_id']} 212 ... Priority ${least_priority} 213 214 Redfish OBMC Reboot (off) 215 216 217Redfish Update Firmware 218 [Documentation] Update the BMC firmware via redfish interface. 219 220 ${post_code_update_actions}= Get Post Boot Action 221 ${state}= Get Pre Reboot State 222 Rprint Vars state 223 Run Keyword And Ignore Error Set ApplyTime policy=OnReset 224 Redfish Upload Image And Check Progress State 225 ${tar_version}= Get Version Tar ${IMAGE_FILE_PATH} 226 ${image_info}= Get Software Inventory State By Version ${tar_version} 227 Run Key ${post_code_update_actions['${image_info["image_type"]}']['OnReset']} 228 Redfish.Login 229 Redfish Verify BMC Version ${IMAGE_FILE_PATH} 230 231