1
#pragma once
2

            
3
#include <string>
4
#include <vector>
5

            
6
#include "envoy/config/cluster/v3/cluster.pb.h"
7
#include "envoy/config/cluster/v3/cluster.pb.validate.h"
8
#include "envoy/config/core/v3/config_source.pb.h"
9
#include "envoy/config/subscription.h"
10
#include "envoy/protobuf/message_validator.h"
11
#include "envoy/server/factory_context.h"
12
#include "envoy/stats/scope.h"
13
#include "envoy/upstream/cluster_manager.h"
14

            
15
#include "source/common/config/subscription_base.h"
16
#include "source/common/protobuf/protobuf.h"
17
#include "source/common/upstream/cds_api_helper.h"
18

            
19
namespace Envoy {
20
namespace Upstream {
21

            
22
enum class StartStatus {
23
  // No initial fetch started.
24
  NotStarted,
25
  // Initial fetch started.
26
  Started,
27
  // Initial fetch arrived.
28
  InitialFetchDone,
29
};
30

            
31
/**
32
 * ODCDS API implementation that fetches via Subscription.
33
 */
34
class OdCdsApiImpl : public OdCdsApi,
35
                     Envoy::Config::SubscriptionBase<envoy::config::cluster::v3::Cluster>,
36
                     Logger::Loggable<Logger::Id::upstream> {
37
public:
38
  static absl::StatusOr<OdCdsApiSharedPtr>
39
  create(const envoy::config::core::v3::ConfigSource& odcds_config,
40
         OptRef<xds::core::v3::ResourceLocator> odcds_resources_locator,
41
         Config::XdsManager& xds_manager, ClusterManager& cm, MissingClusterNotifier& notifier,
42
         Stats::Scope& scope, ProtobufMessage::ValidationVisitor& validation_visitor,
43
         Server::Configuration::ServerFactoryContext& server_factory_context);
44

            
45
  // Upstream::OdCdsApi
46
  void updateOnDemand(std::string cluster_name) override;
47

            
48
private:
49
  // Config::SubscriptionCallbacks
50
  absl::Status onConfigUpdate(const std::vector<Config::DecodedResourceRef>& resources,
51
                              const std::string& version_info) override;
52
  absl::Status onConfigUpdate(const std::vector<Config::DecodedResourceRef>& added_resources,
53
                              const Protobuf::RepeatedPtrField<std::string>& removed_resources,
54
                              const std::string& system_version_info) override;
55
  void onConfigUpdateFailed(Envoy::Config::ConfigUpdateFailureReason reason,
56
                            const EnvoyException* e) override;
57

            
58
  OdCdsApiImpl(const envoy::config::core::v3::ConfigSource& odcds_config,
59
               OptRef<xds::core::v3::ResourceLocator> odcds_resources_locator,
60
               Config::XdsManager& xds_manager, ClusterManager& cm,
61
               MissingClusterNotifier& notifier, Stats::Scope& scope,
62
               ProtobufMessage::ValidationVisitor& validation_visitor,
63
               absl::Status& creation_status);
64
  void sendAwaiting();
65

            
66
  CdsApiHelper helper_;
67
  MissingClusterNotifier& notifier_;
68
  Stats::ScopeSharedPtr scope_;
69
  StartStatus status_{StartStatus::NotStarted};
70
  absl::flat_hash_set<std::string> awaiting_names_;
71
  Config::SubscriptionPtr subscription_;
72
};
73

            
74
/**
75
 * ODCDS API implementation that fetches via Subscription for xDS-TP based
76
 * configs and resources.
77
 */
78
class XdstpOdCdsApiImpl : public OdCdsApi {
79
public:
80
  static absl::StatusOr<OdCdsApiSharedPtr>
81
  create(const envoy::config::core::v3::ConfigSource&, OptRef<xds::core::v3::ResourceLocator>,
82
         Config::XdsManager& xds_manager, ClusterManager& cm, MissingClusterNotifier& notifier,
83
         Stats::Scope& scope, ProtobufMessage::ValidationVisitor& validation_visitor,
84
         Server::Configuration::ServerFactoryContext& server_factory_context);
85

            
86
  // Upstream::OdCdsApi
87
  void updateOnDemand(std::string cluster_name) override;
88

            
89
private:
90
  class XdstpOdcdsSubscriptionsManager;
91
  using XdstpOdcdsSubscriptionsManagerSharedPtr = std::shared_ptr<XdstpOdcdsSubscriptionsManager>;
92

            
93
  XdstpOdCdsApiImpl(Config::XdsManager& xds_manager, ClusterManager& cm,
94
                    MissingClusterNotifier& notifier, Stats::Scope& scope,
95
                    Server::Configuration::ServerFactoryContext& server_context, bool old_ads,
96
                    ProtobufMessage::ValidationVisitor& validation_visitor,
97
                    absl::Status& creation_status);
98

            
99
  // Fetches, and potentially creates, the singleton subscriptions manager.
100
  // The arguments will be passed to the subscriptions manager's constructor, if
101
  // it is the first time it is initialized.
102
  static XdstpOdcdsSubscriptionsManagerSharedPtr
103
  subscriptionsManager(Server::Configuration::ServerFactoryContext& context,
104
                       Config::XdsManager& xds_manager, ClusterManager& cm,
105
                       MissingClusterNotifier& notifier, Stats::Scope& scope,
106
                       ProtobufMessage::ValidationVisitor& validation_visitor);
107

            
108
  // A singleton through which all subscriptions will be processed.
109
  XdstpOdcdsSubscriptionsManagerSharedPtr subscriptions_manager_;
110
  const bool old_ads_;
111
};
112

            
113
} // namespace Upstream
114
} // namespace Envoy