_base_server.py
Go to the documentation of this file.
1 # Copyright 2020 The gRPC Authors
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 # http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14 """Abstract base classes for server-side classes."""
15 
16 import abc
17 from typing import Generic, Iterable, Mapping, Optional, Sequence
18 
19 import grpc
20 
21 from ._metadata import Metadata
22 from ._typing import DoneCallbackType
23 from ._typing import MetadataType
24 from ._typing import RequestType
25 from ._typing import ResponseType
26 
27 
28 class Server(abc.ABC):
29  """Serves RPCs."""
30 
31  @abc.abstractmethod
33  self,
34  generic_rpc_handlers: Sequence[grpc.GenericRpcHandler]) -> None:
35  """Registers GenericRpcHandlers with this Server.
36 
37  This method is only safe to call before the server is started.
38 
39  Args:
40  generic_rpc_handlers: A sequence of GenericRpcHandlers that will be
41  used to service RPCs.
42  """
43 
44  @abc.abstractmethod
45  def add_insecure_port(self, address: str) -> int:
46  """Opens an insecure port for accepting RPCs.
47 
48  A port is a communication endpoint that used by networking protocols,
49  like TCP and UDP. To date, we only support TCP.
50 
51  This method may only be called before starting the server.
52 
53  Args:
54  address: The address for which to open a port. If the port is 0,
55  or not specified in the address, then the gRPC runtime will choose a port.
56 
57  Returns:
58  An integer port on which the server will accept RPC requests.
59  """
60 
61  @abc.abstractmethod
62  def add_secure_port(self, address: str,
63  server_credentials: grpc.ServerCredentials) -> int:
64  """Opens a secure port for accepting RPCs.
65 
66  A port is a communication endpoint that used by networking protocols,
67  like TCP and UDP. To date, we only support TCP.
68 
69  This method may only be called before starting the server.
70 
71  Args:
72  address: The address for which to open a port.
73  if the port is 0, or not specified in the address, then the gRPC
74  runtime will choose a port.
75  server_credentials: A ServerCredentials object.
76 
77  Returns:
78  An integer port on which the server will accept RPC requests.
79  """
80 
81  @abc.abstractmethod
82  async def start(self) -> None:
83  """Starts this Server.
84 
85  This method may only be called once. (i.e. it is not idempotent).
86  """
87 
88  @abc.abstractmethod
89  async def stop(self, grace: Optional[float]) -> None:
90  """Stops this Server.
91 
92  This method immediately stops the server from servicing new RPCs in
93  all cases.
94 
95  If a grace period is specified, this method returns immediately and all
96  RPCs active at the end of the grace period are aborted. If a grace
97  period is not specified (by passing None for grace), all existing RPCs
98  are aborted immediately and this method blocks until the last RPC
99  handler terminates.
100 
101  This method is idempotent and may be called at any time. Passing a
102  smaller grace value in a subsequent call will have the effect of
103  stopping the Server sooner (passing None will have the effect of
104  stopping the server immediately). Passing a larger grace value in a
105  subsequent call will not have the effect of stopping the server later
106  (i.e. the most restrictive grace value is used).
107 
108  Args:
109  grace: A duration of time in seconds or None.
110  """
111 
112  @abc.abstractmethod
113  async def wait_for_termination(self,
114  timeout: Optional[float] = None) -> bool:
115  """Continues current coroutine once the server stops.
116 
117  This is an EXPERIMENTAL API.
118 
119  The wait will not consume computational resources during blocking, and
120  it will block until one of the two following conditions are met:
121 
122  1) The server is stopped or terminated;
123  2) A timeout occurs if timeout is not `None`.
124 
125  The timeout argument works in the same way as `threading.Event.wait()`.
126  https://docs.python.org/3/library/threading.html#threading.Event.wait
127 
128  Args:
129  timeout: A floating point number specifying a timeout for the
130  operation in seconds.
131 
132  Returns:
133  A bool indicates if the operation times out.
134  """
135 
136 
137 # pylint: disable=too-many-public-methods
138 class ServicerContext(Generic[RequestType, ResponseType], abc.ABC):
139  """A context object passed to method implementations."""
140 
141  @abc.abstractmethod
142  async def read(self) -> RequestType:
143  """Reads one message from the RPC.
144 
145  Only one read operation is allowed simultaneously.
146 
147  Returns:
148  A response message of the RPC.
149 
150  Raises:
151  An RpcError exception if the read failed.
152  """
153 
154  @abc.abstractmethod
155  async def write(self, message: ResponseType) -> None:
156  """Writes one message to the RPC.
157 
158  Only one write operation is allowed simultaneously.
159 
160  Raises:
161  An RpcError exception if the write failed.
162  """
163 
164  @abc.abstractmethod
165  async def send_initial_metadata(self,
166  initial_metadata: MetadataType) -> None:
167  """Sends the initial metadata value to the client.
168 
169  This method need not be called by implementations if they have no
170  metadata to add to what the gRPC runtime will transmit.
171 
172  Args:
173  initial_metadata: The initial :term:`metadata`.
174  """
175 
176  @abc.abstractmethod
177  async def abort(
178  self,
179  code: grpc.StatusCode,
180  details: str = '',
181  trailing_metadata: MetadataType = tuple()) -> None:
182  """Raises an exception to terminate the RPC with a non-OK status.
183 
184  The code and details passed as arguments will supercede any existing
185  ones.
186 
187  Args:
188  code: A StatusCode object to be sent to the client.
189  It must not be StatusCode.OK.
190  details: A UTF-8-encodable string to be sent to the client upon
191  termination of the RPC.
192  trailing_metadata: A sequence of tuple represents the trailing
193  :term:`metadata`.
194 
195  Raises:
196  Exception: An exception is always raised to signal the abortion the
197  RPC to the gRPC runtime.
198  """
199 
200  @abc.abstractmethod
201  def set_trailing_metadata(self, trailing_metadata: MetadataType) -> None:
202  """Sends the trailing metadata for the RPC.
203 
204  This method need not be called by implementations if they have no
205  metadata to add to what the gRPC runtime will transmit.
206 
207  Args:
208  trailing_metadata: The trailing :term:`metadata`.
209  """
210 
211  @abc.abstractmethod
212  def invocation_metadata(self) -> Optional[Metadata]:
213  """Accesses the metadata sent by the client.
214 
215  Returns:
216  The invocation :term:`metadata`.
217  """
218 
219  @abc.abstractmethod
220  def set_code(self, code: grpc.StatusCode) -> None:
221  """Sets the value to be used as status code upon RPC completion.
222 
223  This method need not be called by method implementations if they wish
224  the gRPC runtime to determine the status code of the RPC.
225 
226  Args:
227  code: A StatusCode object to be sent to the client.
228  """
229 
230  @abc.abstractmethod
231  def set_details(self, details: str) -> None:
232  """Sets the value to be used the as detail string upon RPC completion.
233 
234  This method need not be called by method implementations if they have
235  no details to transmit.
236 
237  Args:
238  details: A UTF-8-encodable string to be sent to the client upon
239  termination of the RPC.
240  """
241 
242  @abc.abstractmethod
243  def set_compression(self, compression: grpc.Compression) -> None:
244  """Set the compression algorithm to be used for the entire call.
245 
246  This is an EXPERIMENTAL method.
247 
248  Args:
249  compression: An element of grpc.compression, e.g.
250  grpc.compression.Gzip.
251  """
252 
253  @abc.abstractmethod
255  """Disables compression for the next response message.
256 
257  This is an EXPERIMENTAL method.
258 
259  This method will override any compression configuration set during
260  server creation or set on the call.
261  """
262 
263  @abc.abstractmethod
264  def peer(self) -> str:
265  """Identifies the peer that invoked the RPC being serviced.
266 
267  Returns:
268  A string identifying the peer that invoked the RPC being serviced.
269  The string format is determined by gRPC runtime.
270  """
271 
272  @abc.abstractmethod
273  def peer_identities(self) -> Optional[Iterable[bytes]]:
274  """Gets one or more peer identity(s).
275 
276  Equivalent to
277  servicer_context.auth_context().get(servicer_context.peer_identity_key())
278 
279  Returns:
280  An iterable of the identities, or None if the call is not
281  authenticated. Each identity is returned as a raw bytes type.
282  """
283 
284  @abc.abstractmethod
285  def peer_identity_key(self) -> Optional[str]:
286  """The auth property used to identify the peer.
287 
288  For example, "x509_common_name" or "x509_subject_alternative_name" are
289  used to identify an SSL peer.
290 
291  Returns:
292  The auth property (string) that indicates the
293  peer identity, or None if the call is not authenticated.
294  """
295 
296  @abc.abstractmethod
297  def auth_context(self) -> Mapping[str, Iterable[bytes]]:
298  """Gets the auth context for the call.
299 
300  Returns:
301  A map of strings to an iterable of bytes for each auth property.
302  """
303 
304  def time_remaining(self) -> float:
305  """Describes the length of allowed time remaining for the RPC.
306 
307  Returns:
308  A nonnegative float indicating the length of allowed time in seconds
309  remaining for the RPC to complete before it is considered to have
310  timed out, or None if no deadline was specified for the RPC.
311  """
312 
313  def trailing_metadata(self):
314  """Access value to be used as trailing metadata upon RPC completion.
315 
316  This is an EXPERIMENTAL API.
317 
318  Returns:
319  The trailing :term:`metadata` for the RPC.
320  """
321  raise NotImplementedError()
322 
323  def code(self):
324  """Accesses the value to be used as status code upon RPC completion.
325 
326  This is an EXPERIMENTAL API.
327 
328  Returns:
329  The StatusCode value for the RPC.
330  """
331  raise NotImplementedError()
332 
333  def details(self):
334  """Accesses the value to be used as detail string upon RPC completion.
335 
336  This is an EXPERIMENTAL API.
337 
338  Returns:
339  The details string of the RPC.
340  """
341  raise NotImplementedError()
342 
343  def add_done_callback(self, callback: DoneCallbackType) -> None:
344  """Registers a callback to be called on RPC termination.
345 
346  This is an EXPERIMENTAL API.
347 
348  Args:
349  callback: A callable object will be called with the servicer context
350  object as its only argument.
351  """
352 
353  def cancelled(self) -> bool:
354  """Return True if the RPC is cancelled.
355 
356  The RPC is cancelled when the cancellation was requested with cancel().
357 
358  This is an EXPERIMENTAL API.
359 
360  Returns:
361  A bool indicates whether the RPC is cancelled or not.
362  """
363 
364  def done(self) -> bool:
365  """Return True if the RPC is done.
366 
367  An RPC is done if the RPC is completed, cancelled or aborted.
368 
369  This is an EXPERIMENTAL API.
370 
371  Returns:
372  A bool indicates if the RPC is done.
373  """
grpc.aio._base_server.Server
Definition: _base_server.py:28
grpc.aio._base_server.Server.add_insecure_port
int add_insecure_port(self, str address)
Definition: _base_server.py:45
grpc.aio._base_server.ServicerContext.set_code
None set_code(self, grpc.StatusCode code)
Definition: _base_server.py:220
grpc.aio._base_server.ServicerContext.set_details
None set_details(self, str details)
Definition: _base_server.py:231
grpc.aio._base_server.ServicerContext.abort
None abort(self, grpc.StatusCode code, str details='', MetadataType trailing_metadata=tuple())
Definition: _base_server.py:177
grpc.aio._base_server.Server.stop
None stop(self, Optional[float] grace)
Definition: _base_server.py:89
grpc.aio._base_server.ServicerContext.send_initial_metadata
None send_initial_metadata(self, MetadataType initial_metadata)
Definition: _base_server.py:165
grpc.aio._base_server.ServicerContext.set_compression
None set_compression(self, grpc.Compression compression)
Definition: _base_server.py:243
grpc.aio._base_server.ServicerContext.write
None write(self, ResponseType message)
Definition: _base_server.py:155
grpc.aio._base_server.ServicerContext.invocation_metadata
Optional[Metadata] invocation_metadata(self)
Definition: _base_server.py:212
grpc.aio._base_server.ServicerContext.cancelled
bool cancelled(self)
Definition: _base_server.py:353
grpc.aio._base_server.ServicerContext.disable_next_message_compression
None disable_next_message_compression(self)
Definition: _base_server.py:254
grpc.aio._base_server.Server.start
None start(self)
Definition: _base_server.py:82
grpc.aio._base_server.ServicerContext.details
def details(self)
Definition: _base_server.py:333
grpc.aio._base_server.ServicerContext.done
bool done(self)
Definition: _base_server.py:364
grpc.aio._base_server.ServicerContext.code
def code(self)
Definition: _base_server.py:323
grpc.aio._base_server.ServicerContext.peer
str peer(self)
Definition: _base_server.py:264
grpc::ServerCredentials
Wrapper around grpc_server_credentials, a way to authenticate a server.
Definition: include/grpcpp/security/server_credentials.h:76
grpc.GenericRpcHandler
Definition: src/python/grpcio/grpc/__init__.py:1333
grpc.aio._base_server.ServicerContext.add_done_callback
None add_done_callback(self, DoneCallbackType callback)
Definition: _base_server.py:343
grpc.aio._base_server.ServicerContext.read
RequestType read(self)
Definition: _base_server.py:142
grpc.aio._base_server.ServicerContext.peer_identity_key
Optional[str] peer_identity_key(self)
Definition: _base_server.py:285
grpc.aio._base_server.ServicerContext
Definition: _base_server.py:138
grpc.aio._base_server.Server.add_secure_port
int add_secure_port(self, str address, grpc.ServerCredentials server_credentials)
Definition: _base_server.py:62
grpc.aio._base_server.Server.add_generic_rpc_handlers
None add_generic_rpc_handlers(self, Sequence[grpc.GenericRpcHandler] generic_rpc_handlers)
Definition: _base_server.py:32
grpc.aio._base_server.ServicerContext.set_trailing_metadata
None set_trailing_metadata(self, MetadataType trailing_metadata)
Definition: _base_server.py:201
grpc.aio._base_server.ServicerContext.time_remaining
float time_remaining(self)
Definition: _base_server.py:304
grpc.aio._base_server.ServicerContext.peer_identities
Optional[Iterable[bytes]] peer_identities(self)
Definition: _base_server.py:273
grpc.aio._base_server.ServicerContext.auth_context
Mapping[str, Iterable[bytes]] auth_context(self)
Definition: _base_server.py:297
grpc.aio._base_server.Server.wait_for_termination
bool wait_for_termination(self, Optional[float] timeout=None)
Definition: _base_server.py:113
grpc.aio._base_server.ServicerContext.trailing_metadata
def trailing_metadata(self)
Definition: _base_server.py:313


grpc
Author(s):
autogenerated on Thu Mar 13 2025 02:58:26