Handle ipv6 literal zookeeper addresses
If you use a ipv6 literal as the host: parameter in zookeeper-services section, it gets incorretly concatentated with the port when building the host list. Detect ipv6 literals and quote them with rfc2732 []'s when building the host string. Change-Id: I49a749142e8031be37a08960bf645faca4e97149
This commit is contained in:
committed by
James E. Blair
parent
fd5915a070
commit
ae784c57a2
@@ -43,6 +43,23 @@ class TestZooKeeper(tests.DBTestCase):
|
|||||||
self.assertEqual('127.0.0.1:2181/test1,127.0.0.2:2182/test2',
|
self.assertEqual('127.0.0.1:2181/test1,127.0.0.2:2182/test2',
|
||||||
zk.buildZooKeeperHosts(hosts))
|
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):
|
def test_imageBuildLock(self):
|
||||||
path = self.zk._imageBuildLockPath("ubuntu-trusty")
|
path = self.zk._imageBuildLockPath("ubuntu-trusty")
|
||||||
with self.zk.imageBuildLock("ubuntu-trusty", blocking=False):
|
with self.zk.imageBuildLock("ubuntu-trusty", blocking=False):
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
from contextlib import contextmanager
|
from contextlib import contextmanager
|
||||||
from copy import copy
|
from copy import copy
|
||||||
import abc
|
import abc
|
||||||
|
import ipaddress
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
import time
|
import time
|
||||||
@@ -101,6 +102,10 @@ class ZooKeeperConnectionConfig(object):
|
|||||||
self.port = port
|
self.port = port
|
||||||
self.chroot = chroot or ''
|
self.chroot = chroot or ''
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return "host=%s port=%s chroot=%s" % \
|
||||||
|
(self.host, self.port, self.chroot)
|
||||||
|
|
||||||
|
|
||||||
def buildZooKeeperHosts(host_list):
|
def buildZooKeeperHosts(host_list):
|
||||||
'''
|
'''
|
||||||
@@ -114,7 +119,16 @@ def buildZooKeeperHosts(host_list):
|
|||||||
raise Exception("'host_list' must be a list")
|
raise Exception("'host_list' must be a list")
|
||||||
hosts = []
|
hosts = []
|
||||||
for host_def in host_list:
|
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)
|
hosts.append(host)
|
||||||
return ",".join(hosts)
|
return ",".join(hosts)
|
||||||
|
|
||||||
|
|||||||
5
releasenotes/notes/zk-ipv6-literal-157af417eef9dc6a.yaml
Normal file
5
releasenotes/notes/zk-ipv6-literal-157af417eef9dc6a.yaml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
fixes:
|
||||||
|
- |
|
||||||
|
Zookeeper hosts specified as IPv6 literals will now be configured
|
||||||
|
correctly.
|
||||||
Reference in New Issue
Block a user