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:
parent
196079611d
commit
72a8d96ca1
|
@ -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)
|
||||
|
|
|
@ -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)
|
Loading…
Reference in New Issue