1
#pragma once
2

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

            
7
#include "source/common/common/logger.h"
8
#include "source/extensions/load_balancing_policies/common/factory_base.h"
9

            
10
namespace Envoy {
11
namespace Extensions {
12
namespace LoadBalancingPolicies {
13
namespace LeastRequest {
14

            
15
using LeastRequestLbProto =
16
    envoy::extensions::load_balancing_policies::least_request::v3::LeastRequest;
17
using ClusterProto = envoy::config::cluster::v3::Cluster;
18

            
19
using CommonLbConfigProto = envoy::config::cluster::v3::Cluster::CommonLbConfig;
20
using LegacyLeastRequestLbProto = envoy::config::cluster::v3::Cluster::LeastRequestLbConfig;
21

            
22
/**
23
 * Load balancer config that used to wrap the least request config.
24
 */
25
class TypedLeastRequestLbConfig : public Upstream::LoadBalancerConfig {
26
public:
27
  TypedLeastRequestLbConfig(const LeastRequestLbProto& lb_config);
28
  TypedLeastRequestLbConfig(const CommonLbConfigProto& common_lb_config,
29
                            const LegacyLeastRequestLbProto& lb_config);
30

            
31
  LeastRequestLbProto lb_config_;
32
};
33

            
34
struct LeastRequestCreator : public Logger::Loggable<Logger::Id::upstream> {
35
  Upstream::LoadBalancerPtr operator()(Upstream::LoadBalancerParams params,
36
                                       OptRef<const Upstream::LoadBalancerConfig> lb_config,
37
                                       const Upstream::ClusterInfo& cluster_info,
38
                                       const Upstream::PrioritySet& priority_set,
39
                                       Runtime::Loader& runtime, Random::RandomGenerator& random,
40
                                       TimeSource& time_source);
41
};
42

            
43
class Factory : public Common::FactoryBase<LeastRequestLbProto, LeastRequestCreator> {
44
public:
45
490
  Factory() : FactoryBase("envoy.load_balancing_policies.least_request") {}
46

            
47
  absl::StatusOr<Upstream::LoadBalancerConfigPtr>
48
  loadConfig(Server::Configuration::ServerFactoryContext&,
49
4
             const Protobuf::Message& config) override {
50
4
    ASSERT(dynamic_cast<const LeastRequestLbProto*>(&config) != nullptr);
51
4
    const LeastRequestLbProto& typed_config = dynamic_cast<const LeastRequestLbProto&>(config);
52
4
    return Upstream::LoadBalancerConfigPtr{new TypedLeastRequestLbConfig(typed_config)};
53
4
  }
54

            
55
  absl::StatusOr<Upstream::LoadBalancerConfigPtr>
56
20
  loadLegacy(Server::Configuration::ServerFactoryContext&, const ClusterProto& cluster) override {
57
20
    return Upstream::LoadBalancerConfigPtr{new TypedLeastRequestLbConfig(
58
20
        cluster.common_lb_config(), cluster.least_request_lb_config())};
59
20
  }
60
};
61

            
62
DECLARE_FACTORY(Factory);
63

            
64
} // namespace LeastRequest
65
} // namespace LoadBalancingPolicies
66
} // namespace Extensions
67
} // namespace Envoy