xref: /openbmc/bmcweb/features/redfish/lib/telemetry_service.hpp (revision e662eae819f545ef07193f216b42e161b7ff7a46)
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>
7ed398213SEd Tanous #include <registries/privilege_registry.hpp>
87e860f15SJohn Edward Broadbent 
9081ebf06SWludzik, Jozef namespace redfish
10081ebf06SWludzik, Jozef {
11081ebf06SWludzik, Jozef 
1226bd9b57SJohn Edward Broadbent inline void handleTelemetryServiceGet(
13104f09c9SEd Tanous     const crow::Request& /*req*/,
14104f09c9SEd Tanous     const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
15081ebf06SWludzik, Jozef {
168d1b46d7Szhanghch05     asyncResp->res.jsonValue["@odata.type"] =
17081ebf06SWludzik, Jozef         "#TelemetryService.v1_2_1.TelemetryService";
1826bd9b57SJohn 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";
2607148cf2SLukasz Kazmierczak     asyncResp->res.jsonValue["Triggers"]["@odata.id"] =
2707148cf2SLukasz Kazmierczak         "/redfish/v1/TelemetryService/Triggers";
28081ebf06SWludzik, Jozef 
29081ebf06SWludzik, Jozef     crow::connections::systemBus->async_method_call(
30168e20c1SEd Tanous         [asyncResp](
31168e20c1SEd Tanous             const boost::system::error_code ec,
32168e20c1SEd Tanous             const std::vector<
33168e20c1SEd Tanous                 std::pair<std::string, dbus::utility::DbusVariantType>>& ret) {
34081ebf06SWludzik, Jozef             if (ec == boost::system::errc::host_unreachable)
35081ebf06SWludzik, Jozef             {
36081ebf06SWludzik, Jozef                 asyncResp->res.jsonValue["Status"]["State"] = "Absent";
37081ebf06SWludzik, Jozef                 return;
38081ebf06SWludzik, Jozef             }
39081ebf06SWludzik, Jozef             if (ec)
40081ebf06SWludzik, Jozef             {
41081ebf06SWludzik, Jozef                 BMCWEB_LOG_ERROR << "respHandler DBus error " << ec;
42081ebf06SWludzik, Jozef                 messages::internalError(asyncResp->res);
43081ebf06SWludzik, Jozef                 return;
44081ebf06SWludzik, Jozef             }
45081ebf06SWludzik, Jozef 
46081ebf06SWludzik, Jozef             asyncResp->res.jsonValue["Status"]["State"] = "Enabled";
47081ebf06SWludzik, Jozef 
48081ebf06SWludzik, Jozef             const size_t* maxReports = nullptr;
49081ebf06SWludzik, Jozef             const uint64_t* minInterval = nullptr;
50081ebf06SWludzik, Jozef             for (const auto& [key, var] : ret)
51081ebf06SWludzik, Jozef             {
52081ebf06SWludzik, Jozef                 if (key == "MaxReports")
53081ebf06SWludzik, Jozef                 {
54081ebf06SWludzik, Jozef                     maxReports = std::get_if<size_t>(&var);
55081ebf06SWludzik, Jozef                 }
56081ebf06SWludzik, Jozef                 else if (key == "MinInterval")
57081ebf06SWludzik, Jozef                 {
58081ebf06SWludzik, Jozef                     minInterval = std::get_if<uint64_t>(&var);
59081ebf06SWludzik, Jozef                 }
60081ebf06SWludzik, Jozef             }
61*e662eae8SEd Tanous             if (maxReports == nullptr || minInterval == nullptr)
62081ebf06SWludzik, Jozef             {
63081ebf06SWludzik, Jozef                 BMCWEB_LOG_ERROR
64081ebf06SWludzik, Jozef                     << "Property type mismatch or property is missing";
65081ebf06SWludzik, Jozef                 messages::internalError(asyncResp->res);
66081ebf06SWludzik, Jozef                 return;
67081ebf06SWludzik, Jozef             }
68081ebf06SWludzik, Jozef 
69081ebf06SWludzik, Jozef             asyncResp->res.jsonValue["MaxReports"] = *maxReports;
70081ebf06SWludzik, Jozef             asyncResp->res.jsonValue["MinCollectionInterval"] =
71081ebf06SWludzik, Jozef                 time_utils::toDurationString(std::chrono::milliseconds(
72081ebf06SWludzik, Jozef                     static_cast<time_t>(*minInterval)));
73081ebf06SWludzik, Jozef         },
74081ebf06SWludzik, Jozef         telemetry::service, "/xyz/openbmc_project/Telemetry/Reports",
75081ebf06SWludzik, Jozef         "org.freedesktop.DBus.Properties", "GetAll",
76081ebf06SWludzik, Jozef         "xyz.openbmc_project.Telemetry.ReportManager");
77081ebf06SWludzik, Jozef }
7826bd9b57SJohn Edward Broadbent 
7926bd9b57SJohn Edward Broadbent inline void requestRoutesTelemetryService(App& app)
8026bd9b57SJohn Edward Broadbent {
8126bd9b57SJohn Edward Broadbent     BMCWEB_ROUTE(app, "/redfish/v1/TelemetryService/")
8226bd9b57SJohn Edward Broadbent         .privileges(redfish::privileges::getTelemetryService)
8326bd9b57SJohn Edward Broadbent         .methods(boost::beast::http::verb::get)(handleTelemetryServiceGet);
8426bd9b57SJohn Edward Broadbent }
8526bd9b57SJohn Edward Broadbent 
86081ebf06SWludzik, Jozef } // namespace redfish
87