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

97 lines
3.4 KiB
Python
Raw Normal View History

2020-06-29 12:18:59 -04:00
from django.db.models import Count, Prefetch
from django.shortcuts import get_object_or_404
from rest_framework.decorators import action
from rest_framework.response import Response
2020-06-22 13:10:56 -04:00
from dcim.models import Device
from extras.api.serializers import RenderedGraphSerializer
2017-08-08 16:33:34 -04:00
from extras.api.views import CustomFieldModelViewSet
from extras.models import Graph
2020-06-29 12:18:59 -04:00
from ipam.models import VLAN
2020-03-12 10:48:17 -04:00
from utilities.api import ModelViewSet
from utilities.utils import get_subquery
2017-08-16 17:00:17 -04:00
from virtualization import filters
2020-06-23 13:16:21 -04:00
from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface
2017-08-08 16:33:34 -04:00
from . import serializers
#
# Clusters
#
class ClusterTypeViewSet(ModelViewSet):
queryset = ClusterType.objects.annotate(
cluster_count=Count('clusters')
).order_by(*ClusterType._meta.ordering)
2017-08-08 16:33:34 -04:00
serializer_class = serializers.ClusterTypeSerializer
2020-01-09 20:42:32 -05:00
filterset_class = filters.ClusterTypeFilterSet
2017-08-08 16:33:34 -04:00
class ClusterGroupViewSet(ModelViewSet):
queryset = ClusterGroup.objects.annotate(
cluster_count=Count('clusters')
).order_by(*ClusterGroup._meta.ordering)
2017-08-08 16:33:34 -04:00
serializer_class = serializers.ClusterGroupSerializer
2020-01-09 20:42:32 -05:00
filterset_class = filters.ClusterGroupFilterSet
2017-08-08 16:33:34 -04:00
class ClusterViewSet(CustomFieldModelViewSet):
queryset = Cluster.objects.prefetch_related(
2019-10-07 08:29:32 +02:00
'type', 'group', 'tenant', 'site', 'tags'
).annotate(
device_count=get_subquery(Device, 'cluster'),
virtualmachine_count=get_subquery(VirtualMachine, 'cluster')
).order_by(*Cluster._meta.ordering)
2017-08-08 16:33:34 -04:00
serializer_class = serializers.ClusterSerializer
2020-01-09 20:42:32 -05:00
filterset_class = filters.ClusterFilterSet
2017-08-08 16:33:34 -04:00
#
# Virtual machines
#
class VirtualMachineViewSet(CustomFieldModelViewSet):
queryset = VirtualMachine.objects.prefetch_related(
'cluster__site', 'role', 'tenant', 'platform', 'primary_ip4', 'primary_ip6', 'tags'
)
2020-01-09 20:42:32 -05:00
filterset_class = filters.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
2020-06-24 10:09:22 -04:00
class VMInterfaceViewSet(ModelViewSet):
2020-07-10 10:27:07 -04:00
queryset = VMInterface.objects.prefetch_related(
2020-06-29 12:18:59 -04:00
Prefetch('tagged_vlans', queryset=VLAN.objects.unrestricted()),
'virtual_machine', 'tags'
)
2020-06-23 15:46:20 -04:00
serializer_class = serializers.VMInterfaceSerializer
2020-06-23 16:39:43 -04:00
filterset_class = filters.VMInterfaceFilterSet
@action(detail=True)
def graphs(self, request, pk):
"""
A convenience method for rendering graphs for a particular VM interface.
"""
vminterface = get_object_or_404(self.queryset, pk=pk)
queryset = Graph.objects.restrict(request.user).filter(type__model='vminterface')
serializer = RenderedGraphSerializer(queryset, many=True, context={'graphed_object': vminterface})
return Response(serializer.data)