102c1e29fSAlexander Hansen /* 202c1e29fSAlexander Hansen Copyright (c) 2020 Intel Corporation 302c1e29fSAlexander Hansen 402c1e29fSAlexander Hansen Licensed under the Apache License, Version 2.0 (the "License"); 502c1e29fSAlexander Hansen you may not use this file except in compliance with the License. 602c1e29fSAlexander Hansen You may obtain a copy of the License at 702c1e29fSAlexander Hansen 802c1e29fSAlexander Hansen http://www.apache.org/licenses/LICENSE-2.0 902c1e29fSAlexander Hansen 1002c1e29fSAlexander Hansen Unless required by applicable law or agreed to in writing, software 1102c1e29fSAlexander Hansen distributed under the License is distributed on an "AS IS" BASIS, 1202c1e29fSAlexander Hansen WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1302c1e29fSAlexander Hansen See the License for the specific language governing permissions and 1402c1e29fSAlexander Hansen limitations under the License. 1502c1e29fSAlexander Hansen */ 1602c1e29fSAlexander Hansen #pragma once 1702c1e29fSAlexander Hansen #include "event_logs_object_type.hpp" 1802c1e29fSAlexander Hansen #include "event_service_store.hpp" 1902c1e29fSAlexander Hansen #include "filter_expr_parser_ast.hpp" 2002c1e29fSAlexander Hansen #include "metric_report.hpp" 2102c1e29fSAlexander Hansen #include "server_sent_event.hpp" 2202c1e29fSAlexander Hansen 2302c1e29fSAlexander Hansen #include <boost/asio/io_context.hpp> 2402c1e29fSAlexander Hansen #include <boost/url/url_view_base.hpp> 2502c1e29fSAlexander Hansen 2602c1e29fSAlexander Hansen #include <memory> 2702c1e29fSAlexander Hansen #include <string> 2802c1e29fSAlexander Hansen 2902c1e29fSAlexander Hansen namespace redfish 3002c1e29fSAlexander Hansen { 3102c1e29fSAlexander Hansen 3202c1e29fSAlexander Hansen static constexpr const char* subscriptionTypeSSE = "SSE"; 3302c1e29fSAlexander Hansen 3402c1e29fSAlexander Hansen static constexpr const uint8_t maxNoOfSubscriptions = 20; 3502c1e29fSAlexander Hansen static constexpr const uint8_t maxNoOfSSESubscriptions = 10; 3602c1e29fSAlexander Hansen 3702c1e29fSAlexander Hansen class Subscription : public std::enable_shared_from_this<Subscription> 3802c1e29fSAlexander Hansen { 3902c1e29fSAlexander Hansen public: 4002c1e29fSAlexander Hansen Subscription(const Subscription&) = delete; 4102c1e29fSAlexander Hansen Subscription& operator=(const Subscription&) = delete; 4202c1e29fSAlexander Hansen Subscription(Subscription&&) = delete; 4302c1e29fSAlexander Hansen Subscription& operator=(Subscription&&) = delete; 4402c1e29fSAlexander Hansen 4502c1e29fSAlexander Hansen Subscription(std::shared_ptr<persistent_data::UserSubscription> userSubIn, 4602c1e29fSAlexander Hansen const boost::urls::url_view_base& url, 4702c1e29fSAlexander Hansen boost::asio::io_context& ioc); 4802c1e29fSAlexander Hansen 4902c1e29fSAlexander Hansen explicit Subscription(crow::sse_socket::Connection& connIn); 5002c1e29fSAlexander Hansen 5102c1e29fSAlexander Hansen ~Subscription() = default; 5202c1e29fSAlexander Hansen 5302c1e29fSAlexander Hansen // callback for subscription sendData 5402c1e29fSAlexander Hansen void resHandler(const std::shared_ptr<Subscription>& /*unused*/, 5502c1e29fSAlexander Hansen const crow::Response& res); 5602c1e29fSAlexander Hansen 57*fb546105SMyung Bae void sendHeartbeatEvent(); 58*fb546105SMyung Bae void scheduleNextHeartbeatEvent(); 59*fb546105SMyung Bae void heartbeatParametersChanged(); 60*fb546105SMyung Bae void onHbTimeout(const std::weak_ptr<Subscription>& weakSelf, 61*fb546105SMyung Bae const boost::system::error_code& ec); 62*fb546105SMyung Bae 6302c1e29fSAlexander Hansen bool sendEventToSubscriber(std::string&& msg); 6402c1e29fSAlexander Hansen 6502c1e29fSAlexander Hansen bool sendTestEventLog(); 6602c1e29fSAlexander Hansen 6702c1e29fSAlexander Hansen void filterAndSendEventLogs( 6802c1e29fSAlexander Hansen const std::vector<EventLogObjectsType>& eventRecords); 6902c1e29fSAlexander Hansen 7002c1e29fSAlexander Hansen void filterAndSendReports(const std::string& reportId, 7102c1e29fSAlexander Hansen const telemetry::TimestampReadings& var); 7202c1e29fSAlexander Hansen 7302c1e29fSAlexander Hansen void updateRetryConfig(uint32_t retryAttempts, 7402c1e29fSAlexander Hansen uint32_t retryTimeoutInterval); 7502c1e29fSAlexander Hansen 7602c1e29fSAlexander Hansen uint64_t getEventSeqNum() const; 7702c1e29fSAlexander Hansen 7802c1e29fSAlexander Hansen bool matchSseId(const crow::sse_socket::Connection& thisConn); 7902c1e29fSAlexander Hansen 8002c1e29fSAlexander Hansen // Check used to indicate what response codes are valid as part of our retry 8102c1e29fSAlexander Hansen // policy. 2XX is considered acceptable 8202c1e29fSAlexander Hansen static boost::system::error_code retryRespHandler(unsigned int respCode); 8302c1e29fSAlexander Hansen 8402c1e29fSAlexander Hansen std::shared_ptr<persistent_data::UserSubscription> userSub; 8502c1e29fSAlexander Hansen std::function<void()> deleter; 8602c1e29fSAlexander Hansen 8702c1e29fSAlexander Hansen private: 8802c1e29fSAlexander Hansen uint64_t eventSeqNum = 1; 8902c1e29fSAlexander Hansen boost::urls::url host; 9002c1e29fSAlexander Hansen std::shared_ptr<crow::ConnectionPolicy> policy; 9102c1e29fSAlexander Hansen crow::sse_socket::Connection* sseConn = nullptr; 9202c1e29fSAlexander Hansen 9302c1e29fSAlexander Hansen std::optional<crow::HttpClient> client; 94*fb546105SMyung Bae boost::asio::steady_timer hbTimer; 9502c1e29fSAlexander Hansen 9602c1e29fSAlexander Hansen public: 9702c1e29fSAlexander Hansen std::optional<filter_ast::LogicalAnd> filter; 9802c1e29fSAlexander Hansen }; 9902c1e29fSAlexander Hansen 10002c1e29fSAlexander Hansen } // namespace redfish 101