diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index 924e39d73..6b5334057 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -419,12 +419,17 @@ class VCMembershipViewSet(ModelViewSet): 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 + if isinstance(request.data, list): + for i, vcm in enumerate(request.data): + 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.save() + request.data['virtual_chassis'] = vc.pk return super(VCMembershipViewSet, self).create(request, *args, **kwargs) diff --git a/netbox/dcim/tests/test_api.py b/netbox/dcim/tests/test_api.py index 7c4a01c15..bc92d1483 100644 --- a/netbox/dcim/tests/test_api.py +++ b/netbox/dcim/tests/test_api.py @@ -3097,29 +3097,31 @@ class VCMembershipTest(HttpStatusMixin, APITestCase): def test_create_vcmembership_bulk(self): - vc = VirtualChassis.objects.create() + vc3 = VirtualChassis.objects.create() data = [ + # Set the master of an existing VC { - 'virtual_chassis': vc.pk, + 'virtual_chassis': vc3.pk, 'device': self.device7.pk, 'position': 1, 'is_master': True, 'priority': 10, }, + # Add a non-master member to a VC { - 'virtual_chassis': vc.pk, + 'virtual_chassis': vc3.pk, 'device': self.device8.pk, 'position': 2, 'is_master': False, 'priority': 20, }, + # Force the creation of a new VC { - 'virtual_chassis': vc.pk, 'device': self.device9.pk, - 'position': 3, - 'is_master': False, - 'priority': 30, + 'position': 1, + 'is_master': True, + 'priority': 10, }, ] @@ -3127,6 +3129,7 @@ class VCMembershipTest(HttpStatusMixin, APITestCase): response = self.client.post(url, data, format='json', **self.header) self.assertHttpStatus(response, status.HTTP_201_CREATED) + self.assertEqual(VirtualChassis.objects.count(), 4) self.assertEqual(VCMembership.objects.count(), 9) self.assertEqual(response.data[0]['device'], data[0]['device']) self.assertEqual(response.data[1]['device'], data[1]['device'])