Skip to content

Commit 5d22260

Browse files
#11150: Add a filter for device.primary_ip4 and primary_ip6 (#11382)
* Closes #11150: Add a filter for device.primary_ip4 and primary_ip6 * Tweaked tests to query for multiple IDs Co-authored-by: jeremystretch <[email protected]>
1 parent 39985eb commit 5d22260

File tree

2 files changed

+31
-3
lines changed

2 files changed

+31
-3
lines changed

netbox/dcim/filtersets.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from django.utils.translation import gettext as _
44

55
from extras.filtersets import LocalConfigContextFilterSet
6-
from ipam.models import ASN, VRF
6+
from ipam.models import ASN, IPAddress, VRF
77
from netbox.filtersets import (
88
BaseFilterSet, ChangeLoggedModelFilterSet, OrganizationalModelFilterSet, NetBoxModelFilterSet,
99
)
@@ -958,6 +958,16 @@ class DeviceFilterSet(NetBoxModelFilterSet, TenancyFilterSet, ContactModelFilter
958958
method='_device_bays',
959959
label=_('Has device bays'),
960960
)
961+
primary_ip4_id = django_filters.ModelMultipleChoiceFilter(
962+
field_name='primary_ip4',
963+
queryset=IPAddress.objects.all(),
964+
label=_('Primary IPv4 (ID)'),
965+
)
966+
primary_ip6_id = django_filters.ModelMultipleChoiceFilter(
967+
field_name='primary_ip6',
968+
queryset=IPAddress.objects.all(),
969+
label=_('Primary IPv6 (ID)'),
970+
)
961971

962972
class Meta:
963973
model = Device

netbox/dcim/tests/test_filtersets.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1626,10 +1626,14 @@ def setUpTestData(cls):
16261626
ipaddresses = (
16271627
IPAddress(address='192.0.2.1/24', assigned_object=interfaces[0]),
16281628
IPAddress(address='192.0.2.2/24', assigned_object=interfaces[1]),
1629+
IPAddress(address='192.0.2.3/24', assigned_object=None),
1630+
IPAddress(address='2001:db8::1/64', assigned_object=interfaces[0]),
1631+
IPAddress(address='2001:db8::2/64', assigned_object=interfaces[1]),
1632+
IPAddress(address='2001:db8::3/64', assigned_object=None),
16291633
)
16301634
IPAddress.objects.bulk_create(ipaddresses)
1631-
Device.objects.filter(pk=devices[0].pk).update(primary_ip4=ipaddresses[0])
1632-
Device.objects.filter(pk=devices[1].pk).update(primary_ip4=ipaddresses[1])
1635+
Device.objects.filter(pk=devices[0].pk).update(primary_ip4=ipaddresses[0], primary_ip6=ipaddresses[3])
1636+
Device.objects.filter(pk=devices[1].pk).update(primary_ip4=ipaddresses[1], primary_ip6=ipaddresses[4])
16331637

16341638
# VirtualChassis assignment for filtering
16351639
virtual_chassis = VirtualChassis.objects.create(master=devices[0])
@@ -1761,6 +1765,20 @@ def test_has_primary_ip(self):
17611765
params = {'has_primary_ip': 'false'}
17621766
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
17631767

1768+
def test_primary_ip4(self):
1769+
addresses = IPAddress.objects.filter(address__family=4)
1770+
params = {'primary_ip4_id': [addresses[0].pk, addresses[1].pk]}
1771+
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
1772+
params = {'primary_ip4_id': [addresses[2].pk]}
1773+
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 0)
1774+
1775+
def test_primary_ip6(self):
1776+
addresses = IPAddress.objects.filter(address__family=6)
1777+
params = {'primary_ip6_id': [addresses[0].pk, addresses[1].pk]}
1778+
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
1779+
params = {'primary_ip6_id': [addresses[2].pk]}
1780+
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 0)
1781+
17641782
def test_virtual_chassis_id(self):
17651783
params = {'virtual_chassis_id': [VirtualChassis.objects.first().pk]}
17661784
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)

0 commit comments

Comments
 (0)