Vpd-tool defect fix:data not shown for primed objects
Issue:
Some of the primed objects data were not shown by vpd-tool.
For those inventory paths whose inherit is true, the tool checks for
specific VINI properties presence. If any VINI property is not present,
the tool considered dbus object itself is not present.
And the output json was emplaced with null object.
Thus ended up in showing empty data for primed frus
with no common interfaces properties.
Fix:
Emplace null object for the inventory path, only when the
inventory path is not found in dbus.
Other Fixes:
-> Removed checking inherit value, as whether or not inherit
is true/false, we need both common interfaces and location
code(for some frus like powersupply).
So in this fix, if the common interface keywords are
not present, we ignore and get only the extra interfaces
properties.
-> Removed unwanted null object emplacement.
-> Logic which adds fan type interface for fan frus.
Tested on rainier:
1. Frus without common interface properties are displayed with
its extra interface properties.
"/system/chassis/motherboard/dimm29": {
"LocationCode": "U78DB.ND0.WZS000G-P0-C46",
"TYPE": "FRU",
"type": "xyz.openbmc_project.Inventory.Item.Dimm"
},
"/system/chassis/motherboard/dimm3": {
"LocationCode": "U78DB.ND0.WZS000G-P0-C17",
"TYPE": "FRU",
"type": "xyz.openbmc_project.Inventory.Item.Dimm"
},
2. cable card10 and its connectors are physically present on the
system
"/system/chassis/motherboard/pcie_cable_card10": {
"CC": "6B87",
"DR": "NVME JBOF RISER",
"FN": "03FL205",
"LocationCode": "U78DA.ND0.WZS004K-P0-C10",
"PN": "03FL204",
"SN": "YA31UF07200Z",
"TYPE": "FRU",
"type": "xyz.openbmc_project.Inventory.Item.FabricAdapter"
},
"/system/chassis/motherboard/pcie_cable_card10/cxp_bot": {
"LocationCode": "U78DA.ND0.WZS004K-P0-C10-T1",
"TYPE": "FRU",
"type": "xyz.openbmc_project.Inventory.Item.Connector"
},
"/system/chassis/motherboard/pcie_cable_card10/cxp_top": {
"LocationCode": "U78DA.ND0.WZS004K-P0-C10-T0",
"TYPE": "FRU",
"type": "xyz.openbmc_project.Inventory.Item.Connector"
},
3. cable card3 and its connectors are not present on the system
"/system/chassis/motherboard/pcie_cable_card3": {
"LocationCode": "U78DA.ND0.WZS004K-P0-C3",
"TYPE": "FRU",
"type": "xyz.openbmc_project.Inventory.Item.FabricAdapter"
},
"/system/chassis/motherboard/pcie_cable_card3/cxp_bot": {},
"/system/chassis/motherboard/pcie_cable_card3/cxp_top": {},
4. Fan frus showing up with its Item inteface
"/system/chassis/motherboard/fan1": {
"LocationCode": "U78DB.ND0.WZS000G-A1",
"type": "xyz.openbmc_project.Inventory.Item.Fan"
},
Signed-off-by: PriyangaRamasamy <priyanga24@in.ibm.com>
Change-Id: I38467642944fffec381d070d2a1a7dd3b9882399
diff --git a/vpd_tool_impl.cpp b/vpd_tool_impl.cpp
index 647bf50..c9b0bb7 100644
--- a/vpd_tool_impl.cpp
+++ b/vpd_tool_impl.cpp
@@ -122,54 +122,9 @@
return result;
}
-void VpdTool::addFruTypeAndLocation(json exIntf, const string& object,
- json& kwVal)
-{
- if (object.find("powersupply") != string::npos)
- {
- kwVal.emplace("type", POWER_SUPPLY_TYPE_INTERFACE);
- }
-
- // add else if statement for fan fru
-
- else
- {
- for (const auto& intf : exIntf.items())
- {
- if ((intf.key().find("Item") != string::npos) &&
- (intf.value().is_null()))
- {
- kwVal.emplace("type", intf.key());
- break;
- }
- }
- }
-
- // Add location code.
- constexpr auto LOCATION_CODE_IF = "com.ibm.ipzvpd.Location";
- constexpr auto LOCATION_CODE_PROP = "LocationCode";
-
- try
- {
- variant<string> response;
- makeDBusCall(object, LOCATION_CODE_IF, LOCATION_CODE_PROP)
- .read(response);
-
- if (auto prop = get_if<string>(&response))
- {
- kwVal.emplace(LOCATION_CODE_PROP, *prop);
- }
- }
- catch (const SdBusError& e)
- {
- kwVal.emplace(LOCATION_CODE_PROP, "");
- }
-}
-
-json VpdTool::getVINIProperties(string invPath, json exIntf)
+json VpdTool::getVINIProperties(string invPath)
{
variant<Binary> response;
- json output = json::object({});
json kwVal = json::object({});
vector<string> keyword{"CC", "SN", "PN", "FN", "DR"};
@@ -185,7 +140,6 @@
{
objectName = INVENTORY_PATH + invPath;
}
-
for (string kw : keyword)
{
try
@@ -200,19 +154,22 @@
}
catch (const SdBusError& e)
{
- output.emplace(invPath, json::object({}));
+ if (string(e.name()) ==
+ string("org.freedesktop.DBus.Error.UnknownObject"))
+ {
+ kwVal.emplace(invPath, json::object({}));
+ objFound = false;
+ break;
+ }
}
}
- addFruTypeAndLocation(exIntf, objectName, kwVal);
- kwVal.emplace("TYPE", fruType);
-
- output.emplace(invPath, kwVal);
- return output;
+ return kwVal;
}
-void VpdTool::getExtraInterfaceProperties(string invPath, string extraInterface,
- json prop, json exIntf, json& output)
+void VpdTool::getExtraInterfaceProperties(const string& invPath,
+ const string& extraInterface,
+ const json& prop, json& output)
{
variant<string> response;
@@ -232,10 +189,19 @@
}
catch (const SdBusError& e)
{
- output.emplace(invPath, json::object({}));
+ if (std::string(e.name()) ==
+ std::string("org.freedesktop.DBus.Error.UnknownObject"))
+ {
+ objFound = false;
+ break;
+ }
+ else if (std::string(e.name()) ==
+ std::string("org.freedesktop.DBus.Error.UnknownProperty"))
+ {
+ output.emplace(kw, "");
+ }
}
}
- addFruTypeAndLocation(exIntf, objectName, output);
}
json VpdTool::interfaceDecider(json& itemEEPROM)
@@ -251,35 +217,49 @@
}
json output = json::object({});
+ json subOutput = json::object({});
fruType = "FRU";
- // check type and add FRU Type in object
- if (itemEEPROM.find("type") != itemEEPROM.end())
- {
- fruType = itemEEPROM.at("type");
- }
+ json j;
+ objFound = true;
+ string invPath = itemEEPROM.at("inventoryPath");
- if (itemEEPROM.value("inherit", true))
+ j = getVINIProperties(invPath);
+
+ if (objFound)
{
- json j = getVINIProperties(itemEEPROM.at("inventoryPath"),
- itemEEPROM["extraInterfaces"]);
- output.insert(j.begin(), j.end());
- }
- else
- {
+ subOutput.insert(j.begin(), j.end());
json js;
+ if (itemEEPROM.find("type") != itemEEPROM.end())
+ {
+ fruType = itemEEPROM.at("type");
+ }
+ js.emplace("TYPE", fruType);
+
+ if (invPath.find("powersupply") != string::npos)
+ {
+ js.emplace("type", POWER_SUPPLY_TYPE_INTERFACE);
+ }
+ else if (invPath.find("fan") != string::npos)
+ {
+ js.emplace("type", FAN_INTERFACE);
+ }
+
for (const auto& ex : itemEEPROM["extraInterfaces"].items())
{
if (!(ex.value().is_null()))
{
- getExtraInterfaceProperties(itemEEPROM.at("inventoryPath"),
- ex.key(), ex.value(),
- itemEEPROM["extraInterfaces"], js);
+ getExtraInterfaceProperties(invPath, ex.key(), ex.value(), js);
}
+ if ((ex.key().find("Item") != string::npos) &&
+ (ex.value().is_null()))
+ {
+ js.emplace("type", ex.key());
+ }
+ subOutput.insert(js.begin(), js.end());
}
- output.emplace(itemEEPROM.at("inventoryPath"), js);
}
-
+ output.emplace(invPath, subOutput);
return output;
}