xref: /aosp_15_r20/external/grpc-grpc/src/cpp/server/csds/csds.cc (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1*cc02d7e2SAndroid Build Coastguard Worker //
2*cc02d7e2SAndroid Build Coastguard Worker //
3*cc02d7e2SAndroid Build Coastguard Worker // Copyright 2021 gRPC authors.
4*cc02d7e2SAndroid Build Coastguard Worker //
5*cc02d7e2SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
6*cc02d7e2SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
7*cc02d7e2SAndroid Build Coastguard Worker // You may obtain a copy of the License at
8*cc02d7e2SAndroid Build Coastguard Worker //
9*cc02d7e2SAndroid Build Coastguard Worker //     http://www.apache.org/licenses/LICENSE-2.0
10*cc02d7e2SAndroid Build Coastguard Worker //
11*cc02d7e2SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
12*cc02d7e2SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
13*cc02d7e2SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*cc02d7e2SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
15*cc02d7e2SAndroid Build Coastguard Worker // limitations under the License.
16*cc02d7e2SAndroid Build Coastguard Worker //
17*cc02d7e2SAndroid Build Coastguard Worker //
18*cc02d7e2SAndroid Build Coastguard Worker 
19*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/support/port_platform.h>
20*cc02d7e2SAndroid Build Coastguard Worker 
21*cc02d7e2SAndroid Build Coastguard Worker #include "src/cpp/server/csds/csds.h"
22*cc02d7e2SAndroid Build Coastguard Worker 
23*cc02d7e2SAndroid Build Coastguard Worker #include <string>
24*cc02d7e2SAndroid Build Coastguard Worker #include <utility>
25*cc02d7e2SAndroid Build Coastguard Worker 
26*cc02d7e2SAndroid Build Coastguard Worker #include "absl/status/status.h"
27*cc02d7e2SAndroid Build Coastguard Worker #include "absl/status/statusor.h"
28*cc02d7e2SAndroid Build Coastguard Worker 
29*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/slice.h>
30*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/support/interceptor.h>
31*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/support/slice.h>
32*cc02d7e2SAndroid Build Coastguard Worker 
33*cc02d7e2SAndroid Build Coastguard Worker namespace grpc {
34*cc02d7e2SAndroid Build Coastguard Worker namespace xds {
35*cc02d7e2SAndroid Build Coastguard Worker namespace experimental {
36*cc02d7e2SAndroid Build Coastguard Worker 
37*cc02d7e2SAndroid Build Coastguard Worker using envoy::service::status::v3::ClientStatusRequest;
38*cc02d7e2SAndroid Build Coastguard Worker using envoy::service::status::v3::ClientStatusResponse;
39*cc02d7e2SAndroid Build Coastguard Worker 
40*cc02d7e2SAndroid Build Coastguard Worker namespace {
41*cc02d7e2SAndroid Build Coastguard Worker 
DumpClientStatusResponse()42*cc02d7e2SAndroid Build Coastguard Worker absl::StatusOr<ClientStatusResponse> DumpClientStatusResponse() {
43*cc02d7e2SAndroid Build Coastguard Worker   ClientStatusResponse response;
44*cc02d7e2SAndroid Build Coastguard Worker   grpc_slice serialized_client_config = grpc_dump_xds_configs();
45*cc02d7e2SAndroid Build Coastguard Worker   std::string bytes = StringFromCopiedSlice(serialized_client_config);
46*cc02d7e2SAndroid Build Coastguard Worker   grpc_slice_unref(serialized_client_config);
47*cc02d7e2SAndroid Build Coastguard Worker   if (!response.ParseFromString(bytes)) {
48*cc02d7e2SAndroid Build Coastguard Worker     return absl::InternalError("Failed to parse ClientStatusResponse.");
49*cc02d7e2SAndroid Build Coastguard Worker   }
50*cc02d7e2SAndroid Build Coastguard Worker   return response;
51*cc02d7e2SAndroid Build Coastguard Worker }
52*cc02d7e2SAndroid Build Coastguard Worker 
53*cc02d7e2SAndroid Build Coastguard Worker }  // namespace
54*cc02d7e2SAndroid Build Coastguard Worker 
StreamClientStatus(ServerContext *,ServerReaderWriter<ClientStatusResponse,ClientStatusRequest> * stream)55*cc02d7e2SAndroid Build Coastguard Worker Status ClientStatusDiscoveryService::StreamClientStatus(
56*cc02d7e2SAndroid Build Coastguard Worker     ServerContext* /*context*/,
57*cc02d7e2SAndroid Build Coastguard Worker     ServerReaderWriter<ClientStatusResponse, ClientStatusRequest>* stream) {
58*cc02d7e2SAndroid Build Coastguard Worker   ClientStatusRequest request;
59*cc02d7e2SAndroid Build Coastguard Worker   while (stream->Read(&request)) {
60*cc02d7e2SAndroid Build Coastguard Worker     absl::StatusOr<ClientStatusResponse> response = DumpClientStatusResponse();
61*cc02d7e2SAndroid Build Coastguard Worker     if (!response.ok()) {
62*cc02d7e2SAndroid Build Coastguard Worker       if (response.status().code() == absl::StatusCode::kUnavailable) {
63*cc02d7e2SAndroid Build Coastguard Worker         // If the xDS client is not initialized, return empty response
64*cc02d7e2SAndroid Build Coastguard Worker         stream->Write(ClientStatusResponse());
65*cc02d7e2SAndroid Build Coastguard Worker         continue;
66*cc02d7e2SAndroid Build Coastguard Worker       }
67*cc02d7e2SAndroid Build Coastguard Worker       return Status(static_cast<StatusCode>(response.status().raw_code()),
68*cc02d7e2SAndroid Build Coastguard Worker                     response.status().ToString());
69*cc02d7e2SAndroid Build Coastguard Worker     }
70*cc02d7e2SAndroid Build Coastguard Worker     stream->Write(*response);
71*cc02d7e2SAndroid Build Coastguard Worker   }
72*cc02d7e2SAndroid Build Coastguard Worker   return Status::OK;
73*cc02d7e2SAndroid Build Coastguard Worker }
74*cc02d7e2SAndroid Build Coastguard Worker 
FetchClientStatus(ServerContext *,const ClientStatusRequest *,ClientStatusResponse * response)75*cc02d7e2SAndroid Build Coastguard Worker Status ClientStatusDiscoveryService::FetchClientStatus(
76*cc02d7e2SAndroid Build Coastguard Worker     ServerContext* /*context*/, const ClientStatusRequest* /*request*/,
77*cc02d7e2SAndroid Build Coastguard Worker     ClientStatusResponse* response) {
78*cc02d7e2SAndroid Build Coastguard Worker   absl::StatusOr<ClientStatusResponse> s = DumpClientStatusResponse();
79*cc02d7e2SAndroid Build Coastguard Worker   if (!s.ok()) {
80*cc02d7e2SAndroid Build Coastguard Worker     if (s.status().code() == absl::StatusCode::kUnavailable) {
81*cc02d7e2SAndroid Build Coastguard Worker       // If the xDS client is not initialized, return empty response
82*cc02d7e2SAndroid Build Coastguard Worker       return Status::OK;
83*cc02d7e2SAndroid Build Coastguard Worker     }
84*cc02d7e2SAndroid Build Coastguard Worker     return Status(static_cast<StatusCode>(s.status().raw_code()),
85*cc02d7e2SAndroid Build Coastguard Worker                   s.status().ToString());
86*cc02d7e2SAndroid Build Coastguard Worker   }
87*cc02d7e2SAndroid Build Coastguard Worker   *response = std::move(*s);
88*cc02d7e2SAndroid Build Coastguard Worker   return Status::OK;
89*cc02d7e2SAndroid Build Coastguard Worker }
90*cc02d7e2SAndroid Build Coastguard Worker 
91*cc02d7e2SAndroid Build Coastguard Worker }  // namespace experimental
92*cc02d7e2SAndroid Build Coastguard Worker }  // namespace xds
93*cc02d7e2SAndroid Build Coastguard Worker }  // namespace grpc
94