views.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. from rest_framework.routers import APIRootView
  2. from dcim.models import Device
  3. from extras.api.mixins import ConfigContextQuerySetMixin, RenderConfigMixin
  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 *
  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, RenderConfigMixin, NetBoxModelViewSet):
  44. queryset = VirtualMachine.objects.prefetch_related(
  45. 'site', 'cluster', 'device', 'role', 'tenant', 'platform', 'primary_ip4', 'primary_ip6', 'config_template',
  46. 'tags', 'virtualdisks',
  47. )
  48. filterset_class = filtersets.VirtualMachineFilterSet
  49. def get_serializer_class(self):
  50. """
  51. Select the specific serializer based on the request context.
  52. If the `brief` query param equates to True, return the NestedVirtualMachineSerializer
  53. If the `exclude` query param includes `config_context` as a value, return the VirtualMachineSerializer
  54. Else, return the VirtualMachineWithConfigContextSerializer
  55. """
  56. request = self.get_serializer_context()['request']
  57. if request.query_params.get('brief', False):
  58. return serializers.NestedVirtualMachineSerializer
  59. elif 'config_context' in request.query_params.get('exclude', []):
  60. return serializers.VirtualMachineSerializer
  61. return serializers.VirtualMachineWithConfigContextSerializer
  62. class VMInterfaceViewSet(NetBoxModelViewSet):
  63. queryset = VMInterface.objects.prefetch_related(
  64. 'virtual_machine', 'parent', 'tags', 'untagged_vlan', 'tagged_vlans', 'vrf', 'ip_addresses',
  65. 'fhrp_group_assignments',
  66. )
  67. serializer_class = serializers.VMInterfaceSerializer
  68. filterset_class = filtersets.VMInterfaceFilterSet
  69. brief_prefetch_fields = ['virtual_machine']
  70. def get_bulk_destroy_queryset(self):
  71. # Ensure child interfaces are deleted prior to their parents
  72. return self.get_queryset().order_by('virtual_machine', 'parent', CollateAsChar('_name'))
  73. class VirtualDiskViewSet(NetBoxModelViewSet):
  74. queryset = VirtualDisk.objects.prefetch_related(
  75. 'virtual_machine', 'tags',
  76. )
  77. serializer_class = serializers.VirtualDiskSerializer
  78. filterset_class = filtersets.VirtualDiskFilterSet
  79. brief_prefetch_fields = ['virtual_machine']