class SubnetPool(base.NeutronDbObject): # Version 1.0: Initial version VERSION = '1.0' db_model = models.SubnetPool fields = { 'id': common_types.UUIDField(), 'project_id': obj_fields.StringField(nullable=True), 'name': obj_fields.StringField(nullable=True), 'ip_version': common_types.IPVersionEnumField(), 'default_prefixlen': common_types.IPNetworkPrefixLenField(), 'min_prefixlen': common_types.IPNetworkPrefixLenField(), 'max_prefixlen': common_types.IPNetworkPrefixLenField(), 'shared': obj_fields.BooleanField(), 'is_default': obj_fields.BooleanField(), 'default_quota': obj_fields.IntegerField(nullable=True), 'hash': obj_fields.StringField(nullable=True), 'address_scope_id': common_types.UUIDField(nullable=True), 'prefixes': common_types.ListOfIPNetworksField(nullable=True) } fields_no_update = ['id', 'project_id'] synthetic_fields = ['prefixes'] def from_db_object(self, db_obj): super(SubnetPool, self).from_db_object(db_obj) self.prefixes = [] self.prefixes = [ prefix.cidr for prefix in db_obj.get('prefixes', []) ] self.obj_reset_changes(['prefixes']) def _attach_prefixes(self, prefixes): SubnetPoolPrefix.delete_objects(self.obj_context, subnetpool_id=self.id) for prefix in prefixes: SubnetPoolPrefix(self.obj_context, subnetpool_id=self.id, cidr=prefix).create() self.prefixes = prefixes self.obj_reset_changes(['prefixes']) # TODO(ihrachys): Consider extending base to trigger registered methods def create(self): fields = self.obj_get_changes() with self.db_context_writer(self.obj_context): prefixes = self.prefixes super(SubnetPool, self).create() if 'prefixes' in fields: self._attach_prefixes(prefixes) # TODO(ihrachys): Consider extending base to trigger registered methods def update(self): fields = self.obj_get_changes() with self.db_context_writer(self.obj_context): super(SubnetPool, self).update() if 'prefixes' in fields: self._attach_prefixes(fields['prefixes'])
def setUp(self): super(IPNetworkPrefixLenFieldTest, self).setUp() self.field = common_types.IPNetworkPrefixLenField() self.coerce_good_values = [(x, x) for x in (0, 32, 128, 42)] self.coerce_bad_values = ['len', '1', 129, -1] self.to_primitive_values = self.coerce_good_values self.from_primitive_values = self.coerce_good_values
class SubnetPool(base.NeutronDbObject): # Version 1.0: Initial version VERSION = '1.0' db_model = models.SubnetPool fields = { 'id': obj_fields.UUIDField(), 'tenant_id': obj_fields.UUIDField(nullable=True), 'name': obj_fields.StringField(nullable=True), 'ip_version': common_types.IPVersionEnumField(), 'default_prefixlen': common_types.IPNetworkPrefixLenField(), 'min_prefixlen': common_types.IPNetworkPrefixLenField(), 'max_prefixlen': common_types.IPNetworkPrefixLenField(), 'shared': obj_fields.BooleanField(), 'is_default': obj_fields.BooleanField(), 'default_quota': obj_fields.IntegerField(nullable=True), 'hash': obj_fields.StringField(nullable=True), 'address_scope_id': obj_fields.UUIDField(nullable=True), 'prefixes': common_types.ListOfIPNetworksField(nullable=True) } fields_no_update = ['id', 'tenant_id'] synthetic_fields = ['prefixes'] @classmethod def modify_fields_from_db(cls, db_obj): fields = super(SubnetPool, cls).modify_fields_from_db(db_obj) if 'prefixes' in fields: fields['prefixes'] = [ netaddr.IPNetwork(prefix.cidr) for prefix in fields['prefixes'] ] return fields @classmethod def modify_fields_to_db(cls, fields): result = super(SubnetPool, cls).modify_fields_to_db(fields) if 'prefixes' in result: result['prefixes'] = [ models.SubnetPoolPrefix(cidr=str(prefix), subnetpool_id=result['id']) for prefix in result['prefixes'] ] return result def reload_prefixes(self): prefixes = [ obj.cidr for obj in SubnetPoolPrefix.get_objects(self.obj_context, subnetpool_id=self.id) ] setattr(self, 'prefixes', prefixes) self.obj_reset_changes(['prefixes']) @classmethod def get_object(cls, context, **kwargs): with db_api.autonested_transaction(context.session): pool_obj = super(SubnetPool, cls).get_object(context, **kwargs) if pool_obj is not None: pool_obj.reload_prefixes() return pool_obj @classmethod def get_objects(cls, context, **kwargs): with db_api.autonested_transaction(context.session): objs = super(SubnetPool, cls).get_objects(context, **kwargs) for obj in objs: obj.reload_prefixes() return objs def _get_changed_synthetic_fields(self): fields = self.obj_get_changes() for field in self._get_changed_persistent_fields(): if field in fields: del fields[field] return fields # TODO(ihrachys): Consider extending base to trigger registered methods def create(self): synthetic_changes = self._get_changed_synthetic_fields() with db_api.autonested_transaction(self.obj_context.session): super(SubnetPool, self).create() if 'prefixes' in synthetic_changes: for prefix in self.prefixes: prefix = SubnetPoolPrefix(self.obj_context, subnetpool_id=self.id, cidr=prefix) prefix.create() self.reload_prefixes() # TODO(ihrachys): Consider extending base to trigger registered methods def update(self): with db_api.autonested_transaction(self.obj_context.session): synthetic_changes = self._get_changed_synthetic_fields() super(SubnetPool, self).update() if synthetic_changes: if 'prefixes' in synthetic_changes: old = SubnetPoolPrefix.get_objects(self.obj_context, subnetpool_id=self.id) for prefix in old: prefix.delete() for prefix in self.prefixes: prefix_obj = SubnetPoolPrefix(self.obj_context, subnetpool_id=self.id, cidr=prefix) prefix_obj.create()