From 18f97faa411078b95d042d207f5fff32bc8ece1d Mon Sep 17 00:00:00 2001 From: P Dheeraj Srujan Kumar Date: Thu, 31 Mar 2022 02:50:48 +0530 Subject: Update to internal 1-0.91 Signed-off-by: P Dheeraj Srujan Kumar --- ...d-unmerged-changes-for-http-retry-support.patch | 172 +++++++++------ .../0002-EventService-https-client-support.patch | 243 ++++++++++----------- .../0004-Add-Server-Sent-Events-support.patch | 14 +- ...tyle-subscription-support-to-eventservice.patch | 70 +++--- .../0006-Add-EventService-SSE-filter-support.patch | 24 +- ...rvice-Log-events-for-subscription-actions.patch | 21 +- ...ks-on-Event-Subscription-input-parameters.patch | 33 ++- ...cture-Redifsh-EventLog-Transmit-code-flow.patch | 18 +- ...010-Remove-Terminated-Event-Subscriptions.patch | 71 +++--- ...h-while-deleting-terminated-subscriptions.patch | 12 +- ...ort-for-deleting-terminated-subscriptions.patch | 45 ++++ ...rvice-fix-added-Context-field-to-response.patch | 33 +++ .../interfaces/bmcweb/eventservice/README | 10 +- 13 files changed, 447 insertions(+), 319 deletions(-) create mode 100644 meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0012-Add-support-for-deleting-terminated-subscriptions.patch create mode 100644 meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0013-event-service-fix-added-Context-field-to-response.patch (limited to 'meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice') diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0001-Add-unmerged-changes-for-http-retry-support.patch b/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0001-Add-unmerged-changes-for-http-retry-support.patch index 52135e255..7229f9aa7 100644 --- a/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0001-Add-unmerged-changes-for-http-retry-support.patch +++ b/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0001-Add-unmerged-changes-for-http-retry-support.patch @@ -1,6 +1,6 @@ -From 6ff897d2b5513f15445f18aae16d8439ed94f377 Mon Sep 17 00:00:00 2001 +From 43b629c180e1b4350a9e9bd917d81a49acb57731 Mon Sep 17 00:00:00 2001 From: P Dheeraj Srujan Kumar -Date: Mon, 11 Oct 2021 18:41:27 +0530 +Date: Mon, 6 Dec 2021 19:49:01 +0000 Subject: [PATCH] Add unmerged changes for http retry support The http retry support added upstream as a single patch was slpit into @@ -9,45 +9,19 @@ This commit pulls in the differentail changes required to complete the entire http retry support. and also allow for other subsequent patches to be appplied easily. -Change-Id: Id8ccd991b7ffc505196b1a92b23e1cd51e00bc89 +Change-Id: I43e68eeffb8d69c289dd306c1c7cafc87ad766a0 Signed-off-by: P Dheeraj Srujan Kumar --- - http/http_client.hpp | 44 +++++++++++-------- - .../include/event_service_manager.hpp | 2 +- - 2 files changed, 27 insertions(+), 19 deletions(-) + http/http_client.hpp | 32 ++++++++++++++++--- + .../include/event_service_manager.hpp | 26 +++++++++------ + redfish-core/lib/event_service.hpp | 1 + + 3 files changed, 45 insertions(+), 14 deletions(-) diff --git a/http/http_client.hpp b/http/http_client.hpp -index ab20eb0..aad1cce 100644 +index 0c9e387..0701d9e 100644 --- a/http/http_client.hpp +++ b/http/http_client.hpp -@@ -68,7 +68,6 @@ class HttpClient : public std::enable_shared_from_this - std::optional< - boost::beast::http::response_parser> - parser; -- std::vector> headers; - boost::circular_buffer_space_optimized requestDataQueue{}; - - ConnState state; -@@ -137,18 +136,6 @@ class HttpClient : public std::enable_shared_from_this - - BMCWEB_LOG_DEBUG << __FUNCTION__ << "(): " << host << ":" << port; - -- req.version(static_cast(11)); // HTTP 1.1 -- req.target(uri); -- req.method(boost::beast::http::verb::post); -- -- // Set headers -- for (const auto& [key, value] : headers) -- { -- req.set(key, value); -- } -- req.set(boost::beast::http::field::host, host); -- req.keep_alive(true); -- - req.body() = data; - req.prepare_payload(); - -@@ -204,6 +191,17 @@ class HttpClient : public std::enable_shared_from_this +@@ -189,6 +189,17 @@ class HttpClient : public std::enable_shared_from_this BMCWEB_LOG_DEBUG << "recvMessage() data: " << self->parser->get(); @@ -65,57 +39,125 @@ index ab20eb0..aad1cce 100644 unsigned int respCode = self->parser->get().result_int(); BMCWEB_LOG_DEBUG << "recvMessage() Header Response Code: " << respCode; -@@ -398,11 +396,17 @@ class HttpClient : public std::enable_shared_from_this +@@ -381,15 +392,17 @@ class HttpClient : public std::enable_shared_from_this + public: + explicit HttpClient(boost::asio::io_context& ioc, const std::string& id, const std::string& destIP, const std::string& destPort, - const std::string& destUri) : +- const std::string& destUri, +- const boost::beast::http::fields& httpHeader) : ++ const std::string& destUri) : conn(ioc), -- timer(ioc), subId(id), host(destIP), port(destPort), uri(destUri), -- retryCount(0), maxRetryAttempts(5), retryIntervalSecs(0), -+ timer(ioc), req(boost::beast::http::verb::post, destUri, 11), -+ state(ConnState::initialized), subId(id), host(destIP), port(destPort), -+ uri(destUri), retryCount(0), maxRetryAttempts(5), retryIntervalSecs(0), - retryPolicyAction("TerminateAfterRetries"), runningTimer(false) +- timer(ioc), +- req(boost::beast::http::verb::post, destUri, 11, "", httpHeader), +- subId(id), host(destIP), port(destPort) ++ timer(ioc), req(boost::beast::http::verb::post, destUri, 11), subId(id), ++ host(destIP), port(destPort) { -- state = ConnState::initialized; + // Set the request header -+ req.set(boost::beast::http::field::host, host); + req.set(boost::beast::http::field::host, host); + req.set(boost::beast::http::field::content_type, "application/json"); -+ req.keep_alive(true); + req.keep_alive(true); + + requestDataQueue.set_capacity(maxRequestQueueSize); } void sendData(const std::string& data) -@@ -425,10 +429,14 @@ class HttpClient : public std::enable_shared_from_this +@@ -412,6 +425,15 @@ class HttpClient : public std::enable_shared_from_this return; } -- void setHeaders( -+ void addHeaders( - const std::vector>& httpHeaders) - { -- headers = httpHeaders; ++ void setHeaders(const boost::beast::http::fields& httpHeaders) ++ { + // Set custom headers -+ for (const auto& [key, value] : httpHeaders) ++ for (const auto& header : httpHeaders) + { -+ req.set(key, value); ++ req.set(header.name(), header.value()); + } - } - ++ } ++ void setRetryConfig(const uint32_t retryAttempts, + const uint32_t retryTimeoutInterval) + { diff --git a/redfish-core/include/event_service_manager.hpp b/redfish-core/include/event_service_manager.hpp -index 8042803..0a63b8c 100644 +index e0f290c..7a2f096 100644 --- a/redfish-core/include/event_service_manager.hpp +++ b/redfish-core/include/event_service_manager.hpp -@@ -412,7 +412,7 @@ class Subscription : public persistent_data::UserSubscription - reqHeaders.emplace_back(std::pair(key, val)); - } - } -- conn->setHeaders(reqHeaders); -+ conn->addHeaders(reqHeaders); - conn->sendData(msg); - this->eventSeqNum++; +@@ -384,7 +384,10 @@ class Subscription : public persistent_data::UserSubscription + eventSeqNum(1), + host(inHost), port(inPort), path(inPath), uriProto(inUriProto) + { +- // Subscription constructor ++ // create the HttpClient connection ++ conn = std::make_shared( ++ crow::connections::systemBus->get_io_context(), id, host, port, ++ path); + } + + Subscription(const std::shared_ptr& adaptor) : +@@ -397,17 +400,12 @@ class Subscription : public persistent_data::UserSubscription + + void sendEvent(const std::string& msg) + { +- if (conn == nullptr) ++ if (conn != nullptr) + { +- // create the HttpClient connection +- conn = std::make_shared( +- crow::connections::systemBus->get_io_context(), id, host, port, +- path, httpHeaders); ++ conn->sendData(msg); ++ eventSeqNum++; } + +- conn->sendData(msg); +- eventSeqNum++; +- + if (sseConn != nullptr) + { + sseConn->sendData(eventSeqNum, msg); +@@ -551,6 +549,14 @@ class Subscription : public persistent_data::UserSubscription + } + } + ++ void updatehttpHeaders() ++ { ++ if (conn != nullptr) ++ { ++ conn->setHeaders(httpHeaders); ++ } ++ } ++ + uint64_t getEventSeqNum() + { + return eventSeqNum; +@@ -664,6 +670,7 @@ class EventServiceManager + // Update retry configuration. + subValue->updateRetryConfig(retryAttempts, retryTimeoutInterval); + subValue->updateRetryPolicy(); ++ subValue->updatehttpHeaders(); + } + return; + } +@@ -919,6 +926,7 @@ class EventServiceManager + // Update retry configuration. + subValue->updateRetryConfig(retryAttempts, retryTimeoutInterval); + subValue->updateRetryPolicy(); ++ subValue->updatehttpHeaders(); + + return id; + } +diff --git a/redfish-core/lib/event_service.hpp b/redfish-core/lib/event_service.hpp +index d273aea..7739ad0 100644 +--- a/redfish-core/lib/event_service.hpp ++++ b/redfish-core/lib/event_service.hpp +@@ -611,6 +611,7 @@ inline void requestRoutesEventDestination(App& app) + } + } + subValue->httpHeaders = fields; ++ subValue->updatehttpHeaders(); + } + + if (retryPolicy) -- 2.17.1 diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0002-EventService-https-client-support.patch b/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0002-EventService-https-client-support.patch index aeeafc421..2125fcc52 100644 --- a/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0002-EventService-https-client-support.patch +++ b/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0002-EventService-https-client-support.patch @@ -1,6 +1,6 @@ -From 3f2ad28e6e124249cde3df50c9e18c283fbcbf3e Mon Sep 17 00:00:00 2001 +From b5e0024f33afc95751afe14e66c38bf9802645f6 Mon Sep 17 00:00:00 2001 From: AppaRao Puli -Date: Mon, 22 Feb 2021 17:07:47 +0000 +Date: Mon, 6 Dec 2021 21:39:05 +0000 Subject: [PATCH] EventService: https client support Add https client support for push style eventing. Using this BMC can @@ -13,15 +13,16 @@ Tested: listener. - Validator passed. -Change-Id: I44c3918b39baa2eb5fddda9d635f99aa280a422a +Change-Id: I480085344ba7bed6ec0d94876eda1d252e51cb45 Signed-off-by: AppaRao Puli +Signed-off-by: P Dheeraj Srujan Kumar --- http/http_client.hpp | 307 ++++++++++++------ .../include/event_service_manager.hpp | 2 +- - 2 files changed, 202 insertions(+), 107 deletions(-) + 2 files changed, 204 insertions(+), 105 deletions(-) diff --git a/http/http_client.hpp b/http/http_client.hpp -index aad1cce..5e7ff47 100644 +index d3d3491..58b5402 100644 --- a/http/http_client.hpp +++ b/http/http_client.hpp @@ -20,6 +20,7 @@ @@ -30,9 +31,9 @@ index aad1cce..5e7ff47 100644 #include +#include #include + #include #include - -@@ -43,6 +44,8 @@ enum class ConnState +@@ -44,6 +45,8 @@ enum class ConnState resolveFailed, connectInProgress, connectFailed, @@ -41,7 +42,7 @@ index aad1cce..5e7ff47 100644 connected, sendInProgress, sendFailed, -@@ -61,7 +64,9 @@ class HttpClient : public std::enable_shared_from_this +@@ -62,7 +65,9 @@ class HttpClient : public std::enable_shared_from_this { private: crow::async_resolve::Resolver resolver; @@ -51,7 +52,7 @@ index aad1cce..5e7ff47 100644 boost::asio::steady_timer timer; boost::beast::flat_static_buffer buffer; boost::beast::http::request req; -@@ -108,23 +113,52 @@ class HttpClient : public std::enable_shared_from_this +@@ -110,23 +115,52 @@ class HttpClient : public std::enable_shared_from_this const std::vector& endpointList) { state = ConnState::connectInProgress; @@ -112,15 +113,7 @@ index aad1cce..5e7ff47 100644 self->state = ConnState::connected; self->handleConnState(); }); -@@ -132,132 +166,187 @@ class HttpClient : public std::enable_shared_from_this - - void sendMessage(const std::string& data) - { -- state = ConnState::sendInProgress; -- - BMCWEB_LOG_DEBUG << __FUNCTION__ << "(): " << host << ":" << port; -+ state = ConnState::sendInProgress; - +@@ -139,124 +173,182 @@ class HttpClient : public std::enable_shared_from_this req.body() = data; req.prepare_payload(); @@ -173,23 +166,52 @@ index aad1cce..5e7ff47 100644 + boost::beast::http::async_write(conn, req, std::move(respHandler)); + } } -- + void recvMessage() { state = ConnState::recvInProgress; +- parser.emplace(std::piecewise_construct, std::make_tuple()); +- parser->body_limit(httpReadBodyLimit); + auto respHandler = [self(shared_from_this())]( + const boost::beast::error_code ec, + const std::size_t& bytesTransferred) { + if (ec && ec != boost::asio::ssl::error::stream_truncated) + { + BMCWEB_LOG_ERROR << "recvMessage() failed: " << ec.message(); -+ + +- // Receive the HTTP response +- boost::beast::http::async_read( +- conn, buffer, *parser, +- [self(shared_from_this())](const boost::beast::error_code& ec, +- const std::size_t& bytesTransferred) { +- if (ec) +- { +- BMCWEB_LOG_ERROR << "recvMessage() failed: " +- << ec.message(); +- self->state = ConnState::recvFailed; +- self->handleConnState(); +- return; +- } +- BMCWEB_LOG_DEBUG << "recvMessage() bytes transferred: " +- << bytesTransferred; +- BMCWEB_LOG_DEBUG << "recvMessage() data: " +- << self->parser->get(); + self->state = ConnState::recvFailed; + self->handleConnState(); + return; + } -+ + +- // Check if the response and header are received +- if (!self->parser->is_done()) +- { +- // The parser failed to receive the response +- BMCWEB_LOG_ERROR +- << "recvMessage() parser failed to receive response"; +- self->state = ConnState::recvFailed; +- self->handleConnState(); +- return; +- } + BMCWEB_LOG_DEBUG << "recvMessage() bytes transferred: " + << bytesTransferred; + boost::ignore_unused(bytesTransferred); @@ -204,11 +226,26 @@ index aad1cce..5e7ff47 100644 + self->handleConnState(); + return; + } -+ + +- unsigned int respCode = self->parser->get().result_int(); +- BMCWEB_LOG_DEBUG << "recvMessage() Header Response Code: " +- << respCode; + unsigned int respCode = self->parser->get().result_int(); + BMCWEB_LOG_DEBUG << "recvMessage() Header Response Code: " + << respCode; -+ + +- // 2XX response is considered to be successful +- if ((respCode < 200) || (respCode >= 300)) +- { +- // The listener failed to receive the Sent-Event +- BMCWEB_LOG_ERROR +- << "recvMessage() Listener Failed to " +- "receive Sent-Event. Header Response Code: " +- << respCode; +- self->state = ConnState::recvFailed; +- self->handleConnState(); +- return; +- } + // 2XX response is considered to be successful + if ((respCode < 200) || (respCode >= 300)) + { @@ -219,7 +256,14 @@ index aad1cce..5e7ff47 100644 + self->handleConnState(); + return; + } -+ + +- // Send is successful, Lets remove data from queue +- // check for next request data in queue. +- if (!self->requestDataQueue.empty()) +- { +- self->requestDataQueue.pop_front(); +- } +- self->state = ConnState::idle; + // Send is successful, Lets remove data from queue + // check for next request data in queue. + if (!self->requestDataQueue.empty()) @@ -236,17 +280,30 @@ index aad1cce..5e7ff47 100644 + // Abort the connection since server is not keep-alive enabled + self->state = ConnState::abortConnection; + } -+ + +- // Keep the connection alive if server supports it +- // Else close the connection +- BMCWEB_LOG_DEBUG << "recvMessage() keepalive : " +- << self->parser->keep_alive(); +- if (!self->parser->keep_alive()) +- { +- // Abort the connection since server is not keep-alive +- // enabled +- self->state = ConnState::abortConnection; +- } + // Returns ownership of the parsed message + self->parser->release(); -+ + +- self->handleConnState(); +- }); +- } + self->handleConnState(); + }; - parser.emplace(std::piecewise_construct, std::make_tuple()); - parser->body_limit(httpReadBodyLimit); ++ parser.emplace(std::piecewise_construct, std::make_tuple()); ++ parser->body_limit(httpReadBodyLimit); - // Check only for the response header - parser->skip(true); ++ // Check only for the response header ++ parser->skip(true); + conn.expires_after(std::chrono::seconds(30)); + if (sslConn) + { @@ -259,28 +316,25 @@ index aad1cce..5e7ff47 100644 + std::move(respHandler)); + } + } -+ void doClose() -+ { -+ state = ConnState::closeInProgress; + void doClose() + { + state = ConnState::closeInProgress; +- boost::beast::error_code ec; +- conn.socket().shutdown(boost::asio::ip::tcp::socket::shutdown_both, ec); +- conn.close(); -- // Receive the HTTP response -- boost::beast::http::async_read( -- conn, buffer, *parser, -- [self(shared_from_this())](const boost::beast::error_code& ec, -- const std::size_t& bytesTransferred) { +- // not_connected happens sometimes so don't bother reporting it. +- if (ec && ec != boost::beast::errc::not_connected) + // Set the timeout on the tcp stream socket for the async operation + conn.expires_after(std::chrono::seconds(30)); + if (sslConn) -+ { + { +- BMCWEB_LOG_ERROR << "shutdown failed: " << ec.message(); +- return; + sslConn->async_shutdown([self = shared_from_this()]( + const boost::system::error_code ec) { - if (ec) - { -- BMCWEB_LOG_ERROR << "recvMessage() failed: " -- << ec.message(); -- self->state = ConnState::recvFailed; -- self->handleConnState(); -- return; ++ if (ec) ++ { + // Many https server closes connection abruptly + // i.e witnout close_notify. More details are at + // https://github.com/boostorg/beast/issues/824 @@ -294,79 +348,20 @@ index aad1cce..5e7ff47 100644 + BMCWEB_LOG_ERROR << "doClose() failed: " + << ec.message(); + } - } -- BMCWEB_LOG_DEBUG << "recvMessage() bytes transferred: " -- << bytesTransferred; -- BMCWEB_LOG_DEBUG << "recvMessage() data: " -- << self->parser->get(); -- -- // Check if the response and header are received -- if (!self->parser->is_done()) ++ } + else - { -- // The parser failed to receive the response -- BMCWEB_LOG_ERROR -- << "recvMessage() parser failed to receive response"; -- self->state = ConnState::recvFailed; -- self->handleConnState(); -- return; ++ { + BMCWEB_LOG_DEBUG << "Connection closed gracefully..."; - } ++ } + self->conn.close(); - -- unsigned int respCode = self->parser->get().result_int(); -- BMCWEB_LOG_DEBUG << "recvMessage() Header Response Code: " -- << respCode; -- -- // 2XX response is considered to be successful -- if ((respCode < 200) || (respCode >= 300)) ++ + if ((self->state != ConnState::suspended) && + (self->state != ConnState::terminated)) - { -- // The listener failed to receive the Sent-Event -- BMCWEB_LOG_ERROR << "recvMessage() Listener Failed to " -- "receive Sent-Event"; -- self->state = ConnState::recvFailed; ++ { + self->state = ConnState::closed; - self->handleConnState(); -- return; - } -- -- // Send is successful, Lets remove data from queue -- // check for next request data in queue. -- if (!self->requestDataQueue.empty()) -- { -- self->requestDataQueue.pop_front(); -- } -- self->state = ConnState::idle; -- -- // Keep the connection alive if server supports it -- // Else close the connection -- BMCWEB_LOG_DEBUG << "recvMessage() keepalive : " -- << self->parser->keep_alive(); -- if (!self->parser->keep_alive()) -- { -- // Abort the connection since server is not keep-alive -- // enabled -- self->state = ConnState::abortConnection; -- } -- -- self->handleConnState(); - }); -- } -- -- void doClose() -- { -- state = ConnState::closeInProgress; -- boost::beast::error_code ec; -- conn.socket().shutdown(boost::asio::ip::tcp::socket::shutdown_both, ec); -- conn.close(); -- -- // not_connected happens sometimes so don't bother reporting it. -- if (ec && ec != boost::beast::errc::not_connected) -- { -- BMCWEB_LOG_ERROR << "shutdown failed: " << ec.message(); -- return; ++ self->handleConnState(); ++ } ++ }); } - BMCWEB_LOG_DEBUG << "Connection closed gracefully"; - if ((state != ConnState::suspended) && (state != ConnState::terminated)) @@ -396,7 +391,7 @@ index aad1cce..5e7ff47 100644 } } -@@ -330,6 +419,7 @@ class HttpClient : public std::enable_shared_from_this +@@ -329,6 +421,7 @@ class HttpClient : public std::enable_shared_from_this { case ConnState::resolveInProgress: case ConnState::connectInProgress: @@ -404,7 +399,7 @@ index aad1cce..5e7ff47 100644 case ConnState::sendInProgress: case ConnState::recvInProgress: case ConnState::closeInProgress: -@@ -356,6 +446,7 @@ class HttpClient : public std::enable_shared_from_this +@@ -355,6 +448,7 @@ class HttpClient : public std::enable_shared_from_this } case ConnState::resolveFailed: case ConnState::connectFailed: @@ -412,7 +407,7 @@ index aad1cce..5e7ff47 100644 case ConnState::sendFailed: case ConnState::recvFailed: case ConnState::retry: -@@ -394,7 +485,8 @@ class HttpClient : public std::enable_shared_from_this +@@ -391,7 +485,8 @@ class HttpClient : public std::enable_shared_from_this public: explicit HttpClient(boost::asio::io_context& ioc, const std::string& id, const std::string& destIP, const std::string& destPort, @@ -420,9 +415,9 @@ index aad1cce..5e7ff47 100644 + const std::string& destUri, + const std::string& uriProto) : conn(ioc), - timer(ioc), req(boost::beast::http::verb::post, destUri, 11), - state(ConnState::initialized), subId(id), host(destIP), port(destPort), -@@ -407,8 +499,11 @@ class HttpClient : public std::enable_shared_from_this + timer(ioc), req(boost::beast::http::verb::post, destUri, 11), subId(id), + host(destIP), port(destPort) +@@ -402,6 +497,10 @@ class HttpClient : public std::enable_shared_from_this req.keep_alive(true); requestDataQueue.set_capacity(maxRequestQueueSize); @@ -431,16 +426,14 @@ index aad1cce..5e7ff47 100644 + sslConn.emplace(conn, ctx); + } } -- + void sendData(const std::string& data) - { - if ((state == ConnState::suspended) || (state == ConnState::terminated)) diff --git a/redfish-core/include/event_service_manager.hpp b/redfish-core/include/event_service_manager.hpp -index 08d0b98..f1ce0c0 100644 +index 317f900..f581b96 100644 --- a/redfish-core/include/event_service_manager.hpp +++ b/redfish-core/include/event_service_manager.hpp -@@ -385,7 +385,7 @@ class Subscription : public persistent_data::UserSubscription - { +@@ -383,7 +383,7 @@ class Subscription : public persistent_data::UserSubscription + // create the HttpClient connection conn = std::make_shared( crow::connections::systemBus->get_io_context(), id, host, port, - path); diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0004-Add-Server-Sent-Events-support.patch b/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0004-Add-Server-Sent-Events-support.patch index ea521a7e4..dfa67935c 100644 --- a/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0004-Add-Server-Sent-Events-support.patch +++ b/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0004-Add-Server-Sent-Events-support.patch @@ -1,4 +1,4 @@ -From d7a2660f200c38e74bfcbfe55b8da1b8bed08833 Mon Sep 17 00:00:00 2001 +From ea7d0091545450721d8b9b901e2593401b50d24c Mon Sep 17 00:00:00 2001 From: AppaRao Puli Date: Fri, 12 Mar 2021 18:53:25 +0000 Subject: [PATCH] Add Server-Sent-Events support @@ -31,10 +31,10 @@ Signed-off-by: P Dheeraj Srujan Kumar create mode 100644 http/server_sent_event.hpp diff --git a/http/http_connection.hpp b/http/http_connection.hpp -index 8e53afa..a1bbfce 100644 +index 0f20761..9cf603d 100644 --- a/http/http_connection.hpp +++ b/http/http_connection.hpp -@@ -378,11 +378,13 @@ class Connection : +@@ -362,11 +362,13 @@ class Connection : [self] { self->completeRequest(); }); }); @@ -83,10 +83,10 @@ index a983d4a..07b0265 100644 // In case of a JSON object, set the Content-Type header void jsonMode() diff --git a/http/routing.hpp b/http/routing.hpp -index 5d9c8e3..bfff107 100644 +index fe9c7e9..c748580 100644 --- a/http/routing.hpp +++ b/http/routing.hpp -@@ -6,6 +6,7 @@ +@@ -7,6 +7,7 @@ #include "http_response.hpp" #include "logging.hpp" #include "privileges.hpp" @@ -94,7 +94,7 @@ index 5d9c8e3..bfff107 100644 #include "sessions.hpp" #include "utility.hpp" #include "websocket.hpp" -@@ -398,6 +399,68 @@ class WebSocketRule : public BaseRule +@@ -397,6 +398,68 @@ class WebSocketRule : public BaseRule std::function errorHandler; }; @@ -163,7 +163,7 @@ index 5d9c8e3..bfff107 100644 template struct RuleParameterTraits { -@@ -410,6 +473,14 @@ struct RuleParameterTraits +@@ -409,6 +472,14 @@ struct RuleParameterTraits return *p; } diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0005-Add-SSE-style-subscription-support-to-eventservice.patch b/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0005-Add-SSE-style-subscription-support-to-eventservice.patch index ee69081ef..525070d93 100644 --- a/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0005-Add-SSE-style-subscription-support-to-eventservice.patch +++ b/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0005-Add-SSE-style-subscription-support-to-eventservice.patch @@ -1,4 +1,4 @@ -From 799e47842e179f7c752712004f0e96d3219eee11 Mon Sep 17 00:00:00 2001 +From 278ea5570d8a162774c3d84b0706e27539e714cc Mon Sep 17 00:00:00 2001 From: AppaRao Puli Date: Tue, 16 Mar 2021 15:37:24 +0000 Subject: [PATCH] Add SSE style subscription support to eventservice @@ -25,18 +25,18 @@ Signed-off-by: P Dheeraj Srujan Kumar http/http_connection.hpp | 2 +- include/eventservice_sse.hpp | 75 +++++ .../include/event_service_manager.hpp | 109 +++++-- - redfish-core/include/server_sent_events.hpp | 290 ------------------ + redfish-core/include/server_sent_events.hpp | 289 ------------------ redfish-core/lib/event_service.hpp | 8 +- src/webserver_main.cpp | 2 + - 6 files changed, 164 insertions(+), 322 deletions(-) + 6 files changed, 164 insertions(+), 321 deletions(-) create mode 100644 include/eventservice_sse.hpp delete mode 100644 redfish-core/include/server_sent_events.hpp diff --git a/http/http_connection.hpp b/http/http_connection.hpp -index a1bbfce..2d08501 100644 +index 9cf603d..cf629ea 100644 --- a/http/http_connection.hpp +++ b/http/http_connection.hpp -@@ -382,7 +382,7 @@ class Connection : +@@ -366,7 +366,7 @@ class Connection : boost::iequals( thisReq.getHeaderValue(boost::beast::http::field::upgrade), "websocket")) || @@ -127,17 +127,18 @@ index 0000000..14daf00 +} // namespace eventservice_sse +} // namespace redfish diff --git a/redfish-core/include/event_service_manager.hpp b/redfish-core/include/event_service_manager.hpp -index 3f398d7..dd833ce 100644 +index f581b96..57a2ab8 100644 --- a/redfish-core/include/event_service_manager.hpp +++ b/redfish-core/include/event_service_manager.hpp -@@ -22,15 +22,17 @@ +@@ -23,6 +23,7 @@ #include #include +#include #include + #include #include - #include +@@ -30,9 +31,10 @@ #include #include #include @@ -149,7 +150,7 @@ index 3f398d7..dd833ce 100644 #include #include #include -@@ -46,9 +48,27 @@ using ReadingsObjType = +@@ -48,9 +50,27 @@ using ReadingsObjType = static constexpr const char* eventFormatType = "Event"; static constexpr const char* metricReportFormatType = "MetricReport"; @@ -176,10 +177,10 @@ index 3f398d7..dd833ce 100644 + namespace message_registries { - inline boost::beast::span -@@ -68,24 +88,6 @@ inline boost::beast::span + inline std::span +@@ -70,24 +90,6 @@ inline std::span } - return boost::beast::span(openbmc::registry); + return {openbmc::registry}; } -} // namespace message_registries - @@ -201,8 +202,8 @@ index 3f398d7..dd833ce 100644 -{ static const Message* getMsgFromRegistry(const std::string& messageKey, - const boost::beast::span& registry) -@@ -388,11 +390,9 @@ class Subscription : public persistent_data::UserSubscription + const std::span& registry) +@@ -386,11 +388,9 @@ class Subscription : public persistent_data::UserSubscription path, uriProto); } @@ -217,7 +218,7 @@ index 3f398d7..dd833ce 100644 ~Subscription() = default; -@@ -417,7 +417,7 @@ class Subscription : public persistent_data::UserSubscription +@@ -404,7 +404,7 @@ class Subscription : public persistent_data::UserSubscription if (sseConn != nullptr) { @@ -226,7 +227,7 @@ index 3f398d7..dd833ce 100644 } } -@@ -508,6 +508,7 @@ class Subscription : public persistent_data::UserSubscription +@@ -495,6 +495,7 @@ class Subscription : public persistent_data::UserSubscription this->sendEvent( msg.dump(2, ' ', true, nlohmann::json::error_handler_t::replace)); @@ -234,7 +235,7 @@ index 3f398d7..dd833ce 100644 } #endif -@@ -578,14 +579,39 @@ class Subscription : public persistent_data::UserSubscription +@@ -557,14 +558,39 @@ class Subscription : public persistent_data::UserSubscription return eventSeqNum; } @@ -275,16 +276,16 @@ index 3f398d7..dd833ce 100644 }; class EventServiceManager -@@ -942,6 +968,8 @@ class EventServiceManager - subValue->updateRetryConfig(retryAttempts, retryTimeoutInterval); +@@ -922,6 +948,8 @@ class EventServiceManager subValue->updateRetryPolicy(); + subValue->updatehttpHeaders(); + // Set Subscription ID for back trace + subValue->setSubscriptionId(id); return id; } -@@ -970,11 +998,40 @@ class EventServiceManager +@@ -950,11 +978,40 @@ class EventServiceManager } } @@ -327,10 +328,10 @@ index 3f398d7..dd833ce 100644 std::vector idList; diff --git a/redfish-core/include/server_sent_events.hpp b/redfish-core/include/server_sent_events.hpp deleted file mode 100644 -index 7613d7b..0000000 +index dd3cd36..0000000 --- a/redfish-core/include/server_sent_events.hpp +++ /dev/null -@@ -1,290 +0,0 @@ +@@ -1,289 +0,0 @@ - -/* -// Copyright (c) 2020 Intel Corporation @@ -350,7 +351,6 @@ index 7613d7b..0000000 -#pragma once - -#include --#include -#include -#include -#include @@ -622,10 +622,10 @@ index 7613d7b..0000000 - -} // namespace crow diff --git a/redfish-core/lib/event_service.hpp b/redfish-core/lib/event_service.hpp -index 8609862..249e594 100644 +index 91a041e..9ad2bbd 100644 --- a/redfish-core/lib/event_service.hpp +++ b/redfish-core/lib/event_service.hpp -@@ -37,8 +37,6 @@ static constexpr const std::array supportedResourceTypes = { +@@ -40,8 +40,6 @@ static constexpr const std::array supportedResourceTypes = { "Task"}; #endif @@ -634,16 +634,16 @@ index 8609862..249e594 100644 inline void requestRoutesEventService(App& app) { BMCWEB_ROUTE(app, "/redfish/v1/EventService/") -@@ -50,6 +48,8 @@ inline void requestRoutesEventService(App& app) - {"@odata.type", "#EventService.v1_5_0.EventService"}, - {"Id", "EventService"}, - {"Name", "Event Service"}, -+ {"ServerSentEventUri", -+ "/redfish/v1/EventService/Subscriptions/SSE"}, - {"Subscriptions", - {{"@odata.id", "/redfish/v1/EventService/Subscriptions"}}}, - {"Actions", -@@ -90,9 +90,7 @@ inline void requestRoutesEventService(App& app) +@@ -54,6 +52,8 @@ inline void requestRoutesEventService(App& app) + {"@odata.type", "#EventService.v1_5_0.EventService"}, + {"Id", "EventService"}, + {"Name", "Event Service"}, ++ {"ServerSentEventUri", ++ "/redfish/v1/EventService/Subscriptions/SSE"}, + {"Subscriptions", + {{"@odata.id", "/redfish/v1/EventService/Subscriptions"}}}, + {"Actions", +@@ -92,9 +92,7 @@ inline void requestRoutesEventService(App& app) .privileges(redfish::privileges::patchEventService) .methods(boost::beast::http::verb::patch)( [](const crow::Request& req, diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0006-Add-EventService-SSE-filter-support.patch b/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0006-Add-EventService-SSE-filter-support.patch index 3914cc81a..05018a47d 100644 --- a/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0006-Add-EventService-SSE-filter-support.patch +++ b/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0006-Add-EventService-SSE-filter-support.patch @@ -1,4 +1,4 @@ -From 769f0e20d0a7e786d7091ffb7ee57d35204dfa28 Mon Sep 17 00:00:00 2001 +From 64a9d1826b7b4a66750f7ecaaff7bcf7e0d23932 Mon Sep 17 00:00:00 2001 From: AppaRao Puli Date: Wed, 17 Mar 2021 01:16:50 +0000 Subject: [PATCH] Add EventService SSE filter support @@ -59,7 +59,7 @@ index 14daf00..fed7fec 100644 + std::string queryFilters; + if (req.urlParams.size()) + { -+ boost::urls::url_view::params_type::iterator it = ++ boost::urls::query_params_view::iterator it = + req.urlParams.find("$filter"); + if (it == req.urlParams.end()) + { @@ -155,14 +155,14 @@ index 14daf00..fed7fec 100644 + // Check for Message ID in each of the selected Registry + for (const std::string& it : registryPrefix) + { -+ const boost::beast::span< ++ const std::span< + const redfish::message_registries::MessageEntry> + registry = + redfish::message_registries::getRegistryFromPrefix( + it); + + if (std::any_of( -+ registry.cbegin(), registry.cend(), ++ registry.begin(), registry.end(), + [&id]( + const redfish::message_registries::MessageEntry& + messageEntry) { @@ -203,10 +203,10 @@ index 14daf00..fed7fec 100644 std::string id = redfish::EventServiceManager::getInstance().addSubscription(subValue, diff --git a/redfish-core/include/error_messages.hpp b/redfish-core/include/error_messages.hpp -index 3d11cc4..90084e3 100644 +index 7f53fa4..9c688b4 100644 --- a/redfish-core/include/error_messages.hpp +++ b/redfish-core/include/error_messages.hpp -@@ -971,6 +971,15 @@ nlohmann::json mutualExclusiveProperties(const std::string& arg1, +@@ -985,6 +985,15 @@ nlohmann::json mutualExclusiveProperties(const std::string& arg1, void mutualExclusiveProperties(crow::Response& res, const std::string& arg1, const std::string& arg2); @@ -223,10 +223,10 @@ index 3d11cc4..90084e3 100644 } // namespace redfish diff --git a/redfish-core/include/event_service_manager.hpp b/redfish-core/include/event_service_manager.hpp -index dd833ce..861f4cb 100644 +index 57a2ab8..aae9f02 100644 --- a/redfish-core/include/event_service_manager.hpp +++ b/redfish-core/include/event_service_manager.hpp -@@ -55,6 +55,11 @@ static constexpr const char* eventServiceFile = +@@ -57,6 +57,11 @@ static constexpr const char* eventServiceFile = static constexpr const uint8_t maxNoOfSubscriptions = 20; static constexpr const uint8_t maxNoOfSSESubscriptions = 10; @@ -239,10 +239,10 @@ index dd833ce..861f4cb 100644 static std::optional inotifyConn; static constexpr const char* redfishEventLogDir = "/var/log"; diff --git a/redfish-core/lib/event_service.hpp b/redfish-core/lib/event_service.hpp -index 249e594..6f01707 100644 +index 9ad2bbd..99c3bfd 100644 --- a/redfish-core/lib/event_service.hpp +++ b/redfish-core/lib/event_service.hpp -@@ -21,11 +21,6 @@ +@@ -24,11 +24,6 @@ namespace redfish { @@ -255,10 +255,10 @@ index 249e594..6f01707 100644 "TerminateAfterRetries", "SuspendRetries", "RetryForever"}; diff --git a/redfish-core/src/error_messages.cpp b/redfish-core/src/error_messages.cpp -index 9c28e8f..2394398 100644 +index 2087a67..ecb3721 100644 --- a/redfish-core/src/error_messages.cpp +++ b/redfish-core/src/error_messages.cpp -@@ -2173,6 +2173,32 @@ void mutualExclusiveProperties(crow::Response& res, const std::string& arg1, +@@ -2203,6 +2203,32 @@ void mutualExclusiveProperties(crow::Response& res, const std::string& arg1, addMessageToErrorJson(res.jsonValue, mutualExclusiveProperties(arg1, arg2)); } diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0007-EventService-Log-events-for-subscription-actions.patch b/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0007-EventService-Log-events-for-subscription-actions.patch index 3be65ee2a..7cad022f3 100644 --- a/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0007-EventService-Log-events-for-subscription-actions.patch +++ b/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0007-EventService-Log-events-for-subscription-actions.patch @@ -1,4 +1,4 @@ -From b8eb53886106e44e3668857b13f8642d2ad3cfbf Mon Sep 17 00:00:00 2001 +From b5020756ae3fbff6283c293c74b779d656429f3a Mon Sep 17 00:00:00 2001 From: AppaRao Puli Date: Fri, 27 Aug 2021 16:02:01 +0000 Subject: [PATCH] EventService: Log events for subscription actions @@ -21,13 +21,14 @@ Tested: Change-Id: I3745fa6357bd215379781a9818d9acc02a853d79 Signed-off-by: AppaRao Puli Signed-off-by: Ayushi Smriti +Signed-off-by: P Dheeraj Srujan Kumar --- .../include/event_service_manager.hpp | 35 ++++++++++++++++--- redfish-core/lib/event_service.hpp | 2 +- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/redfish-core/include/event_service_manager.hpp b/redfish-core/include/event_service_manager.hpp -index c3e7f61..e9bdbfa 100644 +index aae9f02..69db652 100644 --- a/redfish-core/include/event_service_manager.hpp +++ b/redfish-core/include/event_service_manager.hpp @@ -21,6 +21,7 @@ @@ -38,7 +39,7 @@ index c3e7f61..e9bdbfa 100644 #include #include -@@ -788,7 +789,7 @@ class EventServiceManager +@@ -780,7 +781,7 @@ class EventServiceManager } } @@ -47,7 +48,7 @@ index c3e7f61..e9bdbfa 100644 { persistent_data::EventServiceStore::getInstance() .eventServiceConfig.enabled = serviceEnabled; -@@ -835,7 +836,7 @@ class EventServiceManager +@@ -827,7 +828,7 @@ class EventServiceManager if (updateConfig) { @@ -56,7 +57,7 @@ index c3e7f61..e9bdbfa 100644 } if (updateRetryCfg) -@@ -947,7 +948,7 @@ class EventServiceManager +@@ -939,7 +940,7 @@ class EventServiceManager if (updateFile) { @@ -65,7 +66,7 @@ index c3e7f61..e9bdbfa 100644 } #ifndef BMCWEB_ENABLE_REDFISH_DBUS_LOG_ENTRIES -@@ -962,6 +963,13 @@ class EventServiceManager +@@ -955,6 +956,13 @@ class EventServiceManager // Set Subscription ID for back trace subValue->setSubscriptionId(id); @@ -79,7 +80,7 @@ index c3e7f61..e9bdbfa 100644 return id; } -@@ -986,7 +994,14 @@ class EventServiceManager +@@ -979,7 +987,14 @@ class EventServiceManager persistent_data::EventServiceStore::getInstance() .subscriptionsConfigMap.erase(obj2); updateNoOfSubscribersCount(); @@ -95,7 +96,7 @@ index c3e7f61..e9bdbfa 100644 } } -@@ -1008,6 +1023,18 @@ class EventServiceManager +@@ -1001,6 +1016,18 @@ class EventServiceManager } } @@ -115,10 +116,10 @@ index c3e7f61..e9bdbfa 100644 { return subscriptionsMap.size(); diff --git a/redfish-core/lib/event_service.hpp b/redfish-core/lib/event_service.hpp -index 9def549..6a8421f 100644 +index 99c3bfd..15e45dc 100644 --- a/redfish-core/lib/event_service.hpp +++ b/redfish-core/lib/event_service.hpp -@@ -617,7 +617,7 @@ inline void requestRoutesEventDestination(App& app) +@@ -624,7 +624,7 @@ inline void requestRoutesEventDestination(App& app) subValue->updateRetryPolicy(); } diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0008-Add-checks-on-Event-Subscription-input-parameters.patch b/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0008-Add-checks-on-Event-Subscription-input-parameters.patch index 84ceb4ba8..a46708ee5 100644 --- a/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0008-Add-checks-on-Event-Subscription-input-parameters.patch +++ b/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0008-Add-checks-on-Event-Subscription-input-parameters.patch @@ -1,4 +1,4 @@ -From 05fdea2bb8e486b058d137a067ce1f5c885d2a96 Mon Sep 17 00:00:00 2001 +From ee758f1f97890f51707e72b3c6b08c8c46c41595 Mon Sep 17 00:00:00 2001 From: Nitin Wankhade Date: Mon, 28 Jun 2021 19:59:57 +0000 Subject: [PATCH] Add checks on Event Subscription input parameters @@ -16,17 +16,18 @@ Tested Change-Id: Iec2cd766c0e137b72706fc2da468d4fefd8fbaae Signed-off-by: Nitin Wankhade +Signed-off-by: P Dheeraj Srujan Kumar --- - redfish-core/lib/event_service.hpp | 30 ++++++++++++++++++++++++++++++ - 1 file changed, 30 insertions(+) + redfish-core/lib/event_service.hpp | 26 ++++++++++++++++++++++++++ + 1 file changed, 26 insertions(+) diff --git a/redfish-core/lib/event_service.hpp b/redfish-core/lib/event_service.hpp -index 52b01e5..f8a1671 100644 +index 15e45dc..27dec86 100644 --- a/redfish-core/lib/event_service.hpp +++ b/redfish-core/lib/event_service.hpp -@@ -19,6 +19,10 @@ - #include - #include +@@ -22,6 +22,10 @@ + + #include +#define MAX_CONTEXT_SIZE 256 +#define MAX_DESTINATION_SIZE 1024 @@ -35,7 +36,7 @@ index 52b01e5..f8a1671 100644 namespace redfish { static constexpr const std::array supportedRetryPolicies = { -@@ -220,6 +224,12 @@ inline void requestRoutesEventDestinationCollection(App& app) +@@ -223,6 +227,12 @@ inline void requestRoutesEventDestinationCollection(App& app) return; } @@ -48,7 +49,7 @@ index 52b01e5..f8a1671 100644 if (regPrefixes && msgIds) { if (regPrefixes->size() && msgIds->size()) -@@ -330,11 +340,31 @@ inline void requestRoutesEventDestinationCollection(App& app) +@@ -333,13 +343,29 @@ inline void requestRoutesEventDestinationCollection(App& app) if (context) { @@ -64,22 +65,20 @@ index 52b01e5..f8a1671 100644 { + size_t cumulativeLen = 0; + -+ for (nlohmann::json& itr : *headers) -+ { -+ std::string hdr{itr.dump( + for (const nlohmann::json& headerChunk : *headers) + { ++ std::string hdr{headerChunk.dump( + -1, ' ', true, nlohmann::json::error_handler_t::replace)}; + cumulativeLen += hdr.length(); -+ + if (cumulativeLen > MAX_HEADER_SIZE) + { + messages::propertySizeExceeded(asyncResp->res, + "HttpHeaders"); + return; + } -+ } - subValue->httpHeaders = *headers; - } - + for (const auto& item : headerChunk.items()) + { + const std::string* value = -- 2.17.1 diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0009-Restructure-Redifsh-EventLog-Transmit-code-flow.patch b/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0009-Restructure-Redifsh-EventLog-Transmit-code-flow.patch index d1fe475f5..918560f4d 100644 --- a/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0009-Restructure-Redifsh-EventLog-Transmit-code-flow.patch +++ b/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0009-Restructure-Redifsh-EventLog-Transmit-code-flow.patch @@ -1,5 +1,5 @@ -From 542505dff60e3921b00b51acae882e207d46f1a6 Mon Sep 17 00:00:00 2001 -From: Krzysztof Grobelny +From d047619b7003882846b108f519b00cdd41265361 Mon Sep 17 00:00:00 2001 +From: P Dheeraj Srujan Kumar Date: Wed, 14 Jul 2021 14:13:11 +0000 Subject: [PATCH] Restructure Redfish EventLog Transmit code flow @@ -35,7 +35,7 @@ Signed-off-by: P Dheeraj Srujan Kumar 1 file changed, 76 insertions(+), 32 deletions(-) diff --git a/redfish-core/include/event_service_manager.hpp b/redfish-core/include/event_service_manager.hpp -index e9bdbfa..5c4de70 100644 +index 3208fb3..86c90fb 100644 --- a/redfish-core/include/event_service_manager.hpp +++ b/redfish-core/include/event_service_manager.hpp @@ -134,15 +134,10 @@ static const Message* formatMessage(const std::string_view& messageID) @@ -55,7 +55,7 @@ index e9bdbfa..5c4de70 100644 // Get the entry timestamp std::time_t curTs = 0; -@@ -621,6 +616,7 @@ class EventServiceManager +@@ -628,6 +623,7 @@ class EventServiceManager } std::string lastEventTStr; @@ -63,7 +63,7 @@ index e9bdbfa..5c4de70 100644 size_t noOfEventLogSubscribers{0}; size_t noOfMetricReportSubscribers{0}; std::shared_ptr matchTelemetryMonitor; -@@ -1163,7 +1159,22 @@ class EventServiceManager +@@ -1172,7 +1168,22 @@ class EventServiceManager #ifndef BMCWEB_ENABLE_REDFISH_DBUS_LOG_ENTRIES void cacheLastEventTimestamp() { @@ -87,7 +87,7 @@ index e9bdbfa..5c4de70 100644 std::ifstream logStream(redfishEventLogFile); if (!logStream.good()) { -@@ -1171,27 +1182,44 @@ class EventServiceManager +@@ -1180,27 +1191,44 @@ class EventServiceManager return; } std::string logEntry; @@ -143,7 +143,7 @@ index e9bdbfa..5c4de70 100644 std::ifstream logStream(redfishEventLogFile); if (!logStream.good()) { -@@ -1201,27 +1229,21 @@ class EventServiceManager +@@ -1210,27 +1238,21 @@ class EventServiceManager std::vector eventRecords; @@ -178,7 +178,7 @@ index e9bdbfa..5c4de70 100644 std::string timestamp; std::string messageID; -@@ -1233,6 +1255,16 @@ class EventServiceManager +@@ -1242,6 +1264,16 @@ class EventServiceManager continue; } @@ -195,7 +195,7 @@ index e9bdbfa..5c4de70 100644 std::string registryName; std::string messageKey; event_log::getRegistryAndMessageKey(messageID, registryName, -@@ -1242,11 +1274,23 @@ class EventServiceManager +@@ -1251,11 +1283,23 @@ class EventServiceManager continue; } diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0010-Remove-Terminated-Event-Subscriptions.patch b/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0010-Remove-Terminated-Event-Subscriptions.patch index 9af5a066b..f37bc241b 100644 --- a/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0010-Remove-Terminated-Event-Subscriptions.patch +++ b/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0010-Remove-Terminated-Event-Subscriptions.patch @@ -1,5 +1,5 @@ -From f665ba085bb2310f008b7534f827fb401ad973c2 Mon Sep 17 00:00:00 2001 -From: Krzysztof Grobelny +From 5d13aa636aba6c68ab5a74e589cac35f4e925129 Mon Sep 17 00:00:00 2001 +From: P Dheeraj Srujan Kumar Date: Tue, 12 Oct 2021 08:19:51 +0000 Subject: [PATCH] Delete/Remove Terminated Event Subscription(s) @@ -22,15 +22,15 @@ Tested: Change-Id: If447acb2db74fb29a5d1cfe6194b77cda82bc8a1 Signed-off-by: P Dheeraj Srujan Kumar --- - http/http_client.hpp | 43 +++++++++++++++---- - .../include/event_service_manager.hpp | 36 ++++++++++++++++ - 2 files changed, 70 insertions(+), 9 deletions(-) + http/http_client.hpp | 48 +++++++++++++++---- + .../include/event_service_manager.hpp | 36 ++++++++++++++ + 2 files changed, 75 insertions(+), 9 deletions(-) diff --git a/http/http_client.hpp b/http/http_client.hpp -index 5e7ff47..54ae2c3 100644 +index 58b5402..745eeb6 100644 --- a/http/http_client.hpp +++ b/http/http_client.hpp -@@ -55,6 +55,8 @@ enum class ConnState +@@ -56,6 +56,8 @@ enum class ConnState closeInProgress, closed, suspended, @@ -39,7 +39,7 @@ index 5e7ff47..54ae2c3 100644 terminated, abortConnection, retry -@@ -288,7 +290,14 @@ class HttpClient : public std::enable_shared_from_this +@@ -290,7 +292,14 @@ class HttpClient : public std::enable_shared_from_this } void doClose() { @@ -55,7 +55,7 @@ index 5e7ff47..54ae2c3 100644 // Set the timeout on the tcp stream socket for the async operation conn.expires_after(std::chrono::seconds(30)); -@@ -318,8 +327,11 @@ class HttpClient : public std::enable_shared_from_this +@@ -320,8 +329,11 @@ class HttpClient : public std::enable_shared_from_this } self->conn.close(); @@ -69,7 +69,7 @@ index 5e7ff47..54ae2c3 100644 { self->state = ConnState::closed; self->handleConnState(); -@@ -341,8 +353,11 @@ class HttpClient : public std::enable_shared_from_this +@@ -343,8 +355,11 @@ class HttpClient : public std::enable_shared_from_this } conn.close(); @@ -83,7 +83,7 @@ index 5e7ff47..54ae2c3 100644 { state = ConnState::closed; handleConnState(); -@@ -365,8 +380,7 @@ class HttpClient : public std::enable_shared_from_this +@@ -367,8 +382,7 @@ class HttpClient : public std::enable_shared_from_this BMCWEB_LOG_DEBUG << "Retry policy: " << retryPolicyAction; if (retryPolicyAction == "TerminateAfterRetries") { @@ -93,7 +93,7 @@ index 5e7ff47..54ae2c3 100644 } if (retryPolicyAction == "SuspendRetries") { -@@ -423,6 +437,7 @@ class HttpClient : public std::enable_shared_from_this +@@ -425,6 +439,7 @@ class HttpClient : public std::enable_shared_from_this case ConnState::sendInProgress: case ConnState::recvInProgress: case ConnState::closeInProgress: @@ -101,7 +101,7 @@ index 5e7ff47..54ae2c3 100644 { BMCWEB_LOG_DEBUG << "Async operation is already in progress"; break; -@@ -439,7 +454,7 @@ class HttpClient : public std::enable_shared_from_this +@@ -441,11 +456,16 @@ class HttpClient : public std::enable_shared_from_this break; } case ConnState::suspended: @@ -110,8 +110,17 @@ index 5e7ff47..54ae2c3 100644 { doClose(); break; -@@ -506,7 +521,8 @@ class HttpClient : public std::enable_shared_from_this - } + } ++ case ConnState::terminated: ++ { ++ BMCWEB_LOG_DEBUG << "Connection Terminated"; ++ break; ++ } + case ConnState::resolveFailed: + case ConnState::connectFailed: + case ConnState::handshakeFailed: +@@ -505,7 +525,8 @@ class HttpClient : public std::enable_shared_from_this + void sendData(const std::string& data) { - if ((state == ConnState::suspended) || (state == ConnState::terminated)) @@ -120,7 +129,7 @@ index 5e7ff47..54ae2c3 100644 { return; } -@@ -524,6 +540,15 @@ class HttpClient : public std::enable_shared_from_this +@@ -523,6 +544,15 @@ class HttpClient : public std::enable_shared_from_this return; } @@ -133,14 +142,14 @@ index 5e7ff47..54ae2c3 100644 + return false; + } + - void addHeaders( - const std::vector>& httpHeaders) + void setHeaders(const boost::beast::http::fields& httpHeaders) { + // Set custom headers diff --git a/redfish-core/include/event_service_manager.hpp b/redfish-core/include/event_service_manager.hpp -index 6f60a31..363adb0 100644 +index 69db652..5d71c63 100644 --- a/redfish-core/include/event_service_manager.hpp +++ b/redfish-core/include/event_service_manager.hpp -@@ -591,6 +591,14 @@ class Subscription : public persistent_data::UserSubscription +@@ -588,6 +588,14 @@ class Subscription : public persistent_data::UserSubscription return std::nullopt; } @@ -155,7 +164,7 @@ index 6f60a31..363adb0 100644 private: std::shared_ptr sseConn = nullptr; uint64_t eventSeqNum; -@@ -847,6 +855,22 @@ class EventServiceManager +@@ -843,6 +851,22 @@ class EventServiceManager } } @@ -178,7 +187,7 @@ index 6f60a31..363adb0 100644 void updateNoOfSubscribersCount() { size_t eventLogSubCount = 0; -@@ -881,6 +905,7 @@ class EventServiceManager +@@ -877,6 +901,7 @@ class EventServiceManager std::shared_ptr getSubscription(const std::string& id) { @@ -186,7 +195,7 @@ index 6f60a31..363adb0 100644 auto obj = subscriptionsMap.find(id); if (obj == subscriptionsMap.end()) { -@@ -971,6 +996,7 @@ class EventServiceManager +@@ -968,6 +993,7 @@ class EventServiceManager bool isSubscriptionExist(const std::string& id) { @@ -194,7 +203,7 @@ index 6f60a31..363adb0 100644 auto obj = subscriptionsMap.find(id); if (obj == subscriptionsMap.end()) { -@@ -1033,6 +1059,7 @@ class EventServiceManager +@@ -1030,6 +1056,7 @@ class EventServiceManager size_t getNumberOfSubscriptions() { @@ -202,7 +211,7 @@ index 6f60a31..363adb0 100644 return subscriptionsMap.size(); } -@@ -1049,6 +1076,7 @@ class EventServiceManager +@@ -1046,6 +1073,7 @@ class EventServiceManager std::vector getAllIDs() { @@ -210,7 +219,7 @@ index 6f60a31..363adb0 100644 std::vector idList; for (const auto& it : subscriptionsMap) { -@@ -1059,6 +1087,7 @@ class EventServiceManager +@@ -1056,6 +1084,7 @@ class EventServiceManager bool isDestinationExist(const std::string& destUrl) { @@ -218,7 +227,7 @@ index 6f60a31..363adb0 100644 for (const auto& it : subscriptionsMap) { std::shared_ptr entry = it.second; -@@ -1073,6 +1102,7 @@ class EventServiceManager +@@ -1070,6 +1099,7 @@ class EventServiceManager void sendTestEventLog() { @@ -226,7 +235,7 @@ index 6f60a31..363adb0 100644 for (const auto& it : this->subscriptionsMap) { std::shared_ptr entry = it.second; -@@ -1100,6 +1130,8 @@ class EventServiceManager +@@ -1097,6 +1127,8 @@ class EventServiceManager } eventRecord.push_back(eventMessage); @@ -235,7 +244,7 @@ index 6f60a31..363adb0 100644 for (const auto& it : this->subscriptionsMap) { std::shared_ptr entry = it.second; -@@ -1143,6 +1175,8 @@ class EventServiceManager +@@ -1140,6 +1172,8 @@ class EventServiceManager } void sendBroadcastMsg(const std::string& broadcastMsg) { @@ -244,7 +253,7 @@ index 6f60a31..363adb0 100644 for (const auto& it : this->subscriptionsMap) { std::shared_ptr entry = it.second; -@@ -1291,6 +1325,8 @@ class EventServiceManager +@@ -1254,6 +1288,8 @@ class EventServiceManager return; } @@ -254,5 +263,5 @@ index 6f60a31..363adb0 100644 { std::shared_ptr entry = it.second; -- -2.25.1 +2.17.1 diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0011-Fix-bmcweb-crash-while-deleting-terminated-subscriptions.patch b/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0011-Fix-bmcweb-crash-while-deleting-terminated-subscriptions.patch index 585f7bf09..87f0a4fd9 100644 --- a/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0011-Fix-bmcweb-crash-while-deleting-terminated-subscriptions.patch +++ b/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0011-Fix-bmcweb-crash-while-deleting-terminated-subscriptions.patch @@ -1,4 +1,4 @@ -From 5b87bb61b58e92a8c5af37a7959347747409a65c Mon Sep 17 00:00:00 2001 +From ff562320d23e1c1e075689a636505f22eb4890d4 Mon Sep 17 00:00:00 2001 From: P Dheeraj Srujan Kumar Date: Thu, 14 Oct 2021 02:56:11 +0530 Subject: [PATCH] Fix bmcweb crash while deleting terminated subscriptions @@ -33,10 +33,10 @@ Signed-off-by: P Dheeraj Srujan Kumar 2 files changed, 58 insertions(+), 12 deletions(-) diff --git a/http/http_client.hpp b/http/http_client.hpp -index 54ae2c3..162cb09 100644 +index 745eeb6..5575765 100644 --- a/http/http_client.hpp +++ b/http/http_client.hpp -@@ -367,6 +367,12 @@ class HttpClient : public std::enable_shared_from_this +@@ -369,6 +369,12 @@ class HttpClient : public std::enable_shared_from_this void waitAndRetry() { @@ -49,7 +49,7 @@ index 54ae2c3..162cb09 100644 if (retryCount >= maxRetryAttempts) { BMCWEB_LOG_ERROR << "Maximum number of retries reached."; -@@ -393,11 +399,6 @@ class HttpClient : public std::enable_shared_from_this +@@ -395,11 +401,6 @@ class HttpClient : public std::enable_shared_from_this return; } @@ -62,10 +62,10 @@ index 54ae2c3..162cb09 100644 retryCount++; diff --git a/redfish-core/include/event_service_manager.hpp b/redfish-core/include/event_service_manager.hpp -index 363adb0..7af7a4d 100644 +index 5d71c63..f97909c 100644 --- a/redfish-core/include/event_service_manager.hpp +++ b/redfish-core/include/event_service_manager.hpp -@@ -857,18 +857,63 @@ class EventServiceManager +@@ -853,18 +853,63 @@ class EventServiceManager void deleteTerminatedSubcriptions() { diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0012-Add-support-for-deleting-terminated-subscriptions.patch b/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0012-Add-support-for-deleting-terminated-subscriptions.patch new file mode 100644 index 000000000..dd4827f27 --- /dev/null +++ b/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0012-Add-support-for-deleting-terminated-subscriptions.patch @@ -0,0 +1,45 @@ +From e44cced4e8a50a6edf0ace0e00b5be4b61533190 Mon Sep 17 00:00:00 2001 +From: Krzysztof Grobelny +Date: Tue, 7 Dec 2021 09:48:07 +0100 +Subject: [PATCH] Add support for deleting terminated subscriptions + +Added functionality to delete/remove event subscription(s) which are +configured to Terminate after retries. + +Currently, when an Event is subscribed with Retry Policy as +"TerminateAfterRetries", the state of the connection is set to +"Terminated" after retrying, but the Subscription is not removed. +This commit adds the functionality to detect terminated connection and +remove the respective subscription. + +This commit adds this check for metric reports. + +Tested: + - Created a Subscription with + DeliveryRetryPolicy: "TerminateAfterRetries" + - Received Events successfully on Event listener + - Once the Event listener was stopped, the Subscription was + removed/deleted after retries. + +Change-Id: I3cb0af5bc24411cddcdb3d1d9de25e8e9144106c +Signed-off-by: P Dheeraj Srujan Kumar +--- + redfish-core/include/event_service_manager.hpp | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/redfish-core/include/event_service_manager.hpp b/redfish-core/include/event_service_manager.hpp +index f97909c..881d2db 100644 +--- a/redfish-core/include/event_service_manager.hpp ++++ b/redfish-core/include/event_service_manager.hpp +@@ -1514,6 +1514,8 @@ class EventServiceManager + return; + } + ++ this->deleteTerminatedSubcriptions(); ++ + for (const auto& it : + EventServiceManager::getInstance().subscriptionsMap) + { +-- +2.17.1 + diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0013-event-service-fix-added-Context-field-to-response.patch b/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0013-event-service-fix-added-Context-field-to-response.patch new file mode 100644 index 000000000..019ccbe64 --- /dev/null +++ b/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/0013-event-service-fix-added-Context-field-to-response.patch @@ -0,0 +1,33 @@ +From ce9b52791e76d73050f053f8fc607c6e1eb5d8c4 Mon Sep 17 00:00:00 2001 +From: Krzysztof Grobelny +Date: Thu, 16 Dec 2021 10:46:55 +0100 +Subject: [PATCH] event service fix, added Context field to response + +Tested: + - Context field is present + - No regression detected + +Signed-off-by: Krzysztof Grobelny +--- + redfish-core/include/event_service_manager.hpp | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/redfish-core/include/event_service_manager.hpp b/redfish-core/include/event_service_manager.hpp +index 881d2db..1ba9f21 100644 +--- a/redfish-core/include/event_service_manager.hpp ++++ b/redfish-core/include/event_service_manager.hpp +@@ -530,6 +530,11 @@ class Subscription : public persistent_data::UserSubscription + return; + } + ++ if (!customText.empty()) ++ { ++ msg["Context"] = customText; ++ } ++ + this->sendEvent( + msg.dump(2, ' ', true, nlohmann::json::error_handler_t::replace)); + } +-- +2.17.1 + diff --git a/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/README b/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/README index c09967456..22dae410d 100644 --- a/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/README +++ b/meta-openbmc-mods/meta-common/recipes-phosphor/interfaces/bmcweb/eventservice/README @@ -22,7 +22,7 @@ Upstream revision information: file://eventservice/0007-EventService-Log-events-for-subscription-actions.patch - Add checks on Event-Subscription input parameters (Downstream patch) - file://eventservice//0008-Add-checks-on-Event-Subscription-input-parameters.patch + file://eventservice/0008-Add-checks-on-Event-Subscription-input-parameters.patch - Restructure Redifsh EventLog Transmit code flow https://gerrit.openbmc-project.xyz/c/openbmc/bmcweb/+/44449/3 @@ -31,4 +31,10 @@ Upstream revision information: file://eventservice/0010-Remove-Terminated-Event-Subscriptions.patch - Fix bmcweb crash while deleting terminated subscriptions (Downstream patch) - file://eventservice/0011-Fix-bmcweb-crash-while-deleting-terminated-subscriptions.patch + file://eventservice/0011-Fix-bmcweb-crash-while-deleting-terminated-subscriptions.patch + + - Add support for deleting terminated subscriptions + file://eventservice/0012-Add-support-for-deleting-terminated-subscriptions.patch + + - event service fix added Context field to response + file://eventservice/0013-event-service-fix-added-Context-field-to-response.patch -- cgit v1.2.3