1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

Merge pull request #1597 from RyanBreaker/validations

Additional data validation for Rack model
This commit is contained in:
Jeremy Stretch
2017-10-18 11:22:26 -04:00
committed by GitHub
2 changed files with 65 additions and 6 deletions

View File

@ -256,8 +256,8 @@ class Rack(CreatedUpdatedModel, CustomFieldModel):
def clean(self): def clean(self):
# Validate that Rack is tall enough to house the installed Devices
if self.pk: 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() top_device = Device.objects.filter(rack=self).exclude(position__isnull=True).order_by('-position').first()
if top_device: if top_device:
min_height = top_device.position + top_device.device_type.u_height - 1 min_height = top_device.position + top_device.device_type.u_height - 1
@ -267,6 +267,12 @@ class Rack(CreatedUpdatedModel, CustomFieldModel):
min_height 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): def save(self, *args, **kwargs):

View File

@ -9,14 +9,29 @@ class RackTestCase(TestCase):
def setUp(self): def setUp(self):
self.site = Site.objects.create( self.site1 = Site.objects.create(
name='TestSite1', 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( self.rack = Rack.objects.create(
name='TestRack1', name='TestRack1',
facility_id='A101', facility_id='A101',
site=self.site, site=self.site1,
group=self.group1,
u_height=42 u_height=42
) )
self.manufacturer = Manufacturer.objects.create( 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): def test_mount_single_device(self):
device1 = Device( device1 = Device(
name='TestSwitch1', name='TestSwitch1',
device_type=DeviceType.objects.get(manufacturer__slug='acme', slug='ff2048'), device_type=DeviceType.objects.get(manufacturer__slug='acme', slug='ff2048'),
device_role=DeviceRole.objects.get(slug='switch'), device_role=DeviceRole.objects.get(slug='switch'),
site=self.site, site=self.site1,
rack=self.rack, rack=self.rack,
position=10, position=10,
face=RACK_FACE_REAR, face=RACK_FACE_REAR,
@ -92,7 +145,7 @@ class RackTestCase(TestCase):
name='TestPDU', name='TestPDU',
device_role=self.role.get('PDU'), device_role=self.role.get('PDU'),
device_type=self.device_type.get('cc5000'), device_type=self.device_type.get('cc5000'),
site=self.site, site=self.site1,
rack=self.rack, rack=self.rack,
position=None, position=None,
face=None, face=None,