diff --git a/netbox/dcim/models/cables.py b/netbox/dcim/models/cables.py index 6b3d35137..d714cb317 100644 --- a/netbox/dcim/models/cables.py +++ b/netbox/dcim/models/cables.py @@ -435,20 +435,22 @@ class CablePath(models.Model): assert all(ct.term_side == term_side for ct in remote_terminations[1:]) circuit_termination = CircuitTermination.objects.filter( circuit=remote_terminations[0].circuit, - term_side='Z' if term_side == 'A' else 'Z' + term_side='Z' if term_side == 'A' else 'A' ).first() if circuit_termination is None: break elif circuit_termination.provider_network: # Circuit terminates to a ProviderNetwork - path.append([ - object_to_path_node(circuit_termination.provider_network) + path.extend([ + [object_to_path_node(circuit_termination)], + [object_to_path_node(circuit_termination.provider_network)], ]) break elif circuit_termination.site and not circuit_termination.cable: # Circuit terminates to a Site - path.append([ - object_to_path_node(circuit_termination.site) + path.extend([ + [object_to_path_node(circuit_termination)], + [object_to_path_node(circuit_termination.site)], ]) break diff --git a/netbox/dcim/signals.py b/netbox/dcim/signals.py index 128cedf66..30e3b6ed0 100644 --- a/netbox/dcim/signals.py +++ b/netbox/dcim/signals.py @@ -102,14 +102,14 @@ def update_connected_endpoints(instance, created, raw=False, **kwargs): create_cablepath(terms) else: rebuild_paths(terms) - # elif instance.status != instance._orig_status: - # # We currently don't support modifying either termination of an existing Cable. (This - # # may change in the future.) However, we do need to capture status changes and update - # # any CablePaths accordingly. - # if instance.status != LinkStatusChoices.STATUS_CONNECTED: - # CablePath.objects.filter(path__contains=instance).update(is_active=False) - # else: - # rebuild_paths(instance) + elif instance.status != instance._orig_status: + # We currently don't support modifying either termination of an existing Cable. (This + # may change in the future.) However, we do need to capture status changes and update + # any CablePaths accordingly. + if instance.status != LinkStatusChoices.STATUS_CONNECTED: + CablePath.objects.filter(_nodes__contains=instance).update(is_active=False) + else: + rebuild_paths([instance]) # @receiver(post_save, sender=CableTermination) diff --git a/netbox/dcim/tests/test_cablepaths.py b/netbox/dcim/tests/test_cablepaths.py index a72f22c75..e2031dcbc 100644 --- a/netbox/dcim/tests/test_cablepaths.py +++ b/netbox/dcim/tests/test_cablepaths.py @@ -385,7 +385,6 @@ class CablePathTestCase(TestCase): ) self.assertPathExists( (interface2, cable2, frontport1_2, rearport1, cable3, rearport2, frontport2_2), - is_active=False, is_complete=False ) self.assertEqual(CablePath.objects.count(), 2) @@ -427,8 +426,8 @@ class CablePathTestCase(TestCase): cable3.delete() # Check for four partial paths; one from each interface - self.assertEqual(CablePath.objects.filter(destination_id__isnull=True).count(), 4) - self.assertEqual(CablePath.objects.filter(destination_id__isnull=False).count(), 0) + self.assertEqual(CablePath.objects.filter(is_complete=False).count(), 4) + self.assertEqual(CablePath.objects.filter(is_complete=True).count(), 0) interface1.refresh_from_db() interface2.refresh_from_db() interface3.refresh_from_db() @@ -1116,8 +1115,8 @@ class CablePathTestCase(TestCase): cable4.delete() # Check for four partial paths; one from each interface - self.assertEqual(CablePath.objects.filter(destination_id__isnull=True).count(), 4) - self.assertEqual(CablePath.objects.filter(destination_id__isnull=False).count(), 0) + self.assertEqual(CablePath.objects.filter(is_complete=False).count(), 4) + self.assertEqual(CablePath.objects.filter(is_complete=True).count(), 0) def test_213_multiple_circuits_to_interface(self): """