diff --git a/netbox/dcim/constants.py b/netbox/dcim/constants.py index b3d434c85..dca952a88 100644 --- a/netbox/dcim/constants.py +++ b/netbox/dcim/constants.py @@ -93,15 +93,13 @@ IFACE_FF_JUNIPER_VCP = 5200 # Other IFACE_FF_OTHER = 32767 -VIFACE_FF_CHOICES = [ - [IFACE_FF_VIRTUAL, 'Virtual'], - [IFACE_FF_LAG, 'Link Aggregation Group (LAG)'], -] - IFACE_FF_CHOICES = [ [ 'Virtual interfaces', - VIFACE_FF_CHOICES, + [ + [IFACE_FF_VIRTUAL, 'Virtual'], + [IFACE_FF_LAG, 'Link Aggregation Group (LAG)'], + ], ], [ 'Ethernet (fixed)', diff --git a/netbox/dcim/models.py b/netbox/dcim/models.py index 45d46d92f..860475ad5 100644 --- a/netbox/dcim/models.py +++ b/netbox/dcim/models.py @@ -1303,9 +1303,9 @@ class Interface(models.Model): raise ValidationError("An interface must belong to either a device or a virtual machine.") # VM interfaces must be virtual - if self.virtual_machine and self.form_factor not in VIRTUAL_IFACE_TYPES: + if self.virtual_machine and self.form_factor is not IFACE_FF_VIRTUAL: raise ValidationError({ - 'form_factor': "Virtual machines cannot have physical interfaces." + 'form_factor': "Virtual machines can only have virtual interfaces." }) # Virtual interfaces cannot be connected diff --git a/netbox/virtualization/api/serializers.py b/netbox/virtualization/api/serializers.py index 68f5118bf..b53734734 100644 --- a/netbox/virtualization/api/serializers.py +++ b/netbox/virtualization/api/serializers.py @@ -3,7 +3,7 @@ from __future__ import unicode_literals from rest_framework import serializers from dcim.api.serializers import NestedDeviceRoleSerializer, NestedPlatformSerializer, NestedSiteSerializer -from dcim.constants import VIFACE_FF_CHOICES +from dcim.constants import IFACE_FF_VIRTUAL from dcim.models import Interface from extras.api.customfields import CustomFieldModelSerializer from tenancy.api.serializers import NestedTenantSerializer @@ -122,12 +122,11 @@ class WritableVirtualMachineSerializer(CustomFieldModelSerializer): class InterfaceSerializer(serializers.ModelSerializer): virtual_machine = NestedVirtualMachineSerializer() - form_factor = ChoiceFieldSerializer(choices=VIFACE_FF_CHOICES) class Meta: model = Interface fields = [ - 'id', 'name', 'virtual_machine', 'form_factor', 'enabled', 'mac_address', 'mtu', 'description', + 'id', 'name', 'virtual_machine', 'enabled', 'mac_address', 'mtu', 'description', ] @@ -140,6 +139,7 @@ class NestedInterfaceSerializer(serializers.ModelSerializer): class WritableInterfaceSerializer(ValidatedModelSerializer): + form_factor = serializers.IntegerField(default=IFACE_FF_VIRTUAL) class Meta: model = Interface diff --git a/netbox/virtualization/forms.py b/netbox/virtualization/forms.py index fb938ab1f..91c65c8f1 100644 --- a/netbox/virtualization/forms.py +++ b/netbox/virtualization/forms.py @@ -6,7 +6,7 @@ from django import forms from django.core.exceptions import ValidationError from django.db.models import Count -from dcim.constants import IFACE_FF_VIRTUAL, VIFACE_FF_CHOICES +from dcim.constants import IFACE_FF_VIRTUAL from dcim.formfields import MACAddressFormField from dcim.models import Device, DeviceRole, Interface, Platform, Rack, Region, Site from extras.forms import CustomFieldBulkEditForm, CustomFieldForm, CustomFieldFilterForm @@ -21,6 +21,11 @@ from .constants import STATUS_CHOICES from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine +VIFACE_FF_CHOICES = ( + (IFACE_FF_VIRTUAL, 'Virtual'), +) + + # # Cluster types #