class Inventory(_HasAResourceProvider): # Version 1.0: Initial version # Version 1.1: Changed resource_class to allow custom strings VERSION = '1.1' fields = { 'id': fields.IntegerField(read_only=True), 'resource_provider': fields.ObjectField('ResourceProvider'), 'resource_class': fields.ResourceClassField(read_only=True), 'total': fields.NonNegativeIntegerField(), 'reserved': fields.NonNegativeIntegerField(default=0), 'min_unit': fields.NonNegativeIntegerField(default=1), 'max_unit': fields.NonNegativeIntegerField(default=1), 'step_size': fields.NonNegativeIntegerField(default=1), 'allocation_ratio': fields.NonNegativeFloatField(default=1.0), } def obj_make_compatible(self, primitive, target_version): super(Inventory, self).obj_make_compatible(primitive, target_version) target_version = versionutils.convert_version_to_tuple(target_version) if target_version < (1, 1) and 'resource_class' in primitive: rc = primitive['resource_class'] rc_cache.raise_if_custom_resource_class_pre_v1_1(rc) @property def capacity(self): """Inventory capacity, adjusted by allocation_ratio.""" return int((self.total - self.reserved) * self.allocation_ratio) @base.remotable def create(self): if 'id' in self: raise exception.ObjectActionError(action='create', reason='already created') _ensure_rc_cache(self._context) updates = self._make_db(self.obj_get_changes()) db_inventory = self._create_in_db(self._context, updates) self._from_db_object(self._context, self, db_inventory) @base.remotable def save(self): if 'id' not in self: raise exception.ObjectActionError(action='save', reason='not created') _ensure_rc_cache(self._context) updates = self.obj_get_changes() updates.pop('id', None) self._update_in_db(self._context, self.id, updates) @staticmethod def _create_in_db(context, updates): return _create_inventory_in_db(context, updates) @staticmethod def _update_in_db(context, id_, updates): return _update_inventory_in_db(context, id_, updates)
class Inventory(_HasAResourceProvider): # Version 1.0: Initial version VERSION = '1.0' fields = { 'id': fields.IntegerField(read_only=True), 'resource_provider': fields.ObjectField('ResourceProvider'), 'resource_class': fields.ResourceClassField(read_only=True), 'total': fields.NonNegativeIntegerField(), 'reserved': fields.NonNegativeIntegerField(default=0), 'min_unit': fields.NonNegativeIntegerField(default=1), 'max_unit': fields.NonNegativeIntegerField(default=1), 'step_size': fields.NonNegativeIntegerField(default=1), 'allocation_ratio': fields.NonNegativeFloatField(default=1.0), } @property def capacity(self): """Inventory capacity, adjusted by allocation_ratio.""" return int((self.total - self.reserved) * self.allocation_ratio) @base.remotable def create(self): if 'id' in self: raise exception.ObjectActionError(action='create', reason='already created') updates = self._make_db(self.obj_get_changes()) db_inventory = self._create_in_db(self._context, updates) self._from_db_object(self._context, self, db_inventory) @base.remotable def save(self): if 'id' not in self: raise exception.ObjectActionError(action='save', reason='not created') updates = self.obj_get_changes() updates.pop('id', None) self._update_in_db(self._context, self.id, updates) @staticmethod def _create_in_db(context, updates): return _create_inventory_in_db(context, updates) @staticmethod def _update_in_db(context, id_, updates): return _update_inventory_in_db(context, id_, updates)
def setUp(self): super(TestNonNegativeFloat, self).setUp() self.field = fields.NonNegativeFloatField() self.coerce_bad_values.extend(['-4.2'])