From 97fbfeecc3b390750e5d02799ef4dfaa619bd3cc Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 5 Jul 2016 13:43:19 -0400 Subject: [PATCH] Extended API to include DeviceBays --- netbox/dcim/api/serializers.py | 36 +++++++++++++++++++++++++++++----- netbox/dcim/api/urls.py | 1 + netbox/dcim/api/views.py | 31 +++++++++++++++++++++++++++-- 3 files changed, 61 insertions(+), 7 deletions(-) diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index 44fdc2d72..50b2348ad 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -2,9 +2,9 @@ from rest_framework import serializers from ipam.models import IPAddress from dcim.models import ( - ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceType, DeviceRole, - Interface, InterfaceConnection, InterfaceTemplate, Manufacturer, Platform, PowerOutlet, PowerOutletTemplate, - PowerPort, PowerPortTemplate, Rack, RackGroup, RACK_FACE_FRONT, RACK_FACE_REAR, Site, + ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay, DeviceType, + DeviceRole, Interface, InterfaceConnection, InterfaceTemplate, Manufacturer, Platform, PowerOutlet, + PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack, RackGroup, RACK_FACE_FRONT, RACK_FACE_REAR, Site, ) @@ -228,9 +228,9 @@ class DeviceSerializer(serializers.ModelSerializer): 'face', 'status', 'primary_ip', 'comments'] -class DeviceNestedSerializer(DeviceSerializer): +class DeviceNestedSerializer(serializers.ModelSerializer): - class Meta(DeviceSerializer.Meta): + class Meta: model = Device fields = ['id', 'name', 'display_name'] @@ -337,6 +337,32 @@ class InterfaceDetailSerializer(InterfaceSerializer): 'connected_interface'] +# +# Device bays +# + +class DeviceBaySerializer(serializers.ModelSerializer): + device = DeviceNestedSerializer() + + class Meta: + model = DeviceBay + fields = ['id', 'device', 'name'] + + +class DeviceBayNestedSerializer(DeviceBaySerializer): + installed_device = DeviceNestedSerializer() + + class Meta(DeviceBaySerializer.Meta): + fields = ['id', 'name', 'installed_device'] + + +class DeviceBayDetailSerializer(DeviceBaySerializer): + installed_device = DeviceNestedSerializer() + + class Meta(DeviceBaySerializer.Meta): + fields = ['id', 'device', 'name', 'installed_device'] + + # # Interface connections # diff --git a/netbox/dcim/api/urls.py b/netbox/dcim/api/urls.py index a1947397a..724e244a2 100644 --- a/netbox/dcim/api/urls.py +++ b/netbox/dcim/api/urls.py @@ -49,6 +49,7 @@ urlpatterns = [ url(r'^devices/(?P\d+)/power-ports/$', PowerPortListView.as_view(), name='device_powerports'), url(r'^devices/(?P\d+)/power-outlets/$', PowerOutletListView.as_view(), name='device_poweroutlets'), url(r'^devices/(?P\d+)/interfaces/$', InterfaceListView.as_view(), name='device_interfaces'), + url(r'^devices/(?P\d+)/device-bays/$', DeviceBayListView.as_view(), name='device_devicebays'), # Console ports url(r'^console-ports/(?P\d+)/$', ConsolePortView.as_view(), name='consoleport'), diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index a576a04a2..243d92e36 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -9,8 +9,8 @@ from django.http import Http404 from django.shortcuts import get_object_or_404 from dcim.models import ( - ConsolePort, ConsoleServerPort, Device, DeviceRole, DeviceType, IFACE_FF_VIRTUAL, Interface, InterfaceConnection, - Manufacturer, Platform, PowerOutlet, PowerPort, Rack, RackGroup, Site, + ConsolePort, ConsoleServerPort, Device, DeviceBay, DeviceRole, DeviceType, IFACE_FF_VIRTUAL, Interface, + InterfaceConnection, Manufacturer, Platform, PowerOutlet, PowerPort, Rack, RackGroup, Site, ) from dcim import filters from .exceptions import MissingFilterException @@ -326,6 +326,33 @@ class InterfaceConnectionView(generics.RetrieveUpdateDestroyAPIView): queryset = InterfaceConnection.objects.all() +# +# Device bays +# + +class DeviceBayListView(generics.ListAPIView): + """ + List device bays (by device) + """ + serializer_class = serializers.DeviceBayNestedSerializer + + def get_queryset(self): + + device = get_object_or_404(Device, pk=self.kwargs['pk']) + queryset = DeviceBay.objects.filter(device=device).select_related('installed_device') + + # Filter by type (physical or virtual) + iface_type = self.request.query_params.get('type') + if iface_type == 'physical': + queryset = queryset.exclude(form_factor=IFACE_FF_VIRTUAL) + elif iface_type == 'virtual': + queryset = queryset.filter(form_factor=IFACE_FF_VIRTUAL) + elif iface_type is not None: + queryset = queryset.empty() + + return queryset + + # # Live queries #