Go to the documentation of this file.
24 #include <type_traits>
28 #include "absl/memory/memory.h"
29 #include "absl/status/status.h"
30 #include "absl/strings/str_cat.h"
31 #include "absl/strings/str_format.h"
53 class RingHashLbPolicyConfigFactory
54 :
public XdsLbPolicyRegistry::ConfigFactory {
59 const auto* resource =
62 if (resource ==
nullptr) {
64 "Can't decode RingHash loadbalancing policy");
70 "Invalid hash function provided for RingHash loadbalancing policy. "
71 "Only XX_HASH is supported.");
74 const auto* min_ring_size =
77 if (min_ring_size !=
nullptr) {
78 json.emplace(
"minRingSize",
81 const auto* max_ring_size =
84 if (max_ring_size !=
nullptr) {
85 json.emplace(
"maxRingSize",
94 return "envoy.extensions.load_balancing_policies.ring_hash.v3.RingHash";
98 class RoundRobinLbPolicyConfigFactory
99 :
public XdsLbPolicyRegistry::ConfigFactory {
102 const XdsEncodingContext& ,
111 return "envoy.extensions.load_balancing_policies.round_robin.v3.RoundRobin";
115 class WrrLocalityLbPolicyConfigFactory
116 :
public XdsLbPolicyRegistry::ConfigFactory {
120 int recursion_depth)
override {
121 const auto* resource =
124 if (resource ==
nullptr) {
126 "Can't decode WrrLocality loadbalancing policy");
128 const auto* endpoint_picking_policy =
131 if (endpoint_picking_policy ==
nullptr) {
133 "WrrLocality: endpoint_picking_policy not found");
136 context, endpoint_picking_policy, recursion_depth + 1);
137 if (!child_policy.ok()) {
139 absl::StrCat(
"Error parsing WrrLocality load balancing policy: ",
140 child_policy.status().message()));
143 {
"xds_wrr_locality_experimental",
150 return "envoy.extensions.load_balancing_policies.wrr_locality.v3."
160 nullptr, 0,
status.ptr());
161 if (json_size ==
static_cast<size_t>(-1)) {
163 absl::StrCat(
"Error parsing google::Protobuf::Struct: ",
168 reinterpret_cast<char*
>(
buf), json_size + 1,
status.ptr());
174 absl::StrCat(
"Error parsing JSON form of google::Protobuf::Struct "
175 "produced by upb library: ",
192 int recursion_depth) {
193 constexpr
int kMaxRecursionDepth = 16;
194 if (recursion_depth >= kMaxRecursionDepth) {
197 "depth of more than %d.",
198 kMaxRecursionDepth));
201 const auto* policies =
203 for (
size_t i = 0;
i <
size; ++
i) {
205 const auto* typed_extension_config =
208 if (typed_extension_config ==
nullptr) {
210 "Error parsing LoadBalancingPolicy::Policy - Missing "
211 "typed_extension_config field");
213 const auto* typed_config =
215 typed_extension_config);
216 if (typed_config ==
nullptr) {
218 "Error parsing LoadBalancingPolicy::Policy - Missing "
219 "TypedExtensionConfig::typed_config field");
225 "LoadBalancingPolicy::Policy::TypedExtensionConfig::typed_config: ",
226 type.status().message()));
232 policy = config_factory_it->second->ConvertXdsLbPolicyConfig(
237 "LoadBalancingPolicy::Policy::TypedExtensionConfig::"
238 "typed_config to JSON: ",
239 policy.
status().message()));
241 }
else if (
type->typed_struct !=
nullptr) {
245 custom_type.c_str(),
nullptr)) {
251 if (
value ==
nullptr) {
255 if (!parsed_value.ok()) {
257 "Error parsing LoadBalancingPolicy: Custom Policy: ", custom_type,
258 ": ", parsed_value.status().message()));
270 "No supported load balancing policy config found.");
276 absl::make_unique<RingHashLbPolicyConfigFactory>());
279 absl::make_unique<RoundRobinLbPolicyConfigFactory>());
282 absl::make_unique<WrrLocalityLbPolicyConfigFactory>());
std::vector< Json > Array
Status InvalidArgumentError(absl::string_view message)
std::string StrCat(const AlphaNum &a, const AlphaNum &b)
ABSL_MUST_USE_RESULT std::string StrFormat(const FormatSpec< Args... > &format, const Args &... args)
UPB_INLINE const struct google_protobuf_UInt64Value * envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_maximum_ring_size(const envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash *msg)
UPB_INLINE const struct google_protobuf_UInt64Value * envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_minimum_ring_size(const envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash *msg)
@ envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_XX_HASH
RefCountedPtr< grpc_tls_certificate_provider > instance
size_t upb_JsonEncode(const upb_Message *msg, const upb_MessageDef *m, const upb_DefPool *ext_pool, int options, char *buf, size_t size, upb_Status *status)
UPB_INLINE envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash * envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_parse(const char *buf, size_t size, upb_Arena *arena)
Status InternalError(absl::string_view message)
const char * upb_Status_ErrorMessage(const upb_Status *status)
struct envoy_config_cluster_v3_LoadBalancingPolicy envoy_config_cluster_v3_LoadBalancingPolicy
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
constexpr size_type size() const noexcept
UPB_INLINE uint64_t google_protobuf_UInt64Value_value(const google_protobuf_UInt64Value *msg)
UPB_INLINE void * upb_Arena_Malloc(upb_Arena *a, size_t size)
static XdsLbPolicyRegistry * Get()
struct google_protobuf_Struct google_protobuf_Struct
UPB_INLINE envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality * envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality_parse(const char *buf, size_t size, upb_Arena *arena)
UPB_INLINE const struct google_protobuf_Struct * xds_type_v3_TypedStruct_value(const xds_type_v3_TypedStruct *msg)
static Json Parse(absl::string_view json_str, grpc_error_handle *error)
std::map< std::string, Json > Object
ABSL_MUST_USE_RESULT bool ok() const
UPB_INLINE int32_t envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash_hash_function(const envoy_extensions_load_balancing_policies_ring_hash_v3_RingHash *msg)
UPB_INLINE const struct envoy_config_cluster_v3_LoadBalancingPolicy * envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality_endpoint_picking_policy(const envoy_extensions_load_balancing_policies_wrr_locality_v3_WrrLocality *msg)
UPB_INLINE const struct envoy_config_core_v3_TypedExtensionConfig * envoy_config_cluster_v3_LoadBalancingPolicy_Policy_typed_extension_config(const envoy_config_cluster_v3_LoadBalancingPolicy_Policy *msg)
const UPB_INLINE upb_MessageDef * google_protobuf_Struct_getmsgdef(upb_DefPool *s)
std::string grpc_error_std_string(grpc_error_handle error)
std::map< absl::string_view, std::unique_ptr< ConfigFactory > > policy_config_factories_
#define GRPC_ERROR_UNREF(err)
absl::StatusOr< ExtractExtensionTypeNameResult > ExtractExtensionTypeName(const XdsEncodingContext &context, const google_protobuf_Any *any)
UPB_INLINE const struct google_protobuf_Any * envoy_config_core_v3_TypedExtensionConfig_typed_config(const envoy_config_core_v3_TypedExtensionConfig *msg)
grpc::ClientContext context
const T & value() const &ABSL_ATTRIBUTE_LIFETIME_BOUND
static bool LoadBalancingPolicyExists(const char *name, bool *requires_config)
constexpr const_pointer data() const noexcept
static absl::StatusOr< Json::Array > ConvertXdsLbPolicyConfig(const XdsEncodingContext &context, const envoy_config_cluster_v3_LoadBalancingPolicy *lb_policy, int recursion_depth=0)
const UPB_INLINE envoy_config_cluster_v3_LoadBalancingPolicy_Policy *const * envoy_config_cluster_v3_LoadBalancingPolicy_policies(const envoy_config_cluster_v3_LoadBalancingPolicy *msg, size_t *len)
absl::string_view UpbStringToAbsl(const upb_StringView &str)
UPB_INLINE upb_StringView google_protobuf_Any_value(const google_protobuf_Any *msg)
const Status & status() const &
#define GRPC_ERROR_IS_NONE(err)
grpc
Author(s):
autogenerated on Fri May 16 2025 03:00:59