xref: /openbmc/bmcweb/features/redfish/lib/telemetry_service.hpp (revision 7e860f1550c8686eec42f7a75bc5f2ef51e756ad)
1081ebf06SWludzik, Jozef #pragma once
2081ebf06SWludzik, Jozef 
3081ebf06SWludzik, Jozef #include "utils/telemetry_utils.hpp"
4081ebf06SWludzik, Jozef 
5*7e860f15SJohn Edward Broadbent #include <app.hpp>
6*7e860f15SJohn Edward Broadbent 
7081ebf06SWludzik, Jozef #include <variant>
8081ebf06SWludzik, Jozef 
9081ebf06SWludzik, Jozef namespace redfish
10081ebf06SWludzik, Jozef {
11081ebf06SWludzik, Jozef 
12*7e860f15SJohn Edward Broadbent inline void requestRoutesTelemetryService(App& app)
13081ebf06SWludzik, Jozef {
14*7e860f15SJohn Edward Broadbent     BMCWEB_ROUTE(app, "/redfish/v1/TelemetryService/")
15*7e860f15SJohn Edward Broadbent         .privileges({"Login"})
16*7e860f15SJohn Edward Broadbent         .methods(
17*7e860f15SJohn Edward Broadbent             boost::beast::http::verb::
18*7e860f15SJohn Edward Broadbent                 get)([](const crow::Request&,
19*7e860f15SJohn Edward Broadbent                         const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
208d1b46d7Szhanghch05             asyncResp->res.jsonValue["@odata.type"] =
21081ebf06SWludzik, Jozef                 "#TelemetryService.v1_2_1.TelemetryService";
22*7e860f15SJohn Edward Broadbent             asyncResp->res.jsonValue["@odata.id"] =
23*7e860f15SJohn Edward Broadbent                 "/redfish/v1/TelemetryService";
248d1b46d7Szhanghch05             asyncResp->res.jsonValue["Id"] = "TelemetryService";
258d1b46d7Szhanghch05             asyncResp->res.jsonValue["Name"] = "Telemetry Service";
26081ebf06SWludzik, Jozef 
278d1b46d7Szhanghch05             asyncResp->res.jsonValue["MetricReportDefinitions"]["@odata.id"] =
28081ebf06SWludzik, Jozef                 "/redfish/v1/TelemetryService/MetricReportDefinitions";
298d1b46d7Szhanghch05             asyncResp->res.jsonValue["MetricReports"]["@odata.id"] =
30081ebf06SWludzik, Jozef                 "/redfish/v1/TelemetryService/MetricReports";
31081ebf06SWludzik, Jozef 
32081ebf06SWludzik, Jozef             crow::connections::systemBus->async_method_call(
33081ebf06SWludzik, Jozef                 [asyncResp](
34081ebf06SWludzik, Jozef                     const boost::system::error_code ec,
35081ebf06SWludzik, Jozef                     const std::vector<std::pair<
36081ebf06SWludzik, Jozef                         std::string, std::variant<uint32_t, uint64_t>>>& ret) {
37081ebf06SWludzik, Jozef                     if (ec == boost::system::errc::host_unreachable)
38081ebf06SWludzik, Jozef                     {
39081ebf06SWludzik, Jozef                         asyncResp->res.jsonValue["Status"]["State"] = "Absent";
40081ebf06SWludzik, Jozef                         return;
41081ebf06SWludzik, Jozef                     }
42081ebf06SWludzik, Jozef                     if (ec)
43081ebf06SWludzik, Jozef                     {
44081ebf06SWludzik, Jozef                         BMCWEB_LOG_ERROR << "respHandler DBus error " << ec;
45081ebf06SWludzik, Jozef                         messages::internalError(asyncResp->res);
46081ebf06SWludzik, Jozef                         return;
47081ebf06SWludzik, Jozef                     }
48081ebf06SWludzik, Jozef 
49081ebf06SWludzik, Jozef                     asyncResp->res.jsonValue["Status"]["State"] = "Enabled";
50081ebf06SWludzik, Jozef 
51081ebf06SWludzik, Jozef                     const size_t* maxReports = nullptr;
52081ebf06SWludzik, Jozef                     const uint64_t* minInterval = nullptr;
53081ebf06SWludzik, Jozef                     for (const auto& [key, var] : ret)
54081ebf06SWludzik, Jozef                     {
55081ebf06SWludzik, Jozef                         if (key == "MaxReports")
56081ebf06SWludzik, Jozef                         {
57081ebf06SWludzik, Jozef                             maxReports = std::get_if<size_t>(&var);
58081ebf06SWludzik, Jozef                         }
59081ebf06SWludzik, Jozef                         else if (key == "MinInterval")
60081ebf06SWludzik, Jozef                         {
61081ebf06SWludzik, Jozef                             minInterval = std::get_if<uint64_t>(&var);
62081ebf06SWludzik, Jozef                         }
63081ebf06SWludzik, Jozef                     }
64081ebf06SWludzik, Jozef                     if (!maxReports || !minInterval)
65081ebf06SWludzik, Jozef                     {
66081ebf06SWludzik, Jozef                         BMCWEB_LOG_ERROR
67081ebf06SWludzik, Jozef                             << "Property type mismatch or property is missing";
68081ebf06SWludzik, Jozef                         messages::internalError(asyncResp->res);
69081ebf06SWludzik, Jozef                         return;
70081ebf06SWludzik, Jozef                     }
71081ebf06SWludzik, Jozef 
72081ebf06SWludzik, Jozef                     asyncResp->res.jsonValue["MaxReports"] = *maxReports;
73081ebf06SWludzik, Jozef                     asyncResp->res.jsonValue["MinCollectionInterval"] =
74081ebf06SWludzik, Jozef                         time_utils::toDurationString(std::chrono::milliseconds(
75081ebf06SWludzik, Jozef                             static_cast<time_t>(*minInterval)));
76081ebf06SWludzik, Jozef                 },
77081ebf06SWludzik, Jozef                 telemetry::service, "/xyz/openbmc_project/Telemetry/Reports",
78081ebf06SWludzik, Jozef                 "org.freedesktop.DBus.Properties", "GetAll",
79081ebf06SWludzik, Jozef                 "xyz.openbmc_project.Telemetry.ReportManager");
80*7e860f15SJohn Edward Broadbent         });
81081ebf06SWludzik, Jozef }
82081ebf06SWludzik, Jozef } // namespace redfish
83