import argparse
import datetime
import fcntl
+import ipaddress
import json
import logging
import os
else:
from urllib2 import urlopen, HTTPError
+if sys.version_info > (3, 0):
+ unicode = str
+
container_path = ''
cached_stdin = None
##################################
+def is_ipv6(address):
+ # type: (str) -> bool
+ if address.startswith('[') and address.endswith(']'):
+ address = address[1:-1]
+ try:
+ return ipaddress.ip_address(unicode(address)).version == 6
+ except ValueError:
+ logger.warning("Address: {} isn't a valid IP address".format(address))
+ return False
+
+
@default_image
def command_bootstrap():
# type: () -> int
mon_id = args.mon_id or hostname
mgr_id = args.mgr_id or generate_service_id()
logging.info('Cluster fsid: %s' % fsid)
+ ipv6 = False
l = FileLock(fsid)
l.acquire()
r = re.compile(r':(\d+)$')
base_ip = None
if args.mon_ip:
+ ipv6 = is_ipv6(args.mon_ip)
hasport = r.findall(args.mon_ip)
if hasport:
port = int(hasport[0])
if addr_arg[0] != '[' or addr_arg[-1] != ']':
raise Error('--mon-addrv value %s must use square backets' %
addr_arg)
+ ipv6 = addr_arg.count('[') > 1
for addr in addr_arg[1:-1].split(','):
hasport = r.findall(addr)
if not hasport:
logger.info('Setting mon public_network...')
cli(['config', 'set', 'mon', 'public_network', mon_network])
+ if ipv6:
+ logger.info('Enabling IPv6 (ms_bind_ipv6)')
+ cli(['config', 'set', 'global', 'ms_bind_ipv6', 'true'])
+
# create mgr
logger.info('Creating mgr...')
mgr_keyring = '[mgr.%s]\n\tkey = %s\n' % (mgr_id, mgr_key)
get_fqdn(), port,
args.initial_dashboard_user,
password))
-
+
if args.apply_spec:
logger.info('Applying %s to cluster' % args.apply_spec)
'--apply-spec',
help='Apply cluster spec after bootstrap (copy ssh key, add hosts and apply services)')
-
parser_bootstrap.add_argument(
'--shared_ceph_folder',
metavar='CEPH_SOURCE_FOLDER',
])
def test_parse_ip_route(self, test_input, expected):
assert cd._parse_ip_route(test_input) == expected
+
+ def test_is_ipv6(self):
+ cd.logger = mock.Mock()
+ for good in ("[::1]", "::1",
+ "fff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"):
+ assert cd.is_ipv6(good)
+ for bad in ("127.0.0.1",
+ "ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffg",
+ "1:2:3:4:5:6:7:8:9", "fd00::1::1", "[fg::1]"):
+ assert not cd.is_ipv6(bad)