@@ -48,13 +48,16 @@ def __init__(
4848 default_noreply = True ,
4949 encoding = "ascii" ,
5050 tls_context = None ,
51+ enable_auto_discovery = False
5152 ):
5253 """
5354 Constructor.
5455
5556 Args:
5657 servers: list() of tuple(hostname, port) or string containing a UNIX
5758 socket path.
59+ Or If enable_auto_discovery is set, just tuple(hostname, port) or UNIX socket path string
60+ of configuration node would suffice.
5861 hasher: optional class three functions ``get_node``, ``add_node``,
5962 and ``remove_node``
6063 defaults to Rendezvous (HRW) hash.
@@ -70,12 +73,14 @@ def __init__(
7073 dead_timeout (float): Time in seconds before attempting to add a node
7174 back in the pool.
7275 encoding: optional str, controls data encoding (defaults to 'ascii').
76+ enable_auto_discovery (bool): If enabled, nodes would be discovered from the configuration endpoint.
7377
7478 Further arguments are interpreted as for :py:class:`.Client`
7579 constructor.
7680 """
7781 self .clients = {}
7882 self .retry_attempts = retry_attempts
83+ self .connect_timeout = connect_timeout
7984 self .retry_timeout = retry_timeout
8085 self .dead_timeout = dead_timeout
8186 self .use_pooling = use_pooling
@@ -112,11 +117,18 @@ def __init__(
112117 "lock_generator" : lock_generator ,
113118 }
114119 )
115-
116- for server in servers :
117- self .add_server (normalize_server_spec (server ))
118120 self .encoding = encoding
119121 self .tls_context = tls_context
122+ if not isinstance (servers , list ):
123+ if not enable_auto_discovery :
124+ raise ValueError (f"Auto Discovery should be enabled if configuration endpoint is used: { servers !r} " )
125+
126+ if enable_auto_discovery and servers is not None :
127+ # AutoDiscovery is enabled and a address of configuration node is provided
128+ servers = self ._auto_discover (normalize_server_spec (servers ))
129+
130+ for server in servers :
131+ self .add_server (normalize_server_spec (server ))
120132
121133 def _make_client_key (self , server ):
122134 if isinstance (server , (list , tuple )) and len (server ) == 2 :
@@ -340,6 +352,12 @@ def _set_many(self, client, values, *args, **kwargs):
340352 succeeded = [key for key in values if key not in failed ]
341353 return succeeded , failed , None
342354
355+ def _auto_discover (self , server ):
356+ _class = PooledClient if self .use_pooling else self .client_class
357+ client = _class (server )
358+ nodes = client .auto_discover ()
359+ return nodes
360+
343361 def close (self ):
344362 for client in self .clients .values ():
345363 self ._safely_run_func (client , client .close , False )
0 commit comments