Commit d4d16a66 authored by Antoine Millet's avatar Antoine Millet
Browse files

Fixed allocator to use server wide riskgroup db

parent 69563dbe
Loading
Loading
Loading
Loading
+20 −14
Original line number Diff line number Diff line
@@ -166,23 +166,29 @@ class SatisfyRiskGroups(Filter):
    """

    def tql_filter(self, query):
        self.riskgroup_name = self.vmspec.get('tags', {}).get('riskgroup')
        self.riskgroup = self.server.riskgroups.get(self.riskgroup_name)

        if self.riskgroup_name and self.riskgroup is None:
            self.logger.warn('Unknown riskgroup used, ignoring')

        if self.riskgroup:
            tags = ''
        for tag in self.vmspec.get('riskgroup', {}):
            for tag in self.riskgroup:
                tags += '$%s' % tag
            return '(%s)%s' % (query, tags)
        return query

    def filter(self, candidates):
        riskgroup = self.vmspec.get('tags', {}).get('riskgroup')
        riskgroup_props = self.vmspec.get('riskgroup')
        if riskgroup and riskgroup_props:
        if self.riskgroup is not None:
            # Get the list of VMs within the riskgroup:
            vms = self.server.list('r=vm&riskgroup="%s"$p' % riskgroup)
            vms = self.server.list('r=vm&riskgroup="%s"$p' % self.riskgroup_name)

            count_per_hv = defaultdict(lambda: 0)
            # Store count per riskgroup as instance attribute as we will also use
            # it in sorting step. Note that filter will ALWAYS be called before
            # a sorting operation.
            self.count_per_riskgroup = dict((x, defaultdict(lambda: 0)) for x in riskgroup_props)
            self.count_per_riskgroup = dict((x, defaultdict(lambda: 0)) for x in self.riskgroup)

            if vms:
                # Produce the mapping between the hypervisor and the number of VMs
@@ -198,7 +204,7 @@ class SatisfyRiskGroups(Filter):

                # Generate the list of tags to show on this list of hv:
                hv_tql_show = ''
                for k in riskgroup_props:
                for k in self.riskgroup:
                    hv_tql_show += '$%s' % k

                # Assemble the TQL query:
@@ -210,12 +216,12 @@ class SatisfyRiskGroups(Filter):

                # Count the number of vm per riskgroup tag:
                for hv in hvs:
                    for tag in riskgroup_props:
                    for tag in self.riskgroup:
                        self.count_per_riskgroup[tag][hv[tag]] += count_per_hv[hv['id']]

            # Yield only hv which have not reached riskgroup limits:
            for hv in candidates:
                for tag, limit in riskgroup_props.iteritems():
                for tag, limit in self.riskgroup.iteritems():
                    if self.count_per_riskgroup[tag].get(hv[tag], 0) >= limit:
                        break
                else:
@@ -226,8 +232,8 @@ class SatisfyRiskGroups(Filter):

    def sorter(self, candidate):
        orders = []
        if 'riskgroup' in self.vmspec:
            for tag in self.vmspec['riskgroup']:
        if self.riskgroup:
            for tag in self.riskgroup:
                orders.append(self.count_per_riskgroup[tag].get(candidate[tag], 0))
        return orders