Browse Source

Closes #1557: Added filtering for virtual machine interfaces

Jeremy Stretch 7 years ago
parent
commit
b734599f40
2 changed files with 37 additions and 1 deletions
  1. 1 0
      netbox/virtualization/api/views.py
  2. 36 1
      netbox/virtualization/filters.py

+ 1 - 0
netbox/virtualization/api/views.py

@@ -46,3 +46,4 @@ class InterfaceViewSet(WritableSerializerMixin, ModelViewSet):
     queryset = Interface.objects.filter(virtual_machine__isnull=False).select_related('virtual_machine')
     queryset = Interface.objects.filter(virtual_machine__isnull=False).select_related('virtual_machine')
     serializer_class = serializers.InterfaceSerializer
     serializer_class = serializers.InterfaceSerializer
     write_serializer_class = serializers.WritableInterfaceSerializer
     write_serializer_class = serializers.WritableInterfaceSerializer
+    filter_class = filters.InterfaceFilter

+ 36 - 1
netbox/virtualization/filters.py

@@ -1,9 +1,12 @@
 from __future__ import unicode_literals
 from __future__ import unicode_literals
 
 
 import django_filters
 import django_filters
+from netaddr import EUI
+from netaddr.core import AddrFormatError
+
 from django.db.models import Q
 from django.db.models import Q
 
 
-from dcim.models import DeviceRole, Platform, Site
+from dcim.models import DeviceRole, Interface, Platform, Site
 from extras.filters import CustomFieldFilterSet
 from extras.filters import CustomFieldFilterSet
 from tenancy.models import Tenant
 from tenancy.models import Tenant
 from utilities.filters import NullableModelMultipleChoiceFilter, NumericInFilter
 from utilities.filters import NullableModelMultipleChoiceFilter, NumericInFilter
@@ -126,3 +129,35 @@ class VirtualMachineFilter(CustomFieldFilterSet):
             Q(name__icontains=value) |
             Q(name__icontains=value) |
             Q(comments__icontains=value)
             Q(comments__icontains=value)
         )
         )
+
+
+class InterfaceFilter(django_filters.FilterSet):
+    virtual_machine_id = django_filters.ModelMultipleChoiceFilter(
+        name='virtual_machine',
+        queryset=VirtualMachine.objects.all(),
+        label='Virtual machine (ID)',
+    )
+    virtual_machine = django_filters.ModelMultipleChoiceFilter(
+        name='virtual_machine__name',
+        queryset=VirtualMachine.objects.all(),
+        to_field_name='name',
+        label='Virtual machine',
+    )
+    mac_address = django_filters.CharFilter(
+        method='_mac_address',
+        label='MAC address',
+    )
+
+    class Meta:
+        model = Interface
+        fields = ['name', 'enabled', 'mtu']
+
+    def _mac_address(self, queryset, name, value):
+        value = value.strip()
+        if not value:
+            return queryset
+        try:
+            mac = EUI(value.strip())
+            return queryset.filter(mac_address=mac)
+        except AddrFormatError:
+            return queryset.none()