views.py 3.0 KB

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