xref: /openbmc/openpower-vpd-parser/vpd-manager/include/utility/event_logger_utility.hpp (revision a39aafa337352262596e07577fdf88cc294284c9)
1*a39aafa3SRekha Aparna #pragma once
2*a39aafa3SRekha Aparna 
3*a39aafa3SRekha Aparna #include "config.h"
4*a39aafa3SRekha Aparna 
5*a39aafa3SRekha Aparna #include "common_utility.hpp"
6*a39aafa3SRekha Aparna #include "constants.hpp"
7*a39aafa3SRekha Aparna #include "exceptions.hpp"
8*a39aafa3SRekha Aparna #include "json_utility.hpp"
9*a39aafa3SRekha Aparna #include "logger.hpp"
10*a39aafa3SRekha Aparna #include "types.hpp"
11*a39aafa3SRekha Aparna 
12*a39aafa3SRekha Aparna #include <systemd/sd-bus.h>
13*a39aafa3SRekha Aparna 
14*a39aafa3SRekha Aparna #include <filesystem>
15*a39aafa3SRekha Aparna #include <iostream>
16*a39aafa3SRekha Aparna #include <optional>
17*a39aafa3SRekha Aparna #include <string>
18*a39aafa3SRekha Aparna #include <unordered_map>
19*a39aafa3SRekha Aparna 
20*a39aafa3SRekha Aparna namespace vpd
21*a39aafa3SRekha Aparna {
22*a39aafa3SRekha Aparna namespace EventLogger
23*a39aafa3SRekha Aparna {
24*a39aafa3SRekha Aparna const std::unordered_map<types::SeverityType, std::string> severityMap = {
25*a39aafa3SRekha Aparna     {types::SeverityType::Notice,
26*a39aafa3SRekha Aparna      "xyz.openbmc_project.Logging.Entry.Level.Notice"},
27*a39aafa3SRekha Aparna     {types::SeverityType::Informational,
28*a39aafa3SRekha Aparna      "xyz.openbmc_project.Logging.Entry.Level.Informational"},
29*a39aafa3SRekha Aparna     {types::SeverityType::Debug,
30*a39aafa3SRekha Aparna      "xyz.openbmc_project.Logging.Entry.Level.Debug"},
31*a39aafa3SRekha Aparna     {types::SeverityType::Warning,
32*a39aafa3SRekha Aparna      "xyz.openbmc_project.Logging.Entry.Level.Warning"},
33*a39aafa3SRekha Aparna     {types::SeverityType::Critical,
34*a39aafa3SRekha Aparna      "xyz.openbmc_project.Logging.Entry.Level.Critical"},
35*a39aafa3SRekha Aparna     {types::SeverityType::Emergency,
36*a39aafa3SRekha Aparna      "xyz.openbmc_project.Logging.Entry.Level.Emergency"},
37*a39aafa3SRekha Aparna     {types::SeverityType::Alert,
38*a39aafa3SRekha Aparna      "xyz.openbmc_project.Logging.Entry.Level.Alert"},
39*a39aafa3SRekha Aparna     {types::SeverityType::Error,
40*a39aafa3SRekha Aparna      "xyz.openbmc_project.Logging.Entry.Level.Error"}};
41*a39aafa3SRekha Aparna 
42*a39aafa3SRekha Aparna const std::unordered_map<types::ErrorType, std::string> errorMsgMap = {
43*a39aafa3SRekha Aparna     {types::ErrorType::DefaultValue, "com.ibm.VPD.Error.DefaultValue"},
44*a39aafa3SRekha Aparna     {types::ErrorType::UndefinedError, "com.ibm.VPD.Error.UndefinedError"},
45*a39aafa3SRekha Aparna     {types::ErrorType::InvalidVpdMessage, "com.ibm.VPD.Error.InvalidVPD"},
46*a39aafa3SRekha Aparna     {types::ErrorType::VpdMismatch, "com.ibm.VPD.Error.Mismatch"},
47*a39aafa3SRekha Aparna     {types::ErrorType::InvalidEeprom, "com.ibm.VPD.Error.InvalidEepromPath"},
48*a39aafa3SRekha Aparna     {types::ErrorType::EccCheckFailed, "com.ibm.VPD.Error.EccCheckFailed"},
49*a39aafa3SRekha Aparna     {types::ErrorType::JsonFailure, "com.ibm.VPD.Error.InvalidJson"},
50*a39aafa3SRekha Aparna     {types::ErrorType::DbusFailure, "com.ibm.VPD.Error.DbusFailure"},
51*a39aafa3SRekha Aparna     {types::ErrorType::InvalidSystem, "com.ibm.VPD.Error.UnknownSystemType"},
52*a39aafa3SRekha Aparna     {types::ErrorType::EssentialFru, "com.ibm.VPD.Error.RequiredFRUMissing"},
53*a39aafa3SRekha Aparna     {types::ErrorType::GpioError, "com.ibm.VPD.Error.GPIOError"},
54*a39aafa3SRekha Aparna     {types::ErrorType::InternalFailure,
55*a39aafa3SRekha Aparna      "xyz.openbmc_project.Common.Error.InternalFailure"},
56*a39aafa3SRekha Aparna     {types::ErrorType::FruMissing, "com.ibm.VPD.Error.RequiredFRUMissing"},
57*a39aafa3SRekha Aparna     {types::ErrorType::SystemTypeMismatch,
58*a39aafa3SRekha Aparna      "com.ibm.VPD.Error.SystemTypeMismatch"},
59*a39aafa3SRekha Aparna     {types::ErrorType::UnknownSystemSettings,
60*a39aafa3SRekha Aparna      "com.ibm.VPD.Error.UnknownSystemSettings"},
61*a39aafa3SRekha Aparna     {types::ErrorType::FirmwareError, "com.ibm.VPD.Error.FirmwareError"},
62*a39aafa3SRekha Aparna     {types::ErrorType::VpdParseError, "com.ibm.VPD.Error.VPDParseError"}};
63*a39aafa3SRekha Aparna 
64*a39aafa3SRekha Aparna const std::unordered_map<types::CalloutPriority, std::string> priorityMap = {
65*a39aafa3SRekha Aparna     {types::CalloutPriority::High, "H"},
66*a39aafa3SRekha Aparna     {types::CalloutPriority::Medium, "M"},
67*a39aafa3SRekha Aparna     {types::CalloutPriority::MediumGroupA, "A"},
68*a39aafa3SRekha Aparna     {types::CalloutPriority::MediumGroupB, "B"},
69*a39aafa3SRekha Aparna     {types::CalloutPriority::MediumGroupC, "C"},
70*a39aafa3SRekha Aparna     {types::CalloutPriority::Low, "L"}};
71*a39aafa3SRekha Aparna 
72*a39aafa3SRekha Aparna /**
73*a39aafa3SRekha Aparna  * @brief API to get error info based on the exception.
74*a39aafa3SRekha Aparna  *
75*a39aafa3SRekha Aparna  * @param[in] i_exception - Exception object.
76*a39aafa3SRekha Aparna  *
77*a39aafa3SRekha Aparna  * @return - Valid ExceptionDataMap on success, otherwise map having
78*a39aafa3SRekha Aparna  * default value.
79*a39aafa3SRekha Aparna  */
80*a39aafa3SRekha Aparna inline types::ExceptionDataMap getExceptionData(
81*a39aafa3SRekha Aparna     const std::exception& i_exception)
82*a39aafa3SRekha Aparna {
83*a39aafa3SRekha Aparna     types::ExceptionDataMap l_errorInfo{
84*a39aafa3SRekha Aparna         {"ErrorType", types::ErrorType::UndefinedError},
85*a39aafa3SRekha Aparna         {"ErrorMsg", i_exception.what()}};
86*a39aafa3SRekha Aparna 
87*a39aafa3SRekha Aparna     try
88*a39aafa3SRekha Aparna     {
89*a39aafa3SRekha Aparna         if (typeid(i_exception) == typeid(DataException))
90*a39aafa3SRekha Aparna         {
91*a39aafa3SRekha Aparna             const DataException& l_ex =
92*a39aafa3SRekha Aparna                 dynamic_cast<const DataException&>(i_exception);
93*a39aafa3SRekha Aparna             l_errorInfo["ErrorType"] = l_ex.getErrorType();
94*a39aafa3SRekha Aparna             l_errorInfo["ErrorMsg"] =
95*a39aafa3SRekha Aparna                 std::string("Data Exception. Reason: ") + i_exception.what();
96*a39aafa3SRekha Aparna         }
97*a39aafa3SRekha Aparna         else if (typeid(i_exception) == typeid(EccException))
98*a39aafa3SRekha Aparna         {
99*a39aafa3SRekha Aparna             const EccException& l_ex =
100*a39aafa3SRekha Aparna                 dynamic_cast<const EccException&>(i_exception);
101*a39aafa3SRekha Aparna             l_errorInfo["ErrorType"] = l_ex.getErrorType();
102*a39aafa3SRekha Aparna             l_errorInfo["ErrorMsg"] =
103*a39aafa3SRekha Aparna                 std::string("Ecc Exception. Reason: ") + i_exception.what();
104*a39aafa3SRekha Aparna         }
105*a39aafa3SRekha Aparna         else if (typeid(i_exception) == typeid(JsonException))
106*a39aafa3SRekha Aparna         {
107*a39aafa3SRekha Aparna             const JsonException& l_ex =
108*a39aafa3SRekha Aparna                 dynamic_cast<const JsonException&>(i_exception);
109*a39aafa3SRekha Aparna             l_errorInfo["ErrorType"] = l_ex.getErrorType();
110*a39aafa3SRekha Aparna             l_errorInfo["ErrorMsg"] =
111*a39aafa3SRekha Aparna                 std::string("Json Exception. Reason: ") + i_exception.what();
112*a39aafa3SRekha Aparna         }
113*a39aafa3SRekha Aparna         else if (typeid(i_exception) == typeid(GpioException))
114*a39aafa3SRekha Aparna         {
115*a39aafa3SRekha Aparna             const GpioException& l_ex =
116*a39aafa3SRekha Aparna                 dynamic_cast<const GpioException&>(i_exception);
117*a39aafa3SRekha Aparna             l_errorInfo["ErrorType"] = l_ex.getErrorType();
118*a39aafa3SRekha Aparna             l_errorInfo["ErrorMsg"] =
119*a39aafa3SRekha Aparna                 std::string("Gpio Exception. Reason: ") + i_exception.what();
120*a39aafa3SRekha Aparna         }
121*a39aafa3SRekha Aparna         else if (typeid(i_exception) == typeid(DbusException))
122*a39aafa3SRekha Aparna         {
123*a39aafa3SRekha Aparna             const DbusException& l_ex =
124*a39aafa3SRekha Aparna                 dynamic_cast<const DbusException&>(i_exception);
125*a39aafa3SRekha Aparna             l_errorInfo["ErrorType"] = l_ex.getErrorType();
126*a39aafa3SRekha Aparna             l_errorInfo["ErrorMsg"] =
127*a39aafa3SRekha Aparna                 std::string("Dbus Exception. Reason: ") + i_exception.what();
128*a39aafa3SRekha Aparna         }
129*a39aafa3SRekha Aparna         else if (typeid(i_exception) == typeid(FirmwareException))
130*a39aafa3SRekha Aparna         {
131*a39aafa3SRekha Aparna             const FirmwareException& l_ex =
132*a39aafa3SRekha Aparna                 dynamic_cast<const FirmwareException&>(i_exception);
133*a39aafa3SRekha Aparna             l_errorInfo["ErrorType"] = l_ex.getErrorType();
134*a39aafa3SRekha Aparna             l_errorInfo["ErrorMsg"] =
135*a39aafa3SRekha Aparna                 std::string("Firmware Exception. Reason: ") +
136*a39aafa3SRekha Aparna                 i_exception.what();
137*a39aafa3SRekha Aparna         }
138*a39aafa3SRekha Aparna         else if (typeid(i_exception) == typeid(EepromException))
139*a39aafa3SRekha Aparna         {
140*a39aafa3SRekha Aparna             const EepromException& l_ex =
141*a39aafa3SRekha Aparna                 dynamic_cast<const EepromException&>(i_exception);
142*a39aafa3SRekha Aparna             l_errorInfo["ErrorType"] = l_ex.getErrorType();
143*a39aafa3SRekha Aparna             l_errorInfo["ErrorMsg"] =
144*a39aafa3SRekha Aparna                 std::string("Eeprom Exception. Reason: ") + i_exception.what();
145*a39aafa3SRekha Aparna         }
146*a39aafa3SRekha Aparna         else if (typeid(i_exception) == typeid(std::runtime_error))
147*a39aafa3SRekha Aparna         {
148*a39aafa3SRekha Aparna             // Since it is a standard exception no casting is required and error
149*a39aafa3SRekha Aparna             // type is hardcoded.
150*a39aafa3SRekha Aparna             l_errorInfo["ErrorType"] = types::ErrorType::FirmwareError;
151*a39aafa3SRekha Aparna             l_errorInfo["ErrorMsg"] =
152*a39aafa3SRekha Aparna                 std::string("Standard runtime exception. Reason: ") +
153*a39aafa3SRekha Aparna                 i_exception.what();
154*a39aafa3SRekha Aparna         }
155*a39aafa3SRekha Aparna     }
156*a39aafa3SRekha Aparna     catch (const std::exception& l_ex)
157*a39aafa3SRekha Aparna     {
158*a39aafa3SRekha Aparna         logging::logMessage(
159*a39aafa3SRekha Aparna             "Failed to get error info, reason: " + std::string(l_ex.what()));
160*a39aafa3SRekha Aparna     }
161*a39aafa3SRekha Aparna     return l_errorInfo;
162*a39aafa3SRekha Aparna }
163*a39aafa3SRekha Aparna 
164*a39aafa3SRekha Aparna /**
165*a39aafa3SRekha Aparna  * @brief API to get Error type.
166*a39aafa3SRekha Aparna  *
167*a39aafa3SRekha Aparna  * @param[in] i_exception - Exception object.
168*a39aafa3SRekha Aparna  *
169*a39aafa3SRekha Aparna  * @return Error type set for the exception.
170*a39aafa3SRekha Aparna  * types::ErrorType::InternalFailure otherwise.
171*a39aafa3SRekha Aparna  */
172*a39aafa3SRekha Aparna inline types::ErrorType getErrorType(const std::exception& i_exception)
173*a39aafa3SRekha Aparna {
174*a39aafa3SRekha Aparna     const auto& l_exceptionDataMap = getExceptionData(i_exception);
175*a39aafa3SRekha Aparna 
176*a39aafa3SRekha Aparna     auto l_itrToErrType = l_exceptionDataMap.find("ErrorType");
177*a39aafa3SRekha Aparna     if (l_itrToErrType == l_exceptionDataMap.end())
178*a39aafa3SRekha Aparna     {
179*a39aafa3SRekha Aparna         return types::ErrorType::UndefinedError;
180*a39aafa3SRekha Aparna     }
181*a39aafa3SRekha Aparna 
182*a39aafa3SRekha Aparna     auto l_ptrToErrType =
183*a39aafa3SRekha Aparna         std::get_if<types::ErrorType>(&l_itrToErrType->second);
184*a39aafa3SRekha Aparna     if (!l_ptrToErrType)
185*a39aafa3SRekha Aparna     {
186*a39aafa3SRekha Aparna         return types::ErrorType::UndefinedError;
187*a39aafa3SRekha Aparna     }
188*a39aafa3SRekha Aparna 
189*a39aafa3SRekha Aparna     return *l_ptrToErrType;
190*a39aafa3SRekha Aparna }
191*a39aafa3SRekha Aparna 
192*a39aafa3SRekha Aparna /**
193*a39aafa3SRekha Aparna  * @brief API to get Error msg.
194*a39aafa3SRekha Aparna  *
195*a39aafa3SRekha Aparna  * @param[in] i_exception - Exception object.
196*a39aafa3SRekha Aparna  *
197*a39aafa3SRekha Aparna  * @return Error msg set for the specific exception. Default error msg
198*a39aafa3SRekha Aparna  * otherwise.
199*a39aafa3SRekha Aparna  */
200*a39aafa3SRekha Aparna inline std::string getErrorMsg(const std::exception& i_exception)
201*a39aafa3SRekha Aparna {
202*a39aafa3SRekha Aparna     const auto& l_exceptionDataMap = getExceptionData(i_exception);
203*a39aafa3SRekha Aparna 
204*a39aafa3SRekha Aparna     auto l_itrToErrMsg = l_exceptionDataMap.find("ErrorMsg");
205*a39aafa3SRekha Aparna     if (l_itrToErrMsg == l_exceptionDataMap.end())
206*a39aafa3SRekha Aparna     {
207*a39aafa3SRekha Aparna         return i_exception.what();
208*a39aafa3SRekha Aparna     }
209*a39aafa3SRekha Aparna 
210*a39aafa3SRekha Aparna     auto l_ptrToErrMsg = std::get_if<std::string>(&l_itrToErrMsg->second);
211*a39aafa3SRekha Aparna     if (!l_ptrToErrMsg)
212*a39aafa3SRekha Aparna     {
213*a39aafa3SRekha Aparna         return i_exception.what();
214*a39aafa3SRekha Aparna     }
215*a39aafa3SRekha Aparna 
216*a39aafa3SRekha Aparna     return *l_ptrToErrMsg;
217*a39aafa3SRekha Aparna }
218*a39aafa3SRekha Aparna 
219*a39aafa3SRekha Aparna /**
220*a39aafa3SRekha Aparna  * @brief API to get string representation of a Error type enum.
221*a39aafa3SRekha Aparna  *
222*a39aafa3SRekha Aparna  * @param[in] i_exception - Exception object.
223*a39aafa3SRekha Aparna  *
224*a39aafa3SRekha Aparna  * @return Error msg set for the specific error type. Default error msg
225*a39aafa3SRekha Aparna  * otherwise.
226*a39aafa3SRekha Aparna  */
227*a39aafa3SRekha Aparna inline std::string getErrorTypeString(
228*a39aafa3SRekha Aparna     const types::ErrorType& i_errorType) noexcept
229*a39aafa3SRekha Aparna {
230*a39aafa3SRekha Aparna     const auto l_entry = errorMsgMap.find(i_errorType);
231*a39aafa3SRekha Aparna     return (l_entry != errorMsgMap.end()
232*a39aafa3SRekha Aparna                 ? l_entry->second
233*a39aafa3SRekha Aparna                 : errorMsgMap.at(types::ErrorType::UndefinedError));
234*a39aafa3SRekha Aparna }
235*a39aafa3SRekha Aparna 
236*a39aafa3SRekha Aparna /**
237*a39aafa3SRekha Aparna  * @brief An API to create a PEL with inventory path callout.
238*a39aafa3SRekha Aparna  *
239*a39aafa3SRekha Aparna  * This API calls an async method to create PEL, and also handles inventory
240*a39aafa3SRekha Aparna  * path callout.
241*a39aafa3SRekha Aparna  *
242*a39aafa3SRekha Aparna  * Note: If inventory path callout info is not provided, it will create a
243*a39aafa3SRekha Aparna  * PEL without any callout. Currently only one callout is handled in this
244*a39aafa3SRekha Aparna  * API.
245*a39aafa3SRekha Aparna  *
246*a39aafa3SRekha Aparna  * @todo: Symbolic FRU and procedure callout needs to be handled in this
247*a39aafa3SRekha Aparna  * API.
248*a39aafa3SRekha Aparna  *
249*a39aafa3SRekha Aparna  * @param[in] i_errorType - Enum to map with event message name.
250*a39aafa3SRekha Aparna  * @param[in] i_severity - Severity of the event.
251*a39aafa3SRekha Aparna  * @param[in] i_callouts - Callout information, list of tuple having
252*a39aafa3SRekha Aparna  * inventory path and priority as input [optional].
253*a39aafa3SRekha Aparna  * @param[in] i_fileName - File name.
254*a39aafa3SRekha Aparna  * @param[in] i_funcName - Function name.
255*a39aafa3SRekha Aparna  * @param[in] i_internalRc - Internal return code.
256*a39aafa3SRekha Aparna  * @param[in] i_description - Error description.
257*a39aafa3SRekha Aparna  * @param[in] i_userData1 - Additional user data [optional].
258*a39aafa3SRekha Aparna  * @param[in] i_userData2 - Additional user data [optional].
259*a39aafa3SRekha Aparna  * @param[in] i_symFru - Symblolic FRU callout data [optional].
260*a39aafa3SRekha Aparna  * @param[in] i_procedure - Procedure callout data [optional].
261*a39aafa3SRekha Aparna  *
262*a39aafa3SRekha Aparna  * @throw exception in case of error.
263*a39aafa3SRekha Aparna  */
264*a39aafa3SRekha Aparna inline void createAsyncPelWithInventoryCallout(
265*a39aafa3SRekha Aparna     const types::ErrorType& i_errorType, const types::SeverityType& i_severity,
266*a39aafa3SRekha Aparna     const std::vector<types::InventoryCalloutData>& i_callouts,
267*a39aafa3SRekha Aparna     const std::string& i_fileName, const std::string& i_funcName,
268*a39aafa3SRekha Aparna     const uint8_t i_internalRc, const std::string& i_description,
269*a39aafa3SRekha Aparna     const std::optional<std::string> i_userData1,
270*a39aafa3SRekha Aparna     const std::optional<std::string> i_userData2,
271*a39aafa3SRekha Aparna     const std::optional<std::string> i_symFru,
272*a39aafa3SRekha Aparna     const std::optional<std::string> i_procedure)
273*a39aafa3SRekha Aparna {
274*a39aafa3SRekha Aparna     (void)i_symFru;
275*a39aafa3SRekha Aparna     (void)i_procedure;
276*a39aafa3SRekha Aparna 
277*a39aafa3SRekha Aparna     try
278*a39aafa3SRekha Aparna     {
279*a39aafa3SRekha Aparna         if (i_callouts.empty())
280*a39aafa3SRekha Aparna         {
281*a39aafa3SRekha Aparna             logging::logMessage("Callout information is missing to create PEL");
282*a39aafa3SRekha Aparna             // TODO: Revisit this instead of simpley returning.
283*a39aafa3SRekha Aparna             return;
284*a39aafa3SRekha Aparna         }
285*a39aafa3SRekha Aparna 
286*a39aafa3SRekha Aparna         if (errorMsgMap.find(i_errorType) == errorMsgMap.end())
287*a39aafa3SRekha Aparna         {
288*a39aafa3SRekha Aparna             throw std::runtime_error(
289*a39aafa3SRekha Aparna                 "Error type not found in the error message map to create PEL");
290*a39aafa3SRekha Aparna             // TODO: Need to handle, instead of throwing exception. Create
291*a39aafa3SRekha Aparna             // default message in message_registry.json.
292*a39aafa3SRekha Aparna         }
293*a39aafa3SRekha Aparna 
294*a39aafa3SRekha Aparna         const std::string& l_message = errorMsgMap.at(i_errorType);
295*a39aafa3SRekha Aparna 
296*a39aafa3SRekha Aparna         const std::string& l_severity =
297*a39aafa3SRekha Aparna             (severityMap.find(i_severity) != severityMap.end()
298*a39aafa3SRekha Aparna                  ? severityMap.at(i_severity)
299*a39aafa3SRekha Aparna                  : severityMap.at(types::SeverityType::Informational));
300*a39aafa3SRekha Aparna 
301*a39aafa3SRekha Aparna         std::string l_description =
302*a39aafa3SRekha Aparna             (!i_description.empty() ? i_description : "VPD generic error");
303*a39aafa3SRekha Aparna 
304*a39aafa3SRekha Aparna         std::string l_userData1 = (i_userData1) ? (*i_userData1) : "";
305*a39aafa3SRekha Aparna 
306*a39aafa3SRekha Aparna         std::string l_userData2 = (i_userData2) ? (*i_userData2) : "";
307*a39aafa3SRekha Aparna 
308*a39aafa3SRekha Aparna         const types::InventoryCalloutData& l_invCallout = i_callouts[0];
309*a39aafa3SRekha Aparna         // TODO: Need to handle multiple inventory path callout's, when multiple
310*a39aafa3SRekha Aparna         // callout's is supported by "Logging" service.
311*a39aafa3SRekha Aparna 
312*a39aafa3SRekha Aparna         const types::CalloutPriority& l_priorityEnum = get<1>(l_invCallout);
313*a39aafa3SRekha Aparna 
314*a39aafa3SRekha Aparna         const std::string& l_priority =
315*a39aafa3SRekha Aparna             (priorityMap.find(l_priorityEnum) != priorityMap.end()
316*a39aafa3SRekha Aparna                  ? priorityMap.at(l_priorityEnum)
317*a39aafa3SRekha Aparna                  : priorityMap.at(types::CalloutPriority::Low));
318*a39aafa3SRekha Aparna 
319*a39aafa3SRekha Aparna         sd_bus* l_sdBus = nullptr;
320*a39aafa3SRekha Aparna         sd_bus_default(&l_sdBus);
321*a39aafa3SRekha Aparna 
322*a39aafa3SRekha Aparna         const uint8_t l_additionalDataCount = 8;
323*a39aafa3SRekha Aparna         auto l_rc = sd_bus_call_method_async(
324*a39aafa3SRekha Aparna             l_sdBus, NULL, constants::eventLoggingServiceName,
325*a39aafa3SRekha Aparna             constants::eventLoggingObjectPath, constants::eventLoggingInterface,
326*a39aafa3SRekha Aparna             "Create", NULL, NULL, "ssa{ss}", l_message.c_str(),
327*a39aafa3SRekha Aparna             l_severity.c_str(), l_additionalDataCount, "FileName",
328*a39aafa3SRekha Aparna             i_fileName.c_str(), "FunctionName", i_funcName.c_str(),
329*a39aafa3SRekha Aparna             "InternalRc", std::to_string(i_internalRc).c_str(), "DESCRIPTION",
330*a39aafa3SRekha Aparna             l_description.c_str(), "UserData1", l_userData1.c_str(),
331*a39aafa3SRekha Aparna             "UserData2", l_userData2.c_str(), "CALLOUT_INVENTORY_PATH",
332*a39aafa3SRekha Aparna             get<0>(l_invCallout).c_str(), "CALLOUT_PRIORITY",
333*a39aafa3SRekha Aparna             l_priority.c_str());
334*a39aafa3SRekha Aparna 
335*a39aafa3SRekha Aparna         if (l_rc < 0)
336*a39aafa3SRekha Aparna         {
337*a39aafa3SRekha Aparna             logging::logMessage(
338*a39aafa3SRekha Aparna                 "Error calling sd_bus_call_method_async, Message = " +
339*a39aafa3SRekha Aparna                 std::string(strerror(-l_rc)));
340*a39aafa3SRekha Aparna         }
341*a39aafa3SRekha Aparna     }
342*a39aafa3SRekha Aparna     catch (const std::exception& l_ex)
343*a39aafa3SRekha Aparna     {
344*a39aafa3SRekha Aparna         logging::logMessage(
345*a39aafa3SRekha Aparna             "Create PEL failed with error: " + std::string(l_ex.what()));
346*a39aafa3SRekha Aparna     }
347*a39aafa3SRekha Aparna }
348*a39aafa3SRekha Aparna 
349*a39aafa3SRekha Aparna /**
350*a39aafa3SRekha Aparna  * @brief An API to create a PEL with device path callout.
351*a39aafa3SRekha Aparna  *
352*a39aafa3SRekha Aparna  * @param[in] i_errorType - Enum to map with event message name.
353*a39aafa3SRekha Aparna  * @param[in] i_severity - Severity of the event.
354*a39aafa3SRekha Aparna  * @param[in] i_callouts - Callout information, list of tuple having device
355*a39aafa3SRekha Aparna  * path and error number as input.
356*a39aafa3SRekha Aparna  * @param[in] i_fileName - File name.
357*a39aafa3SRekha Aparna  * @param[in] i_funcName - Function name.
358*a39aafa3SRekha Aparna  * @param[in] i_internalRc - Internal return code.
359*a39aafa3SRekha Aparna  * @param[in] i_userData1 - Additional user data [optional].
360*a39aafa3SRekha Aparna  * @param[in] i_userData2 - Additional user data [optional].
361*a39aafa3SRekha Aparna  */
362*a39aafa3SRekha Aparna inline void createAsyncPelWithI2cDeviceCallout(
363*a39aafa3SRekha Aparna     const types::ErrorType i_errorType, const types::SeverityType i_severity,
364*a39aafa3SRekha Aparna     const std::vector<types::DeviceCalloutData>& i_callouts,
365*a39aafa3SRekha Aparna     const std::string& i_fileName, const std::string& i_funcName,
366*a39aafa3SRekha Aparna     const uint8_t i_internalRc,
367*a39aafa3SRekha Aparna     const std::optional<std::pair<std::string, std::string>> i_userData1,
368*a39aafa3SRekha Aparna     const std::optional<std::pair<std::string, std::string>> i_userData2);
369*a39aafa3SRekha Aparna 
370*a39aafa3SRekha Aparna /**
371*a39aafa3SRekha Aparna  * @brief An API to create a PEL with I2c bus callout.
372*a39aafa3SRekha Aparna  *
373*a39aafa3SRekha Aparna  * @param[in] i_errorType - Enum to map with event message name.
374*a39aafa3SRekha Aparna  * @param[in] i_severity - Severity of the event.
375*a39aafa3SRekha Aparna  * @param[in] i_callouts - Callout information, list of tuple having i2c
376*a39aafa3SRekha Aparna  * bus, i2c address and error number as input.
377*a39aafa3SRekha Aparna  * @param[in] i_fileName - File name.
378*a39aafa3SRekha Aparna  * @param[in] i_funcName - Function name.
379*a39aafa3SRekha Aparna  * @param[in] i_internalRc - Internal return code.
380*a39aafa3SRekha Aparna  * @param[in] i_userData1 - Additional user data [optional].
381*a39aafa3SRekha Aparna  * @param[in] i_userData2 - Additional user data [optional].
382*a39aafa3SRekha Aparna  */
383*a39aafa3SRekha Aparna inline void createAsyncPelWithI2cBusCallout(
384*a39aafa3SRekha Aparna     const types::ErrorType i_errorType, const types::SeverityType i_severity,
385*a39aafa3SRekha Aparna     const std::vector<types::I2cBusCalloutData>& i_callouts,
386*a39aafa3SRekha Aparna     const std::string& i_fileName, const std::string& i_funcName,
387*a39aafa3SRekha Aparna     const uint8_t i_internalRc,
388*a39aafa3SRekha Aparna     const std::optional<std::pair<std::string, std::string>> i_userData1,
389*a39aafa3SRekha Aparna     const std::optional<std::pair<std::string, std::string>> i_userData2);
390*a39aafa3SRekha Aparna 
391*a39aafa3SRekha Aparna /**
392*a39aafa3SRekha Aparna  * @brief An API to create a PEL.
393*a39aafa3SRekha Aparna  *
394*a39aafa3SRekha Aparna  * @param[in] i_errorType - Enum to map with event message name.
395*a39aafa3SRekha Aparna  * @param[in] i_severity - Severity of the event.
396*a39aafa3SRekha Aparna  * @param[in] i_fileName - File name.
397*a39aafa3SRekha Aparna  * @param[in] i_funcName - Function name.
398*a39aafa3SRekha Aparna  * @param[in] i_internalRc - Internal return code.
399*a39aafa3SRekha Aparna  * @param[in] i_description - Error description.
400*a39aafa3SRekha Aparna  * @param[in] i_userData1 - Additional user data [optional].
401*a39aafa3SRekha Aparna  * @param[in] i_userData2 - Additional user data [optional].
402*a39aafa3SRekha Aparna  * @param[in] i_symFru - Symblolic FRU callout data [optional].
403*a39aafa3SRekha Aparna  * @param[in] i_procedure - Procedure callout data [optional].
404*a39aafa3SRekha Aparna  *
405*a39aafa3SRekha Aparna  * @todo: Symbolic FRU and procedure callout needs to be handled in this
406*a39aafa3SRekha Aparna  * API.
407*a39aafa3SRekha Aparna  */
408*a39aafa3SRekha Aparna inline void createAsyncPel(
409*a39aafa3SRekha Aparna     const types::ErrorType& i_errorType, const types::SeverityType& i_severity,
410*a39aafa3SRekha Aparna     const std::string& i_fileName, const std::string& i_funcName,
411*a39aafa3SRekha Aparna     const uint8_t i_internalRc, const std::string& i_description,
412*a39aafa3SRekha Aparna     const std::optional<std::string> i_userData1,
413*a39aafa3SRekha Aparna     const std::optional<std::string> i_userData2,
414*a39aafa3SRekha Aparna     const std::optional<std::string> i_symFru,
415*a39aafa3SRekha Aparna     const std::optional<std::string> i_procedure)
416*a39aafa3SRekha Aparna {
417*a39aafa3SRekha Aparna     (void)i_symFru;
418*a39aafa3SRekha Aparna     (void)i_procedure;
419*a39aafa3SRekha Aparna     try
420*a39aafa3SRekha Aparna     {
421*a39aafa3SRekha Aparna         if (errorMsgMap.find(i_errorType) == errorMsgMap.end())
422*a39aafa3SRekha Aparna         {
423*a39aafa3SRekha Aparna             throw std::runtime_error("Unsupported error type received");
424*a39aafa3SRekha Aparna             // TODO: Need to handle, instead of throwing an exception.
425*a39aafa3SRekha Aparna         }
426*a39aafa3SRekha Aparna 
427*a39aafa3SRekha Aparna         const std::string& l_message = errorMsgMap.at(i_errorType);
428*a39aafa3SRekha Aparna 
429*a39aafa3SRekha Aparna         const std::string& l_severity =
430*a39aafa3SRekha Aparna             (severityMap.find(i_severity) != severityMap.end()
431*a39aafa3SRekha Aparna                  ? severityMap.at(i_severity)
432*a39aafa3SRekha Aparna                  : severityMap.at(types::SeverityType::Informational));
433*a39aafa3SRekha Aparna 
434*a39aafa3SRekha Aparna         const std::string l_description =
435*a39aafa3SRekha Aparna             ((!i_description.empty() ? i_description : "VPD generic error"));
436*a39aafa3SRekha Aparna 
437*a39aafa3SRekha Aparna         const std::string l_userData1 = ((i_userData1) ? (*i_userData1) : "");
438*a39aafa3SRekha Aparna 
439*a39aafa3SRekha Aparna         const std::string l_userData2 = ((i_userData2) ? (*i_userData2) : "");
440*a39aafa3SRekha Aparna 
441*a39aafa3SRekha Aparna         sd_bus* l_sdBus = nullptr;
442*a39aafa3SRekha Aparna         sd_bus_default(&l_sdBus);
443*a39aafa3SRekha Aparna 
444*a39aafa3SRekha Aparna         // VALUE_6 represents the additional data pair count passing to create
445*a39aafa3SRekha Aparna         // PEL. If there any change in additional data, we need to pass the
446*a39aafa3SRekha Aparna         // correct number.
447*a39aafa3SRekha Aparna         auto l_rc = sd_bus_call_method_async(
448*a39aafa3SRekha Aparna             l_sdBus, NULL, constants::eventLoggingServiceName,
449*a39aafa3SRekha Aparna             constants::eventLoggingObjectPath, constants::eventLoggingInterface,
450*a39aafa3SRekha Aparna             "Create", NULL, NULL, "ssa{ss}", l_message.c_str(),
451*a39aafa3SRekha Aparna             l_severity.c_str(), constants::VALUE_6, "FileName",
452*a39aafa3SRekha Aparna             i_fileName.c_str(), "FunctionName", i_funcName.c_str(),
453*a39aafa3SRekha Aparna             "InternalRc", std::to_string(i_internalRc).c_str(), "DESCRIPTION",
454*a39aafa3SRekha Aparna             l_description.c_str(), "UserData1", l_userData1.c_str(),
455*a39aafa3SRekha Aparna             "UserData2", l_userData2.c_str());
456*a39aafa3SRekha Aparna 
457*a39aafa3SRekha Aparna         if (l_rc < 0)
458*a39aafa3SRekha Aparna         {
459*a39aafa3SRekha Aparna             logging::logMessage(
460*a39aafa3SRekha Aparna                 "Error calling sd_bus_call_method_async, Message = " +
461*a39aafa3SRekha Aparna                 std::string(strerror(-l_rc)));
462*a39aafa3SRekha Aparna         }
463*a39aafa3SRekha Aparna     }
464*a39aafa3SRekha Aparna     catch (const sdbusplus::exception::SdBusError& l_ex)
465*a39aafa3SRekha Aparna     {
466*a39aafa3SRekha Aparna         logging::logMessage("Async PEL creation failed with an error: " +
467*a39aafa3SRekha Aparna                             std::string(l_ex.what()));
468*a39aafa3SRekha Aparna     }
469*a39aafa3SRekha Aparna }
470*a39aafa3SRekha Aparna 
471*a39aafa3SRekha Aparna /**
472*a39aafa3SRekha Aparna  * @brief An API to create PEL.
473*a39aafa3SRekha Aparna  *
474*a39aafa3SRekha Aparna  * This API makes synchronous call to phosphor-logging Create method.
475*a39aafa3SRekha Aparna  *
476*a39aafa3SRekha Aparna  * @param[in] i_errorType - Enum to map with event message name.
477*a39aafa3SRekha Aparna  * @param[in] i_severity - Severity of the event.
478*a39aafa3SRekha Aparna  * @param[in] i_fileName - File name.
479*a39aafa3SRekha Aparna  * @param[in] i_funcName - Function name.
480*a39aafa3SRekha Aparna  * @param[in] i_internalRc - Internal return code.
481*a39aafa3SRekha Aparna  * @param[in] i_description - Error description.
482*a39aafa3SRekha Aparna  * @param[in] i_userData1 - Additional user data [optional].
483*a39aafa3SRekha Aparna  * @param[in] i_userData2 - Additional user data [optional].
484*a39aafa3SRekha Aparna  * @param[in] i_symFru - Symblolic FRU callout data [optional].s
485*a39aafa3SRekha Aparna  * @param[in] i_procedure - Procedure callout data [optional].
486*a39aafa3SRekha Aparna  *
487*a39aafa3SRekha Aparna  * @todo: Symbolic FRU and procedure callout needs to be handled in this
488*a39aafa3SRekha Aparna  * API.
489*a39aafa3SRekha Aparna  */
490*a39aafa3SRekha Aparna inline void createSyncPel(
491*a39aafa3SRekha Aparna     const types::ErrorType& i_errorType, const types::SeverityType& i_severity,
492*a39aafa3SRekha Aparna     const std::string& i_fileName, const std::string& i_funcName,
493*a39aafa3SRekha Aparna     const uint8_t i_internalRc, const std::string& i_description,
494*a39aafa3SRekha Aparna     const std::optional<std::string> i_userData1,
495*a39aafa3SRekha Aparna     const std::optional<std::string> i_userData2,
496*a39aafa3SRekha Aparna     const std::optional<std::string> i_symFru,
497*a39aafa3SRekha Aparna     const std::optional<std::string> i_procedure)
498*a39aafa3SRekha Aparna {
499*a39aafa3SRekha Aparna     (void)i_symFru;
500*a39aafa3SRekha Aparna     (void)i_procedure;
501*a39aafa3SRekha Aparna     try
502*a39aafa3SRekha Aparna     {
503*a39aafa3SRekha Aparna         if (errorMsgMap.find(i_errorType) == errorMsgMap.end())
504*a39aafa3SRekha Aparna         {
505*a39aafa3SRekha Aparna             throw std::runtime_error("Unsupported error type received");
506*a39aafa3SRekha Aparna             // TODO: Need to handle, instead of throwing an exception.
507*a39aafa3SRekha Aparna         }
508*a39aafa3SRekha Aparna 
509*a39aafa3SRekha Aparna         const std::string& l_message = errorMsgMap.at(i_errorType);
510*a39aafa3SRekha Aparna 
511*a39aafa3SRekha Aparna         const std::string& l_severity =
512*a39aafa3SRekha Aparna             (severityMap.find(i_severity) != severityMap.end()
513*a39aafa3SRekha Aparna                  ? severityMap.at(i_severity)
514*a39aafa3SRekha Aparna                  : severityMap.at(types::SeverityType::Informational));
515*a39aafa3SRekha Aparna 
516*a39aafa3SRekha Aparna         const std::string l_description =
517*a39aafa3SRekha Aparna             ((!i_description.empty() ? i_description : "VPD generic error"));
518*a39aafa3SRekha Aparna 
519*a39aafa3SRekha Aparna         const std::string l_userData1 = ((i_userData1) ? (*i_userData1) : "");
520*a39aafa3SRekha Aparna 
521*a39aafa3SRekha Aparna         const std::string l_userData2 = ((i_userData2) ? (*i_userData2) : "");
522*a39aafa3SRekha Aparna 
523*a39aafa3SRekha Aparna         std::map<std::string, std::string> l_additionalData{
524*a39aafa3SRekha Aparna             {"FileName", i_fileName},
525*a39aafa3SRekha Aparna             {"FunctionName", i_funcName},
526*a39aafa3SRekha Aparna             {"DESCRIPTION", l_description},
527*a39aafa3SRekha Aparna             {"InteranlRc", std::to_string(i_internalRc)},
528*a39aafa3SRekha Aparna             {"UserData1", l_userData1.c_str()},
529*a39aafa3SRekha Aparna             {"UserData2", l_userData2.c_str()}};
530*a39aafa3SRekha Aparna 
531*a39aafa3SRekha Aparna         auto l_bus = sdbusplus::bus::new_default();
532*a39aafa3SRekha Aparna         auto l_method =
533*a39aafa3SRekha Aparna             l_bus.new_method_call(constants::eventLoggingServiceName,
534*a39aafa3SRekha Aparna                                   constants::eventLoggingObjectPath,
535*a39aafa3SRekha Aparna                                   constants::eventLoggingInterface, "Create");
536*a39aafa3SRekha Aparna         l_method.append(l_message, l_severity, l_additionalData);
537*a39aafa3SRekha Aparna         l_bus.call(l_method);
538*a39aafa3SRekha Aparna     }
539*a39aafa3SRekha Aparna     catch (const sdbusplus::exception::SdBusError& l_ex)
540*a39aafa3SRekha Aparna     {
541*a39aafa3SRekha Aparna         logging::logMessage("Sync PEL creation failed with an error: " +
542*a39aafa3SRekha Aparna                             std::string(l_ex.what()));
543*a39aafa3SRekha Aparna     }
544*a39aafa3SRekha Aparna }
545*a39aafa3SRekha Aparna 
546*a39aafa3SRekha Aparna /**
547*a39aafa3SRekha Aparna  * @brief An API to create a synchronus PEL with inventory path callout.
548*a39aafa3SRekha Aparna  *
549*a39aafa3SRekha Aparna  * This API calls phosphor-logging method to create PEL, and also handles
550*a39aafa3SRekha Aparna  * inventory path callout. In case called with EEPROM path, will look for
551*a39aafa3SRekha Aparna  * JSON at symbolic link and if present will fetch inventory path for that
552*a39aafa3SRekha Aparna  * EEPROM.
553*a39aafa3SRekha Aparna  *
554*a39aafa3SRekha Aparna  * Note: In case of any error in fetching JSON or converting the EEPROM
555*a39aafa3SRekha Aparna  * path, the API will log PEL with path passed in callout parameter.
556*a39aafa3SRekha Aparna  * If inventory/EEPROM path is not provided in the callout, it will create
557*a39aafa3SRekha Aparna  * PEL without call out. Currently only one callout is handled in this API.
558*a39aafa3SRekha Aparna  *
559*a39aafa3SRekha Aparna  * @todo: Symbolic FRU and procedure callout needs to be handled in this
560*a39aafa3SRekha Aparna  * API.
561*a39aafa3SRekha Aparna  *
562*a39aafa3SRekha Aparna  * @param[in] i_errorType - Enum to map with event message name.
563*a39aafa3SRekha Aparna  * @param[in] i_severity - Severity of the event.
564*a39aafa3SRekha Aparna  * @param[in] i_fileName - File name.
565*a39aafa3SRekha Aparna  * @param[in] i_funcName - Function name.
566*a39aafa3SRekha Aparna  * @param[in] i_internalRc - Internal return code.
567*a39aafa3SRekha Aparna  * @param[in] i_description - Error description.
568*a39aafa3SRekha Aparna  * @param[in] i_callouts - Callout information.
569*a39aafa3SRekha Aparna  * @param[in] i_userData1 - Additional user data [optional].
570*a39aafa3SRekha Aparna  * @param[in] i_userData2 - Additional user data [optional].
571*a39aafa3SRekha Aparna  * @param[in] i_symFru - Symblolic FRU callout data [optional].
572*a39aafa3SRekha Aparna  * @param[in] i_procedure - Procedure callout data [optional].
573*a39aafa3SRekha Aparna  *
574*a39aafa3SRekha Aparna  */
575*a39aafa3SRekha Aparna inline void createSyncPelWithInvCallOut(
576*a39aafa3SRekha Aparna     const types::ErrorType& i_errorType, const types::SeverityType& i_severity,
577*a39aafa3SRekha Aparna     const std::string& i_fileName, const std::string& i_funcName,
578*a39aafa3SRekha Aparna     const uint8_t i_internalRc, const std::string& i_description,
579*a39aafa3SRekha Aparna     const std::vector<types::InventoryCalloutData>& i_callouts,
580*a39aafa3SRekha Aparna     const std::optional<std::string> i_userData1,
581*a39aafa3SRekha Aparna     const std::optional<std::string> i_userData2,
582*a39aafa3SRekha Aparna     [[maybe_unused]] const std::optional<std::string> i_symFru,
583*a39aafa3SRekha Aparna     [[maybe_unused]] const std::optional<std::string> i_procedure)
584*a39aafa3SRekha Aparna {
585*a39aafa3SRekha Aparna     try
586*a39aafa3SRekha Aparna     {
587*a39aafa3SRekha Aparna         if (i_callouts.empty())
588*a39aafa3SRekha Aparna         {
589*a39aafa3SRekha Aparna             createSyncPel(i_errorType, i_severity, i_fileName, i_funcName,
590*a39aafa3SRekha Aparna                           i_internalRc, i_description, i_userData1, i_userData2,
591*a39aafa3SRekha Aparna                           i_symFru, i_procedure);
592*a39aafa3SRekha Aparna             logging::logMessage(
593*a39aafa3SRekha Aparna                 "Callout list is empty, creating PEL without call out");
594*a39aafa3SRekha Aparna             return;
595*a39aafa3SRekha Aparna         }
596*a39aafa3SRekha Aparna 
597*a39aafa3SRekha Aparna         if (errorMsgMap.find(i_errorType) == errorMsgMap.end())
598*a39aafa3SRekha Aparna         {
599*a39aafa3SRekha Aparna             throw std::runtime_error("Unsupported error type received");
600*a39aafa3SRekha Aparna         }
601*a39aafa3SRekha Aparna 
602*a39aafa3SRekha Aparna         // Path to hold callout inventory path.
603*a39aafa3SRekha Aparna         std::string l_calloutInvPath;
604*a39aafa3SRekha Aparna 
605*a39aafa3SRekha Aparna         uint16_t l_errCode = 0;
606*a39aafa3SRekha Aparna 
607*a39aafa3SRekha Aparna         // check if callout path is a valid inventory path. if not, get the JSON
608*a39aafa3SRekha Aparna         // object to get inventory path.
609*a39aafa3SRekha Aparna         if (std::get<0>(i_callouts[0])
610*a39aafa3SRekha Aparna                 .compare(constants::VALUE_0, strlen(constants::pimPath),
611*a39aafa3SRekha Aparna                          constants::pimPath) != constants::STR_CMP_SUCCESS)
612*a39aafa3SRekha Aparna         {
613*a39aafa3SRekha Aparna             std::error_code l_ec;
614*a39aafa3SRekha Aparna             // implies json dependent execution.
615*a39aafa3SRekha Aparna             if (std::filesystem::exists(INVENTORY_JSON_SYM_LINK, l_ec))
616*a39aafa3SRekha Aparna             {
617*a39aafa3SRekha Aparna                 if (!l_ec)
618*a39aafa3SRekha Aparna                 {
619*a39aafa3SRekha Aparna                     nlohmann::json l_parsedJson = jsonUtility::getParsedJson(
620*a39aafa3SRekha Aparna                         INVENTORY_JSON_SYM_LINK, l_errCode);
621*a39aafa3SRekha Aparna 
622*a39aafa3SRekha Aparna                     if (l_errCode)
623*a39aafa3SRekha Aparna                     {
624*a39aafa3SRekha Aparna                         logging::logMessage(
625*a39aafa3SRekha Aparna                             "Failed to parse JSON file [ " +
626*a39aafa3SRekha Aparna                             std::string(INVENTORY_JSON_SYM_LINK) +
627*a39aafa3SRekha Aparna                             " ], error : " +
628*a39aafa3SRekha Aparna                             commonUtility::getErrCodeMsg(l_errCode));
629*a39aafa3SRekha Aparna                     }
630*a39aafa3SRekha Aparna 
631*a39aafa3SRekha Aparna                     l_calloutInvPath = jsonUtility::getInventoryObjPathFromJson(
632*a39aafa3SRekha Aparna                         l_parsedJson, std::get<0>(i_callouts[0]), l_errCode);
633*a39aafa3SRekha Aparna                 }
634*a39aafa3SRekha Aparna                 else
635*a39aafa3SRekha Aparna                 {
636*a39aafa3SRekha Aparna                     logging::logMessage(
637*a39aafa3SRekha Aparna                         "Error finding symlink. Continue with given path");
638*a39aafa3SRekha Aparna                 }
639*a39aafa3SRekha Aparna             }
640*a39aafa3SRekha Aparna         }
641*a39aafa3SRekha Aparna 
642*a39aafa3SRekha Aparna         if (l_calloutInvPath.empty())
643*a39aafa3SRekha Aparna         {
644*a39aafa3SRekha Aparna             l_calloutInvPath = std::get<0>(i_callouts[0]);
645*a39aafa3SRekha Aparna 
646*a39aafa3SRekha Aparna             if (l_errCode)
647*a39aafa3SRekha Aparna             {
648*a39aafa3SRekha Aparna                 logging::logMessage(
649*a39aafa3SRekha Aparna                     "Failed to get inventory object path from JSON for FRU [" +
650*a39aafa3SRekha Aparna                     std::get<0>(i_callouts[0]) +
651*a39aafa3SRekha Aparna                     "], error : " + commonUtility::getErrCodeMsg(l_errCode));
652*a39aafa3SRekha Aparna             }
653*a39aafa3SRekha Aparna         }
654*a39aafa3SRekha Aparna 
655*a39aafa3SRekha Aparna         const std::map<std::string, std::string> l_additionalData{
656*a39aafa3SRekha Aparna             {"FileName", i_fileName},
657*a39aafa3SRekha Aparna             {"FunctionName", i_funcName},
658*a39aafa3SRekha Aparna             {"DESCRIPTION",
659*a39aafa3SRekha Aparna              (!i_description.empty() ? i_description : "VPD generic error")},
660*a39aafa3SRekha Aparna             {"CALLOUT_INVENTORY_PATH", l_calloutInvPath},
661*a39aafa3SRekha Aparna             {"InteranlRc", std::to_string(i_internalRc)},
662*a39aafa3SRekha Aparna             {"UserData1", ((i_userData1) ? (*i_userData1) : "").c_str()},
663*a39aafa3SRekha Aparna             {"UserData2", ((i_userData2) ? (*i_userData2) : "").c_str()}};
664*a39aafa3SRekha Aparna 
665*a39aafa3SRekha Aparna         const std::string& l_severity =
666*a39aafa3SRekha Aparna             (severityMap.find(i_severity) != severityMap.end()
667*a39aafa3SRekha Aparna                  ? severityMap.at(i_severity)
668*a39aafa3SRekha Aparna                  : severityMap.at(types::SeverityType::Informational));
669*a39aafa3SRekha Aparna 
670*a39aafa3SRekha Aparna         auto l_bus = sdbusplus::bus::new_default();
671*a39aafa3SRekha Aparna         auto l_method =
672*a39aafa3SRekha Aparna             l_bus.new_method_call(constants::eventLoggingServiceName,
673*a39aafa3SRekha Aparna                                   constants::eventLoggingObjectPath,
674*a39aafa3SRekha Aparna                                   constants::eventLoggingInterface, "Create");
675*a39aafa3SRekha Aparna         l_method.append(errorMsgMap.at(i_errorType), l_severity,
676*a39aafa3SRekha Aparna                         l_additionalData);
677*a39aafa3SRekha Aparna         l_bus.call(l_method);
678*a39aafa3SRekha Aparna     }
679*a39aafa3SRekha Aparna     catch (const std::exception& l_ex)
680*a39aafa3SRekha Aparna     {
681*a39aafa3SRekha Aparna         logging::logMessage(
682*a39aafa3SRekha Aparna             "Sync PEL creation with inventory path failed with error: " +
683*a39aafa3SRekha Aparna             std::string(l_ex.what()));
684*a39aafa3SRekha Aparna     }
685*a39aafa3SRekha Aparna }
686*a39aafa3SRekha Aparna } // namespace EventLogger
687*a39aafa3SRekha Aparna } // namespace vpd
688