2
0

views.py 4.5 KB

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