views.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. from django.db.models import Count
  2. from rest_framework.routers import APIRootView
  3. from dcim.models import Device
  4. from extras.api.views import CustomFieldModelViewSet
  5. from utilities.api import ModelViewSet
  6. from utilities.utils import get_subquery
  7. from virtualization import filters
  8. from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface
  9. from . import serializers
  10. class VirtualizationRootView(APIRootView):
  11. """
  12. Virtualization API root view
  13. """
  14. def get_view_name(self):
  15. return 'Virtualization'
  16. #
  17. # Clusters
  18. #
  19. class ClusterTypeViewSet(ModelViewSet):
  20. queryset = ClusterType.objects.annotate(
  21. cluster_count=Count('clusters')
  22. ).order_by(*ClusterType._meta.ordering)
  23. serializer_class = serializers.ClusterTypeSerializer
  24. filterset_class = filters.ClusterTypeFilterSet
  25. class ClusterGroupViewSet(ModelViewSet):
  26. queryset = ClusterGroup.objects.annotate(
  27. cluster_count=Count('clusters')
  28. ).order_by(*ClusterGroup._meta.ordering)
  29. serializer_class = serializers.ClusterGroupSerializer
  30. filterset_class = filters.ClusterGroupFilterSet
  31. class ClusterViewSet(CustomFieldModelViewSet):
  32. queryset = Cluster.objects.prefetch_related(
  33. 'type', 'group', 'tenant', 'site', 'tags'
  34. ).annotate(
  35. device_count=get_subquery(Device, 'cluster'),
  36. virtualmachine_count=get_subquery(VirtualMachine, 'cluster')
  37. ).order_by(*Cluster._meta.ordering)
  38. serializer_class = serializers.ClusterSerializer
  39. filterset_class = filters.ClusterFilterSet
  40. #
  41. # Virtual machines
  42. #
  43. class VirtualMachineViewSet(CustomFieldModelViewSet):
  44. queryset = VirtualMachine.objects.prefetch_related(
  45. 'cluster__site', 'role', 'tenant', 'platform', 'primary_ip4', 'primary_ip6', 'tags'
  46. )
  47. filterset_class = filters.VirtualMachineFilterSet
  48. def get_serializer_class(self):
  49. """
  50. Select the specific serializer based on the request context.
  51. If the `brief` query param equates to True, return the NestedVirtualMachineSerializer
  52. If the `exclude` query param includes `config_context` as a value, return the VirtualMachineSerializer
  53. Else, return the VirtualMachineWithConfigContextSerializer
  54. """
  55. request = self.get_serializer_context()['request']
  56. if request.query_params.get('brief', False):
  57. return serializers.NestedVirtualMachineSerializer
  58. elif 'config_context' in request.query_params.get('exclude', []):
  59. return serializers.VirtualMachineSerializer
  60. return serializers.VirtualMachineWithConfigContextSerializer
  61. class VMInterfaceViewSet(ModelViewSet):
  62. queryset = VMInterface.objects.prefetch_related(
  63. 'virtual_machine', 'tags', 'tagged_vlans'
  64. )
  65. serializer_class = serializers.VMInterfaceSerializer
  66. filterset_class = filters.VMInterfaceFilterSet