Fixes #19440: Ensure data migrations use the correct database connection

This commit is contained in:
Jeremy Stretch
2025-05-08 14:53:52 -04:00
parent 8baf15771a
commit 76aa255f07
32 changed files with 197 additions and 131 deletions

View File

@@ -4,18 +4,19 @@ from netbox.settings import DISK_BASE_UNIT
def convert_disk_size(apps, schema_editor):
VirtualMachine = apps.get_model('virtualization', 'VirtualMachine')
VirtualMachine.objects.filter(disk__isnull=False).update(disk=F('disk') * DISK_BASE_UNIT)
VirtualDisk = apps.get_model('virtualization', 'VirtualDisk')
VirtualDisk.objects.filter(size__isnull=False).update(size=F('size') * DISK_BASE_UNIT)
VirtualMachine = apps.get_model('virtualization', 'VirtualMachine')
db_alias = schema_editor.connection.alias
VirtualMachine.objects.using(db_alias).filter(disk__isnull=False).update(disk=F('disk') * DISK_BASE_UNIT)
VirtualDisk.objects.using(db_alias).filter(size__isnull=False).update(size=F('size') * DISK_BASE_UNIT)
# Recalculate disk size on all VMs with virtual disks
id_list = VirtualDisk.objects.values_list('virtual_machine_id').distinct()
virtual_machines = VirtualMachine.objects.filter(id__in=id_list)
id_list = VirtualDisk.objects.using(db_alias).values_list('virtual_machine_id').distinct()
virtual_machines = VirtualMachine.objects.using(db_alias).filter(id__in=id_list)
for vm in virtual_machines:
vm.disk = vm.virtualdisks.aggregate(Sum('size', default=0))['size__sum']
VirtualMachine.objects.bulk_update(virtual_machines, fields=['disk'])
VirtualMachine.objects.using(db_alias).bulk_update(virtual_machines, fields=['disk'])
class Migration(migrations.Migration):

View File

@@ -6,8 +6,9 @@ def set_null_values(apps, schema_editor):
Replace empty strings with null values.
"""
VMInterface = apps.get_model('virtualization', 'VMInterface')
db_alias = schema_editor.connection.alias
VMInterface.objects.filter(mode='').update(mode=None)
VMInterface.objects.using(db_alias).filter(mode='').update(mode=None)
class Migration(migrations.Migration):

View File

@@ -9,9 +9,11 @@ def copy_site_assignments(apps, schema_editor):
ContentType = apps.get_model('contenttypes', 'ContentType')
Cluster = apps.get_model('virtualization', 'Cluster')
Site = apps.get_model('dcim', 'Site')
db_alias = schema_editor.connection.alias
Cluster.objects.filter(site__isnull=False).update(
scope_type=ContentType.objects.get_for_model(Site), scope_id=models.F('site_id')
Cluster.objects.using(db_alias).filter(site__isnull=False).update(
scope_type=ContentType.objects.get_for_model(Site),
scope_id=models.F('site_id')
)

View File

@@ -7,15 +7,16 @@ def populate_denormalized_fields(apps, schema_editor):
Copy the denormalized fields for _region, _site_group and _site from existing site field.
"""
Cluster = apps.get_model('virtualization', 'Cluster')
db_alias = schema_editor.connection.alias
clusters = Cluster.objects.filter(site__isnull=False).prefetch_related('site')
clusters = Cluster.objects.using(db_alias).filter(site__isnull=False).prefetch_related('site')
for cluster in clusters:
cluster._region_id = cluster.site.region_id
cluster._site_group_id = cluster.site.group_id
cluster._site_id = cluster.site_id
# Note: Location cannot be set prior to migration
Cluster.objects.bulk_update(clusters, ['_region', '_site_group', '_site'], batch_size=100)
Cluster.objects.using(db_alias).bulk_update(clusters, ['_region', '_site_group', '_site'], batch_size=100)
class Migration(migrations.Migration):

View File

@@ -6,19 +6,24 @@ def populate_mac_addresses(apps, schema_editor):
ContentType = apps.get_model('contenttypes', 'ContentType')
VMInterface = apps.get_model('virtualization', 'VMInterface')
MACAddress = apps.get_model('dcim', 'MACAddress')
db_alias = schema_editor.connection.alias
vminterface_ct = ContentType.objects.get_for_model(VMInterface)
mac_addresses = [
MACAddress(
mac_address=vminterface.mac_address, assigned_object_type=vminterface_ct, assigned_object_id=vminterface.pk
mac_address=vminterface.mac_address,
assigned_object_type=vminterface_ct,
assigned_object_id=vminterface.pk
)
for vminterface in VMInterface.objects.filter(mac_address__isnull=False)
for vminterface in VMInterface.objects.using(db_alias).filter(mac_address__isnull=False)
]
MACAddress.objects.bulk_create(mac_addresses, batch_size=100)
MACAddress.objects.using(db_alias).bulk_create(mac_addresses, batch_size=100)
# TODO: Optimize interface updates
for mac_address in mac_addresses:
VMInterface.objects.filter(pk=mac_address.assigned_object_id).update(primary_mac_address=mac_address)
VMInterface.objects.using(db_alias).filter(pk=mac_address.assigned_object_id).update(
primary_mac_address=mac_address
)
class Migration(migrations.Migration):