Memory: Fix potential validator error

"Other" and "Unknown" are not valid Redfish MemoryDeviceType
values.

Do correct converting D-Bus enum to redfish.

Straight mapping (D-Bus and Redfish both contain the same name):
DDR
DDR2
DDR3
DDR4
DDR4E_SDRAM
LPDDR4_SDRAM
LPDDR3_SDRAM
DDR2_SDRAM_FB_DIMM
DDR2_SDRAM_FB_DIMM_PROBE (no E on the end of the d-bus name)
DDR_SGRAM
ROM
SDRAM
EDO
FastPageMode
PipelinedNibble
Logical
HBM
HBM2

The following D-Bus values are not mapped:
Other
Unknown
DRAM
EDRAM
VRAM
SRAM
RAM
FLASH
EEPROM
FEPROM
EPROM
CDRAM
ThreeDRM
RDRAM
FBD2
LPDDR_SDRAM
LPDDR2_SDRAM

The following Redfish values don't have a mapping to:
"DDR4_SDRAM"
"DDR3_SDRAM"
"DDR_SDRAM"
"DDR2_SDRAM"

Saw this because not setting the MemoryType so defaulting to
"Other" and had removed the logic to leave off all other memory
properties when MemorySizeInKB is 0 (commit above).

IBM systems are not setting MemorySizeInKB so it is defaulting to 0
hence why this validator error has not been seen in CI.

The validator error was "ERROR - MemoryDeviceType: Invalid Enum value
'Other' found, expected ['DDR', 'DDR2', 'DDR3', 'DDR4', 'DDR4_SDRAM',
'DDR4E_SDRAM', 'LPDDR4_SDRAM', 'DDR3_SDRAM', 'LPDDR3_SDRAM', 'DDR2_SDRAM',
'DDR2_SDRAM_FB_DIMM', 'DDR2_SDRAM_FB_DIMM_PROBE', 'DDR_SGRAM',
'DDR_SDRAM', 'ROM', 'SDRAM', 'EDO', 'FastPageMode', 'PipelinedNibble',
'Logical', 'HBM', 'HBM2']"

https://github.com/openbmc/phosphor-dbus-interfaces/blob/1e8c11bf2656ed4a5fb27baa2dec3a65763bb47e/xyz/openbmc_project/Inventory/Item/Dimm.interface.yaml#L120

Tested: Passes the validator. Sent this property on D-Bus to different values.
Change-Id: I629a1acd81fa6648893b7f531dfaab413cc2dd8f
Signed-off-by: Gunnar Mills <gmills@us.ibm.com>
diff --git a/redfish-core/lib/memory.hpp b/redfish-core/lib/memory.hpp
index e7b1113..aaff473 100644
--- a/redfish-core/lib/memory.hpp
+++ b/redfish-core/lib/memory.hpp
@@ -32,6 +32,110 @@
 
 using DimmProperties = boost::container::flat_map<std::string, DimmProperty>;
 
