LCOV - code coverage report
Current view: top level - source/server/config_validation - server.h (source / functions) Hit Total Coverage
Test: coverage.dat Lines: 8 69 11.6 %
Date: 2024-01-05 06:35:25 Functions: 6 48 12.5 %

          Line data    Source code
       1             : #pragma once
       2             : 
       3             : #include <iostream>
       4             : 
       5             : #include "envoy/config/bootstrap/v3/bootstrap.pb.h"
       6             : #include "envoy/config/core/v3/config_source.pb.h"
       7             : #include "envoy/config/listener/v3/listener.pb.h"
       8             : #include "envoy/config/listener/v3/listener_components.pb.h"
       9             : #include "envoy/event/timer.h"
      10             : #include "envoy/server/drain_manager.h"
      11             : #include "envoy/server/instance.h"
      12             : #include "envoy/ssl/context_manager.h"
      13             : #include "envoy/tracing/tracer.h"
      14             : 
      15             : #include "source/common/access_log/access_log_manager_impl.h"
      16             : #include "source/common/common/assert.h"
      17             : #include "source/common/common/random_generator.h"
      18             : #include "source/common/grpc/common.h"
      19             : #include "source/common/network/dns_resolver/dns_factory_util.h"
      20             : #include "source/common/protobuf/message_validator_impl.h"
      21             : #include "source/common/quic/quic_stat_names.h"
      22             : #include "source/common/router/context_impl.h"
      23             : #include "source/common/router/rds_impl.h"
      24             : #include "source/common/runtime/runtime_impl.h"
      25             : #include "source/common/secret/secret_manager_impl.h"
      26             : #include "source/common/thread_local/thread_local_impl.h"
      27             : #include "source/server/config_validation/admin.h"
      28             : #include "source/server/config_validation/api.h"
      29             : #include "source/server/config_validation/cluster_manager.h"
      30             : #include "source/server/config_validation/dns.h"
      31             : #include "source/server/hot_restart_nop_impl.h"
      32             : #include "source/server/server.h"
      33             : 
      34             : #include "absl/types/optional.h"
      35             : 
      36             : namespace Envoy {
      37             : namespace Server {
      38             : 
      39             : /**
      40             :  * validateConfig() takes over from main() for a config-validation run of Envoy. It returns true if
      41             :  * the config is valid, false if invalid.
      42             :  */
      43             : bool validateConfig(const Options& options,
      44             :                     const Network::Address::InstanceConstSharedPtr& local_address,
      45             :                     ComponentFactory& component_factory, Thread::ThreadFactory& thread_factory,
      46             :                     Filesystem::Instance& file_system,
      47             :                     const ProcessContextOptRef& process_context = absl::nullopt);
      48             : 
      49             : /**
      50             :  * ValidationInstance does the bulk of the work for config-validation runs of Envoy. It implements
      51             :  * Server::Instance, but some functionality not needed until serving time, such as updating
      52             :  * health-check status, is not implemented. Everything else is written in terms of other
      53             :  * validation-specific interface implementations, with the end result that we can load and
      54             :  * initialize a configuration, skipping any steps that affect the outside world (such as
      55             :  * hot-restarting or connecting to upstream clusters) but otherwise exercising the entire startup
      56             :  * flow.
      57             :  *
      58             :  * If we finish initialization, and reach the point where an ordinary Envoy run would begin serving
      59             :  * requests, the validation is considered successful.
      60             :  */
      61             : class ValidationInstance final : Logger::Loggable<Logger::Id::main>,
      62             :                                  public Instance,
      63             :                                  public ServerLifecycleNotifier,
      64             :                                  public WorkerFactory {
      65             : public:
      66             :   ValidationInstance(const Options& options, Event::TimeSystem& time_system,
      67             :                      const Network::Address::InstanceConstSharedPtr& local_address,
      68             :                      Stats::IsolatedStoreImpl& store, Thread::BasicLockable& access_log_lock,
      69             :                      ComponentFactory& component_factory, Thread::ThreadFactory& thread_factory,
      70             :                      Filesystem::Instance& file_system,
      71             :                      const ProcessContextOptRef& process_context = absl::nullopt);
      72             : 
      73             :   // Server::Instance
      74           0 :   void run() override { PANIC("not implemented"); }
      75           0 :   OptRef<Admin> admin() override {
      76           0 :     return makeOptRefFromPtr(static_cast<Envoy::Server::Admin*>(admin_.get()));
      77           0 :   }
      78           0 :   Api::Api& api() override { return *api_; }
      79           0 :   Upstream::ClusterManager& clusterManager() override { return *config_.clusterManager(); }
      80           0 :   const Upstream::ClusterManager& clusterManager() const override {
      81           0 :     return *config_.clusterManager();
      82           0 :   }
      83           0 :   Ssl::ContextManager& sslContextManager() override { return *ssl_context_manager_; }
      84         114 :   Event::Dispatcher& dispatcher() override { return *dispatcher_; }
      85           0 :   Network::DnsResolverSharedPtr dnsResolver() override {
      86           0 :     envoy::config::core::v3::TypedExtensionConfig typed_dns_resolver_config;
      87           0 :     Network::DnsResolverFactory& dns_resolver_factory =
      88           0 :         Network::createDefaultDnsResolverFactory(typed_dns_resolver_config);
      89           0 :     return dns_resolver_factory.createDnsResolver(dispatcher(), api(), typed_dns_resolver_config);
      90           0 :   }
      91           0 :   void drainListeners(OptRef<const Network::ExtraShutdownListenerOptions>) override {}
      92           0 :   DrainManager& drainManager() override { return *drain_manager_; }
      93           3 :   AccessLog::AccessLogManager& accessLogManager() override { return access_log_manager_; }
      94           0 :   void failHealthcheck(bool) override {}
      95           0 :   HotRestart& hotRestart() override { return nop_hot_restart_; }
      96           0 :   Init::Manager& initManager() override { return init_manager_; }
      97           0 :   ServerLifecycleNotifier& lifecycleNotifier() override { return *this; }
      98           0 :   ListenerManager& listenerManager() override { return *listener_manager_; }
      99           0 :   Secret::SecretManager& secretManager() override { return *secret_manager_; }
     100           0 :   Runtime::Loader& runtime() override { return *runtime_; }
     101             :   void shutdown() override;
     102           0 :   bool isShutdown() override { return false; }
     103           0 :   void shutdownAdmin() override {}
     104           0 :   Singleton::Manager& singletonManager() override { return *singleton_manager_; }
     105           0 :   OverloadManager& overloadManager() override { return *overload_manager_; }
     106           0 :   bool healthCheckFailed() override { return false; }
     107           0 :   const Options& options() override { return options_; }
     108           0 :   time_t startTimeCurrentEpoch() override { PANIC("not implemented"); }
     109           0 :   time_t startTimeFirstEpoch() override { PANIC("not implemented"); }
     110         768 :   Stats::Store& stats() override { return stats_store_; }
     111           0 :   Grpc::Context& grpcContext() override { return grpc_context_; }
     112           0 :   Http::Context& httpContext() override { return http_context_; }
     113           0 :   Router::Context& routerContext() override { return router_context_; }
     114           0 :   ProcessContextOptRef processContext() override { return api_->processContext(); }
     115         114 :   ThreadLocal::Instance& threadLocal() override { return thread_local_; }
     116           0 :   LocalInfo::LocalInfo& localInfo() const override { return *local_info_; }
     117           0 :   TimeSource& timeSource() override { return api_->timeSource(); }
     118           0 :   Envoy::MutexTracer* mutexTracer() override { return mutex_tracer_; }
     119           0 :   void flushStats() override {}
     120         658 :   ProtobufMessage::ValidationContext& messageValidationContext() override {
     121         658 :     return validation_context_;
     122         658 :   }
     123           0 :   bool enableReusePortDefault() override { return true; }
     124             : 
     125           0 :   Configuration::StatsConfig& statsConfig() override { return config_.statsConfig(); }
     126           0 :   envoy::config::bootstrap::v3::Bootstrap& bootstrap() override { return bootstrap_; }
     127         117 :   Configuration::ServerFactoryContext& serverFactoryContext() override { return server_contexts_; }
     128           0 :   Configuration::TransportSocketFactoryContext& transportSocketFactoryContext() override {
     129           0 :     return server_contexts_;
     130           0 :   }
     131           0 :   void setDefaultTracingConfig(const envoy::config::trace::v3::Tracing& tracing_config) override {
     132           0 :     http_context_.setDefaultTracingConfig(tracing_config);
     133           0 :   }
     134           0 :   void setSinkPredicates(std::unique_ptr<Stats::SinkPredicates>&&) override {}
     135             : 
     136             :   // Server::WorkerFactory
     137           0 :   WorkerPtr createWorker(uint32_t, OverloadManager&, const std::string&) override {
     138             :     // Returned workers are not currently used so we can return nothing here safely vs. a
     139             :     // validation mock.
     140           0 :     return nullptr;
     141           0 :   }
     142             : 
     143             :   // ServerLifecycleNotifier
     144           0 :   ServerLifecycleNotifier::HandlePtr registerCallback(Stage, StageCallback) override {
     145           0 :     return nullptr;
     146           0 :   }
     147           0 :   ServerLifecycleNotifier::HandlePtr registerCallback(Stage, StageCallbackWithCompletion) override {
     148           0 :     return nullptr;
     149           0 :   }
     150             : 
     151             : private:
     152             :   void initialize(const Options& options,
     153             :                   const Network::Address::InstanceConstSharedPtr& local_address,
     154             :                   ComponentFactory& component_factory);
     155             : 
     156             :   // init_manager_ must come before any member that participates in initialization, and destructed
     157             :   // only after referencing members are gone, since initialization continuation can potentially
     158             :   // occur at any point during member lifetime.
     159             :   Init::ManagerImpl init_manager_{"Validation server"};
     160           0 :   Init::WatcherImpl init_watcher_{"(no-op)", []() {}};
     161             :   // secret_manager_ must come before listener_manager_, config_ and dispatcher_, and destructed
     162             :   // only after these members can no longer reference it, since:
     163             :   // - There may be active filter chains referencing it in listener_manager_.
     164             :   // - There may be active clusters referencing it in config_.cluster_manager_.
     165             :   // - There may be active connections referencing it.
     166             :   std::unique_ptr<Secret::SecretManager> secret_manager_;
     167             :   const Options& options_;
     168             :   ProtobufMessage::ProdValidationContextImpl validation_context_;
     169             :   Stats::IsolatedStoreImpl& stats_store_;
     170             :   ThreadLocal::InstanceImpl thread_local_;
     171             :   envoy::config::bootstrap::v3::Bootstrap bootstrap_;
     172             :   Api::ApiPtr api_;
     173             :   // ssl_context_manager_ must come before dispatcher_, since ClusterInfo
     174             :   // references SslSocketFactory and is deleted on the main thread via the dispatcher.
     175             :   std::unique_ptr<Ssl::ContextManager> ssl_context_manager_;
     176             :   Event::DispatcherPtr dispatcher_;
     177             :   std::unique_ptr<Server::ValidationAdmin> admin_;
     178             :   Singleton::ManagerPtr singleton_manager_;
     179             :   std::unique_ptr<Runtime::Loader> runtime_;
     180             :   Random::RandomGeneratorImpl random_generator_;
     181             :   Configuration::MainImpl config_;
     182             :   LocalInfo::LocalInfoPtr local_info_;
     183             :   AccessLog::AccessLogManagerImpl access_log_manager_;
     184             :   std::unique_ptr<Upstream::ValidationClusterManagerFactory> cluster_manager_factory_;
     185             :   std::unique_ptr<ListenerManager> listener_manager_;
     186             :   std::unique_ptr<OverloadManager> overload_manager_;
     187             :   MutexTracer* mutex_tracer_{nullptr};
     188             :   Grpc::ContextImpl grpc_context_;
     189             :   Http::ContextImpl http_context_;
     190             :   Router::ContextImpl router_context_;
     191             :   Event::TimeSystem& time_system_;
     192             :   ServerFactoryContextImpl server_contexts_;
     193             :   Quic::QuicStatNames quic_stat_names_;
     194             :   Filter::TcpListenerFilterConfigProviderManagerImpl tcp_listener_config_provider_manager_;
     195             :   Server::DrainManagerPtr drain_manager_;
     196             :   HotRestartNopImpl nop_hot_restart_;
     197             : };
     198             : 
     199             : } // namespace Server
     200             : } // namespace Envoy

Generated by: LCOV version 1.15