xref: /openbmc/bmcweb/features/redfish/lib/telemetry_service.hpp (revision 45ca1b868e47978a4d2e8ebb680cb384e804c97e)
1081ebf06SWludzik, Jozef #pragma once
2081ebf06SWludzik, Jozef 
3081ebf06SWludzik, Jozef #include "utils/telemetry_utils.hpp"
4081ebf06SWludzik, Jozef 
57e860f15SJohn Edward Broadbent #include <app.hpp>
6168e20c1SEd Tanous #include <dbus_utility.hpp>
7*45ca1b86SEd Tanous #include <query.hpp>
8ed398213SEd Tanous #include <registries/privilege_registry.hpp>
97e860f15SJohn Edward Broadbent 
10081ebf06SWludzik, Jozef namespace redfish
11081ebf06SWludzik, Jozef {
12081ebf06SWludzik, Jozef 
1326bd9b57SJohn Edward Broadbent inline void handleTelemetryServiceGet(
14*45ca1b86SEd Tanous     crow::App& app, const crow::Request& req,
15104f09c9SEd Tanous     const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
16081ebf06SWludzik, Jozef {
17*45ca1b86SEd Tanous     if (!redfish::setUpRedfishRoute(app, req, asyncResp->res))
18*45ca1b86SEd Tanous     {
19*45ca1b86SEd Tanous         return;
20*45ca1b86SEd Tanous     }
218d1b46d7Szhanghch05     asyncResp->res.jsonValue["@odata.type"] =
22081ebf06SWludzik, Jozef         "#TelemetryService.v1_2_1.TelemetryService";
2326bd9b57SJohn Edward Broadbent     asyncResp->res.jsonValue["@odata.id"] = "/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";
3107148cf2SLukasz Kazmierczak     asyncResp->res.jsonValue["Triggers"]["@odata.id"] =
3207148cf2SLukasz Kazmierczak         "/redfish/v1/TelemetryService/Triggers";
33081ebf06SWludzik, Jozef 
34081ebf06SWludzik, Jozef     crow::connections::systemBus->async_method_call(
35b9d36b47SEd Tanous         [asyncResp](const boost::system::error_code ec,
36b9d36b47SEd Tanous                     const dbus::utility::DBusPropertiesMap& 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             }
64e662eae8SEd Tanous             if (maxReports == nullptr || minInterval == nullptr)
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");
80081ebf06SWludzik, Jozef }
8126bd9b57SJohn Edward Broadbent 
8226bd9b57SJohn Edward Broadbent inline void requestRoutesTelemetryService(App& app)
8326bd9b57SJohn Edward Broadbent {
8426bd9b57SJohn Edward Broadbent     BMCWEB_ROUTE(app, "/redfish/v1/TelemetryService/")
8526bd9b57SJohn Edward Broadbent         .privileges(redfish::privileges::getTelemetryService)
86*45ca1b86SEd Tanous         .methods(boost::beast::http::verb::get)(
87*45ca1b86SEd Tanous             std::bind_front(handleTelemetryServiceGet, std::ref(app)));
8826bd9b57SJohn Edward Broadbent }
8926bd9b57SJohn Edward Broadbent 
90081ebf06SWludzik, Jozef } // namespace redfish
91