1 // SPDX-License-Identifier: Apache-2.0 2 // SPDX-FileCopyrightText: Copyright OpenBMC Authors 3 #pragma once 4 5 #include "app.hpp" 6 #include "async_resp.hpp" 7 #include "dbus_singleton.hpp" 8 #include "dbus_utility.hpp" 9 #include "error_messages.hpp" 10 #include "http_request.hpp" 11 #include "logging.hpp" 12 #include "query.hpp" 13 #include "registries/privilege_registry.hpp" 14 #include "telemetry_readings.hpp" 15 #include "utils/collection.hpp" 16 #include "utils/telemetry_utils.hpp" 17 18 #include <asm-generic/errno.h> 19 20 #include <boost/beast/http/verb.hpp> 21 #include <boost/url/format.hpp> 22 #include <boost/url/url.hpp> 23 #include <nlohmann/json.hpp> 24 #include <sdbusplus/asio/property.hpp> 25 26 #include <array> 27 #include <cstdint> 28 #include <memory> 29 #include <string> 30 #include <string_view> 31 #include <utility> 32 33 namespace redfish 34 { 35 36 inline void requestRoutesMetricReportCollection(App& app) 37 { 38 BMCWEB_ROUTE(app, "/redfish/v1/TelemetryService/MetricReports/") 39 .privileges(redfish::privileges::getMetricReportCollection) 40 .methods(boost::beast::http::verb::get)( 41 [&app](const crow::Request& req, 42 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) { 43 if (!redfish::setUpRedfishRoute(app, req, asyncResp)) 44 { 45 return; 46 } 47 48 asyncResp->res.jsonValue["@odata.type"] = 49 "#MetricReportCollection.MetricReportCollection"; 50 asyncResp->res.jsonValue["@odata.id"] = 51 "/redfish/v1/TelemetryService/MetricReports"; 52 asyncResp->res.jsonValue["Name"] = "Metric Report Collection"; 53 constexpr std::array<std::string_view, 1> interfaces{ 54 telemetry::reportInterface}; 55 collection_util::getCollectionMembers( 56 asyncResp, 57 boost::urls::url( 58 "/redfish/v1/TelemetryService/MetricReports"), 59 interfaces, 60 "/xyz/openbmc_project/Telemetry/Reports/TelemetryService"); 61 }); 62 } 63 64 inline void requestRoutesMetricReport(App& app) 65 { 66 BMCWEB_ROUTE(app, "/redfish/v1/TelemetryService/MetricReports/<str>/") 67 .privileges(redfish::privileges::getMetricReport) 68 .methods(boost::beast::http::verb::get)( 69 [&app](const crow::Request& req, 70 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 71 const std::string& id) { 72 if (!redfish::setUpRedfishRoute(app, req, asyncResp)) 73 { 74 return; 75 } 76 const std::string reportPath = telemetry::getDbusReportPath(id); 77 dbus::utility::async_method_call( 78 asyncResp, 79 [asyncResp, id, 80 reportPath](const boost::system::error_code& ec) { 81 if (ec.value() == EBADR || 82 ec == boost::system::errc::host_unreachable) 83 { 84 messages::resourceNotFound(asyncResp->res, 85 "MetricReport", id); 86 return; 87 } 88 if (ec) 89 { 90 BMCWEB_LOG_ERROR("respHandler DBus error {}", ec); 91 messages::internalError(asyncResp->res); 92 return; 93 } 94 95 sdbusplus::asio::getProperty< 96 telemetry::TimestampReadings>( 97 *crow::connections::systemBus, telemetry::service, 98 reportPath, telemetry::reportInterface, "Readings", 99 [asyncResp, 100 id](const boost::system::error_code& ec2, 101 const telemetry::TimestampReadings& ret) { 102 if (ec2) 103 { 104 BMCWEB_LOG_ERROR( 105 "respHandler DBus error {}", ec2); 106 messages::internalError(asyncResp->res); 107 return; 108 } 109 110 telemetry::fillReport(asyncResp->res.jsonValue, 111 id, ret); 112 }); 113 }, 114 telemetry::service, reportPath, telemetry::reportInterface, 115 "Update"); 116 }); 117 } 118 } // namespace redfish 119