Introduce _split_pattern to parse an "x:y:z" pattern

This function takes a string like 'foo:bar[1:2]:baz[x:y]-quux' and
returns a list of patterns ['foo', 'bar[1:2]', 'baz[x:y]-quux'], i.e.
splits the string on colons that are not part of a range specification.
This commit is contained in:
Abhijit Menon-Sen 2015-08-13 16:32:11 +05:30 committed by James Cammarata
parent baf637b9ae
commit 8aaa06dd50

View file

@ -155,6 +155,23 @@ class Inventory(object):
results.append(item) results.append(item)
return results return results
def _split_pattern(self, pattern):
"""
takes e.g. "webservers[0:5]:dbservers:others"
and returns ["webservers[0:5]", "dbservers", "others"]
"""
term = re.compile(
r'''(?: # We want to match something comprising:
[^:\[\]] # (anything other than ':', '[', or ']'
| # ...or...
\[[^\]]*\] # a single complete bracketed expression)
)* # repeated as many times as possible
''', re.X
)
return [x for x in term.findall(pattern) if x]
def get_hosts(self, pattern="all"): def get_hosts(self, pattern="all"):
""" """
find all host names matching a pattern string, taking into account any inventory restrictions or find all host names matching a pattern string, taking into account any inventory restrictions or
@ -164,7 +181,7 @@ class Inventory(object):
# process patterns # process patterns
if isinstance(pattern, list): if isinstance(pattern, list):
pattern = ';'.join(pattern) pattern = ';'.join(pattern)
patterns = pattern.replace(";",":").split(":") patterns = self._split_pattern(pattern.replace(";",":"))
hosts = self._get_hosts(patterns) hosts = self._get_hosts(patterns)
# exclude hosts not in a subset, if defined # exclude hosts not in a subset, if defined
@ -504,10 +521,10 @@ class Inventory(object):
self._subset = None self._subset = None
else: else:
subset_pattern = subset_pattern.replace(',',':') subset_pattern = subset_pattern.replace(',',':')
subset_pattern = subset_pattern.replace(";",":").split(":") subset_patterns = self._split_pattern(subset_pattern.replace(";",":"))
results = [] results = []
# allow Unix style @filename data # allow Unix style @filename data
for x in subset_pattern: for x in subset_patterns:
if x.startswith("@"): if x.startswith("@"):
fd = open(x[1:]) fd = open(x[1:])
results.extend(fd.read().split("\n")) results.extend(fd.read().split("\n"))