1
#include "source/extensions/load_balancing_policies/maglev/config.h"
2

            
3
#include "envoy/extensions/load_balancing_policies/maglev/v3/maglev.pb.h"
4

            
5
#include "source/extensions/load_balancing_policies/maglev/maglev_lb.h"
6

            
7
namespace Envoy {
8
namespace Extensions {
9
namespace LoadBalancingPolicies {
10
namespace Maglev {
11

            
12
Upstream::ThreadAwareLoadBalancerPtr
13
Factory::create(OptRef<const Upstream::LoadBalancerConfig> lb_config,
14
                const Upstream::ClusterInfo& cluster_info,
15
                const Upstream::PrioritySet& priority_set, Runtime::Loader& runtime,
16
430
                Random::RandomGenerator& random, TimeSource&) {
17

            
18
430
  const auto typed_lb_config = dynamic_cast<const Upstream::TypedMaglevLbConfig*>(lb_config.ptr());
19
430
  ASSERT(typed_lb_config != nullptr, "Invalid maglev load balancer config");
20

            
21
430
  return std::make_unique<Upstream::MaglevLoadBalancer>(
22
430
      priority_set, cluster_info.lbStats(), cluster_info.statsScope(), runtime, random,
23
430
      static_cast<uint32_t>(PROTOBUF_PERCENT_TO_ROUNDED_INTEGER_OR_DEFAULT(
24
430
          cluster_info.lbConfig(), healthy_panic_threshold, 100, 50)),
25
430
      typed_lb_config->lb_config_, typed_lb_config->hash_policy_);
26
430
}
27

            
28
/**
29
 * Static registration for the Factory. @see RegisterFactory.
30
 */
31
REGISTER_FACTORY(Factory, Upstream::TypedLoadBalancerFactory);
32

            
33
} // namespace Maglev
34
} // namespace LoadBalancingPolicies
35
} // namespace Extensions
36
} // namespace Envoy