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