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