diff options
Diffstat (limited to 'oslo_messaging/rpc/dispatcher.py')
-rw-r--r-- | oslo_messaging/rpc/dispatcher.py | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/oslo_messaging/rpc/dispatcher.py b/oslo_messaging/rpc/dispatcher.py index 86e2e66..61ce020 100644 --- a/oslo_messaging/rpc/dispatcher.py +++ b/oslo_messaging/rpc/dispatcher.py @@ -22,6 +22,7 @@ import logging import sys import threading +from oslo_config import cfg from oslo_utils import eventletutils from oslo_messaging import _utils as utils @@ -30,6 +31,13 @@ from oslo_messaging import serializer as msg_serializer from oslo_messaging import server as msg_server from oslo_messaging import target as msg_target +_dispatcher_opts = [ + cfg.BoolOpt('rpc_ping_enabled', + default=False, + help='Add an endpoint to answer to ping calls. ' + 'Endpoint is named oslo_rpc_server_ping'), +] + __all__ = [ 'NoSuchMethod', 'RPCAccessPolicyBase', @@ -45,6 +53,11 @@ __all__ = [ LOG = logging.getLogger(__name__) +class PingEndpoint(object): + def oslo_rpc_server_ping(self, ctxt, **kwargs): + return 'pong' + + class ExpectedException(Exception): """Encapsulates an expected exception raised by an RPC endpoint @@ -153,8 +166,11 @@ class RPCDispatcher(dispatcher.DispatcherBase): :param endpoints: list of endpoint objects for dispatching to :param serializer: optional message serializer """ + cfg.CONF.register_opts(_dispatcher_opts) + oslo_rpc_server_ping = None for ep in endpoints: + # Check if we have an attribute named 'target' target = getattr(ep, 'target', None) if target and not isinstance(target, msg_target.Target): errmsg = "'target' is a reserved Endpoint attribute used" + \ @@ -163,7 +179,27 @@ class RPCDispatcher(dispatcher.DispatcherBase): " define an Endpoint method named 'target'" raise TypeError("%s: endpoint=%s" % (errmsg, ep)) + # Check if we have an attribute named 'oslo_rpc_server_ping' + oslo_rpc_server_ping = getattr(ep, 'oslo_rpc_server_ping', None) + if oslo_rpc_server_ping: + errmsg = "'oslo_rpc_server_ping' is a reserved Endpoint" + \ + " attribute which can be use to ping the" + \ + " endpoint. Please avoid using any oslo_* " + \ + " naming." + LOG.warning("%s (endpoint=%s)" % (errmsg, ep)) + self.endpoints = endpoints + + # Add ping endpoint if enabled in config + if cfg.CONF.rpc_ping_enabled: + if oslo_rpc_server_ping: + LOG.warning("rpc_ping_enabled=True in config but " + "oslo_rpc_server_ping is already declared " + "in an other Endpoint. Not enabling rpc_ping " + "Endpoint.") + else: + self.endpoints.append(PingEndpoint()) + self.serializer = serializer or msg_serializer.NoOpSerializer() self._default_target = msg_target.Target() if access_policy is not None: |