Browse Source

Fix bulk creation of VCMemberships via API

Jeremy Stretch 7 years ago
parent
commit
e5c13d2d72
2 changed files with 21 additions and 13 deletions
  1. 11 6
      netbox/dcim/api/views.py
  2. 10 7
      netbox/dcim/tests/test_api.py

+ 11 - 6
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)
 

+ 10 - 7
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'])