1
#pragma once
2

            
3
#include "envoy/extensions/load_balancing_policies/random/v3/random.pb.h"
4
#include "envoy/extensions/load_balancing_policies/random/v3/random.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 Random {
14

            
15
using RandomLbProto = envoy::extensions::load_balancing_policies::random::v3::Random;
16
using ClusterProto = envoy::config::cluster::v3::Cluster;
17

            
18
using CommonLbConfigProto = envoy::config::cluster::v3::Cluster::CommonLbConfig;
19

            
20
/**
21
 * Load balancer config that used to wrap the random config.
22
 */
23
class TypedRandomLbConfig : public Upstream::LoadBalancerConfig {
24
public:
25
  TypedRandomLbConfig(const RandomLbProto& lb_config);
26
  TypedRandomLbConfig(const CommonLbConfigProto& common_lb_config);
27

            
28
  RandomLbProto lb_config_;
29
};
30

            
31
struct RandomCreator : public Logger::Loggable<Logger::Id::upstream> {
32
  Upstream::LoadBalancerPtr operator()(
33
      Upstream::LoadBalancerParams params, OptRef<const Upstream::LoadBalancerConfig> lb_config,
34
      const Upstream::ClusterInfo& cluster_info, const Upstream::PrioritySet& priority_set,
35
      Runtime::Loader& runtime, Envoy::Random::RandomGenerator& random, TimeSource& time_source);
36
};
37

            
38
class Factory : public Common::FactoryBase<RandomLbProto, RandomCreator> {
39
public:
40
493
  Factory() : FactoryBase("envoy.load_balancing_policies.random") {}
41

            
42
  absl::StatusOr<Upstream::LoadBalancerConfigPtr>
43
  loadConfig(Server::Configuration::ServerFactoryContext&,
44
6
             const Protobuf::Message& config) override {
45
6
    ASSERT(dynamic_cast<const RandomLbProto*>(&config) != nullptr);
46
6
    const RandomLbProto& typed_config = dynamic_cast<const RandomLbProto&>(config);
47
6
    return Upstream::LoadBalancerConfigPtr{new TypedRandomLbConfig(typed_config)};
48
6
  }
49

            
50
  absl::StatusOr<Upstream::LoadBalancerConfigPtr>
51
75
  loadLegacy(Server::Configuration::ServerFactoryContext&, const ClusterProto& cluster) override {
52
75
    return Upstream::LoadBalancerConfigPtr{new TypedRandomLbConfig(cluster.common_lb_config())};
53
75
  }
54
};
55

            
56
DECLARE_FACTORY(Factory);
57

            
58
} // namespace Random
59
} // namespace LoadBalancingPolicies
60
} // namespace Extensions
61
} // namespace Envoy