add handler logic to handle SysEntityName
Add handler logic to handler for SysEntityName such that it splits the
true IPMI processing from the business logic.
Tested: Only ran unit-tests (added new ones).
Change-Id: I6d672a80f85843ff98c2c7e5daf4689932ff96f9
Signed-off-by: Patrick Venture <venture@google.com>
diff --git a/entity_name.cpp b/entity_name.cpp
index c070c84..ac04275 100644
--- a/entity_name.cpp
+++ b/entity_name.cpp
@@ -16,25 +16,19 @@
#include "entity_name.hpp"
+#include "errors.hpp"
+#include "handler.hpp"
#include "main.hpp"
#include <cstdint>
#include <cstring>
-#include <filesystem>
-#include <fstream>
-#include <map>
-#include <nlohmann/json.hpp>
-#include <phosphor-logging/elog-errors.hpp>
-#include <phosphor-logging/log.hpp>
#include <string>
#include <vector>
-#include <xyz/openbmc_project/Common/error.hpp>
namespace google
{
namespace ipmi
{
-namespace fs = std::filesystem;
namespace
{
@@ -44,65 +38,6 @@
#define MAX_IPMI_BUFFER 64
#endif
-using Json = nlohmann::json;
-
-using namespace phosphor::logging;
-using InternalFailure =
- sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
-
-static constexpr auto configFile =
- "/usr/share/ipmi-entity-association/entity_association_map.json";
-
-static const std::map<uint8_t, std::string> entityIdToName{
- {0x03, "cpu"},
- {0x04, "storage_device"},
- {0x06, "system_management_module"},
- {0x08, "memory_module"},
- {0x0B, "add_in_card"},
- {0x17, "system_chassis"},
- {0x20, "memory_device"}};
-
-Json parse_config()
-{
- std::ifstream jsonFile(configFile);
- if (!jsonFile.is_open())
- {
- log<level::ERR>("Entity association JSON file not found");
- elog<InternalFailure>();
- }
-
- auto data = Json::parse(jsonFile, nullptr, false);
- if (data.is_discarded())
- {
- log<level::ERR>("Entity association JSON parser failure");
- elog<InternalFailure>();
- }
-
- return data;
-}
-
-std::string read(const std::string& type, uint8_t instance, const Json& config)
-{
- static const std::vector<Json> empty{};
- std::vector<Json> readings = config.value(type, empty);
- std::string name = "";
- for (const auto& j : readings)
- {
- uint8_t instanceNum = j.value("instance", 0);
- // Not the instance we're interested in
- if (instanceNum != instance)
- {
- continue;
- }
-
- // Found the instance we're interested in
- name = j.value("name", "");
-
- break;
- }
- return name;
-}
-
} // namespace
struct GetEntityNameRequest
@@ -120,7 +55,7 @@
} __attribute__((packed));
ipmi_ret_t GetEntityName(const uint8_t* reqBuf, uint8_t* replyBuf,
- size_t* dataLen)
+ size_t* dataLen, HandlerInterface* handler)
{
struct GetEntityNameRequest request;
@@ -132,37 +67,15 @@
}
std::memcpy(&request, &reqBuf[0], sizeof(request));
-
- // Check if we support this Entity ID.
- auto it = entityIdToName.find(request.entity_id);
- if (it == entityIdToName.end())
- {
- log<level::ERR>("Unknown Entity ID",
- entry("ENTITY_ID=%d", request.entity_id));
- return IPMI_CC_INVALID_FIELD_REQUEST;
- }
-
- static Json config{};
- static bool parsed = false;
-
std::string entityName;
try
{
- // Parse the JSON config file.
- if (!parsed)
- {
- config = parse_config();
- parsed = true;
- }
-
- // Find the "entity id:entity instance" mapping to entity name.
- entityName = read(it->second, request.entity_instance, config);
- if (entityName.empty())
- return IPMI_CC_INVALID_FIELD_REQUEST;
+ entityName =
+ handler->getEntityName(request.entity_id, request.entity_instance);
}
- catch (InternalFailure& e)
+ catch (const IpmiException& e)
{
- return IPMI_CC_UNSPECIFIED_ERROR;
+ return e.getIpmiError();
}
int length = sizeof(struct GetEntityNameReply) + entityName.length();