views.py 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. from django.db.models import Sum
  2. from rest_framework.routers import APIRootView
  3. from extras.api.mixins import ConfigContextQuerySetMixin, RenderConfigMixin
  4. from netbox.api.viewsets import NetBoxModelViewSet
  5. from utilities.query_functions import CollateAsChar
  6. from virtualization import filtersets
  7. from virtualization.models import *
  8. from . import serializers
  9. class VirtualizationRootView(APIRootView):
  10. """
  11. Virtualization API root view
  12. """
  13. def get_view_name(self):
  14. return 'Virtualization'
  15. #
  16. # Clusters
  17. #
  18. class ClusterTypeViewSet(NetBoxModelViewSet):
  19. queryset = ClusterType.objects.all()
  20. serializer_class = serializers.ClusterTypeSerializer
  21. filterset_class = filtersets.ClusterTypeFilterSet
  22. class ClusterGroupViewSet(NetBoxModelViewSet):
  23. queryset = ClusterGroup.objects.all()
  24. serializer_class = serializers.ClusterGroupSerializer
  25. filterset_class = filtersets.ClusterGroupFilterSet
  26. class ClusterViewSet(NetBoxModelViewSet):
  27. queryset = Cluster.objects.prefetch_related('virtual_machines').annotate(
  28. allocated_vcpus=Sum('virtual_machines__vcpus'),
  29. allocated_memory=Sum('virtual_machines__memory'),
  30. allocated_disk=Sum('virtual_machines__disk'),
  31. )
  32. serializer_class = serializers.ClusterSerializer
  33. filterset_class = filtersets.ClusterFilterSet
  34. #
  35. # Virtual machines
  36. #
  37. class VirtualMachineViewSet(ConfigContextQuerySetMixin, RenderConfigMixin, NetBoxModelViewSet):
  38. queryset = VirtualMachine.objects.all()
  39. filterset_class = filtersets.VirtualMachineFilterSet
  40. def get_serializer_class(self):
  41. """
  42. Select the specific serializer based on the request context.
  43. If the `brief` query param equates to True, return the NestedVirtualMachineSerializer
  44. If the `exclude` query param includes `config_context` as a value, return the VirtualMachineSerializer
  45. Else, return the VirtualMachineWithConfigContextSerializer
  46. """
  47. request = self.get_serializer_context()['request']
  48. if self.brief or 'config_context' in request.query_params.get('exclude', []):
  49. return serializers.VirtualMachineSerializer
  50. return serializers.VirtualMachineWithConfigContextSerializer
  51. class VMInterfaceViewSet(NetBoxModelViewSet):
  52. queryset = VMInterface.objects.prefetch_related(
  53. 'l2vpn_terminations', # Referenced by VMInterfaceSerializer.l2vpn_termination
  54. 'ip_addresses', # Referenced by VMInterface.count_ipaddresses()
  55. 'fhrp_group_assignments', # Referenced by VMInterface.count_fhrp_groups()
  56. )
  57. serializer_class = serializers.VMInterfaceSerializer
  58. filterset_class = filtersets.VMInterfaceFilterSet
  59. def get_bulk_destroy_queryset(self):
  60. # Ensure child interfaces are deleted prior to their parents
  61. return self.get_queryset().order_by('virtual_machine', 'parent', CollateAsChar('_name'))
  62. class VirtualDiskViewSet(NetBoxModelViewSet):
  63. queryset = VirtualDisk.objects.all()
  64. serializer_class = serializers.VirtualDiskSerializer
  65. filterset_class = filtersets.VirtualDiskFilterSet