Exemple #1
0
    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()
Exemple #2
0
 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
Exemple #3
0
 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
Exemple #4
0
    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))
Exemple #5
0
    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))
Exemple #6
0
    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()