xref: /openbmc/bmcweb/features/redfish/include/subscription.hpp (revision 02c1e29fceae14aa5cb7a1b3d6bcaa4c0a256f2e)
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