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