1*081ebf06SWludzik, Jozef #pragma once 2*081ebf06SWludzik, Jozef 3*081ebf06SWludzik, Jozef #include "node.hpp" 4*081ebf06SWludzik, Jozef #include "utils/telemetry_utils.hpp" 5*081ebf06SWludzik, Jozef 6*081ebf06SWludzik, Jozef #include <variant> 7*081ebf06SWludzik, Jozef 8*081ebf06SWludzik, Jozef namespace redfish 9*081ebf06SWludzik, Jozef { 10*081ebf06SWludzik, Jozef 11*081ebf06SWludzik, Jozef class TelemetryService : public Node 12*081ebf06SWludzik, Jozef { 13*081ebf06SWludzik, Jozef public: 14*081ebf06SWludzik, Jozef TelemetryService(App& app) : Node(app, "/redfish/v1/TelemetryService/") 15*081ebf06SWludzik, Jozef { 16*081ebf06SWludzik, Jozef entityPrivileges = { 17*081ebf06SWludzik, Jozef {boost::beast::http::verb::get, {{"Login"}}}, 18*081ebf06SWludzik, Jozef {boost::beast::http::verb::head, {{"Login"}}}, 19*081ebf06SWludzik, Jozef {boost::beast::http::verb::patch, {{"ConfigureManager"}}}, 20*081ebf06SWludzik, Jozef {boost::beast::http::verb::put, {{"ConfigureManager"}}}, 21*081ebf06SWludzik, Jozef {boost::beast::http::verb::delete_, {{"ConfigureManager"}}}, 22*081ebf06SWludzik, Jozef {boost::beast::http::verb::post, {{"ConfigureManager"}}}}; 23*081ebf06SWludzik, Jozef } 24*081ebf06SWludzik, Jozef 25*081ebf06SWludzik, Jozef private: 26*081ebf06SWludzik, Jozef void doGet(crow::Response& res, const crow::Request&, 27*081ebf06SWludzik, Jozef const std::vector<std::string>&) override 28*081ebf06SWludzik, Jozef { 29*081ebf06SWludzik, Jozef res.jsonValue["@odata.type"] = 30*081ebf06SWludzik, Jozef "#TelemetryService.v1_2_1.TelemetryService"; 31*081ebf06SWludzik, Jozef res.jsonValue["@odata.id"] = "/redfish/v1/TelemetryService"; 32*081ebf06SWludzik, Jozef res.jsonValue["Id"] = "TelemetryService"; 33*081ebf06SWludzik, Jozef res.jsonValue["Name"] = "Telemetry Service"; 34*081ebf06SWludzik, Jozef 35*081ebf06SWludzik, Jozef res.jsonValue["LogService"]["@odata.id"] = 36*081ebf06SWludzik, Jozef "/redfish/v1/Managers/bmc/LogServices/Journal"; 37*081ebf06SWludzik, Jozef res.jsonValue["MetricReportDefinitions"]["@odata.id"] = 38*081ebf06SWludzik, Jozef "/redfish/v1/TelemetryService/MetricReportDefinitions"; 39*081ebf06SWludzik, Jozef res.jsonValue["MetricReports"]["@odata.id"] = 40*081ebf06SWludzik, Jozef "/redfish/v1/TelemetryService/MetricReports"; 41*081ebf06SWludzik, Jozef 42*081ebf06SWludzik, Jozef auto asyncResp = std::make_shared<AsyncResp>(res); 43*081ebf06SWludzik, Jozef crow::connections::systemBus->async_method_call( 44*081ebf06SWludzik, Jozef [asyncResp]( 45*081ebf06SWludzik, Jozef const boost::system::error_code ec, 46*081ebf06SWludzik, Jozef const std::vector<std::pair< 47*081ebf06SWludzik, Jozef std::string, std::variant<uint32_t, uint64_t>>>& ret) { 48*081ebf06SWludzik, Jozef if (ec == boost::system::errc::host_unreachable) 49*081ebf06SWludzik, Jozef { 50*081ebf06SWludzik, Jozef asyncResp->res.jsonValue["Status"]["State"] = "Absent"; 51*081ebf06SWludzik, Jozef return; 52*081ebf06SWludzik, Jozef } 53*081ebf06SWludzik, Jozef if (ec) 54*081ebf06SWludzik, Jozef { 55*081ebf06SWludzik, Jozef BMCWEB_LOG_ERROR << "respHandler DBus error " << ec; 56*081ebf06SWludzik, Jozef messages::internalError(asyncResp->res); 57*081ebf06SWludzik, Jozef return; 58*081ebf06SWludzik, Jozef } 59*081ebf06SWludzik, Jozef 60*081ebf06SWludzik, Jozef asyncResp->res.jsonValue["Status"]["State"] = "Enabled"; 61*081ebf06SWludzik, Jozef 62*081ebf06SWludzik, Jozef const size_t* maxReports = nullptr; 63*081ebf06SWludzik, Jozef const uint64_t* minInterval = nullptr; 64*081ebf06SWludzik, Jozef for (const auto& [key, var] : ret) 65*081ebf06SWludzik, Jozef { 66*081ebf06SWludzik, Jozef if (key == "MaxReports") 67*081ebf06SWludzik, Jozef { 68*081ebf06SWludzik, Jozef maxReports = std::get_if<size_t>(&var); 69*081ebf06SWludzik, Jozef } 70*081ebf06SWludzik, Jozef else if (key == "MinInterval") 71*081ebf06SWludzik, Jozef { 72*081ebf06SWludzik, Jozef minInterval = std::get_if<uint64_t>(&var); 73*081ebf06SWludzik, Jozef } 74*081ebf06SWludzik, Jozef } 75*081ebf06SWludzik, Jozef if (!maxReports || !minInterval) 76*081ebf06SWludzik, Jozef { 77*081ebf06SWludzik, Jozef BMCWEB_LOG_ERROR 78*081ebf06SWludzik, Jozef << "Property type mismatch or property is missing"; 79*081ebf06SWludzik, Jozef messages::internalError(asyncResp->res); 80*081ebf06SWludzik, Jozef return; 81*081ebf06SWludzik, Jozef } 82*081ebf06SWludzik, Jozef 83*081ebf06SWludzik, Jozef asyncResp->res.jsonValue["MaxReports"] = *maxReports; 84*081ebf06SWludzik, Jozef asyncResp->res.jsonValue["MinCollectionInterval"] = 85*081ebf06SWludzik, Jozef time_utils::toDurationString(std::chrono::milliseconds( 86*081ebf06SWludzik, Jozef static_cast<time_t>(*minInterval))); 87*081ebf06SWludzik, Jozef }, 88*081ebf06SWludzik, Jozef telemetry::service, "/xyz/openbmc_project/Telemetry/Reports", 89*081ebf06SWludzik, Jozef "org.freedesktop.DBus.Properties", "GetAll", 90*081ebf06SWludzik, Jozef "xyz.openbmc_project.Telemetry.ReportManager"); 91*081ebf06SWludzik, Jozef } 92*081ebf06SWludzik, Jozef }; 93*081ebf06SWludzik, Jozef } // namespace redfish 94