Index: third_party/grpc/src/python/grpcio/grpc/framework/core/_interfaces.py |
diff --git a/third_party/grpc/src/python/grpcio/grpc/framework/core/_interfaces.py b/third_party/grpc/src/python/grpcio/grpc/framework/core/_interfaces.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ffa686b2b79b75f79859077dbb29ad59be4d3874 |
--- /dev/null |
+++ b/third_party/grpc/src/python/grpcio/grpc/framework/core/_interfaces.py |
@@ -0,0 +1,337 @@ |
+# 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. |
+ |
+"""Package-internal interfaces.""" |
+ |
+import abc |
+ |
+from grpc.framework.interfaces.base import base |
+ |
+ |
+class TerminationManager(object): |
+ """An object responsible for handling the termination of an operation. |
+ |
+ Attributes: |
+ outcome: None if the operation is active or a base.Outcome value if it has |
+ terminated. |
+ """ |
+ __metaclass__ = abc.ABCMeta |
+ |
+ @abc.abstractmethod |
+ def add_callback(self, callback): |
+ """Registers a callback to be called on operation termination. |
+ |
+ If the operation has already terminated the callback will not be called. |
+ |
+ Args: |
+ callback: A callable that will be passed a base.Outcome value. |
+ |
+ Returns: |
+ None if the operation has not yet terminated and the passed callback will |
+ be called when it does, or a base.Outcome value describing the |
+ operation termination if the operation has terminated and the callback |
+ will not be called as a result of this method call. |
+ """ |
+ raise NotImplementedError() |
+ |
+ @abc.abstractmethod |
+ def emission_complete(self): |
+ """Indicates that emissions from customer code have completed.""" |
+ raise NotImplementedError() |
+ |
+ @abc.abstractmethod |
+ def transmission_complete(self): |
+ """Indicates that transmissions to the remote end are complete. |
+ |
+ Returns: |
+ True if the operation has terminated or False if the operation remains |
+ ongoing. |
+ """ |
+ raise NotImplementedError() |
+ |
+ @abc.abstractmethod |
+ def reception_complete(self, code, details): |
+ """Indicates that reception from the other side is complete. |
+ |
+ Args: |
+ code: An application-specific code value. |
+ details: An application-specific details value. |
+ """ |
+ raise NotImplementedError() |
+ |
+ @abc.abstractmethod |
+ def ingestion_complete(self): |
+ """Indicates that customer code ingestion of received values is complete.""" |
+ raise NotImplementedError() |
+ |
+ @abc.abstractmethod |
+ def expire(self): |
+ """Indicates that the operation must abort because it has taken too long.""" |
+ raise NotImplementedError() |
+ |
+ @abc.abstractmethod |
+ def abort(self, outcome): |
+ """Indicates that the operation must abort for the indicated reason. |
+ |
+ Args: |
+ outcome: A base.Outcome indicating operation abortion. |
+ """ |
+ raise NotImplementedError() |
+ |
+ |
+class TransmissionManager(object): |
+ """A manager responsible for transmitting to the other end of an operation.""" |
+ __metaclass__ = abc.ABCMeta |
+ |
+ @abc.abstractmethod |
+ def kick_off( |
+ self, group, method, timeout, protocol_options, initial_metadata, |
+ payload, completion, allowance): |
+ """Transmits the values associated with operation invocation.""" |
+ raise NotImplementedError() |
+ |
+ @abc.abstractmethod |
+ def advance(self, initial_metadata, payload, completion, allowance): |
+ """Accepts values for transmission to the other end of the operation. |
+ |
+ Args: |
+ initial_metadata: An initial metadata value to be transmitted to the other |
+ side of the operation. May only ever be non-None once. |
+ payload: A payload value. |
+ completion: A base.Completion value. May only ever be non-None in the last |
+ transmission to be made to the other side. |
+ allowance: A positive integer communicating the number of additional |
+ payloads allowed to be transmitted from the other side to this side of |
+ the operation, or None if no additional allowance is being granted in |
+ this call. |
+ """ |
+ raise NotImplementedError() |
+ |
+ @abc.abstractmethod |
+ def timeout(self, timeout): |
+ """Accepts for transmission to the other side a new timeout value. |
+ |
+ Args: |
+ timeout: A positive float used as the new timeout value for the operation |
+ to be transmitted to the other side. |
+ """ |
+ raise NotImplementedError() |
+ |
+ @abc.abstractmethod |
+ def allowance(self, allowance): |
+ """Indicates to this manager that the remote customer is allowing payloads. |
+ |
+ Args: |
+ allowance: A positive integer indicating the number of additional payloads |
+ the remote customer is allowing to be transmitted from this side of the |
+ operation. |
+ """ |
+ raise NotImplementedError() |
+ |
+ @abc.abstractmethod |
+ def remote_complete(self): |
+ """Indicates to this manager that data from the remote side is complete.""" |
+ raise NotImplementedError() |
+ |
+ @abc.abstractmethod |
+ def abort(self, outcome): |
+ """Indicates that the operation has aborted. |
+ |
+ Args: |
+ outcome: A base.Outcome for the operation. If None, indicates that the |
+ operation abortion should not be communicated to the other side of the |
+ operation. |
+ """ |
+ raise NotImplementedError() |
+ |
+ |
+class ExpirationManager(object): |
+ """A manager responsible for aborting the operation if it runs out of time.""" |
+ __metaclass__ = abc.ABCMeta |
+ |
+ @abc.abstractmethod |
+ def change_timeout(self, timeout): |
+ """Changes the timeout allotted for the operation. |
+ |
+ Operation duration is always measure from the beginning of the operation; |
+ calling this method changes the operation's allotted time to timeout total |
+ seconds, not timeout seconds from the time of this method call. |
+ |
+ Args: |
+ timeout: A length of time in seconds to allow for the operation. |
+ """ |
+ raise NotImplementedError() |
+ |
+ @abc.abstractmethod |
+ def deadline(self): |
+ """Returns the time until which the operation is allowed to run. |
+ |
+ Returns: |
+ The time (seconds since the epoch) at which the operation will expire. |
+ """ |
+ raise NotImplementedError() |
+ |
+ @abc.abstractmethod |
+ def terminate(self): |
+ """Indicates to this manager that the operation has terminated.""" |
+ raise NotImplementedError() |
+ |
+ |
+class ProtocolManager(object): |
+ """A manager of protocol-specific values passing through an operation.""" |
+ __metaclass__ = abc.ABCMeta |
+ |
+ @abc.abstractmethod |
+ def set_protocol_receiver(self, protocol_receiver): |
+ """Registers the customer object that will receive protocol objects. |
+ |
+ Args: |
+ protocol_receiver: A base.ProtocolReceiver to which protocol objects for |
+ the operation should be passed. |
+ """ |
+ raise NotImplementedError() |
+ |
+ @abc.abstractmethod |
+ def accept_protocol_context(self, protocol_context): |
+ """Accepts the protocol context object for the operation. |
+ |
+ Args: |
+ protocol_context: An object designated for use as the protocol context |
+ of the operation, with further semantics implementation-determined. |
+ """ |
+ raise NotImplementedError() |
+ |
+ |
+class EmissionManager(base.Operator): |
+ """A manager of values emitted by customer code.""" |
+ __metaclass__ = abc.ABCMeta |
+ |
+ @abc.abstractmethod |
+ def advance( |
+ self, initial_metadata=None, payload=None, completion=None, |
+ allowance=None): |
+ """Accepts a value emitted by customer code. |
+ |
+ This method should only be called by customer code. |
+ |
+ Args: |
+ initial_metadata: An initial metadata value emitted by the local customer |
+ to be sent to the other side of the operation. |
+ payload: A payload value emitted by the local customer to be sent to the |
+ other side of the operation. |
+ completion: A Completion value emitted by the local customer to be sent to |
+ the other side of the operation. |
+ allowance: A positive integer indicating an additional number of payloads |
+ that the local customer is willing to accept from the other side of the |
+ operation. |
+ """ |
+ raise NotImplementedError() |
+ |
+ |
+class IngestionManager(object): |
+ """A manager responsible for executing customer code. |
+ |
+ This name of this manager comes from its responsibility to pass successive |
+ values from the other side of the operation into the code of the local |
+ customer. |
+ """ |
+ __metaclass__ = abc.ABCMeta |
+ |
+ @abc.abstractmethod |
+ def set_group_and_method(self, group, method): |
+ """Communicates to this IngestionManager the operation group and method. |
+ |
+ Args: |
+ group: The group identifier of the operation. |
+ method: The method identifier of the operation. |
+ """ |
+ raise NotImplementedError() |
+ |
+ @abc.abstractmethod |
+ def add_local_allowance(self, allowance): |
+ """Communicates to this IngestionManager that more payloads may be ingested. |
+ |
+ Args: |
+ allowance: A positive integer indicating an additional number of payloads |
+ that the local customer is willing to ingest. |
+ """ |
+ raise NotImplementedError() |
+ |
+ @abc.abstractmethod |
+ def local_emissions_done(self): |
+ """Indicates to this manager that local emissions are done.""" |
+ raise NotImplementedError() |
+ |
+ @abc.abstractmethod |
+ def advance(self, initial_metadata, payload, completion, allowance): |
+ """Advances the operation by passing values to the local customer.""" |
+ raise NotImplementedError() |
+ |
+ |
+class ReceptionManager(object): |
+ """A manager responsible for receiving tickets from the other end.""" |
+ __metaclass__ = abc.ABCMeta |
+ |
+ @abc.abstractmethod |
+ def receive_ticket(self, ticket): |
+ """Handle a ticket from the other side of the operation. |
+ |
+ Args: |
+ ticket: A links.Ticket for the operation. |
+ """ |
+ raise NotImplementedError() |
+ |
+ |
+class Operation(object): |
+ """An ongoing operation. |
+ |
+ Attributes: |
+ context: A base.OperationContext object for the operation. |
+ operator: A base.Operator object for the operation for use by the customer |
+ of the operation. |
+ """ |
+ __metaclass__ = abc.ABCMeta |
+ |
+ @abc.abstractmethod |
+ def handle_ticket(self, ticket): |
+ """Handle a ticket from the other side of the operation. |
+ |
+ Args: |
+ ticket: A links.Ticket from the other side of the operation. |
+ """ |
+ raise NotImplementedError() |
+ |
+ @abc.abstractmethod |
+ def abort(self, outcome_kind): |
+ """Aborts the operation. |
+ |
+ Args: |
+ outcome_kind: A base.Outcome.Kind value indicating operation abortion. |
+ """ |
+ raise NotImplementedError() |