Browse Source

Merge pull request #1597 from RyanBreaker/validations

Additional data validation for Rack model
Jeremy Stretch 7 years ago
parent
commit
a84b49b92d
2 changed files with 65 additions and 6 deletions
  1. 7 1
      netbox/dcim/models.py
  2. 58 5
      netbox/dcim/tests/test_models.py

+ 7 - 1
netbox/dcim/models.py

@@ -256,8 +256,8 @@ class Rack(CreatedUpdatedModel, CustomFieldModel):
 
     def clean(self):
 
-        # Validate that Rack is tall enough to house the installed Devices
         if self.pk:
+            # Validate that Rack is tall enough to house the installed Devices
             top_device = Device.objects.filter(rack=self).exclude(position__isnull=True).order_by('-position').first()
             if top_device:
                 min_height = top_device.position + top_device.device_type.u_height - 1
@@ -267,6 +267,12 @@ class Rack(CreatedUpdatedModel, CustomFieldModel):
                             min_height
                         )
                     })
+            # Validate that Rack was assigned a group of its same site, if applicable
+            if self.group:
+                if self.group.site != self.site:
+                    raise ValidationError({
+                        'group': "Rack group must be from the same site, {}.".format(self.site)
+                    })
 
     def save(self, *args, **kwargs):
 

+ 58 - 5
netbox/dcim/tests/test_models.py

@@ -9,14 +9,29 @@ class RackTestCase(TestCase):
 
     def setUp(self):
 
-        self.site = Site.objects.create(
+        self.site1 = Site.objects.create(
             name='TestSite1',
-            slug='my-test-site'
+            slug='test-site-1'
+        )
+        self.site2 = Site.objects.create(
+            name='TestSite2',
+            slug='test-site-2'
+        )
+        self.group1 = RackGroup.objects.create(
+            name='TestGroup1',
+            slug='test-group-1',
+            site=self.site1
+        )
+        self.group2 = RackGroup.objects.create(
+            name='TestGroup2',
+            slug='test-group-2',
+            site=self.site2
         )
         self.rack = Rack.objects.create(
             name='TestRack1',
             facility_id='A101',
-            site=self.site,
+            site=self.site1,
+            group=self.group1,
             u_height=42
         )
         self.manufacturer = Manufacturer.objects.create(
@@ -57,13 +72,51 @@ class RackTestCase(TestCase):
 
         }
 
+    def test_rack_device_outside_height(self):
+
+        rack1 = Rack(
+            name='TestRack2',
+            facility_id='A102',
+            site=self.site1,
+            u_height=42
+        )
+        rack1.save()
+
+        device1 = Device(
+            name='TestSwitch1',
+            device_type=DeviceType.objects.get(manufacturer__slug='acme', slug='ff2048'),
+            device_role=DeviceRole.objects.get(slug='switch'),
+            site=self.site1,
+            rack=rack1,
+            position=43,
+            face=RACK_FACE_FRONT,
+        )
+        device1.save()
+
+        with self.assertRaises(ValidationError):
+            rack1.clean()
+
+    def test_rack_group_site(self):
+
+        rack_invalid_group = Rack(
+            name='TestRack2',
+            facility_id='A102',
+            site=self.site1,
+            u_height=42,
+            group=self.group2
+        )
+        rack_invalid_group.save()
+
+        with self.assertRaises(ValidationError):
+            rack_invalid_group.clean()
+
     def test_mount_single_device(self):
 
         device1 = Device(
             name='TestSwitch1',
             device_type=DeviceType.objects.get(manufacturer__slug='acme', slug='ff2048'),
             device_role=DeviceRole.objects.get(slug='switch'),
-            site=self.site,
+            site=self.site1,
             rack=self.rack,
             position=10,
             face=RACK_FACE_REAR,
@@ -92,7 +145,7 @@ class RackTestCase(TestCase):
             name='TestPDU',
             device_role=self.role.get('PDU'),
             device_type=self.device_type.get('cc5000'),
-            site=self.site,
+            site=self.site1,
             rack=self.rack,
             position=None,
             face=None,