Filter should match both start & end of IP range

This commit is contained in:
Jeremy Stretch 2023-08-28 08:47:51 -04:00
parent ff4d2f2cdc
commit 2b0f0b04e8
2 changed files with 5 additions and 6 deletions

View File

@ -512,7 +512,7 @@ class IPRangeFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
for prefix in value: for prefix in value:
try: try:
query = str(netaddr.IPNetwork(prefix.strip()).cidr) query = str(netaddr.IPNetwork(prefix.strip()).cidr)
q |= Q(start_address__net_host_contained=query) q |= Q(start_address__net_host_contained=query, end_address__net_host_contained=query)
except (AddrFormatError, ValueError): except (AddrFormatError, ValueError):
return queryset.none() return queryset.none()
return queryset.filter(q) return queryset.filter(q)

View File

@ -740,8 +740,6 @@ class IPRangeTestCase(TestCase, ChangeLoggedFilterSetTests):
) )
Tenant.objects.bulk_create(tenants) Tenant.objects.bulk_create(tenants)
Prefix.objects.create(prefix='10.0.1.0/24')
ip_ranges = ( ip_ranges = (
IPRange(start_address='10.0.1.100/24', end_address='10.0.1.199/24', size=100, vrf=None, tenant=None, role=None, status=IPRangeStatusChoices.STATUS_ACTIVE, description='foobar1'), IPRange(start_address='10.0.1.100/24', end_address='10.0.1.199/24', size=100, vrf=None, tenant=None, role=None, status=IPRangeStatusChoices.STATUS_ACTIVE, description='foobar1'),
IPRange(start_address='10.0.2.100/24', end_address='10.0.2.199/24', size=100, vrf=vrfs[0], tenant=tenants[0], role=roles[0], status=IPRangeStatusChoices.STATUS_ACTIVE, description='foobar2'), IPRange(start_address='10.0.2.100/24', end_address='10.0.2.199/24', size=100, vrf=vrfs[0], tenant=tenants[0], role=roles[0], status=IPRangeStatusChoices.STATUS_ACTIVE, description='foobar2'),
@ -809,9 +807,10 @@ class IPRangeTestCase(TestCase, ChangeLoggedFilterSetTests):
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
def test_parent(self): def test_parent(self):
prefix = Prefix.objects.get(prefix='10.0.1.0/24') params = {'parent': ['10.0.1.0/24', '10.0.2.0/24']}
params = {'parent': [prefix.prefix]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) params = {'parent': ['10.0.1.0/25']} # Range 10.0.1.100-199 is not fully contained by 10.0.1.0/25
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 0)
class IPAddressTestCase(TestCase, ChangeLoggedFilterSetTests): class IPAddressTestCase(TestCase, ChangeLoggedFilterSetTests):