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

Update path validation tests for single-position rear port scenarios

Jeremy Stretch 5 лет назад
Родитель
Сommit
6fc7c6a7d0
1 измененных файлов с 40 добавлено и 19 удалено
  1. 40 19
      netbox/dcim/tests/test_models.py

+ 40 - 19
netbox/dcim/tests/test_models.py

@@ -370,9 +370,13 @@ class CableTestCase(TestCase):
         self.patch_pannel = Device.objects.create(
         self.patch_pannel = Device.objects.create(
             device_type=devicetype, device_role=devicerole, name='TestPatchPannel', site=site
             device_type=devicetype, device_role=devicerole, name='TestPatchPannel', site=site
         )
         )
-        self.rear_port = RearPort.objects.create(device=self.patch_pannel, name='R1', type=1000)
-        self.front_port = FrontPort.objects.create(
-            device=self.patch_pannel, name='F1', type=1000, rear_port=self.rear_port
+        self.rear_port1 = RearPort.objects.create(device=self.patch_pannel, name='RP1', type='8p8c')
+        self.front_port1 = FrontPort.objects.create(
+            device=self.patch_pannel, name='FP1', type='8p8c', rear_port=self.rear_port1, rear_port_position=1
+        )
+        self.rear_port2 = RearPort.objects.create(device=self.patch_pannel, name='RP2', type='8p8c', positions=2)
+        self.front_port2 = FrontPort.objects.create(
+            device=self.patch_pannel, name='FP2', type='8p8c', rear_port=self.rear_port2, rear_port_position=1
         )
         )
 
 
     def test_cable_creation(self):
     def test_cable_creation(self):
@@ -426,7 +430,7 @@ class CableTestCase(TestCase):
         """
         """
         A cable cannot connect a front port to its corresponding rear port
         A cable cannot connect a front port to its corresponding rear port
         """
         """
-        cable = Cable(termination_a=self.front_port, termination_b=self.rear_port)
+        cable = Cable(termination_a=self.front_port1, termination_b=self.rear_port1)
         with self.assertRaises(ValidationError):
         with self.assertRaises(ValidationError):
             cable.clean()
             cable.clean()
 
 
@@ -439,6 +443,23 @@ class CableTestCase(TestCase):
         with self.assertRaises(ValidationError):
         with self.assertRaises(ValidationError):
             cable.clean()
             cable.clean()
 
 
+    def test_multipos_rearport_connections(self):
+        """
+        A RearPort with more than one position can only be connected to another RearPort with the same number of
+        positions.
+        """
+        with self.assertRaises(
+            ValidationError,
+                msg='Connecting a single-position RearPort to a multi-position RearPort should fail'
+        ):
+            Cable(termination_a=self.rear_port1, termination_b=self.rear_port2).full_clean()
+
+        with self.assertRaises(
+            ValidationError,
+                msg='Connecting a multi-position RearPort to an Interface should fail'
+        ):
+            Cable(termination_a=self.rear_port2, termination_b=self.interface1).full_clean()
+
     def test_cable_cannot_terminate_to_a_virtual_inteface(self):
     def test_cable_cannot_terminate_to_a_virtual_inteface(self):
         """
         """
         A cable cannot terminate to a virtual interface
         A cable cannot terminate to a virtual interface
@@ -502,6 +523,7 @@ class CablePathTestCase(TestCase):
             Device(device_type=devicetype, device_role=devicerole, name='Panel 3', site=site),
             Device(device_type=devicetype, device_role=devicerole, name='Panel 3', site=site),
             Device(device_type=devicetype, device_role=devicerole, name='Panel 4', site=site),
             Device(device_type=devicetype, device_role=devicerole, name='Panel 4', site=site),
             Device(device_type=devicetype, device_role=devicerole, name='Panel 5', site=site),
             Device(device_type=devicetype, device_role=devicerole, name='Panel 5', site=site),
+            Device(device_type=devicetype, device_role=devicerole, name='Panel 6', site=site),
         )
         )
         Device.objects.bulk_create(patch_panels)
         Device.objects.bulk_create(patch_panels)
 
 
@@ -557,27 +579,26 @@ class CablePathTestCase(TestCase):
         self.assertIsNone(endpoint_a.connection_status)
         self.assertIsNone(endpoint_a.connection_status)
         self.assertIsNone(endpoint_b.connection_status)
         self.assertIsNone(endpoint_b.connection_status)
 
 
-    def test_connection_via_single_rear_port(self):
+    def test_connection_rear_port_to_interface(self):
         """
         """
-        Test a connection which passes through a single front/rear port pair.
+        Test a connection which passes through a single front/rear port pair, where the rear port has a single position.
 
 
                      1               2
                      1               2
