Skip to content

Commit c96ff39

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "db: Replace use of backref"
2 parents 4fa7a33 + 031eda5 commit c96ff39

File tree

2 files changed

+160
-50
lines changed

2 files changed

+160
-50
lines changed

nova/db/api/models.py

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -147,11 +147,15 @@ class CellMapping(BASE):
147147
transport_url = sa.Column(sa.Text())
148148
database_connection = sa.Column(sa.Text())
149149
disabled = sa.Column(sa.Boolean, default=False)
150+
150151
host_mapping = orm.relationship(
151152
'HostMapping',
152-
backref=orm.backref('cell_mapping', uselist=False),
153-
foreign_keys=id,
154-
primaryjoin='CellMapping.id == HostMapping.cell_id')
153+
back_populates='cell_mapping',
154+
)
155+
instance_mapping = orm.relationship(
156+
'InstanceMapping',
157+
back_populates='cell_mapping',
158+
)
155159

156160

157161
class InstanceMapping(BASE):
@@ -178,11 +182,11 @@ class InstanceMapping(BASE):
178182
# transition period first.
179183
user_id = sa.Column(sa.String(255), nullable=True)
180184
queued_for_delete = sa.Column(sa.Boolean)
185+
181186
cell_mapping = orm.relationship(
182187
'CellMapping',
183-
backref=orm.backref('instance_mapping', uselist=False),
184-
foreign_keys=cell_id,
185-
primaryjoin='InstanceMapping.cell_id == CellMapping.id')
188+
back_populates='instance_mapping',
189+
)
186190

187191

188192
class HostMapping(BASE):
@@ -198,6 +202,11 @@ class HostMapping(BASE):
198202
sa.Integer, sa.ForeignKey('cell_mappings.id'), nullable=False)
199203
host = sa.Column(sa.String(255), nullable=False)
200204

205+
cell_mapping = orm.relationship(
206+
'CellMapping',
207+
back_populates='host_mapping',
208+
)
209+
201210

202211
class RequestSpec(BASE):
203212
"""Represents the information passed to the scheduler."""
@@ -235,6 +244,9 @@ class Flavors(BASE):
235244
is_public = sa.Column(sa.Boolean, default=True)
236245
description = sa.Column(sa.Text)
237246

247+
extra_specs = orm.relationship('FlavorExtraSpecs', back_populates='flavor')
248+
projects = orm.relationship('FlavorProjects', back_populates='flavor')
249+
238250

239251
class FlavorExtraSpecs(BASE):
240252
"""Represents additional specs as key/value pairs for a flavor"""
@@ -251,10 +263,8 @@ class FlavorExtraSpecs(BASE):
251263
value = sa.Column(sa.String(255))
252264
flavor_id = sa.Column(
253265
sa.Integer, sa.ForeignKey('flavors.id'), nullable=False)
254-
flavor = orm.relationship(
255-
Flavors, backref='extra_specs',
256-
foreign_keys=flavor_id,
257-
primaryjoin='FlavorExtraSpecs.flavor_id == Flavors.id')
266+
267+
flavor = orm.relationship(Flavors, back_populates='extra_specs')
258268

259269

260270
class FlavorProjects(BASE):
@@ -267,10 +277,8 @@ class FlavorProjects(BASE):
267277
flavor_id = sa.Column(
268278
sa.Integer, sa.ForeignKey('flavors.id'), nullable=False)
269279
project_id = sa.Column(sa.String(255), nullable=False)
270-
flavor = orm.relationship(
271-
Flavors, backref='projects',
272-
foreign_keys=flavor_id,
273-
primaryjoin='FlavorProjects.flavor_id == Flavors.id')
280+
281+
flavor = orm.relationship(Flavors, back_populates='projects')
274282

275283

276284
class BuildRequest(BASE):
@@ -354,12 +362,9 @@ class InstanceGroup(BASE):
354362
project_id = sa.Column(sa.String(255))
355363
uuid = sa.Column(sa.String(36), nullable=False)
356364
name = sa.Column(sa.String(255))
357-
_policies = orm.relationship(
358-
InstanceGroupPolicy,
359-
primaryjoin='InstanceGroup.id == InstanceGroupPolicy.group_id')
360-
_members = orm.relationship(
361-
InstanceGroupMember,
362-
primaryjoin='InstanceGroup.id == InstanceGroupMember.group_id')
365+
366+
_policies = orm.relationship(InstanceGroupPolicy)
367+
_members = orm.relationship(InstanceGroupMember)
363368

