blob: e621d5e4507209f487c4d38408cd6da33e86cefb [file] [log] [blame]
George Keishinge7e91712021-09-03 11:28:44 -05001#!/usr/bin/env python3
Michael Walsh90e14e02018-03-22 16:38:04 -05002
3r"""
4Provide useful error log utility keywords.
5"""
6
7import gen_print as gp
8import sys
9import os
10import imp
11base_path = os.path.dirname(os.path.dirname(
12 imp.find_module("gen_robot_print")[1])) + os.sep
13sys.path.append(base_path + "data/")
14import variables as var
Michael Walsh193f33a2018-10-04 15:15:09 -050015from robot.libraries.BuiltIn import BuiltIn
16import gen_robot_utils as gru
17gru.my_import_resource("logging_utils.robot")
Michael Walsh90e14e02018-03-22 16:38:04 -050018
19
George Keishing438fd3b2021-10-08 02:15:18 -050020redfish_support_trans_state = int(os.environ.get('REDFISH_SUPPORT_TRANS_STATE', 0)) or \
21 int(BuiltIn().get_variable_value("${REDFISH_SUPPORT_TRANS_STATE}", default=0))
22
23
Michael Walsh90e14e02018-03-22 16:38:04 -050024def print_error_logs(error_logs, key_list=None):
Michael Walsh90e14e02018-03-22 16:38:04 -050025 r"""
26 Print the error logs to the console screen.
27
28 This function provides the following benefits:
29 - It will specify print_var parms for the caller (e.g. hex=1).
30 - It is much easier to call this function than to generate the desired code
31 directly from a robot script.
32
33 Description of argument(s):
Joy Onyerikwu004ad3c2018-06-11 16:29:56 -050034 error_logs An error log dictionary such as the one
35 returned by the 'Get Error Logs' keyword.
36 key_list The list of keys to be printed. This may
37 be specified as either a python list
38 or a space-delimited string. In the
39 latter case, this function will convert
40 it to a python list. See the sprint_varx
41 function prolog for additionatl details.
Michael Walsh90e14e02018-03-22 16:38:04 -050042
43 Example use from a python script:
44
45 ${error_logs}= Get Error Logs
46 Print Error Logs ${error_logs} Message Timestamp
47
48 Sample output:
49
50 error_logs:
51 [/xyz/openbmc_project/logging/entry/3]:
52 [Timestamp]: 1521738335735
Joy Onyerikwu004ad3c2018-06-11 16:29:56 -050053 [Message]:
54 xyz.openbmc_project.Inventory.Error.Nonfunctional
Michael Walsh90e14e02018-03-22 16:38:04 -050055 [/xyz/openbmc_project/logging/entry/2]:
56 [Timestamp]: 1521738334637
Joy Onyerikwu004ad3c2018-06-11 16:29:56 -050057 [Message]:
58 xyz.openbmc_project.Inventory.Error.Nonfunctional
Michael Walsh90e14e02018-03-22 16:38:04 -050059 [/xyz/openbmc_project/logging/entry/1]:
60 [Timestamp]: 1521738300696
Joy Onyerikwu004ad3c2018-06-11 16:29:56 -050061 [Message]:
62 xyz.openbmc_project.Inventory.Error.Nonfunctional
Michael Walsh90e14e02018-03-22 16:38:04 -050063 [/xyz/openbmc_project/logging/entry/4]:
64 [Timestamp]: 1521738337915
Joy Onyerikwu004ad3c2018-06-11 16:29:56 -050065 [Message]:
66 xyz.openbmc_project.Inventory.Error.Nonfunctional
Michael Walsh90e14e02018-03-22 16:38:04 -050067
68 Another example call using a robot list:
69 ${error_logs}= Get Error Logs
70 ${key_list}= Create List Message Timestamp Severity
71 Print Error Logs ${error_logs} ${key_list}
72 """
73
74 if key_list is not None:
George Keishing36efbc02018-12-12 10:18:23 -060075 try:
Michael Walsh90e14e02018-03-22 16:38:04 -050076 key_list = key_list.split(" ")
George Keishing36efbc02018-12-12 10:18:23 -060077 except AttributeError:
78 pass
George Keishing438fd3b2021-10-08 02:15:18 -050079 if redfish_support_trans_state:
80 key_list.insert(0, var.REDFISH_BMC_LOGGING_ENTRY + ".*")
81 else:
82 key_list.insert(0, var.BMC_LOGGING_ENTRY + ".*")
Michael Walsh90e14e02018-03-22 16:38:04 -050083
Michael Walsh39c00512019-07-17 10:54:06 -050084 gp.print_var(error_logs, key_list=key_list)
Michael Walsh193f33a2018-10-04 15:15:09 -050085
86
87def get_esels(error_logs=None):
88 r"""
89 Get all available extended Service Event Logs (eSELs) and return as a list.
90
91 Example robot code:
92 ${esels}= Get Esels
93 Rprint Vars esels
94
95 Example output (excerpt):
96 esels:
97 esels[0]: ESEL=00 00 df 00 00...
98 esels[1]: ESEL=00 00 df 00 00...
99
100 Description of argument(s):
101 error_logs The error_log data, which can be obtained
102 from 'Get Error Logs'. If this value is
103 None, then this function will call 'Get
104 Error Logs' on the caller's behalf.
105 """
106
107 if error_logs is None:
108 error_logs = BuiltIn().run_keyword('Get Error Logs')
109
110 # Look for any error log entries containing the 'AdditionalData' field
111 # which in turn has an entry starting with "ESEL=". Here is an excerpt of
112 # the error_logs that contains such an entry.
113 # error_logs:
114 # [/xyz/openbmc_project/logging/entry/1]:
115 # [AdditionalData]:
116 # [AdditionalData][0]: CALLOUT_INVENTORY_PATH=/xyz/openbmc_project/inventory/system/chassis/mot...
117 # [AdditionalData][1]: ESEL=00 00 df 00 00 00 00 20 00 04...
118 esels = []
119 for error_log in error_logs.values():
120 if 'AdditionalData' in error_log:
121 for additional_data in error_log['AdditionalData']:
122 if additional_data.startswith('ESEL='):
123 esels.append(additional_data)
124
125 return esels