csds.cc
Go to the documentation of this file.
1 //
2 //
3 // Copyright 2021 gRPC authors.
4 //
5 // Licensed under the Apache License, Version 2.0 (the "License");
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 // http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17 //
18 
20 
22 
23 #include <string>
24 #include <utility>
25 
26 #include "absl/status/status.h"
27 #include "absl/status/statusor.h"
28 
29 #include <grpc/slice.h>
30 #include <grpcpp/support/config.h>
31 #include <grpcpp/support/slice.h>
32 
33 namespace grpc {
34 namespace xds {
35 namespace experimental {
36 
38 using envoy::service::status::v3::ClientStatusRequest;
39 using envoy::service::status::v3::ClientStatusResponse;
40 
41 namespace {
42 
43 absl::StatusOr<ClientConfig> DumpClientConfig() {
44  ClientConfig client_config;
45  grpc_slice serialized_client_config = grpc_dump_xds_configs();
46  std::string bytes = StringFromCopiedSlice(serialized_client_config);
47  grpc_slice_unref(serialized_client_config);
48  if (!client_config.ParseFromString(bytes)) {
49  return absl::InternalError("Failed to parse ClientConfig.");
50  }
51  return client_config;
52 }
53 
54 } // namespace
55 
57  ServerContext* /*context*/,
59  ClientStatusRequest request;
60  while (stream->Read(&request)) {
61  ClientStatusResponse response;
62  absl::StatusOr<ClientConfig> s = DumpClientConfig();
63  if (!s.ok()) {
64  if (s.status().code() == absl::StatusCode::kUnavailable) {
65  // If the xDS client is not initialized, return empty response
66  stream->Write(response);
67  continue;
68  }
69  return Status(StatusCode(s.status().raw_code()), s.status().ToString());
70  }
71  *response.add_config() = std::move(s.value());
72  stream->Write(response);
73  }
74  return Status::OK;
75 }
76 
78  ServerContext* /*context*/, const ClientStatusRequest* /*request*/,
79  ClientStatusResponse* response) {
80  absl::StatusOr<ClientConfig> s = DumpClientConfig();
81  if (!s.ok()) {
82  if (s.status().code() == absl::StatusCode::kUnavailable) {
83  // If the xDS client is not initialized, return empty response
84  return Status::OK;
85  }
86  return Status(StatusCode(s.status().raw_code()), s.status().ToString());
87  }
88  *response->add_config() = std::move(s.value());
89  return Status::OK;
90 }
91 
92 } // namespace experimental
93 } // namespace xds
94 } // namespace grpc
grpc_slice_unref
GPRAPI void grpc_slice_unref(grpc_slice s)
Definition: slice_api.cc:32
grpc::ServerContext
Definition: grpcpp/impl/codegen/server_context.h:566
grpc
Definition: grpcpp/alarm.h:33
slice.h
benchmark.request
request
Definition: benchmark.py:77
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
slice.h
grpc::ServerReaderWriter
Definition: grpcpp/impl/codegen/sync_stream.h:786
absl::InternalError
Status InternalError(absl::string_view message)
Definition: third_party/abseil-cpp/absl/status/status.cc:347
grpc::xds::experimental::ClientStatusDiscoveryService::FetchClientStatus
Status FetchClientStatus(ServerContext *, const envoy::service::status::v3::ClientStatusRequest *, envoy::service::status::v3::ClientStatusResponse *response) override
Definition: csds.cc:77
xds
RefCountedPtr< XdsCertificateProvider > xds
Definition: xds_server_config_fetcher.cc:225
absl::move
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
Definition: abseil-cpp/absl/utility/utility.h:221
framework.rpc.grpc_csds.ClientConfig
ClientConfig
Definition: grpc_csds.py:40
grpc::xds::experimental::ClientStatusDiscoveryService::StreamClientStatus
Status StreamClientStatus(ServerContext *, ServerReaderWriter< envoy::service::status::v3::ClientStatusResponse, envoy::service::status::v3::ClientStatusRequest > *stream) override
Definition: csds.cc:56
grpc_slice
Definition: include/grpc/impl/codegen/slice.h:65
grpc::Status::OK
static const Status & OK
An OK pre-defined instance.
Definition: include/grpcpp/impl/codegen/status.h:113
grpc::StatusCode
StatusCode
Definition: grpcpp/impl/codegen/status_code_enum.h:26
csds.h
config.h
bytes
uint8 bytes[10]
Definition: bloaty/third_party/protobuf/src/google/protobuf/io/coded_stream_unittest.cc:153
asyncio_get_stats.response
response
Definition: asyncio_get_stats.py:28
grpc::protobuf::util::Status
GRPC_CUSTOM_UTIL_STATUS Status
Definition: include/grpcpp/impl/codegen/config_protobuf.h:93
grpc::Status
Definition: include/grpcpp/impl/codegen/status.h:35
grpc_dump_xds_configs
GRPCAPI grpc_slice grpc_dump_xds_configs(void)
Definition: xds_client.cc:2574
absl::StatusOr
Definition: abseil-cpp/absl/status/statusor.h:187
absl::StatusCode::kUnavailable
@ kUnavailable
grpc::StringFromCopiedSlice
std::string StringFromCopiedSlice(grpc_slice slice)
Definition: include/grpcpp/impl/codegen/slice.h:139
port_platform.h
stream
voidpf stream
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:136


grpc
Author(s):
autogenerated on Thu Mar 13 2025 02:59:01