feat(core): allow multiple endpoints in KazooClient hosts arg

The hosts arg to KazooClient now supports a list of multiple endpoints.

Closes #411
This commit is contained in:
Edward Ribeiro 2017-03-28 16:16:26 -03:00
parent 196079611d
commit 72a8d96ca1
2 changed files with 66 additions and 4 deletions

View File

@ -2,12 +2,22 @@ from six.moves import urllib_parse
def collect_hosts(hosts):
"""Collect a set of hosts and an optional chroot from a string."""
host_ports, chroot = hosts.partition("/")[::2]
chroot = "/" + chroot if chroot else None
"""
Collect a set of hosts and an optional chroot from
a string or a list of strings.
"""
if isinstance(hosts, list):
if hosts[-1].strip().startswith('/'):
host_ports, chroot = hosts[:-1], hosts[-1]
else:
host_ports, chroot = hosts, None
else:
host_ports, chroot = hosts.partition("/")[::2]
host_ports = host_ports.split(",")
chroot = "/" + chroot if chroot else None
result = []
for host_port in host_ports.split(","):
for host_port in host_ports:
# put all complexity of dealing with
# IPv4 & IPv6 address:port on the urlsplit
res = urllib_parse.urlsplit("xxx://" + host_port)

52
kazoo/tests/test_hosts.py Normal file
View File

@ -0,0 +1,52 @@
from unittest import TestCase
from kazoo.hosts import collect_hosts
class HostsTestCase(TestCase):
def test_ipv4(self):
hosts, chroot = collect_hosts('127.0.0.1:2181, 192.168.1.2:2181, \
132.254.111.10:2181')
self.assertEquals([('127.0.0.1', 2181),
('192.168.1.2', 2181),
('132.254.111.10', 2181)], hosts)
self.assertEquals(None, chroot)
hosts, chroot = collect_hosts(['127.0.0.1:2181',
'192.168.1.2:2181',
'132.254.111.10:2181'])
self.assertEquals([('127.0.0.1', 2181),
('192.168.1.2', 2181),
('132.254.111.10', 2181)], hosts)
self.assertEquals(None, chroot)
def test_ipv6(self):
hosts, chroot = collect_hosts('[fe80::200:5aee:feaa:20a2]:2181')
self.assertEquals([('fe80::200:5aee:feaa:20a2', 2181)], hosts)
self.assertEquals(None, chroot)
hosts, chroot = collect_hosts(['[fe80::200:5aee:feaa:20a2]:2181'])
self.assertEquals([('fe80::200:5aee:feaa:20a2', 2181)], hosts)
self.assertEquals(None, chroot)
def test_hosts_list(self):
hosts, chroot = collect_hosts('zk01:2181, zk02:2181, zk03:2181')
expected1 = [('zk01', 2181), ('zk02', 2181), ('zk03', 2181)]
self.assertEquals(expected1, hosts)
self.assertEquals(None, chroot)
hosts, chroot = collect_hosts(['zk01:2181', 'zk02:2181', 'zk03:2181'])
self.assertEquals(expected1, hosts)
self.assertEquals(None, chroot)
expected2 = '/test'
hosts, chroot = collect_hosts('zk01:2181, zk02:2181, zk03:2181/test')
self.assertEquals(expected1, hosts)
self.assertEquals(expected2, chroot)
hosts, chroot = collect_hosts(['zk01:2181',
'zk02:2181',
'zk03:2181', '/test'])
self.assertEquals(expected1, hosts)
self.assertEquals(expected2, chroot)