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/meson.build b/meson.build
index 345b84b..c2f2806 100644
--- a/meson.build
+++ b/meson.build
@@ -51,7 +51,8 @@
'INVENTORY_JSON_EVEREST': '"'+get_option('INVENTORY_JSON_EVEREST')+'"',
'DBUS_PROP_JSON': '"'+get_option('DBUS_PROP_JSON')+'"',
'SYSTEM_JSON' : '"'+get_option('SYSTEM_JSON')+'"',
- 'BAD_VPD_DIR': '"'+get_option('BAD_VPD_DIR')+'"'
+ 'BAD_VPD_DIR': '"'+get_option('BAD_VPD_DIR')+'"',
+ 'FAN_INTERFACE': '"'+get_option('FAN_INTERFACE')+'"'
}
)
diff --git a/meson_options.txt b/meson_options.txt
index c95b48a..bebdff4 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -23,3 +23,4 @@
option('DBUS_PROP_JSON',type: 'string', value: '/usr/share/vpd/dbus_properties.json', description: 'Json which contains properties specific to dbus.')
option('SYSTEM_JSON',type: 'string', value: '/usr/share/vpd/systems.json', description: 'JSON file used to pick the right system json')
option('BAD_VPD_DIR',type: 'string', value: '/tmp/bad-vpd/', description: 'Directory which contains the bad vpd file - which needs to be included in bmc dump.')
+option('FAN_INTERFACE', type: 'string', value: 'xyz.openbmc_project.Inventory.Item.Fan', description: 'Fan type interface.')
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;
}
diff --git a/vpd_tool_impl.hpp b/vpd_tool_impl.hpp
index 4e320b2..0337617 100644
--- a/vpd_tool_impl.hpp
+++ b/vpd_tool_impl.hpp
@@ -16,6 +16,7 @@
const std::string recordName;
const std::string keyword;
const std::string value;
+ bool objFound = true;
// Store Type of FRU
std::string fruType;
@@ -41,29 +42,16 @@
const std::string& interface, const std::string& kw);
/**
- * @brief Adds FRU type and Location Code
- * Appends the type of the FRU and location code to the output
- *
- * @param[in] exIntf - extraInterfaces json from INVENTORY_JSON
- * @param[in] object - The D-Bus object to read the location code from
- * @param[out] kwVal - JSON object into which the FRU type and location code
- * are placed
- */
- void addFruTypeAndLocation(json exIntf, const std::string& object,
- json& kwVal);
-
- /**
* @brief Get VINI properties
* Making a dbus call for properties [SN, PN, CC, FN, DR]
* under VINI interface.
*
* @param[in] invPath - Value of inventory Path
- * @param[in] exIntf - extraInterfaces json from INVENTORY_JSON
*
* @return json output which gives the properties under invPath's VINI
* interface
*/
- json getVINIProperties(std::string invPath, json exIntf);
+ json getVINIProperties(std::string invPath);
/**
* @brief Get ExtraInterface Properties
@@ -73,13 +61,12 @@
* @param[in] extraInterface - One of the invPath's extraInterfaces whose
* value is not null
* @param[in] prop - All properties of the extraInterface.
- *
- * @return json output which gives the properties under invPath's
- * extraInterface.
+ * @param[out] output - output json which has the properties under invPath's
+ * extra interface.
*/
- void getExtraInterfaceProperties(std::string invPath,
- std::string extraInterface, json prop,
- json exIntf, json& output);
+ void getExtraInterfaceProperties(const string& invPath,
+ const string& extraInterface,
+ const json& prop, json& output);
/**
* @brief Interface Decider