| #!/usr/bin/env python3 | 
 |  | 
 | r""" | 
 | PEL functions. | 
 | """ | 
 |  | 
 | import func_args as fa | 
 | import bmc_ssh_utils as bsu | 
 | import json | 
 |  | 
 |  | 
 | class peltool_exception(Exception): | 
 |     r""" | 
 |     Base class for peltool related exceptions. | 
 |     """ | 
 |     def __init__(self, message): | 
 |         self.message = message | 
 |         super().__init__(self.message) | 
 |  | 
 |  | 
 | def peltool(option_string, parse_json=True, **bsu_options): | 
 |     r""" | 
 |     Run peltool on the BMC with the caller's option string and return the result. | 
 |  | 
 |     Example: | 
 |  | 
 |     ${pel_results}=  Peltool  -l | 
 |     Rprint Vars  pel_results | 
 |  | 
 |     pel_results: | 
 |       [0x50000031]: | 
 |         [CompID]:                       0x1000 | 
 |         [PLID]:                         0x50000031 | 
 |         [Subsystem]:                    BMC Firmware | 
 |         [Message]:                      An application had an internal failure | 
 |         [SRC]:                          BD8D1002 | 
 |         [Commit Time]:                  02/25/2020  04:51:31 | 
 |         [Sev]:                          Unrecoverable Error | 
 |         [CreatorID]:                    BMC | 
 |  | 
 |     Description of argument(s): | 
 |     option_string                   A string of options which are to be processed by the peltool command. | 
 |     parse_json                      Indicates that the raw JSON data should parsed into a list of | 
 |                                     dictionaries. | 
 |     bsu_options                     Options to be passed directly to bmc_execute_command. See its prolog for | 
 |                                     details. | 
 |     """ | 
 |  | 
 |     bsu_options = fa.args_to_objects(bsu_options) | 
 |     out_buf, stderr, rc = bsu.bmc_execute_command('peltool ' + option_string, **bsu_options) | 
 |     if parse_json: | 
 |         try: | 
 |             return json.loads(out_buf) | 
 |         except json.JSONDecodeError: | 
 |             return {} | 
 |     return out_buf | 
 |  | 
 |  | 
 | def fetch_pelId_For_SRC(src_id): | 
 |     r""" | 
 |     Fetch PEL ID for the input SRC ID | 
 |  | 
 |     Description of arguments: | 
 |     src_id  SRC ID (e.g. BC20E504) | 
 |     """ | 
 |  | 
 |     src_pel_id = [] | 
 |     try: | 
 |         pel_data = peltool(" -l") | 
 |         pel_id_list = pel_data.keys() | 
 |         for i in pel_id_list: | 
 |             if pel_data[i]["SRC"] == src_id: | 
 |                 src_pel_id.append(i) | 
 |     except Exception as e: | 
 |         raise peltool_exception("Failed to fetch PEL ID for required SRC : " + str(e)) | 
 |     return src_pel_id | 
 |  | 
 |  | 
 | def verify_SRC_details(pel_id, attn_type, target_type, signature_desc, | 
 |                        threshold_limit): | 
 |     r""" | 
 |     Verify SRC details for the given PEL ID based on the required | 
 |     target type, attention type, signature description, threshold limit. | 
 |  | 
 |     Description of arguments: | 
 |     pel_id          PEL ID for the required SRC details to verify | 
 |     target_type     Target type (e.g. TYPE_OMIC) | 
 |     attn_type       Attention type (e.g. RECCOVERABLE) | 
 |     signature_desc  Signature description of the error inject | 
 |     threshold_limit Threshold limit (e.g. 1, 5, 32) | 
 |     """ | 
 |  | 
 |     try: | 
 |         pel_cmd = " -i " + pel_id | 
 |         src_data = peltool(pel_cmd) | 
 |         src_dict = src_data["Primary SRC"]["SRC Details"] | 
 |         usr_data = src_data["User Data 4"] | 
 |         if (src_dict["Attention Type"] != attn_type): | 
 |             raise peltool_exception("Required Attention type " + attn_type + " not found") | 
 |         if target_type not in src_dict["Target Type"]: | 
 |             raise peltool_exception("Required Target type " + target_type + " not found") | 
 |         if signature_desc not in src_dict["Signature"]: | 
 |             raise peltool_exception("Required Signature " + signature_desc + " not found") | 
 |  | 
 |         if (int(threshold_limit) != usr_data["Error Threshold"]): | 
 |             raise peltool_exception("Required Threshold limit " + threshold_limit + " not found") | 
 |  | 
 |     except Exception as e: | 
 |         raise peltool_exception("Failed to verify SRC details : " + str(e)) | 
 |  | 
 |     return True | 
 |  | 
 |  | 
 | def fetch_All_SRC(): | 
 |     r""" | 
 |     Fetch all list of SRC IDs from peltool | 
 |     """ | 
 |  | 
 |     src_id = [] | 
 |     try: | 
 |         pel_data = peltool(" -l") | 
 |         pel_id_list = pel_data.keys() | 
 |         for i in pel_id_list: | 
 |             src_id.append(pel_data[i]["SRC"]) | 
 |     except Exception as e: | 
 |         raise peltool_exception("Failed to fetch all SRCs : " + str(e)) | 
 |     return src_id |