Moved VC master designation to membership model

This commit is contained in:
Jeremy Stretch
2017-11-27 15:59:13 -05:00
parent 55e07c1c9a
commit 3b801d43bc
7 changed files with 77 additions and 29 deletions

View File

@@ -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

View File

@@ -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)
#