" % (self.obj, self.weight)
**** CubicPower OpenStack Study ****
class BaseWeigher(object):
"""Base class for pluggable weighers."""
**** CubicPower OpenStack Study ****
def _weight_multiplier(self):
"""How weighted this weigher should be. Normally this would
be overridden in a subclass based on a config value.
"""
return 1.0
**** CubicPower OpenStack Study ****
def _weigh_object(self, obj, weight_properties):
"""Override in a subclass to specify a weight for a specific
object.
"""
return 0.0
**** CubicPower OpenStack Study ****
def weigh_objects(self, weighed_obj_list, weight_properties):
"""Weigh multiple objects. Override in a subclass if you need
need access to all objects in order to manipulate weights.
"""
constant = self._weight_multiplier()
for obj in weighed_obj_list:
obj.weight += (constant *
self._weigh_object(obj.obj, weight_properties))
**** CubicPower OpenStack Study ****
class BaseWeightHandler(base_handler.BaseHandler):
object_class = WeighedObject
**** CubicPower OpenStack Study ****
def get_weighed_objects(self, weigher_classes, obj_list,
weighing_properties):
"""Return a sorted (highest score first) list of WeighedObjects."""
if not obj_list:
return []
weighed_objs = [self.object_class(obj, 0.0) for obj in obj_list]
for weigher_cls in weigher_classes:
weigher = weigher_cls()
weigher.weigh_objects(weighed_objs, weighing_properties)
return sorted(weighed_objs, key=lambda x: x.weight, reverse=True)