364369
@property
365370
def policy(self):
@@ -487,7 +492,5 @@ class Reservation(BASE):
487492
resource = sa.Column(sa.String(255))
488493
delta = sa.Column(sa.Integer, nullable=False)
489494
expire = sa.Column(sa.DateTime)
490-
usage = orm.relationship(
491-
"QuotaUsage",
492-
foreign_keys=usage_id,
493-
primaryjoin='Reservation.usage_id == QuotaUsage.id')
495+
496+
usage = orm.relationship('QuotaUsage')

nova/db/main/models.py

Lines changed: 133 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,8 @@ class Service(BASE, NovaBase, models.SoftDeleteMixin):
161161
version = sa.Column(sa.Integer, default=0)
162162

163163
instance = orm.relationship(
164-
"Instance",
165-
backref='services',
164+
'Instance',
165+
back_populates='services',
166166
primaryjoin='and_(Service.host == Instance.host,'
167167
'Service.binary == "nova-compute",'
168168
'Instance.deleted == 0)',
@@ -425,6 +425,96 @@ def _extra_keys(self):
425425

426426
hidden = sa.Column(sa.Boolean, default=False)
427427

428+
block_device_mapping = orm.relationship(
429+
'BlockDeviceMapping',
430+
back_populates='instance',
431+
primaryjoin=(
432+
'and_(BlockDeviceMapping.instance_uuid == Instance.uuid, '
433+
'BlockDeviceMapping.deleted == 0)'
434+
),
435+
)
436+
console_auth_tokens = orm.relationship(
437+
'ConsoleAuthToken',
438+
back_populates='instance',
439+
foreign_keys='ConsoleAuthToken.instance_uuid',
440+
primaryjoin=(
441+
'and_(Instance.uuid == ConsoleAuthToken.instance_uuid,'
442+
'Instance.deleted == 0)'
443+
),
444+
)
445+
extra = orm.relationship(
446+
'InstanceExtra',
447+
back_populates='instance',
448+
uselist=False,
449+
)
450+
info_cache = orm.relationship(
451+
'InstanceInfoCache',
452+
back_populates='instance',
453+
uselist=False,
454+
)
455+
pci_devices = orm.relationship(
456+
'PciDevice',
457+
back_populates='instance',
458+
foreign_keys='PciDevice.instance_uuid',
459+
primaryjoin=(
460+
'and_(Instance.uuid == PciDevice.instance_uuid,'
461+
'PciDevice.deleted == 0)'
462+
),
463+
)
464+
services = orm.relationship(
465+
'Service',
466+
back_populates='instance',
467+
primaryjoin=(
468+
'and_(Instance.host == Service.host,'
469+
'Service.binary == "nova-compute",'
470+
'Instance.deleted == 0)'
471+
),
472+
foreign_keys='Service.host',
473+
)
474+
security_groups = orm.relationship(
475+
'SecurityGroup',
476+
secondary='security_group_instance_association',
477+
back_populates='instances',
478+
primaryjoin=(
479+
'and_('
480+
'SecurityGroupInstanceAssociation.instance_uuid == Instance.uuid,'
481+
# (anthony) the condition below shouldn't be necessary now that the
482+
# association is being marked as deleted. However, removing this
483+
# may cause existing deployments to choke, so I'm leaving it
484+
'Instance.deleted == 0)'
485+
),
486+
secondaryjoin=(
487+
'and_('
488+
'SecurityGroup.id == SecurityGroupInstanceAssociation.security_group_id,' # noqa: E501
489+
'SecurityGroupInstanceAssociation.deleted == 0,'
490+
'SecurityGroup.deleted == 0)'
491+
),
492+
)
493+
system_metadata = orm.relationship(
494+
'InstanceSystemMetadata',
495+
back_populates='instance',
496+
)
497+
tags = orm.relationship(
498+
'Tag',
499+
back_populates='instance',
500+
primaryjoin=(
501+
'and_(Instance.uuid == Tag.resource_id,Instance.deleted == 0)'
502+
),
503+
foreign_keys='Tag.resource_id',
504+
)
505+
506+
507+
# NOTE(stephenfin): https://github.com/sqlalchemy/sqlalchemy/discussions/8619
508+
Instance.metadata = orm.relationship(
509+
'InstanceMetadata',
510+
back_populates='instance',
511+
foreign_keys='InstanceMetadata.instance_uuid',
512+
primaryjoin=(
513+
'and_(Instance.uuid == InstanceMetadata.instance_uuid,'
514+
'InstanceMetadata.deleted == 0)'
515+
),
516+
)
517+
428518

429519
class InstanceInfoCache(BASE, NovaBase, models.SoftDeleteMixin):
430520
"""Represents a cache of information about an instance
@@ -442,7 +532,7 @@ class InstanceInfoCache(BASE, NovaBase, models.SoftDeleteMixin):
442532
instance_uuid = sa.Column(sa.String(36), sa.ForeignKey('instances.uuid'),
443533
nullable=False)
444534
instance = orm.relationship(Instance,
445-
backref=orm.backref('info_cache', uselist=False),
535+
back_populates='info_cache',
446536
foreign_keys=instance_uuid,
447537
primaryjoin=instance_uuid == Instance.uuid)
448538

@@ -466,8 +556,7 @@ class InstanceExtra(BASE, NovaBase, models.SoftDeleteMixin):
466556
# and can be removed in the future release.
467557
resources = orm.deferred(sa.Column(sa.Text))
468558
instance = orm.relationship(Instance,
469-
backref=orm.backref('extra',
470-
uselist=False),
559+
back_populates='extra',
471560
foreign_keys=instance_uuid,
472561
primaryjoin=instance_uuid == Instance.uuid)
473562

@@ -616,7 +705,7 @@ class BlockDeviceMapping(BASE, NovaBase, models.SoftDeleteMixin):
616705
# transition period first.
617706
uuid = sa.Column(sa.String(36))
618707
instance = orm.relationship(Instance,
619-
backref=orm.backref('block_device_mapping'),
708+
back_populates='block_device_mapping',
620709
foreign_keys=instance_uuid,
621710
primaryjoin='and_(BlockDeviceMapping.'
622711
'instance_uuid=='
@@ -664,10 +753,9 @@ class BlockDeviceMapping(BASE, NovaBase, models.SoftDeleteMixin):
664753
encryption_format = sa.Column(sa.String(128))
665754
encryption_options = sa.Column(sa.String(4096))
666755

756+
667757
# TODO(stephenfin): Remove once we drop the security_groups field from the
668758
# Instance table. Until then, this is tied to the SecurityGroup table
669-
670-
671759
class SecurityGroupInstanceAssociation(BASE, NovaBase, models.SoftDeleteMixin):
672760
__tablename__ = 'security_group_instance_association'
673761
__table_args__ = (
@@ -698,6 +786,7 @@ class SecurityGroup(BASE, NovaBase, models.SoftDeleteMixin):
698786
project_id = sa.Column(sa.String(255))
699787

700788
instances = orm.relationship(Instance,
789+
back_populates='security_groups',
701790
secondary = "security_group_instance_association",
702791
primaryjoin = 'and_('
703792
'SecurityGroup.id == '
@@ -709,8 +798,17 @@ class SecurityGroup(BASE, NovaBase, models.SoftDeleteMixin):
709798
# (anthony) the condition below shouldn't be necessary now that the
710799
# association is being marked as deleted. However, removing this
711800
# may cause existing deployments to choke, so I'm leaving it
712-
'Instance.deleted == 0)',
713-
backref='security_groups')
801+
'Instance.deleted == 0)')
802+
803+
rules = orm.relationship(
804+
'SecurityGroupIngressRule',
805+
primaryjoin=(
806+
'and_('
807+
'SecurityGroupIngressRule.parent_group_id == SecurityGroup.id,'
808+
'SecurityGroupIngressRule.deleted == 0)'
809+
),
810+
back_populates='parent_group',
811+
)
714812

715813

716814
# TODO(stephenfin): Remove once we drop the security_groups field from the
@@ -723,8 +821,9 @@ class SecurityGroupIngressRule(BASE, NovaBase, models.SoftDeleteMixin):
723821

724822
parent_group_id = sa.Column(
725823
sa.Integer, sa.ForeignKey('security_groups.id'))
726-
parent_group = orm.relationship("SecurityGroup", backref="rules",
727-
foreign_keys=parent_group_id,
824+
parent_group = orm.relationship("SecurityGroup",
825+
back_populates="rules",
826+
foreign_keys=[parent_group_id],
728827
primaryjoin='and_('
729828
'SecurityGroupIngressRule.parent_group_id == SecurityGroup.id,'
730829
'SecurityGroupIngressRule.deleted == 0)')
@@ -738,7 +837,7 @@ class SecurityGroupIngressRule(BASE, NovaBase, models.SoftDeleteMixin):
738837
# granting access for.
739838
group_id = sa.Column(sa.Integer, sa.ForeignKey('security_groups.id'))
740839
grantee_group = orm.relationship("SecurityGroup",
741-
foreign_keys=group_id,
840+
foreign_keys=[group_id],
742841
primaryjoin='and_('
743842
'SecurityGroupIngressRule.group_id == SecurityGroup.id,'
744843
'SecurityGroupIngressRule.deleted == 0)')
@@ -824,12 +923,16 @@ class InstanceMetadata(BASE, NovaBase, models.SoftDeleteMixin):
824923
key = sa.Column(sa.String(255))
825924
value = sa.Column(sa.String(255))
826925
instance_uuid = sa.Column(sa.String(36), sa.ForeignKey('instances.uuid'))
827-
instance = orm.relationship(Instance, backref="metadata",
828-
foreign_keys=instance_uuid,
829-
primaryjoin='and_('
830-
'InstanceMetadata.instance_uuid == '
831-
'Instance.uuid,'
832-
'InstanceMetadata.deleted == 0)')
926+
927+
instance = orm.relationship(
928+
Instance,
929+
back_populates="metadata",
930+
foreign_keys=instance_uuid,
931+
primaryjoin=(
932+
'and_(InstanceMetadata.instance_uuid == Instance.uuid,'
933+
'InstanceMetadata.deleted == 0)'
934+
),
935+
)
833936

834937

835938
class InstanceSystemMetadata(BASE, NovaBase, models.SoftDeleteMixin):
@@ -845,8 +948,11 @@ class InstanceSystemMetadata(BASE, NovaBase, models.SoftDeleteMixin):
845948
sa.ForeignKey('instances.uuid'),
846949
nullable=False)
847950

848-
instance = orm.relationship(Instance, backref="system_metadata",
849-
foreign_keys=instance_uuid)
951+
instance = orm.relationship(
952+
Instance,
953+
back_populates='system_metadata',
954+
foreign_keys=instance_uuid,
955+
)
850956

851957

852958
class VolumeUsage(BASE, NovaBase, models.SoftDeleteMixin):
@@ -1022,7 +1128,8 @@ class PciDevice(BASE, NovaBase, models.SoftDeleteMixin):
10221128
numa_node = sa.Column(sa.Integer, nullable=True)
10231129

10241130
parent_addr = sa.Column(sa.String(12), nullable=True)
1025-
instance = orm.relationship(Instance, backref="pci_devices",
1131+
instance = orm.relationship(Instance,
1132+
back_populates="pci_devices",
10261133
foreign_keys=instance_uuid,
10271134
primaryjoin='and_('
10281135
'PciDevice.instance_uuid == Instance.uuid,'
@@ -1040,11 +1147,11 @@ class Tag(BASE, models.ModelBase):
10401147
tag = sa.Column(sa.Unicode(80), primary_key=True, nullable=False)
10411148

10421149
instance = orm.relationship(
1043-
"Instance",
1044-
backref='tags',
1150+
'Instance',
1151+
back_populates='tags',
1152+
foreign_keys=resource_id,
10451153
primaryjoin='and_(Tag.resource_id == Instance.uuid,'
10461154
'Instance.deleted == 0)',
1047-
foreign_keys=resource_id
10481155
)
10491156

10501157

@@ -1074,7 +1181,7 @@ class ConsoleAuthToken(BASE, NovaBase):
10741181

10751182
instance = orm.relationship(
10761183
"Instance",
1077-
backref='console_auth_tokens',
1184+
back_populates='console_auth_tokens',
10781185
primaryjoin='and_(ConsoleAuthToken.instance_uuid == Instance.uuid,'
10791186
'Instance.deleted == 0)',
10801187
foreign_keys=instance_uuid

0 commit comments

Comments
 (0)