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

Rebuild CablePaths when a CircuitTermination is modified

Jeremy Stretch 4 лет назад
Родитель
Сommit
b77c228853
2 измененных файлов с 36 добавлено и 4 удалено
  1. 13 1
      netbox/circuits/signals.py
  2. 23 3
      netbox/dcim/tests/test_cablepaths.py

+ 13 - 1
netbox/circuits/signals.py

@@ -1,7 +1,8 @@
-from django.db.models.signals import post_save
+from django.db.models.signals import post_delete, post_save
 from django.dispatch import receiver
 from django.dispatch import receiver
 from django.utils import timezone
 from django.utils import timezone
 
 
+from dcim.signals import rebuild_paths
 from .models import Circuit, CircuitTermination
 from .models import Circuit, CircuitTermination
 
 
 
 
@@ -15,3 +16,14 @@ def update_circuit(instance, **kwargs):
         f'termination_{instance.term_side.lower()}': instance.pk,
         f'termination_{instance.term_side.lower()}': instance.pk,
     }
     }
     Circuit.objects.filter(pk=instance.circuit_id).update(**fields)
     Circuit.objects.filter(pk=instance.circuit_id).update(**fields)
+
+
+@receiver((post_save, post_delete), sender=CircuitTermination)
+def rebuild_cablepaths(instance, raw=False, **kwargs):
+    """
+    Rebuild any CablePaths which traverse the peer CircuitTermination.
+    """
+    if not raw:
+        peer_termination = instance.get_peer_termination()
+        if peer_termination:
+            rebuild_paths(peer_termination)

+ 23 - 3
netbox/dcim/tests/test_cablepaths.py

@@ -819,15 +819,35 @@ class CablePathTestCase(TestCase):
         interface1 = Interface.objects.create(device=self.device, name='Interface 1')
         interface1 = Interface.objects.create(device=self.device, name='Interface 1')
         interface2 = Interface.objects.create(device=self.device, name='Interface 2')
         interface2 = Interface.objects.create(device=self.device, name='Interface 2')
         circuittermination1 = CircuitTermination.objects.create(circuit=self.circuit, site=self.site, term_side='A')
         circuittermination1 = CircuitTermination.objects.create(circuit=self.circuit, site=self.site, term_side='A')
-        circuittermination2 = CircuitTermination.objects.create(circuit=self.circuit, site=self.site, term_side='Z')
 
 
-        # Create cables
+        # Create cable 1
         cable1 = Cable(termination_a=interface1, termination_b=circuittermination1)
         cable1 = Cable(termination_a=interface1, termination_b=circuittermination1)
         cable1.save()
         cable1.save()
+
+        # Check for partial path from interface1
+        self.assertPathExists(
+            origin=interface1,
+            destination=None,
+            path=(cable1, circuittermination1),
+            is_active=False
+        )
+
+        # Create CT2
+        circuittermination2 = CircuitTermination.objects.create(circuit=self.circuit, site=self.site, term_side='Z')
+
+        # Check for partial path to site
+        self.assertPathExists(
+            origin=interface1,
+            destination=self.site,
+            path=(cable1, circuittermination1, circuittermination2),
+            is_active=True
+        )
+
+        # Create cable 2
         cable2 = Cable(termination_a=circuittermination2, termination_b=interface2)
         cable2 = Cable(termination_a=circuittermination2, termination_b=interface2)
         cable2.save()
         cable2.save()
 
 
-        # Check for paths
+        # Check for complete path in each direction
         self.assertPathExists(
         self.assertPathExists(
             origin=interface1,
             origin=interface1,
             destination=interface2,
             destination=interface2,