Initial work on #20 - patch panels

This commit is contained in:
Jeremy Stretch
2018-10-03 14:04:16 -04:00
parent 364bbdeab8
commit 3eddeeadc5
18 changed files with 1101 additions and 34 deletions

View File

@@ -3,15 +3,13 @@ from rest_framework.validators import UniqueTogetherValidator
from taggit_serializer.serializers import TaggitSerializer, TagListSerializerField
from circuits.models import Circuit, CircuitTermination
from dcim.constants import (
CONNECTION_STATUS_CHOICES, DEVICE_STATUS_CHOICES, IFACE_FF_CHOICES, IFACE_MODE_CHOICES, IFACE_ORDERING_CHOICES,
RACK_FACE_CHOICES, RACK_TYPE_CHOICES, RACK_WIDTH_CHOICES, SITE_STATUS_CHOICES, SUBDEVICE_ROLE_CHOICES,
)
from dcim.constants import *
from dcim.models import (
ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay,
DeviceBayTemplate, DeviceType, DeviceRole, Interface, InterfaceConnection, InterfaceTemplate, Manufacturer,
InventoryItem, Platform, PowerOutlet, PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack, RackGroup,
RackReservation, RackRole, Region, Site, VirtualChassis,
DeviceBayTemplate, DeviceType, DeviceRole, FrontPanelPort, FrontPanelPortTemplate, Interface, InterfaceConnection,
InterfaceTemplate, Manufacturer, InventoryItem, Platform, PowerOutlet, PowerOutletTemplate, PowerPort,
PowerPortTemplate, Rack, RackGroup, RackReservation, RackRole, RearPanelPort, RearPanelPortTemplate, Region, Site,
VirtualChassis,
)
from extras.api.customfields import CustomFieldModelSerializer
from ipam.models import IPAddress, VLAN
@@ -229,8 +227,8 @@ class DeviceTypeSerializer(TaggitSerializer, CustomFieldModelSerializer):
model = DeviceType
fields = [
'id', 'manufacturer', 'model', 'slug', 'part_number', 'u_height', 'is_full_depth', 'interface_ordering',
'is_console_server', 'is_pdu', 'is_network_device', 'subdevice_role', 'comments', 'tags', 'custom_fields',
'created', 'last_updated', 'instance_count',
'is_console_server', 'is_pdu', 'is_network_device', 'is_patch_panel', 'subdevice_role', 'comments', 'tags',
'custom_fields', 'created', 'last_updated', 'instance_count',
]
@@ -304,6 +302,49 @@ class InterfaceTemplateSerializer(ValidatedModelSerializer):
fields = ['id', 'device_type', 'name', 'form_factor', 'mgmt_only']
#
# Rear panel port templates
#
class RearPanelPortTemplateSerializer(ValidatedModelSerializer):
device_type = NestedDeviceTypeSerializer()
type = ChoiceField(choices=PANELPORT_TYPE_CHOICES)
class Meta:
model = RearPanelPortTemplate
fields = ['id', 'device_type', 'name', 'type', 'positions']
class NestedRearPanelPortTemplateSerializer(WritableNestedSerializer):
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rearpanelporttemplate-detail')
class Meta:
model = RearPanelPortTemplate
fields = ['id', 'url', 'name']
#
# Front panel port templates
#
class FrontPanelPortTemplateSerializer(ValidatedModelSerializer):
device_type = NestedDeviceTypeSerializer()
type = ChoiceField(choices=PANELPORT_TYPE_CHOICES)
rear_port = NestedRearPanelPortTemplateSerializer()
class Meta:
model = FrontPanelPortTemplate
fields = ['id', 'device_type', 'name', 'type', 'rear_port', 'rear_port_position']
class NestedFrontPanelPortTemplateSerializer(WritableNestedSerializer):
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:frontpanelporttemplate-detail')
class Meta:
model = FrontPanelPortTemplate
fields = ['id', 'url', 'name']
#
# Device bay templates
#
@@ -634,6 +675,51 @@ class InterfaceSerializer(TaggitSerializer, ValidatedModelSerializer):
return None
#
# Rear panel ports
#
class RearPanelPortSerializer(ValidatedModelSerializer):
device = NestedDeviceSerializer()
type = ChoiceField(choices=PANELPORT_TYPE_CHOICES)
tags = TagListSerializerField(required=False)
class Meta:
model = RearPanelPort
fields = ['id', 'device', 'name', 'type', 'positions', 'tags']
class NestedRearPanelPortSerializer(WritableNestedSerializer):
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rearpanelport-detail')
class Meta:
model = RearPanelPort
fields = ['id', 'url', 'name']
#
# Front panel ports
#
class FrontPanelPortSerializer(ValidatedModelSerializer):
device = NestedDeviceSerializer()
type = ChoiceField(choices=PANELPORT_TYPE_CHOICES)
rear_port = NestedRearPanelPortSerializer()
tags = TagListSerializerField(required=False)
class Meta:
model = FrontPanelPort
fields = ['id', 'device', 'name', 'type', 'rear_port', 'rear_port_position', 'tags']
class NestedFrontPanelPortSerializer(WritableNestedSerializer):
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:frontpanelport-detail')
class Meta:
model = FrontPanelPort
fields = ['id', 'url', 'name']
#
# Device bays
#

