diff --git a/nodepool/tests/unit/test_zk.py b/nodepool/tests/unit/test_zk.py index 06cd6bba2..fa7a25753 100644 --- a/nodepool/tests/unit/test_zk.py +++ b/nodepool/tests/unit/test_zk.py @@ -43,6 +43,23 @@ class TestZooKeeper(tests.DBTestCase): self.assertEqual('127.0.0.1:2181/test1,127.0.0.2:2182/test2', zk.buildZooKeeperHosts(hosts)) + def test_buildZooKeeperHosts_ipv6(self): + hosts = [ + zk.ZooKeeperConnectionConfig( + '2001:4800:7817:103:be76:4eff:fe04:e359', port=2181, + chroot='/test1'), + zk.ZooKeeperConnectionConfig( + '[2002:4800:7817:103:be76:4eff:fe04:e359]', port=2181, + chroot='/test2'), + zk.ZooKeeperConnectionConfig('127.0.0.2', port=2182, + chroot='/test3') + ] + self.assertEqual(( + '[2001:4800:7817:103:be76:4eff:fe04:e359]:2181/test1,' + '[2002:4800:7817:103:be76:4eff:fe04:e359]:2181/test2,' + '127.0.0.2:2182/test3' + ), zk.buildZooKeeperHosts(hosts)) + def test_imageBuildLock(self): path = self.zk._imageBuildLockPath("ubuntu-trusty") with self.zk.imageBuildLock("ubuntu-trusty", blocking=False): diff --git a/nodepool/zk.py b/nodepool/zk.py index ad3e7aea9..a687c35b0 100644 --- a/nodepool/zk.py +++ b/nodepool/zk.py @@ -13,6 +13,7 @@ from contextlib import contextmanager from copy import copy import abc +import ipaddress import json import logging import time @@ -101,6 +102,10 @@ class ZooKeeperConnectionConfig(object): self.port = port self.chroot = chroot or '' + def __repr__(self): + return "host=%s port=%s chroot=%s" % \ + (self.host, self.port, self.chroot) + def buildZooKeeperHosts(host_list): ''' @@ -114,7 +119,16 @@ def buildZooKeeperHosts(host_list): raise Exception("'host_list' must be a list") hosts = [] for host_def in host_list: - host = '%s:%s%s' % (host_def.host, host_def.port, host_def.chroot) + h = host_def.host + # If this looks like a ipv6 literal address, make sure it's + # quoted in []'s + try: + addr = ipaddress.ip_address(host_def.host) + if addr.version == 6: + h = '[%s]' % addr + except ValueError: + pass + host = '%s:%s%s' % (h, host_def.port, host_def.chroot) hosts.append(host) return ",".join(hosts) diff --git a/releasenotes/notes/zk-ipv6-literal-157af417eef9dc6a.yaml b/releasenotes/notes/zk-ipv6-literal-157af417eef9dc6a.yaml new file mode 100644 index 000000000..f6e71581b --- /dev/null +++ b/releasenotes/notes/zk-ipv6-literal-157af417eef9dc6a.yaml @@ -0,0 +1,5 @@ +--- +fixes: + - | + Zookeeper hosts specified as IPv6 literals will now be configured + correctly.