From 5597664b74de2c20afaa9f6f52a6b4fc82e0761e Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 1 Dec 2025 09:53:09 -0500 Subject: [PATCH] Cleaned up debugging logs in CablePath --- netbox/dcim/models/cables.py | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/netbox/dcim/models/cables.py b/netbox/dcim/models/cables.py index 60799a813..9d8c2c290 100644 --- a/netbox/dcim/models/cables.py +++ b/netbox/dcim/models/cables.py @@ -1,4 +1,5 @@ import itertools +import logging from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.models import ContentType @@ -30,6 +31,8 @@ __all__ = ( 'CableTermination', ) +logger = logging.getLogger(__name__) + trace_paths = Signal() @@ -666,14 +669,13 @@ class CablePath(models.Model): is_active = True is_split = False - DEBUG = False + logger.debug(f'Tracing cable path from {terminations}...') segment = 0 while terminations: segment += 1 - if DEBUG: - print(f'[#{segment}] Position stack: {position_stack}') - print(f'[#{segment}] Local terminations: {terminations}') + logger.debug(f'[Path segment #{segment}] Position stack: {position_stack}') + logger.debug(f'[Path segment #{segment}] Local terminations: {terminations}') # Terminations must all be of the same type if not all(isinstance(t, type(terminations[0])) for t in terminations[1:]): @@ -707,8 +709,7 @@ class CablePath(models.Model): links = list(dict.fromkeys( termination.link for termination in terminations if termination.link is not None )) - if DEBUG: - print(f'[#{segment}] Links: {links}') + logger.debug(f'[Path segment #{segment}] Links: {links}') if len(links) == 0: if len(path) == 1: # If this is the start of the path and no link exists, return None @@ -771,12 +772,13 @@ class CablePath(models.Model): link.interface_b if link.interface_a is terminations[0] else link.interface_a for link in links ] - if DEBUG: - print(f'[#{segment}] Remote terminations: {remote_terminations}') + logger.debug(f'[Path segment #{segment}] Remote terminations: {remote_terminations}') + # Remote Terminations must all be of the same type, otherwise return a split path if not all(isinstance(t, type(remote_terminations[0])) for t in remote_terminations[1:]): is_complete = False is_split = True + logger.debug('Remote termination types differ; aborting trace.') break # Step 7: Record the far-end termination object(s) @@ -798,6 +800,10 @@ class CablePath(models.Model): port_mappings = PortMapping.objects.filter(q_filter) elif remote_terminations[0].positions > 1: is_split = True + logger.debug( + 'Encountered front port mapped to multiple rear ports but position stack is empty; aborting ' + 'trace.' + ) break else: port_mappings = PortMapping.objects.filter(front_port__in=remote_terminations) @@ -819,6 +825,10 @@ class CablePath(models.Model): port_mappings = PortMapping.objects.filter(q_filter) elif remote_terminations[0].positions > 1: is_split = True + logger.debug( + 'Encountered rear port mapped to multiple front ports but position stack is empty; aborting ' + 'trace.' + ) break else: port_mappings = PortMapping.objects.filter(rear_port__in=remote_terminations) @@ -876,6 +886,7 @@ class CablePath(models.Model): # Unsupported topology, mark as split and exit is_complete = False is_split = True + logger.warning('Encountered an unsupported topology; aborting trace.') break return cls(