xref: /openbmc/bmcweb/features/redfish/include/subscription.hpp (revision 4a19a7b5e62ad2569913d944c84c19f1005c922f)
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"
20d7857201SEd Tanous #include "http_client.hpp"
21d7857201SEd Tanous #include "http_response.hpp"
2202c1e29fSAlexander Hansen #include "metric_report.hpp"
2302c1e29fSAlexander Hansen #include "server_sent_event.hpp"
2402c1e29fSAlexander Hansen 
2502c1e29fSAlexander Hansen #include <boost/asio/io_context.hpp>
26d7857201SEd Tanous #include <boost/asio/steady_timer.hpp>
2702c1e29fSAlexander Hansen #include <boost/url/url_view_base.hpp>
2802c1e29fSAlexander Hansen 
29d7857201SEd Tanous #include <cstdint>
30d7857201SEd Tanous #include <functional>
3102c1e29fSAlexander Hansen #include <memory>
32d7857201SEd Tanous #include <optional>
3302c1e29fSAlexander Hansen #include <string>
34d7857201SEd Tanous #include <vector>
3502c1e29fSAlexander Hansen 
3602c1e29fSAlexander Hansen namespace redfish
3702c1e29fSAlexander Hansen {
3802c1e29fSAlexander Hansen 
3902c1e29fSAlexander Hansen static constexpr const char* subscriptionTypeSSE = "SSE";
4002c1e29fSAlexander Hansen 
4102c1e29fSAlexander Hansen static constexpr const uint8_t maxNoOfSubscriptions = 20;
4202c1e29fSAlexander Hansen static constexpr const uint8_t maxNoOfSSESubscriptions = 10;
4381ee0e74SChandramohan Harkude struct TestEvent
4481ee0e74SChandramohan Harkude {
4581ee0e74SChandramohan Harkude     std::optional<int64_t> eventGroupId;
4681ee0e74SChandramohan Harkude     std::optional<std::string> eventTimestamp;
4781ee0e74SChandramohan Harkude     std::optional<std::string> message;
4881ee0e74SChandramohan Harkude     std::optional<std::vector<std::string>> messageArgs;
4981ee0e74SChandramohan Harkude     std::optional<std::string> messageId;
5081ee0e74SChandramohan Harkude     std::optional<std::string> originOfCondition;
5181ee0e74SChandramohan Harkude     std::optional<std::string> resolution;
5281ee0e74SChandramohan Harkude     std::optional<std::string> severity;
5381ee0e74SChandramohan Harkude };
5402c1e29fSAlexander Hansen 
5502c1e29fSAlexander Hansen class Subscription : public std::enable_shared_from_this<Subscription>
5602c1e29fSAlexander Hansen {
5702c1e29fSAlexander Hansen   public:
5802c1e29fSAlexander Hansen     Subscription(const Subscription&) = delete;
5902c1e29fSAlexander Hansen     Subscription& operator=(const Subscription&) = delete;
6002c1e29fSAlexander Hansen     Subscription(Subscription&&) = delete;
6102c1e29fSAlexander Hansen     Subscription& operator=(Subscription&&) = delete;
6202c1e29fSAlexander Hansen 
6302c1e29fSAlexander Hansen     Subscription(std::shared_ptr<persistent_data::UserSubscription> userSubIn,
6402c1e29fSAlexander Hansen                  const boost::urls::url_view_base& url,
6502c1e29fSAlexander Hansen                  boost::asio::io_context& ioc);
6602c1e29fSAlexander Hansen 
6702c1e29fSAlexander Hansen     explicit Subscription(crow::sse_socket::Connection& connIn);
6802c1e29fSAlexander Hansen 
6902c1e29fSAlexander Hansen     ~Subscription() = default;
7002c1e29fSAlexander Hansen 
7102c1e29fSAlexander Hansen     // callback for subscription sendData
72f2656d1bSAlexander Hansen     void resHandler(const crow::Response& res);
7302c1e29fSAlexander Hansen 
74fb546105SMyung Bae     void sendHeartbeatEvent();
75fb546105SMyung Bae     void scheduleNextHeartbeatEvent();
76fb546105SMyung Bae     void heartbeatParametersChanged();
77fb546105SMyung Bae     void onHbTimeout(const std::weak_ptr<Subscription>& weakSelf,
78fb546105SMyung Bae                      const boost::system::error_code& ec);
79fb546105SMyung Bae 
80*4a19a7b5SEd Tanous     bool sendEventToSubscriber(uint64_t eventId, std::string&& msg);
8102c1e29fSAlexander Hansen 
8202c1e29fSAlexander Hansen     void filterAndSendEventLogs(
83*4a19a7b5SEd Tanous         uint64_t eventId, const std::vector<EventLogObjectsType>& eventRecords);
8402c1e29fSAlexander Hansen 
85*4a19a7b5SEd Tanous     void filterAndSendReports(uint64_t eventId, const std::string& reportId,
8602c1e29fSAlexander Hansen                               const telemetry::TimestampReadings& var);
8702c1e29fSAlexander Hansen 
8802c1e29fSAlexander Hansen     void updateRetryConfig(uint32_t retryAttempts,
8902c1e29fSAlexander Hansen                            uint32_t retryTimeoutInterval);
9002c1e29fSAlexander Hansen 
9102c1e29fSAlexander Hansen     bool matchSseId(const crow::sse_socket::Connection& thisConn);
9202c1e29fSAlexander Hansen 
9302c1e29fSAlexander Hansen     // Check used to indicate what response codes are valid as part of our retry
9402c1e29fSAlexander Hansen     // policy.  2XX is considered acceptable
9502c1e29fSAlexander Hansen     static boost::system::error_code retryRespHandler(unsigned int respCode);
9602c1e29fSAlexander Hansen 
9702c1e29fSAlexander Hansen     std::shared_ptr<persistent_data::UserSubscription> userSub;
9802c1e29fSAlexander Hansen     std::function<void()> deleter;
9902c1e29fSAlexander Hansen 
10002c1e29fSAlexander Hansen   private:
10102c1e29fSAlexander Hansen     boost::urls::url host;
10202c1e29fSAlexander Hansen     std::shared_ptr<crow::ConnectionPolicy> policy;
10302c1e29fSAlexander Hansen     crow::sse_socket::Connection* sseConn = nullptr;
10402c1e29fSAlexander Hansen 
10502c1e29fSAlexander Hansen     std::optional<crow::HttpClient> client;
106fb546105SMyung Bae     boost::asio::steady_timer hbTimer;
10702c1e29fSAlexander Hansen 
10802c1e29fSAlexander Hansen   public:
10902c1e29fSAlexander Hansen     std::optional<filter_ast::LogicalAnd> filter;
11002c1e29fSAlexander Hansen };
11102c1e29fSAlexander Hansen 
11202c1e29fSAlexander Hansen } // namespace redfish
113