1 // 2 // Copyright 2019 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 17 #ifndef GRPC_CORE_EXT_XDS_XDS_BOOTSTRAP_H 18 #define GRPC_CORE_EXT_XDS_XDS_BOOTSTRAP_H 19 20 #include <grpc/support/port_platform.h> 21 22 #include <memory> 23 #include <set> 24 #include <string> 25 #include <vector> 26 27 #include "absl/container/inlined_vector.h" 28 29 #include <grpc/slice.h> 30 31 #include "src/core/ext/xds/certificate_provider_store.h" 32 #include "src/core/lib/gprpp/memory.h" 33 #include "src/core/lib/gprpp/ref_counted_ptr.h" 34 #include "src/core/lib/iomgr/error.h" 35 #include "src/core/lib/json/json.h" 36 #include "src/core/lib/security/credentials/credentials.h" 37 38 namespace grpc_core { 39 40 class XdsClient; 41 42 class XdsChannelCredsRegistry { 43 public: 44 static bool IsSupported(const std::string& creds_type); 45 static bool IsValidConfig(const std::string& creds_type, const Json& config); 46 static RefCountedPtr<grpc_channel_credentials> MakeChannelCreds( 47 const std::string& creds_type, const Json& config); 48 }; 49 50 class XdsBootstrap { 51 public: 52 struct Node { 53 std::string id; 54 std::string cluster; 55 std::string locality_region; 56 std::string locality_zone; 57 std::string locality_sub_zone; 58 Json metadata; 59 }; 60 61 struct XdsServer { 62 std::string server_uri; 63 std::string channel_creds_type; 64 Json channel_creds_config; 65 std::set<std::string> server_features; 66 67 bool ShouldUseV3() const; 68 }; 69 70 // Creates bootstrap object from json_string. 71 // If *error is not GRPC_ERROR_NONE after returning, then there was an 72 // error parsing the contents. 73 static std::unique_ptr<XdsBootstrap> Create(absl::string_view json_string, 74 grpc_error_handle* error); 75 76 // Do not instantiate directly -- use Create() above instead. 77 XdsBootstrap(Json json, grpc_error_handle* error); 78 79 std::string ToString() const; 80 81 // TODO(roth): We currently support only one server. Fix this when we 82 // add support for fallback for the xds channel. server()83 const XdsServer& server() const { return servers_[0]; } node()84 const Node* node() const { return node_.get(); } server_listener_resource_name_template()85 const std::string& server_listener_resource_name_template() const { 86 return server_listener_resource_name_template_; 87 } 88 certificate_providers()89 const CertificateProviderStore::PluginDefinitionMap& certificate_providers() 90 const { 91 return certificate_providers_; 92 } 93 94 private: 95 grpc_error_handle ParseXdsServerList(Json* json); 96 grpc_error_handle ParseXdsServer(Json* json, size_t idx); 97 grpc_error_handle ParseChannelCredsArray(Json* json, XdsServer* server); 98 grpc_error_handle ParseChannelCreds(Json* json, size_t idx, 99 XdsServer* server); 100 grpc_error_handle ParseServerFeaturesArray(Json* json, XdsServer* server); 101 grpc_error_handle ParseNode(Json* json); 102 grpc_error_handle ParseLocality(Json* json); 103 grpc_error_handle ParseCertificateProviders(Json* json); 104 grpc_error_handle ParseCertificateProvider(const std::string& instance_name, 105 Json* certificate_provider_json); 106 107 absl::InlinedVector<XdsServer, 1> servers_; 108 std::unique_ptr<Node> node_; 109 std::string server_listener_resource_name_template_; 110 CertificateProviderStore::PluginDefinitionMap certificate_providers_; 111 }; 112 113 } // namespace grpc_core 114 115 #endif /* GRPC_CORE_EXT_XDS_XDS_BOOTSTRAP_H */ 116