Loading cloudcontrol/server/allocator.py +20 −14 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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: Loading @@ -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: Loading @@ -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 Loading Loading
cloudcontrol/server/allocator.py +20 −14 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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: Loading @@ -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: Loading @@ -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 Loading