Просмотр исходного кода

Closes #11585: Add IP address filters for services

jeremystretch 3 лет назад
Родитель
Сommit
9cb75e9834
3 измененных файлов с 36 добавлено и 0 удалено
  1. 1 0
      docs/release-notes/version-3.4.md
  2. 12 0
      netbox/ipam/filtersets.py
  3. 23 0
      netbox/ipam/tests/test_filtersets.py

+ 1 - 0
docs/release-notes/version-3.4.md

@@ -5,6 +5,7 @@
 ### Enhancements
 
 * [#10762](https://github.com/netbox-community/netbox/issues/10762) - Permit selection custom fields to have only one choice
+* [#11585](https://github.com/netbox-community/netbox/issues/11585) - Add IP address filters for services
 
 ### Bug Fixes
 

+ 12 - 0
netbox/ipam/filtersets.py

@@ -923,6 +923,18 @@ class ServiceFilterSet(NetBoxModelFilterSet):
         to_field_name='name',
         label=_('Virtual machine (name)'),
     )
+    ipaddress_id = django_filters.ModelMultipleChoiceFilter(
+        field_name='ipaddresses',
+        queryset=IPAddress.objects.all(),
+        label=_('IP address (ID)'),
+    )
+    ipaddress = django_filters.ModelMultipleChoiceFilter(
+        field_name='ipaddresses__address',
+        queryset=IPAddress.objects.all(),
+        to_field_name='address',
+        label=_('IP address'),
+    )
+
     port = NumericArrayFilter(
         field_name='ports',
         lookup_expr='contains'

+ 23 - 0
netbox/ipam/tests/test_filtersets.py

@@ -1420,6 +1420,19 @@ class ServiceTestCase(TestCase, ChangeLoggedFilterSetTests):
         )
         Device.objects.bulk_create(devices)
 
+        interface = Interface.objects.create(
+            device=devices[0],
+            name='eth0',
+            type=InterfaceTypeChoices.TYPE_VIRTUAL
+        )
+        interface_ct = ContentType.objects.get_for_model(Interface).pk
+        ip_addresses = (
+            IPAddress(address='192.0.2.1/24', assigned_object_type_id=interface_ct, assigned_object_id=interface.pk),
+            IPAddress(address='192.0.2.2/24', assigned_object_type_id=interface_ct, assigned_object_id=interface.pk),
+            IPAddress(address='192.0.2.3/24', assigned_object_type_id=interface_ct, assigned_object_id=interface.pk),
+        )
+        IPAddress.objects.bulk_create(ip_addresses)
+
         clustertype = ClusterType.objects.create(name='Cluster Type 1', slug='cluster-type-1')
         cluster = Cluster.objects.create(type=clustertype, name='Cluster 1')
 
@@ -1439,6 +1452,9 @@ class ServiceTestCase(TestCase, ChangeLoggedFilterSetTests):
             Service(virtual_machine=virtual_machines[2], name='Service 6', protocol=ServiceProtocolChoices.PROTOCOL_UDP, ports=[2003]),
         )
         Service.objects.bulk_create(services)
+        services[0].ipaddresses.add(ip_addresses[0])
+        services[1].ipaddresses.add(ip_addresses[1])
+        services[2].ipaddresses.add(ip_addresses[2])
 
     def test_name(self):
         params = {'name': ['Service 1', 'Service 2']}
@@ -1470,6 +1486,13 @@ class ServiceTestCase(TestCase, ChangeLoggedFilterSetTests):
         params = {'virtual_machine': [vms[0].name, vms[1].name]}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
 
+    def test_ipaddress(self):
+        ips = IPAddress.objects.all()[:2]
+        params = {'ipaddress_id': [ips[0].pk, ips[1].pk]}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
+        params = {'ipaddress': [str(ips[0].address), str(ips[1].address)]}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
+
 
 class L2VPNTestCase(TestCase, ChangeLoggedFilterSetTests):
     queryset = L2VPN.objects.all()