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