13c6f29a0SDhruvaraj Subhashchandran #include <phosphor-logging/elog.hpp> 2*151122aaSWilliam A. Kennington III #include <sdbusplus/exception.hpp> 33c6f29a0SDhruvaraj Subhashchandran #include "xyz/openbmc_project/Led/Fru/Monitor/error.hpp" 43c6f29a0SDhruvaraj Subhashchandran #include "xyz/openbmc_project/Led/Mapper/error.hpp" 53c6f29a0SDhruvaraj Subhashchandran #include "elog-errors.hpp" 659b86cd7SDhruvaraj Subhashchandran #include "fru-fault-monitor.hpp" 7891c4769SDhruvaraj Subhashchandran #include <phosphor-logging/elog-errors.hpp> 8891c4769SDhruvaraj Subhashchandran #include "xyz/openbmc_project/Common/error.hpp" 93c6f29a0SDhruvaraj Subhashchandran 1059b86cd7SDhruvaraj Subhashchandran namespace phosphor 1159b86cd7SDhruvaraj Subhashchandran { 1259b86cd7SDhruvaraj Subhashchandran namespace led 1359b86cd7SDhruvaraj Subhashchandran { 1459b86cd7SDhruvaraj Subhashchandran namespace fru 1559b86cd7SDhruvaraj Subhashchandran { 1659b86cd7SDhruvaraj Subhashchandran namespace fault 1759b86cd7SDhruvaraj Subhashchandran { 1859b86cd7SDhruvaraj Subhashchandran namespace monitor 1959b86cd7SDhruvaraj Subhashchandran { 2059b86cd7SDhruvaraj Subhashchandran 213c6f29a0SDhruvaraj Subhashchandran using namespace phosphor::logging; 223c6f29a0SDhruvaraj Subhashchandran 233c6f29a0SDhruvaraj Subhashchandran constexpr auto MAPPER_BUSNAME = "xyz.openbmc_project.ObjectMapper"; 243c6f29a0SDhruvaraj Subhashchandran constexpr auto MAPPER_OBJ_PATH = "/xyz/openbmc_project/object_mapper"; 253c6f29a0SDhruvaraj Subhashchandran constexpr auto MAPPER_IFACE = "xyz.openbmc_project.ObjectMapper"; 263c6f29a0SDhruvaraj Subhashchandran constexpr auto OBJMGR_IFACE = "org.freedesktop.DBus.ObjectManager"; 273c6f29a0SDhruvaraj Subhashchandran constexpr auto LED_GROUPS = "/xyz/openbmc_project/led/groups/"; 283c6f29a0SDhruvaraj Subhashchandran constexpr auto LOG_PATH = "/xyz/openbmc_project/logging"; 29891c4769SDhruvaraj Subhashchandran constexpr auto LOG_IFACE = "xyz.openbmc_project.Logging.Entry"; 303c6f29a0SDhruvaraj Subhashchandran 313c6f29a0SDhruvaraj Subhashchandran using AssociationList = std::vector<std::tuple< 323c6f29a0SDhruvaraj Subhashchandran std::string, std::string, std::string>>; 33aebfde81SDhruvaraj Subhashchandran using Attributes = sdbusplus::message::variant<bool,AssociationList>; 34aebfde81SDhruvaraj Subhashchandran using AttributeName = std::string; 35aebfde81SDhruvaraj Subhashchandran using AttributeMap = std::map<AttributeName, Attributes>; 36aebfde81SDhruvaraj Subhashchandran using PropertyName = std::string; 37aebfde81SDhruvaraj Subhashchandran using PropertyMap = std::map<PropertyName, AttributeMap>; 38aebfde81SDhruvaraj Subhashchandran using LogEntryMsg = std::pair<sdbusplus::message::object_path, PropertyMap>; 39aebfde81SDhruvaraj Subhashchandran 40891c4769SDhruvaraj Subhashchandran using Service = std::string; 41891c4769SDhruvaraj Subhashchandran using Path = std::string; 42891c4769SDhruvaraj Subhashchandran using Interface = std::string; 43891c4769SDhruvaraj Subhashchandran using Interfaces = std::vector<Interface>; 44891c4769SDhruvaraj Subhashchandran using MapperResponseType = std::map<Path, std::map<Service, Interfaces>>; 45891c4769SDhruvaraj Subhashchandran 46891c4769SDhruvaraj Subhashchandran using InternalFailure = 47891c4769SDhruvaraj Subhashchandran sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure; 48891c4769SDhruvaraj Subhashchandran 493c6f29a0SDhruvaraj Subhashchandran using MethodErr = 503c6f29a0SDhruvaraj Subhashchandran sdbusplus::xyz::openbmc_project::Led::Mapper::Error::MethodError; 513c6f29a0SDhruvaraj Subhashchandran using ObjectNotFoundErr = 523c6f29a0SDhruvaraj Subhashchandran sdbusplus::xyz::openbmc_project::Led::Mapper::Error::ObjectNotFoundError; 533c6f29a0SDhruvaraj Subhashchandran using InventoryPathErr = 543c6f29a0SDhruvaraj Subhashchandran sdbusplus::xyz::openbmc_project:: 553c6f29a0SDhruvaraj Subhashchandran Led::Fru::Monitor::Error::InventoryPathError; 563c6f29a0SDhruvaraj Subhashchandran 573c6f29a0SDhruvaraj Subhashchandran std::string getService(sdbusplus::bus::bus& bus, 583c6f29a0SDhruvaraj Subhashchandran const std::string& path) 593c6f29a0SDhruvaraj Subhashchandran { 603c6f29a0SDhruvaraj Subhashchandran auto mapper = bus.new_method_call(MAPPER_BUSNAME, 613c6f29a0SDhruvaraj Subhashchandran MAPPER_OBJ_PATH, 623c6f29a0SDhruvaraj Subhashchandran MAPPER_IFACE, "GetObject"); 633c6f29a0SDhruvaraj Subhashchandran mapper.append(path.c_str(), std::vector<std::string>({OBJMGR_IFACE})); 643c6f29a0SDhruvaraj Subhashchandran auto mapperResponseMsg = bus.call(mapper); 653c6f29a0SDhruvaraj Subhashchandran if (mapperResponseMsg.is_method_error()) 663c6f29a0SDhruvaraj Subhashchandran { 673c6f29a0SDhruvaraj Subhashchandran using namespace xyz::openbmc_project::Led::Mapper; 683c6f29a0SDhruvaraj Subhashchandran elog<MethodErr>( 693c6f29a0SDhruvaraj Subhashchandran MethodError::METHOD_NAME("GetObject"), 703c6f29a0SDhruvaraj Subhashchandran MethodError::PATH(path.c_str()), 713c6f29a0SDhruvaraj Subhashchandran MethodError::INTERFACE( 723c6f29a0SDhruvaraj Subhashchandran OBJMGR_IFACE)); 733c6f29a0SDhruvaraj Subhashchandran } 743c6f29a0SDhruvaraj Subhashchandran 753c6f29a0SDhruvaraj Subhashchandran std::map<std::string, std::vector<std::string>> mapperResponse; 76*151122aaSWilliam A. Kennington III try 77*151122aaSWilliam A. Kennington III { 783c6f29a0SDhruvaraj Subhashchandran mapperResponseMsg.read(mapperResponse); 79*151122aaSWilliam A. Kennington III } 80*151122aaSWilliam A. Kennington III catch (const sdbusplus::exception::SdBusError& e) 81*151122aaSWilliam A. Kennington III { 82*151122aaSWilliam A. Kennington III log<level::ERR>("Failed to parse getService mapper response", 83*151122aaSWilliam A. Kennington III entry("ERROR=%s", e.what()), 84*151122aaSWilliam A. Kennington III entry("REPLY_SIG=%s", mapperResponseMsg.get_signature())); 85*151122aaSWilliam A. Kennington III using namespace xyz::openbmc_project::Led::Mapper; 86*151122aaSWilliam A. Kennington III elog<ObjectNotFoundErr>( 87*151122aaSWilliam A. Kennington III ObjectNotFoundError::METHOD_NAME("GetObject"), 88*151122aaSWilliam A. Kennington III ObjectNotFoundError::PATH(path.c_str()), 89*151122aaSWilliam A. Kennington III ObjectNotFoundError::INTERFACE( 90*151122aaSWilliam A. Kennington III OBJMGR_IFACE)); 91*151122aaSWilliam A. Kennington III } 923c6f29a0SDhruvaraj Subhashchandran if (mapperResponse.empty()) 933c6f29a0SDhruvaraj Subhashchandran { 943c6f29a0SDhruvaraj Subhashchandran using namespace xyz::openbmc_project::Led::Mapper; 953c6f29a0SDhruvaraj Subhashchandran elog<ObjectNotFoundErr>( 963c6f29a0SDhruvaraj Subhashchandran ObjectNotFoundError::METHOD_NAME("GetObject"), 973c6f29a0SDhruvaraj Subhashchandran ObjectNotFoundError::PATH(path.c_str()), 983c6f29a0SDhruvaraj Subhashchandran ObjectNotFoundError::INTERFACE( 993c6f29a0SDhruvaraj Subhashchandran OBJMGR_IFACE)); 1003c6f29a0SDhruvaraj Subhashchandran } 1013c6f29a0SDhruvaraj Subhashchandran 1023c6f29a0SDhruvaraj Subhashchandran return mapperResponse.cbegin()->first; 1033c6f29a0SDhruvaraj Subhashchandran } 1043c6f29a0SDhruvaraj Subhashchandran 10559b86cd7SDhruvaraj Subhashchandran void action(sdbusplus::bus::bus& bus, 1063c6f29a0SDhruvaraj Subhashchandran const std::string& path, 10759b86cd7SDhruvaraj Subhashchandran bool assert) 10859b86cd7SDhruvaraj Subhashchandran { 1093c6f29a0SDhruvaraj Subhashchandran std::string service; 1103c6f29a0SDhruvaraj Subhashchandran try 1113c6f29a0SDhruvaraj Subhashchandran { 1123c6f29a0SDhruvaraj Subhashchandran service = getService(bus, LED_GROUPS); 1133c6f29a0SDhruvaraj Subhashchandran } 1143c6f29a0SDhruvaraj Subhashchandran catch (MethodErr& e) 1153c6f29a0SDhruvaraj Subhashchandran { 1163c6f29a0SDhruvaraj Subhashchandran commit<MethodErr>(); 1173c6f29a0SDhruvaraj Subhashchandran return; 1183c6f29a0SDhruvaraj Subhashchandran } 1193c6f29a0SDhruvaraj Subhashchandran catch (ObjectNotFoundErr& e) 1203c6f29a0SDhruvaraj Subhashchandran { 1213c6f29a0SDhruvaraj Subhashchandran commit<ObjectNotFoundErr>(); 1223c6f29a0SDhruvaraj Subhashchandran return; 1233c6f29a0SDhruvaraj Subhashchandran } 1243c6f29a0SDhruvaraj Subhashchandran 1253c6f29a0SDhruvaraj Subhashchandran auto pos = path.rfind("/"); 1263c6f29a0SDhruvaraj Subhashchandran if (pos == std::string::npos) 1273c6f29a0SDhruvaraj Subhashchandran { 1283c6f29a0SDhruvaraj Subhashchandran using namespace xyz::openbmc_project::Led::Fru::Monitor; 1293c6f29a0SDhruvaraj Subhashchandran report<InventoryPathErr>( 1303c6f29a0SDhruvaraj Subhashchandran InventoryPathError::PATH( 1313c6f29a0SDhruvaraj Subhashchandran path.c_str())); 1323c6f29a0SDhruvaraj Subhashchandran return; 1333c6f29a0SDhruvaraj Subhashchandran } 1343c6f29a0SDhruvaraj Subhashchandran auto unit = path.substr(pos + 1); 1353c6f29a0SDhruvaraj Subhashchandran 1363c6f29a0SDhruvaraj Subhashchandran std::string ledPath = LED_GROUPS + 1373c6f29a0SDhruvaraj Subhashchandran unit + '_' + LED_FAULT; 1383c6f29a0SDhruvaraj Subhashchandran 1393c6f29a0SDhruvaraj Subhashchandran auto method = bus.new_method_call(service.c_str(), 1403c6f29a0SDhruvaraj Subhashchandran ledPath.c_str(), 1413c6f29a0SDhruvaraj Subhashchandran "org.freedesktop.DBus.Properties", 1423c6f29a0SDhruvaraj Subhashchandran "Set"); 1433c6f29a0SDhruvaraj Subhashchandran method.append("xyz.openbmc_project.Led.Group"); 1443c6f29a0SDhruvaraj Subhashchandran method.append("Asserted"); 1453c6f29a0SDhruvaraj Subhashchandran 1463c6f29a0SDhruvaraj Subhashchandran method.append(sdbusplus::message::variant<bool>(assert)); 1473c6f29a0SDhruvaraj Subhashchandran bus.call_noreply(method); 1483c6f29a0SDhruvaraj Subhashchandran 14959b86cd7SDhruvaraj Subhashchandran return; 15059b86cd7SDhruvaraj Subhashchandran } 15159b86cd7SDhruvaraj Subhashchandran 1523eedbe44SPatrick Williams void Add::created(sdbusplus::message::message& msg) 15359b86cd7SDhruvaraj Subhashchandran { 1543eedbe44SPatrick Williams auto bus = msg.get_bus(); 1553c6f29a0SDhruvaraj Subhashchandran 156aebfde81SDhruvaraj Subhashchandran LogEntryMsg logEntry; 157*151122aaSWilliam A. Kennington III try 158*151122aaSWilliam A. Kennington III { 159aebfde81SDhruvaraj Subhashchandran msg.read(logEntry); 160*151122aaSWilliam A. Kennington III } 161*151122aaSWilliam A. Kennington III catch (const sdbusplus::exception::SdBusError& e) 162*151122aaSWilliam A. Kennington III { 163*151122aaSWilliam A. Kennington III log<level::ERR>("Failed to parse created message", 164*151122aaSWilliam A. Kennington III entry("ERROR=%s", e.what()), 165*151122aaSWilliam A. Kennington III entry("REPLY_SIG=%s", msg.get_signature())); 166*151122aaSWilliam A. Kennington III return; 167*151122aaSWilliam A. Kennington III } 168aebfde81SDhruvaraj Subhashchandran std::string objectPath(std::move(logEntry.first)); 1693c6f29a0SDhruvaraj Subhashchandran 1703c6f29a0SDhruvaraj Subhashchandran std::size_t found = objectPath.find(ELOG_ENTRY); 1713c6f29a0SDhruvaraj Subhashchandran if (found == std::string::npos) 1723c6f29a0SDhruvaraj Subhashchandran { 1733c6f29a0SDhruvaraj Subhashchandran //Not a new error entry skip 1743eedbe44SPatrick Williams return; 1753c6f29a0SDhruvaraj Subhashchandran } 176aebfde81SDhruvaraj Subhashchandran auto iter = logEntry.second.find("org.openbmc.Associations"); 177aebfde81SDhruvaraj Subhashchandran if (iter == logEntry.second.end()) 1783c6f29a0SDhruvaraj Subhashchandran { 1793eedbe44SPatrick Williams return; 1803c6f29a0SDhruvaraj Subhashchandran } 1813c6f29a0SDhruvaraj Subhashchandran 1823d2b0d62SMatt Spinler //Nothing else shows when a specific error log 1833d2b0d62SMatt Spinler //has been created. Do it here. 1843d2b0d62SMatt Spinler std::string message{objectPath + " created"}; 1853d2b0d62SMatt Spinler log<level::INFO>(message.c_str()); 1863d2b0d62SMatt Spinler 187aebfde81SDhruvaraj Subhashchandran auto attr = iter->second.find("associations"); 188aebfde81SDhruvaraj Subhashchandran if (attr == iter->second.end()) 1893c6f29a0SDhruvaraj Subhashchandran { 1903eedbe44SPatrick Williams return; 1913c6f29a0SDhruvaraj Subhashchandran } 1923c6f29a0SDhruvaraj Subhashchandran 193aebfde81SDhruvaraj Subhashchandran auto& assocs = 194aebfde81SDhruvaraj Subhashchandran sdbusplus::message::variant_ns::get<AssociationList>(attr->second); 1953c6f29a0SDhruvaraj Subhashchandran if (assocs.empty()) 1963c6f29a0SDhruvaraj Subhashchandran { 1973c6f29a0SDhruvaraj Subhashchandran //No associations skip 1983eedbe44SPatrick Williams return; 1993c6f29a0SDhruvaraj Subhashchandran } 2003c6f29a0SDhruvaraj Subhashchandran 2013c6f29a0SDhruvaraj Subhashchandran for (const auto& item : assocs) 2023c6f29a0SDhruvaraj Subhashchandran { 2033c6f29a0SDhruvaraj Subhashchandran if (std::get<1>(item).compare(CALLOUT_REV_ASSOCIATION) == 0) 2043c6f29a0SDhruvaraj Subhashchandran { 2053eedbe44SPatrick Williams removeWatches.emplace_back( 2063c6f29a0SDhruvaraj Subhashchandran std::make_unique<Remove>(bus, std::get<2>(item))); 207891c4769SDhruvaraj Subhashchandran action(bus, std::get<2>(item), true); 2083c6f29a0SDhruvaraj Subhashchandran } 2093c6f29a0SDhruvaraj Subhashchandran } 210aebfde81SDhruvaraj Subhashchandran 2113eedbe44SPatrick Williams return; 21259b86cd7SDhruvaraj Subhashchandran } 21359b86cd7SDhruvaraj Subhashchandran 214891c4769SDhruvaraj Subhashchandran void Add::processExistingCallouts(sdbusplus::bus::bus& bus) 215891c4769SDhruvaraj Subhashchandran { 216891c4769SDhruvaraj Subhashchandran auto depth = 0; 217891c4769SDhruvaraj Subhashchandran auto mapperCall = bus.new_method_call(MAPPER_BUSNAME, 218891c4769SDhruvaraj Subhashchandran MAPPER_OBJ_PATH, 219891c4769SDhruvaraj Subhashchandran MAPPER_IFACE, 220891c4769SDhruvaraj Subhashchandran "GetSubTree"); 221891c4769SDhruvaraj Subhashchandran mapperCall.append("/"); 222891c4769SDhruvaraj Subhashchandran mapperCall.append(depth); 223891c4769SDhruvaraj Subhashchandran mapperCall.append(std::vector<Interface>({LOG_IFACE})); 224891c4769SDhruvaraj Subhashchandran 225891c4769SDhruvaraj Subhashchandran auto mapperResponseMsg = bus.call(mapperCall); 226891c4769SDhruvaraj Subhashchandran if (mapperResponseMsg.is_method_error()) 227891c4769SDhruvaraj Subhashchandran { 228891c4769SDhruvaraj Subhashchandran using namespace xyz::openbmc_project::Led::Mapper; 229891c4769SDhruvaraj Subhashchandran report<MethodErr>( 230891c4769SDhruvaraj Subhashchandran MethodError::METHOD_NAME("GetSubTree"), 231891c4769SDhruvaraj Subhashchandran MethodError::PATH(MAPPER_OBJ_PATH), 232891c4769SDhruvaraj Subhashchandran MethodError::INTERFACE( 233891c4769SDhruvaraj Subhashchandran OBJMGR_IFACE)); 234891c4769SDhruvaraj Subhashchandran return; 235891c4769SDhruvaraj Subhashchandran } 236891c4769SDhruvaraj Subhashchandran 237891c4769SDhruvaraj Subhashchandran MapperResponseType mapperResponse; 238*151122aaSWilliam A. Kennington III try 239*151122aaSWilliam A. Kennington III { 240891c4769SDhruvaraj Subhashchandran mapperResponseMsg.read(mapperResponse); 241*151122aaSWilliam A. Kennington III } 242*151122aaSWilliam A. Kennington III catch (const sdbusplus::exception::SdBusError& e) 243*151122aaSWilliam A. Kennington III { 244*151122aaSWilliam A. Kennington III log<level::ERR>("Failed to parse existing callouts subtree message", 245*151122aaSWilliam A. Kennington III entry("ERROR=%s", e.what()), 246*151122aaSWilliam A. Kennington III entry("REPLY_SIG=%s", mapperResponseMsg.get_signature())); 247*151122aaSWilliam A. Kennington III return; 248*151122aaSWilliam A. Kennington III } 249891c4769SDhruvaraj Subhashchandran if (mapperResponse.empty()) 250891c4769SDhruvaraj Subhashchandran { 251fc30e0c1SDhruvaraj Subhashchandran //No errors to process. 252891c4769SDhruvaraj Subhashchandran return; 253891c4769SDhruvaraj Subhashchandran } 254891c4769SDhruvaraj Subhashchandran 255891c4769SDhruvaraj Subhashchandran for (const auto& elem : mapperResponse) 256891c4769SDhruvaraj Subhashchandran { 257891c4769SDhruvaraj Subhashchandran auto method = bus.new_method_call(elem.second.begin()->first.c_str(), 258891c4769SDhruvaraj Subhashchandran elem.first.c_str(), 259891c4769SDhruvaraj Subhashchandran "org.freedesktop.DBus.Properties", 260891c4769SDhruvaraj Subhashchandran "Get"); 261891c4769SDhruvaraj Subhashchandran method.append("org.openbmc.Associations"); 262891c4769SDhruvaraj Subhashchandran method.append("associations"); 263891c4769SDhruvaraj Subhashchandran auto reply = bus.call(method); 264891c4769SDhruvaraj Subhashchandran if (reply.is_method_error()) 265891c4769SDhruvaraj Subhashchandran { 266891c4769SDhruvaraj Subhashchandran //do not stop, continue with next elog 267891c4769SDhruvaraj Subhashchandran log<level::ERR>("Error in getting associations"); 268891c4769SDhruvaraj Subhashchandran continue; 269891c4769SDhruvaraj Subhashchandran } 270891c4769SDhruvaraj Subhashchandran 271891c4769SDhruvaraj Subhashchandran sdbusplus::message::variant<AssociationList> assoc; 272*151122aaSWilliam A. Kennington III try 273*151122aaSWilliam A. Kennington III { 274891c4769SDhruvaraj Subhashchandran reply.read(assoc); 275*151122aaSWilliam A. Kennington III } 276*151122aaSWilliam A. Kennington III catch (const sdbusplus::exception::SdBusError& e) 277*151122aaSWilliam A. Kennington III { 278*151122aaSWilliam A. Kennington III log<level::ERR>("Failed to parse existing callouts associations message", 279*151122aaSWilliam A. Kennington III entry("ERROR=%s", e.what()), 280*151122aaSWilliam A. Kennington III entry("REPLY_SIG=%s", reply.get_signature())); 281*151122aaSWilliam A. Kennington III continue; 282*151122aaSWilliam A. Kennington III } 283891c4769SDhruvaraj Subhashchandran auto& assocs = assoc.get<AssociationList>(); 284891c4769SDhruvaraj Subhashchandran if (assocs.empty()) 285891c4769SDhruvaraj Subhashchandran { 286891c4769SDhruvaraj Subhashchandran //no associations, skip 287891c4769SDhruvaraj Subhashchandran continue; 288891c4769SDhruvaraj Subhashchandran } 289891c4769SDhruvaraj Subhashchandran 290891c4769SDhruvaraj Subhashchandran for (const auto& item : assocs) 291891c4769SDhruvaraj Subhashchandran { 292891c4769SDhruvaraj Subhashchandran if (std::get<1>(item).compare(CALLOUT_REV_ASSOCIATION) == 0) 293891c4769SDhruvaraj Subhashchandran { 294891c4769SDhruvaraj Subhashchandran removeWatches.emplace_back( 295891c4769SDhruvaraj Subhashchandran std::make_unique<Remove>(bus, std::get<2>(item))); 296891c4769SDhruvaraj Subhashchandran action(bus, std::get<2>(item), true); 297891c4769SDhruvaraj Subhashchandran } 298891c4769SDhruvaraj Subhashchandran } 299891c4769SDhruvaraj Subhashchandran } 300891c4769SDhruvaraj Subhashchandran } 301891c4769SDhruvaraj Subhashchandran 3023eedbe44SPatrick Williams void Remove::removed(sdbusplus::message::message& msg) 30359b86cd7SDhruvaraj Subhashchandran { 3043eedbe44SPatrick Williams auto bus = msg.get_bus(); 3053c6f29a0SDhruvaraj Subhashchandran 3063eedbe44SPatrick Williams action(bus, inventoryPath, false); 3073eedbe44SPatrick Williams return; 30859b86cd7SDhruvaraj Subhashchandran } 30959b86cd7SDhruvaraj Subhashchandran 31059b86cd7SDhruvaraj Subhashchandran }//namespace monitor 31159b86cd7SDhruvaraj Subhashchandran }//namespace fault 31259b86cd7SDhruvaraj Subhashchandran }//namespace fru 31359b86cd7SDhruvaraj Subhashchandran }//namespace led 31459b86cd7SDhruvaraj Subhashchandran }//namespace phosphor 315