xref: /openbmc/telemetry/src/trigger_manager.cpp (revision 76833cb5)
1*76833cb5SWludzik, Jozef #include "trigger_manager.hpp"
2*76833cb5SWludzik, Jozef 
3*76833cb5SWludzik, Jozef TriggerManager::TriggerManager(
4*76833cb5SWludzik, Jozef     std::unique_ptr<interfaces::TriggerFactory> triggerFactoryIn,
5*76833cb5SWludzik, Jozef     const std::shared_ptr<sdbusplus::asio::object_server>& objServer) :
6*76833cb5SWludzik, Jozef     triggerFactory(std::move(triggerFactoryIn))
7*76833cb5SWludzik, Jozef {
8*76833cb5SWludzik, Jozef     managerIface = objServer->add_unique_interface(
9*76833cb5SWludzik, Jozef         triggerManagerPath, triggerManagerIfaceName, [this](auto& iface) {
10*76833cb5SWludzik, Jozef             iface.register_method(
11*76833cb5SWludzik, Jozef                 "AddTrigger",
12*76833cb5SWludzik, Jozef                 [this](
13*76833cb5SWludzik, Jozef                     const std::string& name, bool isDiscrete, bool logToJournal,
14*76833cb5SWludzik, Jozef                     bool logToRedfish, bool updateReport,
15*76833cb5SWludzik, Jozef                     const std::vector<std::pair<sdbusplus::message::object_path,
16*76833cb5SWludzik, Jozef                                                 std::string>>& sensors,
17*76833cb5SWludzik, Jozef                     const std::vector<std::string>& reportNames,
18*76833cb5SWludzik, Jozef                     const TriggerThresholdParams& thresholds) {
19*76833cb5SWludzik, Jozef                     if (triggers.size() >= maxTriggers)
20*76833cb5SWludzik, Jozef                     {
21*76833cb5SWludzik, Jozef                         throw sdbusplus::exception::SdBusError(
22*76833cb5SWludzik, Jozef                             static_cast<int>(std::errc::too_many_files_open),
23*76833cb5SWludzik, Jozef                             "Reached maximal trigger count");
24*76833cb5SWludzik, Jozef                     }
25*76833cb5SWludzik, Jozef 
26*76833cb5SWludzik, Jozef                     for (const auto& trigger : triggers)
27*76833cb5SWludzik, Jozef                     {
28*76833cb5SWludzik, Jozef                         if (trigger->getName() == name)
29*76833cb5SWludzik, Jozef                         {
30*76833cb5SWludzik, Jozef                             throw sdbusplus::exception::SdBusError(
31*76833cb5SWludzik, Jozef                                 static_cast<int>(std::errc::file_exists),
32*76833cb5SWludzik, Jozef                                 "Duplicate trigger");
33*76833cb5SWludzik, Jozef                         }
34*76833cb5SWludzik, Jozef                     }
35*76833cb5SWludzik, Jozef 
36*76833cb5SWludzik, Jozef                     triggers.emplace_back(triggerFactory->make(
37*76833cb5SWludzik, Jozef                         name, isDiscrete, logToJournal, logToRedfish,
38*76833cb5SWludzik, Jozef                         updateReport, sensors, reportNames, thresholds, *this));
39*76833cb5SWludzik, Jozef                     return triggers.back()->getPath();
40*76833cb5SWludzik, Jozef                 });
41*76833cb5SWludzik, Jozef         });
42*76833cb5SWludzik, Jozef }
43*76833cb5SWludzik, Jozef 
44*76833cb5SWludzik, Jozef void TriggerManager::removeTrigger(const interfaces::Trigger* trigger)
45*76833cb5SWludzik, Jozef {
46*76833cb5SWludzik, Jozef     triggers.erase(
47*76833cb5SWludzik, Jozef         std::remove_if(triggers.begin(), triggers.end(),
48*76833cb5SWludzik, Jozef                        [trigger](const auto& x) { return trigger == x.get(); }),
49*76833cb5SWludzik, Jozef         triggers.end());
50*76833cb5SWludzik, Jozef }
51