| Index: third_party/grpc/src/python/grpcio/grpc/_adapter/_types.py
|
| diff --git a/third_party/grpc/src/python/grpcio/grpc/_adapter/_types.py b/third_party/grpc/src/python/grpcio/grpc/_adapter/_types.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..3d5ab33d0084aef6d457dd63f4e153125fcc544d
|
| --- /dev/null
|
| +++ b/third_party/grpc/src/python/grpcio/grpc/_adapter/_types.py
|
| @@ -0,0 +1,445 @@
|
| +# 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.
|
| +
|
| +import abc
|
| +import collections
|
| +import enum
|
| +
|
| +from grpc._cython import cygrpc
|
| +
|
| +
|
| +class GrpcChannelArgumentKeys(enum.Enum):
|
| + """Mirrors keys used in grpc_channel_args for GRPC-specific arguments."""
|
| + SSL_TARGET_NAME_OVERRIDE = 'grpc.ssl_target_name_override'
|
| +
|
| +
|
| +@enum.unique
|
| +class CallError(enum.IntEnum):
|
| + """Mirrors grpc_call_error in the C core."""
|
| + OK = cygrpc.CallError.ok
|
| + ERROR = cygrpc.CallError.error
|
| + ERROR_NOT_ON_SERVER = cygrpc.CallError.not_on_server
|
| + ERROR_NOT_ON_CLIENT = cygrpc.CallError.not_on_client
|
| + ERROR_ALREADY_ACCEPTED = cygrpc.CallError.already_accepted
|
| + ERROR_ALREADY_INVOKED = cygrpc.CallError.already_invoked
|
| + ERROR_NOT_INVOKED = cygrpc.CallError.not_invoked
|
| + ERROR_ALREADY_FINISHED = cygrpc.CallError.already_finished
|
| + ERROR_TOO_MANY_OPERATIONS = cygrpc.CallError.too_many_operations
|
| + ERROR_INVALID_FLAGS = cygrpc.CallError.invalid_flags
|
| + ERROR_INVALID_METADATA = cygrpc.CallError.invalid_metadata
|
| +
|
| +
|
| +@enum.unique
|
| +class StatusCode(enum.IntEnum):
|
| + """Mirrors grpc_status_code in the C core."""
|
| + OK = cygrpc.StatusCode.ok
|
| + CANCELLED = cygrpc.StatusCode.cancelled
|
| + UNKNOWN = cygrpc.StatusCode.unknown
|
| + INVALID_ARGUMENT = cygrpc.StatusCode.invalid_argument
|
| + DEADLINE_EXCEEDED = cygrpc.StatusCode.deadline_exceeded
|
| + NOT_FOUND = cygrpc.StatusCode.not_found
|
| + ALREADY_EXISTS = cygrpc.StatusCode.already_exists
|
| + PERMISSION_DENIED = cygrpc.StatusCode.permission_denied
|
| + RESOURCE_EXHAUSTED = cygrpc.StatusCode.resource_exhausted
|
| + FAILED_PRECONDITION = cygrpc.StatusCode.failed_precondition
|
| + ABORTED = cygrpc.StatusCode.aborted
|
| + OUT_OF_RANGE = cygrpc.StatusCode.out_of_range
|
| + UNIMPLEMENTED = cygrpc.StatusCode.unimplemented
|
| + INTERNAL = cygrpc.StatusCode.internal
|
| + UNAVAILABLE = cygrpc.StatusCode.unavailable
|
| + DATA_LOSS = cygrpc.StatusCode.data_loss
|
| + UNAUTHENTICATED = cygrpc.StatusCode.unauthenticated
|
| +
|
| +
|
| +@enum.unique
|
| +class OpWriteFlags(enum.IntEnum):
|
| + """Mirrors defined write-flag constants in the C core."""
|
| + WRITE_BUFFER_HINT = cygrpc.WriteFlag.buffer_hint
|
| + WRITE_NO_COMPRESS = cygrpc.WriteFlag.no_compress
|
| +
|
| +
|
| +@enum.unique
|
| +class OpType(enum.IntEnum):
|
| + """Mirrors grpc_op_type in the C core."""
|
| + SEND_INITIAL_METADATA = cygrpc.OperationType.send_initial_metadata
|
| + SEND_MESSAGE = cygrpc.OperationType.send_message
|
| + SEND_CLOSE_FROM_CLIENT = cygrpc.OperationType.send_close_from_client
|
| + SEND_STATUS_FROM_SERVER = cygrpc.OperationType.send_status_from_server
|
| + RECV_INITIAL_METADATA = cygrpc.OperationType.receive_initial_metadata
|
| + RECV_MESSAGE = cygrpc.OperationType.receive_message
|
| + RECV_STATUS_ON_CLIENT = cygrpc.OperationType.receive_status_on_client
|
| + RECV_CLOSE_ON_SERVER = cygrpc.OperationType.receive_close_on_server
|
| +
|
| +
|
| +@enum.unique
|
| +class EventType(enum.IntEnum):
|
| + """Mirrors grpc_completion_type in the C core."""
|
| + QUEUE_SHUTDOWN = cygrpc.CompletionType.queue_shutdown
|
| + QUEUE_TIMEOUT = cygrpc.CompletionType.queue_timeout
|
| + OP_COMPLETE = cygrpc.CompletionType.operation_complete
|
| +
|
| +
|
| +@enum.unique
|
| +class ConnectivityState(enum.IntEnum):
|
| + """Mirrors grpc_connectivity_state in the C core."""
|
| + IDLE = cygrpc.ConnectivityState.idle
|
| + CONNECTING = cygrpc.ConnectivityState.connecting
|
| + READY = cygrpc.ConnectivityState.ready
|
| + TRANSIENT_FAILURE = cygrpc.ConnectivityState.transient_failure
|
| + FATAL_FAILURE = cygrpc.ConnectivityState.fatal_failure
|
| +
|
| +
|
| +class Status(collections.namedtuple(
|
| + 'Status', [
|
| + 'code',
|
| + 'details',
|
| + ])):
|
| + """The end status of a GRPC call.
|
| +
|
| + Attributes:
|
| + code (StatusCode): ...
|
| + details (str): ...
|
| + """
|
| +
|
| +
|
| +class CallDetails(collections.namedtuple(
|
| + 'CallDetails', [
|
| + 'method',
|
| + 'host',
|
| + 'deadline',
|
| + ])):
|
| + """Provides information to the server about the client's call.
|
| +
|
| + Attributes:
|
| + method (str): ...
|
| + host (str): ...
|
| + deadline (float): ...
|
| + """
|
| +
|
| +
|
| +class OpArgs(collections.namedtuple(
|
| + 'OpArgs', [
|
| + 'type',
|
| + 'initial_metadata',
|
| + 'trailing_metadata',
|
| + 'message',
|
| + 'status',
|
| + 'write_flags',
|
| + ])):
|
| + """Arguments passed into a GRPC operation.
|
| +
|
| + Attributes:
|
| + type (OpType): ...
|
| + initial_metadata (sequence of 2-sequence of str): Only valid if type ==
|
| + OpType.SEND_INITIAL_METADATA, else is None.
|
| + trailing_metadata (sequence of 2-sequence of str): Only valid if type ==
|
| + OpType.SEND_STATUS_FROM_SERVER, else is None.
|
| + message (bytes): Only valid if type == OpType.SEND_MESSAGE, else is None.
|
| + status (Status): Only valid if type == OpType.SEND_STATUS_FROM_SERVER, else
|
| + is None.
|
| + write_flags (int): a bit OR'ing of 0 or more OpWriteFlags values.
|
| + """
|
| +
|
| + @staticmethod
|
| + def send_initial_metadata(initial_metadata):
|
| + return OpArgs(OpType.SEND_INITIAL_METADATA, initial_metadata, None, None, None, 0)
|
| +
|
| + @staticmethod
|
| + def send_message(message, flags):
|
| + return OpArgs(OpType.SEND_MESSAGE, None, None, message, None, flags)
|
| +
|
| + @staticmethod
|
| + def send_close_from_client():
|
| + return OpArgs(OpType.SEND_CLOSE_FROM_CLIENT, None, None, None, None, 0)
|
| +
|
| + @staticmethod
|
| + def send_status_from_server(trailing_metadata, status_code, status_details):
|
| + return OpArgs(OpType.SEND_STATUS_FROM_SERVER, None, trailing_metadata, None, Status(status_code, status_details), 0)
|
| +
|
| + @staticmethod
|
| + def recv_initial_metadata():
|
| + return OpArgs(OpType.RECV_INITIAL_METADATA, None, None, None, None, 0);
|
| +
|
| + @staticmethod
|
| + def recv_message():
|
| + return OpArgs(OpType.RECV_MESSAGE, None, None, None, None, 0)
|
| +
|
| + @staticmethod
|
| + def recv_status_on_client():
|
| + return OpArgs(OpType.RECV_STATUS_ON_CLIENT, None, None, None, None, 0)
|
| +
|
| + @staticmethod
|
| + def recv_close_on_server():
|
| + return OpArgs(OpType.RECV_CLOSE_ON_SERVER, None, None, None, None, 0)
|
| +
|
| +
|
| +class OpResult(collections.namedtuple(
|
| + 'OpResult', [
|
| + 'type',
|
| + 'initial_metadata',
|
| + 'trailing_metadata',
|
| + 'message',
|
| + 'status',
|
| + 'cancelled',
|
| + ])):
|
| + """Results received from a GRPC operation.
|
| +
|
| + Attributes:
|
| + type (OpType): ...
|
| + initial_metadata (sequence of 2-sequence of str): Only valid if type ==
|
| + OpType.RECV_INITIAL_METADATA, else is None.
|
| + trailing_metadata (sequence of 2-sequence of str): Only valid if type ==
|
| + OpType.RECV_STATUS_ON_CLIENT, else is None.
|
| + message (bytes): Only valid if type == OpType.RECV_MESSAGE, else is None.
|
| + status (Status): Only valid if type == OpType.RECV_STATUS_ON_CLIENT, else
|
| + is None.
|
| + cancelled (bool): Only valid if type == OpType.RECV_CLOSE_ON_SERVER, else
|
| + is None.
|
| + """
|
| +
|
| +
|
| +class Event(collections.namedtuple(
|
| + 'Event', [
|
| + 'type',
|
| + 'tag',
|
| + 'call',
|
| + 'call_details',
|
| + 'results',
|
| + 'success',
|
| + ])):
|
| + """An event received from a GRPC completion queue.
|
| +
|
| + Attributes:
|
| + type (EventType): ...
|
| + tag (object): ...
|
| + call (Call): The Call object associated with this event (if there is one,
|
| + else None).
|
| + call_details (CallDetails): The call details associated with the
|
| + server-side call (if there is such information, else None).
|
| + results (list of OpResult): ...
|
| + success (bool): ...
|
| + """
|
| +
|
| +
|
| +class CompletionQueue:
|
| + __metaclass__ = abc.ABCMeta
|
| +
|
| + @abc.abstractmethod
|
| + def __init__(self):
|
| + pass
|
| +
|
| + def __iter__(self):
|
| + """This class may be iterated over.
|
| +
|
| + This is the equivalent of calling next() repeatedly with an absolute
|
| + deadline of None (i.e. no deadline).
|
| + """
|
| + return self
|
| +
|
| + @abc.abstractmethod
|
| + def next(self, deadline=float('+inf')):
|
| + """Get the next event on this completion queue.
|
| +
|
| + Args:
|
| + deadline (float): absolute deadline in seconds from the Python epoch, or
|
| + None for no deadline.
|
| +
|
| + Returns:
|
| + Event: ...
|
| + """
|
| + pass
|
| +
|
| + @abc.abstractmethod
|
| + def shutdown(self):
|
| + """Begin the shutdown process of this completion queue.
|
| +
|
| + Note that this does not immediately destroy the completion queue.
|
| + Nevertheless, user code should not pass it around after invoking this.
|
| + """
|
| + return None
|
| +
|
| +
|
| +class Call:
|
| + __metaclass__ = abc.ABCMeta
|
| +
|
| + @abc.abstractmethod
|
| + def start_batch(self, ops, tag):
|
| + """Start a batch of operations.
|
| +
|
| + Args:
|
| + ops (sequence of OpArgs): ...
|
| + tag (object): ...
|
| +
|
| + Returns:
|
| + CallError: ...
|
| + """
|
| + return CallError.ERROR
|
| +
|
| + @abc.abstractmethod
|
| + def cancel(self, code=None, details=None):
|
| + """Cancel the call.
|
| +
|
| + Args:
|
| + code (int): Status code to cancel with (on the server side). If
|
| + specified, so must `details`.
|
| + details (str): Status details to cancel with (on the server side). If
|
| + specified, so must `code`.
|
| +
|
| + Returns:
|
| + CallError: ...
|
| + """
|
| + return CallError.ERROR
|
| +
|
| + @abc.abstractmethod
|
| + def peer(self):
|
| + """Get the peer of this call.
|
| +
|
| + Returns:
|
| + str: the peer of this call.
|
| + """
|
| + return None
|
| +
|
| + def set_credentials(self, creds):
|
| + """Set per-call credentials.
|
| +
|
| + Args:
|
| + creds (CallCredentials): Credentials to be set for this call.
|
| + """
|
| + return None
|
| +
|
| +
|
| +class Channel:
|
| + __metaclass__ = abc.ABCMeta
|
| +
|
| + @abc.abstractmethod
|
| + def __init__(self, target, args, credentials=None):
|
| + """Initialize a Channel.
|
| +
|
| + Args:
|
| + target (str): ...
|
| + args (sequence of 2-sequence of str, (str|integer)): ...
|
| + credentials (ChannelCredentials): If None, create an insecure channel,
|
| + else create a secure channel using the client credentials.
|
| + """
|
| +
|
| + @abc.abstractmethod
|
| + def create_call(self, completion_queue, method, host, deadline=float('+inf')):
|
| + """Create a call from this channel.
|
| +
|
| + Args:
|
| + completion_queue (CompletionQueue): ...
|
| + method (str): ...
|
| + host (str): ...
|
| + deadline (float): absolute deadline in seconds from the Python epoch, or
|
| + None for no deadline.
|
| +
|
| + Returns:
|
| + Call: call object associated with this Channel and passed parameters.
|
| + """
|
| + return None
|
| +
|
| + @abc.abstractmethod
|
| + def check_connectivity_state(self, try_to_connect):
|
| + """Check and optionally repair the connectivity state of the channel.
|
| +
|
| + Args:
|
| + try_to_connect (bool): whether or not to try to connect the channel if
|
| + disconnected.
|
| +
|
| + Returns:
|
| + ConnectivityState: state of the channel at the time of this invocation.
|
| + """
|
| + return None
|
| +
|
| + @abc.abstractmethod
|
| + def watch_connectivity_state(self, last_observed_state, deadline,
|
| + completion_queue, tag):
|
| + """Watch for connectivity state changes from the last_observed_state.
|
| +
|
| + Args:
|
| + last_observed_state (ConnectivityState): ...
|
| + deadline (float): ...
|
| + completion_queue (CompletionQueue): ...
|
| + tag (object) ...
|
| + """
|
| +
|
| + @abc.abstractmethod
|
| + def target(self):
|
| + """Get the target of this channel.
|
| +
|
| + Returns:
|
| + str: the target of this channel.
|
| + """
|
| + return None
|
| +
|
| +
|
| +class Server:
|
| + __metaclass__ = abc.ABCMeta
|
| +
|
| + @abc.abstractmethod
|
| + def __init__(self, completion_queue, args):
|
| + """Initialize a server.
|
| +
|
| + Args:
|
| + completion_queue (CompletionQueue): ...
|
| + args (sequence of 2-sequence of str, (str|integer)): ...
|
| + """
|
| +
|
| + @abc.abstractmethod
|
| + def add_http2_port(self, address, credentials=None):
|
| + """Adds an HTTP/2 address+port to the server.
|
| +
|
| + Args:
|
| + address (str): ...
|
| + credentials (ServerCredentials): If None, create an insecure port, else
|
| + create a secure port using the server credentials.
|
| + """
|
| +
|
| + @abc.abstractmethod
|
| + def start(self):
|
| + """Starts the server."""
|
| +
|
| + @abc.abstractmethod
|
| + def shutdown(self, tag=None):
|
| + """Shuts down the server. Does not immediately destroy the server.
|
| +
|
| + Args:
|
| + tag (object): if not None, have the server place an event on its
|
| + completion queue notifying it when this server has completely shut down.
|
| + """
|
| +
|
| + @abc.abstractmethod
|
| + def request_call(self, completion_queue, tag):
|
| + """Requests a call from the server on the server's completion queue.
|
| +
|
| + Args:
|
| + completion_queue (CompletionQueue): Completion queue for the call. May be
|
| + the same as the server's completion queue.
|
| + tag (object) ...
|
| + """
|
|
|