1
#include "source/common/rds/route_config_update_receiver_impl.h"
2

            
3
#include "source/common/rds/util.h"
4

            
5
namespace Envoy {
6
namespace Rds {
7

            
8
RouteConfigUpdateReceiverImpl::RouteConfigUpdateReceiverImpl(
9
    ConfigTraits& config_traits, ProtoTraits& proto_traits,
10
    Server::Configuration::ServerFactoryContext& factory_context)
11
389
    : config_traits_(config_traits), proto_traits_(proto_traits), factory_context_(factory_context),
12
389
      time_source_(factory_context.timeSource()),
13
389
      route_config_proto_(proto_traits_.createEmptyProto()),
14
389
      config_(config_traits_.createNullConfig()) {}
15

            
16
void RouteConfigUpdateReceiverImpl::updateConfig(
17
475
    std::unique_ptr<Protobuf::Message>&& route_config_proto) {
18
475
  config_ = config_traits_.createConfig(*route_config_proto, factory_context_,
19
475
                                        false /* not validate unknown cluster */);
20
  // If the above create config doesn't raise exception, update the
21
  // other cached config entries.
22
475
  route_config_proto_ = std::move(route_config_proto);
23
475
}
24

            
25
465
void RouteConfigUpdateReceiverImpl::onUpdateCommon(const std::string& version_info) {
26
465
  last_updated_ = time_source_.systemTime();
27
465
  config_info_.emplace(RouteConfigProvider::ConfigInfo{*route_config_proto_, version_info});
28
465
}
29

            
30
// Rds::RouteConfigUpdateReceiver
31
bool RouteConfigUpdateReceiverImpl::onRdsUpdate(const Protobuf::Message& rc,
32
9
                                                const std::string& version_info) {
33
9
  uint64_t new_hash = getHash(rc);
34
9
  if (!checkHash(new_hash)) {
35
1
    return false;
36
1
  }
37
8
  updateConfig(cloneProto(proto_traits_, rc));
38
8
  updateHash(new_hash);
39
8
  onUpdateCommon(version_info);
40
8
  return true;
41
9
}
42

            
43
const absl::optional<RouteConfigProvider::ConfigInfo>&
44
244
RouteConfigUpdateReceiverImpl::configInfo() const {
45
244
  return config_info_;
46
244
}
47

            
48
} // namespace Rds
49
} // namespace Envoy