1*** Settings *** 2Documentation Update firmware 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/dump_utils.robot 18Resource ../../lib/logging_utils.robot 19Resource ../../lib/redfish_code_update_utils.robot 20Resource ../../lib/utils.robot 21Resource ../../lib/bmc_redfish_utils.robot 22Resource ../../lib/external_intf/management_console_utils.robot 23Resource ../../lib/bmc_network_utils.robot 24Resource ../../lib/certificate_utils.robot 25Library ../../lib/gen_robot_valid.py 26Library ../../lib/tftp_update_utils.py 27Library ../../lib/gen_robot_keyword.py 28 29Suite Setup Suite Setup Execution 30Suite Teardown Redfish.Logout 31Test Setup Printn 32Test Teardown FFDC On Test Case Fail 33 34Force Tags BMC_Code_Update 35 36*** Variables *** 37 38@{ADMIN} admin_user TestPwd123 39&{USERS} Administrator=${ADMIN} 40${LOOP_COUNT} ${2} 41@{HOSTNAME} bmc_system01 bmc_system02 bmc_system03 bmc_system04 bmc_system05 42 43*** Test Cases *** 44 45Redfish Code Update With ApplyTime OnReset 46 [Documentation] Update the firmware image with ApplyTime of OnReset. 47 [Tags] Redfish_Code_Update_With_ApplyTime_OnReset 48 [Template] Redfish Update Firmware 49 50 # policy 51 OnReset 52 53 54Redfish Code Update With ApplyTime Immediate 55 [Documentation] Update the firmware image with ApplyTime of Immediate. 56 [Tags] Redfish_Code_Update_With_ApplyTime_Immediate 57 [Template] Redfish Update Firmware 58 59 # policy 60 Immediate 61 62 63Redfish Code Update Same Firmware Multiple Times 64 [Documentation] Multiple times update the firmware image for update service. 65 [Tags] Redfish_Code_Update_Same_Firmware_Multiple_Times 66 67 ${temp_update_loop_count}= Evaluate ${LOOP_COUNT} + 1 68 69 FOR ${count} IN RANGE 1 ${temp_update_loop_count} 70 Print Timen *************************************** 71 Print Timen * The Current Loop Count is ${count} of ${LOOP_COUNT} * 72 Print Timen *************************************** 73 74 Redfish Update Firmware apply_time=OnReset 75 END 76 77 78 79Redfish Code Update With Multiple Firmware 80 [Documentation] Update the firmware image with ApplyTime of Immediate. 81 [Tags] Redfish_Code_Update_With_Multiple_Firmware 82 [Template] Redfish Multiple Upload Image And Check Progress State 83 84 # policy image_file_path alternate_image_file_path 85 Immediate ${IMAGE_FILE_PATH} ${ALTERNATE_IMAGE_FILE_PATH} 86 87 88Post BMC Reset Perform Redfish Code Update 89 [Documentation] Test to reset BMC at standby and then perform BMC firmware update and 90 ... ensure there is not error or dump logs post update. 91 [Tags] Post_BMC_Reset_Perform_Redfish_Code_Update 92 93 Redfish Delete All BMC Dumps 94 Redfish Purge Event Log 95 96 Redfish OBMC Reboot (off) 97 98 Redfish Update Firmware apply_time=OnReset 99 100 Event Log Should Not Exist 101 Redfish BMC Dump Should Not Exist 102 103 Redfish Power Off 104 105 106Post BMC Reset Perform Image Switched To Backup Multiple Times 107 [Documentation] Test to reset BMC at standby and then perform switch 108 ... to backup image multiple times. 109 ... Then ensure no event and dump logs exist. 110 [Tags] Post_BMC_Reset_Perform_Image_Switched_To_Backup_Multiple_Times 111 112 Redfish Delete All BMC Dumps 113 Redfish Purge Event Log 114 115 Redfish OBMC Reboot (off) 116 117 ${temp_update_loop_count}= Evaluate ${LOOP_COUNT} + 1 118 119 FOR ${count} IN RANGE 1 ${temp_update_loop_count} 120 ${state}= Get Pre Reboot State 121 122 # change to backup image and reset the BMC. 123 Switch Backup Firmware Image To Functional 124 125 Wait For Reboot start_boot_seconds=${state['epoch_seconds']} 126 END 127 128 Event Log Should Not Exist 129 Redfish BMC Dump Should Not Exist 130 131 132Verify If The Modified Admin Credential Is Valid Post Image Switched To Backup 133 [Documentation] Verify updated admin credential remain same post switch to back up image. 134 [Tags] Verify_If_The_Modified_Admin_Credential_Is_Valid_Post_Image_Switched_To_Backup 135 [Setup] Create Users With Different Roles users=${USERS} force=${True} 136 [Teardown] Run Keywords Redfish.Login AND Delete BMC Users Via Redfish users=${USERS} 137 138 ${post_code_update_actions}= Get Post Boot Action 139 ${state}= Get Pre Reboot State 140 Expire And Update New Password Via Redfish ${ADMIN[0]} ${ADMIN[1]} 0penBmc123 141 142 Redfish.Login 143 # change to backup image and reset the BMC. 144 Switch Backup Firmware Image To Functional 145 Wait For Reboot start_boot_seconds=${state['epoch_seconds']} 146 147 # verify modified admin password on backup image. 148 Redfish.Login admin_user 0penBmc123 149 Redfish.Logout 150 151 152Verify If The Modified Admin Credential Is Valid Post Update 153 [Documentation] Verify updated admin credential remain same post code update image. 154 [Tags] Verify_If_The_Modified_Admin_Credential_Is_Valid_Post_Update 155 [Setup] Create Users With Different Roles users=${USERS} force=${True} 156 [Teardown] Run Keywords Redfish.Login AND Delete BMC Users Via Redfish users=${USERS} 157 158 Expire And Update New Password Via Redfish ${ADMIN[0]} ${ADMIN[1]} 0penBmc123 159 160 Redfish.Login 161 # Flash latest firmware using redfish. 162 Redfish Update Firmware OnReset 163 164 # verify modified admin credentails on latest image. 165 Redfish.Login admin_user 0penBmc123 166 Redfish.Logout 167 168 169Redfish Code Update With Different Interrupted Operation 170 [Documentation] Ensure firmware update is successful when different interrupted operation executed 171 ... i.e. change the hostname, updating https certificate and firmware update fail 172 ... when kernel panic. 173 [Tags] Redfish_Code_Update_With_Different_Interrupted_Operation 174 [Template] Verify Redfish Code Update With Different Interrupted Operation 175 176 # operation count 177 host_name 1 178 kernel_panic 1 179 https_certificate 1 180 181*** Keywords *** 182 183Suite Setup Execution 184 [Documentation] Do the suite setup. 185 186 Valid File Path IMAGE_FILE_PATH 187 Redfish.Login 188 189 Redfish Delete All BMC Dumps 190 Redfish Purge Event Log 191 192 Redfish Power Off stack_mode=skip 193 194 # Check and set the update path. 195 # Old - /redfish/v1/UpdateService/ 196 # New - /redfish/v1/UpdateService/update 197 198 ${resp}= Redfish.Get /redfish/v1/UpdateService/update 199 ... valid_status_codes=[${HTTP_OK},${HTTP_NOT_FOUND}] 200 201 # If the method is not found, set update URI to old method. 202 Run Keyword If ${resp.status} == ${HTTP_NOT_FOUND} 203 ... Set Suite Variable ${REDFISH_UPDATE_URI} /redfish/v1/UpdateService 204 205 Log To Console Update URI: ${REDFISH_UPDATE_URI} 206 207 208Redfish Update Firmware 209 [Documentation] Update the BMC firmware via redfish interface. 210 [Arguments] ${apply_time} 211 212 # Description of argument(s): 213 # policy ApplyTime allowed values (e.g. "OnReset", "Immediate"). 214 215 ${post_code_update_actions}= Get Post Boot Action 216 ${state}= Get Pre Reboot State 217 Rprint Vars state 218 Set ApplyTime policy=${apply_Time} 219 220 ${task_inv_dict}= Get Task State from File 221 222 ${file_bin_data}= OperatingSystem.Get Binary File ${image_file_path} 223 224 Log To Console Start uploading image to BMC. 225 Upload Image To BMC ${REDFISH_UPDATE_URI} timeout=${600} data=${file_bin_data} 226 Log To Console Completed image upload to BMC. 227 228 ${task_inv}= Check Task With Match TargetUri ${REDFISH_UPDATE_URI} 229 230 Rprint Vars task_inv 231 232 Wait Until Keyword Succeeds 5 min 10 sec 233 ... Verify Task Progress State ${task_inv} ${task_inv_dict['TaskCompleted']} 234 235 Run Key ${post_code_update_actions['BMC image']['${apply_time}']} 236 Redfish.Login 237 Redfish Verify BMC Version ${IMAGE_FILE_PATH} 238 Verify Get ApplyTime ${apply_time} 239 240 241Redfish Multiple Upload Image And Check Progress State 242 [Documentation] Update multiple BMC firmware via redfish interface and check status. 243 [Arguments] ${apply_time} ${IMAGE_FILE_PATH} ${ALTERNATE_IMAGE_FILE_PATH} 244 245 # Description of argument(s): 246 # apply_time ApplyTime allowed values (e.g. "OnReset", "Immediate"). 247 # IMAGE_FILE_PATH The path to BMC image file. 248 # ALTERNATE_IMAGE_FILE_PATH The path to alternate BMC image file. 249 250 ${post_code_update_actions}= Get Post Boot Action 251 Valid File Path ALTERNATE_IMAGE_FILE_PATH 252 ${state}= Get Pre Reboot State 253 Rprint Vars state 254 255 Set ApplyTime policy=${apply_time} 256 Redfish Upload Image ${REDFISH_BASE_URI}UpdateService ${IMAGE_FILE_PATH} 257 258 ${first_image_id}= Get Latest Image ID 259 Rprint Vars first_image_id 260 Sleep 5s 261 Redfish Upload Image ${REDFISH_BASE_URI}UpdateService ${ALTERNATE_IMAGE_FILE_PATH} 262 263 ${second_image_id}= Get Latest Image ID 264 Rprint Vars second_image_id 265 266 Check Image Update Progress State 267 ... match_state='Updating', 'Disabled' image_id=${second_image_id} 268 269 Check Image Update Progress State 270 ... match_state='Updating' image_id=${first_image_id} 271 272 Wait Until Keyword Succeeds 8 min 20 sec 273 ... Check Image Update Progress State 274 ... match_state='Enabled' image_id=${first_image_id} 275 Run Key ${post_code_update_actions['BMC image']['${apply_time}']} 276 Redfish.Login 277 Redfish Verify BMC Version ${IMAGE_FILE_PATH} 278 279 280Run Configure BMC Hostname In Loop 281 [Documentation] Update hostname in loop. 282 [Arguments] ${count} 283 284 # Description of argument(s): 285 # count Loop count. 286 287 FOR ${index} IN RANGE ${count} 288 Configure Hostname hostname=${HOSTNAME}[${index}] status_code=[${HTTP_INTERNAL_SERVER_ERROR}] 289 END 290 291 292Redfish Update Certificate Upload In Loop 293 [Documentation] Upload HTTPS server certificate via Redfish and verify using OpenSSL. 294 [Arguments] ${count} 295 296 # Description of argument(s): 297 # count Loop count. 298 299 FOR ${index} IN RANGE ${count} 300 ${resp}= Run Keyword And Return Status Redfish.Get ${REDFISH_HTTPS_CERTIFICATE_URI}/1 valid_status_codes=[${HTTP_OK}] 301 Should Be Equal As Strings ${resp} ${True} 302 303 ${cert_file_path}= Generate Certificate File Via Openssl Valid Certificate Valid Privatekey 304 ${bytes}= OperatingSystem.Get Binary File ${cert_file_path} 305 ${file_data}= Decode Bytes To String ${bytes} UTF-8 306 307 ${certificate_dict}= Create Dictionary 308 ... @odata.id=${REDFISH_HTTPS_CERTIFICATE_URI}/1 309 ${payload}= Create Dictionary CertificateString=${file_data} 310 ... CertificateType=PEM CertificateUri=${certificate_dict} 311 312 ${resp}= Redfish.Post /redfish/v1/CertificateService/Actions/CertificateService.ReplaceCertificate 313 ... body=${payload} 314 315 Verify Certificate Visible Via OpenSSL ${cert_file_path} 316 END 317 318 319Run Operation On BMC 320 [Documentation] Run operation on BMC. 321 [Arguments] ${operation} ${count} 322 323 # Description of argument(s): 324 # operation If host_name then change hostname. 325 # count Loop count. 326 327 Run Keyword If '${operation}' == 'host_name' 328 ... Run Configure BMC Hostname In Loop count=${count} 329 ... ELSE IF '${operation}' == 'kernel_panic' 330 ... Run Keywords Kernel Panic BMC Reset Operation AND 331 ... Is BMC Unpingable 332 ... ELSE IF '${operation}' == 'https_certificate' 333 ... Redfish Update Certificate Upload In Loop count=${count} 334 ... ELSE 335 ... Fail msg=Operation not handled. 336 337 338Get Active Firmware Image 339 [Documentation] Return get active firmware image. 340 341 ${active_image}= Redfish.Get Attribute /redfish/v1/Managers/bmc Links 342 Rprint Vars active_image 343 344 [Return] ${active_image} 345 346 347Get New Image ID 348 [Documentation] Return the ID of the most recently extracted image. 349 350 ${image_id}= Get Image Id Updating 351 352 [Return] ${image_id} 353 354 355Verify Redfish Code Update With Different Interrupted Operation 356 [Documentation] Verify code update is successful when other operation 357 ... getting executed i.e. change the hostname, updating http certificate 358 ... and code update will fail for kernel panic. 359 [Arguments] ${operation} ${count} 360 361 # Description of argument(s): 362 # operation host_name to change Hostname, kernel_panic to perform kernel panic. 363 # count Number of times loop will get executed. 364 365 ${before_update_activeswimage}= Get Active Firmware Image 366 367 ${post_code_update_actions}= Get Post Boot Action 368 369 Set ApplyTime policy=OnReset 370 371 ${task_inv_dict}= Get Task State from File 372 373 ${file_bin_data}= OperatingSystem.Get Binary File ${image_file_path} 374 375 Log To Console Start uploading image to BMC. 376 Upload Image To BMC ${REDFISH_BASE_URI}UpdateService timeout=${600} data=${file_bin_data} 377 Log To Console Completed image upload to BMC. 378 379 Sleep 5 380 381 ${image_id}= Get New Image ID 382 Rprint Vars image_id 383 384 ${task_inv}= Check Task With Match TargetUri /redfish/v1/UpdateService 385 Rprint Vars task_inv 386 387 Wait Until Keyword Succeeds 1 min 10 sec 388 ... Verify Task Progress State ${task_inv} ${task_inv_dict['TaskStarting']} 389 390 Run Operation On BMC ${operation} ${count} 391 392 IF '${operation}' == 'kernel_panic' 393 Wait Until Keyword Succeeds 10 min 10 sec Is BMC Standby 394 ELSE IF '${operation}' == 'host_name' 395 Wait Until Keyword Succeeds 5 min 10 sec 396 ... Verify Task Progress State ${task_inv} ${task_inv_dict['TaskCompleted']} 397 Run Key ${post_code_update_actions['BMC image']['OnReset']} 398 Redfish Verify BMC Version ${IMAGE_FILE_PATH} 399 ELSE IF '${operation}' == 'https_certificate' 400 Check Image Update Progress State 401 ... match_state='Updating' image_id=${image_id} 402 Wait Until Keyword Succeeds 8 min 20 sec 403 ... Check Image Update Progress State 404 ... match_state='Enabled' image_id=${image_id} 405 Run Key ${post_code_update_actions['BMC image']['OnReset']} 406 Redfish Verify BMC Version ${IMAGE_FILE_PATH} 407 ELSE 408 Fail msg=Operation not handled. 409 END 410 411 ${after_update_activeswimage}= Get Active Firmware Image 412 413 ${status}= Run Keyword And Return Status Should Be Equal As Strings 414 ... ${before_update_activeswimage['ActiveSoftwareImage']['@odata.id']} 415 ... ${after_update_activeswimage['ActiveSoftwareImage']['@odata.id']} 416 417 Run Keyword If '${operation}' == 'kernel_panic' 418 ... Should Be True ${status} 419 ... ELSE 420 ... Should Not Be True ${status} 421 422 Verify Get ApplyTime OnReset 423 424