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; 36*81ee0e74SChandramohan Harkude struct TestEvent 37*81ee0e74SChandramohan Harkude { 38*81ee0e74SChandramohan Harkude std::optional<int64_t> eventGroupId; 39*81ee0e74SChandramohan Harkude std::optional<std::string> eventId; 40*81ee0e74SChandramohan Harkude std::optional<std::string> eventTimestamp; 41*81ee0e74SChandramohan Harkude std::optional<std::string> message; 42*81ee0e74SChandramohan Harkude std::optional<std::vector<std::string>> messageArgs; 43*81ee0e74SChandramohan Harkude std::optional<std::string> messageId; 44*81ee0e74SChandramohan Harkude std::optional<std::string> originOfCondition; 45*81ee0e74SChandramohan Harkude std::optional<std::string> resolution; 46*81ee0e74SChandramohan Harkude std::optional<std::string> severity; 47*81ee0e74SChandramohan Harkude // default constructor 48*81ee0e74SChandramohan Harkude TestEvent() = default; 49*81ee0e74SChandramohan Harkude // default assignment operator 50*81ee0e74SChandramohan Harkude TestEvent& operator=(const TestEvent&) = default; 51*81ee0e74SChandramohan Harkude // default copy constructor 52*81ee0e74SChandramohan Harkude TestEvent(const TestEvent&) = default; 53*81ee0e74SChandramohan Harkude // default move constructor 54*81ee0e74SChandramohan Harkude TestEvent(TestEvent&&) = default; 55*81ee0e74SChandramohan Harkude // default move assignment operator 56*81ee0e74SChandramohan Harkude TestEvent& operator=(TestEvent&&) = default; 57*81ee0e74SChandramohan Harkude // default destructor 58*81ee0e74SChandramohan Harkude ~TestEvent() = default; 59*81ee0e74SChandramohan Harkude }; 6002c1e29fSAlexander Hansen 6102c1e29fSAlexander Hansen class Subscription : public std::enable_shared_from_this<Subscription> 6202c1e29fSAlexander Hansen { 6302c1e29fSAlexander Hansen public: 6402c1e29fSAlexander Hansen Subscription(const Subscription&) = delete; 6502c1e29fSAlexander Hansen Subscription& operator=(const Subscription&) = delete; 6602c1e29fSAlexander Hansen Subscription(Subscription&&) = delete; 6702c1e29fSAlexander Hansen Subscription& operator=(Subscription&&) = delete; 6802c1e29fSAlexander Hansen 6902c1e29fSAlexander Hansen Subscription(std::shared_ptr<persistent_data::UserSubscription> userSubIn, 7002c1e29fSAlexander Hansen const boost::urls::url_view_base& url, 7102c1e29fSAlexander Hansen boost::asio::io_context& ioc); 7202c1e29fSAlexander Hansen 7302c1e29fSAlexander Hansen explicit Subscription(crow::sse_socket::Connection& connIn); 7402c1e29fSAlexander Hansen 7502c1e29fSAlexander Hansen ~Subscription() = default; 7602c1e29fSAlexander Hansen 7702c1e29fSAlexander Hansen // callback for subscription sendData 7802c1e29fSAlexander Hansen void resHandler(const std::shared_ptr<Subscription>& /*unused*/, 7902c1e29fSAlexander Hansen const crow::Response& res); 8002c1e29fSAlexander Hansen 81fb546105SMyung Bae void sendHeartbeatEvent(); 82fb546105SMyung Bae void scheduleNextHeartbeatEvent(); 83fb546105SMyung Bae void heartbeatParametersChanged(); 84fb546105SMyung Bae void onHbTimeout(const std::weak_ptr<Subscription>& weakSelf, 85fb546105SMyung Bae const boost::system::error_code& ec); 86fb546105SMyung Bae 8702c1e29fSAlexander Hansen bool sendEventToSubscriber(std::string&& msg); 8802c1e29fSAlexander Hansen 89*81ee0e74SChandramohan Harkude bool sendTestEventLog(TestEvent& testEvent); 9002c1e29fSAlexander Hansen 9102c1e29fSAlexander Hansen void filterAndSendEventLogs( 9202c1e29fSAlexander Hansen const std::vector<EventLogObjectsType>& eventRecords); 9302c1e29fSAlexander Hansen 9402c1e29fSAlexander Hansen void filterAndSendReports(const std::string& reportId, 9502c1e29fSAlexander Hansen const telemetry::TimestampReadings& var); 9602c1e29fSAlexander Hansen 9702c1e29fSAlexander Hansen void updateRetryConfig(uint32_t retryAttempts, 9802c1e29fSAlexander Hansen uint32_t retryTimeoutInterval); 9902c1e29fSAlexander Hansen 10002c1e29fSAlexander Hansen uint64_t getEventSeqNum() const; 10102c1e29fSAlexander Hansen 10202c1e29fSAlexander Hansen bool matchSseId(const crow::sse_socket::Connection& thisConn); 10302c1e29fSAlexander Hansen 10402c1e29fSAlexander Hansen // Check used to indicate what response codes are valid as part of our retry 10502c1e29fSAlexander Hansen // policy. 2XX is considered acceptable 10602c1e29fSAlexander Hansen static boost::system::error_code retryRespHandler(unsigned int respCode); 10702c1e29fSAlexander Hansen 10802c1e29fSAlexander Hansen std::shared_ptr<persistent_data::UserSubscription> userSub; 10902c1e29fSAlexander Hansen std::function<void()> deleter; 11002c1e29fSAlexander Hansen 11102c1e29fSAlexander Hansen private: 11202c1e29fSAlexander Hansen uint64_t eventSeqNum = 1; 11302c1e29fSAlexander Hansen boost::urls::url host; 11402c1e29fSAlexander Hansen std::shared_ptr<crow::ConnectionPolicy> policy; 11502c1e29fSAlexander Hansen crow::sse_socket::Connection* sseConn = nullptr; 11602c1e29fSAlexander Hansen 11702c1e29fSAlexander Hansen std::optional<crow::HttpClient> client; 118fb546105SMyung Bae boost::asio::steady_timer hbTimer; 11902c1e29fSAlexander Hansen 12002c1e29fSAlexander Hansen public: 12102c1e29fSAlexander Hansen std::optional<filter_ast::LogicalAnd> filter; 12202c1e29fSAlexander Hansen }; 12302c1e29fSAlexander Hansen 12402c1e29fSAlexander Hansen } // namespace redfish 125