mirror of
https://github.com/ansible/awx.git
synced 2026-02-25 06:56:00 -03:30
Fixes https://trello.com/c/ZBHrkuLb - Add support for IPv6 addresses in inventory import.
This commit is contained in:
@@ -93,8 +93,7 @@ class MemGroup(MemObject):
|
|||||||
# maps host and group names to hosts to prevent redudant additions
|
# maps host and group names to hosts to prevent redudant additions
|
||||||
self.all_hosts = {}
|
self.all_hosts = {}
|
||||||
self.all_groups = {}
|
self.all_groups = {}
|
||||||
|
group_vars = os.path.join(source_dir, 'group_vars', self.name)
|
||||||
group_vars = os.path.join(self.source_dir, 'group_vars', self.name)
|
|
||||||
self.variables = self.load_vars(group_vars)
|
self.variables = self.load_vars(group_vars)
|
||||||
logger.debug('Loaded group: %s', self.name)
|
logger.debug('Loaded group: %s', self.name)
|
||||||
|
|
||||||
@@ -149,14 +148,13 @@ class MemHost(MemObject):
|
|||||||
In-memory representation of an inventory host.
|
In-memory representation of an inventory host.
|
||||||
'''
|
'''
|
||||||
|
|
||||||
def __init__(self, name, source_dir):
|
def __init__(self, name, source_dir, port=None):
|
||||||
super(MemHost, self).__init__(name, source_dir)
|
super(MemHost, self).__init__(name, source_dir)
|
||||||
self.variables = {}
|
self.variables = {}
|
||||||
self.instance_id = None
|
self.instance_id = None
|
||||||
if ':' in name:
|
self.name = name
|
||||||
tokens = name.split(':')
|
if port:
|
||||||
self.name = tokens[0]
|
self.variables['ansible_ssh_port'] = port
|
||||||
self.variables['ansible_ssh_port'] = int(tokens[1])
|
|
||||||
host_vars = os.path.join(source_dir, 'host_vars', name)
|
host_vars = os.path.join(source_dir, 'host_vars', name)
|
||||||
self.variables.update(self.load_vars(host_vars))
|
self.variables.update(self.load_vars(host_vars))
|
||||||
logger.debug('Loaded host: %s', self.name)
|
logger.debug('Loaded host: %s', self.name)
|
||||||
@@ -173,19 +171,29 @@ class BaseLoader(object):
|
|||||||
self.all_group = all_group or MemGroup('all', self.source_dir)
|
self.all_group = all_group or MemGroup('all', self.source_dir)
|
||||||
self.group_filter_re = group_filter_re
|
self.group_filter_re = group_filter_re
|
||||||
self.host_filter_re = host_filter_re
|
self.host_filter_re = host_filter_re
|
||||||
|
self.ipv6_port_re = re.compile(r'^\[([A-Fa-f0-9:]{3,})\]:(\d+?)$')
|
||||||
|
|
||||||
def get_host(self, name):
|
def get_host(self, name):
|
||||||
'''
|
'''
|
||||||
Return a MemHost instance from host name, creating if needed. If name
|
Return a MemHost instance from host name, creating if needed. If name
|
||||||
contains brackets, they will not be interpreted as a host pattern.
|
contains brackets, they will NOT be interpreted as a host pattern.
|
||||||
'''
|
'''
|
||||||
host_name = name.split(':')[0]
|
m = self.ipv6_port_re.match(name)
|
||||||
|
if m:
|
||||||
|
host_name = m.groups()[0]
|
||||||
|
port = int(m.groups()[1])
|
||||||
|
elif name.count(':') == 1:
|
||||||
|
host_name = name.split(':')[0]
|
||||||
|
port = int(name.split(':')[1])
|
||||||
|
else:
|
||||||
|
host_name = name
|
||||||
|
port = None
|
||||||
if self.host_filter_re and not self.host_filter_re.match(host_name):
|
if self.host_filter_re and not self.host_filter_re.match(host_name):
|
||||||
logger.debug('Filtering host %s', host_name)
|
logger.debug('Filtering host %s', host_name)
|
||||||
return None
|
return None
|
||||||
host = None
|
host = None
|
||||||
if not host_name in self.all_group.all_hosts:
|
if not host_name in self.all_group.all_hosts:
|
||||||
host = MemHost(name, self.source_dir)
|
host = MemHost(host_name, self.source_dir, port)
|
||||||
self.all_group.all_hosts[host_name] = host
|
self.all_group.all_hosts[host_name] = host
|
||||||
return self.all_group.all_hosts[host_name]
|
return self.all_group.all_hosts[host_name]
|
||||||
|
|
||||||
@@ -201,6 +209,9 @@ class BaseLoader(object):
|
|||||||
yield ''.join([str(i), j])
|
yield ''.join([str(i), j])
|
||||||
else:
|
else:
|
||||||
yield ''
|
yield ''
|
||||||
|
if self.ipv6_port_re.match(name):
|
||||||
|
yield self.get_host(name)
|
||||||
|
return
|
||||||
pattern_re = re.compile(r'(\[(?:(?:\d+\:\d+)|(?:[A-Za-z]\:[A-Za-z]))(?:\:\d+)??\])')
|
pattern_re = re.compile(r'(\[(?:(?:\d+\:\d+)|(?:[A-Za-z]\:[A-Za-z]))(?:\:\d+)??\])')
|
||||||
iters = []
|
iters = []
|
||||||
for s in re.split(pattern_re, name):
|
for s in re.split(pattern_re, name):
|
||||||
|
|||||||
@@ -65,6 +65,13 @@ varb=B
|
|||||||
|
|
||||||
[all:vars]
|
[all:vars]
|
||||||
vara=A
|
vara=A
|
||||||
|
|
||||||
|
[others]
|
||||||
|
10.11.12.13
|
||||||
|
10.12.14.16:8022
|
||||||
|
fe80::1610:9fff:fedd:654b
|
||||||
|
[fe80::1610:9fff:fedd:b654]:1022
|
||||||
|
::1
|
||||||
'''
|
'''
|
||||||
|
|
||||||
TEST_INVENTORY_INI_WITH_HOST_PATTERNS = '''\
|
TEST_INVENTORY_INI_WITH_HOST_PATTERNS = '''\
|
||||||
@@ -539,12 +546,14 @@ class InventoryImportTest(BaseCommandMixin, BaseLiveServerTest):
|
|||||||
self.assertEqual(result, None, stdout + stderr)
|
self.assertEqual(result, None, stdout + stderr)
|
||||||
# Check that inventory is populated as expected.
|
# Check that inventory is populated as expected.
|
||||||
new_inv = Inventory.objects.get(pk=new_inv.pk)
|
new_inv = Inventory.objects.get(pk=new_inv.pk)
|
||||||
expected_group_names = set(['servers', 'dbservers', 'webservers'])
|
expected_group_names = set(['servers', 'dbservers', 'webservers', 'others'])
|
||||||
group_names = set(new_inv.groups.values_list('name', flat=True))
|
group_names = set(new_inv.groups.values_list('name', flat=True))
|
||||||
self.assertEqual(expected_group_names, group_names)
|
self.assertEqual(expected_group_names, group_names)
|
||||||
expected_host_names = set(['web1.example.com', 'web2.example.com',
|
expected_host_names = set(['web1.example.com', 'web2.example.com',
|
||||||
'web3.example.com', 'db1.example.com',
|
'web3.example.com', 'db1.example.com',
|
||||||
'db2.example.com'])
|
'db2.example.com', '10.11.12.13',
|
||||||
|
'10.12.14.16', 'fe80::1610:9fff:fedd:654b',
|
||||||
|
'fe80::1610:9fff:fedd:b654', '::1'])
|
||||||
host_names = set(new_inv.hosts.values_list('name', flat=True))
|
host_names = set(new_inv.hosts.values_list('name', flat=True))
|
||||||
self.assertEqual(expected_host_names, host_names)
|
self.assertEqual(expected_host_names, host_names)
|
||||||
if source and os.path.isdir(source):
|
if source and os.path.isdir(source):
|
||||||
@@ -560,8 +569,10 @@ class InventoryImportTest(BaseCommandMixin, BaseLiveServerTest):
|
|||||||
{'ansible_ssh_host': 'w1.example.net'})
|
{'ansible_ssh_host': 'w1.example.net'})
|
||||||
elif host.name in ('db1.example.com', 'db2.example.com') and source and os.path.isdir(source):
|
elif host.name in ('db1.example.com', 'db2.example.com') and source and os.path.isdir(source):
|
||||||
self.assertEqual(host.variables_dict, {'test_host_name': host.name})
|
self.assertEqual(host.variables_dict, {'test_host_name': host.name})
|
||||||
elif host.name == 'web3.example.com':
|
elif host.name in ('web3.example.com', 'fe80::1610:9fff:fedd:b654'):
|
||||||
self.assertEqual(host.variables_dict, {'ansible_ssh_port': 1022})
|
self.assertEqual(host.variables_dict, {'ansible_ssh_port': 1022})
|
||||||
|
elif host.name == '10.12.14.16':
|
||||||
|
self.assertEqual(host.variables_dict, {'ansible_ssh_port': 8022})
|
||||||
else:
|
else:
|
||||||
self.assertEqual(host.variables_dict, {})
|
self.assertEqual(host.variables_dict, {})
|
||||||
for group in new_inv.groups.all():
|
for group in new_inv.groups.all():
|
||||||
@@ -624,14 +635,17 @@ class InventoryImportTest(BaseCommandMixin, BaseLiveServerTest):
|
|||||||
# Check that inventory is populated as expected.
|
# Check that inventory is populated as expected.
|
||||||
new_inv = Inventory.objects.get(pk=new_inv.pk)
|
new_inv = Inventory.objects.get(pk=new_inv.pk)
|
||||||
expected_group_names = set(['servers', 'dbservers', 'webservers',
|
expected_group_names = set(['servers', 'dbservers', 'webservers',
|
||||||
'lbservers'])
|
'lbservers', 'others'])
|
||||||
if overwrite:
|
if overwrite:
|
||||||
expected_group_names.remove('lbservers')
|
expected_group_names.remove('lbservers')
|
||||||
group_names = set(new_inv.groups.filter(active=True).values_list('name', flat=True))
|
group_names = set(new_inv.groups.filter(active=True).values_list('name', flat=True))
|
||||||
self.assertEqual(expected_group_names, group_names)
|
self.assertEqual(expected_group_names, group_names)
|
||||||
expected_host_names = set(['web1.example.com', 'web2.example.com',
|
expected_host_names = set(['web1.example.com', 'web2.example.com',
|
||||||
'web3.example.com', 'db1.example.com',
|
'web3.example.com', 'db1.example.com',
|
||||||
'db2.example.com', 'lb.example.com'])
|
'db2.example.com', 'lb.example.com',
|
||||||
|
'10.11.12.13', '10.12.14.16',
|
||||||
|
'fe80::1610:9fff:fedd:654b',
|
||||||
|
'fe80::1610:9fff:fedd:b654', '::1'])
|
||||||
if overwrite:
|
if overwrite:
|
||||||
expected_host_names.remove('lb.example.com')
|
expected_host_names.remove('lb.example.com')
|
||||||
host_names = set(new_inv.hosts.filter(active=True).values_list('name', flat=True))
|
host_names = set(new_inv.hosts.filter(active=True).values_list('name', flat=True))
|
||||||
@@ -644,8 +658,10 @@ class InventoryImportTest(BaseCommandMixin, BaseLiveServerTest):
|
|||||||
if host.name == 'web1.example.com':
|
if host.name == 'web1.example.com':
|
||||||
self.assertEqual(host.variables_dict,
|
self.assertEqual(host.variables_dict,
|
||||||
{'ansible_ssh_host': 'w1.example.net'})
|
{'ansible_ssh_host': 'w1.example.net'})
|
||||||
elif host.name == 'web3.example.com':
|
elif host.name in ('web3.example.com', 'fe80::1610:9fff:fedd:b654'):
|
||||||
self.assertEqual(host.variables_dict, {'ansible_ssh_port': 1022})
|
self.assertEqual(host.variables_dict, {'ansible_ssh_port': 1022})
|
||||||
|
elif host.name == '10.12.14.16':
|
||||||
|
self.assertEqual(host.variables_dict, {'ansible_ssh_port': 8022})
|
||||||
elif host.name == 'lb.example.com':
|
elif host.name == 'lb.example.com':
|
||||||
self.assertEqual(host.variables_dict, {'lbvar': 'ni!'})
|
self.assertEqual(host.variables_dict, {'lbvar': 'ni!'})
|
||||||
else:
|
else:
|
||||||
|
|||||||
Reference in New Issue
Block a user