mirror of
https://github.com/netbox-community/netbox.git
synced 2025-12-22 05:12:22 -06:00
Moved VC master designation to membership model
This commit is contained in:
@@ -806,12 +806,10 @@ class WritableInterfaceConnectionSerializer(ValidatedModelSerializer):
|
||||
#
|
||||
|
||||
class VirtualChassisSerializer(serializers.ModelSerializer):
|
||||
site = NestedSiteSerializer()
|
||||
master = NestedDeviceSerializer()
|
||||
|
||||
class Meta:
|
||||
model = VirtualChassis
|
||||
fields = ['id', 'site', 'domain', 'master']
|
||||
fields = ['id', 'domain']
|
||||
|
||||
|
||||
class NestedVirtualChassisSerializer(serializers.ModelSerializer):
|
||||
@@ -826,7 +824,7 @@ class WritableVirtualChassisSerializer(ValidatedModelSerializer):
|
||||
|
||||
class Meta:
|
||||
model = VirtualChassis
|
||||
fields = ['id', 'site', 'domain', 'master']
|
||||
fields = ['id', 'domain']
|
||||
|
||||
|
||||
#
|
||||
@@ -839,12 +837,23 @@ class VCMembershipSerializer(serializers.ModelSerializer):
|
||||
|
||||
class Meta:
|
||||
model = VCMembership
|
||||
fields = ['id', 'virtual_chassis', 'device', 'master_enabled', 'position', 'priority']
|
||||
fields = ['id', 'virtual_chassis', 'device', 'position', 'is_master', 'priority']
|
||||
|
||||
|
||||
class WritableVCMembershipSerializer(serializers.ModelSerializer):
|
||||
virtual_chassis = serializers.PrimaryKeyRelatedField(queryset=VirtualChassis.objects.all(), required=False)
|
||||
class WritableVCMembershipSerializer(ValidatedModelSerializer):
|
||||
|
||||
class Meta:
|
||||
model = VCMembership
|
||||
fields = ['id', 'virtual_chassis', 'device', 'master_enabled', 'position', 'priority']
|
||||
fields = ['id', 'virtual_chassis', 'device', 'position', 'is_master', 'priority']
|
||||
|
||||
def validate(self, data):
|
||||
|
||||
# Validate uniqueness of (virtual_chassis, position)
|
||||
validator = UniqueTogetherValidator(queryset=VCMembership.objects.all(), fields=('virtual_chassis', 'position'))
|
||||
validator.set_context(self)
|
||||
validator(data)
|
||||
|
||||
# Enforce model validation
|
||||
super(WritableVCMembershipSerializer, self).validate(data)
|
||||
|
||||
return data
|
||||
|
||||
@@ -3,6 +3,7 @@ from __future__ import unicode_literals
|
||||
from collections import OrderedDict
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import transaction
|
||||
from django.http import HttpResponseBadRequest, HttpResponseForbidden
|
||||
from django.shortcuts import get_object_or_404
|
||||
from rest_framework.decorators import detail_route
|
||||
@@ -401,17 +402,30 @@ class InterfaceConnectionViewSet(ModelViewSet):
|
||||
#
|
||||
|
||||
class VirtualChassisViewSet(ModelViewSet):
|
||||
queryset = VirtualChassis.objects.select_related('master')
|
||||
queryset = VirtualChassis.objects.all()
|
||||
serializer_class = serializers.VirtualChassisSerializer
|
||||
write_serializer_class = serializers.WritableVirtualChassisSerializer
|
||||
# filter_class = filters.VirtualChassisFilter
|
||||
|
||||
|
||||
class VCMembershipViewSet(ModelViewSet):
|
||||
queryset = VCMembership.objects.select_related('virtual_chassis', 'device')
|
||||
serializer_class = serializers.VCMembershipSerializer
|
||||
write_serializer_class = serializers.WritableVCMembershipSerializer
|
||||
# filter_class = filters.VCMembershipFilter
|
||||
filter_class = filters.VCMembershipFilter
|
||||
|
||||
def create(self, request, *args, **kwargs):
|
||||
|
||||
with transaction.atomic():
|
||||
|
||||
# Automatically create a new VirtualChassis for new VCMemberships with no VC specified
|
||||
virtual_chassis = request.data.get('virtual_chassis', None)
|
||||
is_master = request.data.get('is_master', False)
|
||||
if not virtual_chassis and is_master:
|
||||
vc = VirtualChassis()
|
||||
vc.save()
|
||||
request.data['virtual_chassis'] = vc.pk
|
||||
|
||||
return super(VCMembershipViewSet, self).create(request, *args, **kwargs)
|
||||
|
||||
|
||||
#
|
||||
|
||||
Reference in New Issue
Block a user