xref: /aosp_15_r20/external/grpc-grpc/include/grpcpp/xds_server_builder.h (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1*cc02d7e2SAndroid Build Coastguard Worker //
2*cc02d7e2SAndroid Build Coastguard Worker //
3*cc02d7e2SAndroid Build Coastguard Worker // Copyright 2020 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 #ifndef GRPCPP_XDS_SERVER_BUILDER_H
20*cc02d7e2SAndroid Build Coastguard Worker #define GRPCPP_XDS_SERVER_BUILDER_H
21*cc02d7e2SAndroid Build Coastguard Worker 
22*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/support/port_platform.h>
23*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/server_builder.h>
24*cc02d7e2SAndroid Build Coastguard Worker 
25*cc02d7e2SAndroid Build Coastguard Worker namespace grpc {
26*cc02d7e2SAndroid Build Coastguard Worker 
27*cc02d7e2SAndroid Build Coastguard Worker class XdsServerServingStatusNotifierInterface {
28*cc02d7e2SAndroid Build Coastguard Worker  public:
29*cc02d7e2SAndroid Build Coastguard Worker   struct ServingStatusUpdate {
30*cc02d7e2SAndroid Build Coastguard Worker     grpc::Status status;
31*cc02d7e2SAndroid Build Coastguard Worker   };
32*cc02d7e2SAndroid Build Coastguard Worker 
33*cc02d7e2SAndroid Build Coastguard Worker   virtual ~XdsServerServingStatusNotifierInterface() = default;
34*cc02d7e2SAndroid Build Coastguard Worker 
35*cc02d7e2SAndroid Build Coastguard Worker   // \a uri contains the listening target associated with the notification. Note
36*cc02d7e2SAndroid Build Coastguard Worker   // that a single target provided to XdsServerBuilder can get resolved to
37*cc02d7e2SAndroid Build Coastguard Worker   // multiple listening addresses.
38*cc02d7e2SAndroid Build Coastguard Worker   // The callback is invoked each time there is an update to the serving status.
39*cc02d7e2SAndroid Build Coastguard Worker   // The API does not provide any guarantees around duplicate updates.
40*cc02d7e2SAndroid Build Coastguard Worker   // Status::OK signifies that the server is serving, while a non-OK status
41*cc02d7e2SAndroid Build Coastguard Worker   // signifies that the server is not serving.
42*cc02d7e2SAndroid Build Coastguard Worker   virtual void OnServingStatusUpdate(std::string uri,
43*cc02d7e2SAndroid Build Coastguard Worker                                      ServingStatusUpdate update) = 0;
44*cc02d7e2SAndroid Build Coastguard Worker };
45*cc02d7e2SAndroid Build Coastguard Worker 
46*cc02d7e2SAndroid Build Coastguard Worker class XdsServerBuilder : public grpc::ServerBuilder {
47*cc02d7e2SAndroid Build Coastguard Worker  public:
48*cc02d7e2SAndroid Build Coastguard Worker   // NOTE: class experimental_type is not part of the public API of this class
49*cc02d7e2SAndroid Build Coastguard Worker   // TODO(yashykt): Integrate into public API when this is no longer
50*cc02d7e2SAndroid Build Coastguard Worker   // experimental.
51*cc02d7e2SAndroid Build Coastguard Worker   class experimental_type : public grpc::ServerBuilder::experimental_type {
52*cc02d7e2SAndroid Build Coastguard Worker    public:
experimental_type(XdsServerBuilder * builder)53*cc02d7e2SAndroid Build Coastguard Worker     explicit experimental_type(XdsServerBuilder* builder)
54*cc02d7e2SAndroid Build Coastguard Worker         : ServerBuilder::experimental_type(builder), builder_(builder) {}
55*cc02d7e2SAndroid Build Coastguard Worker 
56*cc02d7e2SAndroid Build Coastguard Worker     // EXPERIMENTAL: Sets the drain grace period in ms for older connections
57*cc02d7e2SAndroid Build Coastguard Worker     // when updates to a Listener is received.
set_drain_grace_time(int drain_grace_time_ms)58*cc02d7e2SAndroid Build Coastguard Worker     void set_drain_grace_time(int drain_grace_time_ms) {
59*cc02d7e2SAndroid Build Coastguard Worker       builder_->drain_grace_time_ms_ = drain_grace_time_ms;
60*cc02d7e2SAndroid Build Coastguard Worker     }
61*cc02d7e2SAndroid Build Coastguard Worker 
62*cc02d7e2SAndroid Build Coastguard Worker    private:
63*cc02d7e2SAndroid Build Coastguard Worker     XdsServerBuilder* builder_;
64*cc02d7e2SAndroid Build Coastguard Worker   };
65*cc02d7e2SAndroid Build Coastguard Worker 
66*cc02d7e2SAndroid Build Coastguard Worker   // It is the responsibility of the application to make sure that \a notifier
67*cc02d7e2SAndroid Build Coastguard Worker   // outlasts the life of the server. Notifications will start being made
68*cc02d7e2SAndroid Build Coastguard Worker   // asynchronously once `BuildAndStart()` has been called. Note that it is
69*cc02d7e2SAndroid Build Coastguard Worker   // possible for notifications to be made before `BuildAndStart()` returns.
set_status_notifier(XdsServerServingStatusNotifierInterface * notifier)70*cc02d7e2SAndroid Build Coastguard Worker   void set_status_notifier(XdsServerServingStatusNotifierInterface* notifier) {
71*cc02d7e2SAndroid Build Coastguard Worker     notifier_ = notifier;
72*cc02d7e2SAndroid Build Coastguard Worker   }
73*cc02d7e2SAndroid Build Coastguard Worker 
74*cc02d7e2SAndroid Build Coastguard Worker   /// NOTE: The function experimental() is not stable public API. It is a view
75*cc02d7e2SAndroid Build Coastguard Worker   /// to the experimental components of this class. It may be changed or removed
76*cc02d7e2SAndroid Build Coastguard Worker   /// at any time.
experimental()77*cc02d7e2SAndroid Build Coastguard Worker   experimental_type experimental() { return experimental_type(this); }
78*cc02d7e2SAndroid Build Coastguard Worker 
79*cc02d7e2SAndroid Build Coastguard Worker  private:
80*cc02d7e2SAndroid Build Coastguard Worker   // Called at the beginning of BuildAndStart().
81*cc02d7e2SAndroid Build Coastguard Worker   ChannelArguments BuildChannelArgs() override;
82*cc02d7e2SAndroid Build Coastguard Worker 
OnServingStatusUpdate(void * user_data,const char * uri,grpc_serving_status_update update)83*cc02d7e2SAndroid Build Coastguard Worker   static void OnServingStatusUpdate(void* user_data, const char* uri,
84*cc02d7e2SAndroid Build Coastguard Worker                                     grpc_serving_status_update update) {
85*cc02d7e2SAndroid Build Coastguard Worker     if (user_data == nullptr) return;
86*cc02d7e2SAndroid Build Coastguard Worker     XdsServerServingStatusNotifierInterface* notifier =
87*cc02d7e2SAndroid Build Coastguard Worker         static_cast<XdsServerServingStatusNotifierInterface*>(user_data);
88*cc02d7e2SAndroid Build Coastguard Worker     notifier->OnServingStatusUpdate(
89*cc02d7e2SAndroid Build Coastguard Worker         uri, {grpc::Status(static_cast<StatusCode>(update.code),
90*cc02d7e2SAndroid Build Coastguard Worker                            update.error_message)});
91*cc02d7e2SAndroid Build Coastguard Worker   }
92*cc02d7e2SAndroid Build Coastguard Worker 
93*cc02d7e2SAndroid Build Coastguard Worker   XdsServerServingStatusNotifierInterface* notifier_ = nullptr;
94*cc02d7e2SAndroid Build Coastguard Worker   int drain_grace_time_ms_ = -1;
95*cc02d7e2SAndroid Build Coastguard Worker };
96*cc02d7e2SAndroid Build Coastguard Worker 
97*cc02d7e2SAndroid Build Coastguard Worker }  // namespace grpc
98*cc02d7e2SAndroid Build Coastguard Worker 
99*cc02d7e2SAndroid Build Coastguard Worker #endif  // GRPCPP_XDS_SERVER_BUILDER_H
100