#!/usr/bin/env python3 """Condenses the error policy table down to only the fields used by the BMC Code. This script pulls the following 4 fields out of the full JSON policy table and arranges them for easier searching: Error: The OpenBMC error. e.g. xyz.openbmc_project.Thermal.Error.PowerSupplyHot CommonEventID: Used to index into the online documentation. e.g. FQPSPCA0065M Modifier: Used in combination with the error to locate a table entry. e.g. Message: A short message describing the error. e.g. "Power supply 0 is too hot" There may be multiple CommonEventID/Modifier/Message groups per Error, which is why both the error and modifier are needed to find an entry. Example condensed entry, prettified: { "dtls":[ { "CEID":"FQPSPCA0065M", "mod":"/xyz/openbmc_project/inventory/system/ps0", "msg":"Power supply 0 is too hot" }, { "CEID":"FQPSPCA0066M", "mod":"/xyz/openbmc_project/inventory/system/ps1", "msg":"Power supply 1 is too hot" } ], "err":"xyz.openbmc_project.Thermal.Error.PowerSupplyHot" } """ import argparse import json def add_details(error, details, condensed): """Adds a details entry to an error""" found = False for errors in condensed: if errors["err"] == error: errors["dtls"].append(details) found = True break if not found: group = {} group["err"] = error group["dtls"] = [] group["dtls"].append(details) condensed.append(group) if __name__ == "__main__": parser = argparse.ArgumentParser(description="Error log policy condenser") parser.add_argument( "-p", "--policy", dest="policy_file", default="policyTable.json", help="Policy Table in JSON", ) parser.add_argument( "-c", "--condensed_policy", dest="condensed_file", default="condensed.json", help="Condensed policy output file in JSON", ) parser.add_argument( "-t", "--prettify_json", dest="prettify", default=False, action="store_true", help="Prettify the output JSON", ) args = parser.parse_args() with open(args.policy_file, "r") as table: contents = json.load(table) policytable = contents["events"] condensed = [] for name in policytable: details = {} # Parse the error||modifer line. The modifier is optional. separatorPos = name.find("||") if separatorPos != -1: error = name[0:separatorPos] modifier = name[separatorPos + 2:] details["mod"] = modifier else: error = name details["mod"] = "" # The table has some nonBMC errors - they have spaces - skip them if " " in error: print("Skipping error %s because of spaces" % error) continue details["msg"] = policytable[name]["Message"] details["CEID"] = policytable[name]["CommonEventID"] add_details(error, details, condensed) # if prettified there will be newlines indent_value = 2 if args.prettify else None with open(args.condensed_file, "w") as outfile: json.dump( condensed, outfile, separators=(",", ":"), indent=indent_value )