1
#pragma once
2

            
3
#include "envoy/config/bootstrap/v3/bootstrap.pb.h"
4
#include "envoy/config/core/v3/config_source.pb.h"
5
#include "envoy/secret/secret_manager.h"
6
#include "envoy/server/options.h"
7
#include "envoy/upstream/cluster_manager.h"
8

            
9
#include "source/common/http/context_impl.h"
10
#include "source/common/upstream/cluster_manager_impl.h"
11

            
12
namespace Envoy {
13
namespace Upstream {
14

            
15
/**
16
 * Config-validation-only implementation of ClusterManagerFactory, which creates
17
 * ValidationClusterManagers. It also creates, but never returns, CdsApiImpls.
18
 */
19
class ValidationClusterManagerFactory : public ProdClusterManagerFactory {
20
public:
21
  using ProdClusterManagerFactory::ProdClusterManagerFactory;
22

            
23
  explicit ValidationClusterManagerFactory(
24
      Server::Configuration::ServerFactoryContext& server_context,
25
      LazyCreateDnsResolver dns_resolver_fn, Quic::QuicStatNames& quic_stat_names)
26
136
      : ProdClusterManagerFactory(server_context, dns_resolver_fn, quic_stat_names) {}
27

            
28
  absl::StatusOr<ClusterManagerPtr>
29
  clusterManagerFromProto(const envoy::config::bootstrap::v3::Bootstrap& bootstrap) override;
30

            
31
  // Delegates to ProdClusterManagerFactory::createCds, but discards the result and returns nullptr
32
  // unconditionally.
33
  absl::StatusOr<CdsApiPtr> createCds(const envoy::config::core::v3::ConfigSource& cds_config,
34
                                      const xds::core::v3::ResourceLocator* cds_resources_locator,
35
                                      ClusterManager& cm, bool support_multi_ads_sources) override;
36
};
37

            
38
/**
39
 * Config-validation-only implementation of ClusterManager, which opens no upstream connections.
40
 */
41
class ValidationClusterManager : public ClusterManagerImpl {
42
public:
43
  using ClusterManagerImpl::ClusterManagerImpl;
44

            
45
1
  ThreadLocalCluster* getThreadLocalCluster(absl::string_view) override {
46
    // A thread local cluster is never guaranteed to exist (because it is not created until warmed)
47
    // so all calling code must have error handling for this case. Returning nullptr here prevents
48
    // any calling code creating real outbound networking during validation.
49
1
    return nullptr;
50
1
  }
51

            
52
  // Gives access to the protected constructor.
53
  friend ValidationClusterManagerFactory;
54
};
55

            
56
} // namespace Upstream
57
} // namespace Envoy