def get_subnet_cidrs(cls, cidr=None, mask_bits=None, ip_version=None): """Iterate over a sequence of unused subnet CIDR for IP version :param cidr: CIDR of the subnet to create It can be either None, a str or a netaddr.IPNetwork instance :param mask_bits: CIDR prefix length It can be either None or a numeric value. If cidr parameter is given then mask_bits is used to determinate a sequence of valid CIDR to use as generated. Please see netaddr.IPNetwork.subnet method documentation[1] :param ip_version: ip version of generated subnet CIDRs It can be None, IP_VERSION_4 or IP_VERSION_6 It has to match given CIDR if given :return: iterator over reserved CIDRs of type netaddr.IPNetwork [1] http://netaddr.readthedocs.io/en/latest/tutorial_01.html#supernets-and-subnets # noqa """ if cidr: # Generate subnet CIDRs starting from given CIDR # checking it is of requested IP version cidr = netaddr.IPNetwork(cidr, version=ip_version) else: # Generate subnet CIDRs starting from configured values ip_version = ip_version or cls._ip_version if ip_version == const.IP_VERSION_4: mask_bits = mask_bits or config.safe_get_config_value( 'network', 'project_network_mask_bits') cidr = netaddr.IPNetwork( config.safe_get_config_value('network', 'project_network_cidr')) elif ip_version == const.IP_VERSION_6: mask_bits = config.safe_get_config_value( 'network', 'project_network_v6_mask_bits') cidr = netaddr.IPNetwork( config.safe_get_config_value('network', 'project_network_v6_cidr')) else: raise ValueError('Invalid IP version: {!r}'.format(ip_version)) if mask_bits: subnet_cidrs = cidr.subnet(mask_bits) else: subnet_cidrs = iter([cidr]) for subnet_cidr in subnet_cidrs: if subnet_cidr not in cls.reserved_subnet_cidrs: yield subnet_cidr
def resource_setup(cls): super(RoutersTest, cls).resource_setup() cls.tenant_cidr = (config.safe_get_config_value( 'network', 'project_network_cidr') if cls._ip_version == 4 else config.safe_get_config_value( 'network', 'project_network_v6_cidr'))