From cff2fdb42dfc2ed7cffc66063ab31b1922647176 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 27 Feb 2017 14:57:11 -0500 Subject: [PATCH] Simplify to a single LAG form factor --- netbox/dcim/filters.py | 8 ++-- netbox/dcim/forms.py | 12 +++--- .../dcim/migrations/0030_interface_add_lag.py | 8 ++-- netbox/dcim/models.py | 38 ++++--------------- 4 files changed, 21 insertions(+), 45 deletions(-) diff --git a/netbox/dcim/filters.py b/netbox/dcim/filters.py index 5c633292a..eefea3bb2 100644 --- a/netbox/dcim/filters.py +++ b/netbox/dcim/filters.py @@ -7,8 +7,8 @@ from extras.filters import CustomFieldFilterSet from tenancy.models import Tenant from utilities.filters import NullableModelMultipleChoiceFilter from .models import ( - ConsolePort, ConsoleServerPort, Device, DeviceRole, DeviceType, Interface, InterfaceConnection, Manufacturer, - LAG_IFACE_TYPES, Platform, PowerOutlet, PowerPort, Rack, RackGroup, RackReservation, RackRole, Site, + ConsolePort, ConsoleServerPort, Device, DeviceRole, DeviceType, IFACE_FF_LAG, Interface, InterfaceConnection, + Manufacturer, Platform, PowerOutlet, PowerPort, Rack, RackGroup, RackReservation, RackRole, Site, VIRTUAL_IFACE_TYPES, ) @@ -390,8 +390,8 @@ class InterfaceFilter(django_filters.FilterSet): return queryset.exclude(form_factor__in=VIRTUAL_IFACE_TYPES) elif value == 'virtual': return queryset.filter(form_factor__in=VIRTUAL_IFACE_TYPES) - elif value == 'parent': - return queryset.filter(form_factor__in=LAG_IFACE_TYPES) + elif value == 'lag': + return queryset.filter(form_factor=IFACE_FF_LAG) return queryset diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index e5eb9e8b2..65e5d0bbf 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -18,8 +18,8 @@ from .formfields import MACAddressFormField from .models import ( DeviceBay, DeviceBayTemplate, CONNECTION_STATUS_CHOICES, CONNECTION_STATUS_PLANNED, CONNECTION_STATUS_CONNECTED, ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceRole, DeviceType, - Interface, IFACE_FF_CHOICES, IFACE_ORDERING_CHOICES, InterfaceConnection, InterfaceTemplate, Manufacturer, Module, - LAG_IFACE_TYPES, Platform, PowerOutlet, PowerOutletTemplate, PowerPort, PowerPortTemplate, RACK_TYPE_CHOICES, + Interface, IFACE_FF_CHOICES, IFACE_FF_LAG, IFACE_ORDERING_CHOICES, InterfaceConnection, InterfaceTemplate, + Manufacturer, Module, Platform, PowerOutlet, PowerOutletTemplate, PowerPort, PowerPortTemplate, RACK_TYPE_CHOICES, RACK_WIDTH_CHOICES, Rack, RackGroup, RackReservation, RackRole, Site, STATUS_CHOICES, SUBDEVICE_ROLE_CHILD, VIRTUAL_IFACE_TYPES ) @@ -1294,18 +1294,18 @@ class InterfaceForm(BootstrapMixin, forms.ModelForm): # Limit LAG choices to interfaces belonging to this device if self.is_bound: self.fields['lag'].queryset = Interface.objects.order_naturally().filter( - device_id=self.data['device'], form_factor__in=LAG_IFACE_TYPES + device_id=self.data['device'], form_factor=IFACE_FF_LAG ) else: self.fields['lag'].queryset = Interface.objects.order_naturally().filter( - device=self.instance.device, form_factor__in=LAG_IFACE_TYPES + device=self.instance.device, form_factor=IFACE_FF_LAG ) class InterfaceCreateForm(DeviceComponentForm): name_pattern = ExpandableNameField(label='Name') form_factor = forms.ChoiceField(choices=IFACE_FF_CHOICES) - lag = forms.ModelChoiceField(queryset=Interface.objects.all(), required=False, label='LAG Interface') + lag = forms.ModelChoiceField(queryset=Interface.objects.all(), required=False, label='Parent LAG') mac_address = MACAddressFormField(required=False, label='MAC Address') mgmt_only = forms.BooleanField(required=False, label='OOB Management') description = forms.CharField(max_length=100, required=False) @@ -1316,7 +1316,7 @@ class InterfaceCreateForm(DeviceComponentForm): # Limit LAG choices to interfaces belonging to this device if self.device is not None: self.fields['lag'].queryset = Interface.objects.order_naturally().filter( - device=self.device, form_factor__in=LAG_IFACE_TYPES + device=self.device, form_factor=IFACE_FF_LAG ) else: self.fields['lag'].queryset = Interface.objects.none() diff --git a/netbox/dcim/migrations/0030_interface_add_lag.py b/netbox/dcim/migrations/0030_interface_add_lag.py index e4e7d8e39..6f5be67a4 100644 --- a/netbox/dcim/migrations/0030_interface_add_lag.py +++ b/netbox/dcim/migrations/0030_interface_add_lag.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.10.4 on 2017-02-24 20:49 +# Generated by Django 1.10.4 on 2017-02-27 19:55 from __future__ import unicode_literals from django.db import migrations, models @@ -16,16 +16,16 @@ class Migration(migrations.Migration): migrations.AddField( model_name='interface', name='lag', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='member_interfaces', to='dcim.Interface', verbose_name=b'LAG Interface'), + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='member_interfaces', to='dcim.Interface', verbose_name=b'Parent LAG'), ), migrations.AlterField( model_name='interface', name='form_factor', - field=models.PositiveSmallIntegerField(choices=[[b'Virtual interfaces', [[0, b'Virtual']]], [b'Ethernet (fixed)', [[800, b'100BASE-TX (10/100ME)'], [1000, b'1000BASE-T (1GE)'], [1150, b'10GBASE-T (10GE)']]], [b'Ethernet (modular)', [[1050, b'GBIC (1GE)'], [1100, b'SFP (1GE)'], [1200, b'SFP+ (10GE)'], [1300, b'XFP (10GE)'], [1310, b'XENPAK (10GE)'], [1320, b'X2 (10GE)'], [1350, b'SFP28 (25GE)'], [1400, b'QSFP+ (40GE)'], [1500, b'CFP (100GE)'], [1600, b'QSFP28 (100GE)']]], [b'Link aggregation', [[2000, b'Ethernet LAG (Static)'], [2101, b'Ethernet LAG (LACP/Active)'], [2102, b'Ethernet LAG (LACP/Passive)'], [2201, b'Ethernet LAG (PAgP/Desirable)'], [2202, b'Ethernet LAG (PAgP/Auto)'], [2700, b'Multilink PPP (MLPPP)']]], [b'FibreChannel', [[3010, b'SFP (1GFC)'], [3020, b'SFP (2GFC)'], [3040, b'SFP (4GFC)'], [3080, b'SFP+ (8GFC)'], [3160, b'SFP+ (16GFC)']]], [b'Serial', [[4000, b'T1 (1.544 Mbps)'], [4010, b'E1 (2.048 Mbps)'], [4040, b'T3 (45 Mbps)'], [4050, b'E3 (34 Mbps)'], [4050, b'E3 (34 Mbps)']]], [b'Stacking', [[5000, b'Cisco StackWise'], [5050, b'Cisco StackWise Plus'], [5100, b'Cisco FlexStack'], [5150, b'Cisco FlexStack Plus']]], [b'Other', [[32767, b'Other']]]], default=1200), + field=models.PositiveSmallIntegerField(choices=[[b'Virtual interfaces', [[0, b'Virtual'], [200, b'Link Aggregation Group (LAG)']]], [b'Ethernet (fixed)', [[800, b'100BASE-TX (10/100ME)'], [1000, b'1000BASE-T (1GE)'], [1150, b'10GBASE-T (10GE)']]], [b'Ethernet (modular)', [[1050, b'GBIC (1GE)'], [1100, b'SFP (1GE)'], [1200, b'SFP+ (10GE)'], [1300, b'XFP (10GE)'], [1310, b'XENPAK (10GE)'], [1320, b'X2 (10GE)'], [1350, b'SFP28 (25GE)'], [1400, b'QSFP+ (40GE)'], [1500, b'CFP (100GE)'], [1600, b'QSFP28 (100GE)']]], [b'FibreChannel', [[3010, b'SFP (1GFC)'], [3020, b'SFP (2GFC)'], [3040, b'SFP (4GFC)'], [3080, b'SFP+ (8GFC)'], [3160, b'SFP+ (16GFC)']]], [b'Serial', [[4000, b'T1 (1.544 Mbps)'], [4010, b'E1 (2.048 Mbps)'], [4040, b'T3 (45 Mbps)'], [4050, b'E3 (34 Mbps)'], [4050, b'E3 (34 Mbps)']]], [b'Stacking', [[5000, b'Cisco StackWise'], [5050, b'Cisco StackWise Plus'], [5100, b'Cisco FlexStack'], [5150, b'Cisco FlexStack Plus']]], [b'Other', [[32767, b'Other']]]], default=1200), ), migrations.AlterField( model_name='interfacetemplate', name='form_factor', - field=models.PositiveSmallIntegerField(choices=[[b'Virtual interfaces', [[0, b'Virtual']]], [b'Ethernet (fixed)', [[800, b'100BASE-TX (10/100ME)'], [1000, b'1000BASE-T (1GE)'], [1150, b'10GBASE-T (10GE)']]], [b'Ethernet (modular)', [[1050, b'GBIC (1GE)'], [1100, b'SFP (1GE)'], [1200, b'SFP+ (10GE)'], [1300, b'XFP (10GE)'], [1310, b'XENPAK (10GE)'], [1320, b'X2 (10GE)'], [1350, b'SFP28 (25GE)'], [1400, b'QSFP+ (40GE)'], [1500, b'CFP (100GE)'], [1600, b'QSFP28 (100GE)']]], [b'Link aggregation', [[2000, b'Ethernet LAG (Static)'], [2101, b'Ethernet LAG (LACP/Active)'], [2102, b'Ethernet LAG (LACP/Passive)'], [2201, b'Ethernet LAG (PAgP/Desirable)'], [2202, b'Ethernet LAG (PAgP/Auto)'], [2700, b'Multilink PPP (MLPPP)']]], [b'FibreChannel', [[3010, b'SFP (1GFC)'], [3020, b'SFP (2GFC)'], [3040, b'SFP (4GFC)'], [3080, b'SFP+ (8GFC)'], [3160, b'SFP+ (16GFC)']]], [b'Serial', [[4000, b'T1 (1.544 Mbps)'], [4010, b'E1 (2.048 Mbps)'], [4040, b'T3 (45 Mbps)'], [4050, b'E3 (34 Mbps)'], [4050, b'E3 (34 Mbps)']]], [b'Stacking', [[5000, b'Cisco StackWise'], [5050, b'Cisco StackWise Plus'], [5100, b'Cisco FlexStack'], [5150, b'Cisco FlexStack Plus']]], [b'Other', [[32767, b'Other']]]], default=1200), + field=models.PositiveSmallIntegerField(choices=[[b'Virtual interfaces', [[0, b'Virtual'], [200, b'Link Aggregation Group (LAG)']]], [b'Ethernet (fixed)', [[800, b'100BASE-TX (10/100ME)'], [1000, b'1000BASE-T (1GE)'], [1150, b'10GBASE-T (10GE)']]], [b'Ethernet (modular)', [[1050, b'GBIC (1GE)'], [1100, b'SFP (1GE)'], [1200, b'SFP+ (10GE)'], [1300, b'XFP (10GE)'], [1310, b'XENPAK (10GE)'], [1320, b'X2 (10GE)'], [1350, b'SFP28 (25GE)'], [1400, b'QSFP+ (40GE)'], [1500, b'CFP (100GE)'], [1600, b'QSFP28 (100GE)']]], [b'FibreChannel', [[3010, b'SFP (1GFC)'], [3020, b'SFP (2GFC)'], [3040, b'SFP (4GFC)'], [3080, b'SFP+ (8GFC)'], [3160, b'SFP+ (16GFC)']]], [b'Serial', [[4000, b'T1 (1.544 Mbps)'], [4010, b'E1 (2.048 Mbps)'], [4040, b'T3 (45 Mbps)'], [4050, b'E3 (34 Mbps)'], [4050, b'E3 (34 Mbps)']]], [b'Stacking', [[5000, b'Cisco StackWise'], [5050, b'Cisco StackWise Plus'], [5100, b'Cisco FlexStack'], [5150, b'Cisco FlexStack Plus']]], [b'Other', [[32767, b'Other']]]], default=1200), ), ] diff --git a/netbox/dcim/models.py b/netbox/dcim/models.py index 1d2986869..f91a3565e 100644 --- a/netbox/dcim/models.py +++ b/netbox/dcim/models.py @@ -68,6 +68,7 @@ IFACE_ORDERING_CHOICES = [ # Virtual IFACE_FF_VIRTUAL = 0 +IFACE_FF_LAG = 200 # Ethernet IFACE_FF_100ME_FIXED = 800 IFACE_FF_1GE_FIXED = 1000 @@ -82,13 +83,6 @@ IFACE_FF_25GE_SFP28 = 1350 IFACE_FF_40GE_QSFP_PLUS = 1400 IFACE_FF_100GE_CFP = 1500 IFACE_FF_100GE_QSFP28 = 1600 -# Link aggregation -IFACE_FF_LAG_STATIC = 2000 -IFACE_FF_LAG_LACP_ACTIVE = 2101 -IFACE_FF_LAG_LACP_PASSIVE = 2102 -IFACE_FF_LAG_PAGP_DESIRABLE = 2201 -IFACE_FF_LAG_PAGP_AUTO = 2202 -IFACE_FF_LAG_MLPPP = 2700 # Fibrechannel IFACE_FF_1GFC_SFP = 3010 IFACE_FF_2GFC_SFP = 3020 @@ -113,6 +107,7 @@ IFACE_FF_CHOICES = [ 'Virtual interfaces', [ [IFACE_FF_VIRTUAL, 'Virtual'], + [IFACE_FF_LAG, 'Link Aggregation Group (LAG)'], ] ], [ @@ -138,17 +133,6 @@ IFACE_FF_CHOICES = [ [IFACE_FF_100GE_QSFP28, 'QSFP28 (100GE)'], ] ], - [ - 'Link aggregation', - [ - [IFACE_FF_LAG_STATIC, 'Ethernet LAG (Static)'], - [IFACE_FF_LAG_LACP_ACTIVE, 'Ethernet LAG (LACP/Active)'], - [IFACE_FF_LAG_LACP_PASSIVE, 'Ethernet LAG (LACP/Passive)'], - [IFACE_FF_LAG_PAGP_DESIRABLE, 'Ethernet LAG (PAgP/Desirable)'], - [IFACE_FF_LAG_PAGP_AUTO, 'Ethernet LAG (PAgP/Auto)'], - [IFACE_FF_LAG_MLPPP, 'Multilink PPP (MLPPP)'], - ] - ], [ 'FibreChannel', [ @@ -186,18 +170,10 @@ IFACE_FF_CHOICES = [ ], ] -LAG_IFACE_TYPES = [ - IFACE_FF_LAG_STATIC, - IFACE_FF_LAG_LACP_ACTIVE, - IFACE_FF_LAG_LACP_PASSIVE, - IFACE_FF_LAG_PAGP_DESIRABLE, - IFACE_FF_LAG_PAGP_AUTO, - IFACE_FF_LAG_MLPPP, -] - VIRTUAL_IFACE_TYPES = [ IFACE_FF_VIRTUAL, -] + LAG_IFACE_TYPES + IFACE_FF_LAG, +] STATUS_ACTIVE = True STATUS_OFFLINE = False @@ -1238,7 +1214,7 @@ class Interface(models.Model): """ device = models.ForeignKey('Device', related_name='interfaces', on_delete=models.CASCADE) lag = models.ForeignKey('self', related_name='member_interfaces', null=True, blank=True, on_delete=models.SET_NULL, - verbose_name='LAG Interface') + verbose_name='Parent LAG') name = models.CharField(max_length=30) form_factor = models.PositiveSmallIntegerField(choices=IFACE_FF_CHOICES, default=IFACE_FF_10GE_SFP_PLUS) mac_address = MACAddressField(null=True, blank=True, verbose_name='MAC Address') @@ -1273,7 +1249,7 @@ class Interface(models.Model): }) # A LAG interface cannot have a parent LAG - if self.form_factor in LAG_IFACE_TYPES and self.lag is not None: + if self.form_factor == IFACE_FF_LAG and self.lag is not None: raise ValidationError({ 'lag': "{} interfaces cannot have a parent LAG interface.".format(self.get_form_factor_display()) }) @@ -1284,7 +1260,7 @@ class Interface(models.Model): @property def is_lag(self): - return self.form_factor in LAG_IFACE_TYPES + return self.form_factor == IFACE_FF_LAG @property def is_connected(self):