views.py 2.9 KB

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