xref: /openbmc/bmcweb/features/redfish/lib/trigger.hpp (revision ef4c65b741724d724452a3a0efe8dff0d450514a)
107148cf2SLukasz Kazmierczak #pragma once
207148cf2SLukasz Kazmierczak 
33ccb3adbSEd Tanous #include "app.hpp"
43ccb3adbSEd Tanous #include "query.hpp"
53ccb3adbSEd Tanous #include "registries/privilege_registry.hpp"
607148cf2SLukasz Kazmierczak #include "utils/collection.hpp"
73ccb3adbSEd Tanous #include "utils/dbus_utils.hpp"
807148cf2SLukasz Kazmierczak #include "utils/telemetry_utils.hpp"
93ccb3adbSEd Tanous #include "utils/time_utils.hpp"
1007148cf2SLukasz Kazmierczak 
11*ef4c65b7SEd Tanous #include <boost/url/format.hpp>
1289474494SKrzysztof Grobelny #include <sdbusplus/asio/property.hpp>
1389474494SKrzysztof Grobelny #include <sdbusplus/unpack_properties.hpp>
1407148cf2SLukasz Kazmierczak 
157a1dbc48SGeorge Liu #include <array>
167a1dbc48SGeorge Liu #include <string_view>
171b7e696bSLukasz Kazmierczak #include <tuple>
181b7e696bSLukasz Kazmierczak #include <variant>
191b7e696bSLukasz Kazmierczak #include <vector>
201b7e696bSLukasz Kazmierczak 
2107148cf2SLukasz Kazmierczak namespace redfish
2207148cf2SLukasz Kazmierczak {
2307148cf2SLukasz Kazmierczak namespace telemetry
2407148cf2SLukasz Kazmierczak {
2507148cf2SLukasz Kazmierczak constexpr const char* triggerInterface =
2607148cf2SLukasz Kazmierczak     "xyz.openbmc_project.Telemetry.Trigger";
2707148cf2SLukasz Kazmierczak 
281b7e696bSLukasz Kazmierczak using NumericThresholdParams =
291b7e696bSLukasz Kazmierczak     std::tuple<std::string, uint64_t, std::string, double>;
301b7e696bSLukasz Kazmierczak 
311b7e696bSLukasz Kazmierczak using DiscreteThresholdParams =
321b7e696bSLukasz Kazmierczak     std::tuple<std::string, std::string, uint64_t, std::string>;
331b7e696bSLukasz Kazmierczak 
341b7e696bSLukasz Kazmierczak using TriggerThresholdParamsExt =
351b7e696bSLukasz Kazmierczak     std::variant<std::monostate, std::vector<NumericThresholdParams>,
361b7e696bSLukasz Kazmierczak                  std::vector<DiscreteThresholdParams>>;
371b7e696bSLukasz Kazmierczak 
381b7e696bSLukasz Kazmierczak using TriggerSensorsParams =
391b7e696bSLukasz Kazmierczak     std::vector<std::pair<sdbusplus::message::object_path, std::string>>;
401b7e696bSLukasz Kazmierczak 
411b7e696bSLukasz Kazmierczak using TriggerGetParamsVariant =
421b7e696bSLukasz Kazmierczak     std::variant<std::monostate, bool, std::string, TriggerThresholdParamsExt,
433f215c92SSzymon Dompke                  TriggerSensorsParams, std::vector<std::string>,
443f215c92SSzymon Dompke                  std::vector<sdbusplus::message::object_path>>;
451b7e696bSLukasz Kazmierczak 
461b7e696bSLukasz Kazmierczak inline std::optional<std::string>
471b7e696bSLukasz Kazmierczak     getRedfishFromDbusAction(const std::string& dbusAction)
481b7e696bSLukasz Kazmierczak {
491b7e696bSLukasz Kazmierczak     std::optional<std::string> redfishAction = std::nullopt;
501b7e696bSLukasz Kazmierczak     if (dbusAction == "UpdateReport")
511b7e696bSLukasz Kazmierczak     {
521b7e696bSLukasz Kazmierczak         redfishAction = "RedfishMetricReport";
531b7e696bSLukasz Kazmierczak     }
543f215c92SSzymon Dompke     if (dbusAction == "LogToRedfishEventLog")
551b7e696bSLukasz Kazmierczak     {
561b7e696bSLukasz Kazmierczak         redfishAction = "RedfishEvent";
571b7e696bSLukasz Kazmierczak     }
583f215c92SSzymon Dompke     if (dbusAction == "LogToJournal")
591b7e696bSLukasz Kazmierczak     {
601b7e696bSLukasz Kazmierczak         redfishAction = "LogToLogService";
611b7e696bSLukasz Kazmierczak     }
621b7e696bSLukasz Kazmierczak     return redfishAction;
631b7e696bSLukasz Kazmierczak }
641b7e696bSLukasz Kazmierczak 
651b7e696bSLukasz Kazmierczak inline std::optional<std::vector<std::string>>
661b7e696bSLukasz Kazmierczak     getTriggerActions(const std::vector<std::string>& dbusActions)
671b7e696bSLukasz Kazmierczak {
681b7e696bSLukasz Kazmierczak     std::vector<std::string> triggerActions;
691b7e696bSLukasz Kazmierczak     for (const std::string& dbusAction : dbusActions)
701b7e696bSLukasz Kazmierczak     {
711b7e696bSLukasz Kazmierczak         std::optional<std::string> redfishAction =
721b7e696bSLukasz Kazmierczak             getRedfishFromDbusAction(dbusAction);
731b7e696bSLukasz Kazmierczak 
741b7e696bSLukasz Kazmierczak         if (!redfishAction)
751b7e696bSLukasz Kazmierczak         {
761b7e696bSLukasz Kazmierczak             return std::nullopt;
771b7e696bSLukasz Kazmierczak         }
781b7e696bSLukasz Kazmierczak 
791b7e696bSLukasz Kazmierczak         triggerActions.push_back(*redfishAction);
801b7e696bSLukasz Kazmierczak     }
811b7e696bSLukasz Kazmierczak 
823f215c92SSzymon Dompke     return {std::move(triggerActions)};
831b7e696bSLukasz Kazmierczak }
841b7e696bSLukasz Kazmierczak 
853f215c92SSzymon Dompke inline std::optional<nlohmann::json::array_t>
861b7e696bSLukasz Kazmierczak     getDiscreteTriggers(const TriggerThresholdParamsExt& thresholdParams)
871b7e696bSLukasz Kazmierczak {
881b7e696bSLukasz Kazmierczak     const std::vector<DiscreteThresholdParams>* discreteParams =
891b7e696bSLukasz Kazmierczak         std::get_if<std::vector<DiscreteThresholdParams>>(&thresholdParams);
901b7e696bSLukasz Kazmierczak 
91e662eae8SEd Tanous     if (discreteParams == nullptr)
921b7e696bSLukasz Kazmierczak     {
931b7e696bSLukasz Kazmierczak         return std::nullopt;
941b7e696bSLukasz Kazmierczak     }
951b7e696bSLukasz Kazmierczak 
963f215c92SSzymon Dompke     nlohmann::json::array_t triggers;
971b7e696bSLukasz Kazmierczak     for (const auto& [name, severity, dwellTime, value] : *discreteParams)
981b7e696bSLukasz Kazmierczak     {
991b7e696bSLukasz Kazmierczak         std::optional<std::string> duration =
1001b7e696bSLukasz Kazmierczak             time_utils::toDurationStringFromUint(dwellTime);
1011b7e696bSLukasz Kazmierczak 
1021b7e696bSLukasz Kazmierczak         if (!duration)
1031b7e696bSLukasz Kazmierczak         {
1041b7e696bSLukasz Kazmierczak             return std::nullopt;
1051b7e696bSLukasz Kazmierczak         }
106613dabeaSEd Tanous         nlohmann::json::object_t trigger;
107613dabeaSEd Tanous         trigger["Name"] = name;
108613dabeaSEd Tanous         trigger["Severity"] = severity;
109613dabeaSEd Tanous         trigger["DwellTime"] = *duration;
110613dabeaSEd Tanous         trigger["Value"] = value;
111ad539545SPatrick Williams         triggers.emplace_back(std::move(trigger));
1121b7e696bSLukasz Kazmierczak     }
1131b7e696bSLukasz Kazmierczak 
1143f215c92SSzymon Dompke     return {std::move(triggers)};
1151b7e696bSLukasz Kazmierczak }
1161b7e696bSLukasz Kazmierczak 
1171b7e696bSLukasz Kazmierczak inline std::optional<nlohmann::json>
1181b7e696bSLukasz Kazmierczak     getNumericThresholds(const TriggerThresholdParamsExt& thresholdParams)
1191b7e696bSLukasz Kazmierczak {
1201b7e696bSLukasz Kazmierczak     const std::vector<NumericThresholdParams>* numericParams =
1211b7e696bSLukasz Kazmierczak         std::get_if<std::vector<NumericThresholdParams>>(&thresholdParams);
1221b7e696bSLukasz Kazmierczak 
123e662eae8SEd Tanous     if (numericParams == nullptr)
1241b7e696bSLukasz Kazmierczak     {
1251b7e696bSLukasz Kazmierczak         return std::nullopt;
1261b7e696bSLukasz Kazmierczak     }
1271b7e696bSLukasz Kazmierczak 
1283f215c92SSzymon Dompke     nlohmann::json::object_t thresholds;
1291b7e696bSLukasz Kazmierczak     for (const auto& [type, dwellTime, activation, reading] : *numericParams)
1301b7e696bSLukasz Kazmierczak     {
1311b7e696bSLukasz Kazmierczak         std::optional<std::string> duration =
1321b7e696bSLukasz Kazmierczak             time_utils::toDurationStringFromUint(dwellTime);
1331b7e696bSLukasz Kazmierczak 
1341b7e696bSLukasz Kazmierczak         if (!duration)
1351b7e696bSLukasz Kazmierczak         {
1361b7e696bSLukasz Kazmierczak             return std::nullopt;
1371b7e696bSLukasz Kazmierczak         }
1381476687dSEd Tanous         nlohmann::json& threshold = thresholds[type];
1391476687dSEd Tanous         threshold["Reading"] = reading;
1401476687dSEd Tanous         threshold["Activation"] = activation;
1411476687dSEd Tanous         threshold["DwellTime"] = *duration;
1421b7e696bSLukasz Kazmierczak     }
1431b7e696bSLukasz Kazmierczak 
1443f215c92SSzymon Dompke     return {std::move(thresholds)};
1451b7e696bSLukasz Kazmierczak }
1461b7e696bSLukasz Kazmierczak 
1473f215c92SSzymon Dompke inline std::optional<nlohmann::json> getMetricReportDefinitions(
1483f215c92SSzymon Dompke     const std::vector<sdbusplus::message::object_path>& reportPaths)
1491b7e696bSLukasz Kazmierczak {
1501b7e696bSLukasz Kazmierczak     nlohmann::json reports = nlohmann::json::array();
1513f215c92SSzymon Dompke 
1523f215c92SSzymon Dompke     for (const sdbusplus::message::object_path& path : reportPaths)
1531b7e696bSLukasz Kazmierczak     {
1543f215c92SSzymon Dompke         std::string reportId = path.filename();
1553f215c92SSzymon Dompke         if (reportId.empty())
1563f215c92SSzymon Dompke         {
1573f215c92SSzymon Dompke             {
1583f215c92SSzymon Dompke                 BMCWEB_LOG_ERROR << "Property Reports contains invalid value: "
1593f215c92SSzymon Dompke                                  << path.str;
1603f215c92SSzymon Dompke                 return std::nullopt;
1613f215c92SSzymon Dompke             }
1623f215c92SSzymon Dompke         }
1633f215c92SSzymon Dompke 
1641476687dSEd Tanous         nlohmann::json::object_t report;
165*ef4c65b7SEd Tanous         report["@odata.id"] = boost::urls::format(
166*ef4c65b7SEd Tanous             "/redfish/v1/TelemetryService/MetricReportDefinitions/{}",
167*ef4c65b7SEd Tanous             reportId);
168b2ba3072SPatrick Williams         reports.emplace_back(std::move(report));
1691b7e696bSLukasz Kazmierczak     }
1701b7e696bSLukasz Kazmierczak 
1713f215c92SSzymon Dompke     return {std::move(reports)};
1721b7e696bSLukasz Kazmierczak }
1731b7e696bSLukasz Kazmierczak 
1741b7e696bSLukasz Kazmierczak inline std::vector<std::string>
1751b7e696bSLukasz Kazmierczak     getMetricProperties(const TriggerSensorsParams& sensors)
1761b7e696bSLukasz Kazmierczak {
1771b7e696bSLukasz Kazmierczak     std::vector<std::string> metricProperties;
1781b7e696bSLukasz Kazmierczak     metricProperties.reserve(sensors.size());
1791b7e696bSLukasz Kazmierczak     for (const auto& [_, metadata] : sensors)
1801b7e696bSLukasz Kazmierczak     {
1811b7e696bSLukasz Kazmierczak         metricProperties.emplace_back(metadata);
1821b7e696bSLukasz Kazmierczak     }
1831b7e696bSLukasz Kazmierczak 
1841b7e696bSLukasz Kazmierczak     return metricProperties;
1851b7e696bSLukasz Kazmierczak }
1861b7e696bSLukasz Kazmierczak 
1871b7e696bSLukasz Kazmierczak inline bool fillTrigger(
1881b7e696bSLukasz Kazmierczak     nlohmann::json& json, const std::string& id,
1891b7e696bSLukasz Kazmierczak     const std::vector<std::pair<std::string, TriggerGetParamsVariant>>&
1901b7e696bSLukasz Kazmierczak         properties)
1911b7e696bSLukasz Kazmierczak {
1921b7e696bSLukasz Kazmierczak     const std::string* name = nullptr;
1931b7e696bSLukasz Kazmierczak     const bool* discrete = nullptr;
1941b7e696bSLukasz Kazmierczak     const TriggerSensorsParams* sensors = nullptr;
1953f215c92SSzymon Dompke     const std::vector<sdbusplus::message::object_path>* reports = nullptr;
19689474494SKrzysztof Grobelny     const std::vector<std::string>* triggerActions = nullptr;
1971b7e696bSLukasz Kazmierczak     const TriggerThresholdParamsExt* thresholds = nullptr;
1981b7e696bSLukasz Kazmierczak 
19989474494SKrzysztof Grobelny     const bool success = sdbusplus::unpackPropertiesNoThrow(
20089474494SKrzysztof Grobelny         dbus_utils::UnpackErrorPrinter(), properties, "Name", name, "Discrete",
20189474494SKrzysztof Grobelny         discrete, "Sensors", sensors, "Reports", reports, "TriggerActions",
20289474494SKrzysztof Grobelny         triggerActions, "Thresholds", thresholds);
20389474494SKrzysztof Grobelny 
20489474494SKrzysztof Grobelny     if (!success)
2051b7e696bSLukasz Kazmierczak     {
20689474494SKrzysztof Grobelny         return false;
2071b7e696bSLukasz Kazmierczak     }
2081b7e696bSLukasz Kazmierczak 
20989474494SKrzysztof Grobelny     if (triggerActions != nullptr)
21089474494SKrzysztof Grobelny     {
21189474494SKrzysztof Grobelny         std::optional<std::vector<std::string>> redfishTriggerActions =
21289474494SKrzysztof Grobelny             getTriggerActions(*triggerActions);
21389474494SKrzysztof Grobelny         if (!redfishTriggerActions)
2141b7e696bSLukasz Kazmierczak         {
2151b7e696bSLukasz Kazmierczak             BMCWEB_LOG_ERROR
21689474494SKrzysztof Grobelny                 << "Property TriggerActions is invalid in Trigger: " << id;
2171b7e696bSLukasz Kazmierczak             return false;
2181b7e696bSLukasz Kazmierczak         }
21989474494SKrzysztof Grobelny         json["TriggerActions"] = *triggerActions;
22089474494SKrzysztof Grobelny     }
2211b7e696bSLukasz Kazmierczak 
22289474494SKrzysztof Grobelny     if (reports != nullptr)
2233f215c92SSzymon Dompke     {
2243f215c92SSzymon Dompke         std::optional<nlohmann::json> linkedReports =
2253f215c92SSzymon Dompke             getMetricReportDefinitions(*reports);
2263f215c92SSzymon Dompke         if (!linkedReports)
2273f215c92SSzymon Dompke         {
22889474494SKrzysztof Grobelny             BMCWEB_LOG_ERROR << "Property Reports is invalid in Trigger: "
22989474494SKrzysztof Grobelny                              << id;
2303f215c92SSzymon Dompke             return false;
2313f215c92SSzymon Dompke         }
23289474494SKrzysztof Grobelny         json["Links"]["MetricReportDefinitions"] = *linkedReports;
23389474494SKrzysztof Grobelny     }
2341b7e696bSLukasz Kazmierczak 
23589474494SKrzysztof Grobelny     if (discrete != nullptr)
23689474494SKrzysztof Grobelny     {
2371b7e696bSLukasz Kazmierczak         if (*discrete)
2381b7e696bSLukasz Kazmierczak         {
2393f215c92SSzymon Dompke             std::optional<nlohmann::json::array_t> discreteTriggers =
2401b7e696bSLukasz Kazmierczak                 getDiscreteTriggers(*thresholds);
2411b7e696bSLukasz Kazmierczak 
2421b7e696bSLukasz Kazmierczak             if (!discreteTriggers)
2431b7e696bSLukasz Kazmierczak             {
24489474494SKrzysztof Grobelny                 BMCWEB_LOG_ERROR
24589474494SKrzysztof Grobelny                     << "Property Thresholds is invalid for discrete "
2461b7e696bSLukasz Kazmierczak                        "triggers in Trigger: "
2471b7e696bSLukasz Kazmierczak                     << id;
2481b7e696bSLukasz Kazmierczak                 return false;
2491b7e696bSLukasz Kazmierczak             }
2501b7e696bSLukasz Kazmierczak 
2511b7e696bSLukasz Kazmierczak             json["DiscreteTriggers"] = *discreteTriggers;
2521b7e696bSLukasz Kazmierczak             json["DiscreteTriggerCondition"] =
2531b7e696bSLukasz Kazmierczak                 discreteTriggers->empty() ? "Changed" : "Specified";
2541b7e696bSLukasz Kazmierczak             json["MetricType"] = "Discrete";
2551b7e696bSLukasz Kazmierczak         }
2561b7e696bSLukasz Kazmierczak         else
2571b7e696bSLukasz Kazmierczak         {
2581b7e696bSLukasz Kazmierczak             std::optional<nlohmann::json> numericThresholds =
2591b7e696bSLukasz Kazmierczak                 getNumericThresholds(*thresholds);
2601b7e696bSLukasz Kazmierczak 
2611b7e696bSLukasz Kazmierczak             if (!numericThresholds)
2621b7e696bSLukasz Kazmierczak             {
26389474494SKrzysztof Grobelny                 BMCWEB_LOG_ERROR
26489474494SKrzysztof Grobelny                     << "Property Thresholds is invalid for numeric "
2651b7e696bSLukasz Kazmierczak                        "thresholds in Trigger: "
2661b7e696bSLukasz Kazmierczak                     << id;
2671b7e696bSLukasz Kazmierczak                 return false;
2681b7e696bSLukasz Kazmierczak             }
2691b7e696bSLukasz Kazmierczak 
2701b7e696bSLukasz Kazmierczak             json["NumericThresholds"] = *numericThresholds;
2711b7e696bSLukasz Kazmierczak             json["MetricType"] = "Numeric";
2721b7e696bSLukasz Kazmierczak         }
27389474494SKrzysztof Grobelny     }
27489474494SKrzysztof Grobelny 
27589474494SKrzysztof Grobelny     if (name != nullptr)
27689474494SKrzysztof Grobelny     {
27789474494SKrzysztof Grobelny         json["Name"] = *name;
27889474494SKrzysztof Grobelny     }
27989474494SKrzysztof Grobelny 
28089474494SKrzysztof Grobelny     if (sensors != nullptr)
28189474494SKrzysztof Grobelny     {
28289474494SKrzysztof Grobelny         json["MetricProperties"] = getMetricProperties(*sensors);
28389474494SKrzysztof Grobelny     }
2841b7e696bSLukasz Kazmierczak 
2853f215c92SSzymon Dompke     json["@odata.type"] = "#Triggers.v1_2_0.Triggers";
286*ef4c65b7SEd Tanous     json["@odata.id"] =
287*ef4c65b7SEd Tanous         boost::urls::format("/redfish/v1/TelemetryService/Triggers/{}", id);
2883f215c92SSzymon Dompke     json["Id"] = id;
2891b7e696bSLukasz Kazmierczak 
2901b7e696bSLukasz Kazmierczak     return true;
2911b7e696bSLukasz Kazmierczak }
2921b7e696bSLukasz Kazmierczak 
29307148cf2SLukasz Kazmierczak } // namespace telemetry
29407148cf2SLukasz Kazmierczak 
29507148cf2SLukasz Kazmierczak inline void requestRoutesTriggerCollection(App& app)
29607148cf2SLukasz Kazmierczak {
29707148cf2SLukasz Kazmierczak     BMCWEB_ROUTE(app, "/redfish/v1/TelemetryService/Triggers/")
29807148cf2SLukasz Kazmierczak         .privileges(redfish::privileges::getTriggersCollection)
29907148cf2SLukasz Kazmierczak         .methods(boost::beast::http::verb::get)(
30045ca1b86SEd Tanous             [&app](const crow::Request& req,
30107148cf2SLukasz Kazmierczak                    const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
3023ba00073SCarson Labrado         if (!redfish::setUpRedfishRoute(app, req, asyncResp))
30345ca1b86SEd Tanous         {
30445ca1b86SEd Tanous             return;
30545ca1b86SEd Tanous         }
30607148cf2SLukasz Kazmierczak         asyncResp->res.jsonValue["@odata.type"] =
30707148cf2SLukasz Kazmierczak             "#TriggersCollection.TriggersCollection";
308ae9031f0SWilly Tu         asyncResp->res.jsonValue["@odata.id"] =
309ae9031f0SWilly Tu             "/redfish/v1/TelemetryService/Triggers";
31007148cf2SLukasz Kazmierczak         asyncResp->res.jsonValue["Name"] = "Triggers Collection";
3117a1dbc48SGeorge Liu         constexpr std::array<std::string_view, 1> interfaces{
3127a1dbc48SGeorge Liu             telemetry::triggerInterface};
31307148cf2SLukasz Kazmierczak         collection_util::getCollectionMembers(
314ae9031f0SWilly Tu             asyncResp,
315ae9031f0SWilly Tu             boost::urls::url("/redfish/v1/TelemetryService/Triggers"),
316ae9031f0SWilly Tu             interfaces,
31707148cf2SLukasz Kazmierczak             "/xyz/openbmc_project/Telemetry/Triggers/TelemetryService");
31807148cf2SLukasz Kazmierczak         });
31907148cf2SLukasz Kazmierczak }
32007148cf2SLukasz Kazmierczak 
3211b7e696bSLukasz Kazmierczak inline void requestRoutesTrigger(App& app)
3221b7e696bSLukasz Kazmierczak {
3231b7e696bSLukasz Kazmierczak     BMCWEB_ROUTE(app, "/redfish/v1/TelemetryService/Triggers/<str>/")
3241b7e696bSLukasz Kazmierczak         .privileges(redfish::privileges::getTriggers)
3251b7e696bSLukasz Kazmierczak         .methods(boost::beast::http::verb::get)(
32645ca1b86SEd Tanous             [&app](const crow::Request& req,
3271b7e696bSLukasz Kazmierczak                    const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
3281b7e696bSLukasz Kazmierczak                    const std::string& id) {
3293ba00073SCarson Labrado         if (!redfish::setUpRedfishRoute(app, req, asyncResp))
33045ca1b86SEd Tanous         {
33145ca1b86SEd Tanous             return;
33245ca1b86SEd Tanous         }
33389474494SKrzysztof Grobelny         sdbusplus::asio::getAllProperties(
33489474494SKrzysztof Grobelny             *crow::connections::systemBus, telemetry::service,
33589474494SKrzysztof Grobelny             telemetry::getDbusTriggerPath(id), telemetry::triggerInterface,
3361b7e696bSLukasz Kazmierczak             [asyncResp,
3375e7e2dc5SEd Tanous              id](const boost::system::error_code& ec,
3381b7e696bSLukasz Kazmierczak                  const std::vector<std::pair<
339002d39b4SEd Tanous                      std::string, telemetry::TriggerGetParamsVariant>>& ret) {
3401b7e696bSLukasz Kazmierczak             if (ec.value() == EBADR ||
3411b7e696bSLukasz Kazmierczak                 ec == boost::system::errc::host_unreachable)
3421b7e696bSLukasz Kazmierczak             {
343002d39b4SEd Tanous                 messages::resourceNotFound(asyncResp->res, "Triggers", id);
3441b7e696bSLukasz Kazmierczak                 return;
3451b7e696bSLukasz Kazmierczak             }
3461b7e696bSLukasz Kazmierczak             if (ec)
3471b7e696bSLukasz Kazmierczak             {
3481b7e696bSLukasz Kazmierczak                 BMCWEB_LOG_ERROR << "respHandler DBus error " << ec;
3491b7e696bSLukasz Kazmierczak                 messages::internalError(asyncResp->res);
3501b7e696bSLukasz Kazmierczak                 return;
3511b7e696bSLukasz Kazmierczak             }
3521b7e696bSLukasz Kazmierczak 
353002d39b4SEd Tanous             if (!telemetry::fillTrigger(asyncResp->res.jsonValue, id, ret))
3541b7e696bSLukasz Kazmierczak             {
3551b7e696bSLukasz Kazmierczak                 messages::internalError(asyncResp->res);
3561b7e696bSLukasz Kazmierczak             }
35789474494SKrzysztof Grobelny             });
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(
3735e7e2dc5SEd Tanous             [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