|
|
@@ -11,35 +11,37 @@ from ipam.api.nested_serializers import NestedIPAddressSerializer, NestedVLANSer
|
|
|
from ipam.models import VLAN
|
|
|
from netbox.api import ChoiceField, ContentTypeField, SerializedPKRelatedField
|
|
|
from netbox.api.serializers import (
|
|
|
- NestedGroupModelSerializer, OrganizationalModelSerializer, PrimaryModelSerializer, ValidatedModelSerializer,
|
|
|
- WritableNestedSerializer,
|
|
|
+ NestedGroupModelSerializer, PrimaryModelSerializer, ValidatedModelSerializer, WritableNestedSerializer,
|
|
|
)
|
|
|
+from netbox.config import ConfigItem
|
|
|
from tenancy.api.nested_serializers import NestedTenantSerializer
|
|
|
from users.api.nested_serializers import NestedUserSerializer
|
|
|
from utilities.api import get_serializer_for_model
|
|
|
from virtualization.api.nested_serializers import NestedClusterSerializer
|
|
|
+from wireless.api.nested_serializers import NestedWirelessLinkSerializer
|
|
|
+from wireless.choices import *
|
|
|
from .nested_serializers import *
|
|
|
|
|
|
|
|
|
-class CableTerminationSerializer(serializers.ModelSerializer):
|
|
|
- cable_peer_type = serializers.SerializerMethodField(read_only=True)
|
|
|
- cable_peer = serializers.SerializerMethodField(read_only=True)
|
|
|
+class LinkTerminationSerializer(serializers.ModelSerializer):
|
|
|
+ link_peer_type = serializers.SerializerMethodField(read_only=True)
|
|
|
+ link_peer = serializers.SerializerMethodField(read_only=True)
|
|
|
_occupied = serializers.SerializerMethodField(read_only=True)
|
|
|
|
|
|
- def get_cable_peer_type(self, obj):
|
|
|
- if obj._cable_peer is not None:
|
|
|
- return f'{obj._cable_peer._meta.app_label}.{obj._cable_peer._meta.model_name}'
|
|
|
+ def get_link_peer_type(self, obj):
|
|
|
+ if obj._link_peer is not None:
|
|
|
+ return f'{obj._link_peer._meta.app_label}.{obj._link_peer._meta.model_name}'
|
|
|
return None
|
|
|
|
|
|
@swagger_serializer_method(serializer_or_field=serializers.DictField)
|
|
|
- def get_cable_peer(self, obj):
|
|
|
+ def get_link_peer(self, obj):
|
|
|
"""
|
|
|
- Return the appropriate serializer for the cable termination model.
|
|
|
+ Return the appropriate serializer for the link termination model.
|
|
|
"""
|
|
|
- if obj._cable_peer is not None:
|
|
|
- serializer = get_serializer_for_model(obj._cable_peer, prefix='Nested')
|
|
|
+ if obj._link_peer is not None:
|
|
|
+ serializer = get_serializer_for_model(obj._link_peer, prefix='Nested')
|
|
|
context = {'request': self.context['request']}
|
|
|
- return serializer(obj._cable_peer, context=context).data
|
|
|
+ return serializer(obj._link_peer, context=context).data
|
|
|
return None
|
|
|
|
|
|
@swagger_serializer_method(serializer_or_field=serializers.BooleanField)
|
|
|
@@ -87,8 +89,8 @@ class RegionSerializer(NestedGroupModelSerializer):
|
|
|
class Meta:
|
|
|
model = Region
|
|
|
fields = [
|
|
|
- 'id', 'url', 'display', 'name', 'slug', 'parent', 'description', 'custom_fields', 'created', 'last_updated',
|
|
|
- 'site_count', '_depth',
|
|
|
+ 'id', 'url', 'display', 'name', 'slug', 'parent', 'description', 'tags', 'custom_fields', 'created',
|
|
|
+ 'last_updated', 'site_count', '_depth',
|
|
|
]
|
|
|
|
|
|
|
|
|
@@ -100,8 +102,8 @@ class SiteGroupSerializer(NestedGroupModelSerializer):
|
|
|
class Meta:
|
|
|
model = SiteGroup
|
|
|
fields = [
|
|
|
- 'id', 'url', 'display', 'name', 'slug', 'parent', 'description', 'custom_fields', 'created', 'last_updated',
|
|
|
- 'site_count', '_depth',
|
|
|
+ 'id', 'url', 'display', 'name', 'slug', 'parent', 'description', 'tags', 'custom_fields', 'created',
|
|
|
+ 'last_updated', 'site_count', '_depth',
|
|
|
]
|
|
|
|
|
|
|
|
|
@@ -147,20 +149,20 @@ class LocationSerializer(NestedGroupModelSerializer):
|
|
|
class Meta:
|
|
|
model = Location
|
|
|
fields = [
|
|
|
- 'id', 'url', 'display', 'name', 'slug', 'site', 'parent', 'tenant', 'description', 'custom_fields',
|
|
|
+ 'id', 'url', 'display', 'name', 'slug', 'site', 'parent', 'tenant', 'description', 'tags', 'custom_fields',
|
|
|
'created', 'last_updated', 'rack_count', 'device_count', '_depth',
|
|
|
]
|
|
|
|
|
|
|
|
|
-class RackRoleSerializer(OrganizationalModelSerializer):
|
|
|
+class RackRoleSerializer(PrimaryModelSerializer):
|
|
|
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rackrole-detail')
|
|
|
rack_count = serializers.IntegerField(read_only=True)
|
|
|
|
|
|
class Meta:
|
|
|
model = RackRole
|
|
|
fields = [
|
|
|
- 'id', 'url', 'display', 'name', 'slug', 'color', 'description', 'custom_fields', 'created', 'last_updated',
|
|
|
- 'rack_count',
|
|
|
+ 'id', 'url', 'display', 'name', 'slug', 'color', 'description', 'tags', 'custom_fields', 'created',
|
|
|
+ 'last_updated', 'rack_count',
|
|
|
]
|
|
|
|
|
|
|
|
|
@@ -231,10 +233,10 @@ class RackElevationDetailFilterSerializer(serializers.Serializer):
|
|
|
default=RackElevationDetailRenderChoices.RENDER_JSON
|
|
|
)
|
|
|
unit_width = serializers.IntegerField(
|
|
|
- default=settings.RACK_ELEVATION_DEFAULT_UNIT_WIDTH
|
|
|
+ default=ConfigItem('RACK_ELEVATION_DEFAULT_UNIT_WIDTH')
|
|
|
)
|
|
|
unit_height = serializers.IntegerField(
|
|
|
- default=settings.RACK_ELEVATION_DEFAULT_UNIT_HEIGHT
|
|
|
+ default=ConfigItem('RACK_ELEVATION_DEFAULT_UNIT_HEIGHT')
|
|
|
)
|
|
|
legend_width = serializers.IntegerField(
|
|
|
default=RACK_ELEVATION_LEGEND_WIDTH_DEFAULT
|
|
|
@@ -257,7 +259,7 @@ class RackElevationDetailFilterSerializer(serializers.Serializer):
|
|
|
# Device types
|
|
|
#
|
|
|
|
|
|
-class ManufacturerSerializer(OrganizationalModelSerializer):
|
|
|
+class ManufacturerSerializer(PrimaryModelSerializer):
|
|
|
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:manufacturer-detail')
|
|
|
devicetype_count = serializers.IntegerField(read_only=True)
|
|
|
inventoryitem_count = serializers.IntegerField(read_only=True)
|
|
|
@@ -266,7 +268,7 @@ class ManufacturerSerializer(OrganizationalModelSerializer):
|
|
|
class Meta:
|
|
|
model = Manufacturer
|
|
|
fields = [
|
|
|
- 'id', 'url', 'display', 'name', 'slug', 'description', 'custom_fields', 'created', 'last_updated',
|
|
|
+ 'id', 'url', 'display', 'name', 'slug', 'description', 'tags', 'custom_fields', 'created', 'last_updated',
|
|
|
'devicetype_count', 'inventoryitem_count', 'platform_count',
|
|
|
]
|
|
|
|
|
|
@@ -414,7 +416,7 @@ class DeviceBayTemplateSerializer(ValidatedModelSerializer):
|
|
|
# Devices
|
|
|
#
|
|
|
|
|
|
-class DeviceRoleSerializer(OrganizationalModelSerializer):
|
|
|
+class DeviceRoleSerializer(PrimaryModelSerializer):
|
|
|
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicerole-detail')
|
|
|
device_count = serializers.IntegerField(read_only=True)
|
|
|
virtualmachine_count = serializers.IntegerField(read_only=True)
|
|
|
@@ -422,12 +424,12 @@ class DeviceRoleSerializer(OrganizationalModelSerializer):
|
|
|
class Meta:
|
|
|
model = DeviceRole
|
|
|
fields = [
|
|
|
- 'id', 'url', 'display', 'name', 'slug', 'color', 'vm_role', 'description', 'custom_fields', 'created',
|
|
|
- 'last_updated', 'device_count', 'virtualmachine_count',
|
|
|
+ 'id', 'url', 'display', 'name', 'slug', 'color', 'vm_role', 'description', 'tags', 'custom_fields',
|
|
|
+ 'created', 'last_updated', 'device_count', 'virtualmachine_count',
|
|
|
]
|
|
|
|
|
|
|
|
|
-class PlatformSerializer(OrganizationalModelSerializer):
|
|
|
+class PlatformSerializer(PrimaryModelSerializer):
|
|
|
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:platform-detail')
|
|
|
manufacturer = NestedManufacturerSerializer(required=False, allow_null=True)
|
|
|
device_count = serializers.IntegerField(read_only=True)
|
|
|
@@ -437,7 +439,7 @@ class PlatformSerializer(OrganizationalModelSerializer):
|
|
|
model = Platform
|
|
|
fields = [
|
|
|
'id', 'url', 'display', 'name', 'slug', 'manufacturer', 'napalm_driver', 'napalm_args', 'description',
|
|
|
- 'custom_fields', 'created', 'last_updated', 'device_count', 'virtualmachine_count',
|
|
|
+ 'tags', 'custom_fields', 'created', 'last_updated', 'device_count', 'virtualmachine_count',
|
|
|
]
|
|
|
|
|
|
|
|
|
@@ -507,7 +509,7 @@ class DeviceNAPALMSerializer(serializers.Serializer):
|
|
|
# Device components
|
|
|
#
|
|
|
|
|
|
-class ConsoleServerPortSerializer(PrimaryModelSerializer, CableTerminationSerializer, ConnectedEndpointSerializer):
|
|
|
+class ConsoleServerPortSerializer(PrimaryModelSerializer, LinkTerminationSerializer, ConnectedEndpointSerializer):
|
|
|
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleserverport-detail')
|
|
|
device = NestedDeviceSerializer()
|
|
|
type = ChoiceField(
|
|
|
@@ -526,12 +528,12 @@ class ConsoleServerPortSerializer(PrimaryModelSerializer, CableTerminationSerial
|
|
|
model = ConsoleServerPort
|
|
|
fields = [
|
|
|
'id', 'url', 'display', 'device', 'name', 'label', 'type', 'speed', 'description', 'mark_connected',
|
|
|
- 'cable', 'cable_peer', 'cable_peer_type', 'connected_endpoint', 'connected_endpoint_type',
|
|
|
+ 'cable', 'link_peer', 'link_peer_type', 'connected_endpoint', 'connected_endpoint_type',
|
|
|
'connected_endpoint_reachable', 'tags', 'custom_fields', 'created', 'last_updated', '_occupied',
|
|
|
]
|
|
|
|
|
|
|
|
|
-class ConsolePortSerializer(PrimaryModelSerializer, CableTerminationSerializer, ConnectedEndpointSerializer):
|
|
|
+class ConsolePortSerializer(PrimaryModelSerializer, LinkTerminationSerializer, ConnectedEndpointSerializer):
|
|
|
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleport-detail')
|
|
|
device = NestedDeviceSerializer()
|
|
|
type = ChoiceField(
|
|
|
@@ -550,12 +552,12 @@ class ConsolePortSerializer(PrimaryModelSerializer, CableTerminationSerializer,
|
|
|
model = ConsolePort
|
|
|
fields = [
|
|
|
'id', 'url', 'display', 'device', 'name', 'label', 'type', 'speed', 'description', 'mark_connected',
|
|
|
- 'cable', 'cable_peer', 'cable_peer_type', 'connected_endpoint', 'connected_endpoint_type',
|
|
|
+ 'cable', 'link_peer', 'link_peer_type', 'connected_endpoint', 'connected_endpoint_type',
|
|
|
'connected_endpoint_reachable', 'tags', 'custom_fields', 'created', 'last_updated', '_occupied',
|
|
|
]
|
|
|
|
|
|
|
|
|
-class PowerOutletSerializer(PrimaryModelSerializer, CableTerminationSerializer, ConnectedEndpointSerializer):
|
|
|
+class PowerOutletSerializer(PrimaryModelSerializer, LinkTerminationSerializer, ConnectedEndpointSerializer):
|
|
|
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:poweroutlet-detail')
|
|
|
device = NestedDeviceSerializer()
|
|
|
type = ChoiceField(
|
|
|
@@ -579,12 +581,12 @@ class PowerOutletSerializer(PrimaryModelSerializer, CableTerminationSerializer,
|
|
|
model = PowerOutlet
|
|
|
fields = [
|
|
|
'id', 'url', 'display', 'device', 'name', 'label', 'type', 'power_port', 'feed_leg', 'description',
|
|
|
- 'mark_connected', 'cable', 'cable_peer', 'cable_peer_type', 'connected_endpoint', 'connected_endpoint_type',
|
|
|
+ 'mark_connected', 'cable', 'link_peer', 'link_peer_type', 'connected_endpoint', 'connected_endpoint_type',
|
|
|
'connected_endpoint_reachable', 'tags', 'custom_fields', 'created', 'last_updated', '_occupied',
|
|
|
]
|
|
|
|
|
|
|
|
|
-class PowerPortSerializer(PrimaryModelSerializer, CableTerminationSerializer, ConnectedEndpointSerializer):
|
|
|
+class PowerPortSerializer(PrimaryModelSerializer, LinkTerminationSerializer, ConnectedEndpointSerializer):
|
|
|
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerport-detail')
|
|
|
device = NestedDeviceSerializer()
|
|
|
type = ChoiceField(
|
|
|
@@ -598,18 +600,21 @@ class PowerPortSerializer(PrimaryModelSerializer, CableTerminationSerializer, Co
|
|
|
model = PowerPort
|
|
|
fields = [
|
|
|
'id', 'url', 'display', 'device', 'name', 'label', 'type', 'maximum_draw', 'allocated_draw', 'description',
|
|
|
- 'mark_connected', 'cable', 'cable_peer', 'cable_peer_type', 'connected_endpoint', 'connected_endpoint_type',
|
|
|
+ 'mark_connected', 'cable', 'link_peer', 'link_peer_type', 'connected_endpoint', 'connected_endpoint_type',
|
|
|
'connected_endpoint_reachable', 'tags', 'custom_fields', 'created', 'last_updated', '_occupied',
|
|
|
]
|
|
|
|
|
|
|
|
|
-class InterfaceSerializer(PrimaryModelSerializer, CableTerminationSerializer, ConnectedEndpointSerializer):
|
|
|
+class InterfaceSerializer(PrimaryModelSerializer, LinkTerminationSerializer, ConnectedEndpointSerializer):
|
|
|
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:interface-detail')
|
|
|
device = NestedDeviceSerializer()
|
|
|
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, allow_blank=True, required=False)
|
|
|
+ rf_role = ChoiceField(choices=WirelessRoleChoices, required=False, allow_null=True)
|
|
|
+ rf_channel = ChoiceField(choices=WirelessChannelChoices, required=False)
|
|
|
untagged_vlan = NestedVLANSerializer(required=False, allow_null=True)
|
|
|
tagged_vlans = SerializedPKRelatedField(
|
|
|
queryset=VLAN.objects.all(),
|
|
|
@@ -618,14 +623,16 @@ class InterfaceSerializer(PrimaryModelSerializer, CableTerminationSerializer, Co
|
|
|
many=True
|
|
|
)
|
|
|
cable = NestedCableSerializer(read_only=True)
|
|
|
+ wireless_link = NestedWirelessLinkSerializer(read_only=True)
|
|
|
count_ipaddresses = serializers.IntegerField(read_only=True)
|
|
|
|
|
|
class Meta:
|
|
|
model = Interface
|
|
|
fields = [
|
|
|
- 'id', 'url', 'display', 'device', 'name', 'label', 'type', 'enabled', 'parent', 'lag', 'mtu', 'mac_address',
|
|
|
- 'wwn', 'mgmt_only', 'description', 'mode', 'untagged_vlan', 'tagged_vlans', 'mark_connected', 'cable',
|
|
|
- 'cable_peer', 'cable_peer_type', 'connected_endpoint', 'connected_endpoint_type',
|
|
|
+ 'id', 'url', 'display', 'device', 'name', 'label', 'type', 'enabled', 'parent', 'bridge', 'lag', 'mtu',
|
|
|
+ 'mac_address', 'wwn', 'mgmt_only', 'description', 'mode', 'rf_role', 'rf_channel', 'rf_channel_frequency',
|
|
|
+ 'rf_channel_width', 'tx_power', 'untagged_vlan', 'tagged_vlans', 'mark_connected', 'cable', 'wireless_link',
|
|
|
+ 'link_peer', 'link_peer_type', 'connected_endpoint', 'connected_endpoint_type',
|
|
|
'connected_endpoint_reachable', 'tags', 'custom_fields', 'created', 'last_updated', 'count_ipaddresses',
|
|
|
'_occupied',
|
|
|
]
|
|
|
@@ -644,7 +651,7 @@ class InterfaceSerializer(PrimaryModelSerializer, CableTerminationSerializer, Co
|
|
|
return super().validate(data)
|
|
|
|
|
|
|
|
|
-class RearPortSerializer(PrimaryModelSerializer, CableTerminationSerializer):
|
|
|
+class RearPortSerializer(PrimaryModelSerializer, LinkTerminationSerializer):
|
|
|
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rearport-detail')
|
|
|
device = NestedDeviceSerializer()
|
|
|
type = ChoiceField(choices=PortTypeChoices)
|
|
|
@@ -654,7 +661,7 @@ class RearPortSerializer(PrimaryModelSerializer, CableTerminationSerializer):
|
|
|
model = RearPort
|
|
|
fields = [
|
|
|
'id', 'url', 'display', 'device', 'name', 'label', 'type', 'color', 'positions', 'description',
|
|
|
- 'mark_connected', 'cable', 'cable_peer', 'cable_peer_type', 'tags', 'custom_fields', 'created',
|
|
|
+ 'mark_connected', 'cable', 'link_peer', 'link_peer_type', 'tags', 'custom_fields', 'created',
|
|
|
'last_updated', '_occupied',
|
|
|
]
|
|
|
|
|
|
@@ -670,7 +677,7 @@ class FrontPortRearPortSerializer(WritableNestedSerializer):
|
|
|
fields = ['id', 'url', 'display', 'name', 'label']
|
|
|
|
|
|
|
|
|
-class FrontPortSerializer(PrimaryModelSerializer, CableTerminationSerializer):
|
|
|
+class FrontPortSerializer(PrimaryModelSerializer, LinkTerminationSerializer):
|
|
|
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:frontport-detail')
|
|
|
device = NestedDeviceSerializer()
|
|
|
type = ChoiceField(choices=PortTypeChoices)
|
|
|
@@ -681,7 +688,7 @@ class FrontPortSerializer(PrimaryModelSerializer, CableTerminationSerializer):
|
|
|
model = FrontPort
|
|
|
fields = [
|
|
|
'id', 'url', 'display', 'device', 'name', 'label', 'type', 'color', 'rear_port', 'rear_port_position',
|
|
|
- 'description', 'mark_connected', 'cable', 'cable_peer', 'cable_peer_type', 'tags', 'custom_fields',
|
|
|
+ 'description', 'mark_connected', 'cable', 'link_peer', 'link_peer_type', 'tags', 'custom_fields',
|
|
|
'created', 'last_updated', '_occupied',
|
|
|
]
|
|
|
|
|
|
@@ -732,7 +739,7 @@ class CableSerializer(PrimaryModelSerializer):
|
|
|
)
|
|
|
termination_a = serializers.SerializerMethodField(read_only=True)
|
|
|
termination_b = serializers.SerializerMethodField(read_only=True)
|
|
|
- status = ChoiceField(choices=CableStatusChoices, required=False)
|
|
|
+ status = ChoiceField(choices=LinkStatusChoices, required=False)
|
|
|
tenant = NestedTenantSerializer(required=False, allow_null=True)
|
|
|
length_unit = ChoiceField(choices=CableLengthUnitChoices, allow_blank=True, required=False)
|
|
|
|
|
|
@@ -857,7 +864,7 @@ class PowerPanelSerializer(PrimaryModelSerializer):
|
|
|
fields = ['id', 'url', 'display', 'site', 'location', 'name', 'tags', 'custom_fields', 'powerfeed_count']
|
|
|
|
|
|
|
|
|
-class PowerFeedSerializer(PrimaryModelSerializer, CableTerminationSerializer, ConnectedEndpointSerializer):
|
|
|
+class PowerFeedSerializer(PrimaryModelSerializer, LinkTerminationSerializer, ConnectedEndpointSerializer):
|
|
|
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerfeed-detail')
|
|
|
power_panel = NestedPowerPanelSerializer()
|
|
|
rack = NestedRackSerializer(
|
|
|
@@ -887,7 +894,7 @@ class PowerFeedSerializer(PrimaryModelSerializer, CableTerminationSerializer, Co
|
|
|
model = PowerFeed
|
|
|
fields = [
|
|
|
'id', 'url', 'display', 'power_panel', 'rack', 'name', 'status', 'type', 'supply', 'phase', 'voltage',
|
|
|
- 'amperage', 'max_utilization', 'comments', 'mark_connected', 'cable', 'cable_peer', 'cable_peer_type',
|
|
|
+ 'amperage', 'max_utilization', 'comments', 'mark_connected', 'cable', 'link_peer', 'link_peer_type',
|
|
|
'connected_endpoint', 'connected_endpoint_type', 'connected_endpoint_reachable', 'tags', 'custom_fields',
|
|
|
'created', 'last_updated', '_occupied',
|
|
|
]
|