| George Keishing | e7e9171 | 2021-09-03 11:28:44 -0500 | [diff] [blame] | 1 | #!/usr/bin/env python3 | 
| Rahul Maheshwari | faa5d20 | 2020-02-24 23:32:57 -0600 | [diff] [blame] | 2 |  | 
|  | 3 | r""" | 
|  | 4 | PEL functions. | 
|  | 5 | """ | 
|  | 6 |  | 
| Rahul Maheshwari | faa5d20 | 2020-02-24 23:32:57 -0600 | [diff] [blame] | 7 | import json | 
| George Keishing | 48ffa2c | 2022-02-17 01:42:41 -0600 | [diff] [blame] | 8 | import os | 
|  | 9 | import sys | 
| Patrick Williams | 20f3871 | 2022-12-08 06:18:26 -0600 | [diff] [blame] | 10 |  | 
|  | 11 | import bmc_ssh_utils as bsu | 
|  | 12 | import func_args as fa | 
| George Keishing | 48ffa2c | 2022-02-17 01:42:41 -0600 | [diff] [blame] | 13 | from robot.libraries.BuiltIn import BuiltIn | 
|  | 14 |  | 
|  | 15 | base_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) | 
|  | 16 | sys.path.append(base_path + "/data/") | 
|  | 17 |  | 
| George Keishing | 0967989 | 2022-12-08 08:21:52 -0600 | [diff] [blame] | 18 | import pel_variables  # NOQA | 
| George Keishing | 37c58c8 | 2022-12-08 07:42:54 -0600 | [diff] [blame] | 19 |  | 
| Rahul Maheshwari | faa5d20 | 2020-02-24 23:32:57 -0600 | [diff] [blame] | 20 |  | 
| Sridevi Ramesh | 6e0e091 | 2021-11-16 11:17:37 -0600 | [diff] [blame] | 21 | class peltool_exception(Exception): | 
|  | 22 | r""" | 
|  | 23 | Base class for peltool related exceptions. | 
|  | 24 | """ | 
| George Keishing | 48ffa2c | 2022-02-17 01:42:41 -0600 | [diff] [blame] | 25 |  | 
| Sridevi Ramesh | 6e0e091 | 2021-11-16 11:17:37 -0600 | [diff] [blame] | 26 | def __init__(self, message): | 
|  | 27 | self.message = message | 
|  | 28 | super().__init__(self.message) | 
|  | 29 |  | 
|  | 30 |  | 
| Michael Walsh | a20876d | 2020-03-18 16:32:37 -0500 | [diff] [blame] | 31 | def peltool(option_string, parse_json=True, **bsu_options): | 
| Rahul Maheshwari | faa5d20 | 2020-02-24 23:32:57 -0600 | [diff] [blame] | 32 | 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 Walsh | a20876d | 2020-03-18 16:32:37 -0500 | [diff] [blame] | 52 | 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 Maheshwari | faa5d20 | 2020-02-24 23:32:57 -0600 | [diff] [blame] | 57 | """ | 
|  | 58 |  | 
|  | 59 | bsu_options = fa.args_to_objects(bsu_options) | 
| Patrick Williams | 20f3871 | 2022-12-08 06:18:26 -0600 | [diff] [blame] | 60 | out_buf, stderr, rc = bsu.bmc_execute_command( | 
|  | 61 | "peltool " + option_string, **bsu_options | 
|  | 62 | ) | 
| Michael Walsh | a20876d | 2020-03-18 16:32:37 -0500 | [diff] [blame] | 63 | if parse_json: | 
|  | 64 | try: | 
|  | 65 | return json.loads(out_buf) | 
| Sridevi Ramesh | c6dd799 | 2022-02-10 01:06:47 -0600 | [diff] [blame] | 66 | except ValueError: | 
| Michael Walsh | a20876d | 2020-03-18 16:32:37 -0500 | [diff] [blame] | 67 | return {} | 
| Rahul Maheshwari | faa5d20 | 2020-02-24 23:32:57 -0600 | [diff] [blame] | 68 | return out_buf | 
| Sridevi Ramesh | 6e0e091 | 2021-11-16 11:17:37 -0600 | [diff] [blame] | 69 |  | 
|  | 70 |  | 
| Patrick Williams | 20f3871 | 2022-12-08 06:18:26 -0600 | [diff] [blame] | 71 | def get_pel_data_from_bmc( | 
|  | 72 | include_hidden_pels=False, include_informational_pels=False | 
|  | 73 | ): | 
| Sridevi Ramesh | 2930050 | 2022-10-21 02:28:24 -0500 | [diff] [blame] | 74 | r""" | 
|  | 75 | Returns PEL data from BMC else throws exception. | 
| Sridevi Ramesh | d1cb325 | 2022-11-28 10:04:05 -0600 | [diff] [blame] | 76 |  | 
|  | 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 Ramesh | 2930050 | 2022-10-21 02:28:24 -0500 | [diff] [blame] | 82 | """ | 
|  | 83 | try: | 
| Sridevi Ramesh | d1cb325 | 2022-11-28 10:04:05 -0600 | [diff] [blame] | 84 | 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 Ramesh | 2930050 | 2022-10-21 02:28:24 -0500 | [diff] [blame] | 90 | 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 Ramesh | d1cb325 | 2022-11-28 10:04:05 -0600 | [diff] [blame] | 97 | def fetch_all_pel_ids_for_src(src_id, severity, include_hidden_pels=False): | 
| Sridevi Ramesh | 6e0e091 | 2021-11-16 11:17:37 -0600 | [diff] [blame] | 98 | r""" | 
| Sridevi Ramesh | c6dd799 | 2022-02-10 01:06:47 -0600 | [diff] [blame] | 99 | Fetch all PEL IDs for the input SRC ID based on the severity type | 
|  | 100 | in the list format. | 
| Sridevi Ramesh | 6e0e091 | 2021-11-16 11:17:37 -0600 | [diff] [blame] | 101 |  | 
|  | 102 | Description of arguments: | 
| Sridevi Ramesh | d1cb325 | 2022-11-28 10:04:05 -0600 | [diff] [blame] | 103 | 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 Ramesh | 6e0e091 | 2021-11-16 11:17:37 -0600 | [diff] [blame] | 108 | """ | 
|  | 109 |  | 
| Sridevi Ramesh | 6e0e091 | 2021-11-16 11:17:37 -0600 | [diff] [blame] | 110 | try: | 
| Sridevi Ramesh | c6dd799 | 2022-02-10 01:06:47 -0600 | [diff] [blame] | 111 | src_pel_ids = [] | 
| Sridevi Ramesh | d1cb325 | 2022-11-28 10:04:05 -0600 | [diff] [blame] | 112 | pel_data = get_pel_data_from_bmc(include_hidden_pels) | 
| Sridevi Ramesh | 6e0e091 | 2021-11-16 11:17:37 -0600 | [diff] [blame] | 113 | pel_id_list = pel_data.keys() | 
| Sridevi Ramesh | c6dd799 | 2022-02-10 01:06:47 -0600 | [diff] [blame] | 114 | for pel_id in pel_id_list: | 
|  | 115 | # Check if required SRC ID with severity is present | 
| Patrick Williams | 20f3871 | 2022-12-08 06:18:26 -0600 | [diff] [blame] | 116 | if (pel_data[pel_id]["SRC"] == src_id) and ( | 
|  | 117 | pel_data[pel_id]["Sev"] == severity | 
|  | 118 | ): | 
| Sridevi Ramesh | c6dd799 | 2022-02-10 01:06:47 -0600 | [diff] [blame] | 119 | src_pel_ids.append(pel_id) | 
|  | 120 |  | 
|  | 121 | if not src_pel_ids: | 
| Patrick Williams | 20f3871 | 2022-12-08 06:18:26 -0600 | [diff] [blame] | 122 | raise peltool_exception( | 
|  | 123 | src_id + " with severity " + severity + " not present" | 
|  | 124 | ) | 
| Sridevi Ramesh | 6e0e091 | 2021-11-16 11:17:37 -0600 | [diff] [blame] | 125 | except Exception as e: | 
| Patrick Williams | 20f3871 | 2022-12-08 06:18:26 -0600 | [diff] [blame] | 126 | raise peltool_exception( | 
|  | 127 | "Failed to fetch PEL ID for required SRC : " + str(e) | 
|  | 128 | ) | 
| Sridevi Ramesh | c6dd799 | 2022-02-10 01:06:47 -0600 | [diff] [blame] | 129 | return src_pel_ids | 
| Sridevi Ramesh | 6e0e091 | 2021-11-16 11:17:37 -0600 | [diff] [blame] | 130 |  | 
|  | 131 |  | 
| Sridevi Ramesh | d1cb325 | 2022-11-28 10:04:05 -0600 | [diff] [blame] | 132 | def fetch_all_src(include_hidden_pels=False): | 
| Sridevi Ramesh | 6e0e091 | 2021-11-16 11:17:37 -0600 | [diff] [blame] | 133 | r""" | 
| Sridevi Ramesh | c6dd799 | 2022-02-10 01:06:47 -0600 | [diff] [blame] | 134 | Fetch all SRC IDs from peltool in the list format. | 
| Sridevi Ramesh | d1cb325 | 2022-11-28 10:04:05 -0600 | [diff] [blame] | 135 |  | 
|  | 136 | include_hidden_pels       True/False (default: False). | 
|  | 137 | Set True to get hidden PELs else False. | 
| Sridevi Ramesh | 6e0e091 | 2021-11-16 11:17:37 -0600 | [diff] [blame] | 138 | """ | 
| Sridevi Ramesh | 6e0e091 | 2021-11-16 11:17:37 -0600 | [diff] [blame] | 139 | try: | 
| Sridevi Ramesh | c6dd799 | 2022-02-10 01:06:47 -0600 | [diff] [blame] | 140 | src_id = [] | 
| Sridevi Ramesh | d1cb325 | 2022-11-28 10:04:05 -0600 | [diff] [blame] | 141 | pel_data = get_pel_data_from_bmc(include_hidden_pels) | 
| Sridevi Ramesh | c6dd799 | 2022-02-10 01:06:47 -0600 | [diff] [blame] | 142 | 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 Ramesh | 6bf2363 | 2022-11-25 05:55:38 -0600 | [diff] [blame] | 146 | print("SRC IDs: " + str(src_id)) | 
| Sridevi Ramesh | 6e0e091 | 2021-11-16 11:17:37 -0600 | [diff] [blame] | 147 | except Exception as e: | 
|  | 148 | raise peltool_exception("Failed to fetch all SRCs : " + str(e)) | 
|  | 149 | return src_id | 
| Sridevi Ramesh | 6bf2363 | 2022-11-25 05:55:38 -0600 | [diff] [blame] | 150 |  | 
|  | 151 |  | 
| Patrick Williams | 20f3871 | 2022-12-08 06:18:26 -0600 | [diff] [blame] | 152 | def check_for_unexpected_src( | 
|  | 153 | unexpected_src_list=[], include_hidden_pels=False | 
|  | 154 | ): | 
| Sridevi Ramesh | 6bf2363 | 2022-11-25 05:55:38 -0600 | [diff] [blame] | 155 | 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 Ramesh | d1cb325 | 2022-11-28 10:04:05 -0600 | [diff] [blame] | 162 |  | 
|  | 163 | include_hidden_pels       True/False (default: False). | 
|  | 164 | Set True to get hidden PELs else False. | 
| Sridevi Ramesh | 6bf2363 | 2022-11-25 05:55:38 -0600 | [diff] [blame] | 165 | """ | 
|  | 166 | try: | 
|  | 167 | unexpected_src_count = 0 | 
|  | 168 | if not unexpected_src_list: | 
|  | 169 | print("Unexpected SRC list is empty.") | 
| Sridevi Ramesh | d1cb325 | 2022-11-28 10:04:05 -0600 | [diff] [blame] | 170 | src_data = fetch_all_src(include_hidden_pels) | 
| Sridevi Ramesh | 6bf2363 | 2022-11-25 05:55:38 -0600 | [diff] [blame] | 171 | 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 Williams | 20f3871 | 2022-12-08 06:18:26 -0600 | [diff] [blame] | 175 | if unexpected_src_count >= 1: | 
| Sridevi Ramesh | 6bf2363 | 2022-11-25 05:55:38 -0600 | [diff] [blame] | 176 | raise peltool_exception("Unexpected SRC found.") | 
|  | 177 |  | 
|  | 178 | except Exception as e: | 
| Patrick Williams | 20f3871 | 2022-12-08 06:18:26 -0600 | [diff] [blame] | 179 | raise peltool_exception( | 
|  | 180 | "Failed to verify unexpected SRC list : " + str(e) | 
|  | 181 | ) | 
| Sridevi Ramesh | 6bf2363 | 2022-11-25 05:55:38 -0600 | [diff] [blame] | 182 | return unexpected_src_count | 
| Anusha Dathatri | e8801a3 | 2022-11-28 04:56:31 -0600 | [diff] [blame] | 183 |  | 
|  | 184 |  | 
|  | 185 | def 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 Dathatri | 5636ad1 | 2022-11-29 04:26:00 -0600 | [diff] [blame] | 199 |  | 
|  | 200 |  | 
|  | 201 | def 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 |