diff --git a/netbox/ipam/tests/test_filters.py b/netbox/ipam/tests/test_filters.py index 8382ae409..db9241480 100644 --- a/netbox/ipam/tests/test_filters.py +++ b/netbox/ipam/tests/test_filters.py @@ -4,7 +4,7 @@ from dcim.models import Device, DeviceRole, DeviceType, Interface, Manufacturer, from ipam.choices import * from ipam.filters import * from ipam.models import Aggregate, IPAddress, Prefix, RIR, Role, Service, VLAN, VLANGroup, VRF -from virtualization.models import Cluster, ClusterType, Interface as VMInterface, VirtualMachine +from virtualization.models import Cluster, ClusterType, VirtualMachine, VMInterface from tenancy.models import Tenant, TenantGroup diff --git a/netbox/virtualization/api/serializers.py b/netbox/virtualization/api/serializers.py index a437a000c..d2a13ce7d 100644 --- a/netbox/virtualization/api/serializers.py +++ b/netbox/virtualization/api/serializers.py @@ -10,7 +10,7 @@ from ipam.models import VLAN from tenancy.api.nested_serializers import NestedTenantSerializer from utilities.api import ChoiceField, SerializedPKRelatedField, ValidatedModelSerializer from virtualization.choices import * -from virtualization.models import Cluster, ClusterGroup, ClusterType, Interface, VirtualMachine +from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface from .nested_serializers import * @@ -106,7 +106,7 @@ class InterfaceSerializer(TaggedObjectSerializer, ValidatedModelSerializer): ) class Meta: - model = Interface + model = VMInterface fields = [ 'id', 'virtual_machine', 'name', 'enabled', 'mtu', 'mac_address', 'description', 'mode', 'untagged_vlan', 'tagged_vlans', 'tags', diff --git a/netbox/virtualization/api/views.py b/netbox/virtualization/api/views.py index bcff543a8..8d16e08e1 100644 --- a/netbox/virtualization/api/views.py +++ b/netbox/virtualization/api/views.py @@ -5,7 +5,7 @@ from extras.api.views import CustomFieldModelViewSet from utilities.api import ModelViewSet from utilities.utils import get_subquery from virtualization import filters -from virtualization.models import Cluster, ClusterGroup, ClusterType, Interface, VirtualMachine +from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface from . import serializers @@ -72,7 +72,7 @@ class VirtualMachineViewSet(CustomFieldModelViewSet): class InterfaceViewSet(ModelViewSet): - queryset = Interface.objects.filter( + queryset = VMInterface.objects.filter( virtual_machine__isnull=False ).prefetch_related( 'virtual_machine', 'tags' diff --git a/netbox/virtualization/filters.py b/netbox/virtualization/filters.py index dd1c3e4b2..50bde1b3f 100644 --- a/netbox/virtualization/filters.py +++ b/netbox/virtualization/filters.py @@ -9,7 +9,7 @@ from utilities.filters import ( TreeNodeMultipleChoiceFilter, ) from .choices import * -from .models import Cluster, ClusterGroup, ClusterType, Interface, VirtualMachine +from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface __all__ = ( 'ClusterFilterSet', @@ -222,7 +222,7 @@ class InterfaceFilterSet(BaseFilterSet): ) class Meta: - model = Interface + model = VMInterface fields = ['id', 'name', 'enabled', 'mtu'] def search(self, queryset, name, value): diff --git a/netbox/virtualization/forms.py b/netbox/virtualization/forms.py index 500de821b..ec4b28f04 100644 --- a/netbox/virtualization/forms.py +++ b/netbox/virtualization/forms.py @@ -19,7 +19,7 @@ from utilities.forms import ( StaticSelect2, StaticSelect2Multiple, TagFilterField, BOOLEAN_WITH_BLANK_CHOICES, ) from .choices import * -from .models import Cluster, ClusterGroup, ClusterType, Interface, VirtualMachine +from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface # @@ -600,7 +600,7 @@ class InterfaceForm(BootstrapMixin, forms.ModelForm): ) class Meta: - model = Interface + model = VMInterface fields = [ 'virtual_machine', 'name', 'enabled', 'mac_address', 'mtu', 'description', 'mode', 'tags', 'untagged_vlan', 'tagged_vlans', @@ -717,7 +717,7 @@ class InterfaceCreateForm(BootstrapMixin, forms.Form): class InterfaceBulkEditForm(BootstrapMixin, BulkEditForm): pk = forms.ModelMultipleChoiceField( - queryset=Interface.objects.all(), + queryset=VMInterface.objects.all(), widget=forms.MultipleHiddenInput() ) virtual_machine = forms.ModelChoiceField( @@ -786,7 +786,7 @@ class InterfaceBulkEditForm(BootstrapMixin, BulkEditForm): class InterfaceFilterForm(forms.Form): - model = Interface + model = VMInterface enabled = forms.NullBooleanField( required=False, widget=StaticSelect2( @@ -816,7 +816,7 @@ class VirtualMachineBulkAddComponentForm(BootstrapMixin, forms.Form): class InterfaceBulkCreateForm( - form_from_model(Interface, ['enabled', 'mtu', 'description', 'tags']), + form_from_model(VMInterface, ['enabled', 'mtu', 'description', 'tags']), VirtualMachineBulkAddComponentForm ): pass diff --git a/netbox/virtualization/migrations/0015_interface.py b/netbox/virtualization/migrations/0015_vminterface.py similarity index 96% rename from netbox/virtualization/migrations/0015_interface.py rename to netbox/virtualization/migrations/0015_vminterface.py index 7ad22eeb8..fcda6b4f3 100644 --- a/netbox/virtualization/migrations/0015_interface.py +++ b/netbox/virtualization/migrations/0015_vminterface.py @@ -20,7 +20,7 @@ class Migration(migrations.Migration): operations = [ migrations.CreateModel( - name='Interface', + name='VMInterface', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False)), ('name', models.CharField(max_length=64)), @@ -38,6 +38,7 @@ class Migration(migrations.Migration): options={ 'ordering': ('virtual_machine', utilities.query_functions.CollateAsChar('_name')), 'unique_together': {('virtual_machine', 'name')}, + 'verbose_name': 'interface', }, ), ] diff --git a/netbox/virtualization/migrations/0016_replicate_interfaces.py b/netbox/virtualization/migrations/0016_replicate_interfaces.py index 640e9b02f..2df483e78 100644 --- a/netbox/virtualization/migrations/0016_replicate_interfaces.py +++ b/netbox/virtualization/migrations/0016_replicate_interfaces.py @@ -8,10 +8,10 @@ def replicate_interfaces(apps, schema_editor): TaggedItem = apps.get_model('extras', 'TaggedItem') Interface = apps.get_model('dcim', 'Interface') IPAddress = apps.get_model('ipam', 'IPAddress') - VMInterface = apps.get_model('virtualization', 'Interface') + VMInterface = apps.get_model('virtualization', 'VMInterface') interface_ct = ContentType.objects.get_for_model(Interface) - vm_interface_ct = ContentType.objects.get_for_model(VMInterface) + vminterface_ct = ContentType.objects.get_for_model(VMInterface) # Replicate dcim.Interface instances assigned to VirtualMachines original_interfaces = Interface.objects.filter(virtual_machine__isnull=False) @@ -35,12 +35,12 @@ def replicate_interfaces(apps, schema_editor): TaggedItem.objects.filter( content_type=interface_ct, object_id=interface.pk ).update( - content_type=vm_interface_ct, object_id=vm_interface.pk + content_type=vminterface_ct, object_id=vm_interface.pk ) # Update any assigned IPAddresses IPAddress.objects.filter(assigned_object_id=interface.pk).update( - assigned_object_type=vm_interface_ct, + assigned_object_type=vminterface_ct, assigned_object_id=vm_interface.pk ) @@ -59,7 +59,7 @@ class Migration(migrations.Migration): dependencies = [ ('ipam', '0037_ipaddress_assignment'), - ('virtualization', '0015_interface'), + ('virtualization', '0015_vminterface'), ] operations = [ diff --git a/netbox/virtualization/models.py b/netbox/virtualization/models.py index 2adf821a5..1ef4832a8 100644 --- a/netbox/virtualization/models.py +++ b/netbox/virtualization/models.py @@ -20,8 +20,8 @@ __all__ = ( 'Cluster', 'ClusterGroup', 'ClusterType', - 'Interface', 'VirtualMachine', + 'VMInterface', ) @@ -381,7 +381,7 @@ class VirtualMachine(ChangeLoggedModel, ConfigContextModel, CustomFieldModel): # @extras_features('graphs', 'export_templates', 'webhooks') -class Interface(BaseInterface): +class VMInterface(BaseInterface): virtual_machine = models.ForeignKey( to='virtualization.VirtualMachine', on_delete=models.CASCADE, @@ -423,6 +423,7 @@ class Interface(BaseInterface): ] class Meta: + verbose_name = 'interface' ordering = ('virtual_machine', CollateAsChar('_name')) unique_together = ('virtual_machine', 'name') diff --git a/netbox/virtualization/tables.py b/netbox/virtualization/tables.py index 97831a458..e06714e85 100644 --- a/netbox/virtualization/tables.py +++ b/netbox/virtualization/tables.py @@ -3,7 +3,7 @@ from django_tables2.utils import Accessor from tenancy.tables import COL_TENANT from utilities.tables import BaseTable, ColoredLabelColumn, TagColumn, ToggleColumn -from .models import Cluster, ClusterGroup, ClusterType, Interface, VirtualMachine +from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface CLUSTERTYPE_ACTIONS = """ @@ -175,5 +175,5 @@ class VirtualMachineDetailTable(VirtualMachineTable): class InterfaceTable(BaseTable): class Meta(BaseTable.Meta): - model = Interface + model = VMInterface fields = ('name', 'enabled', 'description') diff --git a/netbox/virtualization/tests/test_api.py b/netbox/virtualization/tests/test_api.py index 3027211f2..bc1b3332c 100644 --- a/netbox/virtualization/tests/test_api.py +++ b/netbox/virtualization/tests/test_api.py @@ -4,7 +4,7 @@ from rest_framework import status from dcim.choices import InterfaceModeChoices from ipam.models import VLAN from utilities.testing import APITestCase, APIViewTestCases -from virtualization.models import Cluster, ClusterGroup, ClusterType, Interface, VirtualMachine +from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface class AppTest(APITestCase): @@ -203,15 +203,15 @@ class InterfaceTest(APITestCase): clustertype = ClusterType.objects.create(name='Test Cluster Type 1', slug='test-cluster-type-1') cluster = Cluster.objects.create(name='Test Cluster 1', type=clustertype) self.virtualmachine = VirtualMachine.objects.create(cluster=cluster, name='Test VM 1') - self.interface1 = Interface.objects.create( + self.interface1 = VMInterface.objects.create( virtual_machine=self.virtualmachine, name='Test Interface 1' ) - self.interface2 = Interface.objects.create( + self.interface2 = VMInterface.objects.create( virtual_machine=self.virtualmachine, name='Test Interface 2' ) - self.interface3 = Interface.objects.create( + self.interface3 = VMInterface.objects.create( virtual_machine=self.virtualmachine, name='Test Interface 3' ) @@ -254,8 +254,8 @@ class InterfaceTest(APITestCase): response = self.client.post(url, data, format='json', **self.header) self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(Interface.objects.count(), 4) - interface4 = Interface.objects.get(pk=response.data['id']) + self.assertEqual(VMInterface.objects.count(), 4) + interface4 = VMInterface.objects.get(pk=response.data['id']) self.assertEqual(interface4.virtual_machine_id, data['virtual_machine']) self.assertEqual(interface4.name, data['name']) @@ -272,7 +272,7 @@ class InterfaceTest(APITestCase): response = self.client.post(url, data, format='json', **self.header) self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(Interface.objects.count(), 4) + self.assertEqual(VMInterface.objects.count(), 4) self.assertEqual(response.data['virtual_machine']['id'], data['virtual_machine']) self.assertEqual(response.data['name'], data['name']) self.assertEqual(response.data['untagged_vlan']['id'], data['untagged_vlan']) @@ -298,7 +298,7 @@ class InterfaceTest(APITestCase): response = self.client.post(url, data, format='json', **self.header) self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(Interface.objects.count(), 6) + self.assertEqual(VMInterface.objects.count(), 6) self.assertEqual(response.data[0]['name'], data[0]['name']) self.assertEqual(response.data[1]['name'], data[1]['name']) self.assertEqual(response.data[2]['name'], data[2]['name']) @@ -332,7 +332,7 @@ class InterfaceTest(APITestCase): response = self.client.post(url, data, format='json', **self.header) self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(Interface.objects.count(), 6) + self.assertEqual(VMInterface.objects.count(), 6) for i in range(0, 3): self.assertEqual(response.data[i]['name'], data[i]['name']) self.assertEqual([v['id'] for v in response.data[i]['tagged_vlans']], data[i]['tagged_vlans']) @@ -348,8 +348,8 @@ class InterfaceTest(APITestCase): response = self.client.put(url, data, format='json', **self.header) self.assertHttpStatus(response, status.HTTP_200_OK) - self.assertEqual(Interface.objects.count(), 3) - interface1 = Interface.objects.get(pk=response.data['id']) + self.assertEqual(VMInterface.objects.count(), 3) + interface1 = VMInterface.objects.get(pk=response.data['id']) self.assertEqual(interface1.name, data['name']) def test_delete_interface(self): @@ -358,4 +358,4 @@ class InterfaceTest(APITestCase): response = self.client.delete(url, **self.header) self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT) - self.assertEqual(Interface.objects.count(), 2) + self.assertEqual(VMInterface.objects.count(), 2) diff --git a/netbox/virtualization/tests/test_filters.py b/netbox/virtualization/tests/test_filters.py index 562ed9901..9fe6b61d5 100644 --- a/netbox/virtualization/tests/test_filters.py +++ b/netbox/virtualization/tests/test_filters.py @@ -4,7 +4,7 @@ from dcim.models import DeviceRole, Platform, Region, Site from tenancy.models import Tenant, TenantGroup from virtualization.choices import * from virtualization.filters import * -from virtualization.models import Cluster, ClusterGroup, ClusterType, Interface, VirtualMachine +from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface class ClusterTypeTestCase(TestCase): @@ -260,11 +260,11 @@ class VirtualMachineTestCase(TestCase): VirtualMachine.objects.bulk_create(vms) interfaces = ( - Interface(virtual_machine=vms[0], name='Interface 1', mac_address='00-00-00-00-00-01'), - Interface(virtual_machine=vms[1], name='Interface 2', mac_address='00-00-00-00-00-02'), - Interface(virtual_machine=vms[2], name='Interface 3', mac_address='00-00-00-00-00-03'), + VMInterface(virtual_machine=vms[0], name='Interface 1', mac_address='00-00-00-00-00-01'), + VMInterface(virtual_machine=vms[1], name='Interface 2', mac_address='00-00-00-00-00-02'), + VMInterface(virtual_machine=vms[2], name='Interface 3', mac_address='00-00-00-00-00-03'), ) - Interface.objects.bulk_create(interfaces) + VMInterface.objects.bulk_create(interfaces) def test_id(self): params = {'id': self.queryset.values_list('pk', flat=True)[:2]} @@ -366,7 +366,7 @@ class VirtualMachineTestCase(TestCase): class InterfaceTestCase(TestCase): - queryset = Interface.objects.all() + queryset = VMInterface.objects.all() filterset = InterfaceFilterSet @classmethod @@ -394,11 +394,11 @@ class InterfaceTestCase(TestCase): VirtualMachine.objects.bulk_create(vms) interfaces = ( - Interface(virtual_machine=vms[0], name='Interface 1', enabled=True, mtu=100, mac_address='00-00-00-00-00-01'), - Interface(virtual_machine=vms[1], name='Interface 2', enabled=True, mtu=200, mac_address='00-00-00-00-00-02'), - Interface(virtual_machine=vms[2], name='Interface 3', enabled=False, mtu=300, mac_address='00-00-00-00-00-03'), + VMInterface(virtual_machine=vms[0], name='Interface 1', enabled=True, mtu=100, mac_address='00-00-00-00-00-01'), + VMInterface(virtual_machine=vms[1], name='Interface 2', enabled=True, mtu=200, mac_address='00-00-00-00-00-02'), + VMInterface(virtual_machine=vms[2], name='Interface 3', enabled=False, mtu=300, mac_address='00-00-00-00-00-03'), ) - Interface.objects.bulk_create(interfaces) + VMInterface.objects.bulk_create(interfaces) def test_id(self): id_list = self.queryset.values_list('id', flat=True)[:2] diff --git a/netbox/virtualization/tests/test_views.py b/netbox/virtualization/tests/test_views.py index fba3e0eac..2a8cc8ca8 100644 --- a/netbox/virtualization/tests/test_views.py +++ b/netbox/virtualization/tests/test_views.py @@ -5,7 +5,7 @@ from dcim.models import DeviceRole, Platform, Site from ipam.models import VLAN from utilities.testing import ViewTestCases from virtualization.choices import * -from virtualization.models import Cluster, ClusterGroup, ClusterType, Interface, VirtualMachine +from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface class ClusterGroupTestCase(ViewTestCases.OrganizationalObjectViewTestCase): @@ -199,7 +199,7 @@ class InterfaceTestCase( ViewTestCases.BulkEditObjectsViewTestCase, ViewTestCases.BulkDeleteObjectsViewTestCase, ): - model = Interface + model = VMInterface @classmethod def setUpTestData(cls): @@ -214,10 +214,10 @@ class InterfaceTestCase( ) VirtualMachine.objects.bulk_create(virtualmachines) - Interface.objects.bulk_create([ - Interface(virtual_machine=virtualmachines[0], name='Interface 1'), - Interface(virtual_machine=virtualmachines[0], name='Interface 2'), - Interface(virtual_machine=virtualmachines[0], name='Interface 3'), + VMInterface.objects.bulk_create([ + VMInterface(virtual_machine=virtualmachines[0], name='Interface 1'), + VMInterface(virtual_machine=virtualmachines[0], name='Interface 2'), + VMInterface(virtual_machine=virtualmachines[0], name='Interface 3'), ]) vlans = ( diff --git a/netbox/virtualization/views.py b/netbox/virtualization/views.py index 4b37b5a66..bb2d8b9bf 100644 --- a/netbox/virtualization/views.py +++ b/netbox/virtualization/views.py @@ -14,7 +14,7 @@ from utilities.views import ( ObjectDeleteView, ObjectEditView, ObjectListView, ) from . import filters, forms, tables -from .models import Cluster, ClusterGroup, ClusterType, Interface, VirtualMachine +from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface # @@ -236,7 +236,7 @@ class VirtualMachineView(ObjectView): def get(self, request, pk): virtualmachine = get_object_or_404(self.queryset, pk=pk) - interfaces = Interface.objects.restrict(request.user, 'view').filter(virtual_machine=virtualmachine) + interfaces = VMInterface.objects.restrict(request.user, 'view').filter(virtual_machine=virtualmachine) services = Service.objects.restrict(request.user, 'view').filter(virtual_machine=virtualmachine) return render(request, 'virtualization/virtualmachine.html', { @@ -290,7 +290,7 @@ class VirtualMachineBulkDeleteView(BulkDeleteView): # class InterfaceListView(ObjectListView): - queryset = Interface.objects.prefetch_related('virtual_machine', 'virtual_machine__tenant', 'cable') + queryset = VMInterface.objects.prefetch_related('virtual_machine', 'virtual_machine__tenant', 'cable') filterset = filters.InterfaceFilterSet filterset_form = forms.InterfaceFilterForm table = tables.InterfaceTable @@ -298,7 +298,7 @@ class InterfaceListView(ObjectListView): class InterfaceView(ObjectView): - queryset = Interface.objects.all() + queryset = VMInterface.objects.all() def get(self, request, pk): @@ -333,30 +333,30 @@ class InterfaceView(ObjectView): # TODO: This should not use ComponentCreateView class InterfaceCreateView(ComponentCreateView): - queryset = Interface.objects.all() + queryset = VMInterface.objects.all() form = forms.InterfaceCreateForm model_form = forms.InterfaceForm template_name = 'virtualization/virtualmachine_component_add.html' class InterfaceEditView(ObjectEditView): - queryset = Interface.objects.all() + queryset = VMInterface.objects.all() model_form = forms.InterfaceForm template_name = 'virtualization/interface_edit.html' class InterfaceDeleteView(ObjectDeleteView): - queryset = Interface.objects.all() + queryset = VMInterface.objects.all() class InterfaceBulkEditView(BulkEditView): - queryset = Interface.objects.all() + queryset = VMInterface.objects.all() table = tables.InterfaceTable form = forms.InterfaceBulkEditForm class InterfaceBulkDeleteView(BulkDeleteView): - queryset = Interface.objects.all() + queryset = VMInterface.objects.all() table = tables.InterfaceTable @@ -368,7 +368,7 @@ class VirtualMachineBulkAddInterfaceView(BulkComponentCreateView): parent_model = VirtualMachine parent_field = 'virtual_machine' form = forms.InterfaceBulkCreateForm - queryset = Interface.objects.all() + queryset = VMInterface.objects.all() model_form = forms.InterfaceForm filterset = filters.VirtualMachineFilterSet table = tables.VirtualMachineTable