Просмотр исходного кода

Fix circuit termination tracing & update tests

jeremystretch 3 лет назад
Родитель
Сommit
c88f7b8408
3 измененных файлов с 19 добавлено и 18 удалено
  1. 7 5
      netbox/dcim/models/cables.py
  2. 8 8
      netbox/dcim/signals.py
  3. 4 5
      netbox/dcim/tests/test_cablepaths.py

+ 7 - 5
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
 

+ 8 - 8
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)

+ 4 - 5
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):
         """