-        [Device 1] ----- [Panel 1] ----- [Device 2]
+        [Device 1] ----- [Panel 5] ----- [Device 2]
              Iface1     FP1     RP1     Iface1
              Iface1     FP1     RP1     Iface1
-
-        TODO: Panel 1's rear port has multiple front ports. Should this even work?
         """
         """
-        # Create cables (FP first, RP second)
+        # Create cables
         cable1 = Cable(
         cable1 = Cable(
             termination_a=Interface.objects.get(device__name='Device 1', name='Interface 1'),
             termination_a=Interface.objects.get(device__name='Device 1', name='Interface 1'),
-            termination_b=FrontPort.objects.get(device__name='Panel 1', name='Front Port 1')
+            termination_b=FrontPort.objects.get(device__name='Panel 5', name='Front Port 1')
         )
         )
         cable1.full_clean()
         cable1.full_clean()
         cable1.save()
         cable1.save()
         cable2 = Cable(
         cable2 = Cable(
-            termination_b=RearPort.objects.get(device__name='Panel 1', name='Rear Port 1'),
-            termination_a=Interface.objects.get(device__name='Device 2', name='Interface 1')
+            termination_a=RearPort.objects.get(device__name='Panel 5', name='Rear Port 1'),
+            termination_b=Interface.objects.get(device__name='Device 2', name='Interface 1')
         )
         )
+        self.assertEqual(cable2.termination_a.positions, 1)  # Sanity check
         cable2.full_clean()
         cable2.full_clean()
         cable2.save()
         cable2.save()
 
 
@@ -682,7 +703,7 @@ class CablePathTestCase(TestCase):
 
 
     def test_connection_via_nested_one_on_one_port(self):
     def test_connection_via_nested_one_on_one_port(self):
         """
         """
-        Test a connection which passes through a single front/rear port pair between two multi-port MUXes.
+        Test a connection which passes through a single front/rear port pair between two multi-position rear ports.
 
 
         Test two connections via patched rear ports:
         Test two connections via patched rear ports:
             Device 1 <---> Device 2
             Device 1 <---> Device 2
@@ -1147,31 +1168,31 @@ class CablePathTestCase(TestCase):
     def test_connection_via_patched_circuit(self):
     def test_connection_via_patched_circuit(self):
         """
         """
                      1               2               3               4
                      1               2               3               4
-        [Device 1] ----- [Panel 1] ----- [Circuit] ----- [Panel 2] ----- [Device 2]
+        [Device 1] ----- [Panel 5] ----- [Circuit] ----- [Panel 6] ----- [Device 2]
              Iface1     FP1     RP1     A         Z     RP1     FP1     Iface1
              Iface1     FP1     RP1     A         Z     RP1     FP1     Iface1
 
 
         """
         """
         # Create cables
         # Create cables
         cable1 = Cable(
         cable1 = Cable(
             termination_a=Interface.objects.get(device__name='Device 1', name='Interface 1'),
             termination_a=Interface.objects.get(device__name='Device 1', name='Interface 1'),
-            termination_b=FrontPort.objects.get(device__name='Panel 1', name='Front Port 1')
+            termination_b=FrontPort.objects.get(device__name='Panel 5', name='Front Port 1')
         )
         )
         cable1.full_clean()
         cable1.full_clean()
         cable1.save()
         cable1.save()
         cable2 = Cable(
         cable2 = Cable(
-            termination_a=RearPort.objects.get(device__name='Panel 1', name='Rear Port 1'),
+            termination_a=RearPort.objects.get(device__name='Panel 5', name='Rear Port 1'),
             termination_b=CircuitTermination.objects.get(term_side='A')
             termination_b=CircuitTermination.objects.get(term_side='A')
         )
         )
         cable2.full_clean()
         cable2.full_clean()
         cable2.save()
         cable2.save()
         cable3 = Cable(
         cable3 = Cable(
             termination_a=CircuitTermination.objects.get(term_side='Z'),
             termination_a=CircuitTermination.objects.get(term_side='Z'),
-            termination_b=RearPort.objects.get(device__name='Panel 2', name='Rear Port 1')
+            termination_b=RearPort.objects.get(device__name='Panel 6', name='Rear Port 1')
         )
         )
         cable3.full_clean()
         cable3.full_clean()
         cable3.save()
         cable3.save()
         cable4 = Cable(
         cable4 = Cable(
-            termination_a=FrontPort.objects.get(device__name='Panel 2', name='Front Port 1'),
+            termination_a=FrontPort.objects.get(device__name='Panel 6', name='Front Port 1'),
             termination_b=Interface.objects.get(device__name='Device 2', name='Interface 1')
             termination_b=Interface.objects.get(device__name='Device 2', name='Interface 1')
         )
         )
         cable4.full_clean()
         cable4.full_clean()