mirror of
https://github.com/netbox-community/netbox.git
synced 2025-12-10 18:39:36 -06:00
Fixes #20646: Prevent cables from connecting to marked objects (#20678)
Some checks failed
CodeQL / Analyze (${{ matrix.language }}) (none, actions) (push) Waiting to run
CodeQL / Analyze (${{ matrix.language }}) (none, javascript-typescript) (push) Waiting to run
CodeQL / Analyze (${{ matrix.language }}) (none, python) (push) Waiting to run
CI / build (20.x, 3.10) (push) Has been cancelled
CI / build (20.x, 3.11) (push) Has been cancelled
CI / build (20.x, 3.12) (push) Has been cancelled
Some checks failed
CodeQL / Analyze (${{ matrix.language }}) (none, actions) (push) Waiting to run
CodeQL / Analyze (${{ matrix.language }}) (none, javascript-typescript) (push) Waiting to run
CodeQL / Analyze (${{ matrix.language }}) (none, python) (push) Waiting to run
CI / build (20.x, 3.10) (push) Has been cancelled
CI / build (20.x, 3.11) (push) Has been cancelled
CI / build (20.x, 3.12) (push) Has been cancelled
This commit is contained in:
parent
dbfdf318ad
commit
d433a28524
@ -393,6 +393,17 @@ class CableTermination(ChangeLoggedModel):
|
|||||||
def clean(self):
|
def clean(self):
|
||||||
super().clean()
|
super().clean()
|
||||||
|
|
||||||
|
# Disallow connecting a cable to any termination object that is
|
||||||
|
# explicitly flagged as "mark connected".
|
||||||
|
termination = getattr(self, 'termination', None)
|
||||||
|
if termination is not None and getattr(termination, "mark_connected", False):
|
||||||
|
raise ValidationError(
|
||||||
|
_("Cannot connect a cable to {obj_parent} > {obj} because it is marked as connected.").format(
|
||||||
|
obj_parent=termination.parent_object,
|
||||||
|
obj=termination,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
# Check for existing termination
|
# Check for existing termination
|
||||||
qs = CableTermination.objects.filter(
|
qs = CableTermination.objects.filter(
|
||||||
termination_type=self.termination_type,
|
termination_type=self.termination_type,
|
||||||
@ -404,14 +415,14 @@ class CableTermination(ChangeLoggedModel):
|
|||||||
existing_termination = qs.first()
|
existing_termination = qs.first()
|
||||||
if existing_termination is not None:
|
if existing_termination is not None:
|
||||||
raise ValidationError(
|
raise ValidationError(
|
||||||
_("Duplicate termination found for {app_label}.{model} {termination_id}: cable {cable_pk}".format(
|
_("Duplicate termination found for {app_label}.{model} {termination_id}: cable {cable_pk}").format(
|
||||||
app_label=self.termination_type.app_label,
|
app_label=self.termination_type.app_label,
|
||||||
model=self.termination_type.model,
|
model=self.termination_type.model,
|
||||||
termination_id=self.termination_id,
|
termination_id=self.termination_id,
|
||||||
cable_pk=existing_termination.cable.pk
|
cable_pk=existing_termination.cable.pk
|
||||||
))
|
)
|
||||||
)
|
)
|
||||||
# Validate interface type (if applicable)
|
# Validate the interface type (if applicable)
|
||||||
if self.termination_type.model == 'interface' and self.termination.type in NONCONNECTABLE_IFACE_TYPES:
|
if self.termination_type.model == 'interface' and self.termination.type in NONCONNECTABLE_IFACE_TYPES:
|
||||||
raise ValidationError(
|
raise ValidationError(
|
||||||
_("Cables cannot be terminated to {type_display} interfaces").format(
|
_("Cables cannot be terminated to {type_display} interfaces").format(
|
||||||
|
|||||||
@ -967,6 +967,18 @@ class CableTestCase(TestCase):
|
|||||||
with self.assertRaises(ValidationError):
|
with self.assertRaises(ValidationError):
|
||||||
cable.clean()
|
cable.clean()
|
||||||
|
|
||||||
|
def test_cannot_cable_to_mark_connected(self):
|
||||||
|
"""
|
||||||
|
Test that a cable cannot be connected to an interface marked as connected.
|
||||||
|
"""
|
||||||
|
device1 = Device.objects.get(name='TestDevice1')
|
||||||
|
interface1 = Interface.objects.get(device__name='TestDevice2', name='eth1')
|
||||||
|
|
||||||
|
mark_connected_interface = Interface(device=device1, name='mark_connected1', mark_connected=True)
|
||||||
|
cable = Cable(a_terminations=[mark_connected_interface], b_terminations=[interface1])
|
||||||
|
with self.assertRaises(ValidationError):
|
||||||
|
cable.clean()
|
||||||
|
|
||||||
|
|
||||||
class VirtualDeviceContextTestCase(TestCase):
|
class VirtualDeviceContextTestCase(TestCase):
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user