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