From 115e7d6e505b3da23b733637532aa43003a35f01 Mon Sep 17 00:00:00 2001 From: Ryan Breaker Date: Sun, 15 Oct 2017 18:35:03 -0500 Subject: [PATCH 1/2] Add group and site matching validation to Rack.clean() and testing --- netbox/dcim/models.py | 8 ++++++- netbox/dcim/tests/test_models.py | 38 +++++++++++++++++++++++++++----- 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/netbox/dcim/models.py b/netbox/dcim/models.py index 336ae0c0b..e86c702f4 100644 --- a/netbox/dcim/models.py +++ b/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): diff --git a/netbox/dcim/tests/test_models.py b/netbox/dcim/tests/test_models.py index b4101cfd5..9b323c2d1 100644 --- a/netbox/dcim/tests/test_models.py +++ b/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,26 @@ class RackTestCase(TestCase): } + 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 +120,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, From 937faaf149e21fb2251d48fc942e2d2cb41c5d79 Mon Sep 17 00:00:00 2001 From: Ryan Breaker Date: Sun, 15 Oct 2017 19:03:28 -0500 Subject: [PATCH 2/2] Add test for validation of device within rack height. --- netbox/dcim/tests/test_models.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/netbox/dcim/tests/test_models.py b/netbox/dcim/tests/test_models.py index 9b323c2d1..5b2cdbd51 100644 --- a/netbox/dcim/tests/test_models.py +++ b/netbox/dcim/tests/test_models.py @@ -72,7 +72,32 @@ 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',