xref: /openbmc/telemetry/src/trigger_manager.cpp (revision a4e67616)
176833cb5SWludzik, Jozef #include "trigger_manager.hpp"
276833cb5SWludzik, Jozef 
376833cb5SWludzik, Jozef TriggerManager::TriggerManager(
476833cb5SWludzik, Jozef     std::unique_ptr<interfaces::TriggerFactory> triggerFactoryIn,
5*a4e67616SCezary Zwolak     std::unique_ptr<interfaces::JsonStorage> triggerStorageIn,
676833cb5SWludzik, Jozef     const std::shared_ptr<sdbusplus::asio::object_server>& objServer) :
7*a4e67616SCezary Zwolak     triggerFactory(std::move(triggerFactoryIn)),
8*a4e67616SCezary Zwolak     triggerStorage(std::move(triggerStorageIn))
976833cb5SWludzik, Jozef {
1076833cb5SWludzik, Jozef     managerIface = objServer->add_unique_interface(
1176833cb5SWludzik, Jozef         triggerManagerPath, triggerManagerIfaceName, [this](auto& iface) {
1276833cb5SWludzik, Jozef             iface.register_method(
1376833cb5SWludzik, Jozef                 "AddTrigger",
1476833cb5SWludzik, Jozef                 [this](
151477fe6aSWludzik, Jozef                     boost::asio::yield_context& yield, const std::string& name,
161477fe6aSWludzik, Jozef                     bool isDiscrete, bool logToJournal, bool logToRedfish,
171477fe6aSWludzik, Jozef                     bool updateReport,
1876833cb5SWludzik, Jozef                     const std::vector<std::pair<sdbusplus::message::object_path,
1976833cb5SWludzik, Jozef                                                 std::string>>& sensors,
2076833cb5SWludzik, Jozef                     const std::vector<std::string>& reportNames,
2176833cb5SWludzik, Jozef                     const TriggerThresholdParams& thresholds) {
2276833cb5SWludzik, Jozef                     if (triggers.size() >= maxTriggers)
2376833cb5SWludzik, Jozef                     {
2476833cb5SWludzik, Jozef                         throw sdbusplus::exception::SdBusError(
2576833cb5SWludzik, Jozef                             static_cast<int>(std::errc::too_many_files_open),
2676833cb5SWludzik, Jozef                             "Reached maximal trigger count");
2776833cb5SWludzik, Jozef                     }
2876833cb5SWludzik, Jozef 
2976833cb5SWludzik, Jozef                     for (const auto& trigger : triggers)
3076833cb5SWludzik, Jozef                     {
3176833cb5SWludzik, Jozef                         if (trigger->getName() == name)
3276833cb5SWludzik, Jozef                         {
3376833cb5SWludzik, Jozef                             throw sdbusplus::exception::SdBusError(
3476833cb5SWludzik, Jozef                                 static_cast<int>(std::errc::file_exists),
3576833cb5SWludzik, Jozef                                 "Duplicate trigger");
3676833cb5SWludzik, Jozef                         }
3776833cb5SWludzik, Jozef                     }
3876833cb5SWludzik, Jozef 
3976833cb5SWludzik, Jozef                     triggers.emplace_back(triggerFactory->make(
401477fe6aSWludzik, Jozef                         yield, name, isDiscrete, logToJournal, logToRedfish,
41*a4e67616SCezary Zwolak                         updateReport, sensors, reportNames, thresholds, *this,
42*a4e67616SCezary Zwolak                         *triggerStorage));
4376833cb5SWludzik, Jozef                     return triggers.back()->getPath();
4476833cb5SWludzik, Jozef                 });
4576833cb5SWludzik, Jozef         });
4676833cb5SWludzik, Jozef }
4776833cb5SWludzik, Jozef 
4876833cb5SWludzik, Jozef void TriggerManager::removeTrigger(const interfaces::Trigger* trigger)
4976833cb5SWludzik, Jozef {
5076833cb5SWludzik, Jozef     triggers.erase(
5176833cb5SWludzik, Jozef         std::remove_if(triggers.begin(), triggers.end(),
5276833cb5SWludzik, Jozef                        [trigger](const auto& x) { return trigger == x.get(); }),
5376833cb5SWludzik, Jozef         triggers.end());
5476833cb5SWludzik, Jozef }
55