From c7e2cb610291f8a27d7240f911a5264949bf062a Mon Sep 17 00:00:00 2001 From: Devon Mar Date: Sat, 7 May 2022 20:44:53 -0700 Subject: [PATCH 1/4] Add device & vm to `FHRPGroupAssignmentFilterSet` --- netbox/ipam/filtersets.py | 42 ++++++++++++++++++++++++++++ netbox/ipam/tests/test_filtersets.py | 18 ++++++++++++ 2 files changed, 60 insertions(+) diff --git a/netbox/ipam/filtersets.py b/netbox/ipam/filtersets.py index 53c589bb377..f5e54c3f422 100644 --- a/netbox/ipam/filtersets.py +++ b/netbox/ipam/filtersets.py @@ -681,11 +681,53 @@ class FHRPGroupAssignmentFilterSet(ChangeLoggedModelFilterSet): queryset=FHRPGroup.objects.all(), label='Group (ID)', ) + device = MultiValueCharFilter( + method='filter_device', + field_name='name', + label='Device (name)', + ) + device_id = MultiValueNumberFilter( + method='filter_device', + field_name='pk', + label='Device (ID)', + ) + virtual_machine = MultiValueCharFilter( + method='filter_virtual_machine', + field_name='name', + label='Virtual machine (name)', + ) + virtual_machine_id = MultiValueNumberFilter( + method='filter_virtual_machine', + field_name='pk', + label='Virtual machine (ID)', + ) class Meta: model = FHRPGroupAssignment fields = ['id', 'group_id', 'interface_type', 'interface_id', 'priority'] + def filter_device(self, queryset, name, value): + devices = Device.objects.filter(**{'{}__in'.format(name): value}) + if not devices.exists(): + return queryset.none() + interface_ids = [] + for device in devices: + interface_ids.extend(device.vc_interfaces().values_list('id', flat=True)) + return queryset.filter( + Q(interface_type=ContentType.objects.get_for_model(Interface), interface_id__in=interface_ids) + ) + + def filter_virtual_machine(self, queryset, name, value): + virtual_machines = VirtualMachine.objects.filter(**{'{}__in'.format(name): value}) + if not virtual_machines.exists(): + return queryset.none() + interface_ids = [] + for vm in virtual_machines: + interface_ids.extend(vm.interfaces.values_list('id', flat=True)) + return queryset.filter( + Q(interface_type=ContentType.objects.get_for_model(VMInterface), interface_id__in=interface_ids) + ) + class VLANGroupFilterSet(OrganizationalModelFilterSet): scope_type = ContentTypeFilter() diff --git a/netbox/ipam/tests/test_filtersets.py b/netbox/ipam/tests/test_filtersets.py index 4bb72dce25d..94c806d0def 100644 --- a/netbox/ipam/tests/test_filtersets.py +++ b/netbox/ipam/tests/test_filtersets.py @@ -1024,6 +1024,24 @@ def test_priority(self): params = {'priority': [10, 20]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) + def test_device(self): + device = Device.objects.all()[0] + + params = {'device': [device.name]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) + + params = {'device_id': [device.pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) + + def test_virtual_machine(self): + vm = VirtualMachine.objects.all()[0] + + params = {'virtual_machine': [vm.name]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) + + params = {'virtual_machine_id': [vm.pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) + class VLANGroupTestCase(TestCase, ChangeLoggedFilterSetTests): queryset = VLANGroup.objects.all() From c84ff70c1713fb788ee14d19ab19199e89df3fb7 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 11 May 2022 10:06:21 -0400 Subject: [PATCH 2/4] Apply suggestions from code review --- netbox/ipam/filtersets.py | 4 ++-- netbox/ipam/tests/test_filtersets.py | 7 ++----- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/netbox/ipam/filtersets.py b/netbox/ipam/filtersets.py index f5e54c3f422..62d436e4e91 100644 --- a/netbox/ipam/filtersets.py +++ b/netbox/ipam/filtersets.py @@ -707,7 +707,7 @@ class Meta: fields = ['id', 'group_id', 'interface_type', 'interface_id', 'priority'] def filter_device(self, queryset, name, value): - devices = Device.objects.filter(**{'{}__in'.format(name): value}) + devices = Device.objects.filter(**{f'{name}__in': value}) if not devices.exists(): return queryset.none() interface_ids = [] @@ -718,7 +718,7 @@ def filter_device(self, queryset, name, value): ) def filter_virtual_machine(self, queryset, name, value): - virtual_machines = VirtualMachine.objects.filter(**{'{}__in'.format(name): value}) + virtual_machines = VirtualMachine.objects.filter(**{'f{name}__in': value}) if not virtual_machines.exists(): return queryset.none() interface_ids = [] diff --git a/netbox/ipam/tests/test_filtersets.py b/netbox/ipam/tests/test_filtersets.py index 94c806d0def..6431afb0b03 100644 --- a/netbox/ipam/tests/test_filtersets.py +++ b/netbox/ipam/tests/test_filtersets.py @@ -1025,20 +1025,17 @@ def test_priority(self): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) def test_device(self): - device = Device.objects.all()[0] + device = Device.objects.first() params = {'device': [device.name]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) - params = {'device_id': [device.pk]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) def test_virtual_machine(self): - vm = VirtualMachine.objects.all()[0] - + vm = VirtualMachine.objects.first() params = {'virtual_machine': [vm.name]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) - params = {'virtual_machine_id': [vm.pk]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) From e11881c90d0ccf57dfba0cb301e18d63d44a159d Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 11 May 2022 10:06:54 -0400 Subject: [PATCH 3/4] Update netbox/ipam/tests/test_filtersets.py --- netbox/ipam/tests/test_filtersets.py | 1 - 1 file changed, 1 deletion(-) diff --git a/netbox/ipam/tests/test_filtersets.py b/netbox/ipam/tests/test_filtersets.py index 6431afb0b03..198f9d62d71 100644 --- a/netbox/ipam/tests/test_filtersets.py +++ b/netbox/ipam/tests/test_filtersets.py @@ -1026,7 +1026,6 @@ def test_priority(self): def test_device(self): device = Device.objects.first() - params = {'device': [device.name]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) params = {'device_id': [device.pk]} From 656932ebb4cbc94cb48d59a69836e5a21a17fb81 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 11 May 2022 10:16:41 -0400 Subject: [PATCH 4/4] Update netbox/ipam/filtersets.py --- netbox/ipam/filtersets.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/ipam/filtersets.py b/netbox/ipam/filtersets.py index 62d436e4e91..7839dc03ec7 100644 --- a/netbox/ipam/filtersets.py +++ b/netbox/ipam/filtersets.py @@ -718,7 +718,7 @@ def filter_device(self, queryset, name, value): ) def filter_virtual_machine(self, queryset, name, value): - virtual_machines = VirtualMachine.objects.filter(**{'f{name}__in': value}) + virtual_machines = VirtualMachine.objects.filter(**{f'{name}__in': value}) if not virtual_machines.exists(): return queryset.none() interface_ids = []