blob: 70c2c980dfc4777464bb226e445b4e1e4fa1c214 [file] [log] [blame]
#!/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. <an inventory callout>
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
)