1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

105 lines
3.5 KiB
Python
Raw Normal View History

from rest_framework.routers import APIRootView
2020-06-22 13:10:56 -04:00
from dcim.models import Device
from extras.api.mixins import ConfigContextQuerySetMixin, RenderConfigMixin
from netbox.api.viewsets import NetBoxModelViewSet
from utilities.query_functions import CollateAsChar
from utilities.utils import count_related
2021-04-29 16:38:56 -04:00
from virtualization import filtersets
from virtualization.models import *
2017-08-08 16:33:34 -04:00
from . import serializers
class VirtualizationRootView(APIRootView):
"""
Virtualization API root view
"""
def get_view_name(self):
return 'Virtualization'
2017-08-08 16:33:34 -04:00
#
# Clusters
#
class ClusterTypeViewSet(NetBoxModelViewSet):
queryset = ClusterType.objects.annotate(
cluster_count=count_related(Cluster, 'type')
).prefetch_related('tags')
2017-08-08 16:33:34 -04:00
serializer_class = serializers.ClusterTypeSerializer
2021-04-29 16:38:56 -04:00
filterset_class = filtersets.ClusterTypeFilterSet
2017-08-08 16:33:34 -04:00
class ClusterGroupViewSet(NetBoxModelViewSet):
queryset = ClusterGroup.objects.annotate(
cluster_count=count_related(Cluster, 'group')
).prefetch_related('tags')
2017-08-08 16:33:34 -04:00
serializer_class = serializers.ClusterGroupSerializer
2021-04-29 16:38:56 -04:00
filterset_class = filtersets.ClusterGroupFilterSet
2017-08-08 16:33:34 -04:00
class ClusterViewSet(NetBoxModelViewSet):
queryset = Cluster.objects.prefetch_related(
2019-10-07 08:29:32 +02:00
'type', 'group', 'tenant', 'site', 'tags'
).annotate(
device_count=count_related(Device, 'cluster'),
virtualmachine_count=count_related(VirtualMachine, 'cluster')
)
2017-08-08 16:33:34 -04:00
serializer_class = serializers.ClusterSerializer
2021-04-29 16:38:56 -04:00
filterset_class = filtersets.ClusterFilterSet
2017-08-08 16:33:34 -04:00
#
# Virtual machines
#
class VirtualMachineViewSet(ConfigContextQuerySetMixin, RenderConfigMixin, NetBoxModelViewSet):
queryset = VirtualMachine.objects.prefetch_related(
'site', 'cluster', 'device', 'role', 'tenant', 'platform', 'primary_ip4', 'primary_ip6', 'config_template',
'tags', 'virtualdisks',
)
2021-04-29 16:38:56 -04:00
filterset_class = filtersets.VirtualMachineFilterSet
2017-08-08 16:33:34 -04:00
def get_serializer_class(self):
"""
Select the specific serializer based on the request context.
If the `brief` query param equates to True, return the NestedVirtualMachineSerializer
If the `exclude` query param includes `config_context` as a value, return the VirtualMachineSerializer
Else, return the VirtualMachineWithConfigContextSerializer
"""
2018-10-04 16:20:01 -04:00
request = self.get_serializer_context()['request']
if request.query_params.get('brief', False):
return serializers.NestedVirtualMachineSerializer
elif 'config_context' in request.query_params.get('exclude', []):
return serializers.VirtualMachineSerializer
return serializers.VirtualMachineWithConfigContextSerializer
2018-06-27 16:02:34 -04:00
2017-08-08 16:33:34 -04:00
2022-03-09 11:09:06 -05:00
class VMInterfaceViewSet(NetBoxModelViewSet):
2020-07-10 10:27:07 -04:00
queryset = VMInterface.objects.prefetch_related(
'virtual_machine', 'parent', 'tags', 'untagged_vlan', 'tagged_vlans', 'vrf', 'ip_addresses',
'fhrp_group_assignments',
)
2020-06-23 15:46:20 -04:00
serializer_class = serializers.VMInterfaceSerializer
2021-04-29 16:38:56 -04:00
filterset_class = filtersets.VMInterfaceFilterSet
brief_prefetch_fields = ['virtual_machine']
def get_bulk_destroy_queryset(self):
# Ensure child interfaces are deleted prior to their parents
return self.get_queryset().order_by('virtual_machine', 'parent', CollateAsChar('_name'))
class VirtualDiskViewSet(NetBoxModelViewSet):
queryset = VirtualDisk.objects.prefetch_related(
'virtual_machine', 'tags',
)
serializer_class = serializers.VirtualDiskSerializer
filterset_class = filtersets.VirtualDiskFilterSet
brief_prefetch_fields = ['virtual_machine']