views.py 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. from rest_framework.routers import APIRootView
  2. from dcim.models import Device
  3. from extras.api.mixins import ConfigContextQuerySetMixin
  4. from netbox.api.viewsets import NetBoxModelViewSet
  5. from utilities.query_functions import CollateAsChar
  6. from utilities.utils import count_related
  7. from virtualization import filtersets
  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(NetBoxModelViewSet):
  20. queryset = ClusterType.objects.annotate(
  21. cluster_count=count_related(Cluster, 'type')
  22. ).prefetch_related('tags')
  23. serializer_class = serializers.ClusterTypeSerializer
  24. filterset_class = filtersets.ClusterTypeFilterSet
  25. class ClusterGroupViewSet(NetBoxModelViewSet):
  26. queryset = ClusterGroup.objects.annotate(
  27. cluster_count=count_related(Cluster, 'group')
  28. ).prefetch_related('tags')
  29. serializer_class = serializers.ClusterGroupSerializer
  30. filterset_class = filtersets.ClusterGroupFilterSet
  31. class ClusterViewSet(NetBoxModelViewSet):
  32. queryset = Cluster.objects.prefetch_related(
  33. 'type', 'group', 'tenant', 'site', 'tags'
  34. ).annotate(
  35. device_count=count_related(Device, 'cluster'),
  36. virtualmachine_count=count_related(VirtualMachine, 'cluster')
  37. )
  38. serializer_class = serializers.ClusterSerializer
  39. filterset_class = filtersets.ClusterFilterSet
  40. #
  41. # Virtual machines
  42. #
  43. class VirtualMachineViewSet(ConfigContextQuerySetMixin, NetBoxModelViewSet):
  44. queryset = VirtualMachine.objects.prefetch_related(
  45. 'site', 'cluster', 'device', 'role', 'tenant', 'platform', 'primary_ip4', 'primary_ip6', 'tags'
  46. )
  47. filterset_class = filtersets.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(NetBoxModelViewSet):
  62. queryset = VMInterface.objects.prefetch_related(
  63. 'virtual_machine', 'parent', 'tags', 'untagged_vlan', 'tagged_vlans', 'vrf', 'ip_addresses',
  64. 'fhrp_group_assignments',
  65. )
  66. serializer_class = serializers.VMInterfaceSerializer
  67. filterset_class = filtersets.VMInterfaceFilterSet
  68. brief_prefetch_fields = ['virtual_machine']
  69. def get_bulk_destroy_queryset(self):
  70. # Ensure child interfaces are deleted prior to their parents
  71. return self.get_queryset().order_by('virtual_machine', 'parent', CollateAsChar('_name'))