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