xref: /openbmc/bmcweb/features/redfish/lib/telemetry_service.hpp (revision ed3982131dcef2b499da36e674d2d21b2289ef29)
1081ebf06SWludzik, Jozef #pragma once
2081ebf06SWludzik, Jozef 
3081ebf06SWludzik, Jozef #include "utils/telemetry_utils.hpp"
4081ebf06SWludzik, Jozef 
57e860f15SJohn Edward Broadbent #include <app.hpp>
6*ed398213SEd Tanous #include <registries/privilege_registry.hpp>
77e860f15SJohn Edward Broadbent 
8081ebf06SWludzik, Jozef #include <variant>
9081ebf06SWludzik, Jozef 
10081ebf06SWludzik, Jozef namespace redfish
11081ebf06SWludzik, Jozef {
12081ebf06SWludzik, Jozef 
137e860f15SJohn Edward Broadbent inline void requestRoutesTelemetryService(App& app)
14081ebf06SWludzik, Jozef {
157e860f15SJohn Edward Broadbent     BMCWEB_ROUTE(app, "/redfish/v1/TelemetryService/")
16*ed398213SEd Tanous         .privileges(redfish::privileges::getTelemetryService)
177e860f15SJohn Edward Broadbent         .methods(
187e860f15SJohn Edward Broadbent             boost::beast::http::verb::
197e860f15SJohn Edward Broadbent                 get)([](const crow::Request&,
207e860f15SJohn Edward Broadbent                         const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
218d1b46d7Szhanghch05             asyncResp->res.jsonValue["@odata.type"] =
22081ebf06SWludzik, Jozef                 "#TelemetryService.v1_2_1.TelemetryService";
237e860f15SJohn Edward Broadbent             asyncResp->res.jsonValue["@odata.id"] =
247e860f15SJohn Edward Broadbent                 "/redfish/v1/TelemetryService";
258d1b46d7Szhanghch05             asyncResp->res.jsonValue["Id"] = "TelemetryService";
268d1b46d7Szhanghch05             asyncResp->res.jsonValue["Name"] = "Telemetry Service";
27081ebf06SWludzik, Jozef 
288d1b46d7Szhanghch05             asyncResp->res.jsonValue["MetricReportDefinitions"]["@odata.id"] =
29081ebf06SWludzik, Jozef                 "/redfish/v1/TelemetryService/MetricReportDefinitions";
308d1b46d7Szhanghch05             asyncResp->res.jsonValue["MetricReports"]["@odata.id"] =
31081ebf06SWludzik, Jozef                 "/redfish/v1/TelemetryService/MetricReports";
32081ebf06SWludzik, Jozef 
33081ebf06SWludzik, Jozef             crow::connections::systemBus->async_method_call(
34081ebf06SWludzik, Jozef                 [asyncResp](
35081ebf06SWludzik, Jozef                     const boost::system::error_code ec,
36081ebf06SWludzik, Jozef                     const std::vector<std::pair<
37081ebf06SWludzik, Jozef                         std::string, std::variant<uint32_t, uint64_t>>>& ret) {
38081ebf06SWludzik, Jozef                     if (ec == boost::system::errc::host_unreachable)
39081ebf06SWludzik, Jozef                     {
40081ebf06SWludzik, Jozef                         asyncResp->res.jsonValue["Status"]["State"] = "Absent";
41081ebf06SWludzik, Jozef                         return;
42081ebf06SWludzik, Jozef                     }
43081ebf06SWludzik, Jozef                     if (ec)
44081ebf06SWludzik, Jozef                     {
45081ebf06SWludzik, Jozef                         BMCWEB_LOG_ERROR << "respHandler DBus error " << ec;
46081ebf06SWludzik, Jozef                         messages::internalError(asyncResp->res);
47081ebf06SWludzik, Jozef                         return;
48081ebf06SWludzik, Jozef                     }
49081ebf06SWludzik, Jozef 
50081ebf06SWludzik, Jozef                     asyncResp->res.jsonValue["Status"]["State"] = "Enabled";
51081ebf06SWludzik, Jozef 
52081ebf06SWludzik, Jozef                     const size_t* maxReports = nullptr;
53081ebf06SWludzik, Jozef                     const uint64_t* minInterval = nullptr;
54081ebf06SWludzik, Jozef                     for (const auto& [key, var] : ret)
55081ebf06SWludzik, Jozef                     {
56081ebf06SWludzik, Jozef                         if (key == "MaxReports")
57081ebf06SWludzik, Jozef                         {
58081ebf06SWludzik, Jozef                             maxReports = std::get_if<size_t>(&var);
59081ebf06SWludzik, Jozef                         }
60081ebf06SWludzik, Jozef                         else if (key == "MinInterval")
61081ebf06SWludzik, Jozef                         {
62081ebf06SWludzik, Jozef                             minInterval = std::get_if<uint64_t>(&var);
63081ebf06SWludzik, Jozef                         }
64081ebf06SWludzik, Jozef                     }
65081ebf06SWludzik, Jozef                     if (!maxReports || !minInterval)
66081ebf06SWludzik, Jozef                     {
67081ebf06SWludzik, Jozef                         BMCWEB_LOG_ERROR
68081ebf06SWludzik, Jozef                             << "Property type mismatch or property is missing";
69081ebf06SWludzik, Jozef                         messages::internalError(asyncResp->res);
70081ebf06SWludzik, Jozef                         return;
71081ebf06SWludzik, Jozef                     }
72081ebf06SWludzik, Jozef 
73081ebf06SWludzik, Jozef                     asyncResp->res.jsonValue["MaxReports"] = *maxReports;
74081ebf06SWludzik, Jozef                     asyncResp->res.jsonValue["MinCollectionInterval"] =
75081ebf06SWludzik, Jozef                         time_utils::toDurationString(std::chrono::milliseconds(
76081ebf06SWludzik, Jozef                             static_cast<time_t>(*minInterval)));
77081ebf06SWludzik, Jozef                 },
78081ebf06SWludzik, Jozef                 telemetry::service, "/xyz/openbmc_project/Telemetry/Reports",
79081ebf06SWludzik, Jozef                 "org.freedesktop.DBus.Properties", "GetAll",
80081ebf06SWludzik, Jozef                 "xyz.openbmc_project.Telemetry.ReportManager");
817e860f15SJohn Edward Broadbent         });
82081ebf06SWludzik, Jozef }
83081ebf06SWludzik, Jozef } // namespace redfish
84