1*02c1e29fSAlexander Hansen /* 2*02c1e29fSAlexander Hansen Copyright (c) 2020 Intel Corporation 3*02c1e29fSAlexander Hansen 4*02c1e29fSAlexander Hansen Licensed under the Apache License, Version 2.0 (the "License"); 5*02c1e29fSAlexander Hansen you may not use this file except in compliance with the License. 6*02c1e29fSAlexander Hansen You may obtain a copy of the License at 7*02c1e29fSAlexander Hansen 8*02c1e29fSAlexander Hansen http://www.apache.org/licenses/LICENSE-2.0 9*02c1e29fSAlexander Hansen 10*02c1e29fSAlexander Hansen Unless required by applicable law or agreed to in writing, software 11*02c1e29fSAlexander Hansen distributed under the License is distributed on an "AS IS" BASIS, 12*02c1e29fSAlexander Hansen WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*02c1e29fSAlexander Hansen See the License for the specific language governing permissions and 14*02c1e29fSAlexander Hansen limitations under the License. 15*02c1e29fSAlexander Hansen */ 16*02c1e29fSAlexander Hansen #pragma once 17*02c1e29fSAlexander Hansen #include "event_logs_object_type.hpp" 18*02c1e29fSAlexander Hansen #include "event_service_store.hpp" 19*02c1e29fSAlexander Hansen #include "filter_expr_parser_ast.hpp" 20*02c1e29fSAlexander Hansen #include "metric_report.hpp" 21*02c1e29fSAlexander Hansen #include "server_sent_event.hpp" 22*02c1e29fSAlexander Hansen 23*02c1e29fSAlexander Hansen #include <boost/asio/io_context.hpp> 24*02c1e29fSAlexander Hansen #include <boost/url/url_view_base.hpp> 25*02c1e29fSAlexander Hansen 26*02c1e29fSAlexander Hansen #include <memory> 27*02c1e29fSAlexander Hansen #include <string> 28*02c1e29fSAlexander Hansen 29*02c1e29fSAlexander Hansen namespace redfish 30*02c1e29fSAlexander Hansen { 31*02c1e29fSAlexander Hansen 32*02c1e29fSAlexander Hansen static constexpr const char* subscriptionTypeSSE = "SSE"; 33*02c1e29fSAlexander Hansen 34*02c1e29fSAlexander Hansen static constexpr const uint8_t maxNoOfSubscriptions = 20; 35*02c1e29fSAlexander Hansen static constexpr const uint8_t maxNoOfSSESubscriptions = 10; 36*02c1e29fSAlexander Hansen 37*02c1e29fSAlexander Hansen class Subscription : public std::enable_shared_from_this<Subscription> 38*02c1e29fSAlexander Hansen { 39*02c1e29fSAlexander Hansen public: 40*02c1e29fSAlexander Hansen Subscription(const Subscription&) = delete; 41*02c1e29fSAlexander Hansen Subscription& operator=(const Subscription&) = delete; 42*02c1e29fSAlexander Hansen Subscription(Subscription&&) = delete; 43*02c1e29fSAlexander Hansen Subscription& operator=(Subscription&&) = delete; 44*02c1e29fSAlexander Hansen 45*02c1e29fSAlexander Hansen Subscription(std::shared_ptr<persistent_data::UserSubscription> userSubIn, 46*02c1e29fSAlexander Hansen const boost::urls::url_view_base& url, 47*02c1e29fSAlexander Hansen boost::asio::io_context& ioc); 48*02c1e29fSAlexander Hansen 49*02c1e29fSAlexander Hansen explicit Subscription(crow::sse_socket::Connection& connIn); 50*02c1e29fSAlexander Hansen 51*02c1e29fSAlexander Hansen ~Subscription() = default; 52*02c1e29fSAlexander Hansen 53*02c1e29fSAlexander Hansen // callback for subscription sendData 54*02c1e29fSAlexander Hansen void resHandler(const std::shared_ptr<Subscription>& /*unused*/, 55*02c1e29fSAlexander Hansen const crow::Response& res); 56*02c1e29fSAlexander Hansen 57*02c1e29fSAlexander Hansen bool sendEventToSubscriber(std::string&& msg); 58*02c1e29fSAlexander Hansen 59*02c1e29fSAlexander Hansen bool sendTestEventLog(); 60*02c1e29fSAlexander Hansen 61*02c1e29fSAlexander Hansen void filterAndSendEventLogs( 62*02c1e29fSAlexander Hansen const std::vector<EventLogObjectsType>& eventRecords); 63*02c1e29fSAlexander Hansen 64*02c1e29fSAlexander Hansen void filterAndSendReports(const std::string& reportId, 65*02c1e29fSAlexander Hansen const telemetry::TimestampReadings& var); 66*02c1e29fSAlexander Hansen 67*02c1e29fSAlexander Hansen void updateRetryConfig(uint32_t retryAttempts, 68*02c1e29fSAlexander Hansen uint32_t retryTimeoutInterval); 69*02c1e29fSAlexander Hansen 70*02c1e29fSAlexander Hansen uint64_t getEventSeqNum() const; 71*02c1e29fSAlexander Hansen 72*02c1e29fSAlexander Hansen bool matchSseId(const crow::sse_socket::Connection& thisConn); 73*02c1e29fSAlexander Hansen 74*02c1e29fSAlexander Hansen // Check used to indicate what response codes are valid as part of our retry 75*02c1e29fSAlexander Hansen // policy. 2XX is considered acceptable 76*02c1e29fSAlexander Hansen static boost::system::error_code retryRespHandler(unsigned int respCode); 77*02c1e29fSAlexander Hansen 78*02c1e29fSAlexander Hansen std::shared_ptr<persistent_data::UserSubscription> userSub; 79*02c1e29fSAlexander Hansen std::function<void()> deleter; 80*02c1e29fSAlexander Hansen 81*02c1e29fSAlexander Hansen private: 82*02c1e29fSAlexander Hansen uint64_t eventSeqNum = 1; 83*02c1e29fSAlexander Hansen boost::urls::url host; 84*02c1e29fSAlexander Hansen std::shared_ptr<crow::ConnectionPolicy> policy; 85*02c1e29fSAlexander Hansen crow::sse_socket::Connection* sseConn = nullptr; 86*02c1e29fSAlexander Hansen 87*02c1e29fSAlexander Hansen std::optional<crow::HttpClient> client; 88*02c1e29fSAlexander Hansen 89*02c1e29fSAlexander Hansen public: 90*02c1e29fSAlexander Hansen std::optional<filter_ast::LogicalAnd> filter; 91*02c1e29fSAlexander Hansen }; 92*02c1e29fSAlexander Hansen 93*02c1e29fSAlexander Hansen } // namespace redfish 94