From caf32b69cd36ef19d9beceff2516eb846cf1d092 Mon Sep 17 00:00:00 2001 From: Ihar Hrachyshka Date: Mon, 22 May 2017 19:14:42 -0700 Subject: [PATCH] objects: update fields_no_update to reflect models It will make sure that object update code won't mistakenly touch those attributes, triggering foreign key violations for linked resources. Partially-Implements: blueprint adopt-oslo-versioned-objects-for-db Change-Id: I96a7c6fd15cf089d80d0c512e94e7fb9da6aba4d --- neutron/objects/auto_allocate.py | 2 ++ neutron/objects/ipam.py | 2 ++ neutron/objects/metering.py | 2 ++ neutron/objects/network.py | 2 ++ neutron/objects/port/extensions/extra_dhcp_opt.py | 2 ++ neutron/objects/ports.py | 4 ++++ neutron/objects/securitygroup.py | 2 +- neutron/objects/subnet.py | 4 +++- neutron/objects/trunk.py | 2 +- 9 files changed, 19 insertions(+), 3 deletions(-) diff --git a/neutron/objects/auto_allocate.py b/neutron/objects/auto_allocate.py index 9fbc6766950..33fda388cff 100644 --- a/neutron/objects/auto_allocate.py +++ b/neutron/objects/auto_allocate.py @@ -35,3 +35,5 @@ class AutoAllocatedTopology(base.NeutronDbObject): 'network_id': common_types.UUIDField(), 'router_id': common_types.UUIDField(nullable=True), } + + fields_no_update = ['network_id', 'router_id'] diff --git a/neutron/objects/ipam.py b/neutron/objects/ipam.py index a3999932fce..ef0025de9e9 100644 --- a/neutron/objects/ipam.py +++ b/neutron/objects/ipam.py @@ -38,6 +38,8 @@ class IpamAllocationPool(base.NeutronDbObject): 'last_ip': obj_fields.IPAddressField(), } + fields_no_update = ['ipam_subnet_id'] + @classmethod def modify_fields_from_db(cls, db_obj): result = super(IpamAllocationPool, cls).modify_fields_from_db(db_obj) diff --git a/neutron/objects/metering.py b/neutron/objects/metering.py index 76b89cac965..45afc06c1ea 100644 --- a/neutron/objects/metering.py +++ b/neutron/objects/metering.py @@ -38,6 +38,8 @@ class MeteringLabelRule(base.NeutronDbObject): 'excluded': obj_fields.BooleanField(default=False), } + fields_no_update = ['metering_label_id'] + @classmethod def modify_fields_from_db(cls, db_obj): result = super(MeteringLabelRule, cls).modify_fields_from_db(db_obj) diff --git a/neutron/objects/network.py b/neutron/objects/network.py index cb30d160c65..e751bfea88e 100644 --- a/neutron/objects/network.py +++ b/neutron/objects/network.py @@ -52,6 +52,8 @@ class NetworkSegment(base.NeutronDbObject): synthetic_fields = ['hosts'] + fields_no_update = ['network_id'] + foreign_keys = { 'Network': {'network_id': 'id'}, 'PortBindingLevel': {'id': 'segment_id'}, diff --git a/neutron/objects/port/extensions/extra_dhcp_opt.py b/neutron/objects/port/extensions/extra_dhcp_opt.py index 7f661f600fa..2c8fe8b696b 100644 --- a/neutron/objects/port/extensions/extra_dhcp_opt.py +++ b/neutron/objects/port/extensions/extra_dhcp_opt.py @@ -33,6 +33,8 @@ class ExtraDhcpOpt(base.NeutronDbObject): 'ip_version': obj_fields.IntegerField(), } + fields_no_update = ['port_id'] + foreign_keys = { 'Port': {'port_id': 'id'}, } diff --git a/neutron/objects/ports.py b/neutron/objects/ports.py index c7672db2919..27f2b47b570 100644 --- a/neutron/objects/ports.py +++ b/neutron/objects/ports.py @@ -156,6 +156,8 @@ class IPAllocation(base.NeutronDbObject): 'ip_address': obj_fields.IPAddressField(), } + fields_no_update = fields.keys() + primary_keys = ['subnet_id', 'network_id', 'ip_address'] foreign_keys = { @@ -261,6 +263,8 @@ class Port(base.NeutronDbObject): # field in later object iterations } + fields_no_update = ['project_id', 'network_id'] + synthetic_fields = [ 'allowed_address_pairs', 'binding', diff --git a/neutron/objects/securitygroup.py b/neutron/objects/securitygroup.py index 92f4f2d46c7..d48dad31925 100644 --- a/neutron/objects/securitygroup.py +++ b/neutron/objects/securitygroup.py @@ -104,7 +104,7 @@ class SecurityGroupRule(base.NeutronDbObject): foreign_keys = {'SecurityGroup': {'security_group_id': 'id'}} - fields_no_update = ['project_id', 'security_group_id'] + fields_no_update = ['project_id', 'security_group_id', 'remote_group_id'] # TODO(sayalilunkad): get rid of it once we switch the db model to using # custom types. diff --git a/neutron/objects/subnet.py b/neutron/objects/subnet.py index 2fca3e9f886..fcceb1b755a 100644 --- a/neutron/objects/subnet.py +++ b/neutron/objects/subnet.py @@ -116,6 +116,8 @@ class IPAllocationPool(base.NeutronDbObject): 'end': obj_fields.IPAddressField() } + fields_no_update = ['subnet_id'] + @classmethod def modify_fields_from_db(cls, db_obj): # TODO(korzen) remove this method when IP and CIDR decorator ready @@ -195,7 +197,7 @@ class Subnet(base.NeutronDbObject): foreign_keys = {'Network': {'network_id': 'id'}} - fields_no_update = ['project_id'] + fields_no_update = ['project_id', 'network_id', 'segment_id'] fields_need_translation = { 'host_routes': 'routes' diff --git a/neutron/objects/trunk.py b/neutron/objects/trunk.py index 1eaaa03e66c..d07212a99dd 100644 --- a/neutron/objects/trunk.py +++ b/neutron/objects/trunk.py @@ -44,7 +44,7 @@ class SubPort(base.NeutronDbObject): 'segmentation_id': obj_fields.IntegerField(), } - fields_no_update = ['segmentation_type', 'segmentation_id'] + fields_no_update = ['segmentation_type', 'segmentation_id', 'trunk_id'] def to_dict(self): _dict = super(SubPort, self).to_dict()