Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/netaddr/contrib/subnet_splitter.py: 35%

17 statements  

« prev     ^ index     » next       coverage.py v7.2.7, created at 2023-06-07 06:45 +0000

1#----------------------------------------------------------------------------- 

2# Copyright (c) 2008 by David P. D. Moss. All rights reserved. 

3# 

4# Released under the BSD license. See the LICENSE file for details. 

5#----------------------------------------------------------------------------- 

6from netaddr.ip import IPNetwork, cidr_exclude, cidr_merge 

7 

8 

9class SubnetSplitter(object): 

10 """ 

11 A handy utility class that takes a single (large) subnet and allows 

12 smaller subnet within its range to be extracted by CIDR prefix. Any 

13 leaving address space is available for subsequent extractions until 

14 all space is exhausted. 

15 """ 

16 def __init__(self, base_cidr): 

17 """ 

18 Constructor. 

19 

20 :param base_cidr: an IPv4 or IPv6 address with a CIDR prefix. 

21 (see IPNetwork.__init__ for full details). 

22 """ 

23 self._subnets = set([IPNetwork(base_cidr)]) 

24 

25 def extract_subnet(self, prefix, count=None): 

26 """Extract 1 or more subnets of size specified by CIDR prefix.""" 

27 for cidr in self.available_subnets(): 

28 subnets = list(cidr.subnet(prefix, count=count)) 

29 if not subnets: 

30 continue 

31 self.remove_subnet(cidr) 

32 self._subnets = self._subnets.union( 

33 set( 

34 cidr_exclude(cidr, cidr_merge(subnets)[0]) 

35 ) 

36 ) 

37 return subnets 

38 return [] 

39 

40 def available_subnets(self): 

41 """Returns a list of the currently available subnets.""" 

42 return sorted(self._subnets, key=lambda x: x.prefixlen, reverse=True) 

43 

44 def remove_subnet(self, ip_network): 

45 """Remove a specified IPNetwork from available address space.""" 

46 self._subnets.remove(ip_network)