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();