• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 //
3 // Copyright 2020 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 
19 #ifndef GRPCPP_XDS_SERVER_BUILDER_H
20 #define GRPCPP_XDS_SERVER_BUILDER_H
21 
22 #include <grpc/impl/codegen/port_platform.h>
23 
24 #include <grpcpp/server_builder.h>
25 
26 namespace grpc {
27 namespace experimental {
28 
29 class XdsServerServingStatusNotifierInterface {
30  public:
31   virtual ~XdsServerServingStatusNotifierInterface() = default;
32 
33   // \a uri contains the listening target associated with the notification. Note
34   // that a single target provided to XdsServerBuilder can get resolved to
35   // multiple listening addresses.
36   // The callback is invoked each time there is an update to the serving status.
37   // The API does not provide any guarantees around duplicate updates.
38   // Status::OK signifies that the server is serving, while a non-OK status
39   // signifies that the server is not serving.
40   virtual void OnServingStatusUpdate(std::string uri, grpc::Status status) = 0;
41 };
42 
43 class XdsServerBuilder : public ::grpc::ServerBuilder {
44  public:
45   // It is the responsibility of the application to make sure that \a notifier
46   // outlasts the life of the server. Notifications will start being made
47   // asynchronously once `BuildAndStart()` has been called. Note that it is
48   // possible for notifications to be made before `BuildAndStart()` returns.
set_status_notifier(XdsServerServingStatusNotifierInterface * notifier)49   void set_status_notifier(XdsServerServingStatusNotifierInterface* notifier) {
50     notifier_ = notifier;
51   }
52 
53  private:
54   // Called at the beginning of BuildAndStart().
BuildChannelArgs()55   ChannelArguments BuildChannelArgs() override {
56     ChannelArguments args = ServerBuilder::BuildChannelArgs();
57     grpc_channel_args c_channel_args = args.c_channel_args();
58     grpc_server_config_fetcher* fetcher = grpc_server_config_fetcher_xds_create(
59         {OnServingStatusUpdate, notifier_}, &c_channel_args);
60     if (fetcher != nullptr) set_fetcher(fetcher);
61     return args;
62   }
63 
OnServingStatusUpdate(void * user_data,const char * uri,grpc_status_code code,const char * error_message)64   static void OnServingStatusUpdate(void* user_data, const char* uri,
65                                     grpc_status_code code,
66                                     const char* error_message) {
67     if (user_data == nullptr) return;
68     XdsServerServingStatusNotifierInterface* notifier =
69         static_cast<XdsServerServingStatusNotifierInterface*>(user_data);
70     notifier->OnServingStatusUpdate(
71         uri, grpc::Status(static_cast<StatusCode>(code), error_message));
72   }
73 
74   XdsServerServingStatusNotifierInterface* notifier_ = nullptr;
75 };
76 
77 }  // namespace experimental
78 }  // namespace grpc
79 
80 #endif /* GRPCPP_XDS_SERVER_BUILDER_H */
81