#include <grpc/support/port_platform.h>
#include "src/cpp/server/csds/csds.h"
#include <string>
#include <utility>
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include <grpc/slice.h>
#include <grpcpp/support/interceptor.h>
#include <grpcpp/support/slice.h>
namespace grpc {
namespace xds {
namespace experimental {
using envoy::service::status::v3::ClientConfig;
using envoy::service::status::v3::ClientStatusRequest;
using envoy::service::status::v3::ClientStatusResponse;
namespace {
absl::StatusOr<ClientConfig> DumpClientConfig() {
ClientConfig client_config;
grpc_slice serialized_client_config = grpc_dump_xds_configs();
std::string bytes = StringFromCopiedSlice(serialized_client_config);
grpc_slice_unref(serialized_client_config);
if (!client_config.ParseFromString(bytes)) {
return absl::InternalError("Failed to parse ClientConfig.");
}
return client_config;
}
}
Status ClientStatusDiscoveryService::StreamClientStatus(
ServerContext* ,
ServerReaderWriter<ClientStatusResponse, ClientStatusRequest>* stream) {
ClientStatusRequest request;
while (stream->Read(&request)) {
ClientStatusResponse response;
absl::StatusOr<ClientConfig> s = DumpClientConfig();
if (!s.ok()) {
if (s.status().code() == absl::StatusCode::kUnavailable) {
stream->Write(response);
continue;
}
return Status(static_cast<StatusCode>(s.status().raw_code()),
s.status().ToString());
}
*response.add_config() = std::move(s.value());
stream->Write(response);
}
return Status::OK;
}
Status ClientStatusDiscoveryService::FetchClientStatus(
ServerContext* , const ClientStatusRequest* ,
ClientStatusResponse* response) {
absl::StatusOr<ClientConfig> s = DumpClientConfig();
if (!s.ok()) {
if (s.status().code() == absl::StatusCode::kUnavailable) {
return Status::OK;
}
return Status(static_cast<StatusCode>(s.status().raw_code()),
s.status().ToString());
}
*response->add_config() = std::move(s.value());
return Status::OK;
}
} } }