From 4bfc3bf4124c2d5d6f373e40d74becc899d28b27 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Fri, 20 Jan 2023 09:58:58 -0500 Subject: [PATCH] #11118: Extend L2VPN filters to device & VM interfaces --- netbox/dcim/filtersets.py | 13 ++++++++++++- netbox/dcim/forms/filtersets.py | 9 +++++++-- netbox/ipam/filtersets.py | 10 ++++++++-- netbox/ipam/forms/filtersets.py | 7 ++++++- netbox/virtualization/filtersets.py | 13 ++++++++++++- netbox/virtualization/forms/filtersets.py | 9 +++++++-- 6 files changed, 52 insertions(+), 9 deletions(-) diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index 534d8e411..c10ef44c3 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, IPAddress, VRF +from ipam.models import ASN, L2VPN, IPAddress, VRF from netbox.filtersets import ( BaseFilterSet, ChangeLoggedModelFilterSet, OrganizationalModelFilterSet, NetBoxModelFilterSet, ) @@ -1414,6 +1414,17 @@ class InterfaceFilterSet( to_field_name='name', label='Virtual Device Context', ) + l2vpn_id = django_filters.ModelMultipleChoiceFilter( + field_name='l2vpn_terminations__l2vpn', + queryset=L2VPN.objects.all(), + label=_('L2VPN (ID)'), + ) + l2vpn = django_filters.ModelMultipleChoiceFilter( + field_name='l2vpn_terminations__l2vpn__identifier', + queryset=L2VPN.objects.all(), + to_field_name='identifier', + label=_('L2VPN'), + ) class Meta: model = Interface diff --git a/netbox/dcim/forms/filtersets.py b/netbox/dcim/forms/filtersets.py index 815f0586a..c00e83672 100644 --- a/netbox/dcim/forms/filtersets.py +++ b/netbox/dcim/forms/filtersets.py @@ -6,7 +6,7 @@ from dcim.choices import * from dcim.constants import * from dcim.models import * from extras.forms import LocalConfigContextFilterForm -from ipam.models import ASN, VRF +from ipam.models import ASN, L2VPN, VRF from netbox.forms import NetBoxModelFilterSetForm from tenancy.forms import ContactModelFilterForm, TenancyFilterForm from utilities.forms import ( @@ -1112,7 +1112,7 @@ class InterfaceFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm): fieldsets = ( (None, ('q', 'filter_id', 'tag')), ('Attributes', ('name', 'label', 'kind', 'type', 'speed', 'duplex', 'enabled', 'mgmt_only')), - ('Addressing', ('vrf_id', 'mac_address', 'wwn')), + ('Addressing', ('vrf_id', 'l2vpn_id', 'mac_address', 'wwn')), ('PoE', ('poe_mode', 'poe_type')), ('Wireless', ('rf_role', 'rf_channel', 'rf_channel_width', 'tx_power')), ('Device', ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id', 'virtual_chassis_id', @@ -1203,6 +1203,11 @@ class InterfaceFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm): required=False, label='VRF' ) + l2vpn_id = DynamicModelMultipleChoiceField( + queryset=L2VPN.objects.all(), + required=False, + label=_('L2VPN') + ) tag = TagFilterField(model) diff --git a/netbox/ipam/filtersets.py b/netbox/ipam/filtersets.py index ecbb84eab..c30064ff1 100644 --- a/netbox/ipam/filtersets.py +++ b/netbox/ipam/filtersets.py @@ -852,15 +852,21 @@ class VLANFilterSet(NetBoxModelFilterSet, TenancyFilterSet): queryset=VirtualMachine.objects.all(), method='get_for_virtualmachine' ) - l2vpn = django_filters.ModelMultipleChoiceFilter( + l2vpn_id = django_filters.ModelMultipleChoiceFilter( field_name='l2vpn_terminations__l2vpn', queryset=L2VPN.objects.all(), label=_('L2VPN (ID)'), ) + l2vpn = django_filters.ModelMultipleChoiceFilter( + field_name='l2vpn_terminations__l2vpn__identifier', + queryset=L2VPN.objects.all(), + to_field_name='identifier', + label=_('L2VPN'), + ) class Meta: model = VLAN - fields = ['id', 'vid', 'name', 'description', 'l2vpn'] + fields = ['id', 'vid', 'name', 'description'] def search(self, queryset, name, value): if not value.strip(): diff --git a/netbox/ipam/forms/filtersets.py b/netbox/ipam/forms/filtersets.py index fe9d42550..7e790a68a 100644 --- a/netbox/ipam/forms/filtersets.py +++ b/netbox/ipam/forms/filtersets.py @@ -413,7 +413,7 @@ class VLANFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): fieldsets = ( (None, ('q', 'filter_id', 'tag')), ('Location', ('region_id', 'site_group_id', 'site_id')), - ('Attributes', ('group_id', 'status', 'role_id', 'vid')), + ('Attributes', ('group_id', 'status', 'role_id', 'vid', 'l2vpn_id')), ('Tenant', ('tenant_group_id', 'tenant_id')), ) region_id = DynamicModelMultipleChoiceField( @@ -458,6 +458,11 @@ class VLANFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): required=False, label='VLAN ID' ) + l2vpn_id = DynamicModelMultipleChoiceField( + queryset=L2VPN.objects.all(), + required=False, + label=_('L2VPN') + ) tag = TagFilterField(model) diff --git a/netbox/virtualization/filtersets.py b/netbox/virtualization/filtersets.py index ef33ebddc..4463e902a 100644 --- a/netbox/virtualization/filtersets.py +++ b/netbox/virtualization/filtersets.py @@ -4,7 +4,7 @@ from django.utils.translation import gettext as _ from dcim.models import Device, DeviceRole, Platform, Region, Site, SiteGroup from extras.filtersets import LocalConfigContextFilterSet -from ipam.models import VRF +from ipam.models import L2VPN, VRF from netbox.filtersets import OrganizationalModelFilterSet, NetBoxModelFilterSet from tenancy.filtersets import TenancyFilterSet, ContactModelFilterSet from utilities.filters import MultiValueCharFilter, MultiValueMACAddressFilter, TreeNodeMultipleChoiceFilter @@ -295,6 +295,17 @@ class VMInterfaceFilterSet(NetBoxModelFilterSet): to_field_name='rd', label=_('VRF (RD)'), ) + l2vpn_id = django_filters.ModelMultipleChoiceFilter( + field_name='l2vpn_terminations__l2vpn', + queryset=L2VPN.objects.all(), + label=_('L2VPN (ID)'), + ) + l2vpn = django_filters.ModelMultipleChoiceFilter( + field_name='l2vpn_terminations__l2vpn__identifier', + queryset=L2VPN.objects.all(), + to_field_name='identifier', + label=_('L2VPN'), + ) class Meta: model = VMInterface diff --git a/netbox/virtualization/forms/filtersets.py b/netbox/virtualization/forms/filtersets.py index 2ead56595..46318c916 100644 --- a/netbox/virtualization/forms/filtersets.py +++ b/netbox/virtualization/forms/filtersets.py @@ -3,7 +3,7 @@ from django.utils.translation import gettext as _ from dcim.models import Device, DeviceRole, Platform, Region, Site, SiteGroup from extras.forms import LocalConfigContextFilterForm -from ipam.models import VRF +from ipam.models import L2VPN, VRF from netbox.forms import NetBoxModelFilterSetForm from tenancy.forms import ContactModelFilterForm, TenancyFilterForm from utilities.forms import ( @@ -177,7 +177,7 @@ class VMInterfaceFilterForm(NetBoxModelFilterSetForm): fieldsets = ( (None, ('q', 'filter_id', 'tag')), ('Virtual Machine', ('cluster_id', 'virtual_machine_id')), - ('Attributes', ('enabled', 'mac_address', 'vrf_id')), + ('Attributes', ('enabled', 'mac_address', 'vrf_id', 'l2vpn_id')), ) cluster_id = DynamicModelMultipleChoiceField( queryset=Cluster.objects.all(), @@ -207,4 +207,9 @@ class VMInterfaceFilterForm(NetBoxModelFilterSetForm): required=False, label='VRF' ) + l2vpn_id = DynamicModelMultipleChoiceField( + queryset=L2VPN.objects.all(), + required=False, + label=_('L2VPN') + ) tag = TagFilterField(model)