xds_cluster_specifier_plugin.cc
Go to the documentation of this file.
1 //
2 // Copyright 2022 gRPC authors.
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16 
18 
20 
21 #include <stddef.h>
22 
23 #include <algorithm>
24 #include <map>
25 #include <utility>
26 
27 #include "absl/memory/memory.h"
28 #include "absl/status/status.h"
29 #include "absl/strings/str_cat.h"
30 #include "upb/json_encode.h"
31 #include "upb/upb.hpp"
32 
33 #include <grpc/support/log.h>
34 
37 #include "src/core/lib/json/json.h"
40 
41 namespace grpc_core {
42 
44  "grpc.lookup.v1.RouteLookupClusterSpecifier";
45 
47  upb_DefPool* symtab) const {
49 }
50 
53  upb_StringView serialized_plugin_config, upb_Arena* arena,
54  upb_DefPool* symtab) const {
56  serialized_plugin_config.data, serialized_plugin_config.size, arena);
57  if (specifier == nullptr) {
58  return absl::InvalidArgumentError("Could not parse plugin config");
59  }
60  const auto* plugin_config =
62  if (plugin_config == nullptr) {
64  "Could not get route lookup config from route lookup cluster "
65  "specifier");
66  }
68  const upb_MessageDef* msg_type =
70  size_t json_size = upb_JsonEncode(plugin_config, msg_type, symtab, 0, nullptr,
71  0, status.ptr());
72  if (json_size == static_cast<size_t>(-1)) {
74  absl::StrCat("failed to dump proto to JSON: ",
76  }
77  void* buf = upb_Arena_Malloc(arena, json_size + 1);
78  upb_JsonEncode(plugin_config, msg_type, symtab, 0,
79  reinterpret_cast<char*>(buf), json_size + 1, status.ptr());
80  Json::Object rls_policy;
82  rls_policy["routeLookupConfig"] =
83  Json::Parse(reinterpret_cast<char*>(buf), &error);
85  Json::Object cds_policy;
86  cds_policy["cds_experimental"] = Json::Object();
87  Json::Array child_policy;
88  child_policy.emplace_back(std::move(cds_policy));
89  rls_policy["childPolicy"] = std::move(child_policy);
90  rls_policy["childPolicyConfigTargetFieldName"] = "cluster";
91  Json::Object policy;
92  policy["rls_experimental"] = std::move(rls_policy);
93  Json::Array policies;
94  policies.emplace_back(std::move(policy));
95  Json lb_policy_config(std::move(policies));
97  // TODO(roth): If/when we ever add a second plugin, refactor this code
98  // somehow such that we automatically validate the resulting config against
99  // the gRPC LB policy registry instead of requiring each plugin to do that
100  // itself.
102  &parse_error);
106  " ClusterSpecifierPlugin returned invalid LB policy config: ",
109  return status;
110  }
111  return lb_policy_config.Dump();
112 }
113 
114 namespace {
115 
116 using PluginRegistryMap =
117  std::map<absl::string_view, std::unique_ptr<XdsClusterSpecifierPluginImpl>>;
118 
119 PluginRegistryMap* g_plugin_registry = nullptr;
120 
121 } // namespace
122 
123 const XdsClusterSpecifierPluginImpl*
125  absl::string_view config_proto_type_name) {
126  auto it = g_plugin_registry->find(config_proto_type_name);
127  if (it == g_plugin_registry->end()) return nullptr;
128  return it->second.get();
129 }
130 
132  for (const auto& p : *g_plugin_registry) {
133  p.second->PopulateSymtab(symtab);
134  }
135 }
136 
138  std::unique_ptr<XdsClusterSpecifierPluginImpl> plugin,
139  absl::string_view config_proto_type_name) {
140  (*g_plugin_registry)[config_proto_type_name] = std::move(plugin);
141 }
142 
144  g_plugin_registry = new PluginRegistryMap;
145  RegisterPlugin(absl::make_unique<XdsRouteLookupClusterSpecifierPlugin>(),
147 }
148 
149 void XdsClusterSpecifierPluginRegistry::Shutdown() { delete g_plugin_registry; }
150 
151 } // namespace grpc_core
grpc_core::Json::Array
std::vector< Json > Array
Definition: src/core/lib/json/json.h:55
absl::InvalidArgumentError
Status InvalidArgumentError(absl::string_view message)
Definition: third_party/abseil-cpp/absl/status/status.cc:351
rls_config.upb.h
grpc_core::XdsRouteLookupClusterSpecifierPlugin::GenerateLoadBalancingPolicyConfig
absl::StatusOr< std::string > GenerateLoadBalancingPolicyConfig(upb_StringView serialized_plugin_config, upb_Arena *arena, upb_DefPool *symtab) const override
Definition: xds_cluster_specifier_plugin.cc:52
grpc_core::XdsClusterSpecifierPluginRegistry::Shutdown
static void Shutdown()
Definition: xds_cluster_specifier_plugin.cc:149
regen-readme.it
it
Definition: regen-readme.py:15
GRPC_ERROR_NONE
#define GRPC_ERROR_NONE
Definition: error.h:234
log.h
grpc_core::XdsClusterSpecifierPluginRegistry::RegisterPlugin
static void RegisterPlugin(std::unique_ptr< XdsClusterSpecifierPluginImpl > plugin, absl::string_view config_proto_type_name)
Definition: xds_cluster_specifier_plugin.cc:137
absl::StrCat
std::string StrCat(const AlphaNum &a, const AlphaNum &b)
Definition: abseil-cpp/absl/strings/str_cat.cc:98
grpc_core
Definition: call_metric_recorder.h:31
grpc_lookup_v1_RouteLookupClusterSpecifier_parse
UPB_INLINE grpc_lookup_v1_RouteLookupClusterSpecifier * grpc_lookup_v1_RouteLookupClusterSpecifier_parse(const char *buf, size_t size, upb_Arena *arena)
Definition: rls_config.upb.h:706
upb_StringView::data
const char * data
Definition: upb/upb/upb.h:73
upb_MessageDef
Definition: upb/upb/def.c:100
buf
voidpf void * buf
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:136
absl::string_view
Definition: abseil-cpp/absl/strings/string_view.h:167
grpc_core::XdsRouteLookupClusterSpecifierPlugin::PopulateSymtab
void PopulateSymtab(upb_DefPool *symtab) const override
Definition: xds_cluster_specifier_plugin.cc:46
grpc_core::XdsClusterSpecifierPluginRegistry::Init
static void Init()
Definition: xds_cluster_specifier_plugin.cc:143
error
grpc_error_handle error
Definition: retry_filter.cc:499
status
absl::Status status
Definition: rls.cc:251
upb_JsonEncode
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)
Definition: json_encode.c:757
upb_Status_ErrorMessage
const char * upb_Status_ErrorMessage(const upb_Status *status)
Definition: upb/upb/upb.c:52
json_encode.h
grpc_lookup_v1_RouteLookupConfig_getmsgdef
const UPB_INLINE upb_MessageDef * grpc_lookup_v1_RouteLookupConfig_getmsgdef(upb_DefPool *s)
Definition: rls_config.upbdefs.h:59
arena
grpc_core::ScopedArenaPtr arena
Definition: binder_transport_test.cc:237
absl::move
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
Definition: abseil-cpp/absl/utility/utility.h:221
GPR_ASSERT
#define GPR_ASSERT(x)
Definition: include/grpc/impl/codegen/log.h:94
upb_StringView::size
size_t size
Definition: upb/upb/upb.h:74
Json
JSON (JavaScript Object Notation).
Definition: third_party/bloaty/third_party/protobuf/conformance/third_party/jsoncpp/json.h:227
grpc_core::XdsClusterSpecifierPluginRegistry::GetPluginForType
static const XdsClusterSpecifierPluginImpl * GetPluginForType(absl::string_view config_proto_type_name)
Definition: xds_cluster_specifier_plugin.cc:124
upb_Arena_Malloc
UPB_INLINE void * upb_Arena_Malloc(upb_Arena *a, size_t size)
Definition: upb/upb/upb.h:222
rls_config.upbdefs.h
error.h
json.h
xds_cluster_specifier_plugin.h
grpc_core::Json::Parse
static Json Parse(absl::string_view json_str, grpc_error_handle *error)
Definition: json_reader.cc:899
grpc_core::LoadBalancingPolicyRegistry::ParseLoadBalancingConfig
static RefCountedPtr< LoadBalancingPolicy::Config > ParseLoadBalancingConfig(const Json &json, grpc_error_handle *error)
Definition: lb_policy_registry.cc:169
symtab
upb_symtab * symtab
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/protobuf.h:774
grpc_core::Json::Object
std::map< std::string, Json > Object
Definition: src/core/lib/json/json.h:54
upb_StringView
Definition: upb/upb/upb.h:72
lb_policy_registry.h
grpc_core::kXdsRouteLookupClusterSpecifierPluginConfigName
const char * kXdsRouteLookupClusterSpecifierPluginConfigName
Definition: xds_cluster_specifier_plugin.cc:43
upb.hpp
grpc_error_std_string
std::string grpc_error_std_string(grpc_error_handle error)
Definition: error.cc:944
absl::Status
Definition: third_party/abseil-cpp/absl/status/status.h:424
GRPC_ERROR_UNREF
#define GRPC_ERROR_UNREF(err)
Definition: error.h:262
absl::StatusOr< std::string >
grpc_error
Definition: error_internal.h:42
grpc_core::XdsClusterSpecifierPluginRegistry::PopulateSymtab
static void PopulateSymtab(upb_DefPool *symtab)
Definition: xds_cluster_specifier_plugin.cc:131
upb::Status
Definition: upb.hpp:35
upb_DefPool
Definition: upb/upb/def.c:217
upb_Arena
Definition: upb_internal.h:36
grpc_core::Json::Dump
std::string Dump(int indent=0) const
Definition: json_writer.cc:336
grpc_lookup_v1_RouteLookupClusterSpecifier_route_lookup_config
const UPB_INLINE grpc_lookup_v1_RouteLookupConfig * grpc_lookup_v1_RouteLookupClusterSpecifier_route_lookup_config(const grpc_lookup_v1_RouteLookupClusterSpecifier *msg)
Definition: rls_config.upb.h:738
GRPC_ERROR_IS_NONE
#define GRPC_ERROR_IS_NONE(err)
Definition: error.h:241
parse_error
@ parse_error
Definition: pem_info.c:88
port_platform.h


grpc
Author(s):
autogenerated on Fri May 16 2025 03:00:57