Index: third_party/grpc/src/python/grpcio/grpc/framework/interfaces/base/base.py |
diff --git a/third_party/grpc/src/python/grpcio/grpc/framework/interfaces/base/base.py b/third_party/grpc/src/python/grpcio/grpc/framework/interfaces/base/base.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a1e70be5e8d419ecb9c2b63c0c39b458588fee89 |
--- /dev/null |
+++ b/third_party/grpc/src/python/grpcio/grpc/framework/interfaces/base/base.py |
@@ -0,0 +1,339 @@ |
+# Copyright 2015, Google Inc. |
+# All rights reserved. |
+# |
+# Redistribution and use in source and binary forms, with or without |
+# modification, are permitted provided that the following conditions are |
+# met: |
+# |
+# * Redistributions of source code must retain the above copyright |
+# notice, this list of conditions and the following disclaimer. |
+# * Redistributions in binary form must reproduce the above |
+# copyright notice, this list of conditions and the following disclaimer |
+# in the documentation and/or other materials provided with the |
+# distribution. |
+# * Neither the name of Google Inc. nor the names of its |
+# contributors may be used to endorse or promote products derived from |
+# this software without specific prior written permission. |
+# |
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
+ |
+"""The base interface of RPC Framework. |
+ |
+Implementations of this interface support the conduct of "operations": |
+exchanges between two distinct ends of an arbitrary number of data payloads |
+and metadata such as a name for the operation, initial and terminal metadata |
+in each direction, and flow control. These operations may be used for transfers |
+of data, remote procedure calls, status indication, or anything else |
+applications choose. |
+""" |
+ |
+# threading is referenced from specification in this module. |
+import abc |
+import enum |
+import threading # pylint: disable=unused-import |
+ |
+# abandonment is referenced from specification in this module. |
+from grpc.framework.foundation import abandonment # pylint: disable=unused-import |
+ |
+ |
+class NoSuchMethodError(Exception): |
+ """Indicates that an unrecognized operation has been called. |
+ |
+ Attributes: |
+ code: A code value to communicate to the other side of the operation along |
+ with indication of operation termination. May be None. |
+ details: A details value to communicate to the other side of the operation |
+ along with indication of operation termination. May be None. |
+ """ |
+ |
+ def __init__(self, code, details): |
+ """Constructor. |
+ |
+ Args: |
+ code: A code value to communicate to the other side of the operation |
+ along with indication of operation termination. May be None. |
+ details: A details value to communicate to the other side of the |
+ operation along with indication of operation termination. May be None. |
+ """ |
+ self.code = code |
+ self.details = details |
+ |
+ |
+class Outcome(object): |
+ """The outcome of an operation. |
+ |
+ Attributes: |
+ kind: A Kind value coarsely identifying how the operation terminated. |
+ code: An application-specific code value or None if no such value was |
+ provided. |
+ details: An application-specific details value or None if no such value was |
+ provided. |
+ """ |
+ |
+ @enum.unique |
+ class Kind(enum.Enum): |
+ """Ways in which an operation can terminate.""" |
+ |
+ COMPLETED = 'completed' |
+ CANCELLED = 'cancelled' |
+ EXPIRED = 'expired' |
+ LOCAL_SHUTDOWN = 'local shutdown' |
+ REMOTE_SHUTDOWN = 'remote shutdown' |
+ RECEPTION_FAILURE = 'reception failure' |
+ TRANSMISSION_FAILURE = 'transmission failure' |
+ LOCAL_FAILURE = 'local failure' |
+ REMOTE_FAILURE = 'remote failure' |
+ |
+ |
+class Completion(object): |
+ """An aggregate of the values exchanged upon operation completion. |
+ |
+ Attributes: |
+ terminal_metadata: A terminal metadata value for the operaton. |
+ code: A code value for the operation. |
+ message: A message value for the operation. |
+ """ |
+ __metaclass__ = abc.ABCMeta |
+ |
+ |
+class OperationContext(object): |
+ """Provides operation-related information and action.""" |
+ __metaclass__ = abc.ABCMeta |
+ |
+ @abc.abstractmethod |
+ def outcome(self): |
+ """Indicates the operation's outcome (or that the operation is ongoing). |
+ |
+ Returns: |
+ None if the operation is still active or the Outcome value for the |
+ operation if it has terminated. |
+ """ |
+ raise NotImplementedError() |
+ |
+ @abc.abstractmethod |
+ def add_termination_callback(self, callback): |
+ """Adds a function to be called upon operation termination. |
+ |
+ Args: |
+ callback: A callable to be passed an Outcome value on operation |
+ termination. |
+ |
+ Returns: |
+ None if the operation has not yet terminated and the passed callback will |
+ later be called when it does terminate, or if the operation has already |
+ terminated an Outcome value describing the operation termination and the |
+ passed callback will not be called as a result of this method call. |
+ """ |
+ raise NotImplementedError() |
+ |
+ @abc.abstractmethod |
+ def time_remaining(self): |
+ """Describes the length of allowed time remaining for the operation. |
+ |
+ Returns: |
+ A nonnegative float indicating the length of allowed time in seconds |
+ remaining for the operation to complete before it is considered to have |
+ timed out. Zero is returned if the operation has terminated. |
+ """ |
+ raise NotImplementedError() |
+ |
+ @abc.abstractmethod |
+ def cancel(self): |
+ """Cancels the operation if the operation has not yet terminated.""" |
+ raise NotImplementedError() |
+ |
+ @abc.abstractmethod |
+ def fail(self, exception): |
+ """Indicates that the operation has failed. |
+ |
+ Args: |
+ exception: An exception germane to the operation failure. May be None. |
+ """ |
+ raise NotImplementedError() |
+ |
+ |
+class Operator(object): |
+ """An interface through which to participate in an operation.""" |
+ __metaclass__ = abc.ABCMeta |
+ |
+ @abc.abstractmethod |
+ def advance( |
+ self, initial_metadata=None, payload=None, completion=None, |
+ allowance=None): |
+ """Progresses the operation. |
+ |
+ Args: |
+ initial_metadata: An initial metadata value. Only one may ever be |
+ communicated in each direction for an operation, and they must be |
+ communicated no later than either the first payload or the completion. |
+ payload: A payload value. |
+ completion: A Completion value. May only ever be non-None once in either |
+ direction, and no payloads may be passed after it has been communicated. |
+ allowance: A positive integer communicating the number of additional |
+ payloads allowed to be passed by the remote side of the operation. |
+ """ |
+ raise NotImplementedError() |
+ |
+class ProtocolReceiver(object): |
+ """A means of receiving protocol values during an operation.""" |
+ __metaclass__ = abc.ABCMeta |
+ |
+ @abc.abstractmethod |
+ def context(self, protocol_context): |
+ """Accepts the protocol context object for the operation. |
+ |
+ Args: |
+ protocol_context: The protocol context object for the operation. |
+ """ |
+ raise NotImplementedError() |
+ |
+ |
+class Subscription(object): |
+ """Describes customer code's interest in values from the other side. |
+ |
+ Attributes: |
+ kind: A Kind value describing the overall kind of this value. |
+ termination_callback: A callable to be passed the Outcome associated with |
+ the operation after it has terminated. Must be non-None if kind is |
+ Kind.TERMINATION_ONLY. Must be None otherwise. |
+ allowance: A callable behavior that accepts positive integers representing |
+ the number of additional payloads allowed to be passed to the other side |
+ of the operation. Must be None if kind is Kind.FULL. Must not be None |
+ otherwise. |
+ operator: An Operator to be passed values from the other side of the |
+ operation. Must be non-None if kind is Kind.FULL. Must be None otherwise. |
+ protocol_receiver: A ProtocolReceiver to be passed protocol objects as they |
+ become available during the operation. Must be non-None if kind is |
+ Kind.FULL. |
+ """ |
+ __metaclass__ = abc.ABCMeta |
+ |
+ @enum.unique |
+ class Kind(enum.Enum): |
+ |
+ NONE = 'none' |
+ TERMINATION_ONLY = 'termination only' |
+ FULL = 'full' |
+ |
+ |
+class Servicer(object): |
+ """Interface for service implementations.""" |
+ __metaclass__ = abc.ABCMeta |
+ |
+ @abc.abstractmethod |
+ def service(self, group, method, context, output_operator): |
+ """Services an operation. |
+ |
+ Args: |
+ group: The group identifier of the operation to be serviced. |
+ method: The method identifier of the operation to be serviced. |
+ context: An OperationContext object affording contextual information and |
+ actions. |
+ output_operator: An Operator that will accept output values of the |
+ operation. |
+ |
+ Returns: |
+ A Subscription via which this object may or may not accept more values of |
+ the operation. |
+ |
+ Raises: |
+ NoSuchMethodError: If this Servicer does not handle operations with the |
+ given group and method. |
+ abandonment.Abandoned: If the operation has been aborted and there no |
+ longer is any reason to service the operation. |
+ """ |
+ raise NotImplementedError() |
+ |
+ |
+class End(object): |
+ """Common type for entry-point objects on both sides of an operation.""" |
+ __metaclass__ = abc.ABCMeta |
+ |
+ @abc.abstractmethod |
+ def start(self): |
+ """Starts this object's service of operations.""" |
+ raise NotImplementedError() |
+ |
+ @abc.abstractmethod |
+ def stop(self, grace): |
+ """Stops this object's service of operations. |
+ |
+ This object will refuse service of new operations as soon as this method is |
+ called but operations under way at the time of the call may be given a |
+ grace period during which they are allowed to finish. |
+ |
+ Args: |
+ grace: A duration of time in seconds to allow ongoing operations to |
+ terminate before being forcefully terminated by the stopping of this |
+ End. May be zero to terminate all ongoing operations and immediately |
+ stop. |
+ |
+ Returns: |
+ A threading.Event that will be set to indicate all operations having |
+ terminated and this End having completely stopped. The returned event |
+ may not be set until after the full grace period (if some ongoing |
+ operation continues for the full length of the period) or it may be set |
+ much sooner (if for example this End had no operations in progress at |
+ the time its stop method was called). |
+ """ |
+ raise NotImplementedError() |
+ |
+ @abc.abstractmethod |
+ def operate( |
+ self, group, method, subscription, timeout, initial_metadata=None, |
+ payload=None, completion=None, protocol_options=None): |
+ """Commences an operation. |
+ |
+ Args: |
+ group: The group identifier of the invoked operation. |
+ method: The method identifier of the invoked operation. |
+ subscription: A Subscription to which the results of the operation will be |
+ passed. |
+ timeout: A length of time in seconds to allow for the operation. |
+ initial_metadata: An initial metadata value to be sent to the other side |
+ of the operation. May be None if the initial metadata will be later |
+ passed via the returned operator or if there will be no initial metadata |
+ passed at all. |
+ payload: An initial payload for the operation. |
+ completion: A Completion value indicating the end of transmission to the |
+ other side of the operation. |
+ protocol_options: A value specified by the provider of a Base interface |
+ implementation affording custom state and behavior. |
+ |
+ Returns: |
+ A pair of objects affording information about the operation and action |
+ continuing the operation. The first element of the returned pair is an |
+ OperationContext for the operation and the second element of the |
+ returned pair is an Operator to which operation values not passed in |
+ this call should later be passed. |
+ """ |
+ raise NotImplementedError() |
+ |
+ @abc.abstractmethod |
+ def operation_stats(self): |
+ """Reports the number of terminated operations broken down by outcome. |
+ |
+ Returns: |
+ A dictionary from Outcome.Kind value to an integer identifying the number |
+ of operations that terminated with that outcome kind. |
+ """ |
+ raise NotImplementedError() |
+ |
+ @abc.abstractmethod |
+ def add_idle_action(self, action): |
+ """Adds an action to be called when this End has no ongoing operations. |
+ |
+ Args: |
+ action: A callable that accepts no arguments. |
+ """ |
+ raise NotImplementedError() |