mirror of https://github.com/grpc/grpc.git
parent
b1d4583a51
commit
a802b14be6
19 changed files with 154 additions and 28 deletions
@ -0,0 +1,89 @@ |
||||
/*
|
||||
* |
||||
* Copyright 2019 gRPC authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
* |
||||
*/ |
||||
|
||||
#include <grpc/support/port_platform.h> |
||||
|
||||
#include "src/core/ext/filters/client_channel/resolver_registry.h" |
||||
|
||||
namespace grpc_core { |
||||
|
||||
namespace { |
||||
|
||||
class XdsResolver : public Resolver { |
||||
public: |
||||
explicit XdsResolver(ResolverArgs args) |
||||
: Resolver(args.combiner, std::move(args.result_handler)), |
||||
args_(grpc_channel_args_copy(args.args)) {} |
||||
~XdsResolver() override { grpc_channel_args_destroy(args_); } |
||||
|
||||
void StartLocked() override; |
||||
|
||||
void ShutdownLocked() override{}; |
||||
|
||||
private: |
||||
const grpc_channel_args* args_; |
||||
}; |
||||
|
||||
void XdsResolver::StartLocked() { |
||||
static const char* service_config = |
||||
"{\n" |
||||
" \"loadBalancingConfig\":[\n" |
||||
" { \"xds_experimental\":{} }\n" |
||||
" ]\n" |
||||
"}"; |
||||
Result result; |
||||
result.args = args_; |
||||
args_ = nullptr; |
||||
grpc_error* error = GRPC_ERROR_NONE; |
||||
result.service_config = ServiceConfig::Create(service_config, &error); |
||||
result_handler()->ReturnResult(std::move(result)); |
||||
} |
||||
|
||||
//
|
||||
// Factory
|
||||
//
|
||||
|
||||
class XdsResolverFactory : public ResolverFactory { |
||||
public: |
||||
bool IsValidUri(const grpc_uri* uri) const override { |
||||
if (GPR_UNLIKELY(0 != strcmp(uri->authority, ""))) { |
||||
gpr_log(GPR_ERROR, "URI authority not supported"); |
||||
return false; |
||||
} |
||||
return true; |
||||
} |
||||
|
||||
OrphanablePtr<Resolver> CreateResolver(ResolverArgs args) const override { |
||||
if (!IsValidUri(args.uri)) return nullptr; |
||||
return OrphanablePtr<Resolver>(New<XdsResolver>(std::move(args))); |
||||
} |
||||
|
||||
const char* scheme() const override { return "xds-experimental"; } |
||||
}; |
||||
|
||||
} // namespace
|
||||
|
||||
} // namespace grpc_core
|
||||
|
||||
void grpc_resolver_xds_init() { |
||||
grpc_core::ResolverRegistry::Builder::RegisterResolverFactory( |
||||
grpc_core::UniquePtr<grpc_core::ResolverFactory>( |
||||
grpc_core::New<grpc_core::XdsResolverFactory>())); |
||||
} |
||||
|
||||
void grpc_resolver_xds_shutdown() {} |
Loading…
Reference in new issue