Imported Upstream version 1.26.0
[platform/upstream/grpc.git] / src / python / grpcio / grpc / __init__.py
1 # Copyright 2015-2016 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 """gRPC's Python API."""
15
16 import abc
17 import contextlib
18 import enum
19 import logging
20 import sys
21 import six
22
23 from grpc._cython import cygrpc as _cygrpc
24 from grpc import _compression
25
26 logging.getLogger(__name__).addHandler(logging.NullHandler())
27
28 try:
29     from grpc._grpcio_metadata import __version__
30 except ImportError:
31     __version__ = "dev0"
32
33 ############################## Future Interface  ###############################
34
35
36 class FutureTimeoutError(Exception):
37     """Indicates that a method call on a Future timed out."""
38
39
40 class FutureCancelledError(Exception):
41     """Indicates that the computation underlying a Future was cancelled."""
42
43
44 class Future(six.with_metaclass(abc.ABCMeta)):
45     """A representation of a computation in another control flow.
46
47     Computations represented by a Future may be yet to be begun,
48     may be ongoing, or may have already completed.
49     """
50
51     @abc.abstractmethod
52     def cancel(self):
53         """Attempts to cancel the computation.
54
55         This method does not block.
56
57         Returns:
58             bool:
59             Returns True if the computation was canceled.
60
61             Returns False under all other circumstances, for example:
62
63             1. computation has begun and could not be canceled.
64             2. computation has finished
65             3. computation is scheduled for execution and it is impossible
66                 to determine its state without blocking.
67         """
68         raise NotImplementedError()
69
70     @abc.abstractmethod
71     def cancelled(self):
72         """Describes whether the computation was cancelled.
73
74         This method does not block.
75
76         Returns:
77             bool:
78             Returns True if the computation was cancelled before its result became
79             available.
80
81             Returns False under all other circumstances, for example:
82
83             1. computation was not cancelled.
84             2. computation's result is available.
85         """
86         raise NotImplementedError()
87
88     @abc.abstractmethod
89     def running(self):
90         """Describes whether the computation is taking place.
91
92         This method does not block.
93
94         Returns:
95             Returns True if the computation is scheduled for execution or
96             currently executing.
97
98             Returns False if the computation already executed or was cancelled.
99         """
100         raise NotImplementedError()
101
102     @abc.abstractmethod
103     def done(self):
104         """Describes whether the computation has taken place.
105
106         This method does not block.
107
108         Returns:
109             bool:
110             Returns True if the computation already executed or was cancelled.
111             Returns False if the computation is scheduled for execution or
112             currently executing.
113             This is exactly opposite of the running() method's result.
114         """
115         raise NotImplementedError()
116
117     @abc.abstractmethod
118     def result(self, timeout=None):
119         """Returns the result of the computation or raises its exception.
120
121         This method may return immediately or may block.
122
123         Args:
124           timeout: The length of time in seconds to wait for the computation to
125             finish or be cancelled. If None, the call will block until the
126             computations's termination.
127
128         Returns:
129           The return value of the computation.
130
131         Raises:
132           FutureTimeoutError: If a timeout value is passed and the computation
133             does not terminate within the allotted time.
134           FutureCancelledError: If the computation was cancelled.
135           Exception: If the computation raised an exception, this call will
136             raise the same exception.
137         """
138         raise NotImplementedError()
139
140     @abc.abstractmethod
141     def exception(self, timeout=None):
142         """Return the exception raised by the computation.
143
144         This method may return immediately or may block.
145
146         Args:
147           timeout: The length of time in seconds to wait for the computation to
148             terminate or be cancelled. If None, the call will block until the
149             computations's termination.
150
151         Returns:
152             The exception raised by the computation, or None if the computation
153             did not raise an exception.
154
155         Raises:
156           FutureTimeoutError: If a timeout value is passed and the computation
157             does not terminate within the allotted time.
158           FutureCancelledError: If the computation was cancelled.
159         """
160         raise NotImplementedError()
161
162     @abc.abstractmethod
163     def traceback(self, timeout=None):
164         """Access the traceback of the exception raised by the computation.
165
166         This method may return immediately or may block.
167
168         Args:
169           timeout: The length of time in seconds to wait for the computation
170             to terminate or be cancelled. If None, the call will block until
171             the computation's termination.
172
173         Returns:
174             The traceback of the exception raised by the computation, or None
175             if the computation did not raise an exception.
176
177         Raises:
178           FutureTimeoutError: If a timeout value is passed and the computation
179             does not terminate within the allotted time.
180           FutureCancelledError: If the computation was cancelled.
181         """
182         raise NotImplementedError()
183
184     @abc.abstractmethod
185     def add_done_callback(self, fn):
186         """Adds a function to be called at completion of the computation.
187
188         The callback will be passed this Future object describing the outcome
189         of the computation.  Callbacks will be invoked after the future is
190         terimated, whether successfully or not.
191
192         If the computation has already completed, the callback will be called
193         immediately.
194
195         Exceptions raised in the callback will be logged at ERROR level, but
196         will not terminate any threads of execution.
197
198         Args:
199           fn: A callable taking this Future object as its single parameter.
200         """
201         raise NotImplementedError()
202
203
204 ################################  gRPC Enums  ##################################
205
206
207 @enum.unique
208 class ChannelConnectivity(enum.Enum):
209     """Mirrors grpc_connectivity_state in the gRPC Core.
210
211     Attributes:
212       IDLE: The channel is idle.
213       CONNECTING: The channel is connecting.
214       READY: The channel is ready to conduct RPCs.
215       TRANSIENT_FAILURE: The channel has seen a failure from which it expects
216         to recover.
217       SHUTDOWN: The channel has seen a failure from which it cannot recover.
218     """
219     IDLE = (_cygrpc.ConnectivityState.idle, 'idle')
220     CONNECTING = (_cygrpc.ConnectivityState.connecting, 'connecting')
221     READY = (_cygrpc.ConnectivityState.ready, 'ready')
222     TRANSIENT_FAILURE = (_cygrpc.ConnectivityState.transient_failure,
223                          'transient failure')
224     SHUTDOWN = (_cygrpc.ConnectivityState.shutdown, 'shutdown')
225
226
227 @enum.unique
228 class StatusCode(enum.Enum):
229     """Mirrors grpc_status_code in the gRPC Core.
230
231     Attributes:
232       OK: Not an error; returned on success
233       CANCELLED: The operation was cancelled (typically by the caller).
234       UNKNOWN: Unknown error.
235       INVALID_ARGUMENT: Client specified an invalid argument.
236       DEADLINE_EXCEEDED: Deadline expired before operation could complete.
237       NOT_FOUND: Some requested entity (e.g., file or directory) was not found.
238       ALREADY_EXISTS: Some entity that we attempted to create (e.g., file or directory)
239         already exists.
240       PERMISSION_DENIED: The caller does not have permission to execute the specified
241         operation.
242       UNAUTHENTICATED: The request does not have valid authentication credentials for the
243         operation.
244       RESOURCE_EXHAUSTED: Some resource has been exhausted, perhaps a per-user quota, or
245         perhaps the entire file system is out of space.
246       FAILED_PRECONDITION: Operation was rejected because the system is not in a state
247         required for the operation's execution.
248       ABORTED: The operation was aborted, typically due to a concurrency issue
249         like sequencer check failures, transaction aborts, etc.
250       UNIMPLEMENTED: Operation is not implemented or not supported/enabled in this service.
251       INTERNAL: Internal errors.  Means some invariants expected by underlying
252         system has been broken.
253       UNAVAILABLE: The service is currently unavailable.
254       DATA_LOSS: Unrecoverable data loss or corruption.
255     """
256     OK = (_cygrpc.StatusCode.ok, 'ok')
257     CANCELLED = (_cygrpc.StatusCode.cancelled, 'cancelled')
258     UNKNOWN = (_cygrpc.StatusCode.unknown, 'unknown')
259     INVALID_ARGUMENT = (_cygrpc.StatusCode.invalid_argument, 'invalid argument')
260     DEADLINE_EXCEEDED = (_cygrpc.StatusCode.deadline_exceeded,
261                          'deadline exceeded')
262     NOT_FOUND = (_cygrpc.StatusCode.not_found, 'not found')
263     ALREADY_EXISTS = (_cygrpc.StatusCode.already_exists, 'already exists')
264     PERMISSION_DENIED = (_cygrpc.StatusCode.permission_denied,
265                          'permission denied')
266     RESOURCE_EXHAUSTED = (_cygrpc.StatusCode.resource_exhausted,
267                           'resource exhausted')
268     FAILED_PRECONDITION = (_cygrpc.StatusCode.failed_precondition,
269                            'failed precondition')
270     ABORTED = (_cygrpc.StatusCode.aborted, 'aborted')
271     OUT_OF_RANGE = (_cygrpc.StatusCode.out_of_range, 'out of range')
272     UNIMPLEMENTED = (_cygrpc.StatusCode.unimplemented, 'unimplemented')
273     INTERNAL = (_cygrpc.StatusCode.internal, 'internal')
274     UNAVAILABLE = (_cygrpc.StatusCode.unavailable, 'unavailable')
275     DATA_LOSS = (_cygrpc.StatusCode.data_loss, 'data loss')
276     UNAUTHENTICATED = (_cygrpc.StatusCode.unauthenticated, 'unauthenticated')
277
278
279 #############################  gRPC Status  ################################
280
281
282 class Status(six.with_metaclass(abc.ABCMeta)):
283     """Describes the status of an RPC.
284
285     This is an EXPERIMENTAL API.
286
287     Attributes:
288       code: A StatusCode object to be sent to the client.
289       details: A UTF-8-encodable string to be sent to the client upon
290         termination of the RPC.
291       trailing_metadata: The trailing :term:`metadata` in the RPC.
292     """
293
294
295 #############################  gRPC Exceptions  ################################
296
297
298 class RpcError(Exception):
299     """Raised by the gRPC library to indicate non-OK-status RPC termination."""
300
301
302 ##############################  Shared Context  ################################
303
304
305 class RpcContext(six.with_metaclass(abc.ABCMeta)):
306     """Provides RPC-related information and action."""
307
308     @abc.abstractmethod
309     def is_active(self):
310         """Describes whether the RPC is active or has terminated.
311
312         Returns:
313           bool:
314           True if RPC is active, False otherwise.
315         """
316         raise NotImplementedError()
317
318     @abc.abstractmethod
319     def time_remaining(self):
320         """Describes the length of allowed time remaining for the RPC.
321
322         Returns:
323           A nonnegative float indicating the length of allowed time in seconds
324           remaining for the RPC to complete before it is considered to have
325           timed out, or None if no deadline was specified for the RPC.
326         """
327         raise NotImplementedError()
328
329     @abc.abstractmethod
330     def cancel(self):
331         """Cancels the RPC.
332
333         Idempotent and has no effect if the RPC has already terminated.
334         """
335         raise NotImplementedError()
336
337     @abc.abstractmethod
338     def add_callback(self, callback):
339         """Registers a callback to be called on RPC termination.
340
341         Args:
342           callback: A no-parameter callable to be called on RPC termination.
343
344         Returns:
345           True if the callback was added and will be called later; False if
346             the callback was not added and will not be called (because the RPC
347             already terminated or some other reason).
348         """
349         raise NotImplementedError()
350
351
352 #########################  Invocation-Side Context  ############################
353
354
355 class Call(six.with_metaclass(abc.ABCMeta, RpcContext)):
356     """Invocation-side utility object for an RPC."""
357
358     @abc.abstractmethod
359     def initial_metadata(self):
360         """Accesses the initial metadata sent by the server.
361
362         This method blocks until the value is available.
363
364         Returns:
365           The initial :term:`metadata`.
366         """
367         raise NotImplementedError()
368
369     @abc.abstractmethod
370     def trailing_metadata(self):
371         """Accesses the trailing metadata sent by the server.
372
373         This method blocks until the value is available.
374
375         Returns:
376           The trailing :term:`metadata`.
377         """
378         raise NotImplementedError()
379
380     @abc.abstractmethod
381     def code(self):
382         """Accesses the status code sent by the server.
383
384         This method blocks until the value is available.
385
386         Returns:
387           The StatusCode value for the RPC.
388         """
389         raise NotImplementedError()
390
391     @abc.abstractmethod
392     def details(self):
393         """Accesses the details sent by the server.
394
395         This method blocks until the value is available.
396
397         Returns:
398           The details string of the RPC.
399         """
400         raise NotImplementedError()
401
402
403 ##############  Invocation-Side Interceptor Interfaces & Classes  ##############
404
405
406 class ClientCallDetails(six.with_metaclass(abc.ABCMeta)):
407     """Describes an RPC to be invoked.
408
409     This is an EXPERIMENTAL API.
410
411     Attributes:
412       method: The method name of the RPC.
413       timeout: An optional duration of time in seconds to allow for the RPC.
414       metadata: Optional :term:`metadata` to be transmitted to
415         the service-side of the RPC.
416       credentials: An optional CallCredentials for the RPC.
417       wait_for_ready: This is an EXPERIMENTAL argument. An optional flag t
418         enable wait for ready mechanism.
419       compression: An element of grpc.compression, e.g.
420         grpc.compression.Gzip. This is an EXPERIMENTAL option.
421     """
422
423
424 class UnaryUnaryClientInterceptor(six.with_metaclass(abc.ABCMeta)):
425     """Affords intercepting unary-unary invocations.
426
427     This is an EXPERIMENTAL API.
428     """
429
430     @abc.abstractmethod
431     def intercept_unary_unary(self, continuation, client_call_details, request):
432         """Intercepts a unary-unary invocation asynchronously.
433
434         Args:
435           continuation: A function that proceeds with the invocation by
436             executing the next interceptor in chain or invoking the
437             actual RPC on the underlying Channel. It is the interceptor's
438             responsibility to call it if it decides to move the RPC forward.
439             The interceptor can use
440             `response_future = continuation(client_call_details, request)`
441             to continue with the RPC. `continuation` returns an object that is
442             both a Call for the RPC and a Future. In the event of RPC
443             completion, the return Call-Future's result value will be
444             the response message of the RPC. Should the event terminate
445             with non-OK status, the returned Call-Future's exception value
446             will be an RpcError.
447           client_call_details: A ClientCallDetails object describing the
448             outgoing RPC.
449           request: The request value for the RPC.
450
451         Returns:
452             An object that is both a Call for the RPC and a Future.
453             In the event of RPC completion, the return Call-Future's
454             result value will be the response message of the RPC.
455             Should the event terminate with non-OK status, the returned
456             Call-Future's exception value will be an RpcError.
457         """
458         raise NotImplementedError()
459
460
461 class UnaryStreamClientInterceptor(six.with_metaclass(abc.ABCMeta)):
462     """Affords intercepting unary-stream invocations.
463
464     This is an EXPERIMENTAL API.
465     """
466
467     @abc.abstractmethod
468     def intercept_unary_stream(self, continuation, client_call_details,
469                                request):
470         """Intercepts a unary-stream invocation.
471
472         Args:
473           continuation: A function that proceeds with the invocation by
474             executing the next interceptor in chain or invoking the
475             actual RPC on the underlying Channel. It is the interceptor's
476             responsibility to call it if it decides to move the RPC forward.
477             The interceptor can use
478             `response_iterator = continuation(client_call_details, request)`
479             to continue with the RPC. `continuation` returns an object that is
480             both a Call for the RPC and an iterator for response values.
481             Drawing response values from the returned Call-iterator may
482             raise RpcError indicating termination of the RPC with non-OK
483             status.
484           client_call_details: A ClientCallDetails object describing the
485             outgoing RPC.
486           request: The request value for the RPC.
487
488         Returns:
489             An object that is both a Call for the RPC and an iterator of
490             response values. Drawing response values from the returned
491             Call-iterator may raise RpcError indicating termination of
492             the RPC with non-OK status.
493         """
494         raise NotImplementedError()
495
496
497 class StreamUnaryClientInterceptor(six.with_metaclass(abc.ABCMeta)):
498     """Affords intercepting stream-unary invocations.
499
500     This is an EXPERIMENTAL API.
501     """
502
503     @abc.abstractmethod
504     def intercept_stream_unary(self, continuation, client_call_details,
505                                request_iterator):
506         """Intercepts a stream-unary invocation asynchronously.
507
508         Args:
509           continuation: A function that proceeds with the invocation by
510             executing the next interceptor in chain or invoking the
511             actual RPC on the underlying Channel. It is the interceptor's
512             responsibility to call it if it decides to move the RPC forward.
513             The interceptor can use
514             `response_future = continuation(client_call_details, request_iterator)`
515             to continue with the RPC. `continuation` returns an object that is
516             both a Call for the RPC and a Future. In the event of RPC completion,
517             the return Call-Future's result value will be the response message
518             of the RPC. Should the event terminate with non-OK status, the
519             returned Call-Future's exception value will be an RpcError.
520           client_call_details: A ClientCallDetails object describing the
521             outgoing RPC.
522           request_iterator: An iterator that yields request values for the RPC.
523
524         Returns:
525           An object that is both a Call for the RPC and a Future.
526           In the event of RPC completion, the return Call-Future's
527           result value will be the response message of the RPC.
528           Should the event terminate with non-OK status, the returned
529           Call-Future's exception value will be an RpcError.
530         """
531         raise NotImplementedError()
532
533
534 class StreamStreamClientInterceptor(six.with_metaclass(abc.ABCMeta)):
535     """Affords intercepting stream-stream invocations.
536
537     This is an EXPERIMENTAL API.
538     """
539
540     @abc.abstractmethod
541     def intercept_stream_stream(self, continuation, client_call_details,
542                                 request_iterator):
543         """Intercepts a stream-stream invocation.
544
545         Args:
546           continuation: A function that proceeds with the invocation by
547             executing the next interceptor in chain or invoking the
548             actual RPC on the underlying Channel. It is the interceptor's
549             responsibility to call it if it decides to move the RPC forward.
550             The interceptor can use
551             `response_iterator = continuation(client_call_details, request_iterator)`
552             to continue with the RPC. `continuation` returns an object that is
553             both a Call for the RPC and an iterator for response values.
554             Drawing response values from the returned Call-iterator may
555             raise RpcError indicating termination of the RPC with non-OK
556             status.
557           client_call_details: A ClientCallDetails object describing the
558             outgoing RPC.
559           request_iterator: An iterator that yields request values for the RPC.
560
561         Returns:
562           An object that is both a Call for the RPC and an iterator of
563           response values. Drawing response values from the returned
564           Call-iterator may raise RpcError indicating termination of
565           the RPC with non-OK status.
566         """
567         raise NotImplementedError()
568
569
570 ############  Authentication & Authorization Interfaces & Classes  #############
571
572
573 class ChannelCredentials(object):
574     """An encapsulation of the data required to create a secure Channel.
575
576     This class has no supported interface - it exists to define the type of its
577     instances and its instances exist to be passed to other functions. For
578     example, ssl_channel_credentials returns an instance of this class and
579     secure_channel requires an instance of this class.
580     """
581
582     def __init__(self, credentials):
583         self._credentials = credentials
584
585
586 class CallCredentials(object):
587     """An encapsulation of the data required to assert an identity over a call.
588
589     A CallCredentials has to be used with secure Channel, otherwise the
590     metadata will not be transmitted to the server.
591
592     A CallCredentials may be composed with ChannelCredentials to always assert
593     identity for every call over that Channel.
594
595     This class has no supported interface - it exists to define the type of its
596     instances and its instances exist to be passed to other functions.
597     """
598
599     def __init__(self, credentials):
600         self._credentials = credentials
601
602
603 class AuthMetadataContext(six.with_metaclass(abc.ABCMeta)):
604     """Provides information to call credentials metadata plugins.
605
606     Attributes:
607       service_url: A string URL of the service being called into.
608       method_name: A string of the fully qualified method name being called.
609     """
610
611
612 class AuthMetadataPluginCallback(six.with_metaclass(abc.ABCMeta)):
613     """Callback object received by a metadata plugin."""
614
615     def __call__(self, metadata, error):
616         """Passes to the gRPC runtime authentication metadata for an RPC.
617
618         Args:
619           metadata: The :term:`metadata` used to construct the CallCredentials.
620           error: An Exception to indicate error or None to indicate success.
621         """
622         raise NotImplementedError()
623
624
625 class AuthMetadataPlugin(six.with_metaclass(abc.ABCMeta)):
626     """A specification for custom authentication."""
627
628     def __call__(self, context, callback):
629         """Implements authentication by passing metadata to a callback.
630
631         Implementations of this method must not block.
632
633         Args:
634           context: An AuthMetadataContext providing information on the RPC that
635             the plugin is being called to authenticate.
636           callback: An AuthMetadataPluginCallback to be invoked either
637             synchronously or asynchronously.
638         """
639         raise NotImplementedError()
640
641
642 class ServerCredentials(object):
643     """An encapsulation of the data required to open a secure port on a Server.
644
645     This class has no supported interface - it exists to define the type of its
646     instances and its instances exist to be passed to other functions.
647     """
648
649     def __init__(self, credentials):
650         self._credentials = credentials
651
652
653 class ServerCertificateConfiguration(object):
654     """A certificate configuration for use with an SSL-enabled Server.
655
656     Instances of this class can be returned in the certificate configuration
657     fetching callback.
658
659     This class has no supported interface -- it exists to define the
660     type of its instances and its instances exist to be passed to
661     other functions.
662     """
663
664     def __init__(self, certificate_configuration):
665         self._certificate_configuration = certificate_configuration
666
667
668 ########################  Multi-Callable Interfaces  ###########################
669
670
671 class UnaryUnaryMultiCallable(six.with_metaclass(abc.ABCMeta)):
672     """Affords invoking a unary-unary RPC from client-side."""
673
674     @abc.abstractmethod
675     def __call__(self,
676                  request,
677                  timeout=None,
678                  metadata=None,
679                  credentials=None,
680                  wait_for_ready=None,
681                  compression=None):
682         """Synchronously invokes the underlying RPC.
683
684         Args:
685           request: The request value for the RPC.
686           timeout: An optional duration of time in seconds to allow
687             for the RPC.
688           metadata: Optional :term:`metadata` to be transmitted to the
689             service-side of the RPC.
690           credentials: An optional CallCredentials for the RPC. Only valid for
691             secure Channel.
692           wait_for_ready: This is an EXPERIMENTAL argument. An optional
693             flag to enable wait for ready mechanism
694           compression: An element of grpc.compression, e.g.
695             grpc.compression.Gzip. This is an EXPERIMENTAL option.
696
697         Returns:
698           The response value for the RPC.
699
700         Raises:
701           RpcError: Indicating that the RPC terminated with non-OK status. The
702             raised RpcError will also be a Call for the RPC affording the RPC's
703             metadata, status code, and details.
704         """
705         raise NotImplementedError()
706
707     @abc.abstractmethod
708     def with_call(self,
709                   request,
710                   timeout=None,
711                   metadata=None,
712                   credentials=None,
713                   wait_for_ready=None,
714                   compression=None):
715         """Synchronously invokes the underlying RPC.
716
717         Args:
718           request: The request value for the RPC.
719           timeout: An optional durating of time in seconds to allow for
720             the RPC.
721           metadata: Optional :term:`metadata` to be transmitted to the
722             service-side of the RPC.
723           credentials: An optional CallCredentials for the RPC. Only valid for
724             secure Channel.
725           wait_for_ready: This is an EXPERIMENTAL argument. An optional
726             flag to enable wait for ready mechanism
727           compression: An element of grpc.compression, e.g.
728             grpc.compression.Gzip. This is an EXPERIMENTAL option.
729
730         Returns:
731           The response value for the RPC and a Call value for the RPC.
732
733         Raises:
734           RpcError: Indicating that the RPC terminated with non-OK status. The
735             raised RpcError will also be a Call for the RPC affording the RPC's
736             metadata, status code, and details.
737         """
738         raise NotImplementedError()
739
740     @abc.abstractmethod
741     def future(self,
742                request,
743                timeout=None,
744                metadata=None,
745                credentials=None,
746                wait_for_ready=None,
747                compression=None):
748         """Asynchronously invokes the underlying RPC.
749
750         Args:
751           request: The request value for the RPC.
752           timeout: An optional duration of time in seconds to allow for
753             the RPC.
754           metadata: Optional :term:`metadata` to be transmitted to the
755             service-side of the RPC.
756           credentials: An optional CallCredentials for the RPC. Only valid for
757             secure Channel.
758           wait_for_ready: This is an EXPERIMENTAL argument. An optional
759             flag to enable wait for ready mechanism
760           compression: An element of grpc.compression, e.g.
761             grpc.compression.Gzip. This is an EXPERIMENTAL option.
762
763         Returns:
764             An object that is both a Call for the RPC and a Future.
765             In the event of RPC completion, the return Call-Future's result
766             value will be the response message of the RPC.
767             Should the event terminate with non-OK status,
768             the returned Call-Future's exception value will be an RpcError.
769         """
770         raise NotImplementedError()
771
772
773 class UnaryStreamMultiCallable(six.with_metaclass(abc.ABCMeta)):
774     """Affords invoking a unary-stream RPC from client-side."""
775
776     @abc.abstractmethod
777     def __call__(self,
778                  request,
779                  timeout=None,
780                  metadata=None,
781                  credentials=None,
782                  wait_for_ready=None,
783                  compression=None):
784         """Invokes the underlying RPC.
785
786         Args:
787           request: The request value for the RPC.
788           timeout: An optional duration of time in seconds to allow for
789             the RPC. If None, the timeout is considered infinite.
790           metadata: An optional :term:`metadata` to be transmitted to the
791             service-side of the RPC.
792           credentials: An optional CallCredentials for the RPC. Only valid for
793             secure Channel.
794           wait_for_ready: This is an EXPERIMENTAL argument. An optional
795             flag to enable wait for ready mechanism
796           compression: An element of grpc.compression, e.g.
797             grpc.compression.Gzip. This is an EXPERIMENTAL option.
798
799         Returns:
800             An object that is both a Call for the RPC and an iterator of
801             response values. Drawing response values from the returned
802             Call-iterator may raise RpcError indicating termination of the
803             RPC with non-OK status.
804         """
805         raise NotImplementedError()
806
807
808 class StreamUnaryMultiCallable(six.with_metaclass(abc.ABCMeta)):
809     """Affords invoking a stream-unary RPC from client-side."""
810
811     @abc.abstractmethod
812     def __call__(self,
813                  request_iterator,
814                  timeout=None,
815                  metadata=None,
816                  credentials=None,
817                  wait_for_ready=None,
818                  compression=None):
819         """Synchronously invokes the underlying RPC.
820
821         Args:
822           request_iterator: An iterator that yields request values for
823             the RPC.
824           timeout: An optional duration of time in seconds to allow for
825             the RPC. If None, the timeout is considered infinite.
826           metadata: Optional :term:`metadata` to be transmitted to the
827             service-side of the RPC.
828           credentials: An optional CallCredentials for the RPC. Only valid for
829             secure Channel.
830           wait_for_ready: This is an EXPERIMENTAL argument. An optional
831             flag to enable wait for ready mechanism
832           compression: An element of grpc.compression, e.g.
833             grpc.compression.Gzip. This is an EXPERIMENTAL option.
834
835         Returns:
836           The response value for the RPC.
837
838         Raises:
839           RpcError: Indicating that the RPC terminated with non-OK status. The
840             raised RpcError will also implement grpc.Call, affording methods
841             such as metadata, code, and details.
842         """
843         raise NotImplementedError()
844
845     @abc.abstractmethod
846     def with_call(self,
847                   request_iterator,
848                   timeout=None,
849                   metadata=None,
850                   credentials=None,
851                   wait_for_ready=None,
852                   compression=None):
853         """Synchronously invokes the underlying RPC on the client.
854
855         Args:
856           request_iterator: An iterator that yields request values for
857             the RPC.
858           timeout: An optional duration of time in seconds to allow for
859             the RPC. If None, the timeout is considered infinite.
860           metadata: Optional :term:`metadata` to be transmitted to the
861             service-side of the RPC.
862           credentials: An optional CallCredentials for the RPC. Only valid for
863             secure Channel.
864           wait_for_ready: This is an EXPERIMENTAL argument. An optional
865             flag to enable wait for ready mechanism
866           compression: An element of grpc.compression, e.g.
867             grpc.compression.Gzip. This is an EXPERIMENTAL option.
868
869         Returns:
870           The response value for the RPC and a Call object for the RPC.
871
872         Raises:
873           RpcError: Indicating that the RPC terminated with non-OK status. The
874             raised RpcError will also be a Call for the RPC affording the RPC's
875             metadata, status code, and details.
876         """
877         raise NotImplementedError()
878
879     @abc.abstractmethod
880     def future(self,
881                request_iterator,
882                timeout=None,
883                metadata=None,
884                credentials=None,
885                wait_for_ready=None,
886                compression=None):
887         """Asynchronously invokes the underlying RPC on the client.
888
889         Args:
890           request_iterator: An iterator that yields request values for the RPC.
891           timeout: An optional duration of time in seconds to allow for
892             the RPC. If None, the timeout is considered infinite.
893           metadata: Optional :term:`metadata` to be transmitted to the
894             service-side of the RPC.
895           credentials: An optional CallCredentials for the RPC. Only valid for
896             secure Channel.
897           wait_for_ready: This is an EXPERIMENTAL argument. An optional
898             flag to enable wait for ready mechanism
899           compression: An element of grpc.compression, e.g.
900             grpc.compression.Gzip. This is an EXPERIMENTAL option.
901
902         Returns:
903             An object that is both a Call for the RPC and a Future.
904             In the event of RPC completion, the return Call-Future's result value
905             will be the response message of the RPC. Should the event terminate
906             with non-OK status, the returned Call-Future's exception value will
907             be an RpcError.
908         """
909         raise NotImplementedError()
910
911
912 class StreamStreamMultiCallable(six.with_metaclass(abc.ABCMeta)):
913     """Affords invoking a stream-stream RPC on client-side."""
914
915     @abc.abstractmethod
916     def __call__(self,
917                  request_iterator,
918                  timeout=None,
919                  metadata=None,
920                  credentials=None,
921                  wait_for_ready=None,
922                  compression=None):
923         """Invokes the underlying RPC on the client.
924
925         Args:
926           request_iterator: An iterator that yields request values for the RPC.
927           timeout: An optional duration of time in seconds to allow for
928             the RPC. If not specified, the timeout is considered infinite.
929           metadata: Optional :term:`metadata` to be transmitted to the
930             service-side of the RPC.
931           credentials: An optional CallCredentials for the RPC. Only valid for
932             secure Channel.
933           wait_for_ready: This is an EXPERIMENTAL argument. An optional
934             flag to enable wait for ready mechanism
935           compression: An element of grpc.compression, e.g.
936             grpc.compression.Gzip. This is an EXPERIMENTAL option.
937
938         Returns:
939             An object that is both a Call for the RPC and an iterator of
940             response values. Drawing response values from the returned
941             Call-iterator may raise RpcError indicating termination of the
942             RPC with non-OK status.
943         """
944         raise NotImplementedError()
945
946
947 #############################  Channel Interface  ##############################
948
949
950 class Channel(six.with_metaclass(abc.ABCMeta)):
951     """Affords RPC invocation via generic methods on client-side.
952
953     Channel objects implement the Context Manager type, although they need not
954     support being entered and exited multiple times.
955     """
956
957     @abc.abstractmethod
958     def subscribe(self, callback, try_to_connect=False):
959         """Subscribe to this Channel's connectivity state machine.
960
961         A Channel may be in any of the states described by ChannelConnectivity.
962         This method allows application to monitor the state transitions.
963         The typical use case is to debug or gain better visibility into gRPC
964         runtime's state.
965
966         Args:
967           callback: A callable to be invoked with ChannelConnectivity argument.
968             ChannelConnectivity describes current state of the channel.
969             The callable will be invoked immediately upon subscription
970             and again for every change to ChannelConnectivity until it
971             is unsubscribed or this Channel object goes out of scope.
972           try_to_connect: A boolean indicating whether or not this Channel
973             should attempt to connect immediately. If set to False, gRPC
974             runtime decides when to connect.
975         """
976         raise NotImplementedError()
977
978     @abc.abstractmethod
979     def unsubscribe(self, callback):
980         """Unsubscribes a subscribed callback from this Channel's connectivity.
981
982         Args:
983           callback: A callable previously registered with this Channel from
984           having been passed to its "subscribe" method.
985         """
986         raise NotImplementedError()
987
988     @abc.abstractmethod
989     def unary_unary(self,
990                     method,
991                     request_serializer=None,
992                     response_deserializer=None):
993         """Creates a UnaryUnaryMultiCallable for a unary-unary method.
994
995         Args:
996           method: The name of the RPC method.
997           request_serializer: Optional behaviour for serializing the request
998             message. Request goes unserialized in case None is passed.
999           response_deserializer: Optional behaviour for deserializing the
1000             response message. Response goes undeserialized in case None
1001             is passed.
1002
1003         Returns:
1004           A UnaryUnaryMultiCallable value for the named unary-unary method.
1005         """
1006         raise NotImplementedError()
1007
1008     @abc.abstractmethod
1009     def unary_stream(self,
1010                      method,
1011                      request_serializer=None,
1012                      response_deserializer=None):
1013         """Creates a UnaryStreamMultiCallable for a unary-stream method.
1014
1015         Args:
1016           method: The name of the RPC method.
1017           request_serializer: Optional behaviour for serializing the request
1018             message. Request goes unserialized in case None is passed.
1019           response_deserializer: Optional behaviour for deserializing the
1020             response message. Response goes undeserialized in case None is
1021             passed.
1022
1023         Returns:
1024           A UnaryStreamMultiCallable value for the name unary-stream method.
1025         """
1026         raise NotImplementedError()
1027
1028     @abc.abstractmethod
1029     def stream_unary(self,
1030                      method,
1031                      request_serializer=None,
1032                      response_deserializer=None):
1033         """Creates a StreamUnaryMultiCallable for a stream-unary method.
1034
1035         Args:
1036           method: The name of the RPC method.
1037           request_serializer: Optional behaviour for serializing the request
1038             message. Request goes unserialized in case None is passed.
1039           response_deserializer: Optional behaviour for deserializing the
1040             response message. Response goes undeserialized in case None is
1041             passed.
1042
1043         Returns:
1044           A StreamUnaryMultiCallable value for the named stream-unary method.
1045         """
1046         raise NotImplementedError()
1047
1048     @abc.abstractmethod
1049     def stream_stream(self,
1050                       method,
1051                       request_serializer=None,
1052                       response_deserializer=None):
1053         """Creates a StreamStreamMultiCallable for a stream-stream method.
1054
1055         Args:
1056           method: The name of the RPC method.
1057           request_serializer: Optional behaviour for serializing the request
1058             message. Request goes unserialized in case None is passed.
1059           response_deserializer: Optional behaviour for deserializing the
1060             response message. Response goes undeserialized in case None
1061             is passed.
1062
1063         Returns:
1064           A StreamStreamMultiCallable value for the named stream-stream method.
1065         """
1066         raise NotImplementedError()
1067
1068     @abc.abstractmethod
1069     def close(self):
1070         """Closes this Channel and releases all resources held by it.
1071
1072         Closing the Channel will immediately terminate all RPCs active with the
1073         Channel and it is not valid to invoke new RPCs with the Channel.
1074
1075         This method is idempotent.
1076         """
1077         raise NotImplementedError()
1078
1079
1080 ##########################  Service-Side Context  ##############################
1081
1082
1083 class ServicerContext(six.with_metaclass(abc.ABCMeta, RpcContext)):
1084     """A context object passed to method implementations."""
1085
1086     @abc.abstractmethod
1087     def invocation_metadata(self):
1088         """Accesses the metadata from the sent by the client.
1089
1090         Returns:
1091           The invocation :term:`metadata`.
1092         """
1093         raise NotImplementedError()
1094
1095     @abc.abstractmethod
1096     def peer(self):
1097         """Identifies the peer that invoked the RPC being serviced.
1098
1099         Returns:
1100           A string identifying the peer that invoked the RPC being serviced.
1101           The string format is determined by gRPC runtime.
1102         """
1103         raise NotImplementedError()
1104
1105     @abc.abstractmethod
1106     def peer_identities(self):
1107         """Gets one or more peer identity(s).
1108
1109         Equivalent to
1110         servicer_context.auth_context().get(servicer_context.peer_identity_key())
1111
1112         Returns:
1113           An iterable of the identities, or None if the call is not
1114           authenticated. Each identity is returned as a raw bytes type.
1115         """
1116         raise NotImplementedError()
1117
1118     @abc.abstractmethod
1119     def peer_identity_key(self):
1120         """The auth property used to identify the peer.
1121
1122         For example, "x509_common_name" or "x509_subject_alternative_name" are
1123         used to identify an SSL peer.
1124
1125         Returns:
1126           The auth property (string) that indicates the
1127           peer identity, or None if the call is not authenticated.
1128         """
1129         raise NotImplementedError()
1130
1131     @abc.abstractmethod
1132     def auth_context(self):
1133         """Gets the auth context for the call.
1134
1135         Returns:
1136           A map of strings to an iterable of bytes for each auth property.
1137         """
1138         raise NotImplementedError()
1139
1140     def set_compression(self, compression):
1141         """Set the compression algorithm to be used for the entire call.
1142
1143         This is an EXPERIMENTAL method.
1144
1145         Args:
1146           compression: An element of grpc.compression, e.g.
1147             grpc.compression.Gzip.
1148         """
1149         raise NotImplementedError()
1150
1151     @abc.abstractmethod
1152     def send_initial_metadata(self, initial_metadata):
1153         """Sends the initial metadata value to the client.
1154
1155         This method need not be called by implementations if they have no
1156         metadata to add to what the gRPC runtime will transmit.
1157
1158         Args:
1159           initial_metadata: The initial :term:`metadata`.
1160         """
1161         raise NotImplementedError()
1162
1163     @abc.abstractmethod
1164     def set_trailing_metadata(self, trailing_metadata):
1165         """Sends the trailing metadata for the RPC.
1166
1167         This method need not be called by implementations if they have no
1168         metadata to add to what the gRPC runtime will transmit.
1169
1170         Args:
1171           trailing_metadata: The trailing :term:`metadata`.
1172         """
1173         raise NotImplementedError()
1174
1175     @abc.abstractmethod
1176     def abort(self, code, details):
1177         """Raises an exception to terminate the RPC with a non-OK status.
1178
1179         The code and details passed as arguments will supercede any existing
1180         ones.
1181
1182         Args:
1183           code: A StatusCode object to be sent to the client.
1184             It must not be StatusCode.OK.
1185           details: A UTF-8-encodable string to be sent to the client upon
1186             termination of the RPC.
1187
1188         Raises:
1189           Exception: An exception is always raised to signal the abortion the
1190             RPC to the gRPC runtime.
1191         """
1192         raise NotImplementedError()
1193
1194     @abc.abstractmethod
1195     def abort_with_status(self, status):
1196         """Raises an exception to terminate the RPC with a non-OK status.
1197
1198         The status passed as argument will supercede any existing status code,
1199         status message and trailing metadata.
1200
1201         This is an EXPERIMENTAL API.
1202
1203         Args:
1204           status: A grpc.Status object. The status code in it must not be
1205             StatusCode.OK.
1206
1207         Raises:
1208           Exception: An exception is always raised to signal the abortion the
1209             RPC to the gRPC runtime.
1210         """
1211         raise NotImplementedError()
1212
1213     @abc.abstractmethod
1214     def set_code(self, code):
1215         """Sets the value to be used as status code upon RPC completion.
1216
1217         This method need not be called by method implementations if they wish
1218         the gRPC runtime to determine the status code of the RPC.
1219
1220         Args:
1221           code: A StatusCode object to be sent to the client.
1222         """
1223         raise NotImplementedError()
1224
1225     @abc.abstractmethod
1226     def set_details(self, details):
1227         """Sets the value to be used as detail string upon RPC completion.
1228
1229         This method need not be called by method implementations if they have
1230         no details to transmit.
1231
1232         Args:
1233           details: A UTF-8-encodable string to be sent to the client upon
1234             termination of the RPC.
1235         """
1236         raise NotImplementedError()
1237
1238     def disable_next_message_compression(self):
1239         """Disables compression for the next response message.
1240
1241         This is an EXPERIMENTAL method.
1242
1243         This method will override any compression configuration set during
1244         server creation or set on the call.
1245         """
1246         raise NotImplementedError()
1247
1248
1249 #####################  Service-Side Handler Interfaces  ########################
1250
1251
1252 class RpcMethodHandler(six.with_metaclass(abc.ABCMeta)):
1253     """An implementation of a single RPC method.
1254
1255     Attributes:
1256       request_streaming: Whether the RPC supports exactly one request message
1257         or any arbitrary number of request messages.
1258       response_streaming: Whether the RPC supports exactly one response message
1259         or any arbitrary number of response messages.
1260       request_deserializer: A callable behavior that accepts a byte string and
1261         returns an object suitable to be passed to this object's business
1262         logic, or None to indicate that this object's business logic should be
1263         passed the raw request bytes.
1264       response_serializer: A callable behavior that accepts an object produced
1265         by this object's business logic and returns a byte string, or None to
1266         indicate that the byte strings produced by this object's business logic
1267         should be transmitted on the wire as they are.
1268       unary_unary: This object's application-specific business logic as a
1269         callable value that takes a request value and a ServicerContext object
1270         and returns a response value. Only non-None if both request_streaming
1271         and response_streaming are False.
1272       unary_stream: This object's application-specific business logic as a
1273         callable value that takes a request value and a ServicerContext object
1274         and returns an iterator of response values. Only non-None if
1275         request_streaming is False and response_streaming is True.
1276       stream_unary: This object's application-specific business logic as a
1277         callable value that takes an iterator of request values and a
1278         ServicerContext object and returns a response value. Only non-None if
1279         request_streaming is True and response_streaming is False.
1280       stream_stream: This object's application-specific business logic as a
1281         callable value that takes an iterator of request values and a
1282         ServicerContext object and returns an iterator of response values.
1283         Only non-None if request_streaming and response_streaming are both
1284         True.
1285     """
1286
1287
1288 class HandlerCallDetails(six.with_metaclass(abc.ABCMeta)):
1289     """Describes an RPC that has just arrived for service.
1290
1291     Attributes:
1292       method: The method name of the RPC.
1293       invocation_metadata: The :term:`metadata` sent by the client.
1294     """
1295
1296
1297 class GenericRpcHandler(six.with_metaclass(abc.ABCMeta)):
1298     """An implementation of arbitrarily many RPC methods."""
1299
1300     @abc.abstractmethod
1301     def service(self, handler_call_details):
1302         """Returns the handler for servicing the RPC.
1303
1304         Args:
1305           handler_call_details: A HandlerCallDetails describing the RPC.
1306
1307         Returns:
1308           An RpcMethodHandler with which the RPC may be serviced if the
1309           implementation chooses to service this RPC, or None otherwise.
1310         """
1311         raise NotImplementedError()
1312
1313
1314 class ServiceRpcHandler(six.with_metaclass(abc.ABCMeta, GenericRpcHandler)):
1315     """An implementation of RPC methods belonging to a service.
1316
1317     A service handles RPC methods with structured names of the form
1318     '/Service.Name/Service.Method', where 'Service.Name' is the value
1319     returned by service_name(), and 'Service.Method' is the method
1320     name.  A service can have multiple method names, but only a single
1321     service name.
1322     """
1323
1324     @abc.abstractmethod
1325     def service_name(self):
1326         """Returns this service's name.
1327
1328         Returns:
1329           The service name.
1330         """
1331         raise NotImplementedError()
1332
1333
1334 ####################  Service-Side Interceptor Interfaces  #####################
1335
1336
1337 class ServerInterceptor(six.with_metaclass(abc.ABCMeta)):
1338     """Affords intercepting incoming RPCs on the service-side.
1339
1340     This is an EXPERIMENTAL API.
1341     """
1342
1343     @abc.abstractmethod
1344     def intercept_service(self, continuation, handler_call_details):
1345         """Intercepts incoming RPCs before handing them over to a handler.
1346
1347         Args:
1348           continuation: A function that takes a HandlerCallDetails and
1349             proceeds to invoke the next interceptor in the chain, if any,
1350             or the RPC handler lookup logic, with the call details passed
1351             as an argument, and returns an RpcMethodHandler instance if
1352             the RPC is considered serviced, or None otherwise.
1353           handler_call_details: A HandlerCallDetails describing the RPC.
1354
1355         Returns:
1356           An RpcMethodHandler with which the RPC may be serviced if the
1357           interceptor chooses to service this RPC, or None otherwise.
1358         """
1359         raise NotImplementedError()
1360
1361
1362 #############################  Server Interface  ###############################
1363
1364
1365 class Server(six.with_metaclass(abc.ABCMeta)):
1366     """Services RPCs."""
1367
1368     @abc.abstractmethod
1369     def add_generic_rpc_handlers(self, generic_rpc_handlers):
1370         """Registers GenericRpcHandlers with this Server.
1371
1372         This method is only safe to call before the server is started.
1373
1374         Args:
1375           generic_rpc_handlers: An iterable of GenericRpcHandlers that will be
1376           used to service RPCs.
1377         """
1378         raise NotImplementedError()
1379
1380     @abc.abstractmethod
1381     def add_insecure_port(self, address):
1382         """Opens an insecure port for accepting RPCs.
1383
1384         This method may only be called before starting the server.
1385
1386         Args:
1387           address: The address for which to open a port. If the port is 0,
1388             or not specified in the address, then gRPC runtime will choose a port.
1389
1390         Returns:
1391           An integer port on which server will accept RPC requests.
1392         """
1393         raise NotImplementedError()
1394
1395     @abc.abstractmethod
1396     def add_secure_port(self, address, server_credentials):
1397         """Opens a secure port for accepting RPCs.
1398
1399         This method may only be called before starting the server.
1400
1401         Args:
1402           address: The address for which to open a port.
1403             if the port is 0, or not specified in the address, then gRPC
1404             runtime will choose a port.
1405           server_credentials: A ServerCredentials object.
1406
1407         Returns:
1408           An integer port on which server will accept RPC requests.
1409         """
1410         raise NotImplementedError()
1411
1412     @abc.abstractmethod
1413     def start(self):
1414         """Starts this Server.
1415
1416         This method may only be called once. (i.e. it is not idempotent).
1417         """
1418         raise NotImplementedError()
1419
1420     @abc.abstractmethod
1421     def stop(self, grace):
1422         """Stops this Server.
1423
1424         This method immediately stop service of new RPCs in all cases.
1425
1426         If a grace period is specified, this method returns immediately
1427         and all RPCs active at the end of the grace period are aborted.
1428         If a grace period is not specified (by passing None for `grace`),
1429         all existing RPCs are aborted immediately and this method
1430         blocks until the last RPC handler terminates.
1431
1432         This method is idempotent and may be called at any time.
1433         Passing a smaller grace value in a subsequent call will have
1434         the effect of stopping the Server sooner (passing None will
1435         have the effect of stopping the server immediately). Passing
1436         a larger grace value in a subsequent call *will not* have the
1437         effect of stopping the server later (i.e. the most restrictive
1438         grace value is used).
1439
1440         Args:
1441           grace: A duration of time in seconds or None.
1442
1443         Returns:
1444           A threading.Event that will be set when this Server has completely
1445           stopped, i.e. when running RPCs either complete or are aborted and
1446           all handlers have terminated.
1447         """
1448         raise NotImplementedError()
1449
1450     def wait_for_termination(self, timeout=None):
1451         """Block current thread until the server stops.
1452
1453         This is an EXPERIMENTAL API.
1454
1455         The wait will not consume computational resources during blocking, and
1456         it will block until one of the two following conditions are met:
1457
1458         1) The server is stopped or terminated;
1459         2) A timeout occurs if timeout is not `None`.
1460
1461         The timeout argument works in the same way as `threading.Event.wait()`.
1462         https://docs.python.org/3/library/threading.html#threading.Event.wait
1463
1464         Args:
1465           timeout: A floating point number specifying a timeout for the
1466             operation in seconds.
1467
1468         Returns:
1469           A bool indicates if the operation times out.
1470         """
1471         raise NotImplementedError()
1472
1473
1474 #################################  Functions    ################################
1475
1476
1477 def unary_unary_rpc_method_handler(behavior,
1478                                    request_deserializer=None,
1479                                    response_serializer=None):
1480     """Creates an RpcMethodHandler for a unary-unary RPC method.
1481
1482     Args:
1483       behavior: The implementation of an RPC that accepts one request
1484         and returns one response.
1485       request_deserializer: An optional behavior for request deserialization.
1486       response_serializer: An optional behavior for response serialization.
1487
1488     Returns:
1489       An RpcMethodHandler object that is typically used by grpc.Server.
1490     """
1491     from grpc import _utilities  # pylint: disable=cyclic-import
1492     return _utilities.RpcMethodHandler(False, False, request_deserializer,
1493                                        response_serializer, behavior, None,
1494                                        None, None)
1495
1496
1497 def unary_stream_rpc_method_handler(behavior,
1498                                     request_deserializer=None,
1499                                     response_serializer=None):
1500     """Creates an RpcMethodHandler for a unary-stream RPC method.
1501
1502     Args:
1503       behavior: The implementation of an RPC that accepts one request
1504         and returns an iterator of response values.
1505       request_deserializer: An optional behavior for request deserialization.
1506       response_serializer: An optional behavior for response serialization.
1507
1508     Returns:
1509       An RpcMethodHandler object that is typically used by grpc.Server.
1510     """
1511     from grpc import _utilities  # pylint: disable=cyclic-import
1512     return _utilities.RpcMethodHandler(False, True, request_deserializer,
1513                                        response_serializer, None, behavior,
1514                                        None, None)
1515
1516
1517 def stream_unary_rpc_method_handler(behavior,
1518                                     request_deserializer=None,
1519                                     response_serializer=None):
1520     """Creates an RpcMethodHandler for a stream-unary RPC method.
1521
1522     Args:
1523       behavior: The implementation of an RPC that accepts an iterator of
1524         request values and returns a single response value.
1525       request_deserializer: An optional behavior for request deserialization.
1526       response_serializer: An optional behavior for response serialization.
1527
1528     Returns:
1529       An RpcMethodHandler object that is typically used by grpc.Server.
1530     """
1531     from grpc import _utilities  # pylint: disable=cyclic-import
1532     return _utilities.RpcMethodHandler(True, False, request_deserializer,
1533                                        response_serializer, None, None,
1534                                        behavior, None)
1535
1536
1537 def stream_stream_rpc_method_handler(behavior,
1538                                      request_deserializer=None,
1539                                      response_serializer=None):
1540     """Creates an RpcMethodHandler for a stream-stream RPC method.
1541
1542     Args:
1543       behavior: The implementation of an RPC that accepts an iterator of
1544         request values and returns an iterator of response values.
1545       request_deserializer: An optional behavior for request deserialization.
1546       response_serializer: An optional behavior for response serialization.
1547
1548     Returns:
1549       An RpcMethodHandler object that is typically used by grpc.Server.
1550     """
1551     from grpc import _utilities  # pylint: disable=cyclic-import
1552     return _utilities.RpcMethodHandler(True, True, request_deserializer,
1553                                        response_serializer, None, None, None,
1554                                        behavior)
1555
1556
1557 def method_handlers_generic_handler(service, method_handlers):
1558     """Creates a GenericRpcHandler from RpcMethodHandlers.
1559
1560     Args:
1561       service: The name of the service that is implemented by the
1562         method_handlers.
1563       method_handlers: A dictionary that maps method names to corresponding
1564         RpcMethodHandler.
1565
1566     Returns:
1567       A GenericRpcHandler. This is typically added to the grpc.Server object
1568       with add_generic_rpc_handlers() before starting the server.
1569     """
1570     from grpc import _utilities  # pylint: disable=cyclic-import
1571     return _utilities.DictionaryGenericHandler(service, method_handlers)
1572
1573
1574 def ssl_channel_credentials(root_certificates=None,
1575                             private_key=None,
1576                             certificate_chain=None):
1577     """Creates a ChannelCredentials for use with an SSL-enabled Channel.
1578
1579     Args:
1580       root_certificates: The PEM-encoded root certificates as a byte string,
1581         or None to retrieve them from a default location chosen by gRPC
1582         runtime.
1583       private_key: The PEM-encoded private key as a byte string, or None if no
1584         private key should be used.
1585       certificate_chain: The PEM-encoded certificate chain as a byte string
1586         to use or or None if no certificate chain should be used.
1587
1588     Returns:
1589       A ChannelCredentials for use with an SSL-enabled Channel.
1590     """
1591     return ChannelCredentials(
1592         _cygrpc.SSLChannelCredentials(root_certificates, private_key,
1593                                       certificate_chain))
1594
1595
1596 def metadata_call_credentials(metadata_plugin, name=None):
1597     """Construct CallCredentials from an AuthMetadataPlugin.
1598
1599     Args:
1600       metadata_plugin: An AuthMetadataPlugin to use for authentication.
1601       name: An optional name for the plugin.
1602
1603     Returns:
1604       A CallCredentials.
1605     """
1606     from grpc import _plugin_wrapping  # pylint: disable=cyclic-import
1607     return _plugin_wrapping.metadata_plugin_call_credentials(
1608         metadata_plugin, name)
1609
1610
1611 def access_token_call_credentials(access_token):
1612     """Construct CallCredentials from an access token.
1613
1614     Args:
1615       access_token: A string to place directly in the http request
1616         authorization header, for example
1617         "authorization: Bearer <access_token>".
1618
1619     Returns:
1620       A CallCredentials.
1621     """
1622     from grpc import _auth  # pylint: disable=cyclic-import
1623     from grpc import _plugin_wrapping  # pylint: disable=cyclic-import
1624     return _plugin_wrapping.metadata_plugin_call_credentials(
1625         _auth.AccessTokenAuthMetadataPlugin(access_token), None)
1626
1627
1628 def composite_call_credentials(*call_credentials):
1629     """Compose multiple CallCredentials to make a new CallCredentials.
1630
1631     Args:
1632       *call_credentials: At least two CallCredentials objects.
1633
1634     Returns:
1635       A CallCredentials object composed of the given CallCredentials objects.
1636     """
1637     return CallCredentials(
1638         _cygrpc.CompositeCallCredentials(
1639             tuple(single_call_credentials._credentials
1640                   for single_call_credentials in call_credentials)))
1641
1642
1643 def composite_channel_credentials(channel_credentials, *call_credentials):
1644     """Compose a ChannelCredentials and one or more CallCredentials objects.
1645
1646     Args:
1647       channel_credentials: A ChannelCredentials object.
1648       *call_credentials: One or more CallCredentials objects.
1649
1650     Returns:
1651       A ChannelCredentials composed of the given ChannelCredentials and
1652         CallCredentials objects.
1653     """
1654     return ChannelCredentials(
1655         _cygrpc.CompositeChannelCredentials(
1656             tuple(single_call_credentials._credentials
1657                   for single_call_credentials in call_credentials),
1658             channel_credentials._credentials))
1659
1660
1661 def ssl_server_credentials(private_key_certificate_chain_pairs,
1662                            root_certificates=None,
1663                            require_client_auth=False):
1664     """Creates a ServerCredentials for use with an SSL-enabled Server.
1665
1666     Args:
1667       private_key_certificate_chain_pairs: A list of pairs of the form
1668         [PEM-encoded private key, PEM-encoded certificate chain].
1669       root_certificates: An optional byte string of PEM-encoded client root
1670         certificates that the server will use to verify client authentication.
1671         If omitted, require_client_auth must also be False.
1672       require_client_auth: A boolean indicating whether or not to require
1673         clients to be authenticated. May only be True if root_certificates
1674         is not None.
1675
1676     Returns:
1677       A ServerCredentials for use with an SSL-enabled Server. Typically, this
1678       object is an argument to add_secure_port() method during server setup.
1679     """
1680     if not private_key_certificate_chain_pairs:
1681         raise ValueError(
1682             'At least one private key-certificate chain pair is required!')
1683     elif require_client_auth and root_certificates is None:
1684         raise ValueError(
1685             'Illegal to require client auth without providing root certificates!'
1686         )
1687     else:
1688         return ServerCredentials(
1689             _cygrpc.server_credentials_ssl(root_certificates, [
1690                 _cygrpc.SslPemKeyCertPair(key, pem)
1691                 for key, pem in private_key_certificate_chain_pairs
1692             ], require_client_auth))
1693
1694
1695 def ssl_server_certificate_configuration(private_key_certificate_chain_pairs,
1696                                          root_certificates=None):
1697     """Creates a ServerCertificateConfiguration for use with a Server.
1698
1699     Args:
1700       private_key_certificate_chain_pairs: A collection of pairs of
1701         the form [PEM-encoded private key, PEM-encoded certificate
1702         chain].
1703       root_certificates: An optional byte string of PEM-encoded client root
1704         certificates that the server will use to verify client authentication.
1705
1706     Returns:
1707       A ServerCertificateConfiguration that can be returned in the certificate
1708         configuration fetching callback.
1709     """
1710     if private_key_certificate_chain_pairs:
1711         return ServerCertificateConfiguration(
1712             _cygrpc.server_certificate_config_ssl(root_certificates, [
1713                 _cygrpc.SslPemKeyCertPair(key, pem)
1714                 for key, pem in private_key_certificate_chain_pairs
1715             ]))
1716     else:
1717         raise ValueError(
1718             'At least one private key-certificate chain pair is required!')
1719
1720
1721 def dynamic_ssl_server_credentials(initial_certificate_configuration,
1722                                    certificate_configuration_fetcher,
1723                                    require_client_authentication=False):
1724     """Creates a ServerCredentials for use with an SSL-enabled Server.
1725
1726     Args:
1727       initial_certificate_configuration (ServerCertificateConfiguration): The
1728         certificate configuration with which the server will be initialized.
1729       certificate_configuration_fetcher (callable): A callable that takes no
1730         arguments and should return a ServerCertificateConfiguration to
1731         replace the server's current certificate, or None for no change
1732         (i.e., the server will continue its current certificate
1733         config). The library will call this callback on *every* new
1734         client connection before starting the TLS handshake with the
1735         client, thus allowing the user application to optionally
1736         return a new ServerCertificateConfiguration that the server will then
1737         use for the handshake.
1738       require_client_authentication: A boolean indicating whether or not to
1739         require clients to be authenticated.
1740
1741     Returns:
1742       A ServerCredentials.
1743     """
1744     return ServerCredentials(
1745         _cygrpc.server_credentials_ssl_dynamic_cert_config(
1746             initial_certificate_configuration,
1747             certificate_configuration_fetcher, require_client_authentication))
1748
1749
1750 @enum.unique
1751 class LocalConnectionType(enum.Enum):
1752     """Types of local connection for local credential creation.
1753
1754     Attributes:
1755       UDS: Unix domain socket connections
1756       LOCAL_TCP: Local TCP connections.
1757     """
1758     UDS = _cygrpc.LocalConnectionType.uds
1759     LOCAL_TCP = _cygrpc.LocalConnectionType.local_tcp
1760
1761
1762 def local_channel_credentials(local_connect_type=LocalConnectionType.LOCAL_TCP):
1763     """Creates a local ChannelCredentials used for local connections.
1764
1765     This is an EXPERIMENTAL API.
1766
1767     Local credentials are used by local TCP endpoints (e.g. localhost:10000)
1768     also UDS connections.
1769
1770     The connections created by local channel credentials are not
1771     encrypted, but will be checked if they are local or not.
1772     The UDS connections are considered secure by providing peer authentication
1773     and data confidentiality while TCP connections are considered insecure.
1774
1775     It is allowed to transmit call credentials over connections created by
1776     local channel credentials.
1777
1778     Local channel credentials are useful for 1) eliminating insecure_channel usage;
1779     2) enable unit testing for call credentials without setting up secrets.
1780
1781     Args:
1782       local_connect_type: Local connection type (either
1783         grpc.LocalConnectionType.UDS or grpc.LocalConnectionType.LOCAL_TCP)
1784
1785     Returns:
1786       A ChannelCredentials for use with a local Channel
1787     """
1788     return ChannelCredentials(
1789         _cygrpc.channel_credentials_local(local_connect_type.value))
1790
1791
1792 def local_server_credentials(local_connect_type=LocalConnectionType.LOCAL_TCP):
1793     """Creates a local ServerCredentials used for local connections.
1794
1795     This is an EXPERIMENTAL API.
1796
1797     Local credentials are used by local TCP endpoints (e.g. localhost:10000)
1798     also UDS connections.
1799
1800     The connections created by local server credentials are not
1801     encrypted, but will be checked if they are local or not.
1802     The UDS connections are considered secure by providing peer authentication
1803     and data confidentiality while TCP connections are considered insecure.
1804
1805     It is allowed to transmit call credentials over connections created by local
1806     server credentials.
1807
1808     Local server credentials are useful for 1) eliminating insecure_channel usage;
1809     2) enable unit testing for call credentials without setting up secrets.
1810
1811     Args:
1812       local_connect_type: Local connection type (either
1813         grpc.LocalConnectionType.UDS or grpc.LocalConnectionType.LOCAL_TCP)
1814
1815     Returns:
1816       A ServerCredentials for use with a local Server
1817     """
1818     return ServerCredentials(
1819         _cygrpc.server_credentials_local(local_connect_type.value))
1820
1821
1822 def channel_ready_future(channel):
1823     """Creates a Future that tracks when a Channel is ready.
1824
1825     Cancelling the Future does not affect the channel's state machine.
1826     It merely decouples the Future from channel state machine.
1827
1828     Args:
1829       channel: A Channel object.
1830
1831     Returns:
1832       A Future object that matures when the channel connectivity is
1833       ChannelConnectivity.READY.
1834     """
1835     from grpc import _utilities  # pylint: disable=cyclic-import
1836     return _utilities.channel_ready_future(channel)
1837
1838
1839 def insecure_channel(target, options=None, compression=None):
1840     """Creates an insecure Channel to a server.
1841
1842     The returned Channel is thread-safe.
1843
1844     Args:
1845       target: The server address
1846       options: An optional list of key-value pairs (channel args
1847         in gRPC Core runtime) to configure the channel.
1848       compression: An optional value indicating the compression method to be
1849         used over the lifetime of the channel. This is an EXPERIMENTAL option.
1850
1851     Returns:
1852       A Channel.
1853     """
1854     from grpc import _channel  # pylint: disable=cyclic-import
1855     return _channel.Channel(target, ()
1856                             if options is None else options, None, compression)
1857
1858
1859 def secure_channel(target, credentials, options=None, compression=None):
1860     """Creates a secure Channel to a server.
1861
1862     The returned Channel is thread-safe.
1863
1864     Args:
1865       target: The server address.
1866       credentials: A ChannelCredentials instance.
1867       options: An optional list of key-value pairs (channel args
1868         in gRPC Core runtime) to configure the channel.
1869       compression: An optional value indicating the compression method to be
1870         used over the lifetime of the channel. This is an EXPERIMENTAL option.
1871
1872     Returns:
1873       A Channel.
1874     """
1875     from grpc import _channel  # pylint: disable=cyclic-import
1876     return _channel.Channel(target, () if options is None else options,
1877                             credentials._credentials, compression)
1878
1879
1880 def intercept_channel(channel, *interceptors):
1881     """Intercepts a channel through a set of interceptors.
1882
1883     This is an EXPERIMENTAL API.
1884
1885     Args:
1886       channel: A Channel.
1887       interceptors: Zero or more objects of type
1888         UnaryUnaryClientInterceptor,
1889         UnaryStreamClientInterceptor,
1890         StreamUnaryClientInterceptor, or
1891         StreamStreamClientInterceptor.
1892         Interceptors are given control in the order they are listed.
1893
1894     Returns:
1895       A Channel that intercepts each invocation via the provided interceptors.
1896
1897     Raises:
1898       TypeError: If interceptor does not derive from any of
1899         UnaryUnaryClientInterceptor,
1900         UnaryStreamClientInterceptor,
1901         StreamUnaryClientInterceptor, or
1902         StreamStreamClientInterceptor.
1903     """
1904     from grpc import _interceptor  # pylint: disable=cyclic-import
1905     return _interceptor.intercept_channel(channel, *interceptors)
1906
1907
1908 def server(thread_pool,
1909            handlers=None,
1910            interceptors=None,
1911            options=None,
1912            maximum_concurrent_rpcs=None,
1913            compression=None):
1914     """Creates a Server with which RPCs can be serviced.
1915
1916     Args:
1917       thread_pool: A futures.ThreadPoolExecutor to be used by the Server
1918         to execute RPC handlers.
1919       handlers: An optional list of GenericRpcHandlers used for executing RPCs.
1920         More handlers may be added by calling add_generic_rpc_handlers any time
1921         before the server is started.
1922       interceptors: An optional list of ServerInterceptor objects that observe
1923         and optionally manipulate the incoming RPCs before handing them over to
1924         handlers. The interceptors are given control in the order they are
1925         specified. This is an EXPERIMENTAL API.
1926       options: An optional list of key-value pairs (channel args in gRPC runtime)
1927         to configure the channel.
1928       maximum_concurrent_rpcs: The maximum number of concurrent RPCs this server
1929         will service before returning RESOURCE_EXHAUSTED status, or None to
1930         indicate no limit.
1931       compression: An element of grpc.compression, e.g.
1932         grpc.compression.Gzip. This compression algorithm will be used for the
1933         lifetime of the server unless overridden. This is an EXPERIMENTAL option.
1934
1935     Returns:
1936       A Server object.
1937     """
1938     from grpc import _server  # pylint: disable=cyclic-import
1939     return _server.create_server(thread_pool, ()
1940                                  if handlers is None else handlers, ()
1941                                  if interceptors is None else interceptors, ()
1942                                  if options is None else options,
1943                                  maximum_concurrent_rpcs, compression)
1944
1945
1946 @contextlib.contextmanager
1947 def _create_servicer_context(rpc_event, state, request_deserializer):
1948     from grpc import _server  # pylint: disable=cyclic-import
1949     context = _server._Context(rpc_event, state, request_deserializer)
1950     yield context
1951     context._finalize_state()  # pylint: disable=protected-access
1952
1953
1954 @enum.unique
1955 class Compression(enum.IntEnum):
1956     """Indicates the compression method to be used for an RPC.
1957
1958        This enumeration is part of an EXPERIMENTAL API.
1959
1960        Attributes:
1961         NoCompression: Do not use compression algorithm.
1962         Deflate: Use "Deflate" compression algorithm.
1963         Gzip: Use "Gzip" compression algorithm.
1964     """
1965     NoCompression = _compression.NoCompression
1966     Deflate = _compression.Deflate
1967     Gzip = _compression.Gzip
1968
1969
1970 ###################################  __all__  #################################
1971
1972 __all__ = (
1973     'FutureTimeoutError',
1974     'FutureCancelledError',
1975     'Future',
1976     'ChannelConnectivity',
1977     'StatusCode',
1978     'Status',
1979     'RpcError',
1980     'RpcContext',
1981     'Call',
1982     'ChannelCredentials',
1983     'CallCredentials',
1984     'AuthMetadataContext',
1985     'AuthMetadataPluginCallback',
1986     'AuthMetadataPlugin',
1987     'Compression',
1988     'ClientCallDetails',
1989     'ServerCertificateConfiguration',
1990     'ServerCredentials',
1991     'LocalConnectionType',
1992     'UnaryUnaryMultiCallable',
1993     'UnaryStreamMultiCallable',
1994     'StreamUnaryMultiCallable',
1995     'StreamStreamMultiCallable',
1996     'UnaryUnaryClientInterceptor',
1997     'UnaryStreamClientInterceptor',
1998     'StreamUnaryClientInterceptor',
1999     'StreamStreamClientInterceptor',
2000     'Channel',
2001     'ServicerContext',
2002     'RpcMethodHandler',
2003     'HandlerCallDetails',
2004     'GenericRpcHandler',
2005     'ServiceRpcHandler',
2006     'Server',
2007     'ServerInterceptor',
2008     'unary_unary_rpc_method_handler',
2009     'unary_stream_rpc_method_handler',
2010     'stream_unary_rpc_method_handler',
2011     'stream_stream_rpc_method_handler',
2012     'method_handlers_generic_handler',
2013     'ssl_channel_credentials',
2014     'metadata_call_credentials',
2015     'access_token_call_credentials',
2016     'composite_call_credentials',
2017     'composite_channel_credentials',
2018     'local_channel_credentials',
2019     'local_server_credentials',
2020     'ssl_server_credentials',
2021     'ssl_server_certificate_configuration',
2022     'dynamic_ssl_server_credentials',
2023     'channel_ready_future',
2024     'insecure_channel',
2025     'secure_channel',
2026     'intercept_channel',
2027     'server',
2028 )
2029
2030 ############################### Extension Shims ################################
2031
2032 # Here to maintain backwards compatibility; avoid using these in new code!
2033 try:
2034     import grpc_tools
2035     sys.modules.update({'grpc.tools': grpc_tools})
2036 except ImportError:
2037     pass
2038 try:
2039     import grpc_health
2040     sys.modules.update({'grpc.health': grpc_health})
2041 except ImportError:
2042     pass
2043 try:
2044     import grpc_reflection
2045     sys.modules.update({'grpc.reflection': grpc_reflection})
2046 except ImportError:
2047     pass