views.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. from rest_framework.routers import APIRootView
  2. from dcim.models import Site
  3. from extras.api.views import CustomFieldModelViewSet
  4. from ipam import filtersets
  5. from ipam.models import *
  6. from netbox.api.views import ModelViewSet
  7. from utilities.utils import count_related
  8. from . import mixins, serializers
  9. class IPAMRootView(APIRootView):
  10. """
  11. IPAM API root view
  12. """
  13. def get_view_name(self):
  14. return 'IPAM'
  15. #
  16. # ASNs
  17. #
  18. class ASNViewSet(CustomFieldModelViewSet):
  19. queryset = ASN.objects.prefetch_related('tenant', 'rir').annotate(site_count=count_related(Site, 'asns'))
  20. serializer_class = serializers.ASNSerializer
  21. filterset_class = filtersets.ASNFilterSet
  22. #
  23. # VRFs
  24. #
  25. class VRFViewSet(CustomFieldModelViewSet):
  26. queryset = VRF.objects.prefetch_related('tenant').prefetch_related(
  27. 'import_targets', 'export_targets', 'tags'
  28. ).annotate(
  29. ipaddress_count=count_related(IPAddress, 'vrf'),
  30. prefix_count=count_related(Prefix, 'vrf')
  31. )
  32. serializer_class = serializers.VRFSerializer
  33. filterset_class = filtersets.VRFFilterSet
  34. #
  35. # Route targets
  36. #
  37. class RouteTargetViewSet(CustomFieldModelViewSet):
  38. queryset = RouteTarget.objects.prefetch_related('tenant').prefetch_related('tags')
  39. serializer_class = serializers.RouteTargetSerializer
  40. filterset_class = filtersets.RouteTargetFilterSet
  41. #
  42. # RIRs
  43. #
  44. class RIRViewSet(CustomFieldModelViewSet):
  45. queryset = RIR.objects.annotate(
  46. aggregate_count=count_related(Aggregate, 'rir')
  47. ).prefetch_related('tags')
  48. serializer_class = serializers.RIRSerializer
  49. filterset_class = filtersets.RIRFilterSet
  50. #
  51. # Aggregates
  52. #
  53. class AggregateViewSet(CustomFieldModelViewSet):
  54. queryset = Aggregate.objects.prefetch_related('rir').prefetch_related('tags')
  55. serializer_class = serializers.AggregateSerializer
  56. filterset_class = filtersets.AggregateFilterSet
  57. #
  58. # Roles
  59. #
  60. class RoleViewSet(CustomFieldModelViewSet):
  61. queryset = Role.objects.annotate(
  62. prefix_count=count_related(Prefix, 'role'),
  63. vlan_count=count_related(VLAN, 'role')
  64. ).prefetch_related('tags')
  65. serializer_class = serializers.RoleSerializer
  66. filterset_class = filtersets.RoleFilterSet
  67. #
  68. # Prefixes
  69. #
  70. class PrefixViewSet(mixins.AvailableIPsMixin, mixins.AvailablePrefixesMixin, CustomFieldModelViewSet):
  71. queryset = Prefix.objects.prefetch_related(
  72. 'site', 'vrf__tenant', 'tenant', 'vlan', 'role', 'tags'
  73. )
  74. serializer_class = serializers.PrefixSerializer
  75. filterset_class = filtersets.PrefixFilterSet
  76. parent_model = Prefix # AvailableIPsMixin
  77. def get_serializer_class(self):
  78. if self.action == "available_prefixes" and self.request.method == "POST":
  79. return serializers.PrefixLengthSerializer
  80. return super().get_serializer_class()
  81. #
  82. # IP ranges
  83. #
  84. class IPRangeViewSet(mixins.AvailableIPsMixin, CustomFieldModelViewSet):
  85. queryset = IPRange.objects.prefetch_related('vrf', 'role', 'tenant', 'tags')
  86. serializer_class = serializers.IPRangeSerializer
  87. filterset_class = filtersets.IPRangeFilterSet
  88. parent_model = IPRange # AvailableIPsMixin
  89. #
  90. # IP addresses
  91. #
  92. class IPAddressViewSet(CustomFieldModelViewSet):
  93. queryset = IPAddress.objects.prefetch_related(
  94. 'vrf__tenant', 'tenant', 'nat_inside', 'nat_outside', 'tags', 'assigned_object'
  95. )
  96. serializer_class = serializers.IPAddressSerializer
  97. filterset_class = filtersets.IPAddressFilterSet
  98. #
  99. # FHRP groups
  100. #
  101. class FHRPGroupViewSet(CustomFieldModelViewSet):
  102. queryset = FHRPGroup.objects.prefetch_related('ip_addresses', 'tags')
  103. serializer_class = serializers.FHRPGroupSerializer
  104. filterset_class = filtersets.FHRPGroupFilterSet
  105. brief_prefetch_fields = ('ip_addresses',)
  106. class FHRPGroupAssignmentViewSet(CustomFieldModelViewSet):
  107. queryset = FHRPGroupAssignment.objects.prefetch_related('group', 'interface')
  108. serializer_class = serializers.FHRPGroupAssignmentSerializer
  109. filterset_class = filtersets.FHRPGroupAssignmentFilterSet
  110. #
  111. # VLAN groups
  112. #
  113. class VLANGroupViewSet(CustomFieldModelViewSet):
  114. queryset = VLANGroup.objects.annotate(
  115. vlan_count=count_related(VLAN, 'group')
  116. ).prefetch_related('tags')
  117. serializer_class = serializers.VLANGroupSerializer
  118. filterset_class = filtersets.VLANGroupFilterSet
  119. #
  120. # VLANs
  121. #
  122. class VLANViewSet(CustomFieldModelViewSet):
  123. queryset = VLAN.objects.prefetch_related(
  124. 'site', 'group', 'tenant', 'role', 'tags'
  125. ).annotate(
  126. prefix_count=count_related(Prefix, 'vlan')
  127. )
  128. serializer_class = serializers.VLANSerializer
  129. filterset_class = filtersets.VLANFilterSet
  130. #
  131. # Services
  132. #
  133. class ServiceViewSet(ModelViewSet):
  134. queryset = Service.objects.prefetch_related(
  135. 'device', 'virtual_machine', 'tags', 'ipaddresses'
  136. )
  137. serializer_class = serializers.ServiceSerializer
  138. filterset_class = filtersets.ServiceFilterSet