Add function which increments network addresses and
returns list of first host addresses
Issue: PROD-21241
Change-Id: I500d27d9adebc739d81ff960ad512c39fa9c84a0
diff --git a/_modules/netutils.py b/_modules/netutils.py
index 2efd7e6..6cc8e83 100644
--- a/_modules/netutils.py
+++ b/_modules/netutils.py
@@ -1,4 +1,5 @@
-from netaddr import iter_iprange
+from itertools import chain
+from netaddr import iter_iprange, IPAddress, IPNetwork
__virtualname__ = 'netutils'
@@ -7,12 +8,12 @@
return __virtualname__
-def parse_network_ranges(ranges, needed):
+def parse_ip_ranges(ranges, needed):
'''
Takes comma seprated list of IP ranges and returns full list of IP addresses in these ranges.
Second argument is used to check if there is enough IP addresses to cover the required number of nodes.
- >>> parse_network_ranges("192.168.1.101-192.168.1.103,192.168.2.101-192.168.2.103")
+ >>> parse_ip_ranges("192.168.1.101-192.168.1.103,192.168.2.101-192.168.2.103")
["192.168.1.101", "192.168.1.102", "192.168.1.103", "192.168.2.101", "192.168.2.102", "192.168.2.103"]
'''
range_list = ranges.split(',')
@@ -23,3 +24,31 @@
if len(ip_list) < needed:
raise ValueError('There is not enough IP addresses in ranges: "{}". {} available, {} required.'.format(ranges, len(ip_list), needed))
return ip_list
+
+
+def parse_network_ranges(ranges, iterate=False):
+ '''
+ Takes comma separated list of network ranges and returns full list of first IP addresses in every given subnet.
+ Second argument is used to check if there is enough IP addresses to cover the required number of nodes.
+
+ >>> parse_network_ranges("10.10.0.1/24-10.10.10.1/24,192.168.0.1/24-192.168.10.1/24")
+ ['10.10.0.1', '10.10.1.1', '10.10.2.1', '10.10.3.1', '10.10.4.1', '10.10.5.1', '10.10.6.1', '10.10.7.1', '10.10.8.1', '10.10.9.1', '10.10.10.1', '192.168.0.1', '192.168.1.1', '192.168.2.1', '192.168.3.1', '192.168.4.1', '192.168.5.1', '192.168.6.1', '192.168.7.1', '192.168.8.1', '192.168.9.1', '192.168.10.1']
+ '''
+ def _iter_subnet_list(start, end):
+ yield str(IPAddress(start.first) + 1)
+ if start != end:
+ for ip in _iter_subnet_list(start.next(), end):
+ yield ip
+
+ generators = tuple()
+
+ for _range in ranges.split(','):
+ start_str, end_str = _range.split('-')
+ start, end = IPNetwork(start_str), IPNetwork(end_str)
+ if start > end:
+ raise ValueError('Invalid network range, start address is higher than end address')
+ generators += (_iter_subnet_list(start, end),)
+
+ if iterate:
+ return [ip for ip in chain(*generators)]
+ return chain(*generators)