Revising method for parsing ranges from --limit subsets

Also added a new test (test_subset_range) for future validation.

Fixes #4620
pull/5892/head
James Cammarata 11 years ago
parent 77d5a18392
commit ca0ec800d8

@ -207,24 +207,19 @@ class Inventory(object):
a tuple of (start, stop) or None a tuple of (start, stop) or None
""" """
if not "[" in pattern or pattern.startswith('~'): # The regex used to match on the range, which can be [x] or [x-y].
return (pattern, None) pattern_re = re.compile("^(.*)\[([0-9]+)(?:(?:-)([0-9]+))?\](.*)$")
(first, rest) = pattern.split("[") m = pattern_re.match(pattern)
rest = rest.replace("]","") if m:
try: (target, first, last, rest) = m.groups()
# support selectors like webservers[0] first = int(first)
x = int(rest) if last:
return (first, (x,x)) last = int(last)
except: else:
pass last = first
if "-" in rest: return (target, (first, last))
(left, right) = rest.split("-",1)
return (first, (left, right))
elif ":" in rest:
(left, right) = rest.split(":",1)
return (first, (left, right))
else: else:
return (first, (rest, rest)) return (pattern, None)
def _apply_ranges(self, pat, hosts): def _apply_ranges(self, pat, hosts):
""" """

@ -206,6 +206,11 @@ class TestInventory(unittest.TestCase):
inventory.subset('odin;thor,loki') inventory.subset('odin;thor,loki')
self.assertEqual(sorted(inventory.list_hosts()), sorted(['thor','odin','loki'])) self.assertEqual(sorted(inventory.list_hosts()), sorted(['thor','odin','loki']))
def test_subset_range(self):
inventory = self.simple_inventory()
inventory.subset('greek[0-2];norse[0]')
self.assertEqual(sorted(inventory.list_hosts()), sorted(['zeus','hera','thor']))
def test_subset_filename(self): def test_subset_filename(self):
inventory = self.simple_inventory() inventory = self.simple_inventory()
inventory.subset('@' + os.path.join(self.test_dir, 'restrict_pattern')) inventory.subset('@' + os.path.join(self.test_dir, 'restrict_pattern'))

Loading…
Cancel
Save