9627 test fixes

This commit is contained in:
Arthur Hanson 2024-06-21 14:14:42 -07:00
parent 7628145982
commit f509ca4e5e
10 changed files with 38 additions and 17 deletions

View File

@ -472,7 +472,9 @@ class VLANGroupBulkEditForm(NetBoxModelBulkEditForm):
'group_id': '$clustergroup', 'group_id': '$clustergroup',
} }
) )
vlan_id_ranges = NumericRangeArrayField() vlan_id_ranges = NumericRangeArrayField(
required=False,
)
model = VLANGroup model = VLANGroup
fieldsets = ( fieldsets = (

View File

@ -412,7 +412,9 @@ class VLANGroupImportForm(NetBoxModelImportForm):
required=False, required=False,
label=_('Scope type (app & model)') label=_('Scope type (app & model)')
) )
vlan_id_ranges = NumericRangeArrayField() vlan_id_ranges = NumericRangeArrayField(
required=False,
)
class Meta: class Meta:
model = VLANGroup model = VLANGroup

View File

@ -413,7 +413,6 @@ class VLANGroupFilterForm(NetBoxModelFilterSetForm):
FieldSet('q', 'filter_id', 'tag'), FieldSet('q', 'filter_id', 'tag'),
FieldSet('region', 'sitegroup', 'site', 'location', 'rack', name=_('Location')), FieldSet('region', 'sitegroup', 'site', 'location', 'rack', name=_('Location')),
FieldSet('cluster_group', 'cluster', name=_('Cluster')), FieldSet('cluster_group', 'cluster', name=_('Cluster')),
# FieldSet('min_vid', 'max_vid', name=_('VLAN ID')),
) )
model = VLANGroup model = VLANGroup
region = DynamicModelMultipleChoiceField( region = DynamicModelMultipleChoiceField(

View File

@ -4,6 +4,8 @@ import django.contrib.postgres.fields
import django.contrib.postgres.fields.ranges import django.contrib.postgres.fields.ranges
from django.db import migrations, models from django.db import migrations, models
from django.db.backends.postgresql.psycopg_any import NumericRange from django.db.backends.postgresql.psycopg_any import NumericRange
from ipam.constants import VLAN_VID_MIN, VLAN_VID_MAX
import ipam.models.vlans
def move_min_max(apps, schema_editor): def move_min_max(apps, schema_editor):
@ -29,7 +31,11 @@ class Migration(migrations.Migration):
migrations.AddField( migrations.AddField(
model_name='vlangroup', model_name='vlangroup',
name='vlan_id_ranges', name='vlan_id_ranges',
field=django.contrib.postgres.fields.ArrayField(base_field=django.contrib.postgres.fields.ranges.BigIntegerRangeField(), blank=True, null=True, size=None), field=django.contrib.postgres.fields.ArrayField(
base_field=django.contrib.postgres.fields.ranges.BigIntegerRangeField(),
blank=True, null=True, size=None,
default=ipam.models.vlans.get_default_vlan_ids,
),
), ),
migrations.AddField( migrations.AddField(
model_name='vlangroup', model_name='vlangroup',

View File

@ -3,6 +3,7 @@ from django.contrib.postgres.fields import ArrayField, BigIntegerRangeField
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.core.validators import MaxValueValidator, MinValueValidator from django.core.validators import MaxValueValidator, MinValueValidator
from django.db import models from django.db import models
from django.db.backends.postgresql.psycopg_any import NumericRange
from django.urls import reverse from django.urls import reverse
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
@ -20,6 +21,10 @@ __all__ = (
) )
def get_default_vlan_ids():
return [NumericRange(VLAN_VID_MIN, VLAN_VID_MAX)]
class VLANGroup(OrganizationalModel): class VLANGroup(OrganizationalModel):
""" """
A VLAN group is an arbitrary collection of VLANs within which VLAN IDs and names must be unique. A VLAN group is an arbitrary collection of VLANs within which VLAN IDs and names must be unique.
@ -50,6 +55,7 @@ class VLANGroup(OrganizationalModel):
vlan_id_ranges = ArrayField( vlan_id_ranges = ArrayField(
BigIntegerRangeField(), BigIntegerRangeField(),
verbose_name=_('min/max VLAN IDs'), verbose_name=_('min/max VLAN IDs'),
default=get_default_vlan_ids,
help_text=_('Ranges of Minimum, maximum VLAN IDs'), help_text=_('Ranges of Minimum, maximum VLAN IDs'),
blank=True, blank=True,
null=True null=True
@ -237,11 +243,17 @@ class VLAN(PrimaryModel):
) )
# Validate group min/max VIDs # Validate group min/max VIDs
if self.group and not self.group.min_vid <= self.vid <= self.group.max_vid: if self.group and self.group.vlan_id_ranges:
in_bounds = False
for ranges in self.group.vlan_id_ranges:
if ranges.lower <= self.vid <= ranges.upper:
in_bounds = True
if not in_bounds:
raise ValidationError({ raise ValidationError({
'vid': _( 'vid': _(
"VID must be between {minimum} and {maximum} for VLANs in group {group}" "VID must be in ranges {ranges} for VLANs in group {group}"
).format(minimum=self.group.min_vid, maximum=self.group.max_vid, group=self.group) ).format(ranges=ranges_to_string(self.group.vlan_id_ranges), group=self.group)
}) })
def get_status_color(self): def get_status_color(self):

View File

@ -8,6 +8,7 @@ from dcim.models import Device, DeviceRole, DeviceType, Interface, Manufacturer,
from ipam.choices import * from ipam.choices import *
from ipam.models import * from ipam.models import *
from tenancy.models import Tenant from tenancy.models import Tenant
from utilities.data import string_to_range_array
from utilities.testing import APITestCase, APIViewTestCases, create_test_device, disable_warnings from utilities.testing import APITestCase, APIViewTestCases, create_test_device, disable_warnings
@ -882,8 +883,7 @@ class VLANGroupTest(APIViewTestCases.APIViewTestCase):
vlangroup = VLANGroup.objects.create( vlangroup = VLANGroup.objects.create(
name='VLAN Group X', name='VLAN Group X',
slug='vlan-group-x', slug='vlan-group-x',
min_vid=MIN_VID, vlan_range_ids=string_to_range_array(f"{MIN_VID}-{MAX_VID}")
max_vid=MAX_VID
) )
# Create a set of VLANs within the group # Create a set of VLANs within the group

View File

@ -1,6 +1,7 @@
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.test import TestCase, override_settings from django.test import TestCase, override_settings
from netaddr import IPNetwork, IPSet from netaddr import IPNetwork, IPSet
from utilities.data import string_to_range_array
from ipam.choices import * from ipam.choices import *
from ipam.models import * from ipam.models import *
@ -509,8 +510,7 @@ class TestVLANGroup(TestCase):
vlangroup = VLANGroup.objects.create( vlangroup = VLANGroup.objects.create(
name='VLAN Group 1', name='VLAN Group 1',
slug='vlan-group-1', slug='vlan-group-1',
min_vid=100, vlan_range_ids=string_to_range_array('100-199'),
max_vid=199
) )
VLAN.objects.bulk_create(( VLAN.objects.bulk_create((
VLAN(name='VLAN 100', vid=100, group=vlangroup), VLAN(name='VLAN 100', vid=100, group=vlangroup),

View File

@ -9,6 +9,7 @@ from dcim.models import Device, DeviceRole, DeviceType, Manufacturer, Site, Inte
from ipam.choices import * from ipam.choices import *
from ipam.models import * from ipam.models import *
from tenancy.models import Tenant from tenancy.models import Tenant
from utilities.data import string_to_range_array
from utilities.testing import ViewTestCases, create_tags from utilities.testing import ViewTestCases, create_tags
@ -764,8 +765,7 @@ class VLANGroupTestCase(ViewTestCases.OrganizationalObjectViewTestCase):
cls.form_data = { cls.form_data = {
'name': 'VLAN Group X', 'name': 'VLAN Group X',
'slug': 'vlan-group-x', 'slug': 'vlan-group-x',
'min_vid': 1, 'vlan_range_ids': string_to_range_array('100-4094'),
'max_vid': 4094,
'description': 'A new VLAN group', 'description': 'A new VLAN group',
'tags': [t.pk for t in tags], 'tags': [t.pk for t in tags],
} }

View File

@ -1,4 +1,5 @@
import decimal import decimal
from django.db.backends.postgresql.psycopg_any import NumericRange
from itertools import count, groupby from itertools import count, groupby
__all__ = ( __all__ = (

View File

@ -1,6 +1,5 @@
from django import forms from django import forms
from django.contrib.postgres.forms import SimpleArrayField from django.contrib.postgres.forms import SimpleArrayField
from django.db.backends.postgresql.psycopg_any import NumericRange
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from utilities.data import ranges_to_string, string_to_range_array from utilities.data import ranges_to_string, string_to_range_array