xref: /openbmc/bmcweb/features/redfish/lib/telemetry_service.hpp (revision 8d1b46d7f8d39db2ba048f9e9007106ca3a28c9b)
1081ebf06SWludzik, Jozef #pragma once
2081ebf06SWludzik, Jozef 
3081ebf06SWludzik, Jozef #include "node.hpp"
4081ebf06SWludzik, Jozef #include "utils/telemetry_utils.hpp"
5081ebf06SWludzik, Jozef 
6081ebf06SWludzik, Jozef #include <variant>
7081ebf06SWludzik, Jozef 
8081ebf06SWludzik, Jozef namespace redfish
9081ebf06SWludzik, Jozef {
10081ebf06SWludzik, Jozef 
11081ebf06SWludzik, Jozef class TelemetryService : public Node
12081ebf06SWludzik, Jozef {
13081ebf06SWludzik, Jozef   public:
14081ebf06SWludzik, Jozef     TelemetryService(App& app) : Node(app, "/redfish/v1/TelemetryService/")
15081ebf06SWludzik, Jozef     {
16081ebf06SWludzik, Jozef         entityPrivileges = {
17081ebf06SWludzik, Jozef             {boost::beast::http::verb::get, {{"Login"}}},
18081ebf06SWludzik, Jozef             {boost::beast::http::verb::head, {{"Login"}}},
19081ebf06SWludzik, Jozef             {boost::beast::http::verb::patch, {{"ConfigureManager"}}},
20081ebf06SWludzik, Jozef             {boost::beast::http::verb::put, {{"ConfigureManager"}}},
21081ebf06SWludzik, Jozef             {boost::beast::http::verb::delete_, {{"ConfigureManager"}}},
22081ebf06SWludzik, Jozef             {boost::beast::http::verb::post, {{"ConfigureManager"}}}};
23081ebf06SWludzik, Jozef     }
24081ebf06SWludzik, Jozef 
25081ebf06SWludzik, Jozef   private:
26*8d1b46d7Szhanghch05     void doGet(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
27*8d1b46d7Szhanghch05                const crow::Request&, const std::vector<std::string>&) override
28081ebf06SWludzik, Jozef     {
29*8d1b46d7Szhanghch05         asyncResp->res.jsonValue["@odata.type"] =
30081ebf06SWludzik, Jozef             "#TelemetryService.v1_2_1.TelemetryService";
31*8d1b46d7Szhanghch05         asyncResp->res.jsonValue["@odata.id"] = "/redfish/v1/TelemetryService";
32*8d1b46d7Szhanghch05         asyncResp->res.jsonValue["Id"] = "TelemetryService";
33*8d1b46d7Szhanghch05         asyncResp->res.jsonValue["Name"] = "Telemetry Service";
34081ebf06SWludzik, Jozef 
35*8d1b46d7Szhanghch05         asyncResp->res.jsonValue["MetricReportDefinitions"]["@odata.id"] =
36081ebf06SWludzik, Jozef             "/redfish/v1/TelemetryService/MetricReportDefinitions";
37*8d1b46d7Szhanghch05         asyncResp->res.jsonValue["MetricReports"]["@odata.id"] =
38081ebf06SWludzik, Jozef             "/redfish/v1/TelemetryService/MetricReports";
39081ebf06SWludzik, Jozef 
40081ebf06SWludzik, Jozef         crow::connections::systemBus->async_method_call(
41081ebf06SWludzik, Jozef             [asyncResp](
42081ebf06SWludzik, Jozef                 const boost::system::error_code ec,
43081ebf06SWludzik, Jozef                 const std::vector<std::pair<
44081ebf06SWludzik, Jozef                     std::string, std::variant<uint32_t, uint64_t>>>& ret) {
45081ebf06SWludzik, Jozef                 if (ec == boost::system::errc::host_unreachable)
46081ebf06SWludzik, Jozef                 {
47081ebf06SWludzik, Jozef                     asyncResp->res.jsonValue["Status"]["State"] = "Absent";
48081ebf06SWludzik, Jozef                     return;
49081ebf06SWludzik, Jozef                 }
50081ebf06SWludzik, Jozef                 if (ec)
51081ebf06SWludzik, Jozef                 {
52081ebf06SWludzik, Jozef                     BMCWEB_LOG_ERROR << "respHandler DBus error " << ec;
53081ebf06SWludzik, Jozef                     messages::internalError(asyncResp->res);
54081ebf06SWludzik, Jozef                     return;
55081ebf06SWludzik, Jozef                 }
56081ebf06SWludzik, Jozef 
57081ebf06SWludzik, Jozef                 asyncResp->res.jsonValue["Status"]["State"] = "Enabled";
58081ebf06SWludzik, Jozef 
59081ebf06SWludzik, Jozef                 const size_t* maxReports = nullptr;
60081ebf06SWludzik, Jozef                 const uint64_t* minInterval = nullptr;
61081ebf06SWludzik, Jozef                 for (const auto& [key, var] : ret)
62081ebf06SWludzik, Jozef                 {
63081ebf06SWludzik, Jozef                     if (key == "MaxReports")
64081ebf06SWludzik, Jozef                     {
65081ebf06SWludzik, Jozef                         maxReports = std::get_if<size_t>(&var);
66081ebf06SWludzik, Jozef                     }
67081ebf06SWludzik, Jozef                     else if (key == "MinInterval")
68081ebf06SWludzik, Jozef                     {
69081ebf06SWludzik, Jozef                         minInterval = std::get_if<uint64_t>(&var);
70081ebf06SWludzik, Jozef                     }
71081ebf06SWludzik, Jozef                 }
72081ebf06SWludzik, Jozef                 if (!maxReports || !minInterval)
73081ebf06SWludzik, Jozef                 {
74081ebf06SWludzik, Jozef                     BMCWEB_LOG_ERROR
75081ebf06SWludzik, Jozef                         << "Property type mismatch or property is missing";
76081ebf06SWludzik, Jozef                     messages::internalError(asyncResp->res);
77081ebf06SWludzik, Jozef                     return;
78081ebf06SWludzik, Jozef                 }
79081ebf06SWludzik, Jozef 
80081ebf06SWludzik, Jozef                 asyncResp->res.jsonValue["MaxReports"] = *maxReports;
81081ebf06SWludzik, Jozef                 asyncResp->res.jsonValue["MinCollectionInterval"] =
82081ebf06SWludzik, Jozef                     time_utils::toDurationString(std::chrono::milliseconds(
83081ebf06SWludzik, Jozef                         static_cast<time_t>(*minInterval)));
84081ebf06SWludzik, Jozef             },
85081ebf06SWludzik, Jozef             telemetry::service, "/xyz/openbmc_project/Telemetry/Reports",
86081ebf06SWludzik, Jozef             "org.freedesktop.DBus.Properties", "GetAll",
87081ebf06SWludzik, Jozef             "xyz.openbmc_project.Telemetry.ReportManager");
88081ebf06SWludzik, Jozef     }
89081ebf06SWludzik, Jozef };
90081ebf06SWludzik, Jozef } // namespace redfish
91