xref: /openbmc/telemetry/src/trigger_factory.cpp (revision d960e1f3)
176833cb5SWludzik, Jozef #include "trigger_factory.hpp"
276833cb5SWludzik, Jozef 
31477fe6aSWludzik, Jozef #include "numeric_threshold.hpp"
41477fe6aSWludzik, Jozef #include "sensor.hpp"
576833cb5SWludzik, Jozef #include "trigger.hpp"
6*d960e1f3SWludzik, Jozef #include "trigger_actions.hpp"
71477fe6aSWludzik, Jozef #include "utils/dbus_mapper.hpp"
876833cb5SWludzik, Jozef 
976833cb5SWludzik, Jozef TriggerFactory::TriggerFactory(
1076833cb5SWludzik, Jozef     std::shared_ptr<sdbusplus::asio::connection> bus,
111477fe6aSWludzik, Jozef     std::shared_ptr<sdbusplus::asio::object_server> objServer,
12*d960e1f3SWludzik, Jozef     SensorCache& sensorCache, interfaces::ReportManager& reportManager) :
1376833cb5SWludzik, Jozef     bus(std::move(bus)),
14*d960e1f3SWludzik, Jozef     objServer(std::move(objServer)), sensorCache(sensorCache),
15*d960e1f3SWludzik, Jozef     reportManager(reportManager)
1676833cb5SWludzik, Jozef {}
1776833cb5SWludzik, Jozef 
1876833cb5SWludzik, Jozef std::unique_ptr<interfaces::Trigger> TriggerFactory::make(
191477fe6aSWludzik, Jozef     boost::asio::yield_context& yield, const std::string& name, bool isDiscrete,
201477fe6aSWludzik, Jozef     bool logToJournal, bool logToRedfish, bool updateReport,
2176833cb5SWludzik, Jozef     const std::vector<std::pair<sdbusplus::message::object_path, std::string>>&
221477fe6aSWludzik, Jozef         sensorPaths,
2376833cb5SWludzik, Jozef     const std::vector<std::string>& reportNames,
2476833cb5SWludzik, Jozef     const TriggerThresholdParams& thresholdParams,
251477fe6aSWludzik, Jozef     interfaces::TriggerManager& triggerManager) const
2676833cb5SWludzik, Jozef {
271477fe6aSWludzik, Jozef     if (isDiscrete)
281477fe6aSWludzik, Jozef     {
291477fe6aSWludzik, Jozef         throw std::runtime_error("Not implemented!");
301477fe6aSWludzik, Jozef     }
311477fe6aSWludzik, Jozef 
321477fe6aSWludzik, Jozef     auto [sensors, sensorNames] = getSensors(yield, sensorPaths);
331477fe6aSWludzik, Jozef     std::vector<std::shared_ptr<interfaces::Threshold>> thresholds;
341477fe6aSWludzik, Jozef 
351477fe6aSWludzik, Jozef     const auto& params =
361477fe6aSWludzik, Jozef         std::get<std::vector<numeric::ThresholdParam>>(thresholdParams);
371477fe6aSWludzik, Jozef     for (const auto& [type, dwellTime, direction, value] : params)
381477fe6aSWludzik, Jozef     {
391477fe6aSWludzik, Jozef         std::vector<std::unique_ptr<interfaces::TriggerAction>> actions;
40*d960e1f3SWludzik, Jozef         if (logToJournal)
41*d960e1f3SWludzik, Jozef         {
42*d960e1f3SWludzik, Jozef             actions.emplace_back(std::make_unique<action::LogToJournal>(
43*d960e1f3SWludzik, Jozef                 numeric::toType(type), value));
44*d960e1f3SWludzik, Jozef         }
45*d960e1f3SWludzik, Jozef         if (logToRedfish)
46*d960e1f3SWludzik, Jozef         {
47*d960e1f3SWludzik, Jozef             actions.emplace_back(std::make_unique<action::LogToRedfish>(
48*d960e1f3SWludzik, Jozef                 numeric::toType(type), value));
49*d960e1f3SWludzik, Jozef         }
50*d960e1f3SWludzik, Jozef         if (updateReport)
51*d960e1f3SWludzik, Jozef         {
52*d960e1f3SWludzik, Jozef             actions.emplace_back(std::make_unique<action::UpdateReport>(
53*d960e1f3SWludzik, Jozef                 reportManager, reportNames));
54*d960e1f3SWludzik, Jozef         }
551477fe6aSWludzik, Jozef 
561477fe6aSWludzik, Jozef         thresholds.emplace_back(std::make_shared<NumericThreshold>(
571477fe6aSWludzik, Jozef             bus->get_io_context(), sensors, sensorNames, std::move(actions),
581477fe6aSWludzik, Jozef             std::chrono::milliseconds(dwellTime),
59*d960e1f3SWludzik, Jozef             numeric::toDirection(direction), value));
601477fe6aSWludzik, Jozef     }
611477fe6aSWludzik, Jozef 
621477fe6aSWludzik, Jozef     return std::make_unique<Trigger>(
631477fe6aSWludzik, Jozef         bus->get_io_context(), objServer, name, isDiscrete, logToJournal,
641477fe6aSWludzik, Jozef         logToRedfish, updateReport, sensorPaths, reportNames, thresholdParams,
651477fe6aSWludzik, Jozef         std::move(thresholds), triggerManager);
661477fe6aSWludzik, Jozef }
671477fe6aSWludzik, Jozef 
681477fe6aSWludzik, Jozef std::pair<std::vector<std::shared_ptr<interfaces::Sensor>>,
691477fe6aSWludzik, Jozef           std::vector<std::string>>
701477fe6aSWludzik, Jozef     TriggerFactory::getSensors(
711477fe6aSWludzik, Jozef         boost::asio::yield_context& yield,
721477fe6aSWludzik, Jozef         const std::vector<std::pair<sdbusplus::message::object_path,
731477fe6aSWludzik, Jozef                                     std::string>>& sensorPaths) const
741477fe6aSWludzik, Jozef {
751477fe6aSWludzik, Jozef     auto tree = utils::getSubTreeSensors(yield, bus);
761477fe6aSWludzik, Jozef 
771477fe6aSWludzik, Jozef     std::vector<std::shared_ptr<interfaces::Sensor>> sensors;
781477fe6aSWludzik, Jozef     std::vector<std::string> sensorNames;
791477fe6aSWludzik, Jozef     for (const auto& [sensorPath, metadata] : sensorPaths)
801477fe6aSWludzik, Jozef     {
811477fe6aSWludzik, Jozef         auto found = std::find_if(
821477fe6aSWludzik, Jozef             tree.begin(), tree.end(),
831477fe6aSWludzik, Jozef             [&sensorPath](const auto& x) { return x.first == sensorPath; });
841477fe6aSWludzik, Jozef         if (found == tree.end())
851477fe6aSWludzik, Jozef         {
861477fe6aSWludzik, Jozef             throw std::runtime_error("Not found");
871477fe6aSWludzik, Jozef         }
881477fe6aSWludzik, Jozef 
891477fe6aSWludzik, Jozef         const auto& service = found->second[0].first;
901477fe6aSWludzik, Jozef         const auto& path = found->first;
911477fe6aSWludzik, Jozef         sensors.emplace_back(sensorCache.makeSensor<Sensor>(
921477fe6aSWludzik, Jozef             service, path, bus->get_io_context(), bus));
931477fe6aSWludzik, Jozef         if (metadata.empty())
941477fe6aSWludzik, Jozef         {
951477fe6aSWludzik, Jozef             sensorNames.emplace_back(sensorPath);
961477fe6aSWludzik, Jozef         }
971477fe6aSWludzik, Jozef         else
981477fe6aSWludzik, Jozef         {
991477fe6aSWludzik, Jozef             sensorNames.emplace_back(metadata);
1001477fe6aSWludzik, Jozef         }
1011477fe6aSWludzik, Jozef     }
1021477fe6aSWludzik, Jozef     return {sensors, sensorNames};
10376833cb5SWludzik, Jozef }
104