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> 707148cf2SLukasz Kazmierczak #include <registries/privilege_registry.hpp> 807148cf2SLukasz Kazmierczak 9*1b7e696bSLukasz Kazmierczak #include <tuple> 10*1b7e696bSLukasz Kazmierczak #include <variant> 11*1b7e696bSLukasz Kazmierczak #include <vector> 12*1b7e696bSLukasz Kazmierczak 1307148cf2SLukasz Kazmierczak namespace redfish 1407148cf2SLukasz Kazmierczak { 1507148cf2SLukasz Kazmierczak namespace telemetry 1607148cf2SLukasz Kazmierczak { 1707148cf2SLukasz Kazmierczak constexpr const char* triggerInterface = 1807148cf2SLukasz Kazmierczak "xyz.openbmc_project.Telemetry.Trigger"; 1907148cf2SLukasz Kazmierczak constexpr const char* triggerUri = "/redfish/v1/TelemetryService/Triggers"; 2007148cf2SLukasz Kazmierczak 21*1b7e696bSLukasz Kazmierczak using NumericThresholdParams = 22*1b7e696bSLukasz Kazmierczak std::tuple<std::string, uint64_t, std::string, double>; 23*1b7e696bSLukasz Kazmierczak 24*1b7e696bSLukasz Kazmierczak using DiscreteThresholdParams = 25*1b7e696bSLukasz Kazmierczak std::tuple<std::string, std::string, uint64_t, std::string>; 26*1b7e696bSLukasz Kazmierczak 27*1b7e696bSLukasz Kazmierczak using TriggerThresholdParamsExt = 28*1b7e696bSLukasz Kazmierczak std::variant<std::monostate, std::vector<NumericThresholdParams>, 29*1b7e696bSLukasz Kazmierczak std::vector<DiscreteThresholdParams>>; 30*1b7e696bSLukasz Kazmierczak 31*1b7e696bSLukasz Kazmierczak using TriggerSensorsParams = 32*1b7e696bSLukasz Kazmierczak std::vector<std::pair<sdbusplus::message::object_path, std::string>>; 33*1b7e696bSLukasz Kazmierczak 34*1b7e696bSLukasz Kazmierczak using TriggerGetParamsVariant = 35*1b7e696bSLukasz Kazmierczak std::variant<std::monostate, bool, std::string, TriggerThresholdParamsExt, 36*1b7e696bSLukasz Kazmierczak TriggerSensorsParams, std::vector<std::string>>; 37*1b7e696bSLukasz Kazmierczak 38*1b7e696bSLukasz Kazmierczak inline std::optional<std::string> 39*1b7e696bSLukasz Kazmierczak getRedfishFromDbusAction(const std::string& dbusAction) 40*1b7e696bSLukasz Kazmierczak { 41*1b7e696bSLukasz Kazmierczak std::optional<std::string> redfishAction = std::nullopt; 42*1b7e696bSLukasz Kazmierczak if (dbusAction == "UpdateReport") 43*1b7e696bSLukasz Kazmierczak { 44*1b7e696bSLukasz Kazmierczak redfishAction = "RedfishMetricReport"; 45*1b7e696bSLukasz Kazmierczak } 46*1b7e696bSLukasz Kazmierczak if (dbusAction == "RedfishEvent") 47*1b7e696bSLukasz Kazmierczak { 48*1b7e696bSLukasz Kazmierczak redfishAction = "RedfishEvent"; 49*1b7e696bSLukasz Kazmierczak } 50*1b7e696bSLukasz Kazmierczak if (dbusAction == "LogToLogService") 51*1b7e696bSLukasz Kazmierczak { 52*1b7e696bSLukasz Kazmierczak redfishAction = "LogToLogService"; 53*1b7e696bSLukasz Kazmierczak } 54*1b7e696bSLukasz Kazmierczak return redfishAction; 55*1b7e696bSLukasz Kazmierczak } 56*1b7e696bSLukasz Kazmierczak 57*1b7e696bSLukasz Kazmierczak inline std::optional<std::vector<std::string>> 58*1b7e696bSLukasz Kazmierczak getTriggerActions(const std::vector<std::string>& dbusActions) 59*1b7e696bSLukasz Kazmierczak { 60*1b7e696bSLukasz Kazmierczak std::vector<std::string> triggerActions; 61*1b7e696bSLukasz Kazmierczak for (const std::string& dbusAction : dbusActions) 62*1b7e696bSLukasz Kazmierczak { 63*1b7e696bSLukasz Kazmierczak std::optional<std::string> redfishAction = 64*1b7e696bSLukasz Kazmierczak getRedfishFromDbusAction(dbusAction); 65*1b7e696bSLukasz Kazmierczak 66*1b7e696bSLukasz Kazmierczak if (!redfishAction) 67*1b7e696bSLukasz Kazmierczak { 68*1b7e696bSLukasz Kazmierczak return std::nullopt; 69*1b7e696bSLukasz Kazmierczak } 70*1b7e696bSLukasz Kazmierczak 71*1b7e696bSLukasz Kazmierczak triggerActions.push_back(*redfishAction); 72*1b7e696bSLukasz Kazmierczak } 73*1b7e696bSLukasz Kazmierczak 74*1b7e696bSLukasz Kazmierczak return std::make_optional(triggerActions); 75*1b7e696bSLukasz Kazmierczak } 76*1b7e696bSLukasz Kazmierczak 77*1b7e696bSLukasz Kazmierczak inline std::optional<nlohmann::json> 78*1b7e696bSLukasz Kazmierczak getDiscreteTriggers(const TriggerThresholdParamsExt& thresholdParams) 79*1b7e696bSLukasz Kazmierczak { 80*1b7e696bSLukasz Kazmierczak const std::vector<DiscreteThresholdParams>* discreteParams = 81*1b7e696bSLukasz Kazmierczak std::get_if<std::vector<DiscreteThresholdParams>>(&thresholdParams); 82*1b7e696bSLukasz Kazmierczak 83*1b7e696bSLukasz Kazmierczak if (!discreteParams) 84*1b7e696bSLukasz Kazmierczak { 85*1b7e696bSLukasz Kazmierczak return std::nullopt; 86*1b7e696bSLukasz Kazmierczak } 87*1b7e696bSLukasz Kazmierczak 88*1b7e696bSLukasz Kazmierczak nlohmann::json triggers = nlohmann::json::array(); 89*1b7e696bSLukasz Kazmierczak for (const auto& [name, severity, dwellTime, value] : *discreteParams) 90*1b7e696bSLukasz Kazmierczak { 91*1b7e696bSLukasz Kazmierczak std::optional<std::string> duration = 92*1b7e696bSLukasz Kazmierczak time_utils::toDurationStringFromUint(dwellTime); 93*1b7e696bSLukasz Kazmierczak 94*1b7e696bSLukasz Kazmierczak if (!duration) 95*1b7e696bSLukasz Kazmierczak { 96*1b7e696bSLukasz Kazmierczak return std::nullopt; 97*1b7e696bSLukasz Kazmierczak } 98*1b7e696bSLukasz Kazmierczak 99*1b7e696bSLukasz Kazmierczak triggers.push_back({ 100*1b7e696bSLukasz Kazmierczak {"Name", name}, 101*1b7e696bSLukasz Kazmierczak {"Severity", severity}, 102*1b7e696bSLukasz Kazmierczak {"DwellTime", *duration}, 103*1b7e696bSLukasz Kazmierczak {"Value", value}, 104*1b7e696bSLukasz Kazmierczak }); 105*1b7e696bSLukasz Kazmierczak } 106*1b7e696bSLukasz Kazmierczak 107*1b7e696bSLukasz Kazmierczak return std::make_optional(triggers); 108*1b7e696bSLukasz Kazmierczak } 109*1b7e696bSLukasz Kazmierczak 110*1b7e696bSLukasz Kazmierczak inline std::optional<nlohmann::json> 111*1b7e696bSLukasz Kazmierczak getNumericThresholds(const TriggerThresholdParamsExt& thresholdParams) 112*1b7e696bSLukasz Kazmierczak { 113*1b7e696bSLukasz Kazmierczak const std::vector<NumericThresholdParams>* numericParams = 114*1b7e696bSLukasz Kazmierczak std::get_if<std::vector<NumericThresholdParams>>(&thresholdParams); 115*1b7e696bSLukasz Kazmierczak 116*1b7e696bSLukasz Kazmierczak if (!numericParams) 117*1b7e696bSLukasz Kazmierczak { 118*1b7e696bSLukasz Kazmierczak return std::nullopt; 119*1b7e696bSLukasz Kazmierczak } 120*1b7e696bSLukasz Kazmierczak 121*1b7e696bSLukasz Kazmierczak nlohmann::json thresholds; 122*1b7e696bSLukasz Kazmierczak for (const auto& [type, dwellTime, activation, reading] : *numericParams) 123*1b7e696bSLukasz Kazmierczak { 124*1b7e696bSLukasz Kazmierczak std::optional<std::string> duration = 125*1b7e696bSLukasz Kazmierczak time_utils::toDurationStringFromUint(dwellTime); 126*1b7e696bSLukasz Kazmierczak 127*1b7e696bSLukasz Kazmierczak if (!duration) 128*1b7e696bSLukasz Kazmierczak { 129*1b7e696bSLukasz Kazmierczak return std::nullopt; 130*1b7e696bSLukasz Kazmierczak } 131*1b7e696bSLukasz Kazmierczak 132*1b7e696bSLukasz Kazmierczak thresholds[type] = {{"Reading", reading}, 133*1b7e696bSLukasz Kazmierczak {"Activation", activation}, 134*1b7e696bSLukasz Kazmierczak {"DwellTime", *duration}}; 135*1b7e696bSLukasz Kazmierczak } 136*1b7e696bSLukasz Kazmierczak 137*1b7e696bSLukasz Kazmierczak return std::make_optional(thresholds); 138*1b7e696bSLukasz Kazmierczak } 139*1b7e696bSLukasz Kazmierczak 140*1b7e696bSLukasz Kazmierczak nlohmann::json 141*1b7e696bSLukasz Kazmierczak getMetricReportDefinitions(const std::vector<std::string>& reportNames) 142*1b7e696bSLukasz Kazmierczak { 143*1b7e696bSLukasz Kazmierczak nlohmann::json reports = nlohmann::json::array(); 144*1b7e696bSLukasz Kazmierczak for (const std::string& name : reportNames) 145*1b7e696bSLukasz Kazmierczak { 146*1b7e696bSLukasz Kazmierczak reports.push_back({ 147*1b7e696bSLukasz Kazmierczak {"@odata.id", metricReportDefinitionUri + std::string("/") + name}, 148*1b7e696bSLukasz Kazmierczak }); 149*1b7e696bSLukasz Kazmierczak } 150*1b7e696bSLukasz Kazmierczak 151*1b7e696bSLukasz Kazmierczak return reports; 152*1b7e696bSLukasz Kazmierczak } 153*1b7e696bSLukasz Kazmierczak 154*1b7e696bSLukasz Kazmierczak inline std::vector<std::string> 155*1b7e696bSLukasz Kazmierczak getMetricProperties(const TriggerSensorsParams& sensors) 156*1b7e696bSLukasz Kazmierczak { 157*1b7e696bSLukasz Kazmierczak std::vector<std::string> metricProperties; 158*1b7e696bSLukasz Kazmierczak metricProperties.reserve(sensors.size()); 159*1b7e696bSLukasz Kazmierczak for (const auto& [_, metadata] : sensors) 160*1b7e696bSLukasz Kazmierczak { 161*1b7e696bSLukasz Kazmierczak metricProperties.emplace_back(metadata); 162*1b7e696bSLukasz Kazmierczak } 163*1b7e696bSLukasz Kazmierczak 164*1b7e696bSLukasz Kazmierczak return metricProperties; 165*1b7e696bSLukasz Kazmierczak } 166*1b7e696bSLukasz Kazmierczak 167*1b7e696bSLukasz Kazmierczak inline bool fillTrigger( 168*1b7e696bSLukasz Kazmierczak nlohmann::json& json, const std::string& id, 169*1b7e696bSLukasz Kazmierczak const std::vector<std::pair<std::string, TriggerGetParamsVariant>>& 170*1b7e696bSLukasz Kazmierczak properties) 171*1b7e696bSLukasz Kazmierczak { 172*1b7e696bSLukasz Kazmierczak const std::string* name = nullptr; 173*1b7e696bSLukasz Kazmierczak const bool* discrete = nullptr; 174*1b7e696bSLukasz Kazmierczak const TriggerSensorsParams* sensors = nullptr; 175*1b7e696bSLukasz Kazmierczak const std::vector<std::string>* reports = nullptr; 176*1b7e696bSLukasz Kazmierczak const std::vector<std::string>* actions = nullptr; 177*1b7e696bSLukasz Kazmierczak const TriggerThresholdParamsExt* thresholds = nullptr; 178*1b7e696bSLukasz Kazmierczak 179*1b7e696bSLukasz Kazmierczak for (const auto& [key, var] : properties) 180*1b7e696bSLukasz Kazmierczak { 181*1b7e696bSLukasz Kazmierczak if (key == "Name") 182*1b7e696bSLukasz Kazmierczak { 183*1b7e696bSLukasz Kazmierczak name = std::get_if<std::string>(&var); 184*1b7e696bSLukasz Kazmierczak } 185*1b7e696bSLukasz Kazmierczak else if (key == "Discrete") 186*1b7e696bSLukasz Kazmierczak { 187*1b7e696bSLukasz Kazmierczak discrete = std::get_if<bool>(&var); 188*1b7e696bSLukasz Kazmierczak } 189*1b7e696bSLukasz Kazmierczak else if (key == "Sensors") 190*1b7e696bSLukasz Kazmierczak { 191*1b7e696bSLukasz Kazmierczak sensors = std::get_if<TriggerSensorsParams>(&var); 192*1b7e696bSLukasz Kazmierczak } 193*1b7e696bSLukasz Kazmierczak else if (key == "ReportNames") 194*1b7e696bSLukasz Kazmierczak { 195*1b7e696bSLukasz Kazmierczak reports = std::get_if<std::vector<std::string>>(&var); 196*1b7e696bSLukasz Kazmierczak } 197*1b7e696bSLukasz Kazmierczak else if (key == "TriggerActions") 198*1b7e696bSLukasz Kazmierczak { 199*1b7e696bSLukasz Kazmierczak actions = std::get_if<std::vector<std::string>>(&var); 200*1b7e696bSLukasz Kazmierczak } 201*1b7e696bSLukasz Kazmierczak else if (key == "Thresholds") 202*1b7e696bSLukasz Kazmierczak { 203*1b7e696bSLukasz Kazmierczak thresholds = std::get_if<TriggerThresholdParamsExt>(&var); 204*1b7e696bSLukasz Kazmierczak } 205*1b7e696bSLukasz Kazmierczak } 206*1b7e696bSLukasz Kazmierczak 207*1b7e696bSLukasz Kazmierczak if (!name || !discrete || !sensors || !reports || !actions || !thresholds) 208*1b7e696bSLukasz Kazmierczak { 209*1b7e696bSLukasz Kazmierczak BMCWEB_LOG_ERROR 210*1b7e696bSLukasz Kazmierczak << "Property type mismatch or property is missing in Trigger: " 211*1b7e696bSLukasz Kazmierczak << id; 212*1b7e696bSLukasz Kazmierczak return false; 213*1b7e696bSLukasz Kazmierczak } 214*1b7e696bSLukasz Kazmierczak 215*1b7e696bSLukasz Kazmierczak json["@odata.type"] = "#Triggers.v1_2_0.Triggers"; 216*1b7e696bSLukasz Kazmierczak json["@odata.id"] = triggerUri + std::string("/") + id; 217*1b7e696bSLukasz Kazmierczak json["Id"] = id; 218*1b7e696bSLukasz Kazmierczak json["Name"] = *name; 219*1b7e696bSLukasz Kazmierczak 220*1b7e696bSLukasz Kazmierczak if (*discrete) 221*1b7e696bSLukasz Kazmierczak { 222*1b7e696bSLukasz Kazmierczak std::optional<nlohmann::json> discreteTriggers = 223*1b7e696bSLukasz Kazmierczak getDiscreteTriggers(*thresholds); 224*1b7e696bSLukasz Kazmierczak 225*1b7e696bSLukasz Kazmierczak if (!discreteTriggers) 226*1b7e696bSLukasz Kazmierczak { 227*1b7e696bSLukasz Kazmierczak BMCWEB_LOG_ERROR << "Property Thresholds is invalid for discrete " 228*1b7e696bSLukasz Kazmierczak "triggers in Trigger: " 229*1b7e696bSLukasz Kazmierczak << id; 230*1b7e696bSLukasz Kazmierczak return false; 231*1b7e696bSLukasz Kazmierczak } 232*1b7e696bSLukasz Kazmierczak 233*1b7e696bSLukasz Kazmierczak json["DiscreteTriggers"] = *discreteTriggers; 234*1b7e696bSLukasz Kazmierczak json["DiscreteTriggerCondition"] = 235*1b7e696bSLukasz Kazmierczak discreteTriggers->empty() ? "Changed" : "Specified"; 236*1b7e696bSLukasz Kazmierczak json["MetricType"] = "Discrete"; 237*1b7e696bSLukasz Kazmierczak } 238*1b7e696bSLukasz Kazmierczak else 239*1b7e696bSLukasz Kazmierczak { 240*1b7e696bSLukasz Kazmierczak std::optional<nlohmann::json> numericThresholds = 241*1b7e696bSLukasz Kazmierczak getNumericThresholds(*thresholds); 242*1b7e696bSLukasz Kazmierczak 243*1b7e696bSLukasz Kazmierczak if (!numericThresholds) 244*1b7e696bSLukasz Kazmierczak { 245*1b7e696bSLukasz Kazmierczak BMCWEB_LOG_ERROR << "Property Thresholds is invalid for numeric " 246*1b7e696bSLukasz Kazmierczak "thresholds in Trigger: " 247*1b7e696bSLukasz Kazmierczak << id; 248*1b7e696bSLukasz Kazmierczak return false; 249*1b7e696bSLukasz Kazmierczak } 250*1b7e696bSLukasz Kazmierczak 251*1b7e696bSLukasz Kazmierczak json["NumericThresholds"] = *numericThresholds; 252*1b7e696bSLukasz Kazmierczak json["MetricType"] = "Numeric"; 253*1b7e696bSLukasz Kazmierczak } 254*1b7e696bSLukasz Kazmierczak 255*1b7e696bSLukasz Kazmierczak std::optional<std::vector<std::string>> triggerActions = 256*1b7e696bSLukasz Kazmierczak getTriggerActions(*actions); 257*1b7e696bSLukasz Kazmierczak 258*1b7e696bSLukasz Kazmierczak if (!triggerActions) 259*1b7e696bSLukasz Kazmierczak { 260*1b7e696bSLukasz Kazmierczak BMCWEB_LOG_ERROR << "Property TriggerActions is invalid in Trigger: " 261*1b7e696bSLukasz Kazmierczak << id; 262*1b7e696bSLukasz Kazmierczak return false; 263*1b7e696bSLukasz Kazmierczak } 264*1b7e696bSLukasz Kazmierczak 265*1b7e696bSLukasz Kazmierczak json["TriggerActions"] = *triggerActions; 266*1b7e696bSLukasz Kazmierczak json["MetricProperties"] = getMetricProperties(*sensors); 267*1b7e696bSLukasz Kazmierczak json["Links"]["MetricReportDefinitions"] = 268*1b7e696bSLukasz Kazmierczak getMetricReportDefinitions(*reports); 269*1b7e696bSLukasz Kazmierczak 270*1b7e696bSLukasz Kazmierczak return true; 271*1b7e696bSLukasz Kazmierczak } 272*1b7e696bSLukasz Kazmierczak 273*1b7e696bSLukasz Kazmierczak inline std::string getDbusTriggerPath(const std::string& id) 274*1b7e696bSLukasz Kazmierczak { 275*1b7e696bSLukasz Kazmierczak sdbusplus::message::object_path path( 276*1b7e696bSLukasz Kazmierczak "/xyz/openbmc_project/Telemetry/Triggers/TelemetryService"); 277*1b7e696bSLukasz Kazmierczak return {path / id}; 278*1b7e696bSLukasz Kazmierczak } 279*1b7e696bSLukasz Kazmierczak 28007148cf2SLukasz Kazmierczak } // namespace telemetry 28107148cf2SLukasz Kazmierczak 28207148cf2SLukasz Kazmierczak inline void requestRoutesTriggerCollection(App& app) 28307148cf2SLukasz Kazmierczak { 28407148cf2SLukasz Kazmierczak BMCWEB_ROUTE(app, "/redfish/v1/TelemetryService/Triggers/") 28507148cf2SLukasz Kazmierczak .privileges(redfish::privileges::getTriggersCollection) 28607148cf2SLukasz Kazmierczak .methods(boost::beast::http::verb::get)( 28707148cf2SLukasz Kazmierczak [](const crow::Request&, 28807148cf2SLukasz Kazmierczak const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) { 28907148cf2SLukasz Kazmierczak asyncResp->res.jsonValue["@odata.type"] = 29007148cf2SLukasz Kazmierczak "#TriggersCollection.TriggersCollection"; 29107148cf2SLukasz Kazmierczak asyncResp->res.jsonValue["@odata.id"] = 29207148cf2SLukasz Kazmierczak "/redfish/v1/TelemetryService/Triggers"; 29307148cf2SLukasz Kazmierczak asyncResp->res.jsonValue["Name"] = "Triggers Collection"; 29407148cf2SLukasz Kazmierczak const std::vector<const char*> interfaces{ 29507148cf2SLukasz Kazmierczak telemetry::triggerInterface}; 29607148cf2SLukasz Kazmierczak collection_util::getCollectionMembers( 29707148cf2SLukasz Kazmierczak asyncResp, telemetry::triggerUri, interfaces, 29807148cf2SLukasz Kazmierczak "/xyz/openbmc_project/Telemetry/Triggers/TelemetryService"); 29907148cf2SLukasz Kazmierczak }); 30007148cf2SLukasz Kazmierczak } 30107148cf2SLukasz Kazmierczak 302*1b7e696bSLukasz Kazmierczak inline void requestRoutesTrigger(App& app) 303*1b7e696bSLukasz Kazmierczak { 304*1b7e696bSLukasz Kazmierczak BMCWEB_ROUTE(app, "/redfish/v1/TelemetryService/Triggers/<str>/") 305*1b7e696bSLukasz Kazmierczak .privileges(redfish::privileges::getTriggers) 306*1b7e696bSLukasz Kazmierczak .methods(boost::beast::http::verb::get)( 307*1b7e696bSLukasz Kazmierczak [](const crow::Request&, 308*1b7e696bSLukasz Kazmierczak const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 309*1b7e696bSLukasz Kazmierczak const std::string& id) { 310*1b7e696bSLukasz Kazmierczak crow::connections::systemBus->async_method_call( 311*1b7e696bSLukasz Kazmierczak [asyncResp, 312*1b7e696bSLukasz Kazmierczak id](const boost::system::error_code ec, 313*1b7e696bSLukasz Kazmierczak const std::vector<std::pair< 314*1b7e696bSLukasz Kazmierczak std::string, telemetry::TriggerGetParamsVariant>>& 315*1b7e696bSLukasz Kazmierczak ret) { 316*1b7e696bSLukasz Kazmierczak if (ec.value() == EBADR || 317*1b7e696bSLukasz Kazmierczak ec == boost::system::errc::host_unreachable) 318*1b7e696bSLukasz Kazmierczak { 319*1b7e696bSLukasz Kazmierczak messages::resourceNotFound(asyncResp->res, 320*1b7e696bSLukasz Kazmierczak "Triggers", id); 321*1b7e696bSLukasz Kazmierczak return; 322*1b7e696bSLukasz Kazmierczak } 323*1b7e696bSLukasz Kazmierczak if (ec) 324*1b7e696bSLukasz Kazmierczak { 325*1b7e696bSLukasz Kazmierczak BMCWEB_LOG_ERROR << "respHandler DBus error " << ec; 326*1b7e696bSLukasz Kazmierczak messages::internalError(asyncResp->res); 327*1b7e696bSLukasz Kazmierczak return; 328*1b7e696bSLukasz Kazmierczak } 329*1b7e696bSLukasz Kazmierczak 330*1b7e696bSLukasz Kazmierczak if (!telemetry::fillTrigger(asyncResp->res.jsonValue, 331*1b7e696bSLukasz Kazmierczak id, ret)) 332*1b7e696bSLukasz Kazmierczak { 333*1b7e696bSLukasz Kazmierczak messages::internalError(asyncResp->res); 334*1b7e696bSLukasz Kazmierczak } 335*1b7e696bSLukasz Kazmierczak }, 336*1b7e696bSLukasz Kazmierczak telemetry::service, telemetry::getDbusTriggerPath(id), 337*1b7e696bSLukasz Kazmierczak "org.freedesktop.DBus.Properties", "GetAll", 338*1b7e696bSLukasz Kazmierczak telemetry::triggerInterface); 339*1b7e696bSLukasz Kazmierczak }); 340*1b7e696bSLukasz Kazmierczak } 341*1b7e696bSLukasz Kazmierczak 34207148cf2SLukasz Kazmierczak } // namespace redfish 343