| #include "trigger_factory.hpp" |
| |
| #include "discrete_threshold.hpp" |
| #include "numeric_threshold.hpp" |
| #include "on_change_threshold.hpp" |
| #include "sensor.hpp" |
| #include "trigger.hpp" |
| #include "trigger_actions.hpp" |
| #include "utils/dbus_mapper.hpp" |
| |
| TriggerFactory::TriggerFactory( |
| std::shared_ptr<sdbusplus::asio::connection> bus, |
| std::shared_ptr<sdbusplus::asio::object_server> objServer, |
| SensorCache& sensorCache, interfaces::ReportManager& reportManager) : |
| bus(std::move(bus)), |
| objServer(std::move(objServer)), sensorCache(sensorCache), |
| reportManager(reportManager) |
| {} |
| |
| std::unique_ptr<interfaces::Trigger> |
| TriggerFactory::make(boost::asio::yield_context& yield, |
| const std::string& name, bool isDiscrete, |
| bool logToJournal, bool logToRedfish, |
| bool updateReport, const TriggerSensors& sensorPaths, |
| const std::vector<std::string>& reportNames, |
| const TriggerThresholdParams& thresholdParams, |
| interfaces::TriggerManager& triggerManager, |
| interfaces::JsonStorage& triggerStorage) const |
| { |
| auto [sensors, sensorNames] = getSensors(yield, sensorPaths); |
| std::vector<std::shared_ptr<interfaces::Threshold>> thresholds; |
| |
| if (isDiscrete) |
| { |
| const auto& params = |
| std::get<std::vector<discrete::ThresholdParam>>(thresholdParams); |
| for (const auto& [thresholdName, severityStr, dwellTime, |
| thresholdValue] : params) |
| { |
| discrete::Severity severity = |
| discrete::stringToSeverity(severityStr); |
| std::vector<std::unique_ptr<interfaces::TriggerAction>> actions; |
| if (logToJournal) |
| { |
| actions.emplace_back( |
| std::make_unique<action::discrete::LogToJournal>(severity)); |
| } |
| if (logToRedfish) |
| { |
| actions.emplace_back( |
| std::make_unique<action::discrete::LogToRedfish>(severity)); |
| } |
| if (updateReport) |
| { |
| actions.emplace_back(std::make_unique<action::UpdateReport>( |
| reportManager, reportNames)); |
| } |
| |
| thresholds.emplace_back(std::make_shared<DiscreteThreshold>( |
| bus->get_io_context(), sensors, sensorNames, std::move(actions), |
| std::chrono::milliseconds(dwellTime), thresholdValue, |
| thresholdName)); |
| } |
| if (params.empty()) |
| { |
| std::vector<std::unique_ptr<interfaces::TriggerAction>> actions; |
| if (logToJournal) |
| { |
| actions.emplace_back( |
| std::make_unique< |
| action::discrete::onChange::LogToJournal>()); |
| } |
| if (logToRedfish) |
| { |
| actions.emplace_back( |
| std::make_unique< |
| action::discrete::onChange::LogToRedfish>()); |
| } |
| if (updateReport) |
| { |
| actions.emplace_back(std::make_unique<action::UpdateReport>( |
| reportManager, reportNames)); |
| } |
| |
| thresholds.emplace_back(std::make_shared<OnChangeThreshold>( |
| sensors, sensorNames, std::move(actions))); |
| } |
| } |
| else |
| { |
| const auto& params = |
| std::get<std::vector<numeric::ThresholdParam>>(thresholdParams); |
| for (const auto& [typeStr, dwellTime, directionStr, value] : params) |
| { |
| numeric::Type type = numeric::stringToType(typeStr); |
| std::vector<std::unique_ptr<interfaces::TriggerAction>> actions; |
| if (logToJournal) |
| { |
| actions.emplace_back( |
| std::make_unique<action::numeric::LogToJournal>(type, |
| value)); |
| } |
| if (logToRedfish) |
| { |
| actions.emplace_back( |
| std::make_unique<action::numeric::LogToRedfish>(type, |
| value)); |
| } |
| if (updateReport) |
| { |
| actions.emplace_back(std::make_unique<action::UpdateReport>( |
| reportManager, reportNames)); |
| } |
| |
| thresholds.emplace_back(std::make_shared<NumericThreshold>( |
| bus->get_io_context(), sensors, sensorNames, std::move(actions), |
| std::chrono::milliseconds(dwellTime), |
| numeric::stringToDirection(directionStr), value)); |
| } |
| } |
| |
| return std::make_unique<Trigger>( |
| bus->get_io_context(), objServer, name, isDiscrete, logToJournal, |
| logToRedfish, updateReport, sensorPaths, reportNames, thresholdParams, |
| std::move(thresholds), triggerManager, triggerStorage); |
| } |
| |
| std::pair<std::vector<std::shared_ptr<interfaces::Sensor>>, |
| std::vector<std::string>> |
| TriggerFactory::getSensors( |
| boost::asio::yield_context& yield, |
| const std::vector<std::pair<sdbusplus::message::object_path, |
| std::string>>& sensorPaths) const |
| { |
| auto tree = utils::getSubTreeSensors(yield, bus); |
| |
| std::vector<std::shared_ptr<interfaces::Sensor>> sensors; |
| std::vector<std::string> sensorNames; |
| for (const auto& [sensorPath, metadata] : sensorPaths) |
| { |
| auto found = std::find_if( |
| tree.begin(), tree.end(), |
| [&sensorPath](const auto& x) { return x.first == sensorPath; }); |
| if (found == tree.end()) |
| { |
| throw std::runtime_error("Not found"); |
| } |
| |
| const auto& service = found->second[0].first; |
| const auto& path = found->first; |
| sensors.emplace_back(sensorCache.makeSensor<Sensor>( |
| service, path, bus->get_io_context(), bus)); |
| if (metadata.empty()) |
| { |
| sensorNames.emplace_back(sensorPath); |
| } |
| else |
| { |
| sensorNames.emplace_back(metadata); |
| } |
| } |
| return {sensors, sensorNames}; |
| } |