blob: 962d434b85d6e1adfef30a15445b3138c3687b61 [file] [log] [blame]
George Keishinge7e91712021-09-03 11:28:44 -05001#!/usr/bin/env python3
Rahul Maheshwarifaa5d202020-02-24 23:32:57 -06002
3r"""
4PEL functions.
5"""
6
Rahul Maheshwarifaa5d202020-02-24 23:32:57 -06007import json
George Keishing48ffa2c2022-02-17 01:42:41 -06008import os
9import sys
Patrick Williamsb813b552022-12-12 10:38:46 -060010from datetime import datetime
11
Patrick Williams20f38712022-12-08 06:18:26 -060012import bmc_ssh_utils as bsu
13import func_args as fa
George Keishing48ffa2c2022-02-17 01:42:41 -060014
15base_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
16sys.path.append(base_path + "/data/")
17
George Keishing09679892022-12-08 08:21:52 -060018import pel_variables # NOQA
George Keishing37c58c82022-12-08 07:42:54 -060019
Rahul Maheshwarifaa5d202020-02-24 23:32:57 -060020
Anusha Dathatri3914da72023-02-09 06:01:05 -060021class PeltoolException(Exception):
Sridevi Ramesh6e0e0912021-11-16 11:17:37 -060022 r"""
23 Base class for peltool related exceptions.
24 """
George Keishing48ffa2c2022-02-17 01:42:41 -060025
Sridevi Ramesh6e0e0912021-11-16 11:17:37 -060026 def __init__(self, message):
27 self.message = message
28 super().__init__(self.message)
29
30
Michael Walsha20876d2020-03-18 16:32:37 -050031def peltool(option_string, parse_json=True, **bsu_options):
Rahul Maheshwarifaa5d202020-02-24 23:32:57 -060032 r"""
33 Run peltool on the BMC with the caller's option string and return the result.
34
35 Example:
36
37 ${pel_results}= Peltool -l
38 Rprint Vars pel_results
39
40 pel_results:
41 [0x50000031]:
42 [CompID]: 0x1000
43 [PLID]: 0x50000031
44 [Subsystem]: BMC Firmware
45 [Message]: An application had an internal failure
46 [SRC]: BD8D1002
47 [Commit Time]: 02/25/2020 04:51:31
48 [Sev]: Unrecoverable Error
49 [CreatorID]: BMC
50
51 Description of argument(s):
Anusha Dathatri3914da72023-02-09 06:01:05 -060052 option_string A string of options which are to be
53 processed by the peltool command.
54 parse_json Indicates that the raw JSON data should
55 parsed into a list of dictionaries.
56 bsu_options Options to be passed directly to
57 bmc_execute_command. See its prolog for
Michael Walsha20876d2020-03-18 16:32:37 -050058 details.
Rahul Maheshwarifaa5d202020-02-24 23:32:57 -060059 """
60
61 bsu_options = fa.args_to_objects(bsu_options)
Anusha Dathatri3914da72023-02-09 06:01:05 -060062 out_buf, _, _ = bsu.bmc_execute_command(
Patrick Williams20f38712022-12-08 06:18:26 -060063 "peltool " + option_string, **bsu_options
64 )
Michael Walsha20876d2020-03-18 16:32:37 -050065 if parse_json:
66 try:
67 return json.loads(out_buf)
Anusha Dathatri1e8757a2023-09-21 13:02:31 -050068 except ValueError as e:
69 if type(out_buf) is str:
70 return out_buf
71 else:
72 print(str(e))
73 return {}
Rahul Maheshwarifaa5d202020-02-24 23:32:57 -060074 return out_buf
Sridevi Ramesh6e0e0912021-11-16 11:17:37 -060075
76
Patrick Williams20f38712022-12-08 06:18:26 -060077def get_pel_data_from_bmc(
78 include_hidden_pels=False, include_informational_pels=False
79):
Sridevi Ramesh29300502022-10-21 02:28:24 -050080 r"""
81 Returns PEL data from BMC else throws exception.
Sridevi Rameshd1cb3252022-11-28 10:04:05 -060082
83 Description of arguments:
84 include_hidden_pels True/False (default: False).
85 Set True to get hidden PELs else False.
86 include_informational_pels True/False (default: False).
87 Set True to get informational PELs else False.
Sridevi Ramesh29300502022-10-21 02:28:24 -050088 """
89 try:
Sridevi Rameshd1cb3252022-11-28 10:04:05 -060090 pel_cmd = " -l"
91 if include_hidden_pels:
92 pel_cmd = pel_cmd + " -h"
93 if include_informational_pels:
94 pel_cmd = pel_cmd + " -f"
95 pel_data = peltool(pel_cmd)
Sridevi Ramesh29300502022-10-21 02:28:24 -050096 if not pel_data:
97 print("No PEL data present in BMC ...")
Anusha Dathatri3914da72023-02-09 06:01:05 -060098 except Exception as exception:
99 raise PeltoolException(
100 "Failed to get PEL data from BMC : " + str(exception)
101 ) from exception
Sridevi Ramesh29300502022-10-21 02:28:24 -0500102 return pel_data
103
104
Sushil Singh28cedb12022-12-12 01:33:32 -0600105def verify_no_pel_exists_on_bmc():
106 r"""
107 Verify that no PEL exists in BMC. Raise an exception if it does.
108 """
109
110 try:
111 pel_data = get_pel_data_from_bmc()
112
113 if len(pel_data) == 0:
114 return True
Anusha Dathatri3914da72023-02-09 06:01:05 -0600115
116 print("PEL data present. \n", pel_data)
117 raise PeltoolException("PEL data present in BMC")
118 except Exception as exception:
119 raise PeltoolException(
120 "Failed to get PEL data from BMC : " + str(exception)
121 ) from exception
Sushil Singh28cedb12022-12-12 01:33:32 -0600122
123
124def compare_pel_and_redfish_event_log(pel_record, event_record):
125 r"""
126 Compare PEL log attributes like "SRC", "Created at" with Redfish
127 event log attributes like "EventId", "Created".
128 Return False if they do not match.
129
130 Description of arguments:
131 pel_record PEL record.
132 event_record Redfish event which is equivalent of PEL record.
133 """
134
135 try:
136 # Below is format of PEL record / event record and following
137 # i.e. "SRC", "Created at" from
138 # PEL record is compared with "EventId", "Created" from event record.
139
140 # PEL Log attributes
141 # SRC : XXXXXXXX
142 # Created at : 11/14/2022 12:38:04
143
144 # Event log attributes
145 # EventId : XXXXXXXX XXXXXXXX XXXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX
146
147 # Created : 2022-11-14T12:38:04+00:00
148
Anusha Dathatri3914da72023-02-09 06:01:05 -0600149 print(f"\nPEL records : {pel_record}")
150 print(f"\nEvent records : {event_record}")
Sushil Singh28cedb12022-12-12 01:33:32 -0600151
Patrick Williamsb813b552022-12-12 10:38:46 -0600152 pel_src = pel_record["pel_data"]["SRC"]
153 pel_created_time = pel_record["pel_detail_data"]["Private Header"][
154 "Created at"
155 ]
Sushil Singh28cedb12022-12-12 01:33:32 -0600156
Patrick Williamsb813b552022-12-12 10:38:46 -0600157 event_ids = (event_record["EventId"]).split(" ")
Sushil Singh28cedb12022-12-12 01:33:32 -0600158
Patrick Williamsb813b552022-12-12 10:38:46 -0600159 event_time_format = (event_record["Created"]).split("T")
160 event_date = (event_time_format[0]).split("-")
161 event_date = datetime(
162 int(event_date[0]), int(event_date[1]), int(event_date[2])
163 )
Sushil Singh28cedb12022-12-12 01:33:32 -0600164 event_date = event_date.strftime("%m/%d/%Y")
Patrick Williamsb813b552022-12-12 10:38:46 -0600165 event_sub_time_format = (event_time_format[1]).split("+")
Sushil Singh28cedb12022-12-12 01:33:32 -0600166 event_date_time = event_date + " " + event_sub_time_format[0]
167
Patrick Williamsb813b552022-12-12 10:38:46 -0600168 event_created_time = event_date_time.replace("-", "/")
Sushil Singh28cedb12022-12-12 01:33:32 -0600169
Anusha Dathatri3914da72023-02-09 06:01:05 -0600170 print(f"\nPEL SRC : {pel_src} | PEL Created Time : {pel_created_time}")
171
Patrick Williamsb813b552022-12-12 10:38:46 -0600172 print(
Anusha Dathatri3914da72023-02-09 06:01:05 -0600173 f"\nError event ID : {event_ids[0]} | Error Log Created Time "
174 + ": {event_created_time}"
Patrick Williamsb813b552022-12-12 10:38:46 -0600175 )
Sushil Singh28cedb12022-12-12 01:33:32 -0600176
177 if pel_src == event_ids[0] and pel_created_time == event_created_time:
Patrick Williamsb813b552022-12-12 10:38:46 -0600178 print(
179 "\nPEL SRC and created date time match with "
180 "event ID, created time"
181 )
Sushil Singh28cedb12022-12-12 01:33:32 -0600182 else:
Anusha Dathatri3914da72023-02-09 06:01:05 -0600183 raise PeltoolException(
Patrick Williamsb813b552022-12-12 10:38:46 -0600184 "\nPEL SRC and created date time did not "
185 "match with event ID, created time"
186 )
Anusha Dathatri3914da72023-02-09 06:01:05 -0600187 except Exception as exception:
188 raise PeltoolException(
George Keishinge16f1582022-12-15 07:32:21 -0600189 "Exception occurred during PEL and Event log "
Patrick Williamsb813b552022-12-12 10:38:46 -0600190 "comparison for SRC or event ID and created "
George Keishing7899a452023-02-15 02:46:54 -0600191 "time : " + str(exception)
Anusha Dathatri3914da72023-02-09 06:01:05 -0600192 ) from exception
Sushil Singh28cedb12022-12-12 01:33:32 -0600193
194
Sridevi Rameshd1cb3252022-11-28 10:04:05 -0600195def fetch_all_pel_ids_for_src(src_id, severity, include_hidden_pels=False):
Sridevi Ramesh6e0e0912021-11-16 11:17:37 -0600196 r"""
Sridevi Rameshc6dd7992022-02-10 01:06:47 -0600197 Fetch all PEL IDs for the input SRC ID based on the severity type
198 in the list format.
Sridevi Ramesh6e0e0912021-11-16 11:17:37 -0600199
200 Description of arguments:
Sridevi Rameshd1cb3252022-11-28 10:04:05 -0600201 src_id SRC ID (e.g. BCXXYYYY).
202 severity PEL severity (e.g. "Predictive Error"
203 "Recovered Error").
204 include_hidden_pels True/False (default: False).
205 Set True to get hidden PELs else False.
Sridevi Ramesh6e0e0912021-11-16 11:17:37 -0600206 """
207
Sridevi Ramesh6e0e0912021-11-16 11:17:37 -0600208 try:
Sridevi Rameshc6dd7992022-02-10 01:06:47 -0600209 src_pel_ids = []
Sridevi Rameshd1cb3252022-11-28 10:04:05 -0600210 pel_data = get_pel_data_from_bmc(include_hidden_pels)
Sridevi Ramesh6e0e0912021-11-16 11:17:37 -0600211 pel_id_list = pel_data.keys()
Sridevi Rameshc6dd7992022-02-10 01:06:47 -0600212 for pel_id in pel_id_list:
213 # Check if required SRC ID with severity is present
Sridevi Rameshf3299972022-12-18 03:27:22 -0600214 if src_id in pel_data[pel_id]["SRC"]:
215 if pel_data[pel_id]["Sev"] == severity:
216 src_pel_ids.append(pel_id)
Sridevi Rameshc6dd7992022-02-10 01:06:47 -0600217
218 if not src_pel_ids:
Anusha Dathatri3914da72023-02-09 06:01:05 -0600219 raise PeltoolException(
Patrick Williams20f38712022-12-08 06:18:26 -0600220 src_id + " with severity " + severity + " not present"
221 )
Anusha Dathatri3914da72023-02-09 06:01:05 -0600222 except Exception as exception:
223 raise PeltoolException(
224 "Failed to fetch PEL ID for required SRC : " + str(exception)
225 ) from exception
Sridevi Rameshc6dd7992022-02-10 01:06:47 -0600226 return src_pel_ids
Sridevi Ramesh6e0e0912021-11-16 11:17:37 -0600227
228
Sridevi Rameshd1cb3252022-11-28 10:04:05 -0600229def fetch_all_src(include_hidden_pels=False):
Sridevi Ramesh6e0e0912021-11-16 11:17:37 -0600230 r"""
Sridevi Rameshc6dd7992022-02-10 01:06:47 -0600231 Fetch all SRC IDs from peltool in the list format.
Sridevi Rameshd1cb3252022-11-28 10:04:05 -0600232
233 include_hidden_pels True/False (default: False).
234 Set True to get hidden PELs else False.
Sridevi Ramesh6e0e0912021-11-16 11:17:37 -0600235 """
Sridevi Ramesh6e0e0912021-11-16 11:17:37 -0600236 try:
Sridevi Rameshc6dd7992022-02-10 01:06:47 -0600237 src_id = []
Sridevi Rameshd1cb3252022-11-28 10:04:05 -0600238 pel_data = get_pel_data_from_bmc(include_hidden_pels)
Sridevi Rameshc6dd7992022-02-10 01:06:47 -0600239 if pel_data:
240 pel_id_list = pel_data.keys()
241 for pel_id in pel_id_list:
242 src_id.append(pel_data[pel_id]["SRC"])
Sridevi Ramesh6bf23632022-11-25 05:55:38 -0600243 print("SRC IDs: " + str(src_id))
Anusha Dathatri3914da72023-02-09 06:01:05 -0600244 except Exception as exception:
245 raise PeltoolException(
246 "Failed to fetch all SRCs : " + str(exception)
247 ) from exception
Sridevi Ramesh6e0e0912021-11-16 11:17:37 -0600248 return src_id
Sridevi Ramesh6bf23632022-11-25 05:55:38 -0600249
250
Patrick Williams20f38712022-12-08 06:18:26 -0600251def check_for_unexpected_src(
Anusha Dathatri3914da72023-02-09 06:01:05 -0600252 unexpected_src_list=None, include_hidden_pels=False
Patrick Williams20f38712022-12-08 06:18:26 -0600253):
Sridevi Ramesh6bf23632022-11-25 05:55:38 -0600254 r"""
255 From the given unexpected SRC list, check if any unexpected SRC created
256 on the BMC. Returns 0 if no SRC found else throws exception.
257
258 Description of arguments:
259 unexpected_src_list Give unexpected SRCs in the list format.
260 e.g.: ["BBXXYYYY", "AAXXYYYY"].
Sridevi Rameshd1cb3252022-11-28 10:04:05 -0600261
262 include_hidden_pels True/False (default: False).
263 Set True to get hidden PELs else False.
Sridevi Ramesh6bf23632022-11-25 05:55:38 -0600264 """
265 try:
266 unexpected_src_count = 0
267 if not unexpected_src_list:
268 print("Unexpected SRC list is empty.")
Sridevi Rameshd1cb3252022-11-28 10:04:05 -0600269 src_data = fetch_all_src(include_hidden_pels)
Sridevi Ramesh6bf23632022-11-25 05:55:38 -0600270 for src in unexpected_src_list:
271 if src in src_data:
272 print("Found an unexpected SRC : " + src)
273 unexpected_src_count = unexpected_src_count + 1
Patrick Williams20f38712022-12-08 06:18:26 -0600274 if unexpected_src_count >= 1:
Anusha Dathatri3914da72023-02-09 06:01:05 -0600275 raise PeltoolException("Unexpected SRC found.")
Sridevi Ramesh6bf23632022-11-25 05:55:38 -0600276
Anusha Dathatri3914da72023-02-09 06:01:05 -0600277 except Exception as exception:
278 raise PeltoolException(
279 "Failed to verify unexpected SRC list : " + str(exception)
280 ) from exception
Sridevi Ramesh6bf23632022-11-25 05:55:38 -0600281 return unexpected_src_count
Anusha Dathatrie8801a32022-11-28 04:56:31 -0600282
283
284def filter_unexpected_srcs(expected_srcs=None):
285 r"""
286 Return list of SRCs found in BMC after filtering expected SRCs.
287 If expected_srcs is None then all SRCs found in system are returned.
288
289 Description of arguments:
290 expected_srcs List of expected SRCs. E.g. ["BBXXYYYY", "AAXXYYYY"].
291 """
292
293 srcs_found = fetch_all_src()
294 if not expected_srcs:
295 expected_srcs = []
296 print(expected_srcs)
297 return list(set(srcs_found) - set(expected_srcs))
Anusha Dathatri5636ad12022-11-29 04:26:00 -0600298
299
300def get_bmc_event_log_id_for_pel(pel_id):
301 r"""
302 Return BMC event log ID for the given PEL ID.
303
304 Description of arguments:
305 pel_id PEL ID. E.g. 0x50000021.
306 """
307
308 pel_data = peltool("-i " + pel_id)
309 print(pel_data)
310 bmc_id_for_pel = pel_data["Private Header"]["BMC Event Log Id"]
311 return bmc_id_for_pel
Anusha Dathatri3914da72023-02-09 06:01:05 -0600312
313
314def get_latest_pels(number_of_pels=1):
315 r"""
316 Return latest PEL IDs.
317
318 Description of arguments:
319 number_of_pels Number of PELS to be returned.
320 """
321
322 pel_data = peltool("-lr")
323 pel_ids = list(pel_data.keys())
324 return pel_ids[:number_of_pels]