summaryrefslogtreecommitdiffstats
path: root/extensions/openpower-pels/registry.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/openpower-pels/registry.cpp')
-rw-r--r--extensions/openpower-pels/registry.cpp90
1 files changed, 63 insertions, 27 deletions
diff --git a/extensions/openpower-pels/registry.cpp b/extensions/openpower-pels/registry.cpp
index d749ab9..3c4e016 100644
--- a/extensions/openpower-pels/registry.cpp
+++ b/extensions/openpower-pels/registry.cpp
@@ -264,37 +264,34 @@ uint16_t getComponentID(uint8_t srcType, uint16_t reasonCode,
} // namespace helper
-std::optional<Entry> Registry::lookup(const std::string& name)
+std::optional<Entry> Registry::lookup(const std::string& name, LookupType type,
+ bool toCache)
{
- // Look in /etc first in case someone put a test file there
- fs::path debugFile{fs::path{debugFilePath} / registryFileName};
- nlohmann::json registry;
- std::ifstream file;
-
- if (fs::exists(debugFile))
- {
- log<level::INFO>("Using debug PEL message registry");
- file.open(debugFile);
- }
- else
- {
- file.open(_registryFile);
- }
-
- try
+ std::optional<nlohmann::json> registryTmp;
+ auto& registryOpt = (_registry) ? _registry : registryTmp;
+ if (!registryOpt)
{
- registry = nlohmann::json::parse(file);
- }
- catch (std::exception& e)
- {
- log<level::ERR>("Error parsing message registry JSON",
- entry("JSON_ERROR=%s", e.what()));
- return std::nullopt;
+ registryOpt = readRegistry(_registryFile);
+ if (!registryOpt)
+ {
+ return std::nullopt;
+ }
+ else if (toCache)
+ {
+ // Save message registry in memory for peltool
+ _registry = std::move(registryTmp);
+ }
}
-
+ auto& reg = (_registry) ? _registry : registryTmp;
+ const auto& registry = reg.value();
// Find an entry with this name in the PEL array.
- auto e = std::find_if(registry["PELs"].begin(), registry["PELs"].end(),
- [&name](const auto& j) { return name == j["Name"]; });
+ auto e = std::find_if(
+ registry["PELs"].begin(), registry["PELs"].end(),
+ [&name, &type](const auto& j) {
+ return ((name == j["Name"] && type == LookupType::name) ||
+ (name == j["SRC"]["ReasonCode"] &&
+ type == LookupType::reasonCode));
+ });
if (e != registry["PELs"].end())
{
@@ -371,6 +368,14 @@ std::optional<Entry> Registry::lookup(const std::string& name)
entry.src.powerFault = src["PowerFault"];
}
+ auto& doc = (*e)["Documentation"];
+ entry.doc.message = doc["Message"];
+ entry.doc.description = doc["Description"];
+ if (doc.find("MessageArgSources") != doc.end())
+ {
+ entry.doc.messageArgSources = doc["MessageArgSources"];
+ }
+
return entry;
}
catch (std::exception& e)
@@ -383,6 +388,37 @@ std::optional<Entry> Registry::lookup(const std::string& name)
return std::nullopt;
}
+std::optional<nlohmann::json>
+ Registry::readRegistry(const std::filesystem::path& registryFile)
+{
+ // Look in /etc first in case someone put a test file there
+ fs::path debugFile{fs::path{debugFilePath} / registryFileName};
+ nlohmann::json registry;
+ std::ifstream file;
+
+ if (fs::exists(debugFile))
+ {
+ log<level::INFO>("Using debug PEL message registry");
+ file.open(debugFile);
+ }
+ else
+ {
+ file.open(registryFile);
+ }
+
+ try
+ {
+ registry = nlohmann::json::parse(file);
+ }
+ catch (std::exception& e)
+ {
+ log<level::ERR>("Error parsing message registry JSON",
+ entry("JSON_ERROR=%s", e.what()));
+ return std::nullopt;
+ }
+ return registry;
+}
+
} // namespace message
} // namespace pels
} // namespace openpower
OpenPOWER on IntegriCloud