blob: 5f42070c272f5bebcf69a29c676661aebf69c98f [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 Williams20f38712022-12-08 06:18:26 -060010
11import bmc_ssh_utils as bsu
12import func_args as fa
George Keishing48ffa2c2022-02-17 01:42:41 -060013from robot.libraries.BuiltIn import BuiltIn
14
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
Sridevi Ramesh6e0e0912021-11-16 11:17:37 -060021class peltool_exception(Exception):
22 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):
Michael Walsha20876d2020-03-18 16:32:37 -050052 option_string A string of options which are to be processed by the peltool command.
53 parse_json Indicates that the raw JSON data should parsed into a list of
54 dictionaries.
55 bsu_options Options to be passed directly to bmc_execute_command. See its prolog for
56 details.
Rahul Maheshwarifaa5d202020-02-24 23:32:57 -060057 """
58
59 bsu_options = fa.args_to_objects(bsu_options)
Patrick Williams20f38712022-12-08 06:18:26 -060060 out_buf, stderr, rc = bsu.bmc_execute_command(
61 "peltool " + option_string, **bsu_options
62 )
Michael Walsha20876d2020-03-18 16:32:37 -050063 if parse_json:
64 try:
65 return json.loads(out_buf)
Sridevi Rameshc6dd7992022-02-10 01:06:47 -060066 except ValueError:
Michael Walsha20876d2020-03-18 16:32:37 -050067 return {}
Rahul Maheshwarifaa5d202020-02-24 23:32:57 -060068 return out_buf
Sridevi Ramesh6e0e0912021-11-16 11:17:37 -060069
70
Patrick Williams20f38712022-12-08 06:18:26 -060071def get_pel_data_from_bmc(
72 include_hidden_pels=False, include_informational_pels=False
73):
Sridevi Ramesh29300502022-10-21 02:28:24 -050074 r"""
75 Returns PEL data from BMC else throws exception.
Sridevi Rameshd1cb3252022-11-28 10:04:05 -060076
77 Description of arguments:
78 include_hidden_pels True/False (default: False).
79 Set True to get hidden PELs else False.
80 include_informational_pels True/False (default: False).
81 Set True to get informational PELs else False.
Sridevi Ramesh29300502022-10-21 02:28:24 -050082 """
83 try:
Sridevi Rameshd1cb3252022-11-28 10:04:05 -060084 pel_cmd = " -l"
85 if include_hidden_pels:
86 pel_cmd = pel_cmd + " -h"
87 if include_informational_pels:
88 pel_cmd = pel_cmd + " -f"
89 pel_data = peltool(pel_cmd)
Sridevi Ramesh29300502022-10-21 02:28:24 -050090 if not pel_data:
91 print("No PEL data present in BMC ...")
92 except Exception as e:
93 raise peltool_exception("Failed to get PEL data from BMC : " + str(e))
94 return pel_data
95
96
Sridevi Rameshd1cb3252022-11-28 10:04:05 -060097def fetch_all_pel_ids_for_src(src_id, severity, include_hidden_pels=False):
Sridevi Ramesh6e0e0912021-11-16 11:17:37 -060098 r"""
Sridevi Rameshc6dd7992022-02-10 01:06:47 -060099 Fetch all PEL IDs for the input SRC ID based on the severity type
100 in the list format.
Sridevi Ramesh6e0e0912021-11-16 11:17:37 -0600101
102 Description of arguments:
Sridevi Rameshd1cb3252022-11-28 10:04:05 -0600103 src_id SRC ID (e.g. BCXXYYYY).
104 severity PEL severity (e.g. "Predictive Error"
105 "Recovered Error").
106 include_hidden_pels True/False (default: False).
107 Set True to get hidden PELs else False.
Sridevi Ramesh6e0e0912021-11-16 11:17:37 -0600108 """
109
Sridevi Ramesh6e0e0912021-11-16 11:17:37 -0600110 try:
Sridevi Rameshc6dd7992022-02-10 01:06:47 -0600111 src_pel_ids = []
Sridevi Rameshd1cb3252022-11-28 10:04:05 -0600112 pel_data = get_pel_data_from_bmc(include_hidden_pels)
Sridevi Ramesh6e0e0912021-11-16 11:17:37 -0600113 pel_id_list = pel_data.keys()
Sridevi Rameshc6dd7992022-02-10 01:06:47 -0600114 for pel_id in pel_id_list:
115 # Check if required SRC ID with severity is present
Patrick Williams20f38712022-12-08 06:18:26 -0600116 if (pel_data[pel_id]["SRC"] == src_id) and (
117 pel_data[pel_id]["Sev"] == severity
118 ):
Sridevi Rameshc6dd7992022-02-10 01:06:47 -0600119 src_pel_ids.append(pel_id)
120
121 if not src_pel_ids:
Patrick Williams20f38712022-12-08 06:18:26 -0600122 raise peltool_exception(
123 src_id + " with severity " + severity + " not present"
124 )
Sridevi Ramesh6e0e0912021-11-16 11:17:37 -0600125 except Exception as e:
Patrick Williams20f38712022-12-08 06:18:26 -0600126 raise peltool_exception(
127 "Failed to fetch PEL ID for required SRC : " + str(e)
128 )
Sridevi Rameshc6dd7992022-02-10 01:06:47 -0600129 return src_pel_ids
Sridevi Ramesh6e0e0912021-11-16 11:17:37 -0600130
131
Sridevi Rameshd1cb3252022-11-28 10:04:05 -0600132def fetch_all_src(include_hidden_pels=False):
Sridevi Ramesh6e0e0912021-11-16 11:17:37 -0600133 r"""
Sridevi Rameshc6dd7992022-02-10 01:06:47 -0600134 Fetch all SRC IDs from peltool in the list format.
Sridevi Rameshd1cb3252022-11-28 10:04:05 -0600135
136 include_hidden_pels True/False (default: False).
137 Set True to get hidden PELs else False.
Sridevi Ramesh6e0e0912021-11-16 11:17:37 -0600138 """
Sridevi Ramesh6e0e0912021-11-16 11:17:37 -0600139 try:
Sridevi Rameshc6dd7992022-02-10 01:06:47 -0600140 src_id = []
Sridevi Rameshd1cb3252022-11-28 10:04:05 -0600141 pel_data = get_pel_data_from_bmc(include_hidden_pels)
Sridevi Rameshc6dd7992022-02-10 01:06:47 -0600142 if pel_data:
143 pel_id_list = pel_data.keys()
144 for pel_id in pel_id_list:
145 src_id.append(pel_data[pel_id]["SRC"])
Sridevi Ramesh6bf23632022-11-25 05:55:38 -0600146 print("SRC IDs: " + str(src_id))
Sridevi Ramesh6e0e0912021-11-16 11:17:37 -0600147 except Exception as e:
148 raise peltool_exception("Failed to fetch all SRCs : " + str(e))
149 return src_id
Sridevi Ramesh6bf23632022-11-25 05:55:38 -0600150
151
Patrick Williams20f38712022-12-08 06:18:26 -0600152def check_for_unexpected_src(
153 unexpected_src_list=[], include_hidden_pels=False
154):
Sridevi Ramesh6bf23632022-11-25 05:55:38 -0600155 r"""
156 From the given unexpected SRC list, check if any unexpected SRC created
157 on the BMC. Returns 0 if no SRC found else throws exception.
158
159 Description of arguments:
160 unexpected_src_list Give unexpected SRCs in the list format.
161 e.g.: ["BBXXYYYY", "AAXXYYYY"].
Sridevi Rameshd1cb3252022-11-28 10:04:05 -0600162
163 include_hidden_pels True/False (default: False).
164 Set True to get hidden PELs else False.
Sridevi Ramesh6bf23632022-11-25 05:55:38 -0600165 """
166 try:
167 unexpected_src_count = 0
168 if not unexpected_src_list:
169 print("Unexpected SRC list is empty.")
Sridevi Rameshd1cb3252022-11-28 10:04:05 -0600170 src_data = fetch_all_src(include_hidden_pels)
Sridevi Ramesh6bf23632022-11-25 05:55:38 -0600171 for src in unexpected_src_list:
172 if src in src_data:
173 print("Found an unexpected SRC : " + src)
174 unexpected_src_count = unexpected_src_count + 1
Patrick Williams20f38712022-12-08 06:18:26 -0600175 if unexpected_src_count >= 1:
Sridevi Ramesh6bf23632022-11-25 05:55:38 -0600176 raise peltool_exception("Unexpected SRC found.")
177
178 except Exception as e:
Patrick Williams20f38712022-12-08 06:18:26 -0600179 raise peltool_exception(
180 "Failed to verify unexpected SRC list : " + str(e)
181 )
Sridevi Ramesh6bf23632022-11-25 05:55:38 -0600182 return unexpected_src_count
Anusha Dathatrie8801a32022-11-28 04:56:31 -0600183
184
185def filter_unexpected_srcs(expected_srcs=None):
186 r"""
187 Return list of SRCs found in BMC after filtering expected SRCs.
188 If expected_srcs is None then all SRCs found in system are returned.
189
190 Description of arguments:
191 expected_srcs List of expected SRCs. E.g. ["BBXXYYYY", "AAXXYYYY"].
192 """
193
194 srcs_found = fetch_all_src()
195 if not expected_srcs:
196 expected_srcs = []
197 print(expected_srcs)
198 return list(set(srcs_found) - set(expected_srcs))
Anusha Dathatri5636ad12022-11-29 04:26:00 -0600199
200
201def get_bmc_event_log_id_for_pel(pel_id):
202 r"""
203 Return BMC event log ID for the given PEL ID.
204
205 Description of arguments:
206 pel_id PEL ID. E.g. 0x50000021.
207 """
208
209 pel_data = peltool("-i " + pel_id)
210 print(pel_data)
211 bmc_id_for_pel = pel_data["Private Header"]["BMC Event Log Id"]
212 return bmc_id_for_pel