mirror of
https://github.com/netbox-community/netbox.git
synced 2026-01-24 04:22:41 -06:00
Fixes #19440: Ensure data migrations use the correct database connection
This commit is contained in:
@@ -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):
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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')
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user