xref: /openbmc/bmcweb/features/redfish/lib/trigger.hpp (revision 3f215c926c25b5e6afed4eb36e0edd2ed4462dc6)
107148cf2SLukasz Kazmierczak #pragma once
207148cf2SLukasz Kazmierczak 
307148cf2SLukasz Kazmierczak #include "utils/collection.hpp"
407148cf2SLukasz Kazmierczak #include "utils/telemetry_utils.hpp"
507148cf2SLukasz Kazmierczak 
607148cf2SLukasz Kazmierczak #include <app.hpp>
745ca1b86SEd Tanous #include <query.hpp>
807148cf2SLukasz Kazmierczak #include <registries/privilege_registry.hpp>
907148cf2SLukasz Kazmierczak 
101b7e696bSLukasz Kazmierczak #include <tuple>
111b7e696bSLukasz Kazmierczak #include <variant>
121b7e696bSLukasz Kazmierczak #include <vector>
131b7e696bSLukasz Kazmierczak 
1407148cf2SLukasz Kazmierczak namespace redfish
1507148cf2SLukasz Kazmierczak {
1607148cf2SLukasz Kazmierczak namespace telemetry
1707148cf2SLukasz Kazmierczak {
1807148cf2SLukasz Kazmierczak constexpr const char* triggerInterface =
1907148cf2SLukasz Kazmierczak     "xyz.openbmc_project.Telemetry.Trigger";
2007148cf2SLukasz Kazmierczak constexpr const char* triggerUri = "/redfish/v1/TelemetryService/Triggers";
2107148cf2SLukasz Kazmierczak 
221b7e696bSLukasz Kazmierczak using NumericThresholdParams =
231b7e696bSLukasz Kazmierczak     std::tuple<std::string, uint64_t, std::string, double>;
241b7e696bSLukasz Kazmierczak 
251b7e696bSLukasz Kazmierczak using DiscreteThresholdParams =
261b7e696bSLukasz Kazmierczak     std::tuple<std::string, std::string, uint64_t, std::string>;
271b7e696bSLukasz Kazmierczak 
281b7e696bSLukasz Kazmierczak using TriggerThresholdParamsExt =
291b7e696bSLukasz Kazmierczak     std::variant<std::monostate, std::vector<NumericThresholdParams>,
301b7e696bSLukasz Kazmierczak                  std::vector<DiscreteThresholdParams>>;
311b7e696bSLukasz Kazmierczak 
321b7e696bSLukasz Kazmierczak using TriggerSensorsParams =
331b7e696bSLukasz Kazmierczak     std::vector<std::pair<sdbusplus::message::object_path, std::string>>;
341b7e696bSLukasz Kazmierczak 
351b7e696bSLukasz Kazmierczak using TriggerGetParamsVariant =
361b7e696bSLukasz Kazmierczak     std::variant<std::monostate, bool, std::string, TriggerThresholdParamsExt,
37*3f215c92SSzymon Dompke                  TriggerSensorsParams, std::vector<std::string>,
38*3f215c92SSzymon Dompke                  std::vector<sdbusplus::message::object_path>>;
391b7e696bSLukasz Kazmierczak 
401b7e696bSLukasz Kazmierczak inline std::optional<std::string>
411b7e696bSLukasz Kazmierczak     getRedfishFromDbusAction(const std::string& dbusAction)
421b7e696bSLukasz Kazmierczak {
431b7e696bSLukasz Kazmierczak     std::optional<std::string> redfishAction = std::nullopt;
441b7e696bSLukasz Kazmierczak     if (dbusAction == "UpdateReport")
451b7e696bSLukasz Kazmierczak     {
461b7e696bSLukasz Kazmierczak         redfishAction = "RedfishMetricReport";
471b7e696bSLukasz Kazmierczak     }
48*3f215c92SSzymon Dompke     if (dbusAction == "LogToRedfishEventLog")
491b7e696bSLukasz Kazmierczak     {
501b7e696bSLukasz Kazmierczak         redfishAction = "RedfishEvent";
511b7e696bSLukasz Kazmierczak     }
52*3f215c92SSzymon Dompke     if (dbusAction == "LogToJournal")
531b7e696bSLukasz Kazmierczak     {
541b7e696bSLukasz Kazmierczak         redfishAction = "LogToLogService";
551b7e696bSLukasz Kazmierczak     }
561b7e696bSLukasz Kazmierczak     return redfishAction;
571b7e696bSLukasz Kazmierczak }
581b7e696bSLukasz Kazmierczak 
591b7e696bSLukasz Kazmierczak inline std::optional<std::vector<std::string>>
601b7e696bSLukasz Kazmierczak     getTriggerActions(const std::vector<std::string>& dbusActions)
611b7e696bSLukasz Kazmierczak {
621b7e696bSLukasz Kazmierczak     std::vector<std::string> triggerActions;
631b7e696bSLukasz Kazmierczak     for (const std::string& dbusAction : dbusActions)
641b7e696bSLukasz Kazmierczak     {
651b7e696bSLukasz Kazmierczak         std::optional<std::string> redfishAction =
661b7e696bSLukasz Kazmierczak             getRedfishFromDbusAction(dbusAction);
671b7e696bSLukasz Kazmierczak 
681b7e696bSLukasz Kazmierczak         if (!redfishAction)
691b7e696bSLukasz Kazmierczak         {
701b7e696bSLukasz Kazmierczak             return std::nullopt;
711b7e696bSLukasz Kazmierczak         }
721b7e696bSLukasz Kazmierczak 
731b7e696bSLukasz Kazmierczak         triggerActions.push_back(*redfishAction);
741b7e696bSLukasz Kazmierczak     }
751b7e696bSLukasz Kazmierczak 
76*3f215c92SSzymon Dompke     return {std::move(triggerActions)};
771b7e696bSLukasz Kazmierczak }
781b7e696bSLukasz Kazmierczak 
79*3f215c92SSzymon Dompke inline std::optional<nlohmann::json::array_t>
801b7e696bSLukasz Kazmierczak     getDiscreteTriggers(const TriggerThresholdParamsExt& thresholdParams)
811b7e696bSLukasz Kazmierczak {
821b7e696bSLukasz Kazmierczak     const std::vector<DiscreteThresholdParams>* discreteParams =
831b7e696bSLukasz Kazmierczak         std::get_if<std::vector<DiscreteThresholdParams>>(&thresholdParams);
841b7e696bSLukasz Kazmierczak 
85e662eae8SEd Tanous     if (discreteParams == nullptr)
861b7e696bSLukasz Kazmierczak     {
871b7e696bSLukasz Kazmierczak         return std::nullopt;
881b7e696bSLukasz Kazmierczak     }
891b7e696bSLukasz Kazmierczak 
90*3f215c92SSzymon Dompke     nlohmann::json::array_t triggers;
911b7e696bSLukasz Kazmierczak     for (const auto& [name, severity, dwellTime, value] : *discreteParams)
921b7e696bSLukasz Kazmierczak     {
931b7e696bSLukasz Kazmierczak         std::optional<std::string> duration =
941b7e696bSLukasz Kazmierczak             time_utils::toDurationStringFromUint(dwellTime);
951b7e696bSLukasz Kazmierczak 
961b7e696bSLukasz Kazmierczak         if (!duration)
971b7e696bSLukasz Kazmierczak         {
981b7e696bSLukasz Kazmierczak             return std::nullopt;
991b7e696bSLukasz Kazmierczak         }
1001b7e696bSLukasz Kazmierczak 
1011b7e696bSLukasz Kazmierczak         triggers.push_back({
1021b7e696bSLukasz Kazmierczak             {"Name", name},
1031b7e696bSLukasz Kazmierczak             {"Severity", severity},
1041b7e696bSLukasz Kazmierczak             {"DwellTime", *duration},
1051b7e696bSLukasz Kazmierczak             {"Value", value},
1061b7e696bSLukasz Kazmierczak         });
1071b7e696bSLukasz Kazmierczak     }
1081b7e696bSLukasz Kazmierczak 
109*3f215c92SSzymon Dompke     return {std::move(triggers)};
1101b7e696bSLukasz Kazmierczak }
1111b7e696bSLukasz Kazmierczak 
1121b7e696bSLukasz Kazmierczak inline std::optional<nlohmann::json>
1131b7e696bSLukasz Kazmierczak     getNumericThresholds(const TriggerThresholdParamsExt& thresholdParams)
1141b7e696bSLukasz Kazmierczak {
1151b7e696bSLukasz Kazmierczak     const std::vector<NumericThresholdParams>* numericParams =
1161b7e696bSLukasz Kazmierczak         std::get_if<std::vector<NumericThresholdParams>>(&thresholdParams);
1171b7e696bSLukasz Kazmierczak 
118e662eae8SEd Tanous     if (numericParams == nullptr)
1191b7e696bSLukasz Kazmierczak     {
1201b7e696bSLukasz Kazmierczak         return std::nullopt;
1211b7e696bSLukasz Kazmierczak     }
1221b7e696bSLukasz Kazmierczak 
123*3f215c92SSzymon Dompke     nlohmann::json::object_t thresholds;
1241b7e696bSLukasz Kazmierczak     for (const auto& [type, dwellTime, activation, reading] : *numericParams)
1251b7e696bSLukasz Kazmierczak     {
1261b7e696bSLukasz Kazmierczak         std::optional<std::string> duration =
1271b7e696bSLukasz Kazmierczak             time_utils::toDurationStringFromUint(dwellTime);
1281b7e696bSLukasz Kazmierczak 
1291b7e696bSLukasz Kazmierczak         if (!duration)
1301b7e696bSLukasz Kazmierczak         {
1311b7e696bSLukasz Kazmierczak             return std::nullopt;
1321b7e696bSLukasz Kazmierczak         }
1331476687dSEd Tanous         nlohmann::json& threshold = thresholds[type];
1341476687dSEd Tanous         threshold["Reading"] = reading;
1351476687dSEd Tanous         threshold["Activation"] = activation;
1361476687dSEd Tanous         threshold["DwellTime"] = *duration;
1371b7e696bSLukasz Kazmierczak     }
1381b7e696bSLukasz Kazmierczak 
139*3f215c92SSzymon Dompke     return {std::move(thresholds)};
1401b7e696bSLukasz Kazmierczak }
1411b7e696bSLukasz Kazmierczak 
142*3f215c92SSzymon Dompke inline std::optional<nlohmann::json> getMetricReportDefinitions(
143*3f215c92SSzymon Dompke     const std::vector<sdbusplus::message::object_path>& reportPaths)
1441b7e696bSLukasz Kazmierczak {
1451b7e696bSLukasz Kazmierczak     nlohmann::json reports = nlohmann::json::array();
146*3f215c92SSzymon Dompke 
147*3f215c92SSzymon Dompke     for (const sdbusplus::message::object_path& path : reportPaths)
1481b7e696bSLukasz Kazmierczak     {
149*3f215c92SSzymon Dompke         std::string reportId = path.filename();
150*3f215c92SSzymon Dompke         if (reportId.empty())
151*3f215c92SSzymon Dompke         {
152*3f215c92SSzymon Dompke             {
153*3f215c92SSzymon Dompke                 BMCWEB_LOG_ERROR << "Property Reports contains invalid value: "
154*3f215c92SSzymon Dompke                                  << path.str;
155*3f215c92SSzymon Dompke                 return std::nullopt;
156*3f215c92SSzymon Dompke             }
157*3f215c92SSzymon Dompke         }
158*3f215c92SSzymon Dompke 
1591476687dSEd Tanous         nlohmann::json::object_t report;
1601476687dSEd Tanous         report["@odata.id"] =
161456cd875SSzymon Dompke             crow::utility::urlFromPieces("redfish", "v1", "TelemetryService",
162*3f215c92SSzymon Dompke                                          "MetricReportDefinitions", reportId);
1631476687dSEd Tanous         reports.push_back(std::move(report));
1641b7e696bSLukasz Kazmierczak     }
1651b7e696bSLukasz Kazmierczak 
166*3f215c92SSzymon Dompke     return {std::move(reports)};
1671b7e696bSLukasz Kazmierczak }
1681b7e696bSLukasz Kazmierczak 
1691b7e696bSLukasz Kazmierczak inline std::vector<std::string>
1701b7e696bSLukasz Kazmierczak     getMetricProperties(const TriggerSensorsParams& sensors)
1711b7e696bSLukasz Kazmierczak {
1721b7e696bSLukasz Kazmierczak     std::vector<std::string> metricProperties;
1731b7e696bSLukasz Kazmierczak     metricProperties.reserve(sensors.size());
1741b7e696bSLukasz Kazmierczak     for (const auto& [_, metadata] : sensors)
1751b7e696bSLukasz Kazmierczak     {
1761b7e696bSLukasz Kazmierczak         metricProperties.emplace_back(metadata);
1771b7e696bSLukasz Kazmierczak     }
1781b7e696bSLukasz Kazmierczak 
1791b7e696bSLukasz Kazmierczak     return metricProperties;
1801b7e696bSLukasz Kazmierczak }
1811b7e696bSLukasz Kazmierczak 
1821b7e696bSLukasz Kazmierczak inline bool fillTrigger(
1831b7e696bSLukasz Kazmierczak     nlohmann::json& json, const std::string& id,
1841b7e696bSLukasz Kazmierczak     const std::vector<std::pair<std::string, TriggerGetParamsVariant>>&
1851b7e696bSLukasz Kazmierczak         properties)
1861b7e696bSLukasz Kazmierczak {
1871b7e696bSLukasz Kazmierczak     const std::string* name = nullptr;
1881b7e696bSLukasz Kazmierczak     const bool* discrete = nullptr;
1891b7e696bSLukasz Kazmierczak     const TriggerSensorsParams* sensors = nullptr;
190*3f215c92SSzymon Dompke     const std::vector<sdbusplus::message::object_path>* reports = nullptr;
1911b7e696bSLukasz Kazmierczak     const std::vector<std::string>* actions = nullptr;
1921b7e696bSLukasz Kazmierczak     const TriggerThresholdParamsExt* thresholds = nullptr;
1931b7e696bSLukasz Kazmierczak 
1941b7e696bSLukasz Kazmierczak     for (const auto& [key, var] : properties)
1951b7e696bSLukasz Kazmierczak     {
1961b7e696bSLukasz Kazmierczak         if (key == "Name")
1971b7e696bSLukasz Kazmierczak         {
1981b7e696bSLukasz Kazmierczak             name = std::get_if<std::string>(&var);
1991b7e696bSLukasz Kazmierczak         }
2001b7e696bSLukasz Kazmierczak         else if (key == "Discrete")
2011b7e696bSLukasz Kazmierczak         {
2021b7e696bSLukasz Kazmierczak             discrete = std::get_if<bool>(&var);
2031b7e696bSLukasz Kazmierczak         }
2041b7e696bSLukasz Kazmierczak         else if (key == "Sensors")
2051b7e696bSLukasz Kazmierczak         {
2061b7e696bSLukasz Kazmierczak             sensors = std::get_if<TriggerSensorsParams>(&var);
2071b7e696bSLukasz Kazmierczak         }
208*3f215c92SSzymon Dompke         else if (key == "Reports")
2091b7e696bSLukasz Kazmierczak         {
210*3f215c92SSzymon Dompke             reports =
211*3f215c92SSzymon Dompke                 std::get_if<std::vector<sdbusplus::message::object_path>>(&var);
2121b7e696bSLukasz Kazmierczak         }
2131b7e696bSLukasz Kazmierczak         else if (key == "TriggerActions")
2141b7e696bSLukasz Kazmierczak         {
2151b7e696bSLukasz Kazmierczak             actions = std::get_if<std::vector<std::string>>(&var);
2161b7e696bSLukasz Kazmierczak         }
2171b7e696bSLukasz Kazmierczak         else if (key == "Thresholds")
2181b7e696bSLukasz Kazmierczak         {
2191b7e696bSLukasz Kazmierczak             thresholds = std::get_if<TriggerThresholdParamsExt>(&var);
2201b7e696bSLukasz Kazmierczak         }
2211b7e696bSLukasz Kazmierczak     }
2221b7e696bSLukasz Kazmierczak 
223e662eae8SEd Tanous     if (name == nullptr || discrete == nullptr || sensors == nullptr ||
224e662eae8SEd Tanous         reports == nullptr || actions == nullptr || thresholds == nullptr)
2251b7e696bSLukasz Kazmierczak     {
2261b7e696bSLukasz Kazmierczak         BMCWEB_LOG_ERROR
2271b7e696bSLukasz Kazmierczak             << "Property type mismatch or property is missing in Trigger: "
2281b7e696bSLukasz Kazmierczak             << id;
2291b7e696bSLukasz Kazmierczak         return false;
2301b7e696bSLukasz Kazmierczak     }
2311b7e696bSLukasz Kazmierczak 
232*3f215c92SSzymon Dompke     std::optional<std::vector<std::string>> triggerActions =
233*3f215c92SSzymon Dompke         getTriggerActions(*actions);
234*3f215c92SSzymon Dompke     if (!triggerActions)
235*3f215c92SSzymon Dompke     {
236*3f215c92SSzymon Dompke         BMCWEB_LOG_ERROR << "Property TriggerActions is invalid in Trigger: "
237*3f215c92SSzymon Dompke                          << id;
238*3f215c92SSzymon Dompke         return false;
239*3f215c92SSzymon Dompke     }
240*3f215c92SSzymon Dompke 
241*3f215c92SSzymon Dompke     std::optional<nlohmann::json> linkedReports =
242*3f215c92SSzymon Dompke         getMetricReportDefinitions(*reports);
243*3f215c92SSzymon Dompke     if (!linkedReports)
244*3f215c92SSzymon Dompke     {
245*3f215c92SSzymon Dompke         BMCWEB_LOG_ERROR << "Property Reports is invalid in Trigger: " << id;
246*3f215c92SSzymon Dompke         return false;
247*3f215c92SSzymon Dompke     }
2481b7e696bSLukasz Kazmierczak 
2491b7e696bSLukasz Kazmierczak     if (*discrete)
2501b7e696bSLukasz Kazmierczak     {
251*3f215c92SSzymon Dompke         std::optional<nlohmann::json::array_t> discreteTriggers =
2521b7e696bSLukasz Kazmierczak             getDiscreteTriggers(*thresholds);
2531b7e696bSLukasz Kazmierczak 
2541b7e696bSLukasz Kazmierczak         if (!discreteTriggers)
2551b7e696bSLukasz Kazmierczak         {
2561b7e696bSLukasz Kazmierczak             BMCWEB_LOG_ERROR << "Property Thresholds is invalid for discrete "
2571b7e696bSLukasz Kazmierczak                                 "triggers in Trigger: "
2581b7e696bSLukasz Kazmierczak                              << id;
2591b7e696bSLukasz Kazmierczak             return false;
2601b7e696bSLukasz Kazmierczak         }
2611b7e696bSLukasz Kazmierczak 
2621b7e696bSLukasz Kazmierczak         json["DiscreteTriggers"] = *discreteTriggers;
2631b7e696bSLukasz Kazmierczak         json["DiscreteTriggerCondition"] =
2641b7e696bSLukasz Kazmierczak             discreteTriggers->empty() ? "Changed" : "Specified";
2651b7e696bSLukasz Kazmierczak         json["MetricType"] = "Discrete";
2661b7e696bSLukasz Kazmierczak     }
2671b7e696bSLukasz Kazmierczak     else
2681b7e696bSLukasz Kazmierczak     {
2691b7e696bSLukasz Kazmierczak         std::optional<nlohmann::json> numericThresholds =
2701b7e696bSLukasz Kazmierczak             getNumericThresholds(*thresholds);
2711b7e696bSLukasz Kazmierczak 
2721b7e696bSLukasz Kazmierczak         if (!numericThresholds)
2731b7e696bSLukasz Kazmierczak         {
2741b7e696bSLukasz Kazmierczak             BMCWEB_LOG_ERROR << "Property Thresholds is invalid for numeric "
2751b7e696bSLukasz Kazmierczak                                 "thresholds in Trigger: "
2761b7e696bSLukasz Kazmierczak                              << id;
2771b7e696bSLukasz Kazmierczak             return false;
2781b7e696bSLukasz Kazmierczak         }
2791b7e696bSLukasz Kazmierczak 
2801b7e696bSLukasz Kazmierczak         json["NumericThresholds"] = *numericThresholds;
2811b7e696bSLukasz Kazmierczak         json["MetricType"] = "Numeric";
2821b7e696bSLukasz Kazmierczak     }
2831b7e696bSLukasz Kazmierczak 
284*3f215c92SSzymon Dompke     json["@odata.type"] = "#Triggers.v1_2_0.Triggers";
285*3f215c92SSzymon Dompke     json["@odata.id"] = crow::utility::urlFromPieces(
286*3f215c92SSzymon Dompke         "redfish", "v1", "TelemetryService", "Triggers", id);
287*3f215c92SSzymon Dompke     json["Id"] = id;
288*3f215c92SSzymon Dompke     json["Name"] = *name;
2891b7e696bSLukasz Kazmierczak     json["TriggerActions"] = *triggerActions;
2901b7e696bSLukasz Kazmierczak     json["MetricProperties"] = getMetricProperties(*sensors);
291*3f215c92SSzymon Dompke     json["Links"]["MetricReportDefinitions"] = *linkedReports;
2921b7e696bSLukasz Kazmierczak 
2931b7e696bSLukasz Kazmierczak     return true;
2941b7e696bSLukasz Kazmierczak }
2951b7e696bSLukasz Kazmierczak 
29607148cf2SLukasz Kazmierczak } // namespace telemetry
29707148cf2SLukasz Kazmierczak 
29807148cf2SLukasz Kazmierczak inline void requestRoutesTriggerCollection(App& app)
29907148cf2SLukasz Kazmierczak {
30007148cf2SLukasz Kazmierczak     BMCWEB_ROUTE(app, "/redfish/v1/TelemetryService/Triggers/")
30107148cf2SLukasz Kazmierczak         .privileges(redfish::privileges::getTriggersCollection)
30207148cf2SLukasz Kazmierczak         .methods(boost::beast::http::verb::get)(
30345ca1b86SEd Tanous             [&app](const crow::Request& req,
30407148cf2SLukasz Kazmierczak                    const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
3053ba00073SCarson Labrado         if (!redfish::setUpRedfishRoute(app, req, asyncResp))
30645ca1b86SEd Tanous         {
30745ca1b86SEd Tanous             return;
30845ca1b86SEd Tanous         }
30907148cf2SLukasz Kazmierczak         asyncResp->res.jsonValue["@odata.type"] =
31007148cf2SLukasz Kazmierczak             "#TriggersCollection.TriggersCollection";
311456cd875SSzymon Dompke         asyncResp->res.jsonValue["@odata.id"] = telemetry::triggerUri;
31207148cf2SLukasz Kazmierczak         asyncResp->res.jsonValue["Name"] = "Triggers Collection";
313002d39b4SEd Tanous         const std::vector<const char*> interfaces{telemetry::triggerInterface};
31407148cf2SLukasz Kazmierczak         collection_util::getCollectionMembers(
31507148cf2SLukasz Kazmierczak             asyncResp, telemetry::triggerUri, interfaces,
31607148cf2SLukasz Kazmierczak             "/xyz/openbmc_project/Telemetry/Triggers/TelemetryService");
31707148cf2SLukasz Kazmierczak         });
31807148cf2SLukasz Kazmierczak }
31907148cf2SLukasz Kazmierczak 
3201b7e696bSLukasz Kazmierczak inline void requestRoutesTrigger(App& app)
3211b7e696bSLukasz Kazmierczak {
3221b7e696bSLukasz Kazmierczak     BMCWEB_ROUTE(app, "/redfish/v1/TelemetryService/Triggers/<str>/")
3231b7e696bSLukasz Kazmierczak         .privileges(redfish::privileges::getTriggers)
3241b7e696bSLukasz Kazmierczak         .methods(boost::beast::http::verb::get)(
32545ca1b86SEd Tanous             [&app](const crow::Request& req,
3261b7e696bSLukasz Kazmierczak                    const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
3271b7e696bSLukasz Kazmierczak                    const std::string& id) {
3283ba00073SCarson Labrado         if (!redfish::setUpRedfishRoute(app, req, asyncResp))
32945ca1b86SEd Tanous         {
33045ca1b86SEd Tanous             return;
33145ca1b86SEd Tanous         }
3321b7e696bSLukasz Kazmierczak         crow::connections::systemBus->async_method_call(
3331b7e696bSLukasz Kazmierczak             [asyncResp,
3341b7e696bSLukasz Kazmierczak              id](const boost::system::error_code ec,
3351b7e696bSLukasz Kazmierczak                  const std::vector<std::pair<
336002d39b4SEd Tanous                      std::string, telemetry::TriggerGetParamsVariant>>& ret) {
3371b7e696bSLukasz Kazmierczak             if (ec.value() == EBADR ||
3381b7e696bSLukasz Kazmierczak                 ec == boost::system::errc::host_unreachable)
3391b7e696bSLukasz Kazmierczak             {
340002d39b4SEd Tanous                 messages::resourceNotFound(asyncResp->res, "Triggers", id);
3411b7e696bSLukasz Kazmierczak                 return;
3421b7e696bSLukasz Kazmierczak             }
3431b7e696bSLukasz Kazmierczak             if (ec)
3441b7e696bSLukasz Kazmierczak             {
3451b7e696bSLukasz Kazmierczak                 BMCWEB_LOG_ERROR << "respHandler DBus error " << ec;
3461b7e696bSLukasz Kazmierczak                 messages::internalError(asyncResp->res);
3471b7e696bSLukasz Kazmierczak                 return;
3481b7e696bSLukasz Kazmierczak             }
3491b7e696bSLukasz Kazmierczak 
350002d39b4SEd Tanous             if (!telemetry::fillTrigger(asyncResp->res.jsonValue, id, ret))
3511b7e696bSLukasz Kazmierczak             {
3521b7e696bSLukasz Kazmierczak                 messages::internalError(asyncResp->res);
3531b7e696bSLukasz Kazmierczak             }
3541b7e696bSLukasz Kazmierczak             },
3551b7e696bSLukasz Kazmierczak             telemetry::service, telemetry::getDbusTriggerPath(id),
3561b7e696bSLukasz Kazmierczak             "org.freedesktop.DBus.Properties", "GetAll",
3571b7e696bSLukasz Kazmierczak             telemetry::triggerInterface);
3581b7e696bSLukasz Kazmierczak         });
359163994a8SSzymon Dompke 
360163994a8SSzymon Dompke     BMCWEB_ROUTE(app, "/redfish/v1/TelemetryService/Triggers/<str>/")
361163994a8SSzymon Dompke         .privileges(redfish::privileges::deleteTriggers)
362163994a8SSzymon Dompke         .methods(boost::beast::http::verb::delete_)(
36345ca1b86SEd Tanous             [&app](const crow::Request& req,
364163994a8SSzymon Dompke                    const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
365163994a8SSzymon Dompke                    const std::string& id) {
3663ba00073SCarson Labrado         if (!redfish::setUpRedfishRoute(app, req, asyncResp))
36745ca1b86SEd Tanous         {
36845ca1b86SEd Tanous             return;
36945ca1b86SEd Tanous         }
370002d39b4SEd Tanous         const std::string triggerPath = telemetry::getDbusTriggerPath(id);
371163994a8SSzymon Dompke 
372163994a8SSzymon Dompke         crow::connections::systemBus->async_method_call(
373163994a8SSzymon Dompke             [asyncResp, id](const boost::system::error_code ec) {
374163994a8SSzymon Dompke             if (ec.value() == EBADR)
375163994a8SSzymon Dompke             {
376002d39b4SEd Tanous                 messages::resourceNotFound(asyncResp->res, "Triggers", id);
377163994a8SSzymon Dompke                 return;
378163994a8SSzymon Dompke             }
379163994a8SSzymon Dompke 
380163994a8SSzymon Dompke             if (ec)
381163994a8SSzymon Dompke             {
382163994a8SSzymon Dompke                 BMCWEB_LOG_ERROR << "respHandler DBus error " << ec;
383163994a8SSzymon Dompke                 messages::internalError(asyncResp->res);
384163994a8SSzymon Dompke                 return;
385163994a8SSzymon Dompke             }
386163994a8SSzymon Dompke 
387002d39b4SEd Tanous             asyncResp->res.result(boost::beast::http::status::no_content);
388163994a8SSzymon Dompke             },
389163994a8SSzymon Dompke             telemetry::service, triggerPath,
390163994a8SSzymon Dompke             "xyz.openbmc_project.Object.Delete", "Delete");
391163994a8SSzymon Dompke         });
3921b7e696bSLukasz Kazmierczak }
3931b7e696bSLukasz Kazmierczak 
39407148cf2SLukasz Kazmierczak } // namespace redfish
395