xref: /openbmc/bmcweb/features/redfish/include/subscription.hpp (revision f2656d1b941f52d20e44fa216a8f09627ab96aca)
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;
3681ee0e74SChandramohan Harkude struct TestEvent
3781ee0e74SChandramohan Harkude {
3881ee0e74SChandramohan Harkude     std::optional<int64_t> eventGroupId;
3981ee0e74SChandramohan Harkude     std::optional<std::string> eventId;
4081ee0e74SChandramohan Harkude     std::optional<std::string> eventTimestamp;
4181ee0e74SChandramohan Harkude     std::optional<std::string> message;
4281ee0e74SChandramohan Harkude     std::optional<std::vector<std::string>> messageArgs;
4381ee0e74SChandramohan Harkude     std::optional<std::string> messageId;
4481ee0e74SChandramohan Harkude     std::optional<std::string> originOfCondition;
4581ee0e74SChandramohan Harkude     std::optional<std::string> resolution;
4681ee0e74SChandramohan Harkude     std::optional<std::string> severity;
4781ee0e74SChandramohan Harkude     // default constructor
4881ee0e74SChandramohan Harkude     TestEvent() = default;
4981ee0e74SChandramohan Harkude     // default assignment operator
5081ee0e74SChandramohan Harkude     TestEvent& operator=(const TestEvent&) = default;
5181ee0e74SChandramohan Harkude     // default copy constructor
5281ee0e74SChandramohan Harkude     TestEvent(const TestEvent&) = default;
5381ee0e74SChandramohan Harkude     // default move constructor
5481ee0e74SChandramohan Harkude     TestEvent(TestEvent&&) = default;
5581ee0e74SChandramohan Harkude     // default move assignment operator
5681ee0e74SChandramohan Harkude     TestEvent& operator=(TestEvent&&) = default;
5781ee0e74SChandramohan Harkude     // default destructor
5881ee0e74SChandramohan Harkude     ~TestEvent() = default;
5981ee0e74SChandramohan 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
78*f2656d1bSAlexander Hansen     void resHandler(const crow::Response& res);
7902c1e29fSAlexander Hansen 
80fb546105SMyung Bae     void sendHeartbeatEvent();
81fb546105SMyung Bae     void scheduleNextHeartbeatEvent();
82fb546105SMyung Bae     void heartbeatParametersChanged();
83fb546105SMyung Bae     void onHbTimeout(const std::weak_ptr<Subscription>& weakSelf,
84fb546105SMyung Bae                      const boost::system::error_code& ec);
85fb546105SMyung Bae 
8602c1e29fSAlexander Hansen     bool sendEventToSubscriber(std::string&& msg);
8702c1e29fSAlexander Hansen 
8881ee0e74SChandramohan Harkude     bool sendTestEventLog(TestEvent& testEvent);
8902c1e29fSAlexander Hansen 
9002c1e29fSAlexander Hansen     void filterAndSendEventLogs(
9102c1e29fSAlexander Hansen         const std::vector<EventLogObjectsType>& eventRecords);
9202c1e29fSAlexander Hansen 
9302c1e29fSAlexander Hansen     void filterAndSendReports(const std::string& reportId,
9402c1e29fSAlexander Hansen                               const telemetry::TimestampReadings& var);
9502c1e29fSAlexander Hansen 
9602c1e29fSAlexander Hansen     void updateRetryConfig(uint32_t retryAttempts,
9702c1e29fSAlexander Hansen                            uint32_t retryTimeoutInterval);
9802c1e29fSAlexander Hansen 
9902c1e29fSAlexander Hansen     uint64_t getEventSeqNum() const;
10002c1e29fSAlexander Hansen 
10102c1e29fSAlexander Hansen     bool matchSseId(const crow::sse_socket::Connection& thisConn);
10202c1e29fSAlexander Hansen 
10302c1e29fSAlexander Hansen     // Check used to indicate what response codes are valid as part of our retry
10402c1e29fSAlexander Hansen     // policy.  2XX is considered acceptable
10502c1e29fSAlexander Hansen     static boost::system::error_code retryRespHandler(unsigned int respCode);
10602c1e29fSAlexander Hansen 
10702c1e29fSAlexander Hansen     std::shared_ptr<persistent_data::UserSubscription> userSub;
10802c1e29fSAlexander Hansen     std::function<void()> deleter;
10902c1e29fSAlexander Hansen 
11002c1e29fSAlexander Hansen   private:
11102c1e29fSAlexander Hansen     uint64_t eventSeqNum = 1;
11202c1e29fSAlexander Hansen     boost::urls::url host;
11302c1e29fSAlexander Hansen     std::shared_ptr<crow::ConnectionPolicy> policy;
11402c1e29fSAlexander Hansen     crow::sse_socket::Connection* sseConn = nullptr;
11502c1e29fSAlexander Hansen 
11602c1e29fSAlexander Hansen     std::optional<crow::HttpClient> client;
117fb546105SMyung Bae     boost::asio::steady_timer hbTimer;
11802c1e29fSAlexander Hansen 
11902c1e29fSAlexander Hansen   public:
12002c1e29fSAlexander Hansen     std::optional<filter_ast::LogicalAnd> filter;
12102c1e29fSAlexander Hansen };
12202c1e29fSAlexander Hansen 
12302c1e29fSAlexander Hansen } // namespace redfish
124