Permit FrontPort.positions to be null

This commit is contained in:
Jeremy Stretch
2025-11-19 08:35:50 -05:00
parent 5e8d57f231
commit f49b88ad5e
6 changed files with 105 additions and 89 deletions
+11 -3
View File
@@ -1619,11 +1619,19 @@ class FrontPortForm(ModularDeviceComponentForm):
def clean(self):
super().clean()
# FrontPort with no positions cannot be mapped to more than one RearPort
if not self.cleaned_data['positions'] and len(self.cleaned_data['rear_ports']) > 1:
raise forms.ValidationError({
'positions': _("A front port with no positions cannot be mapped to multiple rear ports.")
})
# Count of selected rear port & position pairs much match the assigned number of positions
if len(self.cleaned_data['rear_ports']) != self.cleaned_data['positions']:
raise forms.ValidationError(
_("The number of rear port/position pairs selected must match the number of positions assigned.")
)
raise forms.ValidationError({
'rear_ports': _(
"The number of rear port/position pairs selected must match the number of positions assigned."
)
})
def _save_m2m(self):
super()._save_m2m()
@@ -22,7 +22,7 @@ def populate_port_assignments(apps, schema_editor):
for front_port in front_ports:
yield PortAssignment(
front_port_id=front_port.pk,
front_port_position=1,
front_port_position=None,
rear_port_id=front_port.rear_port_id,
rear_port_position=front_port.rear_port_position,
)
@@ -45,9 +45,11 @@ class Migration(migrations.Migration):
(
'front_port_position',
models.PositiveSmallIntegerField(
blank=True,
null=True,
validators=[
django.core.validators.MinValueValidator(1),
django.core.validators.MaxValueValidator(1024),
django.core.validators.MaxValueValidator(1024)
]
),
),
@@ -25,7 +25,8 @@ class Migration(migrations.Migration):
model_name='frontport',
name='positions',
field=models.PositiveSmallIntegerField(
default=1,
blank=True,
null=True,
validators=[
django.core.validators.MinValueValidator(1),
django.core.validators.MaxValueValidator(1024)
+2 -2
View File
@@ -786,7 +786,7 @@ class CablePath(models.Model):
port_assignments = PortAssignment.objects.filter(front_port__in=remote_terminations)
if not port_assignments:
print('No front-to-rear port assignments found')
print(f'No front-to-rear port assignments found for {remote_terminations}')
break
position_stack.append([assignment.rear_port_position for assignment in port_assignments])
terminations = [assignment.rear_port for assignment in port_assignments]
@@ -804,7 +804,7 @@ class CablePath(models.Model):
port_assignments = PortAssignment.objects.filter(rear_port__in=remote_terminations)
if not port_assignments:
print('No rear-to-front port assignments found')
print(f'No rear-to-front port assignments found for {remote_terminations}')
break
position_stack.append([assignment.front_port_position for assignment in port_assignments])
terminations = [assignment.front_port for assignment in port_assignments]
+6 -3
View File
@@ -1079,10 +1079,12 @@ class PortAssignment(models.Model):
on_delete=models.CASCADE,
)
front_port_position = models.PositiveSmallIntegerField(
blank=True,
null=True,
validators=(
MinValueValidator(PORT_POSITION_MIN),
MaxValueValidator(PORT_POSITION_MAX),
)
),
)
rear_port = models.ForeignKey(
to='dcim.RearPort',
@@ -1092,7 +1094,7 @@ class PortAssignment(models.Model):
validators=(
MinValueValidator(PORT_POSITION_MIN),
MaxValueValidator(PORT_POSITION_MAX),
)
),
)
class Meta:
@@ -1146,7 +1148,8 @@ class FrontPort(ModularComponentModel, CabledObjectModel, TrackingModelMixin):
)
positions = models.PositiveSmallIntegerField(
verbose_name=_('positions'),
default=1,
blank=True,
null=True,
validators=[
MinValueValidator(PORT_POSITION_MIN),
MaxValueValidator(PORT_POSITION_MAX)
+80 -78
View File
@@ -285,7 +285,7 @@ class LegacyCablePathTests(CablePathTestCase):
frontport1 = FrontPort.objects.create(device=self.device, name='Front Port 1')
PortAssignment.objects.create(
front_port=frontport1,
front_port_position=1,
front_port_position=None,
rear_port=rearport1,
rear_port_position=1
)
@@ -348,7 +348,7 @@ class LegacyCablePathTests(CablePathTestCase):
frontport1 = FrontPort.objects.create(device=self.device, name='Front Port 1')
PortAssignment.objects.create(
front_port=frontport1,
front_port_position=1,
front_port_position=None,
rear_port=rearport1,
rear_port_position=1
)
@@ -417,16 +417,16 @@ class LegacyCablePathTests(CablePathTestCase):
frontport2_2 = FrontPort.objects.create(device=self.device, name='Front Port 2:2')
PortAssignment.objects.bulk_create([
PortAssignment(
front_port=frontport1_1, front_port_position=1, rear_port=rearport1, rear_port_position=1,
front_port=frontport1_1, front_port_position=None, rear_port=rearport1, rear_port_position=1,
),
PortAssignment(
front_port=frontport1_2, front_port_position=1, rear_port=rearport1, rear_port_position=2,
front_port=frontport1_2, front_port_position=None, rear_port=rearport1, rear_port_position=2,
),
PortAssignment(
front_port=frontport2_1, front_port_position=1, rear_port=rearport2, rear_port_position=1,
front_port=frontport2_1, front_port_position=None, rear_port=rearport2, rear_port_position=1,
),
PortAssignment(
front_port=frontport2_2, front_port_position=1, rear_port=rearport2, rear_port_position=2,
front_port=frontport2_2, front_port_position=None, rear_port=rearport2, rear_port_position=2,
),
])
@@ -541,16 +541,16 @@ class LegacyCablePathTests(CablePathTestCase):
frontport2_2 = FrontPort.objects.create(device=self.device, name='Front Port 2:2')
PortAssignment.objects.bulk_create([
PortAssignment(
front_port=frontport1_1, front_port_position=1, rear_port=rearport1, rear_port_position=1,
front_port=frontport1_1, front_port_position=None, rear_port=rearport1, rear_port_position=1,
),
PortAssignment(
front_port=frontport1_2, front_port_position=1, rear_port=rearport1, rear_port_position=2,
front_port=frontport1_2, front_port_position=None, rear_port=rearport1, rear_port_position=2,
),
PortAssignment(
front_port=frontport2_1, front_port_position=1, rear_port=rearport2, rear_port_position=1,
front_port=frontport2_1, front_port_position=None, rear_port=rearport2, rear_port_position=1,
),
PortAssignment(
front_port=frontport2_2, front_port_position=1, rear_port=rearport2, rear_port_position=2,
front_port=frontport2_2, front_port_position=None, rear_port=rearport2, rear_port_position=2,
),
])
@@ -711,22 +711,22 @@ class LegacyCablePathTests(CablePathTestCase):
frontport4_2 = FrontPort.objects.create(device=self.device, name='Front Port 4:2')
PortAssignment.objects.bulk_create([
PortAssignment(
front_port=frontport1_1, front_port_position=1, rear_port=rearport1, rear_port_position=1,
front_port=frontport1_1, front_port_position=None, rear_port=rearport1, rear_port_position=1,
),
PortAssignment(
front_port=frontport1_2, front_port_position=1, rear_port=rearport1, rear_port_position=2,
front_port=frontport1_2, front_port_position=None, rear_port=rearport1, rear_port_position=2,
),
PortAssignment(
front_port=frontport2, front_port_position=1, rear_port=rearport2, rear_port_position=1,
front_port=frontport2, front_port_position=None, rear_port=rearport2, rear_port_position=1,
),
PortAssignment(
front_port=frontport3, front_port_position=1, rear_port=rearport3, rear_port_position=1,
front_port=frontport3, front_port_position=None, rear_port=rearport3, rear_port_position=1,
),
PortAssignment(
front_port=frontport4_1, front_port_position=1, rear_port=rearport4, rear_port_position=1,
front_port=frontport4_1, front_port_position=None, rear_port=rearport4, rear_port_position=1,
),
PortAssignment(
front_port=frontport4_2, front_port_position=1, rear_port=rearport4, rear_port_position=2,
front_port=frontport4_2, front_port_position=None, rear_port=rearport4, rear_port_position=2,
),
])
@@ -839,28 +839,28 @@ class LegacyCablePathTests(CablePathTestCase):
frontport4_2 = FrontPort.objects.create(device=self.device, name='Front Port 4:2')
PortAssignment.objects.bulk_create([
PortAssignment(
front_port=frontport1_1, front_port_position=1, rear_port=rearport1, rear_port_position=1,
front_port=frontport1_1, front_port_position=None, rear_port=rearport1, rear_port_position=1,
),
PortAssignment(
front_port=frontport1_2, front_port_position=1, rear_port=rearport1, rear_port_position=2,
front_port=frontport1_2, front_port_position=None, rear_port=rearport1, rear_port_position=2,
),
PortAssignment(
front_port=frontport2_1, front_port_position=1, rear_port=rearport2, rear_port_position=1,
front_port=frontport2_1, front_port_position=None, rear_port=rearport2, rear_port_position=1,
),
PortAssignment(
front_port=frontport2_2, front_port_position=1, rear_port=rearport2, rear_port_position=2,
front_port=frontport2_2, front_port_position=None, rear_port=rearport2, rear_port_position=2,
),
PortAssignment(
front_port=frontport3_1, front_port_position=1, rear_port=rearport3, rear_port_position=1,
front_port=frontport3_1, front_port_position=None, rear_port=rearport3, rear_port_position=1,
),
PortAssignment(
front_port=frontport3_2, front_port_position=1, rear_port=rearport3, rear_port_position=2,
front_port=frontport3_2, front_port_position=None, rear_port=rearport3, rear_port_position=2,
),
PortAssignment(
front_port=frontport4_1, front_port_position=1, rear_port=rearport4, rear_port_position=1,
front_port=frontport4_1, front_port_position=None, rear_port=rearport4, rear_port_position=1,
),
PortAssignment(
front_port=frontport4_2, front_port_position=1, rear_port=rearport4, rear_port_position=2,
front_port=frontport4_2, front_port_position=None, rear_port=rearport4, rear_port_position=2,
),
])
@@ -966,28 +966,28 @@ class LegacyCablePathTests(CablePathTestCase):
interface3 = Interface.objects.create(device=self.device, name='Interface 3')
interface4 = Interface.objects.create(device=self.device, name='Interface 4')
rearport1 = RearPort.objects.create(device=self.device, name='Rear Port 1', positions=4)
rearport2 = RearPort.objects.create(device=self.device, name='Rear Port 5')
rearport3 = RearPort.objects.create(device=self.device, name='Rear Port 2', positions=4)
rearport2 = RearPort.objects.create(device=self.device, name='Rear Port 2')
rearport3 = RearPort.objects.create(device=self.device, name='Rear Port 3', positions=4)
frontport1_1 = FrontPort.objects.create(device=self.device, name='Front Port 1:1')
frontport1_2 = FrontPort.objects.create(device=self.device, name='Front Port 1:2')
frontport2 = FrontPort.objects.create(device=self.device, name='Front Port 5')
frontport3_1 = FrontPort.objects.create(device=self.device, name='Front Port 2:1')
frontport3_2 = FrontPort.objects.create(device=self.device, name='Front Port 2:2')
frontport2 = FrontPort.objects.create(device=self.device, name='Front Port 2')
frontport3_1 = FrontPort.objects.create(device=self.device, name='Front Port 3:1')
frontport3_2 = FrontPort.objects.create(device=self.device, name='Front Port 3:2')
PortAssignment.objects.bulk_create([
PortAssignment(
front_port=frontport1_1, front_port_position=1, rear_port=rearport1, rear_port_position=1,
front_port=frontport1_1, front_port_position=None, rear_port=rearport1, rear_port_position=1,
),
PortAssignment(
front_port=frontport1_2, front_port_position=1, rear_port=rearport1, rear_port_position=2,
front_port=frontport1_2, front_port_position=None, rear_port=rearport1, rear_port_position=2,
),
PortAssignment(
front_port=frontport2, front_port_position=1, rear_port=rearport2, rear_port_position=1,
front_port=frontport2, front_port_position=None, rear_port=rearport2, rear_port_position=1,
),
PortAssignment(
front_port=frontport3_1, front_port_position=1, rear_port=rearport3, rear_port_position=1,
front_port=frontport3_1, front_port_position=None, rear_port=rearport3, rear_port_position=1,
),
PortAssignment(
front_port=frontport3_2, front_port_position=1, rear_port=rearport3, rear_port_position=2,
front_port=frontport3_2, front_port_position=None, rear_port=rearport3, rear_port_position=2,
),
])
@@ -1025,6 +1025,8 @@ class LegacyCablePathTests(CablePathTestCase):
b_terminations=[rearport3]
)
cable4.save()
for path in CablePath.objects.all():
print(path.path_objects)
self.assertPathExists(
(
interface1, cable1, frontport1_1, rearport1, cable3, frontport2, rearport2,
@@ -1082,10 +1084,10 @@ class LegacyCablePathTests(CablePathTestCase):
frontport1_2 = FrontPort.objects.create(device=self.device, name='Front Port 1:2')
PortAssignment.objects.bulk_create([
PortAssignment(
front_port=frontport1_1, front_port_position=1, rear_port=rearport1, rear_port_position=1,
front_port=frontport1_1, front_port_position=None, rear_port=rearport1, rear_port_position=1,
),
PortAssignment(
front_port=frontport1_2, front_port_position=1, rear_port=rearport1, rear_port_position=2,
front_port=frontport1_2, front_port_position=None, rear_port=rearport1, rear_port_position=2,
),
])
@@ -1151,7 +1153,7 @@ class LegacyCablePathTests(CablePathTestCase):
rearport2 = RearPort.objects.create(device=self.device, name='Rear Port 2')
frontport1 = FrontPort.objects.create(device=self.device, name='Front Port 1')
PortAssignment.objects.create(
front_port=frontport1, front_port_position=1, rear_port=rearport1, rear_port_position=1,
front_port=frontport1, front_port_position=None, rear_port=rearport1, rear_port_position=1,
)
# Create cables
@@ -1469,16 +1471,16 @@ class LegacyCablePathTests(CablePathTestCase):
frontport2_2 = FrontPort.objects.create(device=self.device, name='Front Port 2:2')
PortAssignment.objects.bulk_create([
PortAssignment(
front_port=frontport1_1, front_port_position=1, rear_port=rearport1, rear_port_position=1,
front_port=frontport1_1, front_port_position=None, rear_port=rearport1, rear_port_position=1,
),
PortAssignment(
front_port=frontport1_2, front_port_position=1, rear_port=rearport1, rear_port_position=2,
front_port=frontport1_2, front_port_position=None, rear_port=rearport1, rear_port_position=2,
),
PortAssignment(
front_port=frontport2_1, front_port_position=1, rear_port=rearport2, rear_port_position=1,
front_port=frontport2_1, front_port_position=None, rear_port=rearport2, rear_port_position=1,
),
PortAssignment(
front_port=frontport2_2, front_port_position=1, rear_port=rearport2, rear_port_position=2,
front_port=frontport2_2, front_port_position=None, rear_port=rearport2, rear_port_position=2,
),
])
circuittermination1 = CircuitTermination.objects.create(
@@ -1667,16 +1669,16 @@ class LegacyCablePathTests(CablePathTestCase):
frontport4 = FrontPort.objects.create(device=self.device, name='Front Port 4')
PortAssignment.objects.bulk_create([
PortAssignment(
front_port=frontport1, front_port_position=1, rear_port=rearport1, rear_port_position=1,
front_port=frontport1, front_port_position=None, rear_port=rearport1, rear_port_position=1,
),
PortAssignment(
front_port=frontport2, front_port_position=1, rear_port=rearport2, rear_port_position=1,
front_port=frontport2, front_port_position=None, rear_port=rearport2, rear_port_position=1,
),
PortAssignment(
front_port=frontport3, front_port_position=1, rear_port=rearport3, rear_port_position=1,
front_port=frontport3, front_port_position=None, rear_port=rearport3, rear_port_position=1,
),
PortAssignment(
front_port=frontport4, front_port_position=1, rear_port=rearport4, rear_port_position=1,
front_port=frontport4, front_port_position=None, rear_port=rearport4, rear_port_position=1,
),
])
@@ -1760,28 +1762,28 @@ class LegacyCablePathTests(CablePathTestCase):
frontport2_4 = FrontPort.objects.create(device=self.device, name='Front Port 2:4')
PortAssignment.objects.bulk_create([
PortAssignment(
front_port=frontport1_1, front_port_position=1, rear_port=rearport1, rear_port_position=1,
front_port=frontport1_1, front_port_position=None, rear_port=rearport1, rear_port_position=1,
),
PortAssignment(
front_port=frontport1_2, front_port_position=1, rear_port=rearport1, rear_port_position=2,
front_port=frontport1_2, front_port_position=None, rear_port=rearport1, rear_port_position=2,
),
PortAssignment(
front_port=frontport1_3, front_port_position=1, rear_port=rearport1, rear_port_position=3,
front_port=frontport1_3, front_port_position=None, rear_port=rearport1, rear_port_position=3,
),
PortAssignment(
front_port=frontport1_4, front_port_position=1, rear_port=rearport1, rear_port_position=4,
front_port=frontport1_4, front_port_position=None, rear_port=rearport1, rear_port_position=4,
),
PortAssignment(
front_port=frontport2_1, front_port_position=1, rear_port=rearport2, rear_port_position=1,
front_port=frontport2_1, front_port_position=None, rear_port=rearport2, rear_port_position=1,
),
PortAssignment(
front_port=frontport2_2, front_port_position=1, rear_port=rearport2, rear_port_position=2,
front_port=frontport2_2, front_port_position=None, rear_port=rearport2, rear_port_position=2,
),
PortAssignment(
front_port=frontport2_3, front_port_position=1, rear_port=rearport2, rear_port_position=3,
front_port=frontport2_3, front_port_position=None, rear_port=rearport2, rear_port_position=3,
),
PortAssignment(
front_port=frontport2_4, front_port_position=1, rear_port=rearport2, rear_port_position=4,
front_port=frontport2_4, front_port_position=None, rear_port=rearport2, rear_port_position=4,
),
])
@@ -1940,16 +1942,16 @@ class LegacyCablePathTests(CablePathTestCase):
frontport4 = FrontPort.objects.create(device=self.device, name='Front Port 4')
PortAssignment.objects.bulk_create([
PortAssignment(
front_port=frontport1, front_port_position=1, rear_port=rearport1, rear_port_position=1,
front_port=frontport1, front_port_position=None, rear_port=rearport1, rear_port_position=1,
),
PortAssignment(
front_port=frontport2, front_port_position=1, rear_port=rearport2, rear_port_position=1,
front_port=frontport2, front_port_position=None, rear_port=rearport2, rear_port_position=1,
),
PortAssignment(
front_port=frontport3, front_port_position=1, rear_port=rearport3, rear_port_position=1,
front_port=frontport3, front_port_position=None, rear_port=rearport3, rear_port_position=1,
),
PortAssignment(
front_port=frontport4, front_port_position=1, rear_port=rearport4, rear_port_position=1,
front_port=frontport4, front_port_position=None, rear_port=rearport4, rear_port_position=1,
),
])
@@ -2025,16 +2027,16 @@ class LegacyCablePathTests(CablePathTestCase):
frontport4 = FrontPort.objects.create(device=self.device, name='Front Port 4')
PortAssignment.objects.bulk_create([
PortAssignment(
front_port=frontport1, front_port_position=1, rear_port=rearport1, rear_port_position=1,
front_port=frontport1, front_port_position=None, rear_port=rearport1, rear_port_position=1,
),
PortAssignment(
front_port=frontport2, front_port_position=1, rear_port=rearport2, rear_port_position=1,
front_port=frontport2, front_port_position=None, rear_port=rearport2, rear_port_position=1,
),
PortAssignment(
front_port=frontport3, front_port_position=1, rear_port=rearport3, rear_port_position=1,
front_port=frontport3, front_port_position=None, rear_port=rearport3, rear_port_position=1,
),
PortAssignment(
front_port=frontport4, front_port_position=1, rear_port=rearport4, rear_port_position=1,
front_port=frontport4, front_port_position=None, rear_port=rearport4, rear_port_position=1,
),
])
@@ -2131,22 +2133,22 @@ class LegacyCablePathTests(CablePathTestCase):
frontport6 = FrontPort.objects.create(device=self.device, name='Front Port 6')
PortAssignment.objects.bulk_create([
PortAssignment(
front_port=frontport1, front_port_position=1, rear_port=rearport1, rear_port_position=1,
front_port=frontport1, front_port_position=None, rear_port=rearport1, rear_port_position=1,
),
PortAssignment(
front_port=frontport2, front_port_position=1, rear_port=rearport2, rear_port_position=1,
front_port=frontport2, front_port_position=None, rear_port=rearport2, rear_port_position=1,
),
PortAssignment(
front_port=frontport3, front_port_position=1, rear_port=rearport3, rear_port_position=1,
front_port=frontport3, front_port_position=None, rear_port=rearport3, rear_port_position=1,
),
PortAssignment(
front_port=frontport4, front_port_position=1, rear_port=rearport4, rear_port_position=1,
front_port=frontport4, front_port_position=None, rear_port=rearport4, rear_port_position=1,
),
PortAssignment(
front_port=frontport5, front_port_position=1, rear_port=rearport5, rear_port_position=1,
front_port=frontport5, front_port_position=None, rear_port=rearport5, rear_port_position=1,
),
PortAssignment(
front_port=frontport6, front_port_position=1, rear_port=rearport6, rear_port_position=1,
front_port=frontport6, front_port_position=None, rear_port=rearport6, rear_port_position=1,
),
])
@@ -2253,10 +2255,10 @@ class LegacyCablePathTests(CablePathTestCase):
frontport2 = FrontPort.objects.create(device=self.device, name='Front Port 2')
PortAssignment.objects.bulk_create([
PortAssignment(
front_port=frontport1, front_port_position=1, rear_port=rearport1, rear_port_position=1,
front_port=frontport1, front_port_position=None, rear_port=rearport1, rear_port_position=1,
),
PortAssignment(
front_port=frontport2, front_port_position=1, rear_port=rearport2, rear_port_position=1,
front_port=frontport2, front_port_position=None, rear_port=rearport2, rear_port_position=1,
),
])
@@ -2302,10 +2304,10 @@ class LegacyCablePathTests(CablePathTestCase):
frontport2 = FrontPort.objects.create(device=self.device, name='Front Port 2')
PortAssignment.objects.bulk_create([
PortAssignment(
front_port=frontport1, front_port_position=1, rear_port=rearport1, rear_port_position=1,
front_port=frontport1, front_port_position=None, rear_port=rearport1, rear_port_position=1,
),
PortAssignment(
front_port=frontport2, front_port_position=1, rear_port=rearport2, rear_port_position=1,
front_port=frontport2, front_port_position=None, rear_port=rearport2, rear_port_position=1,
),
])
@@ -2352,10 +2354,10 @@ class LegacyCablePathTests(CablePathTestCase):
frontport2 = FrontPort.objects.create(device=self.device, name='Front Port 2')
PortAssignment.objects.bulk_create([
PortAssignment(
front_port=frontport1, front_port_position=1, rear_port=rearport1, rear_port_position=1,
front_port=frontport1, front_port_position=None, rear_port=rearport1, rear_port_position=1,
),
PortAssignment(
front_port=frontport2, front_port_position=1, rear_port=rearport2, rear_port_position=1,
front_port=frontport2, front_port_position=None, rear_port=rearport2, rear_port_position=1,
),
])
@@ -2407,7 +2409,7 @@ class LegacyCablePathTests(CablePathTestCase):
frontport1 = FrontPort.objects.create(device=self.device, name='Front Port 1')
PortAssignment.objects.bulk_create([
PortAssignment(
front_port=frontport1, front_port_position=1, rear_port=rearport1, rear_port_position=1,
front_port=frontport1, front_port_position=None, rear_port=rearport1, rear_port_position=1,
),
])
@@ -2521,16 +2523,16 @@ class LegacyCablePathTests(CablePathTestCase):
frontport4 = FrontPort.objects.create(device=self.device, name='Front Port 4')
PortAssignment.objects.bulk_create([
PortAssignment(
front_port=frontport1, front_port_position=1, rear_port=rearport1, rear_port_position=1,
front_port=frontport1, front_port_position=None, rear_port=rearport1, rear_port_position=1,
),
PortAssignment(
front_port=frontport2, front_port_position=1, rear_port=rearport2, rear_port_position=1,
front_port=frontport2, front_port_position=None, rear_port=rearport2, rear_port_position=1,
),
PortAssignment(
front_port=frontport3, front_port_position=1, rear_port=rearport3, rear_port_position=1,
front_port=frontport3, front_port_position=None, rear_port=rearport3, rear_port_position=1,
),
PortAssignment(
front_port=frontport4, front_port_position=1, rear_port=rearport4, rear_port_position=1,
front_port=frontport4, front_port_position=None, rear_port=rearport4, rear_port_position=1,
),
])