views.py 2.8 KB

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