diff --git a/netbox/ipam/migrations/0070_vlangroup_vlan_id_ranges.py b/netbox/ipam/migrations/0070_vlangroup_vlan_id_ranges.py index 05b90ef5f..65bf1db18 100644 --- a/netbox/ipam/migrations/0070_vlangroup_vlan_id_ranges.py +++ b/netbox/ipam/migrations/0070_vlangroup_vlan_id_ranges.py @@ -11,6 +11,11 @@ def move_min_max(apps, schema_editor): for group in VLANGroup.objects.all(): if group.min_vid or group.max_vid: group.vlan_id_ranges = [NumericRange(group.min_vid, group.max_vid)] + + group._total_vlan_ids = 0 + for vlan_range in group.vlan_id_ranges: + group._total_vlan_ids += int(vlan_range.upper) - int(vlan_range.lower) + 1 + group.save() diff --git a/netbox/ipam/utils.py b/netbox/ipam/utils.py index 21b90fbcd..d32231143 100644 --- a/netbox/ipam/utils.py +++ b/netbox/ipam/utils.py @@ -90,12 +90,12 @@ def add_available_ipaddresses(prefix, ipaddress_list, is_pool=False): return output -def add_available_vlans(vlans, vlan_group=None): +def available_vlans_from_range(vlans, vlan_group, vlan_range): """ Create fake records for all gaps between used VLANs """ - min_vid = vlan_group.min_vid if vlan_group else VLAN_VID_MIN - max_vid = vlan_group.max_vid if vlan_group else VLAN_VID_MAX + min_vid = int(vlan_range.lower) if vlan_range else VLAN_VID_MIN + max_vid = int(vlan_range.upper) if vlan_range else VLAN_VID_MAX if not vlans: return [{ @@ -128,6 +128,20 @@ def add_available_vlans(vlans, vlan_group=None): 'available': max_vid - prev_vid, }) + return new_vlans + + +def add_available_vlans(vlans, vlan_group=None): + """ + Create fake records for all gaps between used VLANs + """ + new_vlans = [] + if vlan_group and vlan_group.vlan_id_ranges: + for vlan_range in vlan_group.vlan_id_ranges: + new_vlans.extend(available_vlans_from_range(vlans, vlan_group, vlan_range)) + else: + new_vlans = available_vlans_from_range(vlans, vlan_group, vlan_range) + vlans = list(vlans) + new_vlans vlans.sort(key=lambda v: v.vid if type(v) is VLAN else v['vid'])