xref: /openbmc/bmcweb/features/redfish/include/utils/telemetry_utils.hpp (revision 081ebf06b4c947e828408029273699ff2d49a54f)
1*081ebf06SWludzik, Jozef #pragma once
2*081ebf06SWludzik, Jozef 
3*081ebf06SWludzik, Jozef namespace redfish
4*081ebf06SWludzik, Jozef {
5*081ebf06SWludzik, Jozef 
6*081ebf06SWludzik, Jozef namespace telemetry
7*081ebf06SWludzik, Jozef {
8*081ebf06SWludzik, Jozef 
9*081ebf06SWludzik, Jozef constexpr const char* service = "xyz.openbmc_project.Telemetry";
10*081ebf06SWludzik, Jozef constexpr const char* reportInterface = "xyz.openbmc_project.Telemetry.Report";
11*081ebf06SWludzik, Jozef constexpr const char* metricReportDefinitionUri =
12*081ebf06SWludzik, Jozef     "/redfish/v1/TelemetryService/MetricReportDefinitions/";
13*081ebf06SWludzik, Jozef constexpr const char* metricReportUri =
14*081ebf06SWludzik, Jozef     "/redfish/v1/TelemetryService/MetricReports/";
15*081ebf06SWludzik, Jozef 
16*081ebf06SWludzik, Jozef inline void getReportCollection(const std::shared_ptr<AsyncResp>& asyncResp,
17*081ebf06SWludzik, Jozef                                 const std::string& uri)
18*081ebf06SWludzik, Jozef {
19*081ebf06SWludzik, Jozef     const std::array<const char*, 1> interfaces = {reportInterface};
20*081ebf06SWludzik, Jozef 
21*081ebf06SWludzik, Jozef     crow::connections::systemBus->async_method_call(
22*081ebf06SWludzik, Jozef         [asyncResp, uri](const boost::system::error_code ec,
23*081ebf06SWludzik, Jozef                          const std::vector<std::string>& reports) {
24*081ebf06SWludzik, Jozef             if (ec == boost::system::errc::io_error)
25*081ebf06SWludzik, Jozef             {
26*081ebf06SWludzik, Jozef                 asyncResp->res.jsonValue["Members"] = nlohmann::json::array();
27*081ebf06SWludzik, Jozef                 asyncResp->res.jsonValue["Members@odata.count"] = 0;
28*081ebf06SWludzik, Jozef                 return;
29*081ebf06SWludzik, Jozef             }
30*081ebf06SWludzik, Jozef             if (ec)
31*081ebf06SWludzik, Jozef             {
32*081ebf06SWludzik, Jozef                 BMCWEB_LOG_ERROR << "Dbus method call failed: " << ec;
33*081ebf06SWludzik, Jozef                 messages::internalError(asyncResp->res);
34*081ebf06SWludzik, Jozef                 return;
35*081ebf06SWludzik, Jozef             }
36*081ebf06SWludzik, Jozef 
37*081ebf06SWludzik, Jozef             nlohmann::json& members = asyncResp->res.jsonValue["Members"];
38*081ebf06SWludzik, Jozef             members = nlohmann::json::array();
39*081ebf06SWludzik, Jozef 
40*081ebf06SWludzik, Jozef             for (const std::string& report : reports)
41*081ebf06SWludzik, Jozef             {
42*081ebf06SWludzik, Jozef                 sdbusplus::message::object_path path(report);
43*081ebf06SWludzik, Jozef                 std::string name = path.filename();
44*081ebf06SWludzik, Jozef                 if (name.empty())
45*081ebf06SWludzik, Jozef                 {
46*081ebf06SWludzik, Jozef                     BMCWEB_LOG_ERROR << "Received invalid path: " << report;
47*081ebf06SWludzik, Jozef                     messages::internalError(asyncResp->res);
48*081ebf06SWludzik, Jozef                     return;
49*081ebf06SWludzik, Jozef                 }
50*081ebf06SWludzik, Jozef                 members.push_back({{"@odata.id", uri + name}});
51*081ebf06SWludzik, Jozef             }
52*081ebf06SWludzik, Jozef 
53*081ebf06SWludzik, Jozef             asyncResp->res.jsonValue["Members@odata.count"] = members.size();
54*081ebf06SWludzik, Jozef         },
55*081ebf06SWludzik, Jozef         "xyz.openbmc_project.ObjectMapper",
56*081ebf06SWludzik, Jozef         "/xyz/openbmc_project/object_mapper",
57*081ebf06SWludzik, Jozef         "xyz.openbmc_project.ObjectMapper", "GetSubTreePaths",
58*081ebf06SWludzik, Jozef         "/xyz/openbmc_project/Telemetry/Reports/TelemetryService", 1,
59*081ebf06SWludzik, Jozef         interfaces);
60*081ebf06SWludzik, Jozef }
61*081ebf06SWludzik, Jozef 
62*081ebf06SWludzik, Jozef inline std::string getDbusReportPath(const std::string& id)
63*081ebf06SWludzik, Jozef {
64*081ebf06SWludzik, Jozef     std::string path =
65*081ebf06SWludzik, Jozef         "/xyz/openbmc_project/Telemetry/Reports/TelemetryService/" + id;
66*081ebf06SWludzik, Jozef     dbus::utility::escapePathForDbus(path);
67*081ebf06SWludzik, Jozef     return path;
68*081ebf06SWludzik, Jozef }
69*081ebf06SWludzik, Jozef 
70*081ebf06SWludzik, Jozef } // namespace telemetry
71*081ebf06SWludzik, Jozef } // namespace redfish
72