1
#pragma once
2

            
3
#include "envoy/extensions/load_balancing_policies/dynamic_modules/v3/dynamic_modules.pb.h"
4
#include "envoy/extensions/load_balancing_policies/dynamic_modules/v3/dynamic_modules.pb.validate.h"
5
#include "envoy/upstream/load_balancer.h"
6

            
7
#include "source/common/common/logger.h"
8
#include "source/common/upstream/load_balancer_factory_base.h"
9
#include "source/extensions/load_balancing_policies/dynamic_modules/lb_config.h"
10

            
11
namespace Envoy {
12
namespace Extensions {
13
namespace LoadBalancingPolicies {
14
namespace DynamicModules {
15

            
16
using DynamicModulesLbProto = envoy::extensions::load_balancing_policies::dynamic_modules::v3::
17
    DynamicModulesLoadBalancerConfig;
18

            
19
/**
20
 * Load balancer config that wraps the dynamic module configuration.
21
 */
22
class TypedDynamicModuleLbConfig : public Upstream::LoadBalancerConfig {
23
public:
24
46
  TypedDynamicModuleLbConfig(DynamicModuleLbConfigSharedPtr config) : config_(std::move(config)) {}
25

            
26
42
  const DynamicModuleLbConfigSharedPtr& config() const { return config_; }
27

            
28
private:
29
  DynamicModuleLbConfigSharedPtr config_;
30
};
31

            
32
/**
33
 * Factory for creating Dynamic Module load balancers.
34
 */
35
class Factory : public Upstream::TypedLoadBalancerFactoryBase<DynamicModulesLbProto>,
36
                public Logger::Loggable<Logger::Id::dynamic_modules> {
37
public:
38
53
  Factory() : TypedLoadBalancerFactoryBase("envoy.load_balancing_policies.dynamic_modules") {}
39

            
40
  Upstream::ThreadAwareLoadBalancerPtr create(OptRef<const Upstream::LoadBalancerConfig> lb_config,
41
                                              const Upstream::ClusterInfo& cluster_info,
42
                                              const Upstream::PrioritySet& priority_set,
43
                                              Runtime::Loader& runtime,
44
                                              Random::RandomGenerator& random,
45
                                              TimeSource& time_source) override;
46

            
47
  absl::StatusOr<Upstream::LoadBalancerConfigPtr>
48
  loadConfig(Server::Configuration::ServerFactoryContext& context,
49
             const Protobuf::Message& config) override;
50
};
51

            
52
DECLARE_FACTORY(Factory);
53

            
54
} // namespace DynamicModules
55
} // namespace LoadBalancingPolicies
56
} // namespace Extensions
57
} // namespace Envoy