diff --git a/netbox/virtualization/api/serializers.py b/netbox/virtualization/api/serializers.py index c9fa559aa..e3838594b 100644 --- a/netbox/virtualization/api/serializers.py +++ b/netbox/virtualization/api/serializers.py @@ -14,7 +14,7 @@ from netbox.api.fields import ChoiceField, SerializedPKRelatedField from netbox.api.serializers import NetBoxModelSerializer from tenancy.api.nested_serializers import NestedTenantSerializer from virtualization.choices import * -from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface +from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualDisk, VirtualMachine, VMInterface from .nested_serializers import * @@ -159,3 +159,18 @@ class VMInterfaceSerializer(NetBoxModelSerializer): }) return super().validate(data) + + +# +# Virtual Disk +# + +class VirtualDiskSerializer(NetBoxModelSerializer): + virtual_machine = NestedVirtualMachineSerializer() + + class Meta: + model = VirtualDisk + fields = [ + 'id', 'virtual_machine', 'size', 'tags', 'custom_fields', + 'created', 'last_updated', + ] diff --git a/netbox/virtualization/api/urls.py b/netbox/virtualization/api/urls.py index 2ceeb8ce6..ce71605a1 100644 --- a/netbox/virtualization/api/urls.py +++ b/netbox/virtualization/api/urls.py @@ -13,6 +13,7 @@ router.register('clusters', views.ClusterViewSet) # VirtualMachines router.register('virtual-machines', views.VirtualMachineViewSet) router.register('interfaces', views.VMInterfaceViewSet) +router.register('virtual-disks', views.VirtualDiskViewSet) app_name = 'virtualization-api' urlpatterns = router.urls diff --git a/netbox/virtualization/api/views.py b/netbox/virtualization/api/views.py index 5b9cf4117..8e8005fcd 100644 --- a/netbox/virtualization/api/views.py +++ b/netbox/virtualization/api/views.py @@ -5,7 +5,7 @@ from extras.api.mixins import ConfigContextQuerySetMixin from netbox.api.viewsets import NetBoxModelViewSet from utilities.utils import count_related from virtualization import filtersets -from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface +from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualDisk, VirtualMachine, VMInterface from . import serializers @@ -87,3 +87,12 @@ class VMInterfaceViewSet(NetBoxModelViewSet): serializer_class = serializers.VMInterfaceSerializer filterset_class = filtersets.VMInterfaceFilterSet brief_prefetch_fields = ['virtual_machine'] + + +class VirtualDiskViewSet(NetBoxModelViewSet): + queryset = VirtualDisk.objects.prefetch_related( + 'virtual_machine', 'tags', + ) + serializer_class = serializers.VirtualDiskSerializer + filterset_class = filtersets.VirtualDiskFilterSet + brief_prefetch_fields = ['virtual_machine'] diff --git a/netbox/virtualization/forms/filtersets.py b/netbox/virtualization/forms/filtersets.py index 49cf624df..1a2b63ba5 100644 --- a/netbox/virtualization/forms/filtersets.py +++ b/netbox/virtualization/forms/filtersets.py @@ -228,14 +228,11 @@ class VirtualDiskFilterForm(NetBoxModelFilterSetForm): model = VirtualDisk fieldsets = ( (None, ('q', 'filter_id', 'tag')), - (_('Virtual Machine'), ('virtual_machine_id')), + # (_('Virtual Machine'), ('virtual_machine_id')), ) virtual_machine_id = DynamicModelMultipleChoiceField( queryset=VirtualMachine.objects.all(), required=False, - query_params={ - 'cluster_id': '$cluster_id' - }, label=_('Virtual machine') ) tag = TagFilterField(model) diff --git a/netbox/virtualization/forms/model_forms.py b/netbox/virtualization/forms/model_forms.py index 215ee5c2f..bbca300f4 100644 --- a/netbox/virtualization/forms/model_forms.py +++ b/netbox/virtualization/forms/model_forms.py @@ -360,7 +360,7 @@ class VirtualDiskForm(NetBoxModelForm): ) fieldsets = ( - (_(''), ('virtual_machine', 'name', 'size', 'tags')), + (None, ('virtual_machine', 'name', 'size', 'tags')), ) class Meta: diff --git a/netbox/virtualization/models/virtualmachines.py b/netbox/virtualization/models/virtualmachines.py index d5a570e7e..67638c38c 100644 --- a/netbox/virtualization/models/virtualmachines.py +++ b/netbox/virtualization/models/virtualmachines.py @@ -390,10 +390,9 @@ class VirtualDisk(NetBoxModel, TrackingModelMixin): blank=True ) size = models.PositiveIntegerField( - verbose_name=_('size'), + verbose_name=_('size (GB)'), blank=True, null=True, - help_text=_("Size") ) class Meta: diff --git a/netbox/virtualization/views.py b/netbox/virtualization/views.py index 3c6f5c567..ab14921ae 100644 --- a/netbox/virtualization/views.py +++ b/netbox/virtualization/views.py @@ -591,35 +591,6 @@ class VirtualDiskListView(generic.ObjectListView): class VirtualDiskView(generic.ObjectView): queryset = VirtualDisk.objects.all() - def get_extra_context(self, request, instance): - - # Get child interfaces - child_interfaces = VirtualDisk.objects.restrict(request.user, 'view').filter(parent=instance) - child_interfaces_tables = tables.VirtualDiskTable( - child_interfaces, - exclude=('virtual_machine',), - orderable=False - ) - - # Get assigned VLANs and annotate whether each is tagged or untagged - vlans = [] - if instance.untagged_vlan is not None: - vlans.append(instance.untagged_vlan) - vlans[0].tagged = False - for vlan in instance.tagged_vlans.restrict(request.user).prefetch_related('site', 'group', 'tenant', 'role'): - vlan.tagged = True - vlans.append(vlan) - vlan_table = InterfaceVLANTable( - interface=instance, - data=vlans, - orderable=False - ) - - return { - 'child_interfaces_table': child_interfaces_tables, - 'vlan_table': vlan_table, - } - # class VirtualDiskCreateView(generic.ComponentCreateView): # queryset = VirtualDisk.objects.all()