Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Revising method for parsing ranges from --limit subsets

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

Fixes #4620
  • Loading branch information...
commit ca0ec800d8b6d2dee99d5e13ae8891f8cd455277 1 parent 77d5a18
@jimi-c jimi-c authored
Showing with 17 additions and 17 deletions.
  1. +12 −17 lib/ansible/inventory/__init__.py
  2. +5 −0 test/TestInventory.py
View
29 lib/ansible/inventory/__init__.py
@@ -207,24 +207,19 @@ def _enumeration_info(self, pattern):
a tuple of (start, stop) or None
"""
- if not "[" in pattern or pattern.startswith('~'):
- return (pattern, None)
- (first, rest) = pattern.split("[")
- rest = rest.replace("]","")
- try:
- # support selectors like webservers[0]
- x = int(rest)
- return (first, (x,x))
- except:
- pass
- if "-" in rest:
- (left, right) = rest.split("-",1)
- return (first, (left, right))
- elif ":" in rest:
- (left, right) = rest.split(":",1)
- return (first, (left, right))
+ # The regex used to match on the range, which can be [x] or [x-y].
+ pattern_re = re.compile("^(.*)\[([0-9]+)(?:(?:-)([0-9]+))?\](.*)$")
+ m = pattern_re.match(pattern)
+ if m:
+ (target, first, last, rest) = m.groups()
+ first = int(first)
+ if last:
+ last = int(last)
+ else:
+ last = first
+ return (target, (first, last))
else:
- return (first, (rest, rest))
+ return (pattern, None)
def _apply_ranges(self, pat, hosts):
"""
View
5 test/TestInventory.py
@@ -206,6 +206,11 @@ def test_subset(self):
inventory.subset('odin;thor,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):
inventory = self.simple_inventory()
inventory.subset('@' + os.path.join(self.test_dir, 'restrict_pattern'))
Please sign in to comment.
Something went wrong with that request. Please try again.