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

            
3
#include <memory>
4
#include <utility>
5

            
6
#include "envoy/common/exception.h"
7
#include "envoy/common/optref.h"
8
#include "envoy/extensions/load_balancing_policies/override_host/v3/override_host.pb.h"
9
#include "envoy/extensions/load_balancing_policies/override_host/v3/override_host.pb.validate.h"
10
#include "envoy/registry/registry.h"
11
#include "envoy/server/factory_context.h"
12
#include "envoy/upstream/load_balancer.h"
13

            
14
#include "source/common/protobuf/protobuf.h"
15
#include "source/common/protobuf/utility.h"
16
#include "source/extensions/load_balancing_policies/override_host/load_balancer.h"
17

            
18
namespace Envoy {
19
namespace Extensions {
20
namespace LoadBalancingPolicies {
21
namespace OverrideHost {
22

            
23
using ::envoy::extensions::load_balancing_policies::override_host::v3::OverrideHost;
24

            
25
absl::StatusOr<Upstream::LoadBalancerConfigPtr>
26
OverrideHostLoadBalancerFactory::loadConfig(Server::Configuration::ServerFactoryContext& context,
27
34
                                            const Protobuf::Message& config) {
28
34
  const OverrideHost& override_host_config = MessageUtil::downcastAndValidate<const OverrideHost&>(
29
34
      config, context.messageValidationVisitor());
30
  // Enforced in config validation.
31
34
  ASSERT(override_host_config.has_fallback_policy());
32
34
  return OverrideHostLbConfig::make(override_host_config, context);
33
34
}
34

            
35
Upstream::ThreadAwareLoadBalancerPtr
36
OverrideHostLoadBalancerFactory::create(OptRef<const Upstream::LoadBalancerConfig> lb_config,
37
                                        const ClusterInfo& cluster_info,
38
                                        const PrioritySet& priority_set, Loader& runtime,
39
27
                                        RandomGenerator& random, TimeSource& time_source) {
40
27
  ASSERT(lb_config.has_value()); // Factory can not work without config.
41
27
  const auto& override_host_lb_config = dynamic_cast<const OverrideHostLbConfig&>(lb_config.ref());
42
27
  Upstream::ThreadAwareLoadBalancerPtr locality_picker_lb =
43
27
      override_host_lb_config.create(cluster_info, priority_set, runtime, random, time_source);
44
27
  ASSERT(locality_picker_lb != nullptr); // Factory can not create null LB.
45
27
  return std::make_unique<OverrideHostLoadBalancer>(override_host_lb_config,
46
27
                                                    std::move(locality_picker_lb));
47
27
}
48

            
49
REGISTER_FACTORY(OverrideHostLoadBalancerFactory, Upstream::TypedLoadBalancerFactory);
50

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