xref: /openbmc/bmcweb/features/redfish/lib/trigger.hpp (revision 45ca1b868e47978a4d2e8ebb680cb384e804c97e)
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>
7*45ca1b86SEd 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,
371b7e696bSLukasz Kazmierczak                  TriggerSensorsParams, std::vector<std::string>>;
381b7e696bSLukasz Kazmierczak 
391b7e696bSLukasz Kazmierczak inline std::optional<std::string>
401b7e696bSLukasz Kazmierczak     getRedfishFromDbusAction(const std::string& dbusAction)
411b7e696bSLukasz Kazmierczak {
421b7e696bSLukasz Kazmierczak     std::optional<std::string> redfishAction = std::nullopt;
431b7e696bSLukasz Kazmierczak     if (dbusAction == "UpdateReport")
441b7e696bSLukasz Kazmierczak     {
451b7e696bSLukasz Kazmierczak         redfishAction = "RedfishMetricReport";
461b7e696bSLukasz Kazmierczak     }
471b7e696bSLukasz Kazmierczak     if (dbusAction == "RedfishEvent")
481b7e696bSLukasz Kazmierczak     {
491b7e696bSLukasz Kazmierczak         redfishAction = "RedfishEvent";
501b7e696bSLukasz Kazmierczak     }
511b7e696bSLukasz Kazmierczak     if (dbusAction == "LogToLogService")
521b7e696bSLukasz Kazmierczak     {
531b7e696bSLukasz Kazmierczak         redfishAction = "LogToLogService";
541b7e696bSLukasz Kazmierczak     }
551b7e696bSLukasz Kazmierczak     return redfishAction;
561b7e696bSLukasz Kazmierczak }
571b7e696bSLukasz Kazmierczak 
581b7e696bSLukasz Kazmierczak inline std::optional<std::vector<std::string>>
591b7e696bSLukasz Kazmierczak     getTriggerActions(const std::vector<std::string>& dbusActions)
601b7e696bSLukasz Kazmierczak {
611b7e696bSLukasz Kazmierczak     std::vector<std::string> triggerActions;
621b7e696bSLukasz Kazmierczak     for (const std::string& dbusAction : dbusActions)
631b7e696bSLukasz Kazmierczak     {
641b7e696bSLukasz Kazmierczak         std::optional<std::string> redfishAction =
651b7e696bSLukasz Kazmierczak             getRedfishFromDbusAction(dbusAction);
661b7e696bSLukasz Kazmierczak 
671b7e696bSLukasz Kazmierczak         if (!redfishAction)
681b7e696bSLukasz Kazmierczak         {
691b7e696bSLukasz Kazmierczak             return std::nullopt;
701b7e696bSLukasz Kazmierczak         }
711b7e696bSLukasz Kazmierczak 
721b7e696bSLukasz Kazmierczak         triggerActions.push_back(*redfishAction);
731b7e696bSLukasz Kazmierczak     }
741b7e696bSLukasz Kazmierczak 
751b7e696bSLukasz Kazmierczak     return std::make_optional(triggerActions);
761b7e696bSLukasz Kazmierczak }
771b7e696bSLukasz Kazmierczak 
781b7e696bSLukasz Kazmierczak inline std::optional<nlohmann::json>
791b7e696bSLukasz Kazmierczak     getDiscreteTriggers(const TriggerThresholdParamsExt& thresholdParams)
801b7e696bSLukasz Kazmierczak {
811b7e696bSLukasz Kazmierczak     const std::vector<DiscreteThresholdParams>* discreteParams =
821b7e696bSLukasz Kazmierczak         std::get_if<std::vector<DiscreteThresholdParams>>(&thresholdParams);
831b7e696bSLukasz Kazmierczak 
84e662eae8SEd Tanous     if (discreteParams == nullptr)
851b7e696bSLukasz Kazmierczak     {
861b7e696bSLukasz Kazmierczak         return std::nullopt;
871b7e696bSLukasz Kazmierczak     }
881b7e696bSLukasz Kazmierczak 
891b7e696bSLukasz Kazmierczak     nlohmann::json triggers = nlohmann::json::array();
901b7e696bSLukasz Kazmierczak     for (const auto& [name, severity, dwellTime, value] : *discreteParams)
911b7e696bSLukasz Kazmierczak     {
921b7e696bSLukasz Kazmierczak         std::optional<std::string> duration =
931b7e696bSLukasz Kazmierczak             time_utils::toDurationStringFromUint(dwellTime);
941b7e696bSLukasz Kazmierczak 
951b7e696bSLukasz Kazmierczak         if (!duration)
961b7e696bSLukasz Kazmierczak         {
971b7e696bSLukasz Kazmierczak             return std::nullopt;
981b7e696bSLukasz Kazmierczak         }
991b7e696bSLukasz Kazmierczak 
1001b7e696bSLukasz Kazmierczak         triggers.push_back({
1011b7e696bSLukasz Kazmierczak             {"Name", name},
1021b7e696bSLukasz Kazmierczak             {"Severity", severity},
1031b7e696bSLukasz Kazmierczak             {"DwellTime", *duration},
1041b7e696bSLukasz Kazmierczak             {"Value", value},
1051b7e696bSLukasz Kazmierczak         });
1061b7e696bSLukasz Kazmierczak     }
1071b7e696bSLukasz Kazmierczak 
1081b7e696bSLukasz Kazmierczak     return std::make_optional(triggers);
1091b7e696bSLukasz Kazmierczak }
1101b7e696bSLukasz Kazmierczak 
1111b7e696bSLukasz Kazmierczak inline std::optional<nlohmann::json>
1121b7e696bSLukasz Kazmierczak     getNumericThresholds(const TriggerThresholdParamsExt& thresholdParams)
1131b7e696bSLukasz Kazmierczak {
1141b7e696bSLukasz Kazmierczak     const std::vector<NumericThresholdParams>* numericParams =
1151b7e696bSLukasz Kazmierczak         std::get_if<std::vector<NumericThresholdParams>>(&thresholdParams);
1161b7e696bSLukasz Kazmierczak 
117e662eae8SEd Tanous     if (numericParams == nullptr)
1181b7e696bSLukasz Kazmierczak     {
1191b7e696bSLukasz Kazmierczak         return std::nullopt;
1201b7e696bSLukasz Kazmierczak     }
1211b7e696bSLukasz Kazmierczak 
1221b7e696bSLukasz Kazmierczak     nlohmann::json thresholds;
1231b7e696bSLukasz Kazmierczak     for (const auto& [type, dwellTime, activation, reading] : *numericParams)
1241b7e696bSLukasz Kazmierczak     {
1251b7e696bSLukasz Kazmierczak         std::optional<std::string> duration =
1261b7e696bSLukasz Kazmierczak             time_utils::toDurationStringFromUint(dwellTime);
1271b7e696bSLukasz Kazmierczak 
1281b7e696bSLukasz Kazmierczak         if (!duration)
1291b7e696bSLukasz Kazmierczak         {
1301b7e696bSLukasz Kazmierczak             return std::nullopt;
1311b7e696bSLukasz Kazmierczak         }
1321b7e696bSLukasz Kazmierczak 
1331b7e696bSLukasz Kazmierczak         thresholds[type] = {{"Reading", reading},
1341b7e696bSLukasz Kazmierczak                             {"Activation", activation},
1351b7e696bSLukasz Kazmierczak                             {"DwellTime", *duration}};
1361b7e696bSLukasz Kazmierczak     }
1371b7e696bSLukasz Kazmierczak 
1381b7e696bSLukasz Kazmierczak     return std::make_optional(thresholds);
1391b7e696bSLukasz Kazmierczak }
1401b7e696bSLukasz Kazmierczak 
141248d0230SEd Tanous inline nlohmann::json
1421b7e696bSLukasz Kazmierczak     getMetricReportDefinitions(const std::vector<std::string>& reportNames)
1431b7e696bSLukasz Kazmierczak {
1441b7e696bSLukasz Kazmierczak     nlohmann::json reports = nlohmann::json::array();
1451b7e696bSLukasz Kazmierczak     for (const std::string& name : reportNames)
1461b7e696bSLukasz Kazmierczak     {
147456cd875SSzymon Dompke         reports.push_back(
148456cd875SSzymon Dompke             {{"@odata.id",
149456cd875SSzymon Dompke               crow::utility::urlFromPieces("redfish", "v1", "TelemetryService",
150456cd875SSzymon Dompke                                            "MetricReportDefinitions", name)
151456cd875SSzymon Dompke                   .string()}});
1521b7e696bSLukasz Kazmierczak     }
1531b7e696bSLukasz Kazmierczak 
1541b7e696bSLukasz Kazmierczak     return reports;
1551b7e696bSLukasz Kazmierczak }
1561b7e696bSLukasz Kazmierczak 
1571b7e696bSLukasz Kazmierczak inline std::vector<std::string>
1581b7e696bSLukasz Kazmierczak     getMetricProperties(const TriggerSensorsParams& sensors)
1591b7e696bSLukasz Kazmierczak {
1601b7e696bSLukasz Kazmierczak     std::vector<std::string> metricProperties;
1611b7e696bSLukasz Kazmierczak     metricProperties.reserve(sensors.size());
1621b7e696bSLukasz Kazmierczak     for (const auto& [_, metadata] : sensors)
1631b7e696bSLukasz Kazmierczak     {
1641b7e696bSLukasz Kazmierczak         metricProperties.emplace_back(metadata);
1651b7e696bSLukasz Kazmierczak     }
1661b7e696bSLukasz Kazmierczak 
1671b7e696bSLukasz Kazmierczak     return metricProperties;
1681b7e696bSLukasz Kazmierczak }
1691b7e696bSLukasz Kazmierczak 
1701b7e696bSLukasz Kazmierczak inline bool fillTrigger(
1711b7e696bSLukasz Kazmierczak     nlohmann::json& json, const std::string& id,
1721b7e696bSLukasz Kazmierczak     const std::vector<std::pair<std::string, TriggerGetParamsVariant>>&
1731b7e696bSLukasz Kazmierczak         properties)
1741b7e696bSLukasz Kazmierczak {
1751b7e696bSLukasz Kazmierczak     const std::string* name = nullptr;
1761b7e696bSLukasz Kazmierczak     const bool* discrete = nullptr;
1771b7e696bSLukasz Kazmierczak     const TriggerSensorsParams* sensors = nullptr;
1781b7e696bSLukasz Kazmierczak     const std::vector<std::string>* reports = nullptr;
1791b7e696bSLukasz Kazmierczak     const std::vector<std::string>* actions = nullptr;
1801b7e696bSLukasz Kazmierczak     const TriggerThresholdParamsExt* thresholds = nullptr;
1811b7e696bSLukasz Kazmierczak 
1821b7e696bSLukasz Kazmierczak     for (const auto& [key, var] : properties)
1831b7e696bSLukasz Kazmierczak     {
1841b7e696bSLukasz Kazmierczak         if (key == "Name")
1851b7e696bSLukasz Kazmierczak         {
1861b7e696bSLukasz Kazmierczak             name = std::get_if<std::string>(&var);
1871b7e696bSLukasz Kazmierczak         }
1881b7e696bSLukasz Kazmierczak         else if (key == "Discrete")
1891b7e696bSLukasz Kazmierczak         {
1901b7e696bSLukasz Kazmierczak             discrete = std::get_if<bool>(&var);
1911b7e696bSLukasz Kazmierczak         }
1921b7e696bSLukasz Kazmierczak         else if (key == "Sensors")
1931b7e696bSLukasz Kazmierczak         {
1941b7e696bSLukasz Kazmierczak             sensors = std::get_if<TriggerSensorsParams>(&var);
1951b7e696bSLukasz Kazmierczak         }
1961b7e696bSLukasz Kazmierczak         else if (key == "ReportNames")
1971b7e696bSLukasz Kazmierczak         {
1981b7e696bSLukasz Kazmierczak             reports = std::get_if<std::vector<std::string>>(&var);
1991b7e696bSLukasz Kazmierczak         }
2001b7e696bSLukasz Kazmierczak         else if (key == "TriggerActions")
2011b7e696bSLukasz Kazmierczak         {
2021b7e696bSLukasz Kazmierczak             actions = std::get_if<std::vector<std::string>>(&var);
2031b7e696bSLukasz Kazmierczak         }
2041b7e696bSLukasz Kazmierczak         else if (key == "Thresholds")
2051b7e696bSLukasz Kazmierczak         {
2061b7e696bSLukasz Kazmierczak             thresholds = std::get_if<TriggerThresholdParamsExt>(&var);
2071b7e696bSLukasz Kazmierczak         }
2081b7e696bSLukasz Kazmierczak     }
2091b7e696bSLukasz Kazmierczak 
210e662eae8SEd Tanous     if (name == nullptr || discrete == nullptr || sensors == nullptr ||
211e662eae8SEd Tanous         reports == nullptr || actions == nullptr || thresholds == nullptr)
2121b7e696bSLukasz Kazmierczak     {
2131b7e696bSLukasz Kazmierczak         BMCWEB_LOG_ERROR
2141b7e696bSLukasz Kazmierczak             << "Property type mismatch or property is missing in Trigger: "
2151b7e696bSLukasz Kazmierczak             << id;
2161b7e696bSLukasz Kazmierczak         return false;
2171b7e696bSLukasz Kazmierczak     }
2181b7e696bSLukasz Kazmierczak 
2191b7e696bSLukasz Kazmierczak     json["@odata.type"] = "#Triggers.v1_2_0.Triggers";
220456cd875SSzymon Dompke     json["@odata.id"] = crow::utility::urlFromPieces(
221456cd875SSzymon Dompke                             "redfish", "v1", "TelemetryService", "Triggers", id)
222456cd875SSzymon Dompke                             .string();
2231b7e696bSLukasz Kazmierczak     json["Id"] = id;
2241b7e696bSLukasz Kazmierczak     json["Name"] = *name;
2251b7e696bSLukasz Kazmierczak 
2261b7e696bSLukasz Kazmierczak     if (*discrete)
2271b7e696bSLukasz Kazmierczak     {
2281b7e696bSLukasz Kazmierczak         std::optional<nlohmann::json> discreteTriggers =
2291b7e696bSLukasz Kazmierczak             getDiscreteTriggers(*thresholds);
2301b7e696bSLukasz Kazmierczak 
2311b7e696bSLukasz Kazmierczak         if (!discreteTriggers)
2321b7e696bSLukasz Kazmierczak         {
2331b7e696bSLukasz Kazmierczak             BMCWEB_LOG_ERROR << "Property Thresholds is invalid for discrete "
2341b7e696bSLukasz Kazmierczak                                 "triggers in Trigger: "
2351b7e696bSLukasz Kazmierczak                              << id;
2361b7e696bSLukasz Kazmierczak             return false;
2371b7e696bSLukasz Kazmierczak         }
2381b7e696bSLukasz Kazmierczak 
2391b7e696bSLukasz Kazmierczak         json["DiscreteTriggers"] = *discreteTriggers;
2401b7e696bSLukasz Kazmierczak         json["DiscreteTriggerCondition"] =
2411b7e696bSLukasz Kazmierczak             discreteTriggers->empty() ? "Changed" : "Specified";
2421b7e696bSLukasz Kazmierczak         json["MetricType"] = "Discrete";
2431b7e696bSLukasz Kazmierczak     }
2441b7e696bSLukasz Kazmierczak     else
2451b7e696bSLukasz Kazmierczak     {
2461b7e696bSLukasz Kazmierczak         std::optional<nlohmann::json> numericThresholds =
2471b7e696bSLukasz Kazmierczak             getNumericThresholds(*thresholds);
2481b7e696bSLukasz Kazmierczak 
2491b7e696bSLukasz Kazmierczak         if (!numericThresholds)
2501b7e696bSLukasz Kazmierczak         {
2511b7e696bSLukasz Kazmierczak             BMCWEB_LOG_ERROR << "Property Thresholds is invalid for numeric "
2521b7e696bSLukasz Kazmierczak                                 "thresholds in Trigger: "
2531b7e696bSLukasz Kazmierczak                              << id;
2541b7e696bSLukasz Kazmierczak             return false;
2551b7e696bSLukasz Kazmierczak         }
2561b7e696bSLukasz Kazmierczak 
2571b7e696bSLukasz Kazmierczak         json["NumericThresholds"] = *numericThresholds;
2581b7e696bSLukasz Kazmierczak         json["MetricType"] = "Numeric";
2591b7e696bSLukasz Kazmierczak     }
2601b7e696bSLukasz Kazmierczak 
2611b7e696bSLukasz Kazmierczak     std::optional<std::vector<std::string>> triggerActions =
2621b7e696bSLukasz Kazmierczak         getTriggerActions(*actions);
2631b7e696bSLukasz Kazmierczak 
2641b7e696bSLukasz Kazmierczak     if (!triggerActions)
2651b7e696bSLukasz Kazmierczak     {
2661b7e696bSLukasz Kazmierczak         BMCWEB_LOG_ERROR << "Property TriggerActions is invalid in Trigger: "
2671b7e696bSLukasz Kazmierczak                          << id;
2681b7e696bSLukasz Kazmierczak         return false;
2691b7e696bSLukasz Kazmierczak     }
2701b7e696bSLukasz Kazmierczak 
2711b7e696bSLukasz Kazmierczak     json["TriggerActions"] = *triggerActions;
2721b7e696bSLukasz Kazmierczak     json["MetricProperties"] = getMetricProperties(*sensors);
2731b7e696bSLukasz Kazmierczak     json["Links"]["MetricReportDefinitions"] =
2741b7e696bSLukasz Kazmierczak         getMetricReportDefinitions(*reports);
2751b7e696bSLukasz Kazmierczak 
2761b7e696bSLukasz Kazmierczak     return true;
2771b7e696bSLukasz Kazmierczak }
2781b7e696bSLukasz Kazmierczak 
27907148cf2SLukasz Kazmierczak } // namespace telemetry
28007148cf2SLukasz Kazmierczak 
28107148cf2SLukasz Kazmierczak inline void requestRoutesTriggerCollection(App& app)
28207148cf2SLukasz Kazmierczak {
28307148cf2SLukasz Kazmierczak     BMCWEB_ROUTE(app, "/redfish/v1/TelemetryService/Triggers/")
28407148cf2SLukasz Kazmierczak         .privileges(redfish::privileges::getTriggersCollection)
28507148cf2SLukasz Kazmierczak         .methods(boost::beast::http::verb::get)(
286*45ca1b86SEd Tanous             [&app](const crow::Request& req,
28707148cf2SLukasz Kazmierczak                    const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
288*45ca1b86SEd Tanous                 if (!redfish::setUpRedfishRoute(app, req, asyncResp->res))
289*45ca1b86SEd Tanous                 {
290*45ca1b86SEd Tanous                     return;
291*45ca1b86SEd Tanous                 }
29207148cf2SLukasz Kazmierczak                 asyncResp->res.jsonValue["@odata.type"] =
29307148cf2SLukasz Kazmierczak                     "#TriggersCollection.TriggersCollection";
294456cd875SSzymon Dompke                 asyncResp->res.jsonValue["@odata.id"] = telemetry::triggerUri;
29507148cf2SLukasz Kazmierczak                 asyncResp->res.jsonValue["Name"] = "Triggers Collection";
29607148cf2SLukasz Kazmierczak                 const std::vector<const char*> interfaces{
29707148cf2SLukasz Kazmierczak                     telemetry::triggerInterface};
29807148cf2SLukasz Kazmierczak                 collection_util::getCollectionMembers(
29907148cf2SLukasz Kazmierczak                     asyncResp, telemetry::triggerUri, interfaces,
30007148cf2SLukasz Kazmierczak                     "/xyz/openbmc_project/Telemetry/Triggers/TelemetryService");
30107148cf2SLukasz Kazmierczak             });
30207148cf2SLukasz Kazmierczak }
30307148cf2SLukasz Kazmierczak 
3041b7e696bSLukasz Kazmierczak inline void requestRoutesTrigger(App& app)
3051b7e696bSLukasz Kazmierczak {
3061b7e696bSLukasz Kazmierczak     BMCWEB_ROUTE(app, "/redfish/v1/TelemetryService/Triggers/<str>/")
3071b7e696bSLukasz Kazmierczak         .privileges(redfish::privileges::getTriggers)
3081b7e696bSLukasz Kazmierczak         .methods(boost::beast::http::verb::get)(
309*45ca1b86SEd Tanous             [&app](const crow::Request& req,
3101b7e696bSLukasz Kazmierczak                    const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
3111b7e696bSLukasz Kazmierczak                    const std::string& id) {
312*45ca1b86SEd Tanous                 if (!redfish::setUpRedfishRoute(app, req, asyncResp->res))
313*45ca1b86SEd Tanous                 {
314*45ca1b86SEd Tanous                     return;
315*45ca1b86SEd Tanous                 }
3161b7e696bSLukasz Kazmierczak                 crow::connections::systemBus->async_method_call(
3171b7e696bSLukasz Kazmierczak                     [asyncResp,
3181b7e696bSLukasz Kazmierczak                      id](const boost::system::error_code ec,
3191b7e696bSLukasz Kazmierczak                          const std::vector<std::pair<
3201b7e696bSLukasz Kazmierczak                              std::string, telemetry::TriggerGetParamsVariant>>&
3211b7e696bSLukasz Kazmierczak                              ret) {
3221b7e696bSLukasz Kazmierczak                         if (ec.value() == EBADR ||
3231b7e696bSLukasz Kazmierczak                             ec == boost::system::errc::host_unreachable)
3241b7e696bSLukasz Kazmierczak                         {
3251b7e696bSLukasz Kazmierczak                             messages::resourceNotFound(asyncResp->res,
3261b7e696bSLukasz Kazmierczak                                                        "Triggers", id);
3271b7e696bSLukasz Kazmierczak                             return;
3281b7e696bSLukasz Kazmierczak                         }
3291b7e696bSLukasz Kazmierczak                         if (ec)
3301b7e696bSLukasz Kazmierczak                         {
3311b7e696bSLukasz Kazmierczak                             BMCWEB_LOG_ERROR << "respHandler DBus error " << ec;
3321b7e696bSLukasz Kazmierczak                             messages::internalError(asyncResp->res);
3331b7e696bSLukasz Kazmierczak                             return;
3341b7e696bSLukasz Kazmierczak                         }
3351b7e696bSLukasz Kazmierczak 
3361b7e696bSLukasz Kazmierczak                         if (!telemetry::fillTrigger(asyncResp->res.jsonValue,
3371b7e696bSLukasz Kazmierczak                                                     id, ret))
3381b7e696bSLukasz Kazmierczak                         {
3391b7e696bSLukasz Kazmierczak                             messages::internalError(asyncResp->res);
3401b7e696bSLukasz Kazmierczak                         }
3411b7e696bSLukasz Kazmierczak                     },
3421b7e696bSLukasz Kazmierczak                     telemetry::service, telemetry::getDbusTriggerPath(id),
3431b7e696bSLukasz Kazmierczak                     "org.freedesktop.DBus.Properties", "GetAll",
3441b7e696bSLukasz Kazmierczak                     telemetry::triggerInterface);
3451b7e696bSLukasz Kazmierczak             });
346163994a8SSzymon Dompke 
347163994a8SSzymon Dompke     BMCWEB_ROUTE(app, "/redfish/v1/TelemetryService/Triggers/<str>/")
348163994a8SSzymon Dompke         .privileges(redfish::privileges::deleteTriggers)
349163994a8SSzymon Dompke         .methods(boost::beast::http::verb::delete_)(
350*45ca1b86SEd Tanous             [&app](const crow::Request& req,
351163994a8SSzymon Dompke                    const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
352163994a8SSzymon Dompke                    const std::string& id) {
353*45ca1b86SEd Tanous                 if (!redfish::setUpRedfishRoute(app, req, asyncResp->res))
354*45ca1b86SEd Tanous                 {
355*45ca1b86SEd Tanous                     return;
356*45ca1b86SEd Tanous                 }
357163994a8SSzymon Dompke                 const std::string triggerPath =
358163994a8SSzymon Dompke                     telemetry::getDbusTriggerPath(id);
359163994a8SSzymon Dompke 
360163994a8SSzymon Dompke                 crow::connections::systemBus->async_method_call(
361163994a8SSzymon Dompke                     [asyncResp, id](const boost::system::error_code ec) {
362163994a8SSzymon Dompke                         if (ec.value() == EBADR)
363163994a8SSzymon Dompke                         {
364163994a8SSzymon Dompke                             messages::resourceNotFound(asyncResp->res,
365163994a8SSzymon Dompke                                                        "Triggers", id);
366163994a8SSzymon Dompke                             return;
367163994a8SSzymon Dompke                         }
368163994a8SSzymon Dompke 
369163994a8SSzymon Dompke                         if (ec)
370163994a8SSzymon Dompke                         {
371163994a8SSzymon Dompke                             BMCWEB_LOG_ERROR << "respHandler DBus error " << ec;
372163994a8SSzymon Dompke                             messages::internalError(asyncResp->res);
373163994a8SSzymon Dompke                             return;
374163994a8SSzymon Dompke                         }
375163994a8SSzymon Dompke 
376163994a8SSzymon Dompke                         asyncResp->res.result(
377163994a8SSzymon Dompke                             boost::beast::http::status::no_content);
378163994a8SSzymon Dompke                     },
379163994a8SSzymon Dompke                     telemetry::service, triggerPath,
380163994a8SSzymon Dompke                     "xyz.openbmc_project.Object.Delete", "Delete");
381163994a8SSzymon Dompke             });
3821b7e696bSLukasz Kazmierczak }
3831b7e696bSLukasz Kazmierczak 
38407148cf2SLukasz Kazmierczak } // namespace redfish
385