From f0fef94a4fd461ff670ecd408c8027cf6f83a744 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 30 Jan 2017 15:35:01 -0500 Subject: [PATCH] Re-implemented interface/connection serializers --- netbox/circuits/api/serializers.py | 4 +- netbox/dcim/api/serializers.py | 90 ++++++++++++++++++++---------- netbox/dcim/api/views.py | 14 ++--- netbox/ipam/api/serializers.py | 4 +- 4 files changed, 70 insertions(+), 42 deletions(-) diff --git a/netbox/circuits/api/serializers.py b/netbox/circuits/api/serializers.py index d5f229a82..68b26cff7 100644 --- a/netbox/circuits/api/serializers.py +++ b/netbox/circuits/api/serializers.py @@ -1,7 +1,7 @@ from rest_framework import serializers from circuits.models import Provider, Circuit, CircuitTermination, CircuitType -from dcim.api.serializers import NestedSiteSerializer, ChildInterfaceSerializer +from dcim.api.serializers import NestedSiteSerializer, DeviceInterfaceSerializer from extras.api.serializers import CustomFieldSerializer from tenancy.api.serializers import NestedTenantSerializer @@ -51,7 +51,7 @@ class NestedCircuitTypeSerializer(serializers.HyperlinkedModelSerializer): class CircuitTerminationSerializer(serializers.ModelSerializer): site = NestedSiteSerializer() - interface = ChildInterfaceSerializer() + interface = DeviceInterfaceSerializer() class Meta: model = CircuitTermination diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index c6e68b9cb..e7c9ab80d 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -313,7 +313,7 @@ class ConsoleServerPortSerializer(serializers.ModelSerializer): fields = ['id', 'device', 'name', 'connected_console'] -class ChildConsoleServerPortSerializer(serializers.HyperlinkedModelSerializer): +class DeviceConsoleServerPortSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = ConsoleServerPort @@ -333,7 +333,7 @@ class ConsolePortSerializer(serializers.ModelSerializer): fields = ['id', 'device', 'name', 'cs_port', 'connection_status'] -class ChildConsolePortSerializer(serializers.HyperlinkedModelSerializer): +class DeviceConsolePortSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = ConsolePort @@ -352,7 +352,7 @@ class PowerOutletSerializer(serializers.ModelSerializer): fields = ['id', 'device', 'name', 'connected_port'] -class ChildPowerOutletSerializer(serializers.HyperlinkedModelSerializer): +class DevicePowerOutletSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = PowerOutlet @@ -372,7 +372,7 @@ class PowerPortSerializer(serializers.ModelSerializer): fields = ['id', 'device', 'name', 'power_outlet', 'connection_status'] -class ChildPowerPortSerializer(serializers.HyperlinkedModelSerializer): +class DevicePowerPortSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = PowerPort @@ -383,31 +383,70 @@ class ChildPowerPortSerializer(serializers.HyperlinkedModelSerializer): # Interfaces # + class InterfaceSerializer(serializers.ModelSerializer): device = NestedDeviceSerializer() - form_factor = serializers.ReadOnlyField(source='get_form_factor_display') + connection = serializers.SerializerMethodField(read_only=True) + connected_interface = serializers.SerializerMethodField(read_only=True) class Meta: model = Interface - fields = ['id', 'device', 'name', 'form_factor', 'mac_address', 'mgmt_only', 'description', 'is_connected'] - - -class ChildInterfaceSerializer(serializers.HyperlinkedModelSerializer): - - class Meta: - model = Interface - fields = ['id', 'url', 'name', 'form_factor', 'mac_address', 'mgmt_only', 'description', 'is_connected'] - - -# TODO: Remove this -class InterfaceDetailSerializer(InterfaceSerializer): - - class Meta(InterfaceSerializer.Meta): fields = [ - 'id', 'device', 'name', 'form_factor', 'mac_address', 'mgmt_only', 'description', 'is_connected', + 'id', 'device', 'name', 'form_factor', 'mac_address', 'mgmt_only', 'description', 'connection', 'connected_interface', ] + def get_connection(self, obj): + if obj.connection: + return NestedInterfaceConnectionSerializer(obj.connection, context=self.context).data + return None + + def get_connected_interface(self, obj): + if obj.connected_interface: + return PeerInterfaceSerializer(obj.connected_interface, context=self.context).data + return None + + +class PeerInterfaceSerializer(serializers.HyperlinkedModelSerializer): + device = NestedDeviceSerializer() + + class Meta: + model = Interface + fields = ['id', 'url', 'device', 'name', 'form_factor', 'mac_address', 'mgmt_only', 'description'] + + +class DeviceInterfaceSerializer(serializers.HyperlinkedModelSerializer): + connection = serializers.SerializerMethodField() + + class Meta: + model = Interface + fields = ['id', 'url', 'name', 'form_factor', 'mac_address', 'mgmt_only', 'description', 'connection'] + + def get_connection(self, obj): + if obj.connection: + return NestedInterfaceConnectionSerializer(obj.connection, context=self.context).data + return None + + +# +# Interface connections +# + +class InterfaceConnectionSerializer(serializers.ModelSerializer): + interface_a = PeerInterfaceSerializer() + interface_b = PeerInterfaceSerializer() + + class Meta: + model = InterfaceConnection + fields = ['id', 'interface_a', 'interface_b', 'connection_status'] + + +class NestedInterfaceConnectionSerializer(serializers.HyperlinkedModelSerializer): + + class Meta: + model = InterfaceConnection + fields = ['id', 'url', 'connection_status'] + # # Device bays @@ -447,14 +486,3 @@ class ChildModuleSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = Module fields = ['id', 'url', 'parent', 'name', 'manufacturer', 'part_id', 'serial', 'discovered'] - - -# -# Interface connections -# - -class InterfaceConnectionSerializer(serializers.ModelSerializer): - - class Meta: - model = InterfaceConnection - fields = ['id', 'interface_a', 'interface_b', 'connection_status'] diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index b5946ff38..9d3f5f681 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -151,7 +151,7 @@ class ConsolePortViewSet(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin class ChildConsolePortViewSet(CreateModelMixin, ListModelMixin, WritableSerializerMixin, GenericViewSet): - serializer_class = serializers.ChildConsolePortSerializer + serializer_class = serializers.DeviceConsolePortSerializer def get_queryset(self): device = get_object_or_404(Device, pk=self.kwargs['pk']) @@ -169,7 +169,7 @@ class ConsoleServerPortViewSet(RetrieveModelMixin, UpdateModelMixin, DestroyMode class ChildConsoleServerPortViewSet(CreateModelMixin, ListModelMixin, WritableSerializerMixin, GenericViewSet): - serializer_class = serializers.ChildConsoleServerPortSerializer + serializer_class = serializers.DeviceConsoleServerPortSerializer def get_queryset(self): device = get_object_or_404(Device, pk=self.kwargs['pk']) @@ -187,7 +187,7 @@ class PowerPortViewSet(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, class ChildPowerPortViewSet(CreateModelMixin, ListModelMixin, WritableSerializerMixin, GenericViewSet): - serializer_class = serializers.ChildPowerPortSerializer + serializer_class = serializers.DevicePowerPortSerializer def get_queryset(self): device = get_object_or_404(Device, pk=self.kwargs['pk']) @@ -205,7 +205,7 @@ class PowerOutletViewSet(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin class ChildPowerOutletViewSet(CreateModelMixin, ListModelMixin, WritableSerializerMixin, GenericViewSet): - serializer_class = serializers.ChildPowerOutletSerializer + serializer_class = serializers.DevicePowerOutletSerializer def get_queryset(self): device = get_object_or_404(Device, pk=self.kwargs['pk']) @@ -219,11 +219,11 @@ class ChildPowerOutletViewSet(CreateModelMixin, ListModelMixin, WritableSerializ class InterfaceViewSet(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, WritableSerializerMixin, GenericViewSet): queryset = Interface.objects.select_related('device') - serializer_class = serializers.InterfaceDetailSerializer + serializer_class = serializers.InterfaceSerializer class ChildInterfaceViewSet(CreateModelMixin, ListModelMixin, WritableSerializerMixin, GenericViewSet): - serializer_class = serializers.ChildInterfaceSerializer + serializer_class = serializers.DeviceInterfaceSerializer filter_class = filters.InterfaceFilter def get_queryset(self): @@ -380,7 +380,7 @@ class RelatedConnectionsView(APIView): interfaces = Interface.objects.order_naturally(device.device_type.interface_ordering).filter(device=device)\ .select_related('connected_as_a', 'connected_as_b', 'circuit_termination') for iface in interfaces: - data = serializers.InterfaceDetailSerializer(instance=iface).data + data = serializers.InterfaceSerializer(instance=iface).data del(data['device']) response['interfaces'].append(data) diff --git a/netbox/ipam/api/serializers.py b/netbox/ipam/api/serializers.py index 8c7fb2fa7..37b42af6c 100644 --- a/netbox/ipam/api/serializers.py +++ b/netbox/ipam/api/serializers.py @@ -1,6 +1,6 @@ from rest_framework import serializers -from dcim.api.serializers import NestedDeviceSerializer, ChildInterfaceSerializer, NestedSiteSerializer +from dcim.api.serializers import NestedDeviceSerializer, DeviceInterfaceSerializer, NestedSiteSerializer from extras.api.serializers import CustomFieldSerializer from ipam.models import Aggregate, IPAddress, Prefix, RIR, Role, Service, VLAN, VLANGroup, VRF from tenancy.api.serializers import NestedTenantSerializer @@ -158,7 +158,7 @@ class NestedPrefixSerializer(serializers.HyperlinkedModelSerializer): class IPAddressSerializer(CustomFieldSerializer, serializers.ModelSerializer): vrf = NestedVRFSerializer() tenant = NestedTenantSerializer() - interface = ChildInterfaceSerializer() + interface = DeviceInterfaceSerializer() class Meta: model = IPAddress