| Index: third_party/grpc/src/python/grpcio_health_checking/grpc/health/v1/health.py
|
| diff --git a/third_party/grpc/src/python/grpcio_health_checking/grpc/health/v1/health.py b/third_party/grpc/src/python/grpcio_health_checking/grpc/health/v1/health.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..60cbd644330b2ac48126fed40c58768de087c007
|
| --- /dev/null
|
| +++ b/third_party/grpc/src/python/grpcio_health_checking/grpc/health/v1/health.py
|
| @@ -0,0 +1,129 @@
|
| +# Copyright 2015-2016, 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.
|
| +
|
| +"""Reference implementation for health checking in gRPC Python."""
|
| +
|
| +import abc
|
| +import enum
|
| +import threading
|
| +
|
| +from grpc.health.v1 import health_pb2
|
| +
|
| +
|
| +@enum.unique
|
| +class HealthStatus(enum.Enum):
|
| + """Statuses for a service mirroring the reference health.proto's values."""
|
| + UNKNOWN = health_pb2.HealthCheckResponse.UNKNOWN
|
| + SERVING = health_pb2.HealthCheckResponse.SERVING
|
| + NOT_SERVING = health_pb2.HealthCheckResponse.NOT_SERVING
|
| +
|
| +
|
| +class _HealthServicer(health_pb2.EarlyAdopterHealthServicer):
|
| + """Servicer handling RPCs for service statuses."""
|
| +
|
| + def __init__(self):
|
| + self._server_status_lock = threading.Lock()
|
| + self._server_status = {}
|
| +
|
| + def Check(self, request, context):
|
| + with self._server_status_lock:
|
| + if request.service not in self._server_status:
|
| + # TODO(atash): once the Python API has a way of setting the server
|
| + # status, bring us into conformance with the health check spec by
|
| + # returning the NOT_FOUND status here.
|
| + raise NotImplementedError()
|
| + else:
|
| + return health_pb2.HealthCheckResponse(
|
| + status=self._server_status[request.service].value)
|
| +
|
| + def set(service, status):
|
| + if not isinstance(status, HealthStatus):
|
| + raise TypeError('expected grpc.health.v1.health.HealthStatus '
|
| + 'for argument `status` but got {}'.format(status))
|
| + with self._server_status_lock:
|
| + self._server_status[service] = status
|
| +
|
| +
|
| +class HealthServer(health_pb2.EarlyAdopterHealthServer):
|
| + """Interface for the reference gRPC Python health server."""
|
| + __metaclass__ = abc.ABCMeta
|
| +
|
| + @abc.abstractmethod
|
| + def start(self):
|
| + raise NotImplementedError()
|
| +
|
| + @abc.abstractmethod
|
| + def stop(self):
|
| + raise NotImplementedError()
|
| +
|
| + @abc.abstractmethod
|
| + def set(self, service, status):
|
| + """Set the status of the given service.
|
| +
|
| + Args:
|
| + service (str): service name of the service to set the reported status of
|
| + status (HealthStatus): status to set for the specified service
|
| + """
|
| + raise NotImplementedError()
|
| +
|
| +
|
| +class _HealthServerImplementation(HealthServer):
|
| + """Implementation for the reference gRPC Python health server."""
|
| +
|
| + def __init__(self, server, servicer):
|
| + self._server = server
|
| + self._servicer = servicer
|
| +
|
| + def start(self):
|
| + self._server.start()
|
| +
|
| + def stop(self):
|
| + self._server.stop()
|
| +
|
| + def set(self, service, status):
|
| + self._servicer.set(service, status)
|
| +
|
| +
|
| +def create_Health_server(port, private_key=None, certificate_chain=None):
|
| + """Get a HealthServer instance.
|
| +
|
| + Args:
|
| + port (int): port number passed through to health_pb2 server creation
|
| + routine.
|
| + private_key (str): to-be-created server's desired private key
|
| + certificate_chain (str): to-be-created server's desired certificate chain
|
| +
|
| + Returns:
|
| + An instance of HealthServer (conforming thus to
|
| + EarlyAdopterHealthServer and providing a method to set server status)."""
|
| + servicer = _HealthServicer()
|
| + server = health_pb2.early_adopter_create_Health_server(
|
| + servicer, port=port, private_key=private_key,
|
| + certificate_chain=certificate_chain)
|
| + return _HealthServerImplementation(server, servicer)
|
|
|