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