from django.utils.translation import gettext as _ from django.contrib.contenttypes.models import ContentType from rest_framework import serializers from dcim.choices import * from dcim.constants import * from dcim.models import ( ConsolePort, ConsoleServerPort, DeviceBay, FrontPort, Interface, InventoryItem, ModuleBay, PortMapping, PowerOutlet, PowerPort, RearPort, VirtualDeviceContext, ) from ipam.api.serializers_.vlans import VLANSerializer, VLANTranslationPolicySerializer from ipam.api.serializers_.vrfs import VRFSerializer from ipam.models import VLAN from netbox.api.fields import ChoiceField, ContentTypeField, SerializedPKRelatedField from netbox.api.gfk_fields import GFKSerializerField from netbox.api.serializers import NetBoxModelSerializer from vpn.api.serializers_.l2vpn import L2VPNTerminationSerializer from wireless.api.serializers_.nested import NestedWirelessLinkSerializer from wireless.api.serializers_.wirelesslans import WirelessLANSerializer from wireless.choices import * from wireless.models import WirelessLAN from .base import ConnectedEndpointsSerializer, PortSerializer from .cables import CabledObjectSerializer from .devices import DeviceSerializer, MACAddressSerializer, ModuleSerializer, VirtualDeviceContextSerializer from .manufacturers import ManufacturerSerializer from .nested import NestedInterfaceSerializer from .roles import InventoryItemRoleSerializer __all__ = ( 'ConsolePortSerializer', 'ConsoleServerPortSerializer', 'DeviceBaySerializer', 'FrontPortSerializer', 'InterfaceSerializer', 'InventoryItemSerializer', 'ModuleBaySerializer', 'PowerOutletSerializer', 'PowerPortSerializer', 'RearPortSerializer', ) class ConsoleServerPortSerializer(NetBoxModelSerializer, CabledObjectSerializer, ConnectedEndpointsSerializer): device = DeviceSerializer(nested=True) module = ModuleSerializer( nested=True, fields=('id', 'url', 'display', 'device', 'module_bay'), required=False, allow_null=True ) type = ChoiceField( choices=ConsolePortTypeChoices, allow_blank=True, required=False ) speed = ChoiceField( choices=ConsolePortSpeedChoices, allow_null=True, required=False ) class Meta: model = ConsoleServerPort fields = [ 'id', 'url', 'display_url', 'display', 'device', 'module', 'name', 'label', 'type', 'speed', 'description', 'mark_connected', 'cable', 'cable_end', 'link_peers', 'link_peers_type', 'connected_endpoints', 'connected_endpoints_type', 'connected_endpoints_reachable', 'tags', 'custom_fields', 'created', 'last_updated', '_occupied', ] brief_fields = ('id', 'url', 'display', 'device', 'name', 'description', 'cable', '_occupied') class ConsolePortSerializer(NetBoxModelSerializer, CabledObjectSerializer, ConnectedEndpointsSerializer): device = DeviceSerializer(nested=True) module = ModuleSerializer( nested=True, fields=('id', 'url', 'display', 'device', 'module_bay'), required=False, allow_null=True ) type = ChoiceField( choices=ConsolePortTypeChoices, allow_blank=True, required=False ) speed = ChoiceField( choices=ConsolePortSpeedChoices, allow_null=True, required=False ) class Meta: model = ConsolePort fields = [ 'id', 'url', 'display_url', 'display', 'device', 'module', 'name', 'label', 'type', 'speed', 'description', 'mark_connected', 'cable', 'cable_end', 'link_peers', 'link_peers_type', 'connected_endpoints', 'connected_endpoints_type', 'connected_endpoints_reachable', 'tags', 'custom_fields', 'created', 'last_updated', '_occupied', ] brief_fields = ('id', 'url', 'display', 'device', 'name', 'description', 'cable', '_occupied') class PowerPortSerializer(NetBoxModelSerializer, CabledObjectSerializer, ConnectedEndpointsSerializer): device = DeviceSerializer(nested=True) module = ModuleSerializer( nested=True, fields=('id', 'url', 'display', 'device', 'module_bay'), required=False, allow_null=True ) type = ChoiceField( choices=PowerPortTypeChoices, allow_blank=True, required=False, allow_null=True ) class Meta: model = PowerPort fields = [ 'id', 'url', 'display_url', 'display', 'device', 'module', 'name', 'label', 'type', 'maximum_draw', 'allocated_draw', 'description', 'mark_connected', 'cable', 'cable_end', 'link_peers', 'link_peers_type', 'connected_endpoints', 'connected_endpoints_type', 'connected_endpoints_reachable', 'tags', 'custom_fields', 'created', 'last_updated', '_occupied', ] brief_fields = ('id', 'url', 'display', 'device', 'name', 'description', 'cable', '_occupied') class PowerOutletSerializer(NetBoxModelSerializer, CabledObjectSerializer, ConnectedEndpointsSerializer): device = DeviceSerializer(nested=True) module = ModuleSerializer( nested=True, fields=('id', 'url', 'display', 'device', 'module_bay'), required=False, allow_null=True ) type = ChoiceField( choices=PowerOutletTypeChoices, allow_blank=True, required=False, allow_null=True ) power_port = PowerPortSerializer( nested=True, required=False, allow_null=True ) feed_leg = ChoiceField( choices=PowerOutletFeedLegChoices, allow_blank=True, required=False, allow_null=True ) status = ChoiceField(choices=PowerOutletStatusChoices, required=False) class Meta: model = PowerOutlet fields = [ 'id', 'url', 'display_url', 'display', 'device', 'module', 'name', 'label', 'type', 'status', 'color', 'power_port', 'feed_leg', 'description', 'mark_connected', 'cable', 'cable_end', 'link_peers', 'link_peers_type', 'connected_endpoints', 'connected_endpoints_type', 'connected_endpoints_reachable', 'tags', 'custom_fields', 'created', 'last_updated', '_occupied', ] brief_fields = ('id', 'url', 'display', 'device', 'name', 'description', 'cable', '_occupied') class InterfaceSerializer(NetBoxModelSerializer, CabledObjectSerializer, ConnectedEndpointsSerializer): device = DeviceSerializer(nested=True) vdcs = SerializedPKRelatedField( queryset=VirtualDeviceContext.objects.all(), serializer=VirtualDeviceContextSerializer, nested=True, required=False, many=True ) module = ModuleSerializer( nested=True, fields=('id', 'url', 'display', 'device', 'module_bay'), required=False, allow_null=True ) type = ChoiceField(choices=InterfaceTypeChoices) parent = NestedInterfaceSerializer(required=False, allow_null=True) bridge = NestedInterfaceSerializer(required=False, allow_null=True) lag = NestedInterfaceSerializer(required=False, allow_null=True) mode = ChoiceField(choices=InterfaceModeChoices, required=False, allow_blank=True) duplex = ChoiceField(choices=InterfaceDuplexChoices, required=False, allow_blank=True, allow_null=True) rf_role = ChoiceField(choices=WirelessRoleChoices, required=False, allow_blank=True) rf_channel = ChoiceField(choices=WirelessChannelChoices, required=False, allow_blank=True) poe_mode = ChoiceField(choices=InterfacePoEModeChoices, required=False, allow_blank=True) poe_type = ChoiceField(choices=InterfacePoETypeChoices, required=False, allow_blank=True) untagged_vlan = VLANSerializer(nested=True, required=False, allow_null=True) tagged_vlans = SerializedPKRelatedField( queryset=VLAN.objects.all(), serializer=VLANSerializer, nested=True, required=False, many=True ) qinq_svlan = VLANSerializer(nested=True, required=False, allow_null=True) vlan_translation_policy = VLANTranslationPolicySerializer(nested=True, required=False, allow_null=True) vrf = VRFSerializer(nested=True, required=False, allow_null=True) l2vpn_termination = L2VPNTerminationSerializer(nested=True, read_only=True, allow_null=True) wireless_link = NestedWirelessLinkSerializer(read_only=True, allow_null=True) wireless_lans = SerializedPKRelatedField( queryset=WirelessLAN.objects.all(), serializer=WirelessLANSerializer, nested=True, required=False, many=True ) count_ipaddresses = serializers.IntegerField(read_only=True) count_fhrp_groups = serializers.IntegerField(read_only=True) # Maintains backward compatibility with NetBox