summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDeepak Kodihalli <dkodihal@in.ibm.com>2017-02-06 05:06:48 -0600
committerDeepak Kodihalli <dkodihal@in.ibm.com>2017-02-14 12:42:34 -0600
commit4cf89a1022508ff2419f451de7ca0ed270e202ed (patch)
treede107cfc7aa6d336454ec5922b9a8596664c1f52
parentae7b5458fbbbac91b3f44b68079ca83205396295 (diff)
downloadopenpower-vpd-parser-4cf89a1022508ff2419f451de7ca0ed270e202ed.tar.gz
openpower-vpd-parser-4cf89a1022508ff2419f451de7ca0ed270e202ed.zip
inventory : invoke inventory manager's Notify()
Make a call to the inventory manager to construct inventory objects for OpenPOWER FRUs. Change-Id: I41988a9299a0509d3120bee1b79fd3aa8176a76c Signed-off-by: Deepak Kodihalli <dkodihal@in.ibm.com>
-rwxr-xr-xwritefru.mako.hpp106
1 files changed, 81 insertions, 25 deletions
diff --git a/writefru.mako.hpp b/writefru.mako.hpp
index f7a2aa8..7066f9a 100755
--- a/writefru.mako.hpp
+++ b/writefru.mako.hpp
@@ -7,6 +7,8 @@
#include <map>
#include <iostream>
+#include <sdbusplus/server.hpp>
+#include <log.hpp>
#include "defines.hpp"
#include "store.hpp"
@@ -17,25 +19,77 @@ namespace vpd
namespace inventory
{
-using Inner = Parsed::mapped_type;
-using Outer = std::map<std::string, Inner>;
+using Property = std::string;
+using Value = sdbusplus::message::variant<bool, int64_t, std::string>;
+using PropertyMap = std::map<Property, Value>;
-// TODO: Remove once the call to inventory manager is added
-auto print = [](Outer&& object, const std::string& path)
+using Interface = std::string;
+using InterfaceMap = std::map<Interface, PropertyMap>;
+
+using Object = sdbusplus::message::object_path;
+using ObjectMap = std::map<Object, InterfaceMap>;
+
+using namespace std::string_literals;
+static const auto pimPath = "/xyz/openbmc_project/Inventory"s;
+static const auto pimIntf = "xyz.openbmc_project.Inventory.Manager"s;
+
+/** @brief Get inventory-manager's d-bus service
+ */
+auto getPIMService()
+{
+ auto bus = sdbusplus::bus::new_default();
+ auto mapper =
+ bus.new_method_call(
+ "xyz.openbmc_project.ObjectMapper",
+ "/xyz/openbmc_project/ObjectMapper",
+ "xyz.openbmc_project.ObjectMapper",
+ "GetObject");
+
+ mapper.append(pimPath);
+ mapper.append(std::vector<std::string>({pimIntf}));
+
+ auto result = bus.call(mapper);
+ if(result.is_method_error())
+ {
+ throw std::runtime_error("ObjectMapper GetObject failed");
+ }
+
+ std::map<std::string, std::vector<std::string>> response;
+ result.read(response);
+ if(response.empty())
+ {
+ throw std::runtime_error("ObjectMapper GetObject bad response");
+ }
+
+ return response.begin()->first;
+}
+
+auto callPIM(ObjectMap&& objects)
{
- std::cout << "\n";
- std::cout << path << "\n";
- std::cout << "\n";
- for(const auto& o : object)
+ std::string service;
+
+ try
{
- std::cout << o.first << "\n";
- for(const auto& i : o.second)
+ service = getPIMService();
+ auto bus = sdbusplus::bus::new_default();
+ auto pimMsg = bus.new_method_call(
+ service.c_str(),
+ pimPath.c_str(),
+ pimIntf.c_str(),
+ "Notify");
+ pimMsg.append(std::move(objects));
+ auto result = bus.call(pimMsg);
+ if(result.is_method_error())
{
- std::cout << i.first << " : " << i.second << "\n";
+ std::cerr << "PIM Notify() failed\n";
}
- std::cout << "\n";
}
-};
+ catch (const std::runtime_error& e)
+ {
+ using namespace phosphor::logging;
+ log<level::ERR>(e.what());
+ }
+}
/** @brief API to write parsed VPD to inventory,
* for a specifc FRU
@@ -56,33 +110,35 @@ template<>
void writeFru<Fru::${key}>(const Store& vpdStore,
const std::string& path)
{
- Outer object;
+ ObjectMap objects;
+ InterfaceMap interfaces;
// Inventory manager needs object path, list of interface names to be
// implemented, and property:value pairs contained in said interfaces
- % for interfaces, properties in fru.iteritems():
+ % for interface, properties in fru.iteritems():
<%
- interface = interfaces.split(".")
- intfName = interface[0] + interface[-1]
+ names = interface.split(".")
+ intfName = names[0] + names[-1]
%>\
- Inner ${intfName};
+ PropertyMap ${intfName}Props;
% for name, value in properties.iteritems():
- % if fru and interfaces and name and value:
+ % if fru and interface and name and value:
<%
record, keyword = value.split(",")
%>\
- ${intfName}["${name}"] =
+ ${intfName}Props["${name}"] =
vpdStore.get<Record::${record}, record::Keyword::${keyword}>();
% endif
% endfor
- object.emplace("${interfaces}",
- std::move(${intfName}));
+ interfaces.emplace("${interface}",
+ std::move(${intfName}Props));
% endfor
- // TODO: Need integration with inventory manager, print serialized dbus
- // object for now.
- print(std::move(object), path);
+ sdbusplus::message::object_path object(path);
+ objects.emplace(std::move(object), std::move(interfaces));
+
+ callPIM(std::move(objects));
}
% endfor
OpenPOWER on IntegriCloud