From 229e6809d8e1d4ad7c2225242ed7ff03be3717cc Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 23 Jun 2017 14:04:15 -0400 Subject: [PATCH] Closes #1041: Added enabled and MTU fields to the interface model --- netbox/dcim/api/serializers.py | 17 ++++++++----- netbox/dcim/filters.py | 2 +- netbox/dcim/forms.py | 15 ++++++++--- .../0039_interface_add_enabled_mtu.py | 25 +++++++++++++++++++ netbox/dcim/models.py | 19 +++++++++++--- netbox/templates/dcim/inc/interface.html | 3 ++- 6 files changed, 66 insertions(+), 15 deletions(-) create mode 100644 netbox/dcim/migrations/0039_interface_add_enabled_mtu.py diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index 8ca6cab35..1561b8dc9 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -7,8 +7,8 @@ from ipam.models import IPAddress from dcim.models import ( CONNECTION_STATUS_CHOICES, ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay, DeviceBayTemplate, DeviceType, DeviceRole, IFACE_FF_CHOICES, IFACE_ORDERING_CHOICES, Interface, - InterfaceConnection, InterfaceTemplate, Manufacturer, InventoryItem, Platform, PowerOutlet, PowerOutletTemplate, PowerPort, - PowerPortTemplate, Rack, RackGroup, RackReservation, RackRole, RACK_FACE_CHOICES, RACK_TYPE_CHOICES, + InterfaceConnection, InterfaceTemplate, Manufacturer, InventoryItem, Platform, PowerOutlet, PowerOutletTemplate, + PowerPort, PowerPortTemplate, Rack, RackGroup, RackReservation, RackRole, RACK_FACE_CHOICES, RACK_TYPE_CHOICES, RACK_WIDTH_CHOICES, Region, Site, STATUS_CHOICES, SUBDEVICE_ROLE_CHOICES, ) from extras.api.customfields import CustomFieldModelSerializer @@ -601,8 +601,8 @@ class InterfaceSerializer(serializers.ModelSerializer): class Meta: model = Interface fields = [ - 'id', 'device', 'name', 'form_factor', 'lag', 'mac_address', 'mgmt_only', 'description', 'connection', - 'connected_interface', + 'id', 'device', 'name', 'form_factor', 'enabled', 'lag', 'mtu', 'mac_address', 'mgmt_only', 'description', + 'connection', 'connected_interface', ] def get_connection(self, obj): @@ -624,14 +624,19 @@ class PeerInterfaceSerializer(serializers.ModelSerializer): class Meta: model = Interface - fields = ['id', 'url', 'device', 'name', 'form_factor', 'lag', 'mac_address', 'mgmt_only', 'description'] + fields = [ + 'id', 'url', 'device', 'name', 'form_factor', 'enabled', 'lag', 'mtu', 'mac_address', 'mgmt_only', + 'description', + ] class WritableInterfaceSerializer(serializers.ModelSerializer): class Meta: model = Interface - fields = ['id', 'device', 'name', 'form_factor', 'lag', 'mac_address', 'mgmt_only', 'description'] + fields = [ + 'id', 'device', 'name', 'form_factor', 'enabled', 'lag', 'mtu', 'mac_address', 'mgmt_only', 'description', + ] # diff --git a/netbox/dcim/filters.py b/netbox/dcim/filters.py index cdb5519b7..e9d629045 100644 --- a/netbox/dcim/filters.py +++ b/netbox/dcim/filters.py @@ -545,7 +545,7 @@ class InterfaceFilter(django_filters.FilterSet): class Meta: model = Interface - fields = ['name', 'form_factor', 'mgmt_only'] + fields = ['name', 'form_factor', 'enabled', 'mtu', 'mgmt_only'] def filter_device(self, queryset, name, value): try: diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index 6b0bfec1d..b23e4a23e 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -1447,7 +1447,7 @@ class InterfaceForm(BootstrapMixin, forms.ModelForm): class Meta: model = Interface - fields = ['device', 'name', 'form_factor', 'lag', 'mac_address', 'mgmt_only', 'description'] + fields = ['device', 'name', 'form_factor', 'enabled', 'lag', 'mac_address', 'mtu', 'mgmt_only', 'description'] widgets = { 'device': forms.HiddenInput(), } @@ -1469,12 +1469,19 @@ class InterfaceForm(BootstrapMixin, forms.ModelForm): class InterfaceCreateForm(DeviceComponentForm): name_pattern = ExpandableNameField(label='Name') form_factor = forms.ChoiceField(choices=IFACE_FF_CHOICES) + enabled = forms.BooleanField(required=False) lag = forms.ModelChoiceField(queryset=Interface.objects.all(), required=False, label='Parent LAG') + mtu = forms.IntegerField(required=False, min_value=1, max_value=32767, label='MTU') 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) def __init__(self, *args, **kwargs): + + # Set interfaces enabled by default + kwargs['initial'] = kwargs.get('initial', {}) + kwargs['initial'].update({'enabled': True}) + super(InterfaceCreateForm, self).__init__(*args, **kwargs) # Limit LAG choices to interfaces belonging to this device @@ -1489,13 +1496,15 @@ class InterfaceCreateForm(DeviceComponentForm): class InterfaceBulkEditForm(BootstrapMixin, BulkEditForm): pk = forms.ModelMultipleChoiceField(queryset=Interface.objects.all(), widget=forms.MultipleHiddenInput) device = forms.ModelChoiceField(queryset=Device.objects.all(), widget=forms.HiddenInput) - lag = forms.ModelChoiceField(queryset=Interface.objects.all(), required=False, label='Parent LAG') form_factor = forms.ChoiceField(choices=add_blank_choice(IFACE_FF_CHOICES), required=False) + enabled = forms.NullBooleanField(required=False, widget=BulkEditNullBooleanSelect) + lag = forms.ModelChoiceField(queryset=Interface.objects.all(), required=False, label='Parent LAG') + mtu = forms.IntegerField(required=False, min_value=1, max_value=32767, label='MTU') mgmt_only = forms.NullBooleanField(required=False, widget=BulkEditNullBooleanSelect, label='Management only') description = forms.CharField(max_length=100, required=False) class Meta: - nullable_fields = ['lag', 'description'] + nullable_fields = ['lag', 'mtu', 'description'] def __init__(self, *args, **kwargs): super(InterfaceBulkEditForm, self).__init__(*args, **kwargs) diff --git a/netbox/dcim/migrations/0039_interface_add_enabled_mtu.py b/netbox/dcim/migrations/0039_interface_add_enabled_mtu.py new file mode 100644 index 000000000..4cc7e9616 --- /dev/null +++ b/netbox/dcim/migrations/0039_interface_add_enabled_mtu.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.1 on 2017-06-23 17:05 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('dcim', '0038_wireless_interfaces'), + ] + + operations = [ + migrations.AddField( + model_name='interface', + name='enabled', + field=models.BooleanField(default=True), + ), + migrations.AddField( + model_name='interface', + name='mtu', + field=models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='MTU'), + ), + ] diff --git a/netbox/dcim/models.py b/netbox/dcim/models.py index b6d345b98..4f76de1e6 100644 --- a/netbox/dcim/models.py +++ b/netbox/dcim/models.py @@ -1120,13 +1120,24 @@ class Interface(models.Model): of an InterfaceConnection. """ 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='Parent LAG') + lag = models.ForeignKey( + 'self', + models.SET_NULL, + related_name='member_interfaces', + null=True, + blank=True, + verbose_name='Parent LAG' + ) name = models.CharField(max_length=30) form_factor = models.PositiveSmallIntegerField(choices=IFACE_FF_CHOICES, default=IFACE_FF_10GE_SFP_PLUS) + enabled = models.BooleanField(default=True) mac_address = MACAddressField(null=True, blank=True, verbose_name='MAC Address') - mgmt_only = models.BooleanField(default=False, verbose_name='OOB Management', - help_text="This interface is used only for out-of-band management") + mtu = models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='MTU') + mgmt_only = models.BooleanField( + default=False, + verbose_name='OOB Management', + help_text="This interface is used only for out-of-band management" + ) description = models.CharField(max_length=100, blank=True) objects = InterfaceQuerySet.as_manager() diff --git a/netbox/templates/dcim/inc/interface.html b/netbox/templates/dcim/inc/interface.html index 25d9f6f8a..b4c075848 100644 --- a/netbox/templates/dcim/inc/interface.html +++ b/netbox/templates/dcim/inc/interface.html @@ -1,4 +1,4 @@ - + {% if selectable and perms.dcim.change_interface or perms.dcim.delete_interface %} @@ -14,6 +14,7 @@ {% endif %} + {{ iface.mtu|default:"" }} {{ iface.mac_address|default:"" }} {% if iface.is_lag %}