| Index: third_party/grpc/src/python/grpcio/grpc/framework/face/implementations.py
|
| diff --git a/third_party/grpc/src/python/grpcio/grpc/framework/face/implementations.py b/third_party/grpc/src/python/grpcio/grpc/framework/face/implementations.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..4a6de52974ed623ce557c15282971d56bfdb4dfe
|
| --- /dev/null
|
| +++ b/third_party/grpc/src/python/grpcio/grpc/framework/face/implementations.py
|
| @@ -0,0 +1,318 @@
|
| +# 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.
|
| +
|
| +"""Entry points into the Face layer of RPC Framework."""
|
| +
|
| +from grpc.framework.common import cardinality
|
| +from grpc.framework.common import style
|
| +from grpc.framework.base import exceptions as _base_exceptions
|
| +from grpc.framework.base import interfaces as base_interfaces
|
| +from grpc.framework.face import _calls
|
| +from grpc.framework.face import _service
|
| +from grpc.framework.face import exceptions
|
| +from grpc.framework.face import interfaces
|
| +
|
| +
|
| +class _BaseServicer(base_interfaces.Servicer):
|
| +
|
| + def __init__(self, methods, multi_method):
|
| + self._methods = methods
|
| + self._multi_method = multi_method
|
| +
|
| + def service(self, name, context, output_consumer):
|
| + method = self._methods.get(name, None)
|
| + if method is not None:
|
| + return method(output_consumer, context)
|
| + elif self._multi_method is not None:
|
| + try:
|
| + return self._multi_method.service(name, output_consumer, context)
|
| + except exceptions.NoSuchMethodError:
|
| + raise _base_exceptions.NoSuchMethodError()
|
| + else:
|
| + raise _base_exceptions.NoSuchMethodError()
|
| +
|
| +
|
| +class _UnaryUnaryMultiCallable(interfaces.UnaryUnaryMultiCallable):
|
| +
|
| + def __init__(self, front, name):
|
| + self._front = front
|
| + self._name = name
|
| +
|
| + def __call__(self, request, timeout):
|
| + return _calls.blocking_value_in_value_out(
|
| + self._front, self._name, request, timeout, 'unused trace ID')
|
| +
|
| + def future(self, request, timeout):
|
| + return _calls.future_value_in_value_out(
|
| + self._front, self._name, request, timeout, 'unused trace ID')
|
| +
|
| + def event(self, request, response_callback, abortion_callback, timeout):
|
| + return _calls.event_value_in_value_out(
|
| + self._front, self._name, request, response_callback, abortion_callback,
|
| + timeout, 'unused trace ID')
|
| +
|
| +
|
| +class _UnaryStreamMultiCallable(interfaces.UnaryStreamMultiCallable):
|
| +
|
| + def __init__(self, front, name):
|
| + self._front = front
|
| + self._name = name
|
| +
|
| + def __call__(self, request, timeout):
|
| + return _calls.inline_value_in_stream_out(
|
| + self._front, self._name, request, timeout, 'unused trace ID')
|
| +
|
| + def event(self, request, response_consumer, abortion_callback, timeout):
|
| + return _calls.event_value_in_stream_out(
|
| + self._front, self._name, request, response_consumer, abortion_callback,
|
| + timeout, 'unused trace ID')
|
| +
|
| +
|
| +class _StreamUnaryMultiCallable(interfaces.StreamUnaryMultiCallable):
|
| +
|
| + def __init__(self, front, name, pool):
|
| + self._front = front
|
| + self._name = name
|
| + self._pool = pool
|
| +
|
| + def __call__(self, request_iterator, timeout):
|
| + return _calls.blocking_stream_in_value_out(
|
| + self._front, self._name, request_iterator, timeout, 'unused trace ID')
|
| +
|
| + def future(self, request_iterator, timeout):
|
| + return _calls.future_stream_in_value_out(
|
| + self._front, self._name, request_iterator, timeout, 'unused trace ID',
|
| + self._pool)
|
| +
|
| + def event(self, response_callback, abortion_callback, timeout):
|
| + return _calls.event_stream_in_value_out(
|
| + self._front, self._name, response_callback, abortion_callback, timeout,
|
| + 'unused trace ID')
|
| +
|
| +
|
| +class _StreamStreamMultiCallable(interfaces.StreamStreamMultiCallable):
|
| +
|
| + def __init__(self, front, name, pool):
|
| + self._front = front
|
| + self._name = name
|
| + self._pool = pool
|
| +
|
| + def __call__(self, request_iterator, timeout):
|
| + return _calls.inline_stream_in_stream_out(
|
| + self._front, self._name, request_iterator, timeout, 'unused trace ID',
|
| + self._pool)
|
| +
|
| + def event(self, response_consumer, abortion_callback, timeout):
|
| + return _calls.event_stream_in_stream_out(
|
| + self._front, self._name, response_consumer, abortion_callback, timeout,
|
| + 'unused trace ID')
|
| +
|
| +
|
| +class _GenericStub(interfaces.GenericStub):
|
| + """An interfaces.GenericStub implementation."""
|
| +
|
| + def __init__(self, front, pool):
|
| + self._front = front
|
| + self._pool = pool
|
| +
|
| + def blocking_value_in_value_out(self, name, request, timeout):
|
| + return _calls.blocking_value_in_value_out(
|
| + self._front, name, request, timeout, 'unused trace ID')
|
| +
|
| + def future_value_in_value_out(self, name, request, timeout):
|
| + return _calls.future_value_in_value_out(
|
| + self._front, name, request, timeout, 'unused trace ID')
|
| +
|
| + def inline_value_in_stream_out(self, name, request, timeout):
|
| + return _calls.inline_value_in_stream_out(
|
| + self._front, name, request, timeout, 'unused trace ID')
|
| +
|
| + def blocking_stream_in_value_out(self, name, request_iterator, timeout):
|
| + return _calls.blocking_stream_in_value_out(
|
| + self._front, name, request_iterator, timeout, 'unused trace ID')
|
| +
|
| + def future_stream_in_value_out(self, name, request_iterator, timeout):
|
| + return _calls.future_stream_in_value_out(
|
| + self._front, name, request_iterator, timeout, 'unused trace ID',
|
| + self._pool)
|
| +
|
| + def inline_stream_in_stream_out(self, name, request_iterator, timeout):
|
| + return _calls.inline_stream_in_stream_out(
|
| + self._front, name, request_iterator, timeout, 'unused trace ID',
|
| + self._pool)
|
| +
|
| + def event_value_in_value_out(
|
| + self, name, request, response_callback, abortion_callback, timeout):
|
| + return _calls.event_value_in_value_out(
|
| + self._front, name, request, response_callback, abortion_callback,
|
| + timeout, 'unused trace ID')
|
| +
|
| + def event_value_in_stream_out(
|
| + self, name, request, response_consumer, abortion_callback, timeout):
|
| + return _calls.event_value_in_stream_out(
|
| + self._front, name, request, response_consumer, abortion_callback,
|
| + timeout, 'unused trace ID')
|
| +
|
| + def event_stream_in_value_out(
|
| + self, name, response_callback, abortion_callback, timeout):
|
| + return _calls.event_stream_in_value_out(
|
| + self._front, name, response_callback, abortion_callback, timeout,
|
| + 'unused trace ID')
|
| +
|
| + def event_stream_in_stream_out(
|
| + self, name, response_consumer, abortion_callback, timeout):
|
| + return _calls.event_stream_in_stream_out(
|
| + self._front, name, response_consumer, abortion_callback, timeout,
|
| + 'unused trace ID')
|
| +
|
| + def unary_unary_multi_callable(self, name):
|
| + return _UnaryUnaryMultiCallable(self._front, name)
|
| +
|
| + def unary_stream_multi_callable(self, name):
|
| + return _UnaryStreamMultiCallable(self._front, name)
|
| +
|
| + def stream_unary_multi_callable(self, name):
|
| + return _StreamUnaryMultiCallable(self._front, name, self._pool)
|
| +
|
| + def stream_stream_multi_callable(self, name):
|
| + return _StreamStreamMultiCallable(self._front, name, self._pool)
|
| +
|
| +
|
| +class _DynamicStub(interfaces.DynamicStub):
|
| + """An interfaces.DynamicStub implementation."""
|
| +
|
| + def __init__(self, cardinalities, front, pool):
|
| + self._cardinalities = cardinalities
|
| + self._front = front
|
| + self._pool = pool
|
| +
|
| + def __getattr__(self, attr):
|
| + method_cardinality = self._cardinalities.get(attr)
|
| + if method_cardinality is cardinality.Cardinality.UNARY_UNARY:
|
| + return _UnaryUnaryMultiCallable(self._front, attr)
|
| + elif method_cardinality is cardinality.Cardinality.UNARY_STREAM:
|
| + return _UnaryStreamMultiCallable(self._front, attr)
|
| + elif method_cardinality is cardinality.Cardinality.STREAM_UNARY:
|
| + return _StreamUnaryMultiCallable(self._front, attr, self._pool)
|
| + elif method_cardinality is cardinality.Cardinality.STREAM_STREAM:
|
| + return _StreamStreamMultiCallable(self._front, attr, self._pool)
|
| + else:
|
| + raise AttributeError('_DynamicStub object has no attribute "%s"!' % attr)
|
| +
|
| +
|
| +def _adapt_method_implementations(method_implementations, pool):
|
| + adapted_implementations = {}
|
| + for name, method_implementation in method_implementations.iteritems():
|
| + if method_implementation.style is style.Service.INLINE:
|
| + if method_implementation.cardinality is cardinality.Cardinality.UNARY_UNARY:
|
| + adapted_implementations[name] = _service.adapt_inline_value_in_value_out(
|
| + method_implementation.unary_unary_inline)
|
| + elif method_implementation.cardinality is cardinality.Cardinality.UNARY_STREAM:
|
| + adapted_implementations[name] = _service.adapt_inline_value_in_stream_out(
|
| + method_implementation.unary_stream_inline)
|
| + elif method_implementation.cardinality is cardinality.Cardinality.STREAM_UNARY:
|
| + adapted_implementations[name] = _service.adapt_inline_stream_in_value_out(
|
| + method_implementation.stream_unary_inline, pool)
|
| + elif method_implementation.cardinality is cardinality.Cardinality.STREAM_STREAM:
|
| + adapted_implementations[name] = _service.adapt_inline_stream_in_stream_out(
|
| + method_implementation.stream_stream_inline, pool)
|
| + elif method_implementation.style is style.Service.EVENT:
|
| + if method_implementation.cardinality is cardinality.Cardinality.UNARY_UNARY:
|
| + adapted_implementations[name] = _service.adapt_event_value_in_value_out(
|
| + method_implementation.unary_unary_event)
|
| + elif method_implementation.cardinality is cardinality.Cardinality.UNARY_STREAM:
|
| + adapted_implementations[name] = _service.adapt_event_value_in_stream_out(
|
| + method_implementation.unary_stream_event)
|
| + elif method_implementation.cardinality is cardinality.Cardinality.STREAM_UNARY:
|
| + adapted_implementations[name] = _service.adapt_event_stream_in_value_out(
|
| + method_implementation.stream_unary_event)
|
| + elif method_implementation.cardinality is cardinality.Cardinality.STREAM_STREAM:
|
| + adapted_implementations[name] = _service.adapt_event_stream_in_stream_out(
|
| + method_implementation.stream_stream_event)
|
| + return adapted_implementations
|
| +
|
| +
|
| +def servicer(pool, method_implementations, multi_method_implementation):
|
| + """Creates a base_interfaces.Servicer.
|
| +
|
| + It is guaranteed that any passed interfaces.MultiMethodImplementation will
|
| + only be called to service an RPC if there is no
|
| + interfaces.MethodImplementation for the RPC method in the passed
|
| + method_implementations dictionary.
|
| +
|
| + Args:
|
| + pool: A thread pool.
|
| + method_implementations: A dictionary from RPC method name to
|
| + interfaces.MethodImplementation object to be used to service the named
|
| + RPC method.
|
| + multi_method_implementation: An interfaces.MultiMethodImplementation to be
|
| + used to service any RPCs not serviced by the
|
| + interfaces.MethodImplementations given in the method_implementations
|
| + dictionary, or None.
|
| +
|
| + Returns:
|
| + A base_interfaces.Servicer that services RPCs via the given implementations.
|
| + """
|
| + adapted_implementations = _adapt_method_implementations(
|
| + method_implementations, pool)
|
| + return _BaseServicer(adapted_implementations, multi_method_implementation)
|
| +
|
| +
|
| +def generic_stub(front, pool):
|
| + """Creates an interfaces.GenericStub.
|
| +
|
| + Args:
|
| + front: A base_interfaces.Front.
|
| + pool: A futures.ThreadPoolExecutor.
|
| +
|
| + Returns:
|
| + An interfaces.GenericStub that performs RPCs via the given
|
| + base_interfaces.Front.
|
| + """
|
| + return _GenericStub(front, pool)
|
| +
|
| +
|
| +def dynamic_stub(cardinalities, front, pool, prefix):
|
| + """Creates an interfaces.DynamicStub.
|
| +
|
| + Args:
|
| + cardinalities: A dict from RPC method name to cardinality.Cardinality
|
| + value identifying the cardinality of every RPC method to be supported by
|
| + the created interfaces.DynamicStub.
|
| + front: A base_interfaces.Front.
|
| + pool: A futures.ThreadPoolExecutor.
|
| + prefix: A string to prepend when mapping requested attribute name to RPC
|
| + method name during attribute access on the created
|
| + interfaces.DynamicStub.
|
| +
|
| + Returns:
|
| + An interfaces.DynamicStub that performs RPCs via the given
|
| + base_interfaces.Front.
|
| + """
|
| + return _DynamicStub(cardinalities, front, pool)
|
|
|