1*** Settings *** 2Documentation This suite tests Platform Event Log (PEL) functionality of OpenBMC. 3 4Library ../../lib/pel_utils.py 5Variables ../../data/pel_variables.py 6Resource ../../lib/list_utils.robot 7Resource ../../lib/logging_utils.robot 8Resource ../../lib/connection_client.robot 9Resource ../../lib/openbmc_ffdc.robot 10 11Test Setup Redfish.Login 12Test Teardown Run Keywords Redfish.Logout AND FFDC On Test Case Fail 13 14Test Tags Bmc_Pel 15 16*** Variables *** 17 18@{mandatory_pel_fields} Private Header User Header Primary SRC 19... Extended User Header Failing MTMS 20@{mandatory_Predictive_pel_fields} Private Header User Header Primary SRC 21... Extended User Header Failing MTMS User Data 22@{Mandatory_Informational_Pel_Fields} Private Header User Header Primary SRC 23... Extended User Header User Data 24 25*** Test Cases *** 26 27Create Test PEL Log And Verify 28 [Documentation] Create PEL log using busctl command and verify via peltool. 29 [Tags] Create_Test_PEL_Log_And_Verify 30 31 Redfish Purge Event Log 32 Create Test PEL Log 33 ${pel_id}= Get PEL Log Via BMC CLI 34 Should Not Be Empty ${pel_id} msg=System PEL log entry is empty. 35 36 37Verify PEL Log Details 38 [Documentation] Verify PEL log details via peltool. 39 [Tags] Verify_PEL_Log_Details 40 41 Redfish Purge Event Log 42 43 ${bmc_time1}= CLI Get BMC DateTime 44 Create Test PEL Log 45 ${bmc_time2}= CLI Get BMC DateTime 46 47 ${pel_records}= Peltool -l 48 49 # Example output from 'Peltool -l': 50 # pel_records: 51 # [0x50000012]: 52 # [CreatorID]: BMC 53 # [CompID]: 0x1000 54 # [PLID]: 0x50000012 55 # [Subsystem]: BMC Firmware 56 # [Message]: An application had an internal failure 57 # [SRC]: BD8D1002 58 # [Commit Time]: 03/02/2020 09:35:15 59 # [Sev]: Unrecoverable Error 60 61 ${ids}= Get Dictionary Keys ${pel_records} 62 ${id}= Get From List ${ids} 0 63 64 @{pel_fields}= Create List CreatorID Subsystem Message Sev 65 FOR ${field} IN @{pel_fields} 66 Valid Value pel_records['${id}']['${field}'] ['${PEL_DETAILS['${field}']}'] 67 END 68 69 Valid Value pel_records['${id}']['PLID'] ['${id}'] 70 71 # Verify if "CompID" and "SRC" fields of PEL has alphanumeric value. 72 Should Match Regexp ${pel_records['${id}']['CompID']} [a-zA-Z0-9] 73 Should Match Regexp ${pel_records['${id}']['SRC']} [a-zA-Z0-9] 74 75 ${pel_date_time}= Convert Date ${pel_records['${id}']['Commit Time']} 76 ... date_format=%m/%d/%Y %H:%M:%S exclude_millis=yes 77 78 # Convert BMC and PEL time to epoch time before comparing. 79 ${bmc_time1_epoch}= Convert Date ${bmc_time1} epoch 80 ${pel_time_epoch}= Convert Date ${pel_date_time} epoch 81 ${bmc_time2_epoch}= Convert Date ${bmc_time2} epoch 82 83 Should Be True ${bmc_time1_epoch} <= ${pel_time_epoch} <= ${bmc_time2_epoch} 84 85 86Verify Mandatory Sections Of Error Log PEL 87 [Documentation] Verify mandatory sections of error log PEL. 88 [Tags] Verify_Mandatory_Sections_Of_Error_Log_PEL 89 90 Create Test PEL Log 91 92 ${pel_ids}= Get PEL Log Via BMC CLI 93 ${pel_id}= Get From List ${pel_ids} -1 94 ${pel_output}= Peltool -i ${pel_id} 95 ${pel_sections}= Get Dictionary Keys ${pel_output} 96 97 List Should Contain Sub List ${pel_sections} ${mandatory_pel_fields} 98 99 100Verify PEL Log Persistence After BMC Reboot 101 [Documentation] Verify PEL log persistence after BMC reboot. 102 [Tags] Verify_PEL_Log_Persistence_After_BMC_Reboot 103 104 Create Test PEL Log 105 ${pel_before_reboot}= Get PEL Log Via BMC CLI 106 107 Redfish OBMC Reboot (off) 108 ${pel_after_reboot}= Get PEL Log Via BMC CLI 109 110 List Should Contain Sub List ${pel_after_reboot} ${pel_before_reboot} 111 112 113Verify PEL ID Numbering 114 [Documentation] Verify PEL ID numbering. 115 [Tags] Verify_PEL_ID_Numbering 116 117 Redfish Purge Event Log 118 Create Test PEL Log 119 Create Test PEL Log 120 121 ${pel_ids}= Get PEL Log Via BMC CLI 122 123 # Example of PEL IDs from PEL logs. 124 # [0x50000012]: <--- First PEL ID 125 # [CreatorID]: BMC 126 # [CompID]: 0x1000 127 # [PLID]: 0x50000012 128 # [Subsystem]: BMC Firmware 129 # [Message]: An application had an internal failure 130 # [SRC]: BD8D1002 131 # [Commit Time]: 03/02/2020 09:35:15 132 # [Sev]: Unrecoverable Error 133 # 134 # [0x50000013]: <--- Second PEL ID 135 # [CreatorID]: BMC 136 # [CompID]: 0x1000 137 # [PLID]: 0x50000013 138 # [Subsystem]: BMC Firmware 139 # [Message]: An application had an internal failure 140 # [SRC]: BD8D1002 141 # [Commit Time]: 03/02/2020 09:35:15 142 # [Sev]: Unrecoverable Error 143 144 Should Be True ${pel_ids[1]} == ${pel_ids[0]}+1 145 146Verify Machine Type Model And Serial Number 147 [Documentation] Verify machine type model and serial number from PEL. 148 [Tags] Verify_Machine_Type_Model_And_Serial_Number 149 150 Create Test PEL Log 151 152 ${pel_ids}= Get PEL Log Via BMC CLI 153 ${id}= Get From List ${pel_ids} -1 154 155 ${pel_serial_number}= Get PEL Field Value ${id} Failing MTMS Serial Number 156 ${pel_serial_number}= Replace String Using Regexp ${pel_serial_number} ^0+ ${EMPTY} 157 ${pel_machine_type_model}= Get PEL Field Value ${id} Failing MTMS Machine Type Model 158 ${pel_machine_type_model}= Replace String Using Regexp ${pel_machine_type_model} ^0+ ${EMPTY} 159 160 # Example of "Machine Type Model" and "Serial Number" fields value from "Failing MTMS" section of PEL. 161 # [Failing MTMS]: 162 # [Created by]: 0x2000 163 # [Machine Type Model]: 1234-ABC <---- Machine type 164 # [Section Version]: 1 165 # [Serial Number]: ABCDEFG <---- Serial number 166 # [Sub-section type]: 0 167 168 ${redfish_machine_model}= Redfish.Get Attribute /redfish/v1/Systems/${SYSTEM_ID}/ Model 169 ${redfish_machine_model}= Replace String Using Regexp ${redfish_machine_model} ^0+ ${EMPTY} 170 ${redfish_serial_number}= Redfish.Get Attribute /redfish/v1/Systems/${SYSTEM_ID}/ SerialNumber 171 ${redfish_serial_number}= Replace String Using Regexp ${redfish_serial_number} ^0+ ${EMPTY} 172 173 Valid Value pel_machine_type_model ['${redfish_machine_model}'] 174 Valid Value pel_serial_number ['${redfish_serial_number}'] 175 176 # Check "Machine Type Model" and "Serial Number" fields value from "Extended User Header" section of PEL. 177 ${pel_machine_type_model}= Get PEL Field Value ${id} Extended User Header Reporting Machine Type 178 ${pel_machine_type_model}= Replace String Using Regexp ${pel_machine_type_model} ^0+ ${EMPTY} 179 ${pel_serial_number}= Get PEL Field Value ${id} Extended User Header Reporting Serial Number 180 ${pel_serial_number}= Replace String Using Regexp ${pel_serial_number} ^0+ ${EMPTY} 181 182 Valid Value pel_machine_type_model ['${redfish_machine_model}'] 183 Valid Value pel_serial_number ['${redfish_serial_number}'] 184 185 186Verify Host Off State From PEL 187 [Documentation] Verify Host off state from PEL. 188 [Tags] Verify_Host_Off_State_From_PEL 189 190 Redfish Power Off stack_mode=skip 191 Create Test PEL Log 192 193 ${pel_ids}= Get PEL Log Via BMC CLI 194 ${id}= Get From List ${pel_ids} -1 195 ${pel_host_state}= Get PEL Field Value ${id} User Data HostState 196 197 Valid Value pel_host_state ['Off'] 198 199 200Verify Host On State From PEL 201 [Documentation] Verify Host on state from PEL. 202 [Tags] Verify_Host_On_State_From_PEL 203 204 Redfish Power On stack_mode=skip 205 Redfish Purge Event Log 206 207 Create Test PEL Log 208 209 ${pel_ids}= Get PEL Log Via BMC CLI 210 ${id}= Get From List ${pel_ids} -1 211 ${pel_host_state}= Get PEL Field Value ${id} User Data HostState 212 213 Valid Value pel_host_state ['Running'] 214 215 216Verify BMC Version From PEL 217 [Documentation] Verify BMC Version from PEL. 218 [Tags] Verify_BMC_Version_From_PEL 219 220 Create Test PEL Log 221 222 ${pel_ids}= Get PEL Log Via BMC CLI 223 ${id}= Get From List ${pel_ids} -1 224 ${pel_bmc_version}= Get PEL Field Value ${id} User Data FW Version ID 225 226 ${bmc_version}= Get BMC Version 227 Valid Value bmc_version ['${bmc_version}'] 228 229 230Verify PEL Log After Host Poweron 231 [Documentation] Verify PEL log generation while booting host. 232 [Tags] Verify_PEL_Log_After_Host_Poweron 233 234 Redfish Power Off stack_mode=skip 235 Redfish Purge Event Log 236 Redfish Power On stack_mode=skip 237 238 ${pel_informational_error}= Get PEL Log IDs User Header Event Severity Informational Event 239 ${pel_bmc_created_error}= Get PEL Log IDs Private Header Creator Subsystem BMC 240 241 # Get BMC created non-infomational error. 242 ${pel_bmc_error}= Subtract Lists ${pel_bmc_created_error} ${pel_informational_error} 243 244 Should Be Empty ${pel_bmc_error} msg=Unexpected error log generated during Host poweron. 245 246 247Verify BMC Event Log ID 248 [Documentation] Verify BMC Event Log ID from PEL. 249 [Tags] Verify_BMC_Event_Log_ID 250 251 Redfish Purge Event Log 252 Create Test PEL Log 253 254 ${pel_ids}= Get PEL Log Via BMC CLI 255 ${pel_bmc_event_log_id}= Get PEL Field Value ${pel_ids[0]} Private Header BMC Event Log Id 256 257 # Example "BMC Event Log Id" field value from "Private Header" section of PEL. 258 # [Private Header]: 259 # [Created at]: 08/24/1928 12:04:06 260 # [Created by]: 0x584D 261 # [Sub-section type]: 0 262 # [Entry Id]: 0x50000BB7 263 # [Platform Log Id]: 0x8200061D 264 # [CSSVER]: 265 # [Section Version]: 1 266 # [Creator Subsystem]: PHYP 267 # [BMC Event Log Id]: 341 <---- BMC event log id value 268 # [Committed at]: 03/25/1920 12:06:22 269 270 ${redfish_event_logs}= Redfish.Get Properties /redfish/v1/Systems/${SYSTEM_ID}/LogServices/EventLog/Entries 271 272 # Example of redfish_event_logs output: 273 # redfish_event_logs: 274 # [@odata.id]: /redfish/v1/Systems/system/LogServices/EventLog/Entries 275 # [Name]: System Event Log Entries 276 # [Members@odata.count]: 1 277 # [@odata.type]: #LogEntryCollection.LogEntryCollection 278 # [Description]: Collection of System Event Log Entries 279 # [Members]: 280 # [0]: 281 # [@odata.id]: /redfish/v1/Systems/system/LogServices/EventLog/Entries/235 282 # [Name]: System Event Log Entry 283 # [Severity]: Critical 284 # [EntryType]: Event 285 # [Created]: 2020-04-02T07:25:13+00:00 286 # [@odata.type]: #LogEntry.v1_5_1.LogEntry 287 # [Id]: 235 <----- Event log ID 288 # [Message]: xyz.openbmc_project.Common.Error.InternalFailure 289 290 Valid Value pel_bmc_event_log_id ['${redfish_event_logs['Members'][0]['Id']}'] 291 292 293Verify FRU Callout 294 [Documentation] Verify FRU callout entries from PEL log. 295 [Tags] Verify_FRU_Callout 296 297 # Power off the system to avoid unnecessary error logs during test. 298 Redfish Power Off stack_mode=skip 299 Create Test PEL Log FRU Callout 300 301 ${pel_ids}= Get PEL Log Via BMC CLI 302 ${id}= Get From List ${pel_ids} -1 303 ${pel_callout_section}= Get PEL Field Value ${id} Primary SRC Callout Section 304 305 # Example of PEL Callout Section from "peltool -i <id>" command. 306 # [Callouts]: 307 # [0]: 308 # [FRU Type]: Normal Hardware FRU 309 # [Priority]: Mandatory, replace all with this type as a unit 310 # [Location Code]: U78DA.ND1.1234567-P0 311 # [Part Number]: F191014 312 # [CCIN]: 2E2D 313 # [Serial Number]: YL2E2D010000 314 # [Callout Count]: 1 315 316 Valid Value pel_callout_section['Callout Count'] ['1'] 317 Valid Value pel_callout_section['Callouts'][0]['FRU Type'] ['Normal Hardware FRU'] 318 Should Contain ${pel_callout_section['Callouts'][0]['Priority']} Mandatory 319 320 # Verify Location Code field of PEL callout with motherboard's Location Code. 321 ${busctl_output}= BMC Execute Command ${CMD_INVENTORY_PREFIX} com.ibm.ipzvpd.Location LocationCode 322 Should Be Equal ${pel_callout_section['Callouts'][0]['Location Code']} 323 ... ${busctl_output[0].split('"')[1].strip('"')} 324 325 # TODO: Compare CCIN and part number fields of PEL callout with Redfish or busctl output. 326 Should Match Regexp ${pel_callout_section['Callouts'][0]['CCIN']} [a-zA-Z0-9] 327 Should Match Regexp ${pel_callout_section['Callouts'][0]['Part Number']} [a-zA-Z0-9] 328 329 # Verify Serial Number field of PEL callout with motherboard's Serial Number. 330 ${busctl_output}= BMC Execute Command 331 ... ${CMD_INVENTORY_PREFIX} xyz.openbmc_project.Inventory.Decorator.Asset SerialNumber 332 Should Be Equal ${pel_callout_section['Callouts'][0]['Serial Number']} 333 ... ${busctl_output[0].split('"')[1].strip('"')} 334 335 336Verify Procedure And Symbolic FRU Callout 337 [Documentation] Verify procedure and symbolic FRU callout from PEL log. 338 [Tags] Verify_Procedure_And_Symbolic_FRU_Callout 339 340 Create Test PEL Log Procedure And Symbolic FRU Callout 341 342 ${pel_ids}= Get PEL Log Via BMC CLI 343 ${id}= Get From List ${pel_ids} -1 344 ${pel_callout_section}= Get PEL Field Value ${id} Primary SRC Callout Section 345 346 # Example of PEL Callout Section from "peltool -i <id>" command. 347 # [Callouts]: 348 # [0]: 349 # [Priority]: Mandatory, replace all with this type as a unit 350 # [Procedure Number]: BMCSP02 351 # [FRU Type]: Maintenance Procedure Required 352 # [1]: 353 # [Priority]: Medium Priority 354 # [Part Number]: SVCDOCS 355 # [FRU Type]: Symbolic FRU 356 # [Callout Count]: 2 357 358 Valid Value pel_callout_section['Callout Count'] ['2'] 359 360 # Verify procedural callout info. 361 362 Valid Value pel_callout_section['Callouts'][0]['FRU Type'] ['Maintenance Procedure Required'] 363 Should Contain ${pel_callout_section['Callouts'][0]['Priority']} Mandatory 364 # Verify if "Procedure Number" field of PEL has an alphanumeric value. 365 Should Match Regexp ${pel_callout_section['Callouts'][0]['Procedure']} [a-zA-Z0-9] 366 367 # Verify procedural callout info. 368 369 Valid Value pel_callout_section['Callouts'][1]['FRU Type'] ['Symbolic FRU'] 370 Should Contain ${pel_callout_section['Callouts'][1]['Priority']} Medium Priority 371 # Verify if "Part Number" field of Symbolic FRU has an alphanumeric value. 372 Should Match Regexp ${pel_callout_section['Callouts'][1]['Part Number']} [a-zA-Z0-9] 373 374 375Verify PEL Log Entry For Event Log 376 [Documentation] Create an event log and verify PEL log entry in BMC for the same. 377 [Tags] Verify_PEL_Log_Entry_For_Event_Log 378 379 Redfish Purge Event Log 380 381 # Create an unrecoverable error log. 382 Create Test PEL Log Unrecoverable Error 383 384 ${elog_entry}= Get Event Logs 385 # Example of Redfish event logs: 386 # elog_entry: 387 # [0]: 388 # [Message]: BD802003 event in subsystem: Platform Firmware 389 # [Created]: 2023-05-08T10:19:30.412+00:00 390 # [Id]: 1 391 # [@odata.id]: /redfish/v1/Systems/system/LogServices/EventLog/Entries/1 392 # [@odata.type]: #LogEntry.v1_4_0.LogEntry 393 # [EntryType]: Event 394 # [Severity]: Critical 395 # [Name]: System Event Log Entry 396 397 ${redfish_log_time}= Convert Date ${elog_entry[0]["Created"].split('.')[0]} epoch 398 399 ${pel_records}= Peltool -l 400 # Example output from 'Peltool -l': 401 # pel_records: 402 # [0x50000023]: 403 # [SRC]: BD802003 404 # [CreatorID]: BMC 405 # [Message]: This is a test error 406 # [CompID]: 0x2000 407 # [PLID]: 0x500053D9 408 # [Commit Time]: 04/20/2020 01:55:22 409 # [Subsystem]: Platform Firmware 410 # [Sev]: Unrecoverable Error 411 412 ${ids}= Get Dictionary Keys ${pel_records} 413 ${id}= Get From List ${ids} 0 414 ${pel_log_time}= Convert Date ${pel_records['${id}']['Commit Time']} epoch 415 ... date_format=%m/%d/%Y %H:%M:%S 416 417 # Verify that both Redfish event and PEL has log entry for internal error with same time stamp. 418 Should Contain Any ${pel_records['${id}']['Message']} test error ignore_case=True 419 Should Contain ${elog_entry[0]['Message']} 420 ... ${pel_records['${id}']['SRC']} ignore_case=True 421 422 Should Be Equal ${redfish_log_time} ${pel_log_time} 423 424 425Verify Delete All PEL 426 [Documentation] Verify deleting all PEL logs. 427 [Tags] Verify_Delete_All_PEL 428 429 Create Test PEL Log 430 Create Test PEL Log 431 Peltool --delete-all False 432 433 ${pel_ids}= Get PEL Log Via BMC CLI 434 Should Be Empty ${pel_ids} 435 436 437Verify Informational Error Log 438 [Documentation] Create an informational error log and verify. 439 [Tags] Verify_Informational_Error_Log 440 441 Redfish Purge Event Log 442 # Create an informational error log. 443 BMC Execute Command ${CMD_INFORMATIONAL_ERROR} 444 ${pel_records}= Peltool -lfh 445 446 # An example of information error log data: 447 # { 448 # "0x500006A0": { 449 # "SRC": "BD8D1002", 450 # "Message": "An application had an internal failure", 451 # "PLID": "0x500006A0", 452 # "CreatorID": "BMC", 453 # "Subsystem": "BMC Firmware", 454 # "Commit Time": "10/14/2020 11:41:38", 455 # "Sev": "Informational Event", 456 # "CompID": "0x1000" 457 # } 458 # } 459 460 ${ids}= Get Dictionary Keys ${pel_records} 461 ${id}= Get From List ${ids} 0 462 Should Contain ${pel_records['${id}']['Sev']} Informational 463 464 465Verify Predictable Error Log 466 [Documentation] Create a predictive error and verify. 467 [Tags] Verify_Predictable_Error_Log 468 469 # Create a predictable error log. 470 BMC Execute Command ${CMD_PREDICTIVE_ERROR} 471 ${pel_records}= Peltool -l 472 473 # An example of predictive error log data: 474 # { 475 # "0x5000069E": { 476 # "SRC": "BD8D1002", 477 # "Message": "An application had an internal failure", 478 # "PLID": "0x5000069E", 479 # "CreatorID": "BMC", 480 # "Subsystem": "BMC Firmware", 481 # "Commit Time": "10/14/2020 11:40:07", 482 # "Sev": "Predictive Error", 483 # "CompID": "0x1000" 484 # } 485 # } 486 487 ${pel_ids}= Get PEL Log Via BMC CLI 488 ${id}= Get From List ${pel_ids} -1 489 Should Contain ${pel_records['${id}']['Sev']} Predictive 490 491 492Verify Unrecoverable Error Log 493 [Documentation] Create an unrecoverable error and verify. 494 [Tags] Verify_Unrecoverable_Error_Log 495 496 # Create an internal failure error log. 497 BMC Execute Command ${CMD_UNRECOVERABLE_ERROR} 498 ${pel_records}= Peltool -l 499 500 # An example of unrecoverable error log data: 501 # { 502 # "0x50000CC5": { 503 # "SRC": "BD8D1002", 504 # "Message": "An application had an internal failure", 505 # "PLID": "0x50000CC5", 506 # "CreatorID": "BMC", 507 # "Subsystem": "BMC Firmware", 508 # "Commit Time": "04/01/2020 16:44:55", 509 # "Sev": "Unrecoverable Error", 510 # "CompID": "0x1000" 511 # } 512 # } 513 514 ${pel_ids}= Get PEL Log Via BMC CLI 515 ${id}= Get From List ${pel_ids} -1 516 Should Contain ${pel_records['${id}']['Sev']} Unrecoverable 517 518 519Verify Error Logging Rotation Policy 520 [Documentation] Verify error logging rotation policy. 521 [Tags] Verify_Error_Logging_Rotation_Policy 522 [Template] Error Logging Rotation Policy 523 524 # Error logs to be created % of total logging space when error 525 # log exceeds max limit. 526 Informational BMC 3000 15 527 Predictive BMC 3000 30 528 Unrecoverable BMC 3000 30 529 Informational BMC 1500, Predictive BMC 1500 45 530 Informational BMC 1500, Unrecoverable BMC 1500 45 531 Unrecoverable BMC 1500, Predictive BMC 1500 30 532 533 534Verify Error Logging Rotation Policy With All Types Of Errors 535 [Documentation] Verify error logging rotation policy with all types of errors. 536 [Tags] Verify_Error_Logging_Rotation_Policy_With_All_Types_Of_Errors 537 [Template] Error Logging Rotation Policy 538 539 # Error logs to be created % of total logging space when error 540 # log exceeds max limit. 541 Unrecoverable BMC 1000, Informational BMC 1000, Predictive BMC 1000 45 542 543 544Verify Error Logging Rotation Policy With HOST Error Logs 545 [Documentation] Verify error logging rotation policy for non bmc error logs. 546 [Tags] Verify_Error_Logging_Rotation_Policy_With_HOST_Error_Logs 547 [Setup] Run Keywords Open Connection for SCP AND scp.Put File ${UNRECOVERABLE_FILE_PATH} 548 ... /tmp/FILE_HOST_UNRECOVERABLE AND scp.Put File ${INFORMATIONAL_FILE_PATH} 549 ... /tmp/FILE_HOST_INFORMATIONAL 550 [Template] Error Logging Rotation Policy 551 552 # Error logs to be created % of total logging space when error 553 # log exceeds max limit. 554 Informational HOST 3000 15 555 Unrecoverable HOST 3000 30 556 Informational HOST 1500, Informational BMC 1500 30 557 Informational HOST 1500, Unrecoverable BMC 1500 45 558 Unrecoverable HOST 1500, Informational BMC 1500 45 559 Unrecoverable HOST 1500, Predictive BMC 1500 60 560 561 562Verify Error Logging Rotation Policy With Unrecoverable HOST And BMC Error Logs 563 [Documentation] Verify error logging rotation policy with unrecoverable HOST and BMC error logs. 564 [Tags] Verify_Error_Logging_Rotation_Policy_With_Unrecoverable_HOST_And_BMC_Error_Logs 565 [Setup] Run Keywords Open Connection for SCP AND scp.Put File ${UNRECOVERABLE_FILE_PATH} 566 ... /tmp/FILE_NBMC_UNRECOVERABLE AND Redfish.Login 567 [Template] Error Logging Rotation Policy 568 569 # Error logs to be created % of total logging space when error 570 # log exceeds max limit. 571 Unrecoverable HOST 1500, Unrecoverable BMC 1500 60 572 573 574Verify Old Logs Are Deleted When Count Crosses Max 575 [Documentation] Verify that when the count crosses max, older logs are deleted. 576 [Tags] Verify_Old_Logs_Are_Deleted_When_Count_Crosses_Max 577 578 Redfish Purge Event Log 579 # One information log is created after purging error log and additional 2999 are created. 580 # In total, 3000 error logs are available. 581 FOR ${count} IN RANGE 1 ${3000} 582 BMC Execute Command ${CMD_PREDICTIVE_ERROR} 583 END 584 585 # Retrieve the IDs of the logs. 586 ${pel_ids}= Get PEL Log Via BMC CLI 587 ${1st_id}= Get From List ${pel_ids} 0 588 ${3000th_id}= Get From List ${pel_ids} 2999 589 590 # Now create 3001st log to cross threshold limit and trigger error logs rotation. 591 BMC Execute Command ${CMD_PREDICTIVE_ERROR} 592 593 # Wait few seconds for error logs rotation to complete. 594 Sleep 10s 595 596 # Now verify that first log is no more available but the 3000th is available. 597 ${status} ${output}= Run Keyword And Ignore Error Peltool -i ${1st_id} 598 Should Be True '${status}' == 'FAIL' 599 Should Contain ${output} PEL not found 600 601 ${status} ${output}= Run Keyword And Ignore Error Peltool -i ${3000th_id} 602 Should Be True '${status}' == 'PASS' 603 Should Not Contain ${output} PEL not found 604 605 606Verify Reverse Order Of PEL Logs 607 [Documentation] Verify PEL command to output PEL logs in reverse order. 608 [Tags] Verify_Reverse_Order_Of_PEL_Logs 609 610 Redfish Purge Event Log 611 612 # Below commands create unrecoverable error log at first and then the predictable error. 613 BMC Execute Command ${CMD_UNRECOVERABLE_ERROR} 614 BMC Execute Command ${CMD_PREDICTIVE_ERROR} 615 616 # Using peltool -lr, recent PELs appear first. Hence the ID of first PEL is greater than the next. 617 ${pel_records}= peltool -lr 618 619 # It is found that, variables like dictionary always keep items in sorted order that makes 620 # this verification not possible, hence json is used to keep the items original order. 621 ${pel_records}= Convert To String ${pel_records} 622 ${json_string}= Replace String ${pel_records} ' " 623 ${json_object}= Evaluate json.loads('''${json_string}''') json 624 625 ${list}= Convert To List ${json_object} 626 627 ${id1}= Get From List ${list} 0 628 ${id1}= Convert To Integer ${id1} 629 ${id2}= Get From List ${list} 1 630 ${id2}= Convert To Integer ${id2} 631 632 Should Be True ${id1} > ${id2} 633 634 635Verify Total PEL Count 636 [Documentation] Verify total PEL count returned by peltool command. 637 [Tags] Verify_Total_PEL_Count 638 639 # Initially remove all logs. 640 Redfish Purge Event Log 641 642 # Generate a random number between 1-20. 643 ${random}= Evaluate random.randint(1, 20) modules=random 644 645 # Generate predictive error log multiple times. 646 FOR ${count} IN RANGE 0 ${random} 647 BMC Execute Command ${CMD_PREDICTIVE_ERROR} 648 END 649 650 # Check PEL log count via peltool command and compare it with actual generated log count. 651 ${pel_records}= peltool -n 652 653 Should Be Equal ${pel_records['Number of PELs found']} ${random} 654 655 656Verify Listing Information Error 657 [Documentation] Verify that information error logs can only be listed using -lfh option of peltool. 658 [Tags] Verify_Listing_Information_Error 659 660 # Initially remove all logs. 661 Redfish Purge Event Log 662 BMC Execute Command ${CMD_INFORMATIONAL_ERROR} 663 664 # Generate informational logs and verify that it would not get listed by peltool's list command. 665 ${pel_records}= peltool -l 666 ${ids}= Get Dictionary Keys ${pel_records} 667 Should Be Empty ${ids} 668 669 # Verify that information logs get listed using peltool's list command with -lfh option. 670 ${pel_records}= peltool -lfh 671 ${ids}= Get Dictionary Keys ${pel_records} 672 Should Not Be Empty ${ids} 673 ${id}= Get From List ${ids} 0 674 Should Contain ${pel_records['${id}']['Sev']} Informational 675 676 677Verify PEL Delete 678 [Documentation] Verify that peltool command can delete PEL log based on id. 679 [Tags] Verify_PEL_Delete 680 681 BMC Execute Command ${CMD_PREDICTIVE_ERROR} 682 ${pel_ids}= Get PEL Log Via BMC CLI 683 ${id}= Get From List ${pel_ids} -1 684 Peltool -d ${id} False 685 Run Keyword and Expect Error *PEL not found* Peltool -i ${id} 686 687 688Verify Mandatory Fields For Predictive Error 689 [Documentation] Verify mandatory fields of predictive errors from pel information. 690 [Tags] Verify_Mandatory_Fields_For_Predictive_Error 691 692 # Inject predictive error. 693 BMC Execute Command ${CMD_PREDICTIVE_ERROR} 694 695 ${pel_ids}= Get PEL Log Via BMC CLI 696 ${pel_id}= Get From List ${pel_ids} -1 697 ${pel_output}= Peltool -i ${pel_id} 698 # Get all fields in predictive error log. 699 ${pel_sections}= Get Dictionary Keys ${pel_output} 700 701 List Should Contain Sub List ${pel_sections} ${mandatory_Predictive_pel_fields} 702 703 704Verify Mandatory Fields For Informational Error 705 [Documentation] Verify mandatory fields of informational error from pel information. 706 [Tags] Verify_Mandatory_Fields_For_Informational_Error 707 708 # Inject informational error. 709 BMC Execute Command ${CMD_INFORMATIONAL_ERROR} 710 ${pel_records}= Peltool -lfh 711 712 ${ids}= Get Dictionary Keys ${pel_records} 713 ${pel_id}= Get From List ${ids} -1 714 ${pel_output}= Peltool -i ${pel_id} 715 716 # Get all fields in the informational error log. 717 ${pel_sections}= Get Dictionary Keys ${pel_output} 718 FOR ${section} IN @{Mandatory_Informational_Pel_Fields} 719 ${contains}= Evaluate "${section}" in "${pel_sections}" 720 Should Be True ${contains} 721 END 722 723 724Verify PEL Log Offloaded To Host 725 [Documentation] Verify host transmission state of offloaded PEL logs. 726 [Tags] Verify_PEL_Log_Offloaded_To_Host 727 [Template] Verify PEL Transmission To Host 728 729 # error_type host_state expected_transmission_state 730 predictive_error On Acked 731 unrecoverable_error On Acked 732 informational_error On Acked 733 734 735Verify PEL Log Not Offloaded To Host 736 [Documentation] Verify host transmission state of not offloaded PEL logs. 737 [Tags] Verify_PEL_Log_Not_Offloaded_To_Host 738 [Template] Verify PEL Transmission To Host 739 740 # error_type host_state expected_transmission_state 741 predictive_error Off Not Sent 742 unrecoverable_error Off Not Sent 743 informational_error Off Not Sent 744 745 746*** Keywords *** 747 748Error Logging Rotation Policy 749 [Documentation] Verify that when maximum log limit is reached, given error logging type 750 ... are deleted when reached their max allocated space. 751 [Arguments] ${error_log_type} ${max_allocated_space_percentage} 752 753 # Description of argument(s): 754 # error_log Error logs to be created (E.g. Informational BMC 3000 755 # stands for BMC created 3000 informational error logs). 756 # max_allocated_space_percentage The maximum percentage of disk usage for given error 757 # log type when maximum count/log size is reached. 758 # The maximum error log count is 3000. 759 760 Redfish.Login 761 762 # Initially remove all logs. Purging is done to ensure that, only specific logs are present 763 # in BMC during the test. 764 Redfish Purge Event Log 765 766 @{lists}= Split String ${error_log_type} ,${SPACE} 767 768 ${length}= Get Length ${lists} 769 770 FOR ${list} IN RANGE ${length} 771 @{words}= Split String ${lists}[${list}] ${SPACE} 772 Create Error Log ${words}[0] ${words}[1] ${words}[2] 773 END 774 775 # Create an additional error log to exceed max error logs limit. 776 BMC Execute Command ${CMD_UNRECOVERABLE_ERROR} 777 778 # Delay for BMC to perform delete older error logs when log limit exceeds. 779 Sleep 10s 780 781 # Verify disk usage is around max allocated space. Maximum usage is around 3MB not exactly 3MB 782 # (for informational log) and around 6 MB for unrecoverable / predictive error log. So, usage 783 # percentage is NOT exactly 15% and 30%. So, an error/accuracy factor 0.5 percent is added. 784 785 ${disk_usage_percentage}= Get Disk Usage For Error Logs 786 ${percent_diff}= Evaluate ${disk_usage_percentage} - ${max_allocated_space_percentage} 787 ${percent_diff}= Evaluate abs(${percent_diff}) 788 789 ${trimmed_as_expected}= Run Keyword If ${disk_usage_percentage} > ${max_allocated_space_percentage} 790 ... Evaluate ${percent_diff} <= 0.5 791 ... ELSE 792 ... Set Variable True 793 794 # Check PEL log count via peltool command and compare it with actual generated log count. 795 ${pel_records}= peltool -n 796 ${no_pel_records}= Set Variable ${pel_records["Number of PELs found"]} 797 # Number of logs can be 80% of the total logs created after trimming. 798 ${expected_max_record}= Evaluate 3000 * 0.8 799 800 Run Keyword If ${trimmed_as_expected} == False 801 ... Should Be True ${no_pel_records} <= ${expected_max_record} 802 803 804Create Error Log 805 [Documentation] Create an error log. 806 [Arguments] ${error_severity} ${error_creator} ${count} 807 808 # Description of argument(s): 809 # error_severity Severity of the error (E.g. Informational, Unrecoberable or Predictive) 810 # error_creator Name of error log's creator(E.g BMC, Host Boot) 811 # count Number of error logs to be generated. 812 813 FOR ${i} IN RANGE 0 ${count} 814 ${cmd}= Set Variable If 815 ... '${error_severity}' == 'Informational' and '${error_creator}' == 'BMC' ${CMD_INFORMATIONAL_ERROR} 816 ... '${error_severity}' == 'Informational' and '${error_creator}' == 'HOST' ${CMD_INFORMATIONAL_HOST_ERROR} 817 ... '${error_severity}' == 'Predictive' and '${error_creator}' == 'BMC' ${CMD_PREDICTIVE_ERROR} 818 ... '${error_severity}' == 'Unrecoverable' and '${error_creator}' == 'BMC' ${CMD_UNRECOVERABLE_ERROR} 819 ... '${error_severity}' == 'Unrecoverable' and '${error_creator}' == 'HOST' ${CMD_UNRECOVERABLE_HOST_ERROR} 820 BMC Execute Command ${cmd} 821 END 822 823 824Get Disk Usage For Error Logs 825 [Documentation] Get disk usage percentage for error logs. 826 827 ${usage_output} ${stderr} ${rc}= BMC Execute Command du /var/lib/phosphor-logging/errors 828 829 ${usage_output}= Fetch From Left ${usage_output} \/ 830 831 # Convert disk usage unit from KB to MB. 832 ${usage_output}= Evaluate ${usage_output} / 1024 833 834 # Logging disk capacity limit is set to 20MB. So calculating the log usage percentage. 835 ${usage_percent}= Evaluate ${usage_output} / 20 * 100 836 837 RETURN ${usage_percent} 838 839 840Get PEL Log IDs 841 [Documentation] Returns the list of PEL log IDs which contains given field's value. 842 [Arguments] ${pel_section} ${pel_field} @{pel_field_value} 843 844 # Description of argument(s): 845 # pel_section The section of PEL (e.g. Private Header, User Header). 846 # pel_field The PEL field (e.g. Event Severity, Event Type). 847 # pel_field_value The list of PEL's field value (e.g. Unrecoverable Error). 848 849 ${pel_ids}= Get PEL Log Via BMC CLI 850 @{pel_id_list}= Create List 851 852 FOR ${id} IN @{pel_ids} 853 ${pel_output}= Peltool -i ${id} 854 # Example of PEL output from "peltool -i <id>" command. 855 # [Private Header]: 856 # [Created at]: 08/24/1928 12:04:06 857 # [Created by]: 0x584D 858 # [Sub-section type]: 0 859 # [Entry Id]: 0x50000BB7 860 # [Platform Log Id]: 0x8200061D 861 # [CSSVER]: 862 # [Section Version]: 1 863 # [Creator Subsystem]: PHYP 864 # [BMC Event Log Id]: 341 865 # [Committed at]: 03/25/1920 12:06:22 866 # [User Header]: 867 # [Log Committed by]: 0x4552 868 # [Action Flags]: 869 # [0]: Report Externally 870 # [Subsystem]: I/O Subsystem 871 # [Event Type]: Miscellaneous, Informational Only 872 # [Sub-section type]: 0 873 # [Event Scope]: Entire Platform 874 # [Event Severity]: Informational Event 875 # [Host Transmission]: Not Sent 876 # [Section Version]: 1 877 878 ${pel_section_output}= Get From Dictionary ${pel_output} ${pel_section} 879 ${pel_field_output}= Get From Dictionary ${pel_section_output} ${pel_field} 880 Run Keyword If '${pel_field_output}' in @{pel_field_value} Append To List ${pel_id_list} ${id} 881 END 882 Sort List ${pel_id_list} 883 884 RETURN ${pel_id_list} 885 886 887Get PEL Log Via BMC CLI 888 [Documentation] Returns the list of PEL IDs using BMC CLI. 889 890 ${pel_records}= Peltool -l 891 ${ids}= Get Dictionary Keys ${pel_records} 892 Sort List ${ids} 893 894 RETURN ${ids} 895 896 897Get PEL Field Value 898 [Documentation] Returns the value of given PEL's field. 899 [Arguments] ${pel_id} ${pel_section} ${pel_field} 900 901 # Description of argument(s): 902 # pel_id The ID of PEL (e.g. 0x5000002D, 0x5000002E). 903 # pel_section The section of PEL (e.g. Private Header, User Header) 904 # pel_field The PEL field (e.g. Event Severity, Event Type). 905 906 ${pel_output}= Peltool -i ${pel_id} 907 908 # Example of PEL output from "peltool -i <id>" command. 909 # [Private Header]: 910 # [Created at]: 08/24/1928 12:04:06 911 # [Created by]: 0x584D 912 # [Sub-section type]: 0 913 # [Entry Id]: 0x50000BB7 914 # [Platform Log Id]: 0x8200061D 915 # [CSSVER]: 916 # [Section Version]: 1 917 # [Creator Subsystem]: PHYP 918 # [BMC Event Log Id]: 341 919 # [Committed at]: 03/25/1920 12:06:22 920 # [User Header]: 921 # [Log Committed by]: 0x4552 922 # [Action Flags]: 923 # [0]: Report Externally 924 # [Subsystem]: I/O Subsystem 925 # [Event Type]: Miscellaneous, Informational Only 926 # [Sub-section type]: 0 927 # [Event Scope]: Entire Platform 928 # [Event Severity]: Informational Event 929 # [Host Transmission]: Not Sent 930 # [Section Version]: 1 931 932 ${pel_section_output}= Get From Dictionary ${pel_output} ${pel_section} 933 ${pel_field_output}= Get From Dictionary ${pel_section_output} ${pel_field} 934 935 RETURN ${pel_field_output} 936 937 938Verify PEL Transmission To Host 939 [Documentation] Inject PEL log of given type and verify its host transmission state. 940 [Arguments] ${error_type} ${host_state} ${expected_transmission_state} 941 942 # Description of argument(s): 943 # error_type Type of error log to be injected. 944 # host_state Host state which is required before error log injection. 945 # expected_transmission_state Expected host transmission state of PEL log. 946 947 # Get system in required state. 948 Run Keyword If '${host_state}' == 'Off' 949 ... Redfish Power Off stack_mode=skip 950 ... ELSE IF '${host_state}' == 'On' 951 ... Run Keywords Redfish Power On stack_mode=skip AND 952 ... Wait For Host To Ping ${OS_HOST} 5 min 10 sec 953 954 Redfish Purge Event Log 955 956 # Inject required error log. 957 Run Keyword If "${error_type}" == "informational_error" 958 ... BMC Execute Command ${CMD_INFORMATIONAL_ERROR} 959 ... ELSE IF "${error_type}" == "unrecoverable_error" 960 ... BMC Execute Command ${CMD_UNRECOVERABLE_ERROR} 961 ... ELSE IF "${error_type}" == "predictive_error" 962 ... BMC Execute Command ${CMD_PREDICTIVE_ERROR} 963 964 ${pel_records}= Get Pel Data From Bmc True True 965 ${ids}= Get Dictionary Keys ${pel_records} 966 ${pel_id}= Get From List ${ids} -1 967 968 # Check host transmission state for the cases where PEL is 969 # expected to be offloaded to HOST. 970 Run Keyword If "${expected_transmission_state}" == "Acked" 971 ... Wait Until Keyword Succeeds 15 min 10 sec 972 ... Check If PEL Transmission State Is Expected ${pel_id} Acked 973 974 # Adding delay before checking host transmission for the cases where PEL is 975 # not expected to be offloaded to HOST. 976 Run Keyword If "${expected_transmission_state}" == "Not sent" 977 ... Run Keywords Sleep 120s AND 978 ... Check If PEL Transmission State Is Expected ${pel_id} Not sent 979 980 981Check If PEL Transmission State Is Expected 982 [Documentation] Check if PEL's host transmission state is matching expected state. 983 [Arguments] ${pel_id} ${expected_transmission_state} 984 985 # Description of argument(s): 986 # expected_transmission_state Expected transmission state of PEL log. 987 988 # Check the transmission details in the error log. 989 ${host_transmission}= Get PEL Field Value ${pel_id} User Header Host Transmission 990 Should Be Equal ${host_transmission} ${expected_transmission_state} 991