1
#pragma once
2

            
3
#include <memory>
4

            
5
#include "envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.pb.h"
6
#include "envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.pb.validate.h"
7
#include "envoy/upstream/load_balancer.h"
8

            
9
#include "source/common/upstream/load_balancer_factory_base.h"
10
#include "source/extensions/load_balancing_policies/common/factory_base.h"
11
#include "source/extensions/load_balancing_policies/ring_hash/ring_hash_lb.h"
12

            
13
namespace Envoy {
14
namespace Extensions {
15
namespace LoadBalancingPolicies {
16
namespace RingHash {
17

            
18
using RingHashLbProto = envoy::extensions::load_balancing_policies::ring_hash::v3::RingHash;
19

            
20
class Factory : public Upstream::TypedLoadBalancerFactoryBase<RingHashLbProto> {
21
public:
22
25
  Factory() : TypedLoadBalancerFactoryBase("envoy.load_balancing_policies.ring_hash") {}
23

            
24
  Upstream::ThreadAwareLoadBalancerPtr create(OptRef<const Upstream::LoadBalancerConfig> lb_config,
25
                                              const Upstream::ClusterInfo& cluster_info,
26
                                              const Upstream::PrioritySet& priority_set,
27
                                              Runtime::Loader& runtime,
28
                                              Random::RandomGenerator& random,
29
                                              TimeSource& time_source) override;
30

            
31
  absl::StatusOr<Upstream::LoadBalancerConfigPtr>
32
  loadConfig(Server::Configuration::ServerFactoryContext& context,
33
8
             const Protobuf::Message& config) override {
34
8
    ASSERT(dynamic_cast<const RingHashLbProto*>(&config) != nullptr);
35
8
    const RingHashLbProto& typed_proto = dynamic_cast<const RingHashLbProto&>(config);
36
8
    absl::Status creation_status = absl::OkStatus();
37
8
    auto typed_config = std::make_unique<Upstream::TypedRingHashLbConfig>(
38
8
        typed_proto, context.regexEngine(), creation_status);
39
8
    RETURN_IF_NOT_OK_REF(creation_status);
40
8
    return typed_config;
41
8
  }
42

            
43
  absl::StatusOr<Upstream::LoadBalancerConfigPtr>
44
  loadLegacy(Server::Configuration::ServerFactoryContext&,
45
35
             const Upstream::ClusterProto& cluster) override {
46
35
    return std::make_unique<Upstream::TypedRingHashLbConfig>(cluster.common_lb_config(),
47
35
                                                             cluster.ring_hash_lb_config());
48
35
  }
49
};
50

            
51
} // namespace RingHash
52
} // namespace LoadBalancingPolicies
53
} // namespace Extensions
54
} // namespace Envoy