diff --git a/netbox/ipam/migrations/0082_ipaddress_iprange_prefix_parent.py b/netbox/ipam/migrations/0083_ipaddress_iprange_prefix_parent.py similarity index 94% rename from netbox/ipam/migrations/0082_ipaddress_iprange_prefix_parent.py rename to netbox/ipam/migrations/0083_ipaddress_iprange_prefix_parent.py index d86c18670..d97a6ba73 100644 --- a/netbox/ipam/migrations/0082_ipaddress_iprange_prefix_parent.py +++ b/netbox/ipam/migrations/0083_ipaddress_iprange_prefix_parent.py @@ -7,7 +7,7 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('ipam', '0081_remove_service_device_virtual_machine_add_parent_gfk_index'), + ('ipam', '0082_add_prefix_network_containment_indexes'), ] operations = [ diff --git a/netbox/ipam/migrations/0083_ipaddress_iprange_prefix_parent_data.py b/netbox/ipam/migrations/0083_ipaddress_iprange_prefix_parent_data.py index 45cf48c04..8e0435803 100644 --- a/netbox/ipam/migrations/0083_ipaddress_iprange_prefix_parent_data.py +++ b/netbox/ipam/migrations/0083_ipaddress_iprange_prefix_parent_data.py @@ -6,6 +6,7 @@ import time from django.db import migrations, models from ipam.choices import PrefixStatusChoices +from ipam.models import Prefix def draw_progress(count, total, length=20): @@ -19,7 +20,7 @@ def draw_progress(count, total, length=20): sys.stdout.flush() -def set_prefix(apps, schema_editor, model, attr='address', parent_model='Prefix'): +def set_prefix(apps, schema_editor, model, attr='address', parent_attr='prefix', parent_model='Prefix'): start = time.time() ChildModel = apps.get_model('ipam', model) ParentModel = apps.get_model('ipam', parent_model) @@ -29,6 +30,8 @@ def set_prefix(apps, schema_editor, model, attr='address', parent_model='Prefix' if total == 0: return + print('\r\n') + print(f'Migrating {parent_model}') print('\r\n') i = 0 draw_progress(i, total, 50) @@ -39,10 +42,13 @@ def set_prefix(apps, schema_editor, model, attr='address', parent_model='Prefix' prefix__net_contains_or_equals=str(address_attr.ip), prefix__net_mask_length__lte=address_attr.prefixlen, ) - if hasattr(ParentModel, 'vrf'): - prefixes = prefixes.filter(vrf=address.vrf) - address.prefix = prefixes.last() - address.save() + + setattr(address, parent_attr, prefixes.last()) + try: + address.save() + except Exception as e: + print(f'Error at {address}') + raise e draw_progress(i, total, 50) end = time.time() @@ -68,7 +74,7 @@ def unset_iprange_prefix(apps, schema_editor): def set_prefix_aggregate(apps, schema_editor): - set_prefix(apps, schema_editor, 'Prefix', 'prefix', 'Aggregate') + set_prefix(apps, schema_editor, 'Prefix', 'prefix', 'aggregate', 'Aggregate') def unset_prefix_aggregate(apps, schema_editor): @@ -118,7 +124,7 @@ def unset_prefix_parent(apps, schema_editor): class Migration(migrations.Migration): dependencies = [ - ('ipam', '0082_ipaddress_iprange_prefix_parent'), + ('ipam', '0083_ipaddress_iprange_prefix_parent'), ] operations = [ diff --git a/netbox/ipam/signals.py b/netbox/ipam/signals.py index 7e210a756..91bdc02a8 100644 --- a/netbox/ipam/signals.py +++ b/netbox/ipam/signals.py @@ -82,18 +82,8 @@ def update_prefix_parents(prefix, delete=False): prefixes = prefix.children.all() for pfx in prefixes: - parent = Prefix.objects.exclude(pk=pfx.pk).exclude(pk=prefix.pk).filter( - Q( - vrf=pfx.vrf, - prefix__net_contains=str(pfx.prefix) - ) | Q( - vrf=None, - status=PrefixStatusChoices.STATUS_CONTAINER, - prefix__net_contains=str(pfx.prefix), - ) - ).last() # Set contained addresses to the containing prefix if it exists - pfx.parent = parent + pfx.parent = prefix.parent else: # Get all possible addresses prefixes = prefix.children.all() | Prefix.objects.filter(