diff options
author | Jason M. Bills <jason.m.bills@linux.intel.com> | 2021-07-30 01:23:08 +0300 |
---|---|---|
committer | Jason M. Bills <jason.m.bills@linux.intel.com> | 2021-07-30 02:21:22 +0300 |
commit | 67327ddc580cb9a85219a534844832a1682780d4 (patch) | |
tree | 307cedb87f4c0a329740c55ac364ed489d1d8fc2 /meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/telemetry/0004-Sync-Telmetry-service-with-EventService.patch | |
parent | bb6a14e2f317abf60677c6ad8de9c33d5760bf36 (diff) | |
download | openbmc-67327ddc580cb9a85219a534844832a1682780d4.tar.xz |
Update to internal 0.63
Signed-off-by: Jason M. Bills <jason.m.bills@linux.intel.com>
Diffstat (limited to 'meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/telemetry/0004-Sync-Telmetry-service-with-EventService.patch')
-rw-r--r-- | meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/telemetry/0004-Sync-Telmetry-service-with-EventService.patch | 295 |
1 files changed, 0 insertions, 295 deletions
diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/telemetry/0004-Sync-Telmetry-service-with-EventService.patch b/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/telemetry/0004-Sync-Telmetry-service-with-EventService.patch deleted file mode 100644 index 4119045f1..000000000 --- a/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/telemetry/0004-Sync-Telmetry-service-with-EventService.patch +++ /dev/null @@ -1,295 +0,0 @@ -From 0ed9ff4f37e7d3ea81073ad35acd530730104033 Mon Sep 17 00:00:00 2001 -From: "Wludzik, Jozef" <jozef.wludzik@intel.com> -Date: Tue, 15 Dec 2020 12:30:31 +0100 -Subject: [PATCH] Sync Telmetry service with EventService - -Synced the latest changes in Telemetry service with Event Service -code. Now assembling MetricReport is covered in single place in -code. Updated method of fetching Readings from Telemetry by -Event Service. Using ReportUpdate signal is no longer -supported. Now Event Service monitors for PropertiesChanged signal -from /xyz/openbmc_project/Telemetry/Reports path. - -Tested: - - Verified that EventListener received MetricReport response from - Event Service in insecure http push style eventing mode - -Change-Id: I2fc1841a6c9259a8bff30b34bddc0d4aabd41912 -Signed-off-by: Wludzik, Jozef <jozef.wludzik@intel.com> ---- - .../include/event_service_manager.hpp | 156 ++++++------------ - redfish-core/lib/metric_report.hpp | 28 ++-- - 2 files changed, 69 insertions(+), 115 deletions(-) - -diff --git a/redfish-core/include/event_service_manager.hpp b/redfish-core/include/event_service_manager.hpp -index c3c110a..dc99cda 100644 ---- a/redfish-core/include/event_service_manager.hpp -+++ b/redfish-core/include/event_service_manager.hpp -@@ -14,6 +14,7 @@ - // limitations under the License. - */ - #pragma once -+#include "metric_report.hpp" - #include "node.hpp" - #include "registries.hpp" - #include "registries/base_message_registry.hpp" -@@ -529,47 +530,32 @@ class Subscription - } - #endif - -- void filterAndSendReports(const std::string& id2, -- const std::string& readingsTs, -- const ReadingsObjType& readings) -+ void filterAndSendReports( -+ const std::string& id, -+ const std::variant<telemetry::TimestampReadings>& var) - { -- std::string metricReportDef = -- "/redfish/v1/TelemetryService/MetricReportDefinitions/" + id2; -+ std::string mrdUri = telemetry::metricReportDefinitionUri + id; - - // Empty list means no filter. Send everything. - if (metricReportDefinitions.size()) - { - if (std::find(metricReportDefinitions.begin(), - metricReportDefinitions.end(), -- metricReportDef) == metricReportDefinitions.end()) -+ mrdUri) == metricReportDefinitions.end()) - { - return; - } - } - -- nlohmann::json metricValuesArray = nlohmann::json::array(); -- for (const auto& it : readings) -+ nlohmann::json msg; -+ if (!telemetry::fillReport(msg, id, var)) - { -- metricValuesArray.push_back({}); -- nlohmann::json& entry = metricValuesArray.back(); -- -- auto& [id, property, value, timestamp] = it; -- -- entry = {{"MetricId", id}, -- {"MetricProperty", property}, -- {"MetricValue", std::to_string(value)}, -- {"Timestamp", crow::utility::getDateTime(timestamp)}}; -+ BMCWEB_LOG_ERROR << "Failed to fill the MetricReport for DBus " -+ "Report with id " -+ << id; -+ return; - } - -- nlohmann::json msg = { -- {"@odata.id", "/redfish/v1/TelemetryService/MetricReports/" + id}, -- {"@odata.type", "#MetricReport.v1_3_0.MetricReport"}, -- {"Id", id2}, -- {"Name", id2}, -- {"Timestamp", readingsTs}, -- {"MetricReportDefinition", {{"@odata.id", metricReportDef}}}, -- {"MetricValues", metricValuesArray}}; -- - this->sendEvent( - msg.dump(2, ' ', true, nlohmann::json::error_handler_t::replace)); - } -@@ -1421,75 +1407,6 @@ class EventServiceManager - } - - #endif -- -- void getMetricReading(const std::string& service, -- const std::string& objPath, const std::string& intf) -- { -- std::size_t found = objPath.find_last_of('/'); -- if (found == std::string::npos) -- { -- BMCWEB_LOG_DEBUG << "Invalid objPath received"; -- return; -- } -- -- std::string idStr = objPath.substr(found + 1); -- if (idStr.empty()) -- { -- BMCWEB_LOG_DEBUG << "Invalid ID in objPath"; -- return; -- } -- -- crow::connections::systemBus->async_method_call( -- [idStr{std::move(idStr)}]( -- const boost::system::error_code ec, -- boost::container::flat_map< -- std::string, std::variant<int32_t, ReadingsObjType>>& -- resp) { -- if (ec) -- { -- BMCWEB_LOG_DEBUG -- << "D-Bus call failed to GetAll metric readings."; -- return; -- } -- -- const int32_t* timestampPtr = -- std::get_if<int32_t>(&resp["Timestamp"]); -- if (!timestampPtr) -- { -- BMCWEB_LOG_DEBUG << "Failed to Get timestamp."; -- return; -- } -- -- ReadingsObjType* readingsPtr = -- std::get_if<ReadingsObjType>(&resp["Readings"]); -- if (!readingsPtr) -- { -- BMCWEB_LOG_DEBUG << "Failed to Get Readings property."; -- return; -- } -- -- if (!readingsPtr->size()) -- { -- BMCWEB_LOG_DEBUG << "No metrics report to be transferred"; -- return; -- } -- -- for (const auto& it : -- EventServiceManager::getInstance().subscriptionsMap) -- { -- std::shared_ptr<Subscription> entry = it.second; -- if (entry->eventFormatType == metricReportFormatType) -- { -- entry->filterAndSendReports( -- idStr, crow::utility::getDateTime(*timestampPtr), -- *readingsPtr); -- } -- } -- }, -- service, objPath, "org.freedesktop.DBus.Properties", "GetAll", -- intf); -- } -- - void unregisterMetricReportSignal() - { - if (matchTelemetryMonitor) -@@ -1509,9 +1426,11 @@ class EventServiceManager - } - - BMCWEB_LOG_DEBUG << "Metrics report signal - Register"; -- std::string matchStr( -- "type='signal',member='ReportUpdate', " -- "interface='xyz.openbmc_project.MonitoringService.Report'"); -+ std::string matchStr = "type='signal',member='PropertiesChanged'," -+ "interface='org.freedesktop.DBus.Properties'," -+ "path_namespace=/xyz/openbmc_project/Telemetry/" -+ "Reports/TelemetryService," -+ "arg0=xyz.openbmc_project.Telemetry.Report"; - - matchTelemetryMonitor = std::make_shared<sdbusplus::bus::match::match>( - *crow::connections::systemBus, matchStr, -@@ -1522,10 +1441,43 @@ class EventServiceManager - return; - } - -- std::string service = msg.get_sender(); -- std::string objPath = msg.get_path(); -- std::string intf = msg.get_interface(); -- getMetricReading(service, objPath, intf); -+ sdbusplus::message::object_path path(msg.get_path()); -+ std::string id = path.filename(); -+ if (id.empty()) -+ { -+ BMCWEB_LOG_ERROR << "Failed to get Id from path"; -+ return; -+ } -+ -+ std::string intf; -+ std::vector<std::pair< -+ std::string, std::variant<telemetry::TimestampReadings>>> -+ props; -+ std::vector<std::string> invalidProps; -+ msg.read(intf, props, invalidProps); -+ -+ auto found = -+ std::find_if(props.begin(), props.end(), [](const auto& x) { -+ return x.first == "Readings"; -+ }); -+ if (found == props.end()) -+ { -+ BMCWEB_LOG_ERROR -+ << "Failed to get Readings from Report properties"; -+ return; -+ } -+ -+ std::variant<telemetry::TimestampReadings>& readings = -+ found->second; -+ for (const auto& it : -+ EventServiceManager::getInstance().subscriptionsMap) -+ { -+ Subscription& entry = *it.second.get(); -+ if (entry.eventFormatType == metricReportFormatType) -+ { -+ entry.filterAndSendReports(id, readings); -+ } -+ } - }); - } - -diff --git a/redfish-core/lib/metric_report.hpp b/redfish-core/lib/metric_report.hpp -index ad15a05..18a6dcc 100644 ---- a/redfish-core/lib/metric_report.hpp -+++ b/redfish-core/lib/metric_report.hpp -@@ -31,16 +31,14 @@ inline nlohmann::json toMetricValues(const Readings& readings) - return metricValues; - } - --inline void fillReport(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, -- const std::string& id, -+inline bool fillReport(nlohmann::json& json, const std::string& id, - const std::variant<TimestampReadings>& var) - { -- asyncResp->res.jsonValue["@odata.type"] = -- "#MetricReport.v1_3_0.MetricReport"; -- asyncResp->res.jsonValue["@odata.id"] = telemetry::metricReportUri + id; -- asyncResp->res.jsonValue["Id"] = id; -- asyncResp->res.jsonValue["Name"] = id; -- asyncResp->res.jsonValue["MetricReportDefinition"]["@odata.id"] = -+ json["@odata.type"] = "#MetricReport.v1_3_0.MetricReport"; -+ json["@odata.id"] = telemetry::metricReportUri + id; -+ json["Id"] = id; -+ json["Name"] = id; -+ json["MetricReportDefinition"]["@odata.id"] = - telemetry::metricReportDefinitionUri + id; - - const TimestampReadings* timestampReadings = -@@ -48,14 +46,14 @@ inline void fillReport(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, - if (!timestampReadings) - { - BMCWEB_LOG_ERROR << "Property type mismatch or property is missing"; -- messages::internalError(asyncResp->res); -- return; -+ return false; - } - - const auto& [timestamp, readings] = *timestampReadings; -- asyncResp->res.jsonValue["Timestamp"] = -+ json["Timestamp"] = - crow::utility::getDateTime(static_cast<time_t>(timestamp)); -- asyncResp->res.jsonValue["MetricValues"] = toMetricValues(readings); -+ json["MetricValues"] = toMetricValues(readings); -+ return true; - } - } // namespace telemetry - -@@ -145,7 +143,11 @@ class MetricReport : public Node - return; - } - -- telemetry::fillReport(asyncResp, id, ret); -+ if (!telemetry::fillReport(asyncResp->res.jsonValue, id, -+ ret)) -+ { -+ messages::internalError(asyncResp->res); -+ } - }, - telemetry::service, reportPath, - "org.freedesktop.DBus.Properties", "Get", --- -2.17.1 - |