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