18457f821SDeepak Kodihalli ## This file is a template.  The comment below is emitted
28457f821SDeepak Kodihalli ## into the rendered file; feel free to edit this file.
38457f821SDeepak Kodihalli // WARNING: Generated header. Do not edit!
48457f821SDeepak Kodihalli 
58457f821SDeepak Kodihalli 
68457f821SDeepak Kodihalli #pragma once
78457f821SDeepak Kodihalli 
88457f821SDeepak Kodihalli #include <map>
98457f821SDeepak Kodihalli #include <iostream>
10*4cf89a10SDeepak Kodihalli #include <sdbusplus/server.hpp>
11*4cf89a10SDeepak Kodihalli #include <log.hpp>
128457f821SDeepak Kodihalli #include "defines.hpp"
138457f821SDeepak Kodihalli #include "store.hpp"
148457f821SDeepak Kodihalli 
158457f821SDeepak Kodihalli namespace openpower
168457f821SDeepak Kodihalli {
178457f821SDeepak Kodihalli namespace vpd
188457f821SDeepak Kodihalli {
198457f821SDeepak Kodihalli namespace inventory
208457f821SDeepak Kodihalli {
218457f821SDeepak Kodihalli 
22*4cf89a10SDeepak Kodihalli using Property = std::string;
23*4cf89a10SDeepak Kodihalli using Value = sdbusplus::message::variant<bool, int64_t, std::string>;
24*4cf89a10SDeepak Kodihalli using PropertyMap = std::map<Property, Value>;
258457f821SDeepak Kodihalli 
26*4cf89a10SDeepak Kodihalli using Interface = std::string;
27*4cf89a10SDeepak Kodihalli using InterfaceMap = std::map<Interface, PropertyMap>;
28*4cf89a10SDeepak Kodihalli 
29*4cf89a10SDeepak Kodihalli using Object = sdbusplus::message::object_path;
30*4cf89a10SDeepak Kodihalli using ObjectMap = std::map<Object, InterfaceMap>;
31*4cf89a10SDeepak Kodihalli 
32*4cf89a10SDeepak Kodihalli using namespace std::string_literals;
33*4cf89a10SDeepak Kodihalli static const auto pimPath = "/xyz/openbmc_project/Inventory"s;
34*4cf89a10SDeepak Kodihalli static const auto pimIntf = "xyz.openbmc_project.Inventory.Manager"s;
35*4cf89a10SDeepak Kodihalli 
36*4cf89a10SDeepak Kodihalli /** @brief Get inventory-manager's d-bus service
37*4cf89a10SDeepak Kodihalli  */
38*4cf89a10SDeepak Kodihalli auto getPIMService()
398457f821SDeepak Kodihalli {
40*4cf89a10SDeepak Kodihalli     auto bus = sdbusplus::bus::new_default();
41*4cf89a10SDeepak Kodihalli     auto mapper =
42*4cf89a10SDeepak Kodihalli         bus.new_method_call(
43*4cf89a10SDeepak Kodihalli             "xyz.openbmc_project.ObjectMapper",
44*4cf89a10SDeepak Kodihalli             "/xyz/openbmc_project/ObjectMapper",
45*4cf89a10SDeepak Kodihalli             "xyz.openbmc_project.ObjectMapper",
46*4cf89a10SDeepak Kodihalli             "GetObject");
47*4cf89a10SDeepak Kodihalli 
48*4cf89a10SDeepak Kodihalli     mapper.append(pimPath);
49*4cf89a10SDeepak Kodihalli     mapper.append(std::vector<std::string>({pimIntf}));
50*4cf89a10SDeepak Kodihalli 
51*4cf89a10SDeepak Kodihalli     auto result = bus.call(mapper);
52*4cf89a10SDeepak Kodihalli     if(result.is_method_error())
538457f821SDeepak Kodihalli     {
54*4cf89a10SDeepak Kodihalli         throw std::runtime_error("ObjectMapper GetObject failed");
558457f821SDeepak Kodihalli     }
56*4cf89a10SDeepak Kodihalli 
57*4cf89a10SDeepak Kodihalli     std::map<std::string, std::vector<std::string>> response;
58*4cf89a10SDeepak Kodihalli     result.read(response);
59*4cf89a10SDeepak Kodihalli     if(response.empty())
60*4cf89a10SDeepak Kodihalli     {
61*4cf89a10SDeepak Kodihalli         throw std::runtime_error("ObjectMapper GetObject bad response");
628457f821SDeepak Kodihalli     }
63*4cf89a10SDeepak Kodihalli 
64*4cf89a10SDeepak Kodihalli     return response.begin()->first;
65*4cf89a10SDeepak Kodihalli }
66*4cf89a10SDeepak Kodihalli 
67*4cf89a10SDeepak Kodihalli auto callPIM(ObjectMap&& objects)
68*4cf89a10SDeepak Kodihalli {
69*4cf89a10SDeepak Kodihalli     std::string service;
70*4cf89a10SDeepak Kodihalli 
71*4cf89a10SDeepak Kodihalli     try
72*4cf89a10SDeepak Kodihalli     {
73*4cf89a10SDeepak Kodihalli         service = getPIMService();
74*4cf89a10SDeepak Kodihalli         auto bus = sdbusplus::bus::new_default();
75*4cf89a10SDeepak Kodihalli         auto pimMsg = bus.new_method_call(
76*4cf89a10SDeepak Kodihalli                               service.c_str(),
77*4cf89a10SDeepak Kodihalli                               pimPath.c_str(),
78*4cf89a10SDeepak Kodihalli                               pimIntf.c_str(),
79*4cf89a10SDeepak Kodihalli                               "Notify");
80*4cf89a10SDeepak Kodihalli         pimMsg.append(std::move(objects));
81*4cf89a10SDeepak Kodihalli         auto result = bus.call(pimMsg);
82*4cf89a10SDeepak Kodihalli         if(result.is_method_error())
83*4cf89a10SDeepak Kodihalli         {
84*4cf89a10SDeepak Kodihalli             std::cerr << "PIM Notify() failed\n";
85*4cf89a10SDeepak Kodihalli         }
86*4cf89a10SDeepak Kodihalli     }
87*4cf89a10SDeepak Kodihalli     catch (const std::runtime_error& e)
88*4cf89a10SDeepak Kodihalli     {
89*4cf89a10SDeepak Kodihalli         using namespace phosphor::logging;
90*4cf89a10SDeepak Kodihalli         log<level::ERR>(e.what());
91*4cf89a10SDeepak Kodihalli     }
92*4cf89a10SDeepak Kodihalli }
938457f821SDeepak Kodihalli 
948457f821SDeepak Kodihalli /** @brief API to write parsed VPD to inventory,
958457f821SDeepak Kodihalli  *      for a specifc FRU
968457f821SDeepak Kodihalli  *
978457f821SDeepak Kodihalli  *  @param [in] vpdStore - Store object containing
988457f821SDeepak Kodihalli  *      parsed VPD
998457f821SDeepak Kodihalli  *  @param [in] path - FRU object path
1008457f821SDeepak Kodihalli  */
1018457f821SDeepak Kodihalli template<Fru F>
1028457f821SDeepak Kodihalli void writeFru(const Store& vpdStore, const std::string& path);
1038457f821SDeepak Kodihalli 
1048457f821SDeepak Kodihalli % for key in fruDict.iterkeys():
1058457f821SDeepak Kodihalli <%
1068457f821SDeepak Kodihalli     fru = fruDict[key]
1078457f821SDeepak Kodihalli %>\
1088457f821SDeepak Kodihalli // Specialization of ${key}
1098457f821SDeepak Kodihalli template<>
1108457f821SDeepak Kodihalli void writeFru<Fru::${key}>(const Store& vpdStore,
1118457f821SDeepak Kodihalli                            const std::string& path)
1128457f821SDeepak Kodihalli {
113*4cf89a10SDeepak Kodihalli     ObjectMap objects;
114*4cf89a10SDeepak Kodihalli     InterfaceMap interfaces;
1158457f821SDeepak Kodihalli 
1168457f821SDeepak Kodihalli     // Inventory manager needs object path, list of interface names to be
1178457f821SDeepak Kodihalli     // implemented, and property:value pairs contained in said interfaces
1188457f821SDeepak Kodihalli 
119*4cf89a10SDeepak Kodihalli     % for interface, properties in fru.iteritems():
1208457f821SDeepak Kodihalli <%
121*4cf89a10SDeepak Kodihalli         names = interface.split(".")
122*4cf89a10SDeepak Kodihalli         intfName = names[0] + names[-1]
1238457f821SDeepak Kodihalli %>\
124*4cf89a10SDeepak Kodihalli     PropertyMap ${intfName}Props;
1258457f821SDeepak Kodihalli         % for name, value in properties.iteritems():
126*4cf89a10SDeepak Kodihalli             % if fru and interface and name and value:
1278457f821SDeepak Kodihalli <%
1288457f821SDeepak Kodihalli                 record, keyword = value.split(",")
1298457f821SDeepak Kodihalli %>\
130*4cf89a10SDeepak Kodihalli     ${intfName}Props["${name}"] =
1318457f821SDeepak Kodihalli         vpdStore.get<Record::${record}, record::Keyword::${keyword}>();
1328457f821SDeepak Kodihalli             % endif
1338457f821SDeepak Kodihalli         % endfor
134*4cf89a10SDeepak Kodihalli     interfaces.emplace("${interface}",
135*4cf89a10SDeepak Kodihalli                        std::move(${intfName}Props));
1368457f821SDeepak Kodihalli     % endfor
1378457f821SDeepak Kodihalli 
138*4cf89a10SDeepak Kodihalli     sdbusplus::message::object_path object(path);
139*4cf89a10SDeepak Kodihalli     objects.emplace(std::move(object), std::move(interfaces));
140*4cf89a10SDeepak Kodihalli 
141*4cf89a10SDeepak Kodihalli     callPIM(std::move(objects));
1428457f821SDeepak Kodihalli }
1438457f821SDeepak Kodihalli 
1448457f821SDeepak Kodihalli % endfor
1458457f821SDeepak Kodihalli } // namespace inventory
1468457f821SDeepak Kodihalli } // namespace vpd
1478457f821SDeepak Kodihalli } // namespace openpower
148