xref: /openbmc/bmcweb/features/redfish/lib/telemetry_service.hpp (revision 26bd9b57dbabf170a29a7fe151c77f5f01103434)
1081ebf06SWludzik, Jozef #pragma once
2081ebf06SWludzik, Jozef 
3081ebf06SWludzik, Jozef #include "utils/telemetry_utils.hpp"
4081ebf06SWludzik, Jozef 
57e860f15SJohn Edward Broadbent #include <app.hpp>
6ed398213SEd Tanous #include <registries/privilege_registry.hpp>
77e860f15SJohn Edward Broadbent 
8081ebf06SWludzik, Jozef #include <variant>
9081ebf06SWludzik, Jozef 
10081ebf06SWludzik, Jozef namespace redfish
11081ebf06SWludzik, Jozef {
12081ebf06SWludzik, Jozef 
13*26bd9b57SJohn Edward Broadbent inline void handleTelemetryServiceGet(
14*26bd9b57SJohn Edward Broadbent     const crow::Request&, const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
15081ebf06SWludzik, Jozef {
168d1b46d7Szhanghch05     asyncResp->res.jsonValue["@odata.type"] =
17081ebf06SWludzik, Jozef         "#TelemetryService.v1_2_1.TelemetryService";
18*26bd9b57SJohn Edward Broadbent     asyncResp->res.jsonValue["@odata.id"] = "/redfish/v1/TelemetryService";
198d1b46d7Szhanghch05     asyncResp->res.jsonValue["Id"] = "TelemetryService";
208d1b46d7Szhanghch05     asyncResp->res.jsonValue["Name"] = "Telemetry Service";
21081ebf06SWludzik, Jozef 
228d1b46d7Szhanghch05     asyncResp->res.jsonValue["MetricReportDefinitions"]["@odata.id"] =
23081ebf06SWludzik, Jozef         "/redfish/v1/TelemetryService/MetricReportDefinitions";
248d1b46d7Szhanghch05     asyncResp->res.jsonValue["MetricReports"]["@odata.id"] =
25081ebf06SWludzik, Jozef         "/redfish/v1/TelemetryService/MetricReports";
26081ebf06SWludzik, Jozef 
27081ebf06SWludzik, Jozef     crow::connections::systemBus->async_method_call(
28*26bd9b57SJohn Edward Broadbent         [asyncResp](const boost::system::error_code ec,
29081ebf06SWludzik, Jozef                     const std::vector<std::pair<
30081ebf06SWludzik, Jozef                         std::string, std::variant<uint32_t, uint64_t>>>& ret) {
31081ebf06SWludzik, Jozef             if (ec == boost::system::errc::host_unreachable)
32081ebf06SWludzik, Jozef             {
33081ebf06SWludzik, Jozef                 asyncResp->res.jsonValue["Status"]["State"] = "Absent";
34081ebf06SWludzik, Jozef                 return;
35081ebf06SWludzik, Jozef             }
36081ebf06SWludzik, Jozef             if (ec)
37081ebf06SWludzik, Jozef             {
38081ebf06SWludzik, Jozef                 BMCWEB_LOG_ERROR << "respHandler DBus error " << ec;
39081ebf06SWludzik, Jozef                 messages::internalError(asyncResp->res);
40081ebf06SWludzik, Jozef                 return;
41081ebf06SWludzik, Jozef             }
42081ebf06SWludzik, Jozef 
43081ebf06SWludzik, Jozef             asyncResp->res.jsonValue["Status"]["State"] = "Enabled";
44081ebf06SWludzik, Jozef 
45081ebf06SWludzik, Jozef             const size_t* maxReports = nullptr;
46081ebf06SWludzik, Jozef             const uint64_t* minInterval = nullptr;
47081ebf06SWludzik, Jozef             for (const auto& [key, var] : ret)
48081ebf06SWludzik, Jozef             {
49081ebf06SWludzik, Jozef                 if (key == "MaxReports")
50081ebf06SWludzik, Jozef                 {
51081ebf06SWludzik, Jozef                     maxReports = std::get_if<size_t>(&var);
52081ebf06SWludzik, Jozef                 }
53081ebf06SWludzik, Jozef                 else if (key == "MinInterval")
54081ebf06SWludzik, Jozef                 {
55081ebf06SWludzik, Jozef                     minInterval = std::get_if<uint64_t>(&var);
56081ebf06SWludzik, Jozef                 }
57081ebf06SWludzik, Jozef             }
58081ebf06SWludzik, Jozef             if (!maxReports || !minInterval)
59081ebf06SWludzik, Jozef             {
60081ebf06SWludzik, Jozef                 BMCWEB_LOG_ERROR
61081ebf06SWludzik, Jozef                     << "Property type mismatch or property is missing";
62081ebf06SWludzik, Jozef                 messages::internalError(asyncResp->res);
63081ebf06SWludzik, Jozef                 return;
64081ebf06SWludzik, Jozef             }
65081ebf06SWludzik, Jozef 
66081ebf06SWludzik, Jozef             asyncResp->res.jsonValue["MaxReports"] = *maxReports;
67081ebf06SWludzik, Jozef             asyncResp->res.jsonValue["MinCollectionInterval"] =
68081ebf06SWludzik, Jozef                 time_utils::toDurationString(std::chrono::milliseconds(
69081ebf06SWludzik, Jozef                     static_cast<time_t>(*minInterval)));
70081ebf06SWludzik, Jozef         },
71081ebf06SWludzik, Jozef         telemetry::service, "/xyz/openbmc_project/Telemetry/Reports",
72081ebf06SWludzik, Jozef         "org.freedesktop.DBus.Properties", "GetAll",
73081ebf06SWludzik, Jozef         "xyz.openbmc_project.Telemetry.ReportManager");
74081ebf06SWludzik, Jozef }
75*26bd9b57SJohn Edward Broadbent 
76*26bd9b57SJohn Edward Broadbent inline void requestRoutesTelemetryService(App& app)
77*26bd9b57SJohn Edward Broadbent {
78*26bd9b57SJohn Edward Broadbent     BMCWEB_ROUTE(app, "/redfish/v1/TelemetryService/")
79*26bd9b57SJohn Edward Broadbent         .privileges(redfish::privileges::getTelemetryService)
80*26bd9b57SJohn Edward Broadbent         .methods(boost::beast::http::verb::get)(handleTelemetryServiceGet);
81*26bd9b57SJohn Edward Broadbent }
82*26bd9b57SJohn Edward Broadbent 
83081ebf06SWludzik, Jozef } // namespace redfish
84