From 9fc7d722b3192df9940062185b40ebb0fabad518 Mon Sep 17 00:00:00 2001 From: Krzysztof Grobelny Date: Mon, 8 Jun 2020 15:16:10 +0200 Subject: [PATCH 4/5] Add support for "OnRequest" in MetricReportDefinition Added support for "OnRequest" of ReportingType property in MetricReportDefinition node. Now user is able to create MetricReportDefinition that is updated on every GET request on MetricReport. Tested: - Succesfully passed RedfishServiceValidator.py - Manually tested via curl Signed-off-by: Krzysztof Grobelny Change-Id: I1cdfe47e56fdc5ec9753558145d0bf3645160aaf --- include/dbus_utility.hpp | 30 +++++++++++++++ redfish-core/include/utils/telemetry_utils.hpp | 8 ++-- redfish-core/lib/metric_report.hpp | 53 +++++++++++++++++++++++++- 3 files changed, 87 insertions(+), 4 deletions(-) diff --git a/include/dbus_utility.hpp b/include/dbus_utility.hpp index 3df88d8..029d8d8 100644 --- a/include/dbus_utility.hpp +++ b/include/dbus_utility.hpp @@ -17,6 +17,7 @@ #include +#include #include namespace dbus @@ -130,5 +131,34 @@ inline void getAllProperties(Callback&& callback, const std::string& service, interface); } +template +static void getProperty( + std::function callback, + const std::string& service, const std::string& path, + const std::string& interface, const std::string& property) +{ + crow::connections::systemBus->async_method_call( + [callback](const boost::system::error_code ec, + const std::variant& value) { + if (ec) + { + callback(ec, T{}); + return; + } + + if (auto v = std::get_if(&value)) + { + callback(ec, *v); + return; + } + + callback(boost::system::errc::make_error_code( + boost::system::errc::io_error), + T{}); + }, + service, path, "org.freedesktop.DBus.Properties", "Get", interface, + property); +} + } // namespace utility } // namespace dbus diff --git a/redfish-core/include/utils/telemetry_utils.hpp b/redfish-core/include/utils/telemetry_utils.hpp index 05ed00f..6c4e810 100644 --- a/redfish-core/include/utils/telemetry_utils.hpp +++ b/redfish-core/include/utils/telemetry_utils.hpp @@ -26,6 +26,8 @@ static constexpr const char* metricReportDefinitionUri = "/redfish/v1/TelemetryService/MetricReportDefinitions/"; static constexpr const char* metricReportUri = "/redfish/v1/TelemetryService/MetricReports/"; +static constexpr const char* monitoringService = + "xyz.openbmc_project.MonitoringService"; static constexpr const char* reportInterface = "xyz.openbmc_project.MonitoringService.Report"; static constexpr const char* telemetryPath = @@ -66,9 +68,9 @@ static void getReport(const std::shared_ptr& asyncResp, const std::array interfaces = {reportInterface}; dbus::utility::getSubTreePaths( - [asyncResp, id, schemaType, - callback](const boost::system::error_code ec, - const std::vector& reports) { + [asyncResp, id, schemaType, callback = std::move(callback)]( + const boost::system::error_code ec, + const std::vector& reports) { if (ec == boost::system::errc::no_such_file_or_directory) { messages::resourceNotFound(asyncResp->res, schemaType, id); diff --git a/redfish-core/lib/metric_report.hpp b/redfish-core/lib/metric_report.hpp index a52d680..877e7f1 100644 --- a/redfish-core/lib/metric_report.hpp +++ b/redfish-core/lib/metric_report.hpp @@ -85,7 +85,7 @@ class MetricReport : public Node } const std::string& id = params[0]; - telemetry::getReport(asyncResp, id, schemaType, getReportProperties); + telemetry::getReport(asyncResp, id, schemaType, updateReportIfRequired); } using Readings = @@ -143,6 +143,57 @@ class MetricReport : public Node "xyz.openbmc_project.MonitoringService.Report"); } + template + static void updateReport(Callback&& callback, + const std::shared_ptr& asyncResp, + const std::string& path) + { + crow::connections::systemBus->async_method_call( + [asyncResp, callback{std::move(callback)}]( + const boost::system::error_code& ec) { + if (ec) + { + messages::internalError(asyncResp->res); + return; + } + + callback(); + }, + telemetry::monitoringService, path, telemetry::reportInterface, + "Update"); + } + + static void + updateReportIfRequired(const std::shared_ptr asyncResp, + const std::string& reportPath, + const std::string& id) + { + dbus::utility::getProperty( + [asyncResp, id, reportPath](const boost::system::error_code& ec, + const std::string& reportingType) { + if (ec) + { + messages::internalError(asyncResp->res); + return; + } + + if (reportingType == "OnRequest") + { + updateReport( + [asyncResp, reportPath, id] { + getReportProperties(asyncResp, reportPath, id); + }, + asyncResp, reportPath); + } + else + { + getReportProperties(asyncResp, reportPath, id); + } + }, + telemetry::monitoringService, reportPath, + telemetry::reportInterface, "ReportingType"); + } + static constexpr const char* schemaType = "#MetricReport.v1_3_0.MetricReport"; }; -- 2.16.6