Index: third_party/grpc/src/python/grpcio/grpc/framework/crust/implementations.py |
diff --git a/third_party/grpc/src/python/grpcio/grpc/framework/crust/implementations.py b/third_party/grpc/src/python/grpcio/grpc/framework/crust/implementations.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4ebc4e9ae8599934dc334d44486fd12f8074f5a6 |
--- /dev/null |
+++ b/third_party/grpc/src/python/grpcio/grpc/framework/crust/implementations.py |
@@ -0,0 +1,364 @@ |
+# 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 Crust layer of RPC Framework.""" |
+ |
+from grpc.framework.common import cardinality |
+from grpc.framework.common import style |
+from grpc.framework.crust import _calls |
+from grpc.framework.crust import _service |
+from grpc.framework.interfaces.base import base |
+from grpc.framework.interfaces.face import face |
+ |
+ |
+class _BaseServicer(base.Servicer): |
+ |
+ def __init__(self, adapted_methods, adapted_multi_method): |
+ self._adapted_methods = adapted_methods |
+ self._adapted_multi_method = adapted_multi_method |
+ |
+ def service(self, group, method, context, output_operator): |
+ adapted_method = self._adapted_methods.get((group, method), None) |
+ if adapted_method is not None: |
+ return adapted_method(output_operator, context) |
+ elif self._adapted_multi_method is not None: |
+ try: |
+ return self._adapted_multi_method( |
+ group, method, output_operator, context) |
+ except face.NoSuchMethodError: |
+ raise base.NoSuchMethodError(None, None) |
+ else: |
+ raise base.NoSuchMethodError(None, None) |
+ |
+ |
+class _UnaryUnaryMultiCallable(face.UnaryUnaryMultiCallable): |
+ |
+ def __init__(self, end, group, method, pool): |
+ self._end = end |
+ self._group = group |
+ self._method = method |
+ self._pool = pool |
+ |
+ def __call__( |
+ self, request, timeout, metadata=None, with_call=False, |
+ protocol_options=None): |
+ return _calls.blocking_unary_unary( |
+ self._end, self._group, self._method, timeout, with_call, |
+ protocol_options, metadata, request) |
+ |
+ def future(self, request, timeout, metadata=None, protocol_options=None): |
+ return _calls.future_unary_unary( |
+ self._end, self._group, self._method, timeout, protocol_options, |
+ metadata, request) |
+ |
+ def event( |
+ self, request, receiver, abortion_callback, timeout, |
+ metadata=None, protocol_options=None): |
+ return _calls.event_unary_unary( |
+ self._end, self._group, self._method, timeout, protocol_options, |
+ metadata, request, receiver, abortion_callback, self._pool) |
+ |
+ |
+class _UnaryStreamMultiCallable(face.UnaryStreamMultiCallable): |
+ |
+ def __init__(self, end, group, method, pool): |
+ self._end = end |
+ self._group = group |
+ self._method = method |
+ self._pool = pool |
+ |
+ def __call__(self, request, timeout, metadata=None, protocol_options=None): |
+ return _calls.inline_unary_stream( |
+ self._end, self._group, self._method, timeout, protocol_options, |
+ metadata, request) |
+ |
+ def event( |
+ self, request, receiver, abortion_callback, timeout, |
+ metadata=None, protocol_options=None): |
+ return _calls.event_unary_stream( |
+ self._end, self._group, self._method, timeout, protocol_options, |
+ metadata, request, receiver, abortion_callback, self._pool) |
+ |
+ |
+class _StreamUnaryMultiCallable(face.StreamUnaryMultiCallable): |
+ |
+ def __init__(self, end, group, method, pool): |
+ self._end = end |
+ self._group = group |
+ self._method = method |
+ self._pool = pool |
+ |
+ def __call__( |
+ self, request_iterator, timeout, metadata=None, |
+ with_call=False, protocol_options=None): |
+ return _calls.blocking_stream_unary( |
+ self._end, self._group, self._method, timeout, with_call, |
+ protocol_options, metadata, request_iterator, self._pool) |
+ |
+ def future( |
+ self, request_iterator, timeout, metadata=None, protocol_options=None): |
+ return _calls.future_stream_unary( |
+ self._end, self._group, self._method, timeout, protocol_options, |
+ metadata, request_iterator, self._pool) |
+ |
+ def event( |
+ self, receiver, abortion_callback, timeout, metadata=None, |
+ protocol_options=None): |
+ return _calls.event_stream_unary( |
+ self._end, self._group, self._method, timeout, protocol_options, |
+ metadata, receiver, abortion_callback, self._pool) |
+ |
+ |
+class _StreamStreamMultiCallable(face.StreamStreamMultiCallable): |
+ |
+ def __init__(self, end, group, method, pool): |
+ self._end = end |
+ self._group = group |
+ self._method = method |
+ self._pool = pool |
+ |
+ def __call__( |
+ self, request_iterator, timeout, metadata=None, protocol_options=None): |
+ return _calls.inline_stream_stream( |
+ self._end, self._group, self._method, timeout, protocol_options, |
+ metadata, request_iterator, self._pool) |
+ |
+ def event( |
+ self, receiver, abortion_callback, timeout, metadata=None, |
+ protocol_options=None): |
+ return _calls.event_stream_stream( |
+ self._end, self._group, self._method, timeout, protocol_options, |
+ metadata, receiver, abortion_callback, self._pool) |
+ |
+ |
+class _GenericStub(face.GenericStub): |
+ """An face.GenericStub implementation.""" |
+ |
+ def __init__(self, end, pool): |
+ self._end = end |
+ self._pool = pool |
+ |
+ def blocking_unary_unary( |
+ self, group, method, request, timeout, metadata=None, |
+ with_call=None, protocol_options=None): |
+ return _calls.blocking_unary_unary( |
+ self._end, group, method, timeout, with_call, protocol_options, |
+ metadata, request) |
+ |
+ def future_unary_unary( |
+ self, group, method, request, timeout, metadata=None, |
+ protocol_options=None): |
+ return _calls.future_unary_unary( |
+ self._end, group, method, timeout, protocol_options, metadata, request) |
+ |
+ def inline_unary_stream( |
+ self, group, method, request, timeout, metadata=None, |
+ protocol_options=None): |
+ return _calls.inline_unary_stream( |
+ self._end, group, method, timeout, protocol_options, metadata, request) |
+ |
+ def blocking_stream_unary( |
+ self, group, method, request_iterator, timeout, metadata=None, |
+ with_call=None, protocol_options=None): |
+ return _calls.blocking_stream_unary( |
+ self._end, group, method, timeout, with_call, protocol_options, |
+ metadata, request_iterator, self._pool) |
+ |
+ def future_stream_unary( |
+ self, group, method, request_iterator, timeout, metadata=None, |
+ protocol_options=None): |
+ return _calls.future_stream_unary( |
+ self._end, group, method, timeout, protocol_options, metadata, |
+ request_iterator, self._pool) |
+ |
+ def inline_stream_stream( |
+ self, group, method, request_iterator, timeout, metadata=None, |
+ protocol_options=None): |
+ return _calls.inline_stream_stream( |
+ self._end, group, method, timeout, protocol_options, metadata, |
+ request_iterator, self._pool) |
+ |
+ def event_unary_unary( |
+ self, group, method, request, receiver, abortion_callback, timeout, |
+ metadata=None, protocol_options=None): |
+ return _calls.event_unary_unary( |
+ self._end, group, method, timeout, protocol_options, metadata, request, |
+ receiver, abortion_callback, self._pool) |
+ |
+ def event_unary_stream( |
+ self, group, method, request, receiver, abortion_callback, timeout, |
+ metadata=None, protocol_options=None): |
+ return _calls.event_unary_stream( |
+ self._end, group, method, timeout, protocol_options, metadata, request, |
+ receiver, abortion_callback, self._pool) |
+ |
+ def event_stream_unary( |
+ self, group, method, receiver, abortion_callback, timeout, |
+ metadata=None, protocol_options=None): |
+ return _calls.event_stream_unary( |
+ self._end, group, method, timeout, protocol_options, metadata, receiver, |
+ abortion_callback, self._pool) |
+ |
+ def event_stream_stream( |
+ self, group, method, receiver, abortion_callback, timeout, |
+ metadata=None, protocol_options=None): |
+ return _calls.event_stream_stream( |
+ self._end, group, method, timeout, protocol_options, metadata, receiver, |
+ abortion_callback, self._pool) |
+ |
+ def unary_unary(self, group, method): |
+ return _UnaryUnaryMultiCallable(self._end, group, method, self._pool) |
+ |
+ def unary_stream(self, group, method): |
+ return _UnaryStreamMultiCallable(self._end, group, method, self._pool) |
+ |
+ def stream_unary(self, group, method): |
+ return _StreamUnaryMultiCallable(self._end, group, method, self._pool) |
+ |
+ def stream_stream(self, group, method): |
+ return _StreamStreamMultiCallable(self._end, group, method, self._pool) |
+ |
+ |
+class _DynamicStub(face.DynamicStub): |
+ """An face.DynamicStub implementation.""" |
+ |
+ def __init__(self, end, group, cardinalities, pool): |
+ self._end = end |
+ self._group = group |
+ self._cardinalities = cardinalities |
+ self._pool = pool |
+ |
+ def __getattr__(self, attr): |
+ method_cardinality = self._cardinalities.get(attr) |
+ if method_cardinality is cardinality.Cardinality.UNARY_UNARY: |
+ return _UnaryUnaryMultiCallable(self._end, self._group, attr, self._pool) |
+ elif method_cardinality is cardinality.Cardinality.UNARY_STREAM: |
+ return _UnaryStreamMultiCallable(self._end, self._group, attr, self._pool) |
+ elif method_cardinality is cardinality.Cardinality.STREAM_UNARY: |
+ return _StreamUnaryMultiCallable(self._end, self._group, attr, self._pool) |
+ elif method_cardinality is cardinality.Cardinality.STREAM_STREAM: |
+ return _StreamStreamMultiCallable( |
+ self._end, self._group, 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_unary_unary( |
+ method_implementation.unary_unary_inline, pool) |
+ elif method_implementation.cardinality is cardinality.Cardinality.UNARY_STREAM: |
+ adapted_implementations[name] = _service.adapt_inline_unary_stream( |
+ method_implementation.unary_stream_inline, pool) |
+ elif method_implementation.cardinality is cardinality.Cardinality.STREAM_UNARY: |
+ adapted_implementations[name] = _service.adapt_inline_stream_unary( |
+ method_implementation.stream_unary_inline, pool) |
+ elif method_implementation.cardinality is cardinality.Cardinality.STREAM_STREAM: |
+ adapted_implementations[name] = _service.adapt_inline_stream_stream( |
+ 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_unary_unary( |
+ method_implementation.unary_unary_event, pool) |
+ elif method_implementation.cardinality is cardinality.Cardinality.UNARY_STREAM: |
+ adapted_implementations[name] = _service.adapt_event_unary_stream( |
+ method_implementation.unary_stream_event, pool) |
+ elif method_implementation.cardinality is cardinality.Cardinality.STREAM_UNARY: |
+ adapted_implementations[name] = _service.adapt_event_stream_unary( |
+ method_implementation.stream_unary_event, pool) |
+ elif method_implementation.cardinality is cardinality.Cardinality.STREAM_STREAM: |
+ adapted_implementations[name] = _service.adapt_event_stream_stream( |
+ method_implementation.stream_stream_event, pool) |
+ return adapted_implementations |
+ |
+ |
+def servicer(method_implementations, multi_method_implementation, pool): |
+ """Creates a base.Servicer. |
+ |
+ It is guaranteed that any passed face.MultiMethodImplementation will |
+ only be called to service an RPC if there is no |
+ face.MethodImplementation for the RPC method in the passed |
+ method_implementations dictionary. |
+ |
+ Args: |
+ method_implementations: A dictionary from RPC method name to |
+ face.MethodImplementation object to be used to service the named |
+ RPC method. |
+ multi_method_implementation: An face.MultiMethodImplementation to be |
+ used to service any RPCs not serviced by the |
+ face.MethodImplementations given in the method_implementations |
+ dictionary, or None. |
+ pool: A thread pool. |
+ |
+ Returns: |
+ A base.Servicer that services RPCs via the given implementations. |
+ """ |
+ adapted_implementations = _adapt_method_implementations( |
+ method_implementations, pool) |
+ if multi_method_implementation is None: |
+ adapted_multi_method_implementation = None |
+ else: |
+ adapted_multi_method_implementation = _service.adapt_multi_method( |
+ multi_method_implementation, pool) |
+ return _BaseServicer( |
+ adapted_implementations, adapted_multi_method_implementation) |
+ |
+ |
+def generic_stub(end, pool): |
+ """Creates an face.GenericStub. |
+ |
+ Args: |
+ end: A base.End. |
+ pool: A futures.ThreadPoolExecutor. |
+ |
+ Returns: |
+ A face.GenericStub that performs RPCs via the given base.End. |
+ """ |
+ return _GenericStub(end, pool) |
+ |
+ |
+def dynamic_stub(end, group, cardinalities, pool): |
+ """Creates an face.DynamicStub. |
+ |
+ Args: |
+ end: A base.End. |
+ group: The group identifier for all RPCs to be made with the created |
+ face.DynamicStub. |
+ cardinalities: A dict from method identifier to cardinality.Cardinality |
+ value identifying the cardinality of every RPC method to be supported by |
+ the created face.DynamicStub. |
+ pool: A futures.ThreadPoolExecutor. |
+ |
+ Returns: |
+ A face.DynamicStub that performs RPCs via the given base.End. |
+ """ |
+ return _DynamicStub(end, group, cardinalities, pool) |