View File

@@ -37,6 +37,8 @@ router.register(r'console-server-port-templates', views.ConsoleServerPortTemplat
router.register(r'power-port-templates', views.PowerPortTemplateViewSet)
router.register(r'power-outlet-templates', views.PowerOutletTemplateViewSet)
router.register(r'interface-templates', views.InterfaceTemplateViewSet)
router.register(r'front-panel-port-templates', views.FrontPanelPortTemplateViewSet)
router.register(r'rear-panel-port-templates', views.RearPanelPortTemplateViewSet)
router.register(r'device-bay-templates', views.DeviceBayTemplateViewSet)
# Devices
@@ -50,6 +52,8 @@ router.register(r'console-server-ports', views.ConsoleServerPortViewSet)
router.register(r'power-ports', views.PowerPortViewSet)
router.register(r'power-outlets', views.PowerOutletViewSet)
router.register(r'interfaces', views.InterfaceViewSet)
router.register(r'front-panel-ports', views.FrontPanelPortViewSet)
router.register(r'rear-panel-ports', views.RearPanelPortViewSet)
router.register(r'device-bays', views.DeviceBayViewSet)
router.register(r'inventory-items', views.InventoryItemViewSet)

View File

@@ -14,9 +14,10 @@ from rest_framework.viewsets import GenericViewSet, ViewSet
from dcim import filters
from dcim.models import (
ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay,
DeviceBayTemplate, DeviceRole, DeviceType, Interface, InterfaceConnection, InterfaceTemplate, Manufacturer,
InventoryItem, Platform, PowerOutlet, PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack, RackGroup,
RackReservation, RackRole, Region, Site, VirtualChassis,
DeviceBayTemplate, DeviceRole, DeviceType, FrontPanelPort, FrontPanelPortTemplate, Interface, InterfaceConnection,
InterfaceTemplate, Manufacturer, InventoryItem, Platform, PowerOutlet, PowerOutletTemplate, PowerPort,
PowerPortTemplate, Rack, RackGroup, RackReservation, RackRole, RearPanelPort, RearPanelPortTemplate, Region, Site,
VirtualChassis,
)
from extras.api.serializers import RenderedGraphSerializer
from extras.api.views import CustomFieldModelViewSet
@@ -191,6 +192,18 @@ class InterfaceTemplateViewSet(ModelViewSet):
filter_class = filters.InterfaceTemplateFilter
class FrontPanelPortTemplateViewSet(ModelViewSet):
queryset = FrontPanelPortTemplate.objects.select_related('device_type__manufacturer')
serializer_class = serializers.FrontPanelPortTemplateSerializer
filter_class = filters.FrontPanelPortTemplateFilter
class RearPanelPortTemplateViewSet(ModelViewSet):
queryset = RearPanelPortTemplate.objects.select_related('device_type__manufacturer')
serializer_class = serializers.RearPanelPortTemplateSerializer
filter_class = filters.RearPanelPortTemplateFilter
class DeviceBayTemplateViewSet(ModelViewSet):
queryset = DeviceBayTemplate.objects.select_related('device_type__manufacturer')
serializer_class = serializers.DeviceBayTemplateSerializer
@@ -352,6 +365,18 @@ class InterfaceViewSet(ModelViewSet):
return Response(serializer.data)
class FrontPanelPortViewSet(ModelViewSet):
queryset = FrontPanelPort.objects.select_related('device__device_type__manufacturer', 'rear_port')
serializer_class = serializers.FrontPanelPortSerializer
filter_class = filters.FrontPanelPortFilter
class RearPanelPortViewSet(ModelViewSet):
queryset = RearPanelPort.objects.select_related('device__device_type__manufacturer')
serializer_class = serializers.RearPanelPortSerializer
filter_class = filters.RearPanelPortFilter
class DeviceBayViewSet(ModelViewSet):
queryset = DeviceBay.objects.select_related('installed_device').prefetch_related('tags')
serializer_class = serializers.DeviceBaySerializer