Fix bulk creation of VCMemberships via API

This commit is contained in:
Jeremy Stretch 2018-01-02 16:40:52 -05:00
parent b27529d927
commit e5c13d2d72
2 changed files with 21 additions and 13 deletions

View File

@ -419,9 +419,14 @@ class VCMembershipViewSet(ModelViewSet):
with transaction.atomic(): with transaction.atomic():
# Automatically create a new VirtualChassis for new VCMemberships with no VC specified # Automatically create a new VirtualChassis for new VCMemberships with no VC specified
virtual_chassis = request.data.get('virtual_chassis', None) if isinstance(request.data, list):
is_master = request.data.get('is_master', False) for i, vcm in enumerate(request.data):
if not virtual_chassis and is_master: if not vcm.get('virtual_chassis') and vcm.get('is_master'):
vc = VirtualChassis()
vc.save()
request.data[i]['virtual_chassis'] = vc.pk
else:
if not request.data.get('virtual_chassis') and request.data.get('is_master'):
vc = VirtualChassis() vc = VirtualChassis()
vc.save() vc.save()
request.data['virtual_chassis'] = vc.pk request.data['virtual_chassis'] = vc.pk

View File

@ -3097,29 +3097,31 @@ class VCMembershipTest(HttpStatusMixin, APITestCase):
def test_create_vcmembership_bulk(self): def test_create_vcmembership_bulk(self):
vc = VirtualChassis.objects.create() vc3 = VirtualChassis.objects.create()
data = [ data = [
# Set the master of an existing VC
{ {
'virtual_chassis': vc.pk, 'virtual_chassis': vc3.pk,
'device': self.device7.pk, 'device': self.device7.pk,
'position': 1, 'position': 1,
'is_master': True, 'is_master': True,
'priority': 10, 'priority': 10,
}, },
# Add a non-master member to a VC
{ {
'virtual_chassis': vc.pk, 'virtual_chassis': vc3.pk,
'device': self.device8.pk, 'device': self.device8.pk,
'position': 2, 'position': 2,
'is_master': False, 'is_master': False,
'priority': 20, 'priority': 20,
}, },
# Force the creation of a new VC
{ {
'virtual_chassis': vc.pk,
'device': self.device9.pk, 'device': self.device9.pk,
'position': 3, 'position': 1,
'is_master': False, 'is_master': True,
'priority': 30, 'priority': 10,
}, },
] ]
@ -3127,6 +3129,7 @@ class VCMembershipTest(HttpStatusMixin, APITestCase):
response = self.client.post(url, data, format='json', **self.header) response = self.client.post(url, data, format='json', **self.header)
self.assertHttpStatus(response, status.HTTP_201_CREATED) self.assertHttpStatus(response, status.HTTP_201_CREATED)
self.assertEqual(VirtualChassis.objects.count(), 4)
self.assertEqual(VCMembership.objects.count(), 9) self.assertEqual(VCMembership.objects.count(), 9)
self.assertEqual(response.data[0]['device'], data[0]['device']) self.assertEqual(response.data[0]['device'], data[0]['device'])
self.assertEqual(response.data[1]['device'], data[1]['device']) self.assertEqual(response.data[1]['device'], data[1]['device'])