1
#pragma once
2

            
3
#include <string>
4

            
5
#include "envoy/config/route/v3/route.pb.h"
6
#include "envoy/config/route/v3/route_components.pb.h"
7
#include "envoy/rds/config_traits.h"
8
#include "envoy/router/rds.h"
9
#include "envoy/router/route_config_update_receiver.h"
10
#include "envoy/server/factory_context.h"
11
#include "envoy/service/discovery/v3/discovery.pb.h"
12

            
13
#include "source/common/common/logger.h"
14
#include "source/common/protobuf/utility.h"
15
#include "source/common/rds/route_config_update_receiver_impl.h"
16
#include "source/common/router/config_impl.h"
17

            
18
namespace Envoy {
19
namespace Router {
20

            
21
class ConfigTraitsImpl : public Rds::ConfigTraits {
22
public:
23
9818
  ConfigTraitsImpl(ProtobufMessage::ValidationVisitor& validator) : validator_(validator) {}
24

            
25
  Rds::ConfigConstSharedPtr createNullConfig() const override;
26
  Rds::ConfigConstSharedPtr createConfig(const Protobuf::Message& rc,
27
                                         Server::Configuration::ServerFactoryContext& context,
28
                                         bool validate_clusters_default) const override;
29

            
30
private:
31
  ProtobufMessage::ValidationVisitor& validator_;
32
};
33

            
34
class RouteConfigUpdateReceiverImpl : public RouteConfigUpdateReceiver {
35
public:
36
  RouteConfigUpdateReceiverImpl(Rds::ProtoTraits& proto_traits,
37
                                Server::Configuration::ServerFactoryContext& factory_context)
38
377
      : config_traits_(factory_context.messageValidationContext().dynamicValidationVisitor()),
39
377
        base_(config_traits_, proto_traits, factory_context) {}
40

            
41
  using VirtualHostMap = std::map<std::string, envoy::config::route::v3::VirtualHost>;
42

            
43
  bool removeVhosts(VirtualHostMap& vhosts,
44
                    const Protobuf::RepeatedPtrField<std::string>& removed_vhost_names);
45
  bool updateVhosts(VirtualHostMap& vhosts, const VirtualHostRefVector& added_vhosts);
46

            
47
  // Router::RouteConfigUpdateReceiver
48
  bool onRdsUpdate(const Protobuf::Message& rc, const std::string& version_info) override;
49
  bool onVhdsUpdate(const VirtualHostRefVector& added_vhosts,
50
                    std::set<std::string>&& added_resource_ids,
51
                    const Protobuf::RepeatedPtrField<std::string>& removed_resources,
52
                    const std::string& version_info) override;
53
  uint64_t configHash() const override { return base_.configHash(); }
54
218
  const absl::optional<Rds::RouteConfigProvider::ConfigInfo>& configInfo() const override {
55
218
    return base_.configInfo();
56
218
  }
57
41
  bool vhdsConfigurationChanged() const override { return vhds_configuration_changed_; }
58
998
  const Protobuf::Message& protobufConfiguration() const override {
59
998
    return base_.protobufConfiguration();
60
998
  }
61
883
  Rds::ConfigConstSharedPtr parsedConfiguration() const override {
62
883
    return base_.parsedConfiguration();
63
883
  }
64
42
  SystemTime lastUpdated() const override { return base_.lastUpdated(); }
65
446
  const std::set<std::string>& resourceIdsInLastVhdsUpdate() override {
66
446
    return resource_ids_in_last_update_;
67
446
  }
68
998
  const envoy::config::route::v3::RouteConfiguration& protobufConfigurationCast() const override {
69
998
    ASSERT(dynamic_cast<const envoy::config::route::v3::RouteConfiguration*>(
70
998
        &RouteConfigUpdateReceiverImpl::protobufConfiguration()));
71
998
    return static_cast<const envoy::config::route::v3::RouteConfiguration&>(
72
998
        RouteConfigUpdateReceiverImpl::protobufConfiguration());
73
998
  }
74

            
75
private:
76
  ConfigTraitsImpl config_traits_;
77

            
78
  Rds::RouteConfigUpdateReceiverImpl base_;
79

            
80
  uint64_t last_vhds_config_hash_{0ul};
81
  // vhosts supplied by RDS, to be merged with VHDS vhosts in onVhdsUpdate.
82
  std::unique_ptr<VirtualHostMap> rds_virtual_hosts_;
83
  // vhosts supplied by VHDS, to be merged with RDS vhosts in onRdsUpdate.
84
  std::unique_ptr<VirtualHostMap> vhds_virtual_hosts_;
85
  std::set<std::string> resource_ids_in_last_update_;
86
  bool vhds_configuration_changed_{true};
87
};
88

            
89
} // namespace Router
90
} // namespace Envoy