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 128Get BMC Functional Firmware 129 [Documentation] Get BMC functional firmware details. 130 131 ${sw_inv}= Get Functional Firmware BMC update 132 ${sw_inv}= Get Non Functional Firmware ${sw_inv} True 133 134 [Return] ${sw_inv} 135 136 137Get Functional Firmware 138 [Documentation] Get all the BMC firmware details. 139 [Arguments] ${image_type} 140 141 # Description of argument(s): 142 # image_type Image value can be either BMC update or Host update. 143 144 ${software_inventory}= Get Software Inventory State 145 ${bmc_inv}= Get BMC Firmware ${image_type} ${software_inventory} 146 147 [Return] ${bmc_inv} 148 149 150Get Non Functional Firmware 151 [Documentation] Get BMC non functional fimware details. 152 [Arguments] ${sw_inv} ${functional_sate} 153 154 # Description of argument(s): 155 # sw_inv This dictionay contains all the BMC fimware details. 156 # functional_sate Functional state can be either True or False. 157 158 ${resp}= Filter Struct ${sw_inv} [('functional', ${functional_sate})] 159 ${list_inv_dict}= Get Dictionary Values ${resp} 160 161 [Return] ${list_inv_dict}[0] 162 163 164Delete BMC Image 165 [Documentation] Delete a BMC image from the BMC flash chip. 166 167 ${software_object}= Get Non Running BMC Software Object 168 Delete Image And Verify ${software_object} ${VERSION_PURPOSE_BMC} 169 170 171Activate Existing Firmware 172 [Documentation] Set fimware image to lower priority. 173 [Arguments] ${image_version} 174 175 # Description of argument(s): 176 # image_version Version of image. 177 178 ${software_inventory_record}= Get Software Inventory State By Version 179 ... ${image_version} 180 ${num_keys}= Get Length ${software_inventory_record} 181 182 Rprint Vars software_inventory_record 183 184 # If no software inventory record was found, there is no existing 185 # firmware for the given version and therefore no action to be taken. 186 Return From Keyword If not ${num_keys} 187 188 # Check if the existing firmware is functional. 189 Pass Execution If ${software_inventory_record['functional']} 190 ... The existing ${image_version} firmware is already functional. 191 192 # If existing firmware is not functional, then set the priority to least. 193 Print Timen The existing ${image_version} firmware is not yet functional. 194 Set BMC Image Priority To Least ${image_version} ${software_inventory_record} 195 196 Pass Execution The existing ${image_version} firmware is now functional. 197 198 199Get Image Priority 200 [Documentation] Get Current Image Priority. 201 [Arguments] ${image_version} 202 203 # Description of argument(s): 204 # image_version The Fimware image version (e.g. 2.8.0-dev-1107-g512028d95). 205 206 ${software_info}= Read Properties 207 ... ${SOFTWARE_VERSION_URI}/enumerate quiet=1 208 # Get only the record associated with our image_version. 209 210 ${software_info}= Filter Struct 211 ... ${software_info} [('Version', '${image_version}')] 212 # Convert from dict to list. 213 ${software_info}= Get Dictionary Values ${software_info} 214 215 [Return] ${software_info[0]['Priority']} 216 217 218Set BMC Image Priority To Least 219 [Documentation] Set BMC image priority to least value. 220 [Arguments] ${image_version} ${software_inventory} 221 222 # Description of argument(s): 223 # image_version The Fimware image version (e.g. 2.8.0-dev-1107-g512028d95). 224 # software_inventory Software inventory details. 225 226 ${least_priority}= Get Least Value Priority Image ${VERSION_PURPOSE_BMC} 227 ${cur_priority}= Get Image Priority ${image_version} 228 Rprint Vars least_priority cur_priority 229 230 Return From Keyword If '${least_priority}' == ${cur_priority} 231 Set Host Software Property 232 ... ${SOFTWARE_VERSION_URI}${software_inventory['image_id']} 233 ... Priority ${least_priority} 234 235 Redfish OBMC Reboot (off) 236 237 238Redfish Update Firmware 239 [Documentation] Update the BMC firmware via redfish interface. 240 241 ${post_code_update_actions}= Get Post Boot Action 242 ${state}= Get Pre Reboot State 243 Rprint Vars state 244 Run Keyword And Ignore Error Set ApplyTime policy=OnReset 245 Redfish Upload Image And Check Progress State 246 ${tar_version}= Get Version Tar ${IMAGE_FILE_PATH} 247 ${image_info}= Get Software Inventory State By Version ${tar_version} 248 Run Key ${post_code_update_actions['${image_info["image_type"]}']['OnReset']} 249 Redfish.Login 250 Redfish Verify BMC Version ${IMAGE_FILE_PATH} 251 252