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