13c6f29a0SDhruvaraj Subhashchandran #include <phosphor-logging/elog.hpp>
2151122aaSWilliam 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"
73c6f29a0SDhruvaraj Subhashchandran 
859b86cd7SDhruvaraj Subhashchandran namespace phosphor
959b86cd7SDhruvaraj Subhashchandran {
1059b86cd7SDhruvaraj Subhashchandran namespace led
1159b86cd7SDhruvaraj Subhashchandran {
1259b86cd7SDhruvaraj Subhashchandran namespace fru
1359b86cd7SDhruvaraj Subhashchandran {
1459b86cd7SDhruvaraj Subhashchandran namespace fault
1559b86cd7SDhruvaraj Subhashchandran {
1659b86cd7SDhruvaraj Subhashchandran namespace monitor
1759b86cd7SDhruvaraj Subhashchandran {
1859b86cd7SDhruvaraj Subhashchandran 
193c6f29a0SDhruvaraj Subhashchandran using namespace phosphor::logging;
203c6f29a0SDhruvaraj Subhashchandran 
213c6f29a0SDhruvaraj Subhashchandran constexpr auto MAPPER_BUSNAME   = "xyz.openbmc_project.ObjectMapper";
223c6f29a0SDhruvaraj Subhashchandran constexpr auto MAPPER_OBJ_PATH  = "/xyz/openbmc_project/object_mapper";
233c6f29a0SDhruvaraj Subhashchandran constexpr auto MAPPER_IFACE     = "xyz.openbmc_project.ObjectMapper";
243c6f29a0SDhruvaraj Subhashchandran constexpr auto OBJMGR_IFACE     = "org.freedesktop.DBus.ObjectManager";
253c6f29a0SDhruvaraj Subhashchandran constexpr auto LED_GROUPS       = "/xyz/openbmc_project/led/groups/";
263c6f29a0SDhruvaraj Subhashchandran constexpr auto LOG_PATH         = "/xyz/openbmc_project/logging";
27891c4769SDhruvaraj Subhashchandran constexpr auto LOG_IFACE        = "xyz.openbmc_project.Logging.Entry";
283c6f29a0SDhruvaraj Subhashchandran 
293c6f29a0SDhruvaraj Subhashchandran using AssociationList = std::vector<std::tuple<
303c6f29a0SDhruvaraj Subhashchandran                         std::string, std::string, std::string>>;
31aebfde81SDhruvaraj Subhashchandran using Attributes = sdbusplus::message::variant<bool,AssociationList>;
32aebfde81SDhruvaraj Subhashchandran using PropertyName = std::string;
33b2f253b7SMatt Spinler using PropertyMap = std::map<PropertyName, Attributes>;
34b2f253b7SMatt Spinler using InterfaceName = std::string;
35b2f253b7SMatt Spinler using InterfaceMap = std::map<InterfaceName, PropertyMap>;
36aebfde81SDhruvaraj Subhashchandran 
37891c4769SDhruvaraj Subhashchandran using Service = std::string;
38891c4769SDhruvaraj Subhashchandran using Path = std::string;
39891c4769SDhruvaraj Subhashchandran using Interface = std::string;
40891c4769SDhruvaraj Subhashchandran using Interfaces = std::vector<Interface>;
41891c4769SDhruvaraj Subhashchandran using MapperResponseType = std::map<Path, std::map<Service, Interfaces>>;
42891c4769SDhruvaraj Subhashchandran 
433c6f29a0SDhruvaraj Subhashchandran using MethodErr  =
443c6f29a0SDhruvaraj Subhashchandran     sdbusplus::xyz::openbmc_project::Led::Mapper::Error::MethodError;
453c6f29a0SDhruvaraj Subhashchandran using ObjectNotFoundErr =
463c6f29a0SDhruvaraj Subhashchandran     sdbusplus::xyz::openbmc_project::Led::Mapper::Error::ObjectNotFoundError;
473c6f29a0SDhruvaraj Subhashchandran using InventoryPathErr =
483c6f29a0SDhruvaraj Subhashchandran     sdbusplus::xyz::openbmc_project::
493c6f29a0SDhruvaraj Subhashchandran     Led::Fru::Monitor::Error::InventoryPathError;
503c6f29a0SDhruvaraj Subhashchandran 
513c6f29a0SDhruvaraj Subhashchandran std::string getService(sdbusplus::bus::bus& bus,
523c6f29a0SDhruvaraj Subhashchandran                        const std::string& path)
533c6f29a0SDhruvaraj Subhashchandran {
543c6f29a0SDhruvaraj Subhashchandran     auto mapper = bus.new_method_call(MAPPER_BUSNAME,
553c6f29a0SDhruvaraj Subhashchandran                                       MAPPER_OBJ_PATH,
563c6f29a0SDhruvaraj Subhashchandran                                       MAPPER_IFACE, "GetObject");
573c6f29a0SDhruvaraj Subhashchandran     mapper.append(path.c_str(), std::vector<std::string>({OBJMGR_IFACE}));
583c6f29a0SDhruvaraj Subhashchandran     auto mapperResponseMsg = bus.call(mapper);
593c6f29a0SDhruvaraj Subhashchandran     if (mapperResponseMsg.is_method_error())
603c6f29a0SDhruvaraj Subhashchandran     {
613c6f29a0SDhruvaraj Subhashchandran         using namespace xyz::openbmc_project::Led::Mapper;
623c6f29a0SDhruvaraj Subhashchandran         elog<MethodErr>(
633c6f29a0SDhruvaraj Subhashchandran             MethodError::METHOD_NAME("GetObject"),
643c6f29a0SDhruvaraj Subhashchandran             MethodError::PATH(path.c_str()),
653c6f29a0SDhruvaraj Subhashchandran             MethodError::INTERFACE(
663c6f29a0SDhruvaraj Subhashchandran                 OBJMGR_IFACE));
673c6f29a0SDhruvaraj Subhashchandran     }
683c6f29a0SDhruvaraj Subhashchandran 
693c6f29a0SDhruvaraj Subhashchandran     std::map<std::string, std::vector<std::string>> mapperResponse;
70151122aaSWilliam A. Kennington III     try
71151122aaSWilliam A. Kennington III     {
723c6f29a0SDhruvaraj Subhashchandran         mapperResponseMsg.read(mapperResponse);
73151122aaSWilliam A. Kennington III     }
74151122aaSWilliam A. Kennington III     catch (const sdbusplus::exception::SdBusError& e)
75151122aaSWilliam A. Kennington III     {
76151122aaSWilliam A. Kennington III         log<level::ERR>("Failed to parse getService mapper response",
77151122aaSWilliam A. Kennington III                         entry("ERROR=%s", e.what()),
78151122aaSWilliam A. Kennington III                         entry("REPLY_SIG=%s", mapperResponseMsg.get_signature()));
79151122aaSWilliam A. Kennington III         using namespace xyz::openbmc_project::Led::Mapper;
80151122aaSWilliam A. Kennington III         elog<ObjectNotFoundErr>(
81151122aaSWilliam A. Kennington III             ObjectNotFoundError::METHOD_NAME("GetObject"),
82151122aaSWilliam A. Kennington III             ObjectNotFoundError::PATH(path.c_str()),
83151122aaSWilliam A. Kennington III             ObjectNotFoundError::INTERFACE(
84151122aaSWilliam A. Kennington III                 OBJMGR_IFACE));
85151122aaSWilliam A. Kennington III     }
863c6f29a0SDhruvaraj Subhashchandran     if (mapperResponse.empty())
873c6f29a0SDhruvaraj Subhashchandran     {
883c6f29a0SDhruvaraj Subhashchandran         using namespace xyz::openbmc_project::Led::Mapper;
893c6f29a0SDhruvaraj Subhashchandran         elog<ObjectNotFoundErr>(
903c6f29a0SDhruvaraj Subhashchandran             ObjectNotFoundError::METHOD_NAME("GetObject"),
913c6f29a0SDhruvaraj Subhashchandran             ObjectNotFoundError::PATH(path.c_str()),
923c6f29a0SDhruvaraj Subhashchandran             ObjectNotFoundError::INTERFACE(
933c6f29a0SDhruvaraj Subhashchandran                 OBJMGR_IFACE));
943c6f29a0SDhruvaraj Subhashchandran     }
953c6f29a0SDhruvaraj Subhashchandran 
963c6f29a0SDhruvaraj Subhashchandran     return mapperResponse.cbegin()->first;
973c6f29a0SDhruvaraj Subhashchandran }
983c6f29a0SDhruvaraj Subhashchandran 
9959b86cd7SDhruvaraj Subhashchandran void action(sdbusplus::bus::bus& bus,
1003c6f29a0SDhruvaraj Subhashchandran             const std::string& path,
10159b86cd7SDhruvaraj Subhashchandran             bool assert)
10259b86cd7SDhruvaraj Subhashchandran {
1033c6f29a0SDhruvaraj Subhashchandran     std::string service;
1043c6f29a0SDhruvaraj Subhashchandran     try
1053c6f29a0SDhruvaraj Subhashchandran     {
1063c6f29a0SDhruvaraj Subhashchandran         service = getService(bus, LED_GROUPS);
1073c6f29a0SDhruvaraj Subhashchandran     }
1083c6f29a0SDhruvaraj Subhashchandran     catch (MethodErr& e)
1093c6f29a0SDhruvaraj Subhashchandran     {
1103c6f29a0SDhruvaraj Subhashchandran         commit<MethodErr>();
1113c6f29a0SDhruvaraj Subhashchandran         return;
1123c6f29a0SDhruvaraj Subhashchandran     }
1133c6f29a0SDhruvaraj Subhashchandran     catch (ObjectNotFoundErr& e)
1143c6f29a0SDhruvaraj Subhashchandran     {
1153c6f29a0SDhruvaraj Subhashchandran         commit<ObjectNotFoundErr>();
1163c6f29a0SDhruvaraj Subhashchandran         return;
1173c6f29a0SDhruvaraj Subhashchandran     }
1183c6f29a0SDhruvaraj Subhashchandran 
1193c6f29a0SDhruvaraj Subhashchandran     auto pos = path.rfind("/");
1203c6f29a0SDhruvaraj Subhashchandran     if (pos == std::string::npos)
1213c6f29a0SDhruvaraj Subhashchandran     {
1223c6f29a0SDhruvaraj Subhashchandran         using namespace xyz::openbmc_project::Led::Fru::Monitor;
1233c6f29a0SDhruvaraj Subhashchandran         report<InventoryPathErr>(
1243c6f29a0SDhruvaraj Subhashchandran             InventoryPathError::PATH(
1253c6f29a0SDhruvaraj Subhashchandran                 path.c_str()));
1263c6f29a0SDhruvaraj Subhashchandran         return;
1273c6f29a0SDhruvaraj Subhashchandran     }
1283c6f29a0SDhruvaraj Subhashchandran     auto unit = path.substr(pos + 1);
1293c6f29a0SDhruvaraj Subhashchandran 
1303c6f29a0SDhruvaraj Subhashchandran     std::string ledPath = LED_GROUPS +
1313c6f29a0SDhruvaraj Subhashchandran                           unit + '_' + LED_FAULT;
1323c6f29a0SDhruvaraj Subhashchandran 
1333c6f29a0SDhruvaraj Subhashchandran     auto method =  bus.new_method_call(service.c_str(),
1343c6f29a0SDhruvaraj Subhashchandran                                        ledPath.c_str(),
1353c6f29a0SDhruvaraj Subhashchandran                                        "org.freedesktop.DBus.Properties",
1363c6f29a0SDhruvaraj Subhashchandran                                        "Set");
1373c6f29a0SDhruvaraj Subhashchandran     method.append("xyz.openbmc_project.Led.Group");
1383c6f29a0SDhruvaraj Subhashchandran     method.append("Asserted");
1393c6f29a0SDhruvaraj Subhashchandran 
1403c6f29a0SDhruvaraj Subhashchandran     method.append(sdbusplus::message::variant<bool>(assert));
141*08d613e7SAdriana Kobylak 
142*08d613e7SAdriana Kobylak     try
143*08d613e7SAdriana Kobylak     {
1443c6f29a0SDhruvaraj Subhashchandran         bus.call_noreply(method);
145*08d613e7SAdriana Kobylak     }
146*08d613e7SAdriana Kobylak     catch (const sdbusplus::exception::SdBusError& e)
147*08d613e7SAdriana Kobylak     {
148*08d613e7SAdriana Kobylak         // Log an info message, system may not have all the LED Groups defined
149*08d613e7SAdriana Kobylak         log<level::INFO>("Failed to Assert LED Group",
150*08d613e7SAdriana Kobylak                          entry("ERROR=%s", e.what()));
151*08d613e7SAdriana Kobylak     }
1523c6f29a0SDhruvaraj Subhashchandran 
15359b86cd7SDhruvaraj Subhashchandran     return;
15459b86cd7SDhruvaraj Subhashchandran }
15559b86cd7SDhruvaraj Subhashchandran 
1563eedbe44SPatrick Williams void Add::created(sdbusplus::message::message& msg)
15759b86cd7SDhruvaraj Subhashchandran {
1583eedbe44SPatrick Williams     auto bus = msg.get_bus();
1593c6f29a0SDhruvaraj Subhashchandran 
160b2f253b7SMatt Spinler     sdbusplus::message::object_path objectPath;
161b2f253b7SMatt Spinler     InterfaceMap interfaces;
162151122aaSWilliam A. Kennington III     try
163151122aaSWilliam A. Kennington III     {
164b2f253b7SMatt Spinler         msg.read(objectPath, interfaces);
165151122aaSWilliam A. Kennington III     }
166151122aaSWilliam A. Kennington III     catch (const sdbusplus::exception::SdBusError& e)
167151122aaSWilliam A. Kennington III     {
168151122aaSWilliam A. Kennington III         log<level::ERR>("Failed to parse created message",
169151122aaSWilliam A. Kennington III                         entry("ERROR=%s", e.what()),
170151122aaSWilliam A. Kennington III                         entry("REPLY_SIG=%s", msg.get_signature()));
171151122aaSWilliam A. Kennington III         return;
172151122aaSWilliam A. Kennington III     }
1733c6f29a0SDhruvaraj Subhashchandran 
174b2f253b7SMatt Spinler     std::size_t found = objectPath.str.find(ELOG_ENTRY);
1753c6f29a0SDhruvaraj Subhashchandran     if (found == std::string::npos)
1763c6f29a0SDhruvaraj Subhashchandran     {
1773c6f29a0SDhruvaraj Subhashchandran         //Not a new error entry skip
1783eedbe44SPatrick Williams         return;
1793c6f29a0SDhruvaraj Subhashchandran     }
180b2f253b7SMatt Spinler     auto iter = interfaces.find("org.openbmc.Associations");
181b2f253b7SMatt Spinler     if (iter == interfaces.end())
1823c6f29a0SDhruvaraj Subhashchandran     {
1833eedbe44SPatrick Williams         return;
1843c6f29a0SDhruvaraj Subhashchandran     }
1853c6f29a0SDhruvaraj Subhashchandran 
1863d2b0d62SMatt Spinler     //Nothing else shows when a specific error log
1873d2b0d62SMatt Spinler     //has been created. Do it here.
188b2f253b7SMatt Spinler     std::string message{objectPath.str + " created"};
1893d2b0d62SMatt Spinler     log<level::INFO>(message.c_str());
1903d2b0d62SMatt Spinler 
191aebfde81SDhruvaraj Subhashchandran     auto attr = iter->second.find("associations");
192aebfde81SDhruvaraj Subhashchandran     if (attr == iter->second.end())
1933c6f29a0SDhruvaraj Subhashchandran     {
1943eedbe44SPatrick Williams         return;
1953c6f29a0SDhruvaraj Subhashchandran     }
1963c6f29a0SDhruvaraj Subhashchandran 
197aebfde81SDhruvaraj Subhashchandran     auto& assocs =
198aebfde81SDhruvaraj Subhashchandran         sdbusplus::message::variant_ns::get<AssociationList>(attr->second);
1993c6f29a0SDhruvaraj Subhashchandran     if (assocs.empty())
2003c6f29a0SDhruvaraj Subhashchandran     {
2013c6f29a0SDhruvaraj Subhashchandran         //No associations skip
2023eedbe44SPatrick Williams         return;
2033c6f29a0SDhruvaraj Subhashchandran     }
2043c6f29a0SDhruvaraj Subhashchandran 
2053c6f29a0SDhruvaraj Subhashchandran     for (const auto& item : assocs)
2063c6f29a0SDhruvaraj Subhashchandran     {
2073c6f29a0SDhruvaraj Subhashchandran         if (std::get<1>(item).compare(CALLOUT_REV_ASSOCIATION) == 0)
2083c6f29a0SDhruvaraj Subhashchandran         {
2093eedbe44SPatrick Williams             removeWatches.emplace_back(
2103c6f29a0SDhruvaraj Subhashchandran                 std::make_unique<Remove>(bus, std::get<2>(item)));
211891c4769SDhruvaraj Subhashchandran             action(bus, std::get<2>(item), true);
2123c6f29a0SDhruvaraj Subhashchandran         }
2133c6f29a0SDhruvaraj Subhashchandran     }
214aebfde81SDhruvaraj Subhashchandran 
2153eedbe44SPatrick Williams     return;
21659b86cd7SDhruvaraj Subhashchandran }
21759b86cd7SDhruvaraj Subhashchandran 
218891c4769SDhruvaraj Subhashchandran void Add::processExistingCallouts(sdbusplus::bus::bus& bus)
219891c4769SDhruvaraj Subhashchandran {
220891c4769SDhruvaraj Subhashchandran     auto depth = 0;
221891c4769SDhruvaraj Subhashchandran     auto mapperCall = bus.new_method_call(MAPPER_BUSNAME,
222891c4769SDhruvaraj Subhashchandran                                           MAPPER_OBJ_PATH,
223891c4769SDhruvaraj Subhashchandran                                           MAPPER_IFACE,
224891c4769SDhruvaraj Subhashchandran                                           "GetSubTree");
225891c4769SDhruvaraj Subhashchandran     mapperCall.append("/");
226891c4769SDhruvaraj Subhashchandran     mapperCall.append(depth);
227891c4769SDhruvaraj Subhashchandran     mapperCall.append(std::vector<Interface>({LOG_IFACE}));
228891c4769SDhruvaraj Subhashchandran 
229891c4769SDhruvaraj Subhashchandran     auto mapperResponseMsg = bus.call(mapperCall);
230891c4769SDhruvaraj Subhashchandran     if (mapperResponseMsg.is_method_error())
231891c4769SDhruvaraj Subhashchandran     {
232891c4769SDhruvaraj Subhashchandran         using namespace xyz::openbmc_project::Led::Mapper;
233891c4769SDhruvaraj Subhashchandran         report<MethodErr>(
234891c4769SDhruvaraj Subhashchandran             MethodError::METHOD_NAME("GetSubTree"),
235891c4769SDhruvaraj Subhashchandran             MethodError::PATH(MAPPER_OBJ_PATH),
236891c4769SDhruvaraj Subhashchandran             MethodError::INTERFACE(
237891c4769SDhruvaraj Subhashchandran                 OBJMGR_IFACE));
238891c4769SDhruvaraj Subhashchandran         return;
239891c4769SDhruvaraj Subhashchandran     }
240891c4769SDhruvaraj Subhashchandran 
241891c4769SDhruvaraj Subhashchandran     MapperResponseType mapperResponse;
242151122aaSWilliam A. Kennington III     try
243151122aaSWilliam A. Kennington III     {
244891c4769SDhruvaraj Subhashchandran         mapperResponseMsg.read(mapperResponse);
245151122aaSWilliam A. Kennington III     }
246151122aaSWilliam A. Kennington III     catch (const sdbusplus::exception::SdBusError& e)
247151122aaSWilliam A. Kennington III     {
248151122aaSWilliam A. Kennington III         log<level::ERR>("Failed to parse existing callouts subtree message",
249151122aaSWilliam A. Kennington III                         entry("ERROR=%s", e.what()),
250151122aaSWilliam A. Kennington III                         entry("REPLY_SIG=%s", mapperResponseMsg.get_signature()));
251151122aaSWilliam A. Kennington III         return;
252151122aaSWilliam A. Kennington III     }
253891c4769SDhruvaraj Subhashchandran     if (mapperResponse.empty())
254891c4769SDhruvaraj Subhashchandran     {
255fc30e0c1SDhruvaraj Subhashchandran         //No errors to process.
256891c4769SDhruvaraj Subhashchandran         return;
257891c4769SDhruvaraj Subhashchandran     }
258891c4769SDhruvaraj Subhashchandran 
259891c4769SDhruvaraj Subhashchandran     for (const auto& elem : mapperResponse)
260891c4769SDhruvaraj Subhashchandran     {
261891c4769SDhruvaraj Subhashchandran         auto method =  bus.new_method_call(elem.second.begin()->first.c_str(),
262891c4769SDhruvaraj Subhashchandran                                            elem.first.c_str(),
263891c4769SDhruvaraj Subhashchandran                                            "org.freedesktop.DBus.Properties",
264891c4769SDhruvaraj Subhashchandran                                            "Get");
265891c4769SDhruvaraj Subhashchandran         method.append("org.openbmc.Associations");
266891c4769SDhruvaraj Subhashchandran         method.append("associations");
267891c4769SDhruvaraj Subhashchandran         auto reply = bus.call(method);
268891c4769SDhruvaraj Subhashchandran         if (reply.is_method_error())
269891c4769SDhruvaraj Subhashchandran         {
270891c4769SDhruvaraj Subhashchandran             //do not stop, continue with next elog
271891c4769SDhruvaraj Subhashchandran             log<level::ERR>("Error in getting associations");
272891c4769SDhruvaraj Subhashchandran             continue;
273891c4769SDhruvaraj Subhashchandran         }
274891c4769SDhruvaraj Subhashchandran 
275891c4769SDhruvaraj Subhashchandran         sdbusplus::message::variant<AssociationList> assoc;
276151122aaSWilliam A. Kennington III         try
277151122aaSWilliam A. Kennington III         {
278891c4769SDhruvaraj Subhashchandran             reply.read(assoc);
279151122aaSWilliam A. Kennington III         }
280151122aaSWilliam A. Kennington III         catch (const sdbusplus::exception::SdBusError& e)
281151122aaSWilliam A. Kennington III         {
282151122aaSWilliam A. Kennington III             log<level::ERR>("Failed to parse existing callouts associations message",
283151122aaSWilliam A. Kennington III                             entry("ERROR=%s", e.what()),
284151122aaSWilliam A. Kennington III                             entry("REPLY_SIG=%s", reply.get_signature()));
285151122aaSWilliam A. Kennington III             continue;
286151122aaSWilliam A. Kennington III         }
287891c4769SDhruvaraj Subhashchandran         auto& assocs = assoc.get<AssociationList>();
288891c4769SDhruvaraj Subhashchandran         if (assocs.empty())
289891c4769SDhruvaraj Subhashchandran         {
290891c4769SDhruvaraj Subhashchandran             //no associations, skip
291891c4769SDhruvaraj Subhashchandran             continue;
292891c4769SDhruvaraj Subhashchandran         }
293891c4769SDhruvaraj Subhashchandran 
294891c4769SDhruvaraj Subhashchandran         for (const auto& item : assocs)
295891c4769SDhruvaraj Subhashchandran         {
296891c4769SDhruvaraj Subhashchandran             if (std::get<1>(item).compare(CALLOUT_REV_ASSOCIATION) == 0)
297891c4769SDhruvaraj Subhashchandran             {
298891c4769SDhruvaraj Subhashchandran                 removeWatches.emplace_back(
299891c4769SDhruvaraj Subhashchandran                     std::make_unique<Remove>(bus, std::get<2>(item)));
300891c4769SDhruvaraj Subhashchandran                 action(bus, std::get<2>(item), true);
301891c4769SDhruvaraj Subhashchandran             }
302891c4769SDhruvaraj Subhashchandran         }
303891c4769SDhruvaraj Subhashchandran     }
304891c4769SDhruvaraj Subhashchandran }
305891c4769SDhruvaraj Subhashchandran 
3063eedbe44SPatrick Williams void Remove::removed(sdbusplus::message::message& msg)
30759b86cd7SDhruvaraj Subhashchandran {
3083eedbe44SPatrick Williams     auto bus = msg.get_bus();
3093c6f29a0SDhruvaraj Subhashchandran 
3103eedbe44SPatrick Williams     action(bus, inventoryPath, false);
3113eedbe44SPatrick Williams     return;
31259b86cd7SDhruvaraj Subhashchandran }
31359b86cd7SDhruvaraj Subhashchandran 
31459b86cd7SDhruvaraj Subhashchandran }//namespace monitor
31559b86cd7SDhruvaraj Subhashchandran }//namespace fault
31659b86cd7SDhruvaraj Subhashchandran }//namespace fru
31759b86cd7SDhruvaraj Subhashchandran }//namespace led
31859b86cd7SDhruvaraj Subhashchandran }//namespace phosphor
319