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:
@ -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):
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
Reference in New Issue
Block a user