Skip to content

Commit c506f60

Browse files
16424 - Allow filtering of Devices by Cluster and Cluster Group (netbox-community#16674)
* Allow filtering Devices by Cluster and Cluster Group. * Allow filtering Devices by Cluster and Cluster Group. * Added tests for cluster and cluster_groups filterset. * Add missing filter & complete tests --------- Co-authored-by: Jeremy Stretch <[email protected]>
1 parent b241c97 commit c506f60

File tree

3 files changed

+41
-5
lines changed

3 files changed

+41
-5
lines changed

netbox/dcim/filtersets.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
ContentTypeFilter, MultiValueCharFilter, MultiValueMACAddressFilter, MultiValueNumberFilter, MultiValueWWNFilter,
2121
NumericArrayFilter, TreeNodeMultipleChoiceFilter,
2222
)
23-
from virtualization.models import Cluster
23+
from virtualization.models import Cluster, ClusterGroup
2424
from vpn.models import L2VPN
2525
from wireless.choices import WirelessRoleChoices, WirelessChannelChoices
2626
from wireless.models import WirelessLAN, WirelessLink
@@ -1018,6 +1018,17 @@ class DeviceFilterSet(
10181018
queryset=Cluster.objects.all(),
10191019
label=_('VM cluster (ID)'),
10201020
)
1021+
cluster_group = django_filters.ModelMultipleChoiceFilter(
1022+
field_name='cluster__group__slug',
1023+
queryset=ClusterGroup.objects.all(),
1024+
to_field_name='slug',
1025+
label=_('Cluster group (slug)'),
1026+
)
1027+
cluster_group_id = django_filters.ModelMultipleChoiceFilter(
1028+
field_name='cluster__group',
1029+
queryset=ClusterGroup.objects.all(),
1030+
label=_('Cluster group (ID)'),
1031+
)
10211032
model = django_filters.ModelMultipleChoiceFilter(
10221033
field_name='device_type__slug',
10231034
queryset=DeviceType.objects.all(),

netbox/dcim/forms/filtersets.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from utilities.forms.fields import ColorField, DynamicModelMultipleChoiceField, TagFilterField
1515
from utilities.forms.rendering import FieldSet
1616
from utilities.forms.widgets import NumberWithOptions
17+
from virtualization.models import Cluster, ClusterGroup
1718
from vpn.models import L2VPN
1819
from wireless.choices import *
1920

@@ -655,6 +656,7 @@ class DeviceFilterForm(
655656
'console_ports', 'console_server_ports', 'power_ports', 'power_outlets', 'interfaces', 'pass_through_ports',
656657
name=_('Components')
657658
),
659+
FieldSet('cluster_group_id', 'cluster_id', name=_('Cluster')),
658660
FieldSet(
659661
'has_primary_ip', 'has_oob_ip', 'virtual_chassis_member', 'config_template_id', 'local_context_data',
660662
'has_virtual_device_context',
@@ -821,6 +823,16 @@ class DeviceFilterForm(
821823
choices=BOOLEAN_WITH_BLANK_CHOICES
822824
)
823825
)
826+
cluster_id = DynamicModelMultipleChoiceField(
827+
queryset=Cluster.objects.all(),
828+
required=False,
829+
label=_('Cluster')
830+
)
831+
cluster_group_id = DynamicModelMultipleChoiceField(
832+
queryset=ClusterGroup.objects.all(),
833+
required=False,
834+
label=_('Cluster group')
835+
)
824836
tag = TagFilterField(model)
825837

826838

netbox/dcim/tests/test_filtersets.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from netbox.choices import ColorChoices
1010
from tenancy.models import Tenant, TenantGroup
1111
from utilities.testing import ChangeLoggedFilterSetTests, create_test_device
12-
from virtualization.models import Cluster, ClusterType
12+
from virtualization.models import Cluster, ClusterType, ClusterGroup
1313
from wireless.choices import WirelessChannelChoices, WirelessRoleChoices
1414

1515
User = get_user_model()
@@ -1959,10 +1959,16 @@ def setUpTestData(cls):
19591959
Rack.objects.bulk_create(racks)
19601960

19611961
cluster_type = ClusterType.objects.create(name='Cluster Type 1', slug='cluster-type-1')
1962+
cluster_groups = (
1963+
ClusterGroup(name='Cluster Group 1', slug='cluster-group-1'),
1964+
ClusterGroup(name='Cluster Group 2', slug='cluster-group-2'),
1965+
ClusterGroup(name='Cluster Group 3', slug='cluster-group-3'),
1966+
)
1967+
ClusterGroup.objects.bulk_create(cluster_groups)
19621968
clusters = (
1963-
Cluster(name='Cluster 1', type=cluster_type),
1964-
Cluster(name='Cluster 2', type=cluster_type),
1965-
Cluster(name='Cluster 3', type=cluster_type),
1969+
Cluster(name='Cluster 1', type=cluster_type, group=cluster_groups[0]),
1970+
Cluster(name='Cluster 2', type=cluster_type, group=cluster_groups[1]),
1971+
Cluster(name='Cluster 3', type=cluster_type, group=cluster_groups[2]),
19661972
)
19671973
Cluster.objects.bulk_create(clusters)
19681974

@@ -2213,6 +2219,13 @@ def test_cluster(self):
22132219
params = {'cluster_id': [clusters[0].pk, clusters[1].pk]}
22142220
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
22152221

2222+
def test_cluster_group(self):
2223+
cluster_groups = ClusterGroup.objects.all()[:2]
2224+
params = {'cluster_group_id': [cluster_groups[0].pk, cluster_groups[1].pk]}
2225+
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
2226+
params = {'cluster_group': [cluster_groups[0].slug, cluster_groups[1].slug]}
2227+
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
2228+
22162229
def test_model(self):
22172230
params = {'model': ['model-1', 'model-2']}
22182231
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)

0 commit comments

Comments
 (0)