summaryrefslogtreecommitdiff
path: root/grpc/spm-cpp-include/grpcpp/xds_server_builder.h
diff options
context:
space:
mode:
Diffstat (limited to 'grpc/spm-cpp-include/grpcpp/xds_server_builder.h')
-rw-r--r--grpc/spm-cpp-include/grpcpp/xds_server_builder.h49
1 files changed, 43 insertions, 6 deletions
diff --git a/grpc/spm-cpp-include/grpcpp/xds_server_builder.h b/grpc/spm-cpp-include/grpcpp/xds_server_builder.h
index 1ed9e83a..076c377f 100644
--- a/grpc/spm-cpp-include/grpcpp/xds_server_builder.h
+++ b/grpc/spm-cpp-include/grpcpp/xds_server_builder.h
@@ -26,15 +26,52 @@
namespace grpc {
namespace experimental {
+class XdsServerServingStatusNotifierInterface {
+ public:
+ virtual ~XdsServerServingStatusNotifierInterface() = default;
+
+ // \a uri contains the listening target associated with the notification. Note
+ // that a single target provided to XdsServerBuilder can get resolved to
+ // multiple listening addresses.
+ // The callback is invoked each time there is an update to the serving status.
+ // The API does not provide any guarantees around duplicate updates.
+ // Status::OK signifies that the server is serving, while a non-OK status
+ // signifies that the server is not serving.
+ virtual void OnServingStatusUpdate(std::string uri, grpc::Status status) = 0;
+};
+
class XdsServerBuilder : public ::grpc::ServerBuilder {
public:
- std::unique_ptr<Server> BuildAndStart() override {
- grpc_server_config_fetcher* fetcher =
- grpc_server_config_fetcher_xds_create();
- if (fetcher == nullptr) return nullptr;
- set_fetcher(fetcher);
- return ServerBuilder::BuildAndStart();
+ // It is the responsibility of the application to make sure that \a notifier
+ // outlasts the life of the server. Notifications will start being made
+ // asynchronously once `BuildAndStart()` has been called. Note that it is
+ // possible for notifications to be made before `BuildAndStart()` returns.
+ void set_status_notifier(XdsServerServingStatusNotifierInterface* notifier) {
+ notifier_ = notifier;
}
+
+ private:
+ // Called at the beginning of BuildAndStart().
+ ChannelArguments BuildChannelArgs() override {
+ ChannelArguments args = ServerBuilder::BuildChannelArgs();
+ grpc_channel_args c_channel_args = args.c_channel_args();
+ grpc_server_config_fetcher* fetcher = grpc_server_config_fetcher_xds_create(
+ {OnServingStatusUpdate, notifier_}, &c_channel_args);
+ if (fetcher != nullptr) set_fetcher(fetcher);
+ return args;
+ }
+
+ static void OnServingStatusUpdate(void* user_data, const char* uri,
+ grpc_status_code code,
+ const char* error_message) {
+ if (user_data == nullptr) return;
+ XdsServerServingStatusNotifierInterface* notifier =
+ static_cast<XdsServerServingStatusNotifierInterface*>(user_data);
+ notifier->OnServingStatusUpdate(
+ uri, grpc::Status(static_cast<StatusCode>(code), error_message));
+ }
+
+ XdsServerServingStatusNotifierInterface* notifier_ = nullptr;
};
} // namespace experimental