LCOV - code coverage report
Current view: top level - source/server - configuration_impl.h (source / functions) Hit Total Coverage
Test: coverage.dat Lines: 28 32 87.5 %
Date: 2024-01-05 06:35:25 Functions: 22 26 84.6 %

          Line data    Source code
       1             : #pragma once
       2             : 
       3             : #include <chrono>
       4             : #include <cstdint>
       5             : #include <functional>
       6             : #include <list>
       7             : #include <memory>
       8             : #include <string>
       9             : #include <utility>
      10             : 
      11             : #include "envoy/config/bootstrap/v3/bootstrap.pb.h"
      12             : #include "envoy/config/trace/v3/http_tracer.pb.h"
      13             : #include "envoy/config/typed_config.h"
      14             : #include "envoy/filter/config_provider_manager.h"
      15             : #include "envoy/http/filter.h"
      16             : #include "envoy/network/filter.h"
      17             : #include "envoy/server/configuration.h"
      18             : #include "envoy/server/filter_config.h"
      19             : #include "envoy/server/instance.h"
      20             : 
      21             : #include "source/common/common/logger.h"
      22             : #include "source/common/network/resolver_impl.h"
      23             : #include "source/common/network/utility.h"
      24             : 
      25             : namespace Envoy {
      26             : namespace Server {
      27             : namespace Configuration {
      28             : 
      29             : /**
      30             :  * Implemented for each Stats::Sink and registered via Registry::registerFactory() or
      31             :  * the convenience class RegisterFactory.
      32             :  */
      33             : class StatsSinkFactory : public Config::TypedFactory {
      34             : public:
      35           0 :   ~StatsSinkFactory() override = default;
      36             : 
      37             :   /**
      38             :    * Create a particular Stats::Sink implementation. If the implementation is unable to produce a
      39             :    * Stats::Sink with the provided parameters, it should throw an EnvoyException. The returned
      40             :    * pointer should always be valid.
      41             :    * @param config supplies the custom proto configuration for the Stats::Sink
      42             :    * @param server supplies the server instance
      43             :    */
      44             :   virtual Stats::SinkPtr createStatsSink(const Protobuf::Message& config,
      45             :                                          Server::Configuration::ServerFactoryContext& server) PURE;
      46             : 
      47          16 :   std::string category() const override { return "envoy.stats_sinks"; }
      48             : };
      49             : 
      50             : class StatsConfigImpl : public StatsConfig {
      51             : public:
      52             :   StatsConfigImpl(const envoy::config::bootstrap::v3::Bootstrap& bootstrap);
      53             : 
      54         222 :   const std::list<Stats::SinkPtr>& sinks() const override { return sinks_; }
      55         222 :   std::chrono::milliseconds flushInterval() const override { return flush_interval_; }
      56         111 :   bool flushOnAdmin() const override { return flush_on_admin_; }
      57             : 
      58           0 :   void addSink(Stats::SinkPtr sink) { sinks_.emplace_back(std::move(sink)); }
      59         159 :   bool enableDeferredCreationStats() const override {
      60         159 :     return deferred_stat_options_.enable_deferred_creation_stats();
      61         159 :   }
      62             : 
      63             : private:
      64             :   std::list<Stats::SinkPtr> sinks_;
      65             :   std::chrono::milliseconds flush_interval_;
      66             :   bool flush_on_admin_{false};
      67             :   const envoy::config::bootstrap::v3::Bootstrap::DeferredStatOptions deferred_stat_options_;
      68             : };
      69             : 
      70             : /**
      71             :  * Utilities for creating a filter chain for a network connection.
      72             :  */
      73             : class FilterChainUtility {
      74             : public:
      75             :   /**
      76             :    * Given a connection and a list of factories, create a new filter chain. Chain creation will
      77             :    * exit early if any filters immediately close the connection.
      78             :    */
      79             :   static bool buildFilterChain(Network::FilterManager& filter_manager,
      80             :                                const Filter::NetworkFilterFactoriesList& factories);
      81             : 
      82             :   /**
      83             :    * Given a ListenerFilterManager and a list of factories, create a new filter chain. Chain
      84             :    * creation will exit early if any filters immediately close the connection.
      85             :    *
      86             :    * TODO(sumukhs): Coalesce with the above as they are very similar
      87             :    */
      88             :   static bool buildFilterChain(Network::ListenerFilterManager& filter_manager,
      89             :                                const Filter::ListenerFilterFactoriesList& factories);
      90             : 
      91             :   /**
      92             :    * Given a UdpListenerFilterManager and a list of factories, create a new filter chain. Chain
      93             :    * creation will exit early if any filters immediately close the connection.
      94             :    */
      95             :   static void
      96             :   buildUdpFilterChain(Network::UdpListenerFilterManager& filter_manager,
      97             :                       Network::UdpReadFilterCallbacks& callbacks,
      98             :                       const std::vector<Network::UdpListenerFilterFactoryCb>& factories);
      99             : 
     100             :   /**
     101             :    * Given a QuicListenerFilterManager and a list of factories, create a new filter chain. Chain
     102             :    * creation will exit early if any filters don't have a valid config.
     103             :    *
     104             :    * TODO(sumukhs): Coalesce with the above as they are very similar
     105             :    */
     106             :   static bool buildQuicFilterChain(Network::QuicListenerFilterManager& filter_manager,
     107             :                                    const Filter::QuicListenerFilterFactoriesList& factories);
     108             : };
     109             : 
     110             : /**
     111             :  * Implementation of Server::Configuration::Main that reads a configuration from
     112             :  * a JSON file.
     113             :  */
     114             : class MainImpl : Logger::Loggable<Logger::Id::config>, public Main {
     115             : public:
     116             :   /**
     117             :    * MainImpl is created in two phases. In the first phase it is
     118             :    * default-constructed without a configuration as part of the server. The
     119             :    * server won't be fully populated yet. initialize() applies the
     120             :    * configuration in the second phase, as it requires a fully populated server.
     121             :    *
     122             :    * @param bootstrap v2 bootstrap proto.
     123             :    * @param server supplies the owning server.
     124             :    * @param cluster_manager_factory supplies the cluster manager creation factory.
     125             :    */
     126             :   void initialize(const envoy::config::bootstrap::v3::Bootstrap& bootstrap, Instance& server,
     127             :                   Upstream::ClusterManagerFactory& cluster_manager_factory);
     128             : 
     129             :   // Server::Configuration::Main
     130        2808 :   Upstream::ClusterManager* clusterManager() override { return cluster_manager_.get(); }
     131           0 :   const Upstream::ClusterManager* clusterManager() const override { return cluster_manager_.get(); }
     132         381 :   StatsConfig& statsConfig() override { return *stats_config_; }
     133         222 :   const Watchdog& mainThreadWatchdogConfig() const override { return *main_thread_watchdog_; }
     134           0 :   const Watchdog& workerWatchdogConfig() const override { return *worker_watchdog_; }
     135             : 
     136             : private:
     137             :   /**
     138             :    * Initialize tracers and corresponding sinks.
     139             :    */
     140             :   void initializeTracers(const envoy::config::trace::v3::Tracing& configuration, Instance& server);
     141             : 
     142             :   /**
     143             :    * Initialize stats configuration.
     144             :    */
     145             :   void initializeStatsConfig(const envoy::config::bootstrap::v3::Bootstrap& bootstrap,
     146             :                              Instance& server);
     147             : 
     148             :   /**
     149             :    * Initialize watchdog(s). Call before accessing any watchdog configuration.
     150             :    */
     151             :   void initializeWatchdogs(const envoy::config::bootstrap::v3::Bootstrap& bootstrap,
     152             :                            Instance& server);
     153             : 
     154             :   std::unique_ptr<Upstream::ClusterManager> cluster_manager_;
     155             :   std::unique_ptr<StatsConfigImpl> stats_config_;
     156             :   std::unique_ptr<Watchdog> main_thread_watchdog_;
     157             :   std::unique_ptr<Watchdog> worker_watchdog_;
     158             : };
     159             : 
     160             : class WatchdogImpl : public Watchdog {
     161             : public:
     162             :   WatchdogImpl(const envoy::config::bootstrap::v3::Watchdog& watchdog, Instance& server);
     163             : 
     164         222 :   std::chrono::milliseconds missTimeout() const override { return miss_timeout_; }
     165         222 :   std::chrono::milliseconds megaMissTimeout() const override { return megamiss_timeout_; }
     166         444 :   std::chrono::milliseconds killTimeout() const override { return kill_timeout_; }
     167         444 :   std::chrono::milliseconds multiKillTimeout() const override { return multikill_timeout_; }
     168         222 :   double multiKillThreshold() const override { return multikill_threshold_; }
     169             :   Protobuf::RepeatedPtrField<envoy::config::bootstrap::v3::Watchdog::WatchdogAction>
     170         222 :   actions() const override {
     171         222 :     return actions_;
     172         222 :   }
     173             : 
     174             : private:
     175             :   std::chrono::milliseconds miss_timeout_;
     176             :   std::chrono::milliseconds megamiss_timeout_;
     177             :   std::chrono::milliseconds kill_timeout_;
     178             :   std::chrono::milliseconds multikill_timeout_;
     179             :   double multikill_threshold_;
     180             :   Protobuf::RepeatedPtrField<envoy::config::bootstrap::v3::Watchdog::WatchdogAction> actions_;
     181             : };
     182             : 
     183             : /**
     184             :  * Initial configuration that reads from JSON.
     185             :  */
     186             : class InitialImpl : public Initial {
     187             : public:
     188             :   InitialImpl(const envoy::config::bootstrap::v3::Bootstrap& bootstrap);
     189             : 
     190             :   // Server::Configuration::Initial
     191         934 :   Admin& admin() override { return admin_; }
     192         134 :   absl::optional<std::string> flagsPath() const override { return flags_path_; }
     193         131 :   const envoy::config::bootstrap::v3::LayeredRuntime& runtime() override {
     194         131 :     return layered_runtime_;
     195         131 :   }
     196             : 
     197             :   /**
     198             :    * Initialize admin access log.
     199             :    */
     200             :   void initAdminAccessLog(const envoy::config::bootstrap::v3::Bootstrap& bootstrap,
     201             :                           FactoryContext& factory_context);
     202             : 
     203             : private:
     204             :   struct AdminImpl : public Admin {
     205             :     // Server::Configuration::Initial::Admin
     206         134 :     const std::string& profilePath() const override { return profile_path_; }
     207         470 :     Network::Address::InstanceConstSharedPtr address() override { return address_; }
     208          98 :     Network::Socket::OptionsSharedPtr socketOptions() override { return socket_options_; }
     209          98 :     std::list<AccessLog::InstanceSharedPtr> accessLogs() const override { return access_logs_; }
     210         134 :     bool ignoreGlobalConnLimit() const override { return ignore_global_conn_limit_; }
     211             : 
     212             :     std::string profile_path_;
     213             :     std::list<AccessLog::InstanceSharedPtr> access_logs_;
     214             :     Network::Address::InstanceConstSharedPtr address_;
     215             :     Network::Socket::OptionsSharedPtr socket_options_;
     216             :     bool ignore_global_conn_limit_;
     217             :   };
     218             : 
     219             :   AdminImpl admin_;
     220             :   absl::optional<std::string> flags_path_;
     221             :   envoy::config::bootstrap::v3::LayeredRuntime layered_runtime_;
     222             : };
     223             : 
     224             : } // namespace Configuration
     225             : } // namespace Server
     226             : } // namespace Envoy

Generated by: LCOV version 1.15