1
#pragma once
2

            
3
#include <memory>
4

            
5
#include "envoy/extensions/load_balancing_policies/maglev/v3/maglev.pb.h"
6
#include "envoy/extensions/load_balancing_policies/maglev/v3/maglev.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/maglev/maglev_lb.h"
12

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

            
18
using MaglevLbProto = envoy::extensions::load_balancing_policies::maglev::v3::Maglev;
19

            
20
class Factory : public Upstream::TypedLoadBalancerFactoryBase<MaglevLbProto> {
21
public:
22
488
  Factory() : TypedLoadBalancerFactoryBase("envoy.load_balancing_policies.maglev") {}
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
6
             const Protobuf::Message& config) override {
34
6
    ASSERT(dynamic_cast<const MaglevLbProto*>(&config) != nullptr);
35
6
    const MaglevLbProto& typed_proto = dynamic_cast<const MaglevLbProto&>(config);
36
6
    absl::Status creation_status = absl::OkStatus();
37
6
    auto typed_config = std::make_unique<Upstream::TypedMaglevLbConfig>(
38
6
        typed_proto, context.regexEngine(), creation_status);
39
6
    RETURN_IF_NOT_OK_REF(creation_status);
40
6
    return typed_config;
41
6
  }
42

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

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