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