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 Redfish_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 OnReset ${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 [Teardown] Code Update Interrupted Operation Teardown 176 177 # operation count 178 host_name 1 179 kernel_panic 1 180 https_certificate 1 181 182*** Keywords *** 183 184Suite Setup Execution 185 [Documentation] Do the suite setup. 186 187 Valid File Path IMAGE_FILE_PATH 188 Redfish.Login 189 190 Redfish Delete All BMC Dumps 191 Redfish Purge Event Log 192 193 Redfish Power Off stack_mode=skip 194 195 196Code Update Interrupted Operation Teardown 197 [Documentation] Code update interrupted operation teardown. 198 199 ${task_inv_dict}= Get Task State from File 200 201 ${redfish_update_uri}= Get Redfish Update Service URI 202 203 IF '${TEST STATUS}' == 'FAIL' 204 205 ${task_inv}= Check Task With Match TargetUri ${redfish_update_uri} 206 Rprint Vars task_inv 207 208 Wait Until Keyword Succeeds 2 min 10 sec 209 ... Verify Task Progress State ${task_inv} ${task_inv_dict['TaskStarting']} 210 211 Wait Until Keyword Succeeds 5 min 10 sec 212 ... Verify Task Progress State ${task_inv} ${task_inv_dict['TaskCompleted']} 213 214 Redfish BMC Reset Operation 215 Is BMC Standby 216 217 END 218 219 220Get Redfish Update Service URI 221 [Documentation] Get Redfish firmware update URI. 222 223 ${update_url}= Redfish.Get Attribute ${REDFISH_BASE_URI}UpdateService HttpPushUri 224 225 Log To Console Firmware update URI: ${update_url} 226 227 [Return] ${update_url} 228 229 230Redfish Multiple Upload Image And Check Progress State 231 [Documentation] Update multiple BMC firmware via redfish interface and check status. 232 [Arguments] ${apply_time} ${IMAGE_FILE_PATH} ${ALTERNATE_IMAGE_FILE_PATH} 233 234 # Description of argument(s): 235 # apply_time ApplyTime allowed values (e.g. "OnReset", "Immediate"). 236 # IMAGE_FILE_PATH The path to BMC image file. 237 # ALTERNATE_IMAGE_FILE_PATH The path to alternate BMC image file. 238 239 240 ${task_inv_dict}= Get Task State from File 241 242 ${post_code_update_actions}= Get Post Boot Action 243 244 Valid File Path ALTERNATE_IMAGE_FILE_PATH 245 246 ${state}= Get Pre Reboot State 247 Rprint Vars state 248 249 Set ApplyTime policy=${apply_time} 250 251 # URI : /redfish/v1/UpdateService 252 # "HttpPushUri": "/redfish/v1/UpdateService/update", 253 254 ${redfish_update_uri}= Get Redfish Update Service URI 255 256 ${file_bin_data1}= OperatingSystem.Get Binary File ${IMAGE_FILE_PATH} 257 ${file_bin_data2}= OperatingSystem.Get Binary File ${ALTERNATE_IMAGE_FILE_PATH} 258 259 Log To Console Uploading first image. 260 ${resp1}= Upload Image To BMC ${redfish_update_uri} timeout=${600} data=${file_bin_data1} 261 262 Log To Console Uploading second image. 263 ${resp2}= Upload Image To BMC ${redfish_update_uri} timeout=${600} data=${file_bin_data2} 264 265 ${task_info2}= evaluate json.loads('''${resp2.content}''') json 266 267 Sleep 3s 268 269 ${task_inv2}= Get Task Inventory ${task_info2} 270 Log ${task_inv2} 271 272 Wait Until Keyword Succeeds 5 min 10 sec 273 ... Verify Task Progress State ${task_inv2} ${task_inv_dict['TaskException']} 274 275 ${task_info1}= evaluate json.loads('''${resp1.content}''') json 276 Log ${task_info1} 277 278 ${task_inv1}= Get Task Inventory ${task_info1} 279 Log ${task_inv1} 280 281 Wait Until Keyword Succeeds 5 min 10 sec 282 ... Verify Task Progress State ${task_inv1} ${task_inv_dict['TaskCompleted']} 283 284 Run Key ${post_code_update_actions['BMC image']['${apply_time}']} 285 Redfish.Login 286 Redfish Verify BMC Version ${IMAGE_FILE_PATH} 287 288 289Run Configure BMC Hostname In Loop 290 [Documentation] Update hostname in loop. 291 [Arguments] ${count} 292 293 # Description of argument(s): 294 # count Loop count. 295 296 FOR ${index} IN RANGE ${count} 297 Configure Hostname hostname=${HOSTNAME}[${index}] status_code=[${HTTP_OK}] 298 END 299 300 301Redfish Update Certificate Upload In Loop 302 [Documentation] Upload HTTPS server certificate via Redfish and verify using OpenSSL. 303 [Arguments] ${count} 304 305 # Description of argument(s): 306 # count Loop count. 307 308 FOR ${index} IN RANGE ${count} 309 ${resp}= Run Keyword And Return Status Redfish.Get ${REDFISH_HTTPS_CERTIFICATE_URI}/1 valid_status_codes=[${HTTP_OK}] 310 Should Be Equal As Strings ${resp} ${True} 311 312 ${cert_file_path}= Generate Certificate File Via Openssl Valid Certificate Valid Privatekey 313 ${bytes}= OperatingSystem.Get Binary File ${cert_file_path} 314 ${file_data}= Decode Bytes To String ${bytes} UTF-8 315 316 ${certificate_dict}= Create Dictionary 317 ... @odata.id=${REDFISH_HTTPS_CERTIFICATE_URI}/1 318 ${payload}= Create Dictionary CertificateString=${file_data} 319 ... CertificateType=PEM CertificateUri=${certificate_dict} 320 321 ${resp}= Redfish.Post /redfish/v1/CertificateService/Actions/CertificateService.ReplaceCertificate 322 ... body=${payload} 323 324 Verify Certificate Visible Via OpenSSL ${cert_file_path} 325 END 326 327 328Run Operation On BMC 329 [Documentation] Run operation on BMC. 330 [Arguments] ${operation} ${count} 331 332 # Description of argument(s): 333 # operation Supports different variables. 334 # If host_name then change hostname, 335 # If kernel_panic then perform kernel panic, 336 # If https_certificate then change the https certificate. 337 # count Loop count. 338 339 # Below directory is required by keyword. 340 # Redfish Update Certificate Upload In Loop 341 342 IF '${operation}' == 'https_certificate' 343 Run rm -r certificate_dir 344 Run mkdir certificate_dir 345 END 346 347 Run Keyword If '${operation}' == 'host_name' 348 ... Run Configure BMC Hostname In Loop count=${count} 349 ... ELSE IF '${operation}' == 'kernel_panic' 350 ... Run Keywords Kernel Panic BMC Reset Operation AND 351 ... Is BMC Unpingable 352 ... ELSE IF '${operation}' == 'https_certificate' 353 ... Redfish Update Certificate Upload In Loop count=${count} 354 ... ELSE 355 ... Fail msg=Operation not handled. 356 357 358Get Active Firmware Image 359 [Documentation] Return get active firmware image. 360 361 ${active_image}= Redfish.Get Attribute /redfish/v1/Managers/${MANAGER_ID} Links 362 Rprint Vars active_image 363 364 [Return] ${active_image} 365 366 367Get New Image ID 368 [Documentation] Return the ID of the most recently extracted image. 369 370 ${image_id}= Get Image Id Updating 371 372 [Return] ${image_id} 373 374 375Verify Redfish Code Update With Different Interrupted Operation 376 [Documentation] Verify code update is successful when other operation 377 ... getting executed i.e. change the hostname, updating http certificate 378 ... and code update will fail for kernel panic. 379 [Arguments] ${operation} ${count} 380 381 # Description of argument(s): 382 # operation host_name to change Hostname, kernel_panic to perform kernel panic. 383 # count Number of times loop will get executed. 384 385 ${before_update_activeswimage}= Get Active Firmware Image 386 387 ${post_code_update_actions}= Get Post Boot Action 388 389 Set ApplyTime policy=OnReset 390 391 ${task_inv_dict}= Get Task State from File 392 393 ${file_bin_data}= OperatingSystem.Get Binary File ${image_file_path} 394 395 Log To Console Start uploading image to BMC. 396 397 # URI : /redfish/v1/UpdateService 398 # "HttpPushUri": "/redfish/v1/UpdateService/update", 399 400 ${redfish_update_uri}= Get Redfish Update Service URI 401 Upload Image To BMC ${redfish_update_uri} timeout=${600} data=${file_bin_data} 402 Log To Console Completed image upload to BMC. 403 404 Sleep 8 405 406 ${image_id}= Get New Image ID 407 Rprint Vars image_id 408 409 ${task_inv}= Check Task With Match TargetUri ${redfish_update_uri} 410 Rprint Vars task_inv 411 412 Wait Until Keyword Succeeds 2 min 10 sec 413 ... Verify Task Progress State ${task_inv} ${task_inv_dict['TaskStarting']} 414 415 Run Operation On BMC ${operation} ${count} 416 417 IF '${operation}' == 'kernel_panic' 418 Wait Until Keyword Succeeds 10 min 10 sec Is BMC Standby 419 ELSE IF '${operation}' == 'host_name' 420 Wait Until Keyword Succeeds 5 min 10 sec 421 ... Verify Task Progress State ${task_inv} ${task_inv_dict['TaskCompleted']} 422 Run Key ${post_code_update_actions['BMC image']['OnReset']} 423 Redfish Verify BMC Version ${IMAGE_FILE_PATH} 424 ELSE IF '${operation}' == 'https_certificate' 425 Check Image Update Progress State 426 ... match_state='Updating' image_id=${image_id} 427 Wait Until Keyword Succeeds 8 min 20 sec 428 ... Check Image Update Progress State 429 ... match_state='Enabled' image_id=${image_id} 430 Run Key ${post_code_update_actions['BMC image']['OnReset']} 431 Redfish Verify BMC Version ${IMAGE_FILE_PATH} 432 ELSE 433 Fail msg=Operation not handled. 434 END 435 436 ${after_update_activeswimage}= Get Active Firmware Image 437 438 ${status}= Run Keyword And Return Status Should Be Equal As Strings 439 ... ${before_update_activeswimage['ActiveSoftwareImage']['@odata.id']} 440 ... ${after_update_activeswimage['ActiveSoftwareImage']['@odata.id']} 441 442 Run Keyword If '${operation}' == 'kernel_panic' 443 ... Should Be True ${status} 444 ... ELSE 445 ... Should Not Be True ${status} 446 447 Verify Get ApplyTime OnReset 448 449