xref: /openbmc/openbmc-test-automation/lib/pel_utils.py (revision 20f38712b324e61a94e174017c487a0af4b373e1)
1e7e9171eSGeorge Keishing#!/usr/bin/env python3
2faa5d20aSRahul Maheshwari
3faa5d20aSRahul Maheshwarir"""
4faa5d20aSRahul MaheshwariPEL functions.
5faa5d20aSRahul Maheshwari"""
6faa5d20aSRahul Maheshwari
7faa5d20aSRahul Maheshwariimport json
848ffa2c2SGeorge Keishingimport os
948ffa2c2SGeorge Keishingimport sys
10*20f38712SPatrick Williams
11*20f38712SPatrick Williamsimport bmc_ssh_utils as bsu
12*20f38712SPatrick Williamsimport func_args as fa
1348ffa2c2SGeorge Keishingfrom robot.libraries.BuiltIn import BuiltIn
1448ffa2c2SGeorge Keishing
1548ffa2c2SGeorge Keishingbase_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
1648ffa2c2SGeorge Keishingsys.path.append(base_path + "/data/")
1748ffa2c2SGeorge Keishing
1809679890SGeorge Keishingimport pel_variables  # NOQA
1937c58c8cSGeorge Keishing
20faa5d20aSRahul Maheshwari
216e0e0919SSridevi Rameshclass peltool_exception(Exception):
226e0e0919SSridevi Ramesh    r"""
236e0e0919SSridevi Ramesh    Base class for peltool related exceptions.
246e0e0919SSridevi Ramesh    """
2548ffa2c2SGeorge Keishing
266e0e0919SSridevi Ramesh    def __init__(self, message):
276e0e0919SSridevi Ramesh        self.message = message
286e0e0919SSridevi Ramesh        super().__init__(self.message)
296e0e0919SSridevi Ramesh
306e0e0919SSridevi Ramesh
31a20876d3SMichael Walshdef peltool(option_string, parse_json=True, **bsu_options):
32faa5d20aSRahul Maheshwari    r"""
33faa5d20aSRahul Maheshwari    Run peltool on the BMC with the caller's option string and return the result.
34faa5d20aSRahul Maheshwari
35faa5d20aSRahul Maheshwari    Example:
36faa5d20aSRahul Maheshwari
37faa5d20aSRahul Maheshwari    ${pel_results}=  Peltool  -l
38faa5d20aSRahul Maheshwari    Rprint Vars  pel_results
39faa5d20aSRahul Maheshwari
40faa5d20aSRahul Maheshwari    pel_results:
41faa5d20aSRahul Maheshwari      [0x50000031]:
42faa5d20aSRahul Maheshwari        [CompID]:                       0x1000
43faa5d20aSRahul Maheshwari        [PLID]:                         0x50000031
44faa5d20aSRahul Maheshwari        [Subsystem]:                    BMC Firmware
45faa5d20aSRahul Maheshwari        [Message]:                      An application had an internal failure
46faa5d20aSRahul Maheshwari        [SRC]:                          BD8D1002
47faa5d20aSRahul Maheshwari        [Commit Time]:                  02/25/2020  04:51:31
48faa5d20aSRahul Maheshwari        [Sev]:                          Unrecoverable Error
49faa5d20aSRahul Maheshwari        [CreatorID]:                    BMC
50faa5d20aSRahul Maheshwari
51faa5d20aSRahul Maheshwari    Description of argument(s):
52faa5d20aSRahul Maheshwari    option_string                   A string of options which are to be processed by the peltool command.
53a20876d3SMichael Walsh    parse_json                      Indicates that the raw JSON data should parsed into a list of
54a20876d3SMichael Walsh                                    dictionaries.
55faa5d20aSRahul Maheshwari    bsu_options                     Options to be passed directly to bmc_execute_command. See its prolog for
56faa5d20aSRahul Maheshwari                                    details.
57faa5d20aSRahul Maheshwari    """
58faa5d20aSRahul Maheshwari
59faa5d20aSRahul Maheshwari    bsu_options = fa.args_to_objects(bsu_options)
60*20f38712SPatrick Williams    out_buf, stderr, rc = bsu.bmc_execute_command(
61*20f38712SPatrick Williams        "peltool " + option_string, **bsu_options
62*20f38712SPatrick Williams    )
63a20876d3SMichael Walsh    if parse_json:
64a20876d3SMichael Walsh        try:
65a20876d3SMichael Walsh            return json.loads(out_buf)
66c6dd799dSSridevi Ramesh        except ValueError:
67a20876d3SMichael Walsh            return {}
68faa5d20aSRahul Maheshwari    return out_buf
696e0e0919SSridevi Ramesh
706e0e0919SSridevi Ramesh
71*20f38712SPatrick Williamsdef get_pel_data_from_bmc(
72*20f38712SPatrick Williams    include_hidden_pels=False, include_informational_pels=False
73*20f38712SPatrick Williams):
742930050aSSridevi Ramesh    r"""
752930050aSSridevi Ramesh    Returns PEL data from BMC else throws exception.
76d1cb3252SSridevi Ramesh
77d1cb3252SSridevi Ramesh    Description of arguments:
78d1cb3252SSridevi Ramesh    include_hidden_pels           True/False (default: False).
79d1cb3252SSridevi Ramesh                                  Set True to get hidden PELs else False.
80d1cb3252SSridevi Ramesh    include_informational_pels    True/False (default: False).
81d1cb3252SSridevi Ramesh                                  Set True to get informational PELs else False.
822930050aSSridevi Ramesh    """
832930050aSSridevi Ramesh    try:
84d1cb3252SSridevi Ramesh        pel_cmd = " -l"
85d1cb3252SSridevi Ramesh        if include_hidden_pels:
86d1cb3252SSridevi Ramesh            pel_cmd = pel_cmd + " -h"
87d1cb3252SSridevi Ramesh        if include_informational_pels:
88d1cb3252SSridevi Ramesh            pel_cmd = pel_cmd + " -f"
89d1cb3252SSridevi Ramesh        pel_data = peltool(pel_cmd)
902930050aSSridevi Ramesh        if not pel_data:
912930050aSSridevi Ramesh            print("No PEL data present in BMC ...")
922930050aSSridevi Ramesh    except Exception as e:
932930050aSSridevi Ramesh        raise peltool_exception("Failed to get PEL data from BMC : " + str(e))
942930050aSSridevi Ramesh    return pel_data
952930050aSSridevi Ramesh
962930050aSSridevi Ramesh
97d1cb3252SSridevi Rameshdef fetch_all_pel_ids_for_src(src_id, severity, include_hidden_pels=False):
986e0e0919SSridevi Ramesh    r"""
99c6dd799dSSridevi Ramesh    Fetch all PEL IDs for the input SRC ID based on the severity type
100c6dd799dSSridevi Ramesh    in the list format.
1016e0e0919SSridevi Ramesh
1026e0e0919SSridevi Ramesh    Description of arguments:
103d1cb3252SSridevi Ramesh    src_id                SRC ID (e.g. BCXXYYYY).
104c6dd799dSSridevi Ramesh    severity              PEL severity (e.g. "Predictive Error"
105c6dd799dSSridevi Ramesh                                             "Recovered Error").
106d1cb3252SSridevi Ramesh    include_hidden_pels   True/False (default: False).
107d1cb3252SSridevi Ramesh                          Set True to get hidden PELs else False.
1086e0e0919SSridevi Ramesh    """
1096e0e0919SSridevi Ramesh
1106e0e0919SSridevi Ramesh    try:
111c6dd799dSSridevi Ramesh        src_pel_ids = []
112d1cb3252SSridevi Ramesh        pel_data = get_pel_data_from_bmc(include_hidden_pels)
1136e0e0919SSridevi Ramesh        pel_id_list = pel_data.keys()
114c6dd799dSSridevi Ramesh        for pel_id in pel_id_list:
115c6dd799dSSridevi Ramesh            # Check if required SRC ID with severity is present
116*20f38712SPatrick Williams            if (pel_data[pel_id]["SRC"] == src_id) and (
117*20f38712SPatrick Williams                pel_data[pel_id]["Sev"] == severity
118*20f38712SPatrick Williams            ):
119c6dd799dSSridevi Ramesh                src_pel_ids.append(pel_id)
120c6dd799dSSridevi Ramesh
121c6dd799dSSridevi Ramesh        if not src_pel_ids:
122*20f38712SPatrick Williams            raise peltool_exception(
123*20f38712SPatrick Williams                src_id + " with severity " + severity + " not present"
124*20f38712SPatrick Williams            )
1256e0e0919SSridevi Ramesh    except Exception as e:
126*20f38712SPatrick Williams        raise peltool_exception(
127*20f38712SPatrick Williams            "Failed to fetch PEL ID for required SRC : " + str(e)
128*20f38712SPatrick Williams        )
129c6dd799dSSridevi Ramesh    return src_pel_ids
1306e0e0919SSridevi Ramesh
1316e0e0919SSridevi Ramesh
132d1cb3252SSridevi Rameshdef fetch_all_src(include_hidden_pels=False):
1336e0e0919SSridevi Ramesh    r"""
134c6dd799dSSridevi Ramesh    Fetch all SRC IDs from peltool in the list format.
135d1cb3252SSridevi Ramesh
136d1cb3252SSridevi Ramesh    include_hidden_pels       True/False (default: False).
137d1cb3252SSridevi Ramesh                              Set True to get hidden PELs else False.
1386e0e0919SSridevi Ramesh    """
1396e0e0919SSridevi Ramesh    try:
140c6dd799dSSridevi Ramesh        src_id = []
141d1cb3252SSridevi Ramesh        pel_data = get_pel_data_from_bmc(include_hidden_pels)
142c6dd799dSSridevi Ramesh        if pel_data:
1436e0e0919SSridevi Ramesh            pel_id_list = pel_data.keys()
144c6dd799dSSridevi Ramesh            for pel_id in pel_id_list:
145c6dd799dSSridevi Ramesh                src_id.append(pel_data[pel_id]["SRC"])
1466bf23630SSridevi Ramesh        print("SRC IDs: " + str(src_id))
1476e0e0919SSridevi Ramesh    except Exception as e:
1486e0e0919SSridevi Ramesh        raise peltool_exception("Failed to fetch all SRCs : " + str(e))
1496e0e0919SSridevi Ramesh    return src_id
1506bf23630SSridevi Ramesh
1516bf23630SSridevi Ramesh
152*20f38712SPatrick Williamsdef check_for_unexpected_src(
153*20f38712SPatrick Williams    unexpected_src_list=[], include_hidden_pels=False
154*20f38712SPatrick Williams):
1556bf23630SSridevi Ramesh    r"""
1566bf23630SSridevi Ramesh    From the given unexpected SRC list, check if any unexpected SRC created
1576bf23630SSridevi Ramesh    on the BMC. Returns 0 if no SRC found else throws exception.
1586bf23630SSridevi Ramesh
1596bf23630SSridevi Ramesh    Description of arguments:
1606bf23630SSridevi Ramesh    unexpected_src_list       Give unexpected SRCs in the list format.
1616bf23630SSridevi Ramesh                              e.g.: ["BBXXYYYY", "AAXXYYYY"].
162d1cb3252SSridevi Ramesh
163d1cb3252SSridevi Ramesh    include_hidden_pels       True/False (default: False).
164d1cb3252SSridevi Ramesh                              Set True to get hidden PELs else False.
1656bf23630SSridevi Ramesh    """
1666bf23630SSridevi Ramesh    try:
1676bf23630SSridevi Ramesh        unexpected_src_count = 0
1686bf23630SSridevi Ramesh        if not unexpected_src_list:
1696bf23630SSridevi Ramesh            print("Unexpected SRC list is empty.")
170d1cb3252SSridevi Ramesh        src_data = fetch_all_src(include_hidden_pels)
1716bf23630SSridevi Ramesh        for src in unexpected_src_list:
1726bf23630SSridevi Ramesh            if src in src_data:
1736bf23630SSridevi Ramesh                print("Found an unexpected SRC : " + src)
1746bf23630SSridevi Ramesh                unexpected_src_count = unexpected_src_count + 1
175*20f38712SPatrick Williams        if unexpected_src_count >= 1:
1766bf23630SSridevi Ramesh            raise peltool_exception("Unexpected SRC found.")
1776bf23630SSridevi Ramesh
1786bf23630SSridevi Ramesh    except Exception as e:
179*20f38712SPatrick Williams        raise peltool_exception(
180*20f38712SPatrick Williams            "Failed to verify unexpected SRC list : " + str(e)
181*20f38712SPatrick Williams        )
1826bf23630SSridevi Ramesh    return unexpected_src_count
183e8801a3fSAnusha Dathatri
184e8801a3fSAnusha Dathatri
185e8801a3fSAnusha Dathatridef filter_unexpected_srcs(expected_srcs=None):
186e8801a3fSAnusha Dathatri    r"""
187e8801a3fSAnusha Dathatri    Return list of SRCs found in BMC after filtering expected SRCs.
188e8801a3fSAnusha Dathatri    If expected_srcs is None then all SRCs found in system are returned.
189e8801a3fSAnusha Dathatri
190e8801a3fSAnusha Dathatri    Description of arguments:
191e8801a3fSAnusha Dathatri    expected_srcs       List of expected SRCs. E.g. ["BBXXYYYY", "AAXXYYYY"].
192e8801a3fSAnusha Dathatri    """
193e8801a3fSAnusha Dathatri
194e8801a3fSAnusha Dathatri    srcs_found = fetch_all_src()
195e8801a3fSAnusha Dathatri    if not expected_srcs:
196e8801a3fSAnusha Dathatri        expected_srcs = []
197e8801a3fSAnusha Dathatri    print(expected_srcs)
198e8801a3fSAnusha Dathatri    return list(set(srcs_found) - set(expected_srcs))
1995636ad12SAnusha Dathatri
2005636ad12SAnusha Dathatri
2015636ad12SAnusha Dathatridef get_bmc_event_log_id_for_pel(pel_id):
2025636ad12SAnusha Dathatri    r"""
2035636ad12SAnusha Dathatri    Return BMC event log ID for the given PEL ID.
2045636ad12SAnusha Dathatri
2055636ad12SAnusha Dathatri    Description of arguments:
2065636ad12SAnusha Dathatri    pel_id       PEL ID. E.g. 0x50000021.
2075636ad12SAnusha Dathatri    """
2085636ad12SAnusha Dathatri
2095636ad12SAnusha Dathatri    pel_data = peltool("-i " + pel_id)
2105636ad12SAnusha Dathatri    print(pel_data)
2115636ad12SAnusha Dathatri    bmc_id_for_pel = pel_data["Private Header"]["BMC Event Log Id"]
2125636ad12SAnusha Dathatri    return bmc_id_for_pel
213