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_subzone; 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 // If *error is not GRPC_ERROR_NONE after returning, then there was an 71 // error reading the file. 72 static std::unique_ptr<XdsBootstrap> ReadFromFile(XdsClient* client, 73 TraceFlag* tracer, 74 grpc_error** error); 75 76 // Do not instantiate directly -- use ReadFromFile() above instead. 77 XdsBootstrap(Json json, grpc_error** error); 78 79 // TODO(roth): We currently support only one server. Fix this when we 80 // add support for fallback for the xds channel. server()81 const XdsServer& server() const { return servers_[0]; } node()82 const Node* node() const { return node_.get(); } 83 certificate_providers()84 const CertificateProviderStore::PluginDefinitionMap& certificate_providers() 85 const { 86 return certificate_providers_; 87 } 88 89 private: 90 grpc_error* ParseXdsServerList(Json* json); 91 grpc_error* ParseXdsServer(Json* json, size_t idx); 92 grpc_error* ParseChannelCredsArray(Json* json, XdsServer* server); 93 grpc_error* ParseChannelCreds(Json* json, size_t idx, XdsServer* server); 94 grpc_error* ParseServerFeaturesArray(Json* json, XdsServer* server); 95 grpc_error* ParseNode(Json* json); 96 grpc_error* ParseLocality(Json* json); 97 grpc_error* ParseCertificateProviders(Json* json); 98 grpc_error* ParseCertificateProvider(const std::string& instance_name, 99 Json* certificate_provider_json); 100 101 absl::InlinedVector<XdsServer, 1> servers_; 102 std::unique_ptr<Node> node_; 103 CertificateProviderStore::PluginDefinitionMap certificate_providers_; 104 }; 105 106 } // namespace grpc_core 107 108 #endif /* GRPC_CORE_EXT_XDS_XDS_BOOTSTRAP_H */ 109