xref: /openbmc/bmcweb/redfish-core/lib/trigger.hpp (revision 1b7e696bb97d12125117f71c9d710cd482a54c85)
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