@@ -29,12 +29,11 @@ def update_children_depth(prefix):
29
29
Prefix .objects .bulk_update (children , ['_depth' ], batch_size = 100 )
30
30
31
31
32
- def update_ipaddress_prefix (prefix , delete = False ):
32
+ def update_object_prefix (prefix , delete = False , parent_model = Prefix , child_model = IPAddress ):
33
33
if delete :
34
34
# Get all possible addresses
35
- addresses = IPAddress .objects .filter (prefix = prefix )
36
- # Find a new containing prefix
37
- prefix = Prefix .objects .filter (
35
+ addresses = child_model .objects .filter (prefix = prefix )
36
+ prefix = parent_model .objects .filter (
38
37
prefix__net_contains_or_equals = prefix .prefix ,
39
38
vrf = prefix .vrf
40
39
).exclude (pk = prefix .pk ).last ()
@@ -43,71 +42,38 @@ def update_ipaddress_prefix(prefix, delete=False):
43
42
# Set contained addresses to the containing prefix if it exists
44
43
address .prefix = prefix
45
44
else :
46
- # Get all possible modified addresses
47
- addresses = IPAddress .objects .filter (
48
- Q (address__net_contained_or_equal = prefix .prefix , vrf = prefix .vrf ) |
49
- Q (prefix = prefix )
50
- )
45
+ filter = Q (prefix = prefix )
46
+
47
+ if child_model == IPAddress :
48
+ filter |= Q (address__net_contained_or_equal = prefix .prefix , vrf = prefix .vrf )
49
+ elif child_model == IPRange :
50
+ filter |= Q (
51
+ start_address__net_contained_or_equal = prefix .prefix ,
52
+ end_address__net_contained_or_equal = prefix .prefix ,
53
+ vrf = prefix .vrf
54
+ )
51
55
56
+ addresses = child_model .objects .filter (filter )
52
57
for address in addresses :
53
- if not address .prefix or (prefix .prefix in address .prefix .prefix and address .address in prefix .prefix ):
54
- # Set to new Prefix as the prefix is a child of the old prefix and the address is contained in the
55
- # prefix
58
+ # If addresses prefix is not set then this model is the only option
59
+ if not address .prefix :
56
60
address .prefix = prefix
57
- elif address .prefix and address .address not in prefix .prefix :
58
- # Find a new prefix as the prefix no longer contains the address
59
- address .prefix = Prefix .objects .filter (
60
- prefix__net_contains_or_equals = address .address ,
61
- vrf = prefix .vrf
62
- ).last ()
61
+ # This address has a different VRF so the prefix cannot be the parent prefix
62
+ elif address .prefix != address .find_prefix (address ):
63
+ address .prefix = address .find_prefix (address )
63
64
else :
64
- # No-OP as the prefix does not require modification
65
65
pass
66
66
67
67
# Update the addresses
68
- IPAddress .objects .bulk_update (addresses , ['prefix' ], batch_size = 100 )
68
+ child_model .objects .bulk_update (addresses , ['prefix' ], batch_size = 100 )
69
69
70
70
71
- def update_iprange_prefix (prefix , delete = False ):
72
- if delete :
73
- # Get all possible addresses
74
- addresses = IPRange .objects .filter (prefix = prefix )
75
- # Find a new containing prefix
76
- prefix = Prefix .objects .filter (
77
- prefix__net_contains_or_equals = prefix .prefix ,
78
- vrf = prefix .vrf
79
- ).exclude (pk = prefix .pk ).last ()
80
-
81
- for address in addresses :
82
- # Set contained addresses to the containing prefix if it exists
83
- address .prefix = prefix
84
- else :
85
- # Get all possible modified addresses
86
- addresses = IPRange .objects .filter (
87
- Q (start_address__net_contained_or_equal = prefix .prefix , vrf = prefix .vrf ) |
88
- Q (prefix = prefix )
89
- )
71
+ def update_ipaddress_prefix (prefix , delete = False ):
72
+ update_object_prefix (prefix , delete , child_model = IPAddress )
90
73
91
- for address in addresses :
92
- if not address .prefix or (
93
- prefix .prefix in address .prefix .prefix and address .start_address in prefix .prefix and
94
- address .end_address in prefix .prefix
95
- ):
96
- # Set to new Prefix as the prefix is a child of the old prefix and the address is contained in the
97
- # prefix
98
- address .prefix = prefix
99
- elif address .prefix and address .address not in prefix .prefix :
100
- # Find a new prefix as the prefix no longer contains the address
101
- address .prefix = Prefix .objects .filter (Q (prefix__net_contains_or_equals = address .start_address ) &
102
- Q (prefix__net_contains_or_equals = address .end_address ),
103
- vrf = prefix .vrf
104
- ).last ()
105
- else :
106
- # No-OP as the prefix does not require modification
107
- pass
108
74
109
- # Update the addresses
110
- IPAddress . objects . bulk_update ( addresses , [ 'prefix' ], batch_size = 100 )
75
+ def update_iprange_prefix ( prefix , delete = False ):
76
+ update_object_prefix ( prefix , delete , child_model = IPRange )
111
77
112
78
113
79
def update_prefix_parents (prefix , delete = False ):
0 commit comments