+inline std::string translateMemoryTypeToRedfish(const std::string& memoryType)
+{
+    if (memoryType == "xyz.openbmc_project.Inventory.Item.Dimm.DeviceType.DDR")
+    {
+        return "DDR";
+    }
+    if (memoryType == "xyz.openbmc_project.Inventory.Item.Dimm.DeviceType.DDR2")
+    {
+        return "DDR2";
+    }
+    if (memoryType == "xyz.openbmc_project.Inventory.Item.Dimm.DeviceType.DDR3")
+    {
+        return "DDR3";
+    }
+    if (memoryType == "xyz.openbmc_project.Inventory.Item.Dimm.DeviceType.DDR4")
+    {
+        return "DDR4";
+    }
+    if (memoryType ==
+        "xyz.openbmc_project.Inventory.Item.Dimm.DeviceType.DDR4E_SDRAM")
+    {
+        return "DDR4E_SDRAM";
+    }
+    if (memoryType ==
+        "xyz.openbmc_project.Inventory.Item.Dimm.DeviceType.LPDDR4_SDRAM")
+    {
+        return "LPDDR4_SDRAM";
+    }
+    if (memoryType ==
+        "xyz.openbmc_project.Inventory.Item.Dimm.DeviceType.LPDDR3_SDRAM")
+    {
+        return "LPDDR3_SDRAM";
+    }
+    if (memoryType ==
+        "xyz.openbmc_project.Inventory.Item.Dimm.DeviceType.DDR2_SDRAM_FB_DIMM")
+    {
+        return "DDR2_SDRAM_FB_DIMM";
+    }
+    if (memoryType == "xyz.openbmc_project.Inventory.Item.Dimm.DeviceType.DDR2_"
+                      "SDRAM_FB_DIMM_PROB")
+    {
+        return "DDR2_SDRAM_FB_DIMM_PROBE";
+    }
+    if (memoryType ==
+        "xyz.openbmc_project.Inventory.Item.Dimm.DeviceType.DDR_SGRAM")
+    {
+        return "DDR_SGRAM";
+    }
+    if (memoryType == "xyz.openbmc_project.Inventory.Item.Dimm.DeviceType.ROM")
+    {
+        return "ROM";
+    }
+    if (memoryType ==
+        "xyz.openbmc_project.Inventory.Item.Dimm.DeviceType.SDRAM")
+    {
+        return "SDRAM";
+    }
+    if (memoryType == "xyz.openbmc_project.Inventory.Item.Dimm.DeviceType.EDO")
+    {
+        return "EDO";
+    }
+    if (memoryType ==
+        "xyz.openbmc_project.Inventory.Item.Dimm.DeviceType.FastPageMode")
+    {
+        return "FastPageMode";
+    }
+    if (memoryType ==
+        "xyz.openbmc_project.Inventory.Item.Dimm.DeviceType.PipelinedNibble")
+    {
+        return "PipelinedNibble";
+    }
+    if (memoryType ==
+        "xyz.openbmc_project.Inventory.Item.Dimm.DeviceType.Logical")
+    {
+        return "Logical";
+    }
+    if (memoryType == "xyz.openbmc_project.Inventory.Item.Dimm.DeviceType.HBM")
+    {
+        return "HBM";
+    }
+    if (memoryType == "xyz.openbmc_project.Inventory.Item.Dimm.DeviceType.HBM2")
+    {
+        return "HBM2";
+    }
+    // This is values like Other or Unknown
+    // Also D-Bus values:
+    // DRAM
+    // EDRAM
+    // VRAM
+    // SRAM
+    // RAM
+    // FLASH
+    // EEPROM
+    // FEPROM
+    // EPROM
+    // CDRAM
+    // ThreeDRAM
+    // RDRAM
+    // FBD2
+    // LPDDR_SDRAM
+    // LPDDR2_SDRAM
+    return "";
+}
+
 inline void dimmPropToHex(const std::shared_ptr<AsyncResp>& aResp,
                           const char* key,
                           const std::pair<std::string, DimmProperty>& property)
@@ -543,16 +647,15 @@
                         std::get_if<std::string>(&property.second);
                     if (value != nullptr)
                     {
-                        size_t idx = value->rfind('.');
-                        if (idx == std::string::npos ||
-                            idx + 1 >= value->size())
+                        std::string memoryDeviceType =
+                            translateMemoryTypeToRedfish(*value);
+                        // Values like "Unknown" or "Other" will return empty
+                        // so just leave off
+                        if (!memoryDeviceType.empty())
                         {
-                            messages::internalError(aResp->res);
-                            BMCWEB_LOG_DEBUG << "Invalid property type for "
-                                                "MemoryType";
+                            aResp->res.jsonValue["MemoryDeviceType"] =
+                                memoryDeviceType;
                         }
-                        std::string result = value->substr(idx + 1);
-                        aResp->res.jsonValue["MemoryDeviceType"] = result;
                         if (value->find("DDR") != std::string::npos)
                         {
                             aResp->res.jsonValue["MemoryType"] = "DRAM";