xref: /openbmc/bmcweb/features/redfish/lib/telemetry_service.hpp (revision 45ca1b868e47978a4d2e8ebb680cb384e804c97e)
1 #pragma once
2 
3 #include "utils/telemetry_utils.hpp"
4 
5 #include <app.hpp>
6 #include <dbus_utility.hpp>
7 #include <query.hpp>
8 #include <registries/privilege_registry.hpp>
9 
10 namespace redfish
11 {
12 
13 inline void handleTelemetryServiceGet(
14     crow::App& app, const crow::Request& req,
15     const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
16 {
17     if (!redfish::setUpRedfishRoute(app, req, asyncResp->res))
18     {
19         return;
20     }
21     asyncResp->res.jsonValue["@odata.type"] =
22         "#TelemetryService.v1_2_1.TelemetryService";
23     asyncResp->res.jsonValue["@odata.id"] = "/redfish/v1/TelemetryService";
24     asyncResp->res.jsonValue["Id"] = "TelemetryService";
25     asyncResp->res.jsonValue["Name"] = "Telemetry Service";
26 
27     asyncResp->res.jsonValue["MetricReportDefinitions"]["@odata.id"] =
28         "/redfish/v1/TelemetryService/MetricReportDefinitions";
29     asyncResp->res.jsonValue["MetricReports"]["@odata.id"] =
30         "/redfish/v1/TelemetryService/MetricReports";
31     asyncResp->res.jsonValue["Triggers"]["@odata.id"] =
32         "/redfish/v1/TelemetryService/Triggers";
33 
34     crow::connections::systemBus->async_method_call(
35         [asyncResp](const boost::system::error_code ec,
36                     const dbus::utility::DBusPropertiesMap& ret) {
37             if (ec == boost::system::errc::host_unreachable)
38             {
39                 asyncResp->res.jsonValue["Status"]["State"] = "Absent";
40                 return;
41             }
42             if (ec)
43             {
44                 BMCWEB_LOG_ERROR << "respHandler DBus error " << ec;
45                 messages::internalError(asyncResp->res);
46                 return;
47             }
48 
49             asyncResp->res.jsonValue["Status"]["State"] = "Enabled";
50 
51             const size_t* maxReports = nullptr;
52             const uint64_t* minInterval = nullptr;
53             for (const auto& [key, var] : ret)
54             {
55                 if (key == "MaxReports")
56                 {
57                     maxReports = std::get_if<size_t>(&var);
58                 }
59                 else if (key == "MinInterval")
60                 {
61                     minInterval = std::get_if<uint64_t>(&var);
62                 }
63             }
64             if (maxReports == nullptr || minInterval == nullptr)
65             {
66                 BMCWEB_LOG_ERROR
67                     << "Property type mismatch or property is missing";
68                 messages::internalError(asyncResp->res);
69                 return;
70             }
71 
72             asyncResp->res.jsonValue["MaxReports"] = *maxReports;
73             asyncResp->res.jsonValue["MinCollectionInterval"] =
74                 time_utils::toDurationString(std::chrono::milliseconds(
75                     static_cast<time_t>(*minInterval)));
76         },
77         telemetry::service, "/xyz/openbmc_project/Telemetry/Reports",
78         "org.freedesktop.DBus.Properties", "GetAll",
79         "xyz.openbmc_project.Telemetry.ReportManager");
80 }
81 
82 inline void requestRoutesTelemetryService(App& app)
83 {
84     BMCWEB_ROUTE(app, "/redfish/v1/TelemetryService/")
85         .privileges(redfish::privileges::getTelemetryService)
86         .methods(boost::beast::http::verb::get)(
87             std::bind_front(handleTelemetryServiceGet, std::ref(app)));
88 }
89 
90 } // namespace redfish
91