mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-13 16:47:34 -06:00
Fixes #19440: Ensure data migrations use the correct database connection
This commit is contained in:
parent
8baf15771a
commit
76aa255f07
@ -8,10 +8,11 @@ def set_null_values(apps, schema_editor):
|
||||
Circuit = apps.get_model('circuits', 'Circuit')
|
||||
CircuitGroupAssignment = apps.get_model('circuits', 'CircuitGroupAssignment')
|
||||
CircuitTermination = apps.get_model('circuits', 'CircuitTermination')
|
||||
db_alias = schema_editor.connection.alias
|
||||
|
||||
Circuit.objects.filter(distance_unit='').update(distance_unit=None)
|
||||
CircuitGroupAssignment.objects.filter(priority='').update(priority=None)
|
||||
CircuitTermination.objects.filter(cable_end='').update(cable_end=None)
|
||||
Circuit.objects.using(db_alias).filter(distance_unit='').update(distance_unit=None)
|
||||
CircuitGroupAssignment.objects.using(db_alias).filter(priority='').update(priority=None)
|
||||
CircuitTermination.objects.using(db_alias).filter(cable_end='').update(cable_end=None)
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
@ -8,14 +8,15 @@ def copy_site_assignments(apps, schema_editor):
|
||||
"""
|
||||
ContentType = apps.get_model('contenttypes', 'ContentType')
|
||||
CircuitTermination = apps.get_model('circuits', 'CircuitTermination')
|
||||
ProviderNetwork = apps.get_model('circuits', 'ProviderNetwork')
|
||||
Site = apps.get_model('dcim', 'Site')
|
||||
db_alias = schema_editor.connection.alias
|
||||
|
||||
CircuitTermination.objects.filter(site__isnull=False).update(
|
||||
CircuitTermination.objects.using(db_alias).filter(site__isnull=False).update(
|
||||
termination_type=ContentType.objects.get_for_model(Site), termination_id=models.F('site_id')
|
||||
)
|
||||
|
||||
ProviderNetwork = apps.get_model('circuits', 'ProviderNetwork')
|
||||
CircuitTermination.objects.filter(provider_network__isnull=False).update(
|
||||
CircuitTermination.objects.using(db_alias).filter(provider_network__isnull=False).update(
|
||||
termination_type=ContentType.objects.get_for_model(ProviderNetwork),
|
||||
termination_id=models.F('provider_network_id'),
|
||||
)
|
||||
|
@ -7,15 +7,20 @@ def populate_denormalized_fields(apps, schema_editor):
|
||||
Copy site ForeignKey values to the Termination GFK.
|
||||
"""
|
||||
CircuitTermination = apps.get_model('circuits', 'CircuitTermination')
|
||||
db_alias = schema_editor.connection.alias
|
||||
|
||||
terminations = CircuitTermination.objects.filter(site__isnull=False).prefetch_related('site')
|
||||
terminations = CircuitTermination.objects.using(db_alias).filter(site__isnull=False).prefetch_related('site')
|
||||
for termination in terminations:
|
||||
termination._region_id = termination.site.region_id
|
||||
termination._site_group_id = termination.site.group_id
|
||||
termination._site_id = termination.site_id
|
||||
# Note: Location cannot be set prior to migration
|
||||
|
||||
CircuitTermination.objects.bulk_update(terminations, ['_region', '_site_group', '_site'], batch_size=100)
|
||||
CircuitTermination.objects.using(db_alias).bulk_update(
|
||||
terminations,
|
||||
['_region', '_site_group', '_site'],
|
||||
batch_size=100
|
||||
)
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
@ -9,8 +9,9 @@ def set_member_type(apps, schema_editor):
|
||||
ContentType = apps.get_model('contenttypes', 'ContentType')
|
||||
Circuit = apps.get_model('circuits', 'Circuit')
|
||||
CircuitGroupAssignment = apps.get_model('circuits', 'CircuitGroupAssignment')
|
||||
db_alias = schema_editor.connection.alias
|
||||
|
||||
CircuitGroupAssignment.objects.update(
|
||||
CircuitGroupAssignment.objects.using(db_alias).update(
|
||||
member_type=ContentType.objects.get_for_model(Circuit)
|
||||
)
|
||||
|
||||
|
@ -26,49 +26,50 @@ def set_null_values(apps, schema_editor):
|
||||
RackType = apps.get_model('dcim', 'RackType')
|
||||
RearPort = apps.get_model('dcim', 'RearPort')
|
||||
Site = apps.get_model('dcim', 'Site')
|
||||
db_alias = schema_editor.connection.alias
|
||||
|
||||
Cable.objects.filter(length_unit='').update(length_unit=None)
|
||||
Cable.objects.filter(type='').update(type=None)
|
||||
ConsolePort.objects.filter(cable_end='').update(cable_end=None)
|
||||
ConsolePort.objects.filter(type='').update(type=None)
|
||||
ConsolePortTemplate.objects.filter(type='').update(type=None)
|
||||
ConsoleServerPort.objects.filter(cable_end='').update(cable_end=None)
|
||||
ConsoleServerPort.objects.filter(type='').update(type=None)
|
||||
ConsoleServerPortTemplate.objects.filter(type='').update(type=None)
|
||||
Device.objects.filter(airflow='').update(airflow=None)
|
||||
Device.objects.filter(face='').update(face=None)
|
||||
DeviceType.objects.filter(airflow='').update(airflow=None)
|
||||
DeviceType.objects.filter(subdevice_role='').update(subdevice_role=None)
|
||||
DeviceType.objects.filter(weight_unit='').update(weight_unit=None)
|
||||
FrontPort.objects.filter(cable_end='').update(cable_end=None)
|
||||
Interface.objects.filter(cable_end='').update(cable_end=None)
|
||||
Interface.objects.filter(mode='').update(mode=None)
|
||||
Interface.objects.filter(poe_mode='').update(poe_mode=None)
|
||||
Interface.objects.filter(poe_type='').update(poe_type=None)
|
||||
Interface.objects.filter(rf_channel='').update(rf_channel=None)
|
||||
Interface.objects.filter(rf_role='').update(rf_role=None)
|
||||
InterfaceTemplate.objects.filter(poe_mode='').update(poe_mode=None)
|
||||
InterfaceTemplate.objects.filter(poe_type='').update(poe_type=None)
|
||||
InterfaceTemplate.objects.filter(rf_role='').update(rf_role=None)
|
||||
ModuleType.objects.filter(airflow='').update(airflow=None)
|
||||
ModuleType.objects.filter(weight_unit='').update(weight_unit=None)
|
||||
PowerFeed.objects.filter(cable_end='').update(cable_end=None)
|
||||
PowerOutlet.objects.filter(cable_end='').update(cable_end=None)
|
||||
PowerOutlet.objects.filter(feed_leg='').update(feed_leg=None)
|
||||
PowerOutlet.objects.filter(type='').update(type=None)
|
||||
PowerOutletTemplate.objects.filter(feed_leg='').update(feed_leg=None)
|
||||
PowerOutletTemplate.objects.filter(type='').update(type=None)
|
||||
PowerPort.objects.filter(cable_end='').update(cable_end=None)
|
||||
PowerPort.objects.filter(type='').update(type=None)
|
||||
PowerPortTemplate.objects.filter(type='').update(type=None)
|
||||
Rack.objects.filter(airflow='').update(airflow=None)
|
||||
Rack.objects.filter(form_factor='').update(form_factor=None)
|
||||
Rack.objects.filter(outer_unit='').update(outer_unit=None)
|
||||
Rack.objects.filter(weight_unit='').update(weight_unit=None)
|
||||
RackType.objects.filter(outer_unit='').update(outer_unit=None)
|
||||
RackType.objects.filter(weight_unit='').update(weight_unit=None)
|
||||
RearPort.objects.filter(cable_end='').update(cable_end=None)
|
||||
Site.objects.filter(time_zone='').update(time_zone=None)
|
||||
Cable.objects.using(db_alias).filter(length_unit='').update(length_unit=None)
|
||||
Cable.objects.using(db_alias).filter(type='').update(type=None)
|
||||
ConsolePort.objects.using(db_alias).filter(cable_end='').update(cable_end=None)
|
||||
ConsolePort.objects.using(db_alias).filter(type='').update(type=None)
|
||||
ConsolePortTemplate.objects.using(db_alias).filter(type='').update(type=None)
|
||||
ConsoleServerPort.objects.using(db_alias).filter(cable_end='').update(cable_end=None)
|
||||
ConsoleServerPort.objects.using(db_alias).filter(type='').update(type=None)
|
||||
ConsoleServerPortTemplate.objects.using(db_alias).filter(type='').update(type=None)
|
||||
Device.objects.using(db_alias).filter(airflow='').update(airflow=None)
|
||||
Device.objects.using(db_alias).filter(face='').update(face=None)
|
||||
DeviceType.objects.using(db_alias).filter(airflow='').update(airflow=None)
|
||||
DeviceType.objects.using(db_alias).filter(subdevice_role='').update(subdevice_role=None)
|
||||
DeviceType.objects.using(db_alias).filter(weight_unit='').update(weight_unit=None)
|
||||
FrontPort.objects.using(db_alias).filter(cable_end='').update(cable_end=None)
|
||||
Interface.objects.using(db_alias).filter(cable_end='').update(cable_end=None)
|
||||
Interface.objects.using(db_alias).filter(mode='').update(mode=None)
|
||||
Interface.objects.using(db_alias).filter(poe_mode='').update(poe_mode=None)
|
||||
Interface.objects.using(db_alias).filter(poe_type='').update(poe_type=None)
|
||||
Interface.objects.using(db_alias).filter(rf_channel='').update(rf_channel=None)
|
||||
Interface.objects.using(db_alias).filter(rf_role='').update(rf_role=None)
|
||||
InterfaceTemplate.objects.using(db_alias).filter(poe_mode='').update(poe_mode=None)
|
||||
InterfaceTemplate.objects.using(db_alias).filter(poe_type='').update(poe_type=None)
|
||||
InterfaceTemplate.objects.using(db_alias).filter(rf_role='').update(rf_role=None)
|
||||
ModuleType.objects.using(db_alias).filter(airflow='').update(airflow=None)
|
||||
ModuleType.objects.using(db_alias).filter(weight_unit='').update(weight_unit=None)
|
||||
PowerFeed.objects.using(db_alias).filter(cable_end='').update(cable_end=None)
|
||||
PowerOutlet.objects.using(db_alias).filter(cable_end='').update(cable_end=None)
|
||||
PowerOutlet.objects.using(db_alias).filter(feed_leg='').update(feed_leg=None)
|
||||
PowerOutlet.objects.using(db_alias).filter(type='').update(type=None)
|
||||
PowerOutletTemplate.objects.using(db_alias).filter(feed_leg='').update(feed_leg=None)
|
||||
PowerOutletTemplate.objects.using(db_alias).filter(type='').update(type=None)
|
||||
PowerPort.objects.using(db_alias).filter(cable_end='').update(cable_end=None)
|
||||
PowerPort.objects.using(db_alias).filter(type='').update(type=None)
|
||||
PowerPortTemplate.objects.using(db_alias).filter(type='').update(type=None)
|
||||
Rack.objects.using(db_alias).filter(airflow='').update(airflow=None)
|
||||
Rack.objects.using(db_alias).filter(form_factor='').update(form_factor=None)
|
||||
Rack.objects.using(db_alias).filter(outer_unit='').update(outer_unit=None)
|
||||
Rack.objects.using(db_alias).filter(weight_unit='').update(weight_unit=None)
|
||||
RackType.objects.using(db_alias).filter(outer_unit='').update(outer_unit=None)
|
||||
RackType.objects.using(db_alias).filter(weight_unit='').update(weight_unit=None)
|
||||
RearPort.objects.using(db_alias).filter(cable_end='').update(cable_end=None)
|
||||
Site.objects.using(db_alias).filter(time_zone='').update(time_zone=None)
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
@ -6,19 +6,26 @@ def populate_mac_addresses(apps, schema_editor):
|
||||
ContentType = apps.get_model('contenttypes', 'ContentType')
|
||||
Interface = apps.get_model('dcim', 'Interface')
|
||||
MACAddress = apps.get_model('dcim', 'MACAddress')
|
||||
db_alias = schema_editor.connection.alias
|
||||
interface_ct = ContentType.objects.get_for_model(Interface)
|
||||
|
||||
mac_addresses = [
|
||||
MACAddress(
|
||||
mac_address=interface.mac_address, assigned_object_type=interface_ct, assigned_object_id=interface.pk
|
||||
mac_address=interface.mac_address,
|
||||
assigned_object_type=interface_ct,
|
||||
assigned_object_id=interface.pk
|
||||
)
|
||||
for interface in Interface.objects.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:
|
||||
Interface.objects.filter(pk=mac_address.assigned_object_id).update(primary_mac_address=mac_address)
|
||||
Interface.objects.using(db_alias).filter(
|
||||
pk=mac_address.assigned_object_id
|
||||
).update(
|
||||
primary_mac_address=mac_address
|
||||
)
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
@ -11,6 +11,8 @@ def load_initial_data(apps, schema_editor):
|
||||
Load initial ModuleTypeProfile objects from file.
|
||||
"""
|
||||
ModuleTypeProfile = apps.get_model('dcim', 'ModuleTypeProfile')
|
||||
db_alias = schema_editor.connection.alias
|
||||
|
||||
initial_profiles = (
|
||||
'cpu',
|
||||
'fan',
|
||||
@ -25,7 +27,7 @@ def load_initial_data(apps, schema_editor):
|
||||
with file_path.open('r') as f:
|
||||
data = json.load(f)
|
||||
try:
|
||||
ModuleTypeProfile.objects.create(**data)
|
||||
ModuleTypeProfile.objects.using(db_alias).create(**data)
|
||||
except Exception as e:
|
||||
print(f"Error loading data from {file_path}")
|
||||
raise e
|
||||
|
@ -4,11 +4,12 @@ from django.db import migrations
|
||||
def convert_reportmodule_jobs(apps, schema_editor):
|
||||
ContentType = apps.get_model('contenttypes', 'ContentType')
|
||||
Job = apps.get_model('core', 'Job')
|
||||
db_alias = schema_editor.connection.alias
|
||||
|
||||
# Convert all ReportModule jobs to ScriptModule jobs
|
||||
if reportmodule_ct := ContentType.objects.filter(app_label='extras', model='reportmodule').first():
|
||||
scriptmodule_ct = ContentType.objects.get(app_label='extras', model='scriptmodule')
|
||||
Job.objects.filter(object_type_id=reportmodule_ct.id).update(object_type_id=scriptmodule_ct.id)
|
||||
if reportmodule_ct := ContentType.objects.using(db_alias).filter(app_label='extras', model='reportmodule').first():
|
||||
scriptmodule_ct = ContentType.objects.using(db_alias).get(app_label='extras', model='scriptmodule')
|
||||
Job.objects.using(db_alias).filter(object_type_id=reportmodule_ct.id).update(object_type_id=scriptmodule_ct.id)
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
@ -88,24 +88,33 @@ def update_scripts(apps, schema_editor):
|
||||
ScriptModule = apps.get_model('extras', 'ScriptModule')
|
||||
ReportModule = apps.get_model('extras', 'ReportModule')
|
||||
Job = apps.get_model('core', 'Job')
|
||||
db_alias = schema_editor.connection.alias
|
||||
|
||||
script_ct = ContentType.objects.get_for_model(Script, for_concrete_model=False)
|
||||
scriptmodule_ct = ContentType.objects.get_for_model(ScriptModule, for_concrete_model=False)
|
||||
reportmodule_ct = ContentType.objects.get_for_model(ReportModule, for_concrete_model=False)
|
||||
|
||||
for module in ScriptModule.objects.all():
|
||||
for module in ScriptModule.objects.using(db_alias).all():
|
||||
for script_name in get_module_scripts(module):
|
||||
script = Script.objects.create(
|
||||
script = Script.objects.using(db_alias).create(
|
||||
name=script_name,
|
||||
module=module,
|
||||
)
|
||||
|
||||
# Update all Jobs associated with this ScriptModule & script name to point to the new Script object
|
||||
Job.objects.filter(object_type_id=scriptmodule_ct.id, object_id=module.pk, name=script_name).update(
|
||||
Job.objects.using(db_alias).filter(
|
||||
object_type_id=scriptmodule_ct.id,
|
||||
object_id=module.pk,
|
||||
name=script_name
|
||||
).update(
|
||||
object_type_id=script_ct.id, object_id=script.pk
|
||||
)
|
||||
# Update all Jobs associated with this ScriptModule & script name to point to the new Script object
|
||||
Job.objects.filter(object_type_id=reportmodule_ct.id, object_id=module.pk, name=script_name).update(
|
||||
Job.objects.using(db_alias).filter(
|
||||
object_type_id=reportmodule_ct.id,
|
||||
object_id=module.pk,
|
||||
name=script_name
|
||||
).update(
|
||||
object_type_id=script_ct.id, object_id=script.pk
|
||||
)
|
||||
|
||||
@ -119,16 +128,22 @@ def update_event_rules(apps, schema_editor):
|
||||
Script = apps.get_model('extras', 'Script')
|
||||
ScriptModule = apps.get_model('extras', 'ScriptModule')
|
||||
EventRule = apps.get_model('extras', 'EventRule')
|
||||
db_alias = schema_editor.connection.alias
|
||||
|
||||
script_ct = ContentType.objects.get_for_model(Script)
|
||||
scriptmodule_ct = ContentType.objects.get_for_model(ScriptModule)
|
||||
|
||||
for eventrule in EventRule.objects.filter(action_object_type=scriptmodule_ct):
|
||||
for eventrule in EventRule.objects.using(db_alias).filter(action_object_type=scriptmodule_ct):
|
||||
name = eventrule.action_parameters.get('script_name')
|
||||
obj, __ = Script.objects.get_or_create(
|
||||
module_id=eventrule.action_object_id, name=name, defaults={'is_executable': False}
|
||||
obj, __ = Script.objects.using(db_alias).get_or_create(
|
||||
module_id=eventrule.action_object_id,
|
||||
name=name,
|
||||
defaults={'is_executable': False}
|
||||
)
|
||||
EventRule.objects.using(db_alias).filter(pk=eventrule.pk).update(
|
||||
action_object_type=script_ct,
|
||||
action_object_id=obj.id
|
||||
)
|
||||
EventRule.objects.filter(pk=eventrule.pk).update(action_object_type=script_ct, action_object_id=obj.id)
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
@ -1,12 +1,11 @@
|
||||
# Generated by Django 5.0.4 on 2024-04-24 20:09
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
def update_dashboard_widgets(apps, schema_editor):
|
||||
Dashboard = apps.get_model('extras', 'Dashboard')
|
||||
db_alias = schema_editor.connection.alias
|
||||
|
||||
for dashboard in Dashboard.objects.all():
|
||||
for dashboard in Dashboard.objects.using(db_alias).all():
|
||||
for key, widget in dashboard.config.items():
|
||||
if models := widget['config'].get('models'):
|
||||
models = list(map(lambda x: x.replace('users.netboxgroup', 'users.group'), models))
|
||||
|
@ -3,7 +3,9 @@ from django.db import migrations, models
|
||||
|
||||
def update_link_buttons(apps, schema_editor):
|
||||
CustomLink = apps.get_model('extras', 'CustomLink')
|
||||
CustomLink.objects.filter(button_class='outline-dark').update(button_class='default')
|
||||
db_alias = schema_editor.connection.alias
|
||||
|
||||
CustomLink.objects.using(db_alias).filter(button_class='outline-dark').update(button_class='default')
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
@ -3,19 +3,21 @@ from django.db import migrations
|
||||
|
||||
def update_content_types(apps, schema_editor):
|
||||
ContentType = apps.get_model('contenttypes', 'ContentType')
|
||||
db_alias = schema_editor.connection.alias
|
||||
|
||||
# Delete the new ContentTypes effected by the new model in the core app
|
||||
ContentType.objects.filter(app_label='core', model='objectchange').delete()
|
||||
ContentType.objects.using(db_alias).filter(app_label='core', model='objectchange').delete()
|
||||
|
||||
# Update the app labels of the original ContentTypes for extras.ObjectChange to ensure that any
|
||||
# foreign key references are preserved
|
||||
ContentType.objects.filter(app_label='extras', model='objectchange').update(app_label='core')
|
||||
ContentType.objects.using(db_alias).filter(app_label='extras', model='objectchange').update(app_label='core')
|
||||
|
||||
|
||||
def update_dashboard_widgets(apps, schema_editor):
|
||||
Dashboard = apps.get_model('extras', 'Dashboard')
|
||||
db_alias = schema_editor.connection.alias
|
||||
|
||||
for dashboard in Dashboard.objects.all():
|
||||
for dashboard in Dashboard.objects.using(db_alias).all():
|
||||
for key, widget in dashboard.config.items():
|
||||
if widget['config'].get('model') == 'extras.objectchange':
|
||||
widget['config']['model'] = 'core.objectchange'
|
||||
|
@ -6,8 +6,9 @@ from core.events import *
|
||||
|
||||
def set_event_types(apps, schema_editor):
|
||||
EventRule = apps.get_model('extras', 'EventRule')
|
||||
event_rules = EventRule.objects.all()
|
||||
db_alias = schema_editor.connection.alias
|
||||
|
||||
event_rules = EventRule.objects.using(db_alias).all()
|
||||
for event_rule in event_rules:
|
||||
event_rule.event_types = []
|
||||
if event_rule.type_create:
|
||||
|
@ -6,8 +6,9 @@ def set_null_values(apps, schema_editor):
|
||||
Replace empty strings with null values.
|
||||
"""
|
||||
CustomFieldChoiceSet = apps.get_model('extras', 'CustomFieldChoiceSet')
|
||||
db_alias = schema_editor.connection.alias
|
||||
|
||||
CustomFieldChoiceSet.objects.filter(base_choices='').update(base_choices=None)
|
||||
CustomFieldChoiceSet.objects.using(db_alias).filter(base_choices='').update(base_choices=None)
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
@ -8,7 +8,9 @@ def set_kind_default(apps, schema_editor):
|
||||
Set kind to "info" on any entries with no kind assigned.
|
||||
"""
|
||||
JournalEntry = apps.get_model('extras', 'JournalEntry')
|
||||
JournalEntry.objects.filter(kind='').update(kind=JournalEntryKindChoices.KIND_INFO)
|
||||
db_alias = schema_editor.connection.alias
|
||||
|
||||
JournalEntry.objects.using(db_alias).filter(kind='').update(kind=JournalEntryKindChoices.KIND_INFO)
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
@ -11,7 +11,9 @@ def set_vid_ranges(apps, schema_editor):
|
||||
Convert the min_vid & max_vid fields to a range in the new vid_ranges ArrayField.
|
||||
"""
|
||||
VLANGroup = apps.get_model('ipam', 'VLANGroup')
|
||||
for group in VLANGroup.objects.all():
|
||||
db_alias = schema_editor.connection.alias
|
||||
|
||||
for group in VLANGroup.objects.using(db_alias).all():
|
||||
group.vid_ranges = [NumericRange(group.min_vid, group.max_vid, bounds='[]')]
|
||||
group._total_vlan_ids = group.max_vid - group.min_vid + 1
|
||||
group.save()
|
||||
|
@ -9,9 +9,11 @@ def copy_site_assignments(apps, schema_editor):
|
||||
ContentType = apps.get_model('contenttypes', 'ContentType')
|
||||
Prefix = apps.get_model('ipam', 'Prefix')
|
||||
Site = apps.get_model('dcim', 'Site')
|
||||
db_alias = schema_editor.connection.alias
|
||||
|
||||
Prefix.objects.filter(site__isnull=False).update(
|
||||
scope_type=ContentType.objects.get_for_model(Site), scope_id=models.F('site_id')
|
||||
Prefix.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 site ForeignKey values to the scope GFK.
|
||||
"""
|
||||
Prefix = apps.get_model('ipam', 'Prefix')
|
||||
db_alias = schema_editor.connection.alias
|
||||
|
||||
prefixes = Prefix.objects.filter(site__isnull=False).prefetch_related('site')
|
||||
prefixes = Prefix.objects.using(db_alias).filter(site__isnull=False).prefetch_related('site')
|
||||
for prefix in prefixes:
|
||||
prefix._region_id = prefix.site.region_id
|
||||
prefix._site_group_id = prefix.site.group_id
|
||||
prefix._site_id = prefix.site_id
|
||||
# Note: Location cannot be set prior to migration
|
||||
|
||||
Prefix.objects.bulk_update(prefixes, ['_region', '_site_group', '_site'], batch_size=100)
|
||||
Prefix.objects.using(db_alias).bulk_update(prefixes, ['_region', '_site_group', '_site'], batch_size=100)
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
@ -7,9 +7,10 @@ def set_null_values(apps, schema_editor):
|
||||
"""
|
||||
FHRPGroup = apps.get_model('ipam', 'FHRPGroup')
|
||||
IPAddress = apps.get_model('ipam', 'IPAddress')
|
||||
db_alias = schema_editor.connection.alias
|
||||
|
||||
FHRPGroup.objects.filter(auth_type='').update(auth_type=None)
|
||||
IPAddress.objects.filter(role='').update(role=None)
|
||||
FHRPGroup.objects.using(db_alias).filter(auth_type='').update(auth_type=None)
|
||||
IPAddress.objects.using(db_alias).filter(role='').update(role=None)
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
@ -2,36 +2,38 @@ from django.db import migrations
|
||||
from django.db.models import F
|
||||
|
||||
|
||||
def populate_service_parent_gfk(apps, schema_config):
|
||||
def populate_service_parent_gfk(apps, schema_editor):
|
||||
Service = apps.get_model('ipam', 'Service')
|
||||
ContentType = apps.get_model('contenttypes', 'ContentType')
|
||||
Device = apps.get_model('dcim', 'device')
|
||||
VirtualMachine = apps.get_model('virtualization', 'virtualmachine')
|
||||
db_alias = schema_editor.connection.alias
|
||||
|
||||
Service.objects.filter(device_id__isnull=False).update(
|
||||
Service.objects.using(db_alias).filter(device_id__isnull=False).update(
|
||||
parent_object_type=ContentType.objects.get_for_model(Device),
|
||||
parent_object_id=F('device_id'),
|
||||
)
|
||||
|
||||
Service.objects.filter(virtual_machine_id__isnull=False).update(
|
||||
Service.objects.using(db_alias).filter(virtual_machine_id__isnull=False).update(
|
||||
parent_object_type=ContentType.objects.get_for_model(VirtualMachine),
|
||||
parent_object_id=F('virtual_machine_id'),
|
||||
)
|
||||
|
||||
|
||||
def repopulate_device_and_virtualmachine_relations(apps, schemaconfig):
|
||||
def repopulate_device_and_virtualmachine_relations(apps, schema_editor):
|
||||
Service = apps.get_model('ipam', 'Service')
|
||||
ContentType = apps.get_model('contenttypes', 'ContentType')
|
||||
Device = apps.get_model('dcim', 'device')
|
||||
VirtualMachine = apps.get_model('virtualization', 'virtualmachine')
|
||||
db_alias = schema_editor.connection.alias
|
||||
|
||||
Service.objects.filter(
|
||||
Service.objects.using(db_alias).filter(
|
||||
parent_object_type=ContentType.objects.get_for_model(Device),
|
||||
).update(
|
||||
device_id=F('parent_object_id')
|
||||
)
|
||||
|
||||
Service.objects.filter(
|
||||
Service.objects.using(db_alias).filter(
|
||||
parent_object_type=ContentType.objects.get_for_model(VirtualMachine),
|
||||
).update(
|
||||
virtual_machine_id=F('parent_object_id')
|
||||
|
@ -6,8 +6,9 @@ def set_null_values(apps, schema_editor):
|
||||
Replace empty strings with null values.
|
||||
"""
|
||||
ContactAssignment = apps.get_model('tenancy', 'ContactAssignment')
|
||||
db_alias = schema_editor.connection.alias
|
||||
|
||||
ContactAssignment.objects.filter(priority='').update(priority=None)
|
||||
ContactAssignment.objects.using(db_alias).filter(priority='').update(priority=None)
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
@ -3,10 +3,10 @@ from django.db import migrations, models
|
||||
|
||||
|
||||
def migrate_contact_groups(apps, schema_editor):
|
||||
Contacts = apps.get_model('tenancy', 'Contact')
|
||||
Contact = apps.get_model('tenancy', 'Contact')
|
||||
db_alias = schema_editor.connection.alias
|
||||
|
||||
qs = Contacts.objects.filter(group__isnull=False)
|
||||
for contact in qs:
|
||||
for contact in Contact.objects.using(db_alias).filter(group__isnull=False):
|
||||
contact.groups.add(contact.group)
|
||||
|
||||
|
||||
|
@ -3,18 +3,22 @@ from django.db import migrations
|
||||
|
||||
def update_content_types(apps, schema_editor):
|
||||
ContentType = apps.get_model('contenttypes', 'ContentType')
|
||||
CustomField = apps.get_model('extras', 'CustomField')
|
||||
db_alias = schema_editor.connection.alias
|
||||
|
||||
# Delete the new ContentTypes effected by the new models in the users app
|
||||
ContentType.objects.filter(app_label='users', model='user').delete()
|
||||
ContentType.objects.using(db_alias).filter(app_label='users', model='user').delete()
|
||||
|
||||
# Update the app labels of the original ContentTypes for auth.User to ensure
|
||||
# that any foreign key references are preserved
|
||||
ContentType.objects.filter(app_label='auth', model='user').update(app_label='users')
|
||||
ContentType.objects.using(db_alias).filter(app_label='auth', model='user').update(app_label='users')
|
||||
|
||||
netboxuser_ct = ContentType.objects.filter(app_label='users', model='netboxuser').first()
|
||||
netboxuser_ct = ContentType.objects.using(db_alias).filter(app_label='users', model='netboxuser').first()
|
||||
if netboxuser_ct:
|
||||
user_ct = ContentType.objects.filter(app_label='users', model='user').first()
|
||||
CustomField = apps.get_model('extras', 'CustomField')
|
||||
CustomField.objects.filter(related_object_type_id=netboxuser_ct.id).update(related_object_type_id=user_ct.id)
|
||||
user_ct = ContentType.objects.using(db_alias).filter(app_label='users', model='user').first()
|
||||
CustomField.objects.using(db_alias).filter(related_object_type_id=netboxuser_ct.id).update(
|
||||
related_object_type_id=user_ct.id
|
||||
)
|
||||
netboxuser_ct.delete()
|
||||
|
||||
|
||||
|
@ -9,10 +9,11 @@ def update_custom_fields(apps, schema_editor):
|
||||
ContentType = apps.get_model('contenttypes', 'ContentType')
|
||||
CustomField = apps.get_model('extras', 'CustomField')
|
||||
Group = apps.get_model('users', 'Group')
|
||||
db_alias = schema_editor.connection.alias
|
||||
|
||||
if old_ct := ContentType.objects.filter(app_label='users', model='netboxgroup').first():
|
||||
if old_ct := ContentType.objects.using(db_alias).filter(app_label='users', model='netboxgroup').first():
|
||||
new_ct = ContentType.objects.get_for_model(Group)
|
||||
CustomField.objects.filter(related_object_type=old_ct).update(related_object_type=new_ct)
|
||||
CustomField.objects.using(db_alias).filter(related_object_type=old_ct).update(related_object_type=new_ct)
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
@ -1,16 +1,15 @@
|
||||
# Generated by Django 5.0.5 on 2024-05-15 18:05
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
def update_content_types(apps, schema_editor):
|
||||
ObjectType = apps.get_model('core', 'ObjectType')
|
||||
ObjectPermission = apps.get_model('users', 'ObjectPermission')
|
||||
db_alias = schema_editor.connection.alias
|
||||
|
||||
auth_group_ct = ObjectType.objects.filter(app_label='auth', model='group').first()
|
||||
users_group_ct = ObjectType.objects.filter(app_label='users', model='group').first()
|
||||
auth_group_ct = ObjectType.objects.using(db_alias).filter(app_label='auth', model='group').first()
|
||||
users_group_ct = ObjectType.objects.using(db_alias).filter(app_label='users', model='group').first()
|
||||
if auth_group_ct and users_group_ct:
|
||||
perms = ObjectPermission.objects.filter(object_types__in=[auth_group_ct])
|
||||
perms = ObjectPermission.objects.using(db_alias).filter(object_types__in=[auth_group_ct])
|
||||
for perm in perms:
|
||||
perm.object_types.remove(auth_group_ct)
|
||||
perm.object_types.add(users_group_ct)
|
||||
|
@ -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):
|
||||
|
@ -8,11 +8,12 @@ def set_null_values(apps, schema_editor):
|
||||
IKEPolicy = apps.get_model('vpn', 'IKEPolicy')
|
||||
IKEProposal = apps.get_model('vpn', 'IKEProposal')
|
||||
IPSecProposal = apps.get_model('vpn', 'IPSecProposal')
|
||||
db_alias = schema_editor.connection.alias
|
||||
|
||||
IKEPolicy.objects.filter(mode='').update(mode=None)
|
||||
IKEProposal.objects.filter(authentication_algorithm='').update(authentication_algorithm=None)
|
||||
IPSecProposal.objects.filter(authentication_algorithm='').update(authentication_algorithm=None)
|
||||
IPSecProposal.objects.filter(encryption_algorithm='').update(encryption_algorithm=None)
|
||||
IKEPolicy.objects.using(db_alias).filter(mode='').update(mode=None)
|
||||
IKEProposal.objects.using(db_alias).filter(authentication_algorithm='').update(authentication_algorithm=None)
|
||||
IPSecProposal.objects.using(db_alias).filter(authentication_algorithm='').update(authentication_algorithm=None)
|
||||
IPSecProposal.objects.using(db_alias).filter(encryption_algorithm='').update(encryption_algorithm=None)
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
@ -7,12 +7,13 @@ def set_null_values(apps, schema_editor):
|
||||
"""
|
||||
WirelessLAN = apps.get_model('wireless', 'WirelessLAN')
|
||||
WirelessLink = apps.get_model('wireless', 'WirelessLink')
|
||||
db_alias = schema_editor.connection.alias
|
||||
|
||||
WirelessLAN.objects.filter(auth_cipher='').update(auth_cipher=None)
|
||||
WirelessLAN.objects.filter(auth_type='').update(auth_type=None)
|
||||
WirelessLink.objects.filter(auth_cipher='').update(auth_cipher=None)
|
||||
WirelessLink.objects.filter(auth_type='').update(auth_type=None)
|
||||
WirelessLink.objects.filter(distance_unit='').update(distance_unit=None)
|
||||
WirelessLAN.objects.using(db_alias).filter(auth_cipher='').update(auth_cipher=None)
|
||||
WirelessLAN.objects.using(db_alias).filter(auth_type='').update(auth_type=None)
|
||||
WirelessLink.objects.using(db_alias).filter(auth_cipher='').update(auth_cipher=None)
|
||||
WirelessLink.objects.using(db_alias).filter(auth_type='').update(auth_type=None)
|
||||
WirelessLink.objects.using(db_alias).filter(distance_unit='').update(distance_unit=None)
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
Loading…
Reference in New Issue
Block a user