From ba03bd54cda1a5b0845d17b74f619db97f489275 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Arnauts?= Date: Wed, 4 Jan 2023 13:09:12 +0100 Subject: [PATCH] Closes #11150: Add a filter for device.primary_ip4 and primary_ip6 --- netbox/dcim/filtersets.py | 12 +++++++++++- netbox/dcim/tests/test_filtersets.py | 18 +++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index 2360fc4aa..534d8e411 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -3,7 +3,7 @@ from django.contrib.auth.models import User from django.utils.translation import gettext as _ from extras.filtersets import LocalConfigContextFilterSet -from ipam.models import ASN, VRF +from ipam.models import ASN, IPAddress, VRF from netbox.filtersets import ( BaseFilterSet, ChangeLoggedModelFilterSet, OrganizationalModelFilterSet, NetBoxModelFilterSet, ) @@ -958,6 +958,16 @@ class DeviceFilterSet(NetBoxModelFilterSet, TenancyFilterSet, ContactModelFilter method='_device_bays', label=_('Has device bays'), ) + primary_ip4_id = django_filters.ModelMultipleChoiceFilter( + field_name='primary_ip4', + queryset=IPAddress.objects.all(), + label=_('Primary IPv4 (ID)'), + ) + primary_ip6_id = django_filters.ModelMultipleChoiceFilter( + field_name='primary_ip6', + queryset=IPAddress.objects.all(), + label=_('Primary IPv6 (ID)'), + ) class Meta: model = Device diff --git a/netbox/dcim/tests/test_filtersets.py b/netbox/dcim/tests/test_filtersets.py index 874e3474c..55619e4bf 100644 --- a/netbox/dcim/tests/test_filtersets.py +++ b/netbox/dcim/tests/test_filtersets.py @@ -1626,10 +1626,12 @@ class DeviceTestCase(TestCase, ChangeLoggedFilterSetTests): ipaddresses = ( IPAddress(address='192.0.2.1/24', assigned_object=interfaces[0]), IPAddress(address='192.0.2.2/24', assigned_object=interfaces[1]), + IPAddress(address='2001:db8::1/64', assigned_object=interfaces[1]), + IPAddress(address='2001:db8::2/64', assigned_object=None), ) IPAddress.objects.bulk_create(ipaddresses) Device.objects.filter(pk=devices[0].pk).update(primary_ip4=ipaddresses[0]) - Device.objects.filter(pk=devices[1].pk).update(primary_ip4=ipaddresses[1]) + Device.objects.filter(pk=devices[1].pk).update(primary_ip4=ipaddresses[1], primary_ip6=ipaddresses[2]) # VirtualChassis assignment for filtering virtual_chassis = VirtualChassis.objects.create(master=devices[0]) @@ -1761,6 +1763,20 @@ class DeviceTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'has_primary_ip': 'false'} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_primary_ip4(self): + addresses = IPAddress.objects.all() + params = {'primary_ip4_id': [addresses[0].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + params = {'primary_ip4_id': [addresses[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + + def test_primary_ip6(self): + addresses = IPAddress.objects.all() + params = {'primary_ip6_id': [addresses[2].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + params = {'primary_ip6_id': [addresses[3].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 0) + def test_virtual_chassis_id(self): params = {'virtual_chassis_id': [VirtualChassis.objects.first().pk]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)