def _get_free_ips_from_range(self, iterable, num=1): """ Method for receiving free IP addresses from range. :param iterable: Iterable object with IP addresses. :type iterable: iterable :param num: Number of IP addresses to return. :type num: int :returns: List of free IP addresses from given range. :raises: errors.OutOfIPs """ free_ips = [] for chunk in self._chunked_range(iterable): from_range = set(chunk) diff = from_range - set([ i.ip_addr for i in self.db.query(IPAddr).filter( IPAddr.ip_addr.in_(from_range)) ]) while len(free_ips) < num: try: free_ips.append(diff.pop()) except KeyError: break if len(free_ips) == num: return free_ips raise errors.OutOfIPs()
def get_free_ips(cls, network_group, num=1): """Returns list of free IP addresses for given Network Group """ free_ips = list(islice(cls._iter_free_ips(network_group), 0, num)) if len(free_ips) < num: raise errors.OutOfIPs() return free_ips
def get_free_ips(cls, network_group_id, num=1): """Returns list of free IP addresses for given Network Group """ ng = db().query(NetworkGroup).get(network_group_id) free_ips = [] for ip in cls._iter_free_ips(ng): free_ips.append(str(ip)) if len(free_ips) == num: break if len(free_ips) < num: raise errors.OutOfIPs() return free_ips
def create_network_groups(self, cluster_id): ''' Method for creation of network groups for cluster. :param cluster_id: Cluster database ID. :type cluster_id: int :returns: None :raises: errors.OutOfVLANs, errors.OutOfIPs, errors.NoSuitableCIDR ''' used_nets = [n.cidr for n in self.db.query(Network).all()] used_vlans = [v.id for v in self.db.query(Vlan).all()] cluster_db = self.db.query(Cluster).get(cluster_id) networks_metadata = cluster_db.release.networks_metadata free_vlans = set( range(int(settings.VLANS_RANGE_START), int( settings.VLANS_RANGE_END))) - set(used_vlans) if not free_vlans or len(free_vlans) < len(networks_metadata): raise errors.OutOfVLANs() for network in networks_metadata: vlan_start = sorted(list(free_vlans))[0] logger.debug(u"Found free vlan: %s", vlan_start) pool = settings.NETWORK_POOLS.get(network['access']) if not pool: raise errors.InvalidNetworkAccess( u"Invalid access '{0}' for network '{1}'".format( network['access'], network['name'])) nets_free_set = IPSet(pool) -\ IPSet(settings.NET_EXCLUDE) -\ IPSet( IPRange( settings.ADMIN_NETWORK["first"], settings.ADMIN_NETWORK["last"] ) ) -\ IPSet(used_nets) if not nets_free_set: raise errors.OutOfIPs() free_cidrs = sorted(list(nets_free_set._cidrs)) new_net = None for fcidr in free_cidrs: for n in fcidr.subnet(24, count=1): new_net = n break if new_net: break if not new_net: raise errors.NoSuitableCIDR() new_ip_range = IPAddrRange(first=str(new_net[2]), last=str(new_net[-2])) nw_group = NetworkGroup(release=cluster_db.release.id, name=network['name'], access=network['access'], cidr=str(new_net), netmask=str(new_net.netmask), gateway=str(new_net[1]), cluster_id=cluster_id, vlan_start=vlan_start, amount=1) self.db.add(nw_group) self.db.commit() nw_group.ip_ranges.append(new_ip_range) self.db.commit() self.create_networks(nw_group) free_vlans = free_vlans - set([vlan_start]) used_nets.append(str(new_net))
def create_network_groups(self, cluster_id): '''Method for creation of network groups for cluster. :param cluster_id: Cluster database ID. :type cluster_id: int :returns: None :raises: errors.OutOfVLANs, errors.OutOfIPs, errors.NoSuitableCIDR ''' used_nets = [] used_vlans = [] global_params = db().query(GlobalParameters).first() cluster_db = db().query(Cluster).get(cluster_id) networks_metadata = cluster_db.release.networks_metadata admin_network_range = db().query(IPAddrRange).filter_by( network_group_id=self.get_admin_network_group_id()).all()[0] def _free_vlans(): free_vlans = set(range( *global_params.parameters["vlan_range"])) - set(used_vlans) if not free_vlans or len(free_vlans) < len(networks_metadata): raise errors.OutOfVLANs() return sorted(list(free_vlans)) public_vlan = _free_vlans()[0] used_vlans.append(public_vlan) for network in networks_metadata: free_vlans = _free_vlans() vlan_start = public_vlan if network.get("use_public_vlan") \ else free_vlans[0] logger.debug("Found free vlan: %s", vlan_start) pool = network.get('pool') if not pool: raise errors.InvalidNetworkPool( u"Invalid pool '{0}' for network '{1}'".format( pool, network['name'])) nets_free_set = IPSet(pool) -\ IPSet( IPNetwork(global_params.parameters["net_exclude"]) ) -\ IPSet( IPRange( admin_network_range.first, admin_network_range.last ) ) -\ IPSet(used_nets) if not nets_free_set: raise errors.OutOfIPs() free_cidrs = sorted(list(nets_free_set._cidrs)) new_net = None for fcidr in free_cidrs: for n in fcidr.subnet(24, count=1): new_net = n break if new_net: break if not new_net: raise errors.NoSuitableCIDR() new_ip_range = IPAddrRange(first=str(new_net[2]), last=str(new_net[-2])) nw_group = NetworkGroup(release=cluster_db.release.id, name=network['name'], cidr=str(new_net), netmask=str(new_net.netmask), gateway=str(new_net[1]), cluster_id=cluster_id, vlan_start=vlan_start, amount=1) db().add(nw_group) db().commit() nw_group.ip_ranges.append(new_ip_range) db().commit() self.create_networks(nw_group) used_vlans.append(vlan_start) used_nets.append(str(new_net))
def create_network_groups(cls, cluster_id): '''Method for creation of network groups for cluster. :param cluster_id: Cluster database ID. :type cluster_id: int :returns: None :raises: errors.OutOfVLANs, errors.OutOfIPs, errors.NoSuitableCIDR ''' used_nets = [] used_vlans = [] global_params = db().query(GlobalParameters).first() cluster_db = db().query(Cluster).get(cluster_id) networks_metadata = cluster_db.release.networks_metadata admin_network_range = db().query(IPAddrRange).filter_by( network_group_id=cls.get_admin_network_group_id()).all()[0] networks_list = networks_metadata["neutron"]["networks"] def _free_vlans(): free_vlans = set(range( *global_params.parameters["vlan_range"])) - set(used_vlans) if not free_vlans or len(free_vlans) < len(networks_list): raise errors.OutOfVLANs() return sorted(list(free_vlans)) for network in networks_list: free_vlans = _free_vlans() vlan_start = free_vlans[0] if "vlan_start" not in network \ else network.get("vlan_start") if vlan_start and vlan_start not in free_vlans: vlan_start = free_vlans[0] logger.debug("Found free vlan: %s", vlan_start) pool = network.get('pool') if not pool: raise errors.InvalidNetworkPool( u"Invalid pool '{0}' for network '{1}'".format( pool, network['name'])) nets_free_set = IPSet(pool) -\ IPSet( IPNetwork(global_params.parameters["net_exclude"]) ) -\ IPSet( IPRange( admin_network_range.first, admin_network_range.last ) ) -\ IPSet(used_nets) if not nets_free_set: raise errors.OutOfIPs() free_cidrs = sorted(list(nets_free_set._cidrs)) new_net = None for fcidr in free_cidrs: for n in fcidr.subnet(24, count=1): new_net = n break if new_net: break if not new_net: raise errors.NoSuitableCIDR() if network.get("ip_range"): new_ip_range = IPAddrRange(first=network["ip_range"][0], last=network["ip_range"][1]) else: new_ip_range = IPAddrRange(first=str(new_net[2]), last=str(new_net[-2])) gw = str(new_net[1]) if network.get('use_gateway') else None nw_group = NetworkGroup(release=cluster_db.release.id, name=network['name'], cidr=str(new_net), netmask=str(new_net.netmask), gateway=gw, cluster_id=cluster_id, vlan_start=vlan_start, amount=1) db().add(nw_group) db().commit() nw_group.ip_ranges.append(new_ip_range) db().commit() cls.cleanup_network_group(nw_group) used_vlans.append(vlan_start) used_nets.append(str(new_net)) if cluster_db.net_segment_type == 'vlan': private_network_group = NetworkGroup(release=cluster_db.release.id, name="private", cluster_id=cluster_id, netmask='32', vlan_start=None, amount=1) db().add(private_network_group) db().commit()