xref: /openbmc/telemetry/src/trigger_manager.cpp (revision 1477fe6a)
176833cb5SWludzik, Jozef #include "trigger_manager.hpp"
276833cb5SWludzik, Jozef 
376833cb5SWludzik, Jozef TriggerManager::TriggerManager(
476833cb5SWludzik, Jozef     std::unique_ptr<interfaces::TriggerFactory> triggerFactoryIn,
576833cb5SWludzik, Jozef     const std::shared_ptr<sdbusplus::asio::object_server>& objServer) :
676833cb5SWludzik, Jozef     triggerFactory(std::move(triggerFactoryIn))
776833cb5SWludzik, Jozef {
876833cb5SWludzik, Jozef     managerIface = objServer->add_unique_interface(
976833cb5SWludzik, Jozef         triggerManagerPath, triggerManagerIfaceName, [this](auto& iface) {
1076833cb5SWludzik, Jozef             iface.register_method(
1176833cb5SWludzik, Jozef                 "AddTrigger",
1276833cb5SWludzik, Jozef                 [this](
13*1477fe6aSWludzik, Jozef                     boost::asio::yield_context& yield, const std::string& name,
14*1477fe6aSWludzik, Jozef                     bool isDiscrete, bool logToJournal, bool logToRedfish,
15*1477fe6aSWludzik, Jozef                     bool updateReport,
1676833cb5SWludzik, Jozef                     const std::vector<std::pair<sdbusplus::message::object_path,
1776833cb5SWludzik, Jozef                                                 std::string>>& sensors,
1876833cb5SWludzik, Jozef                     const std::vector<std::string>& reportNames,
1976833cb5SWludzik, Jozef                     const TriggerThresholdParams& thresholds) {
20*1477fe6aSWludzik, Jozef                     if (isDiscrete)
21*1477fe6aSWludzik, Jozef                     {
22*1477fe6aSWludzik, Jozef                         throw sdbusplus::exception::SdBusError(
23*1477fe6aSWludzik, Jozef                             static_cast<int>(std::errc::not_supported),
24*1477fe6aSWludzik, Jozef                             "Only numeric threshold is supported");
25*1477fe6aSWludzik, Jozef                     }
26*1477fe6aSWludzik, Jozef 
2776833cb5SWludzik, Jozef                     if (triggers.size() >= maxTriggers)
2876833cb5SWludzik, Jozef                     {
2976833cb5SWludzik, Jozef                         throw sdbusplus::exception::SdBusError(
3076833cb5SWludzik, Jozef                             static_cast<int>(std::errc::too_many_files_open),
3176833cb5SWludzik, Jozef                             "Reached maximal trigger count");
3276833cb5SWludzik, Jozef                     }
3376833cb5SWludzik, Jozef 
3476833cb5SWludzik, Jozef                     for (const auto& trigger : triggers)
3576833cb5SWludzik, Jozef                     {
3676833cb5SWludzik, Jozef                         if (trigger->getName() == name)
3776833cb5SWludzik, Jozef                         {
3876833cb5SWludzik, Jozef                             throw sdbusplus::exception::SdBusError(
3976833cb5SWludzik, Jozef                                 static_cast<int>(std::errc::file_exists),
4076833cb5SWludzik, Jozef                                 "Duplicate trigger");
4176833cb5SWludzik, Jozef                         }
4276833cb5SWludzik, Jozef                     }
4376833cb5SWludzik, Jozef 
4476833cb5SWludzik, Jozef                     triggers.emplace_back(triggerFactory->make(
45*1477fe6aSWludzik, Jozef                         yield, name, isDiscrete, logToJournal, logToRedfish,
4676833cb5SWludzik, Jozef                         updateReport, sensors, reportNames, thresholds, *this));
4776833cb5SWludzik, Jozef                     return triggers.back()->getPath();
4876833cb5SWludzik, Jozef                 });
4976833cb5SWludzik, Jozef         });
5076833cb5SWludzik, Jozef }
5176833cb5SWludzik, Jozef 
5276833cb5SWludzik, Jozef void TriggerManager::removeTrigger(const interfaces::Trigger* trigger)
5376833cb5SWludzik, Jozef {
5476833cb5SWludzik, Jozef     triggers.erase(
5576833cb5SWludzik, Jozef         std::remove_if(triggers.begin(), triggers.end(),
5676833cb5SWludzik, Jozef                        [trigger](const auto& x) { return trigger == x.get(); }),
5776833cb5SWludzik, Jozef         triggers.end());
5876833cb5SWludzik, Jozef }
59