Browse Source

Fixes #1554: Don't require form_factor when creating an interface assigned to a virtual machine

Jeremy Stretch 7 years ago
parent
commit
100d979d3e

+ 4 - 6
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)',

+ 2 - 2
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

+ 3 - 3
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

+ 6 - 1
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
 #