26 #include "absl/memory/memory.h"
27 #include "absl/strings/match.h"
28 #include "absl/strings/str_cat.h"
29 #include "absl/strings/str_format.h"
30 #include "absl/strings/str_join.h"
31 #include "absl/strings/string_view.h"
53 return parse_succeeded && parsed_value;
60 "ignore_resource_deletion";
63 XdsBootstrap::XdsServer*
server) {
64 std::vector<grpc_error_handle> error_list;
71 if (
server->channel_creds_type.empty() &&
74 if (config_ptr !=
nullptr)
config = *config_ptr;
78 "invalid config for channel creds type \"",
type,
"\"")));
88 XdsBootstrap::XdsServer*
server) {
89 std::vector<grpc_error_handle> error_list;
90 for (
size_t i = 0;
i < json.size(); ++
i) {
94 absl::StrCat(
"array element ", i,
" is not an object")));
101 if (
server->channel_creds_type.empty()) {
103 "no known creds type found in \"channel_creds\""));
117 std::vector<grpc_error_handle> error_list;
124 if (creds_array !=
nullptr) {
126 ParseChannelCredsArray(*creds_array, &
server);
129 const Json::Array* server_features_array =
nullptr;
131 &server_features_array, &error_list,
false);
132 if (server_features_array !=
nullptr) {
133 for (
const Json& feature_json : *server_features_array) {
135 (feature_json.string_value() == kServerFeatureXdsV3 ||
136 feature_json.string_value() ==
137 kServerFeatureIgnoreResourceDeletion)) {
138 server.server_features.insert(feature_json.string_value());
143 "errors parsing xds server", &error_list);
148 Json::Object channel_creds_json{{
"type", channel_creds_type}};
150 channel_creds_json[
"config"] = channel_creds_config;
156 if (!server_features.empty()) {
158 for (
auto& feature : server_features) {
159 server_features_json.emplace_back(feature);
161 json[
"server_features"] =
std::move(server_features_json);
167 return server_features.find(
std::string(kServerFeatureXdsV3)) !=
168 server_features.end();
173 kServerFeatureIgnoreResourceDeletion)) != server_features.end();
186 "Failed to parse bootstrap JSON string",
error, 1);
197 "malformed JSON in bootstrap file");
200 std::vector<grpc_error_handle> error_list;
204 "\"xds_servers\" field not present"));
207 "\"xds_servers\" field is not an array"));
216 "\"node\" field is not an object"));
227 "\"authorities\" field is not an object"));
234 "client_default_listener_resource_name_template");
238 "\"client_default_listener_resource_name_template\" field is not a "
250 "\"server_listener_resource_name_template\" field is not a string"));
260 "\"certificate_providers\" field is not an object"));
283 for (
auto& xds_server : authority.second.xds_servers) {
284 if (
server == xds_server)
return true;
292 std::vector<grpc_error_handle> error_list;
313 std::vector<grpc_error_handle> error_list;
317 "field:authorities element error: element is not a object"));
329 std::vector<grpc_error_handle> error_list;
332 json->
mutable_object()->find(
"client_listener_resource_name_template");
336 "\"client_listener_resource_name_template\" field is not a string"));
341 absl::StrCat(
"\"client_listener_resource_name_template\" field "
342 "must begin with \"",
343 expected_prefix,
"\"")));
354 "\"xds_servers\" field is not an array"));
361 if (error_list.empty()) {
369 std::vector<grpc_error_handle> error_list;
370 node_ = absl::make_unique<Node>();
374 error_list.push_back(
384 "\"cluster\" field is not a string"));
393 "\"locality\" field is not an object"));
403 "\"metadata\" field is not an object"));
413 std::vector<grpc_error_handle> error_list;
418 "\"region\" field is not a string"));
427 "\"zone\" field is not a string"));
436 "\"sub_zone\" field is not a string"));
446 std::vector<grpc_error_handle> error_list;
450 "element \"", certificate_provider.first,
"\" is not an object")));
453 certificate_provider.first, &certificate_provider.second);
458 "errors parsing \"certificate_providers\" object", &error_list);
463 std::vector<grpc_error_handle> error_list;
467 "\"plugin_name\" field not present"));
470 "\"plugin_name\" field is not a string"));
476 if (factory ==
nullptr) {
478 absl::StrCat(
"Unrecognized plugin name: ", plugin_name)));
485 "\"config\" field is not an object"));
506 absl::StrCat(
"errors parsing element \"", instance_name,
"\""),
511 std::vector<std::string> parts;
512 if (
node_ !=
nullptr) {
525 node_->locality_sub_zone,
node_->metadata.Dump()));
535 server().channel_creds_config.Dump()));
537 if (!
server().server_features.empty()) {
542 parts.push_back(
" }\n],\n");
545 "client_default_listener_resource_name_template=\"%s\",\n",
553 parts.push_back(
"authorities={\n");
558 entry.second.client_listener_resource_name_template));
564 entry.second.xds_servers[0].server_uri,
565 entry.second.xds_servers[0].channel_creds_type));
566 parts.push_back(
" },\n");
568 parts.push_back(
"}");
569 parts.push_back(
"certificate_providers={\n");
576 entry.first, entry.second.plugin_name,
577 entry.second.config->ToString()));
579 parts.push_back(
"}");