| Index: third_party/grpc/src/python/grpcio/grpc/beta/implementations.py
|
| diff --git a/third_party/grpc/src/python/grpcio/grpc/beta/implementations.py b/third_party/grpc/src/python/grpcio/grpc/beta/implementations.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..a0ca330d2c02bda4883a5643daaf08b1c0edf53d
|
| --- /dev/null
|
| +++ b/third_party/grpc/src/python/grpcio/grpc/beta/implementations.py
|
| @@ -0,0 +1,425 @@
|
| +# 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 Beta API of gRPC Python."""
|
| +
|
| +# threading is referenced from specification in this module.
|
| +import abc
|
| +import enum
|
| +import threading # pylint: disable=unused-import
|
| +
|
| +# cardinality and face are referenced from specification in this module.
|
| +from grpc._adapter import _intermediary_low
|
| +from grpc._adapter import _low
|
| +from grpc._adapter import _types
|
| +from grpc.beta import _connectivity_channel
|
| +from grpc.beta import _server
|
| +from grpc.beta import _stub
|
| +from grpc.beta import interfaces
|
| +from grpc.framework.common import cardinality # pylint: disable=unused-import
|
| +from grpc.framework.interfaces.face import face # pylint: disable=unused-import
|
| +
|
| +_CHANNEL_SUBSCRIPTION_CALLBACK_ERROR_LOG_MESSAGE = (
|
| + 'Exception calling channel subscription callback!')
|
| +
|
| +
|
| +class ChannelCredentials(object):
|
| + """A value encapsulating the data required to create a secure Channel.
|
| +
|
| + This class and its instances have no supported interface - it exists to define
|
| + the type of its instances and its instances exist to be passed to other
|
| + functions.
|
| + """
|
| +
|
| + def __init__(self, low_credentials):
|
| + self._low_credentials = low_credentials
|
| +
|
| +
|
| +def ssl_channel_credentials(root_certificates, private_key, certificate_chain):
|
| + """Creates a ChannelCredentials for use with an SSL-enabled Channel.
|
| +
|
| + Args:
|
| + root_certificates: The PEM-encoded root certificates or None to ask for
|
| + them to be retrieved from a default location.
|
| + private_key: The PEM-encoded private key to use or None if no private key
|
| + should be used.
|
| + certificate_chain: The PEM-encoded certificate chain to use or None if no
|
| + certificate chain should be used.
|
| +
|
| + Returns:
|
| + A ChannelCredentials for use with an SSL-enabled Channel.
|
| + """
|
| + return ChannelCredentials(_low.channel_credentials_ssl(
|
| + root_certificates, private_key, certificate_chain))
|
| +
|
| +
|
| +class CallCredentials(object):
|
| + """A value encapsulating data asserting an identity over an *established*
|
| + channel. May be composed with ChannelCredentials to always assert identity for
|
| + every call over that channel.
|
| +
|
| + This class and its instances have no supported interface - it exists to define
|
| + the type of its instances and its instances exist to be passed to other
|
| + functions.
|
| + """
|
| +
|
| + def __init__(self, low_credentials):
|
| + self._low_credentials = low_credentials
|
| +
|
| +
|
| +def metadata_call_credentials(metadata_plugin, name=None):
|
| + """Construct CallCredentials from an interfaces.GRPCAuthMetadataPlugin.
|
| +
|
| + Args:
|
| + metadata_plugin: An interfaces.GRPCAuthMetadataPlugin to use in constructing
|
| + the CallCredentials object.
|
| +
|
| + Returns:
|
| + A CallCredentials object for use in a GRPCCallOptions object.
|
| + """
|
| + if name is None:
|
| + name = metadata_plugin.__name__
|
| + return CallCredentials(
|
| + _low.call_credentials_metadata_plugin(metadata_plugin, name))
|
| +
|
| +def composite_call_credentials(call_credentials, additional_call_credentials):
|
| + """Compose two CallCredentials to make a new one.
|
| +
|
| + Args:
|
| + call_credentials: A CallCredentials object.
|
| + additional_call_credentials: Another CallCredentials object to compose on
|
| + top of call_credentials.
|
| +
|
| + Returns:
|
| + A CallCredentials object for use in a GRPCCallOptions object.
|
| + """
|
| + return CallCredentials(
|
| + _low.call_credentials_composite(
|
| + call_credentials._low_credentials,
|
| + additional_call_credentials._low_credentials))
|
| +
|
| +def composite_channel_credentials(channel_credentials,
|
| + additional_call_credentials):
|
| + """Compose ChannelCredentials on top of client credentials to make a new one.
|
| +
|
| + Args:
|
| + channel_credentials: A ChannelCredentials object.
|
| + additional_call_credentials: A CallCredentials object to compose on
|
| + top of channel_credentials.
|
| +
|
| + Returns:
|
| + A ChannelCredentials object for use in a GRPCCallOptions object.
|
| + """
|
| + return ChannelCredentials(
|
| + _low.channel_credentials_composite(
|
| + channel_credentials._low_credentials,
|
| + additional_call_credentials._low_credentials))
|
| +
|
| +
|
| +class Channel(object):
|
| + """A channel to a remote host through which RPCs may be conducted.
|
| +
|
| + Only the "subscribe" and "unsubscribe" methods are supported for application
|
| + use. This class' instance constructor and all other attributes are
|
| + unsupported.
|
| + """
|
| +
|
| + def __init__(self, low_channel, intermediary_low_channel):
|
| + self._low_channel = low_channel
|
| + self._intermediary_low_channel = intermediary_low_channel
|
| + self._connectivity_channel = _connectivity_channel.ConnectivityChannel(
|
| + low_channel)
|
| +
|
| + def subscribe(self, callback, try_to_connect=None):
|
| + """Subscribes to this Channel's connectivity.
|
| +
|
| + Args:
|
| + callback: A callable to be invoked and passed an
|
| + interfaces.ChannelConnectivity identifying this Channel's connectivity.
|
| + The callable will be invoked immediately upon subscription and again for
|
| + every change to this Channel's connectivity thereafter until it is
|
| + unsubscribed.
|
| + try_to_connect: A boolean indicating whether or not this Channel should
|
| + attempt to connect if it is not already connected and ready to conduct
|
| + RPCs.
|
| + """
|
| + self._connectivity_channel.subscribe(callback, try_to_connect)
|
| +
|
| + def unsubscribe(self, callback):
|
| + """Unsubscribes a callback from this Channel's connectivity.
|
| +
|
| + Args:
|
| + callback: A callable previously registered with this Channel from having
|
| + been passed to its "subscribe" method.
|
| + """
|
| + self._connectivity_channel.unsubscribe(callback)
|
| +
|
| +
|
| +def insecure_channel(host, port):
|
| + """Creates an insecure Channel to a remote host.
|
| +
|
| + Args:
|
| + host: The name of the remote host to which to connect.
|
| + port: The port of the remote host to which to connect.
|
| +
|
| + Returns:
|
| + A Channel to the remote host through which RPCs may be conducted.
|
| + """
|
| + intermediary_low_channel = _intermediary_low.Channel(
|
| + '%s:%d' % (host, port), None)
|
| + return Channel(intermediary_low_channel._internal, intermediary_low_channel) # pylint: disable=protected-access
|
| +
|
| +
|
| +def secure_channel(host, port, channel_credentials):
|
| + """Creates a secure Channel to a remote host.
|
| +
|
| + Args:
|
| + host: The name of the remote host to which to connect.
|
| + port: The port of the remote host to which to connect.
|
| + channel_credentials: A ChannelCredentials.
|
| +
|
| + Returns:
|
| + A secure Channel to the remote host through which RPCs may be conducted.
|
| + """
|
| + intermediary_low_channel = _intermediary_low.Channel(
|
| + '%s:%d' % (host, port), channel_credentials._low_credentials)
|
| + return Channel(intermediary_low_channel._internal, intermediary_low_channel) # pylint: disable=protected-access
|
| +
|
| +
|
| +class StubOptions(object):
|
| + """A value encapsulating the various options for creation of a Stub.
|
| +
|
| + This class and its instances have no supported interface - it exists to define
|
| + the type of its instances and its instances exist to be passed to other
|
| + functions.
|
| + """
|
| +
|
| + def __init__(
|
| + self, host, request_serializers, response_deserializers,
|
| + metadata_transformer, thread_pool, thread_pool_size):
|
| + self.host = host
|
| + self.request_serializers = request_serializers
|
| + self.response_deserializers = response_deserializers
|
| + self.metadata_transformer = metadata_transformer
|
| + self.thread_pool = thread_pool
|
| + self.thread_pool_size = thread_pool_size
|
| +
|
| +_EMPTY_STUB_OPTIONS = StubOptions(
|
| + None, None, None, None, None, None)
|
| +
|
| +
|
| +def stub_options(
|
| + host=None, request_serializers=None, response_deserializers=None,
|
| + metadata_transformer=None, thread_pool=None, thread_pool_size=None):
|
| + """Creates a StubOptions value to be passed at stub creation.
|
| +
|
| + All parameters are optional and should always be passed by keyword.
|
| +
|
| + Args:
|
| + host: A host string to set on RPC calls.
|
| + request_serializers: A dictionary from service name-method name pair to
|
| + request serialization behavior.
|
| + response_deserializers: A dictionary from service name-method name pair to
|
| + response deserialization behavior.
|
| + metadata_transformer: A callable that given a metadata object produces
|
| + another metadata object to be used in the underlying communication on the
|
| + wire.
|
| + thread_pool: A thread pool to use in stubs.
|
| + thread_pool_size: The size of thread pool to create for use in stubs;
|
| + ignored if thread_pool has been passed.
|
| +
|
| + Returns:
|
| + A StubOptions value created from the passed parameters.
|
| + """
|
| + return StubOptions(
|
| + host, request_serializers, response_deserializers,
|
| + metadata_transformer, thread_pool, thread_pool_size)
|
| +
|
| +
|
| +def generic_stub(channel, options=None):
|
| + """Creates a face.GenericStub on which RPCs can be made.
|
| +
|
| + Args:
|
| + channel: A Channel for use by the created stub.
|
| + options: A StubOptions customizing the created stub.
|
| +
|
| + Returns:
|
| + A face.GenericStub on which RPCs can be made.
|
| + """
|
| + effective_options = _EMPTY_STUB_OPTIONS if options is None else options
|
| + return _stub.generic_stub(
|
| + channel._intermediary_low_channel, effective_options.host, # pylint: disable=protected-access
|
| + effective_options.metadata_transformer,
|
| + effective_options.request_serializers,
|
| + effective_options.response_deserializers, effective_options.thread_pool,
|
| + effective_options.thread_pool_size)
|
| +
|
| +
|
| +def dynamic_stub(channel, service, cardinalities, options=None):
|
| + """Creates a face.DynamicStub with which RPCs can be invoked.
|
| +
|
| + Args:
|
| + channel: A Channel for the returned face.DynamicStub to use.
|
| + service: The package-qualified full name of the service.
|
| + cardinalities: A dictionary from RPC method name to cardinality.Cardinality
|
| + value identifying the cardinality of the RPC method.
|
| + options: An optional StubOptions value further customizing the functionality
|
| + of the returned face.DynamicStub.
|
| +
|
| + Returns:
|
| + A face.DynamicStub with which RPCs can be invoked.
|
| + """
|
| + effective_options = StubOptions() if options is None else options
|
| + return _stub.dynamic_stub(
|
| + channel._intermediary_low_channel, effective_options.host, service, # pylint: disable=protected-access
|
| + cardinalities, effective_options.metadata_transformer,
|
| + effective_options.request_serializers,
|
| + effective_options.response_deserializers, effective_options.thread_pool,
|
| + effective_options.thread_pool_size)
|
| +
|
| +
|
| +class ServerCredentials(object):
|
| + """A value encapsulating the data required to open a secure port on a Server.
|
| +
|
| + This class and its instances have no supported interface - it exists to define
|
| + the type of its instances and its instances exist to be passed to other
|
| + functions.
|
| + """
|
| +
|
| + def __init__(self, low_credentials):
|
| + self._low_credentials = low_credentials
|
| +
|
| +
|
| +def ssl_server_credentials(
|
| + private_key_certificate_chain_pairs, root_certificates=None,
|
| + require_client_auth=False):
|
| + """Creates a ServerCredentials for use with an SSL-enabled Server.
|
| +
|
| + Args:
|
| + private_key_certificate_chain_pairs: A nonempty sequence each element of
|
| + which is a pair the first element of which is a PEM-encoded private key
|
| + and the second element of which is the corresponding PEM-encoded
|
| + certificate chain.
|
| + root_certificates: PEM-encoded client root certificates to be used for
|
| + verifying authenticated clients. If omitted, require_client_auth must also
|
| + be omitted or be False.
|
| + require_client_auth: A boolean indicating whether or not to require clients
|
| + to be authenticated. May only be True if root_certificates is not None.
|
| +
|
| + Returns:
|
| + A ServerCredentials for use with an SSL-enabled Server.
|
| + """
|
| + if len(private_key_certificate_chain_pairs) == 0:
|
| + raise ValueError(
|
| + 'At least one private key-certificate chain pairis required!')
|
| + elif require_client_auth and root_certificates is None:
|
| + raise ValueError(
|
| + 'Illegal to require client auth without providing root certificates!')
|
| + else:
|
| + return ServerCredentials(_low.server_credentials_ssl(
|
| + root_certificates, private_key_certificate_chain_pairs,
|
| + require_client_auth))
|
| +
|
| +
|
| +class ServerOptions(object):
|
| + """A value encapsulating the various options for creation of a Server.
|
| +
|
| + This class and its instances have no supported interface - it exists to define
|
| + the type of its instances and its instances exist to be passed to other
|
| + functions.
|
| + """
|
| +
|
| + def __init__(
|
| + self, multi_method_implementation, request_deserializers,
|
| + response_serializers, thread_pool, thread_pool_size, default_timeout,
|
| + maximum_timeout):
|
| + self.multi_method_implementation = multi_method_implementation
|
| + self.request_deserializers = request_deserializers
|
| + self.response_serializers = response_serializers
|
| + self.thread_pool = thread_pool
|
| + self.thread_pool_size = thread_pool_size
|
| + self.default_timeout = default_timeout
|
| + self.maximum_timeout = maximum_timeout
|
| +
|
| +_EMPTY_SERVER_OPTIONS = ServerOptions(
|
| + None, None, None, None, None, None, None)
|
| +
|
| +
|
| +def server_options(
|
| + multi_method_implementation=None, request_deserializers=None,
|
| + response_serializers=None, thread_pool=None, thread_pool_size=None,
|
| + default_timeout=None, maximum_timeout=None):
|
| + """Creates a ServerOptions value to be passed at server creation.
|
| +
|
| + All parameters are optional and should always be passed by keyword.
|
| +
|
| + Args:
|
| + multi_method_implementation: A face.MultiMethodImplementation to be called
|
| + to service an RPC if the server has no specific method implementation for
|
| + the name of the RPC for which service was requested.
|
| + request_deserializers: A dictionary from service name-method name pair to
|
| + request deserialization behavior.
|
| + response_serializers: A dictionary from service name-method name pair to
|
| + response serialization behavior.
|
| + thread_pool: A thread pool to use in stubs.
|
| + thread_pool_size: The size of thread pool to create for use in stubs;
|
| + ignored if thread_pool has been passed.
|
| + default_timeout: A duration in seconds to allow for RPC service when
|
| + servicing RPCs that did not include a timeout value when invoked.
|
| + maximum_timeout: A duration in seconds to allow for RPC service when
|
| + servicing RPCs no matter what timeout value was passed when the RPC was
|
| + invoked.
|
| +
|
| + Returns:
|
| + A StubOptions value created from the passed parameters.
|
| + """
|
| + return ServerOptions(
|
| + multi_method_implementation, request_deserializers, response_serializers,
|
| + thread_pool, thread_pool_size, default_timeout, maximum_timeout)
|
| +
|
| +
|
| +def server(service_implementations, options=None):
|
| + """Creates an interfaces.Server with which RPCs can be serviced.
|
| +
|
| + Args:
|
| + service_implementations: A dictionary from service name-method name pair to
|
| + face.MethodImplementation.
|
| + options: An optional ServerOptions value further customizing the
|
| + functionality of the returned Server.
|
| +
|
| + Returns:
|
| + An interfaces.Server with which RPCs can be serviced.
|
| + """
|
| + effective_options = _EMPTY_SERVER_OPTIONS if options is None else options
|
| + return _server.server(
|
| + service_implementations, effective_options.multi_method_implementation,
|
| + effective_options.request_deserializers,
|
| + effective_options.response_serializers, effective_options.thread_pool,
|
| + effective_options.thread_pool_size, effective_options.default_timeout,
|
| + effective_options.maximum_timeout)
|
|
|