views.py 2.9 KB

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