serializers.py 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. from django.contrib.contenttypes.models import ContentType
  2. from drf_spectacular.utils import extend_schema_field
  3. from rest_framework import serializers
  4. from ipam.api.nested_serializers import NestedIPAddressSerializer, NestedRouteTargetSerializer
  5. from ipam.models import RouteTarget
  6. from netbox.api.fields import ChoiceField, ContentTypeField, SerializedPKRelatedField
  7. from netbox.api.serializers import NetBoxModelSerializer
  8. from netbox.constants import NESTED_SERIALIZER_PREFIX
  9. from tenancy.api.nested_serializers import NestedTenantSerializer
  10. from utilities.api import get_serializer_for_model
  11. from vpn.choices import *
  12. from vpn.models import *
  13. from .nested_serializers import *
  14. __all__ = (
  15. 'IKEPolicySerializer',
  16. 'IKEProposalSerializer',
  17. 'IPSecPolicySerializer',
  18. 'IPSecProfileSerializer',
  19. 'IPSecProposalSerializer',
  20. 'L2VPNSerializer',
  21. 'L2VPNTerminationSerializer',
  22. 'TunnelGroupSerializer',
  23. 'TunnelSerializer',
  24. 'TunnelTerminationSerializer',
  25. )
  26. class TunnelGroupSerializer(NetBoxModelSerializer):
  27. url = serializers.HyperlinkedIdentityField(view_name='vpn-api:tunnelgroup-detail')
  28. tunnel_count = serializers.IntegerField(read_only=True)
  29. class Meta:
  30. model = TunnelGroup
  31. fields = [
  32. 'id', 'url', 'display', 'name', 'slug', 'description', 'tags', 'custom_fields', 'created', 'last_updated',
  33. 'tunnel_count',
  34. ]
  35. class TunnelSerializer(NetBoxModelSerializer):
  36. url = serializers.HyperlinkedIdentityField(
  37. view_name='vpn-api:tunnel-detail'
  38. )
  39. status = ChoiceField(
  40. choices=TunnelStatusChoices
  41. )
  42. group = NestedTunnelGroupSerializer()
  43. encapsulation = ChoiceField(
  44. choices=TunnelEncapsulationChoices
  45. )
  46. ipsec_profile = NestedIPSecProfileSerializer(
  47. required=False,
  48. allow_null=True
  49. )
  50. tenant = NestedTenantSerializer(
  51. required=False,
  52. allow_null=True
  53. )
  54. class Meta:
  55. model = Tunnel
  56. fields = (
  57. 'id', 'url', 'display', 'name', 'status', 'group', 'encapsulation', 'ipsec_profile', 'tenant', 'tunnel_id',
  58. 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated',
  59. )
  60. class TunnelTerminationSerializer(NetBoxModelSerializer):
  61. url = serializers.HyperlinkedIdentityField(
  62. view_name='vpn-api:tunneltermination-detail'
  63. )
  64. tunnel = NestedTunnelSerializer()
  65. role = ChoiceField(
  66. choices=TunnelTerminationRoleChoices
  67. )
  68. termination_type = ContentTypeField(
  69. queryset=ContentType.objects.all()
  70. )
  71. termination = serializers.SerializerMethodField(
  72. read_only=True
  73. )
  74. outside_ip = NestedIPAddressSerializer(
  75. required=False,
  76. allow_null=True
  77. )
  78. class Meta:
  79. model = TunnelTermination
  80. fields = (
  81. 'id', 'url', 'display', 'tunnel', 'role', 'termination_type', 'termination_id', 'termination', 'outside_ip',
  82. 'tags', 'custom_fields', 'created', 'last_updated',
  83. )
  84. @extend_schema_field(serializers.JSONField(allow_null=True))
  85. def get_termination(self, obj):
  86. serializer = get_serializer_for_model(obj.termination, prefix=NESTED_SERIALIZER_PREFIX)
  87. context = {'request': self.context['request']}
  88. return serializer(obj.termination, context=context).data
  89. class IKEProposalSerializer(NetBoxModelSerializer):
  90. url = serializers.HyperlinkedIdentityField(
  91. view_name='vpn-api:ikeproposal-detail'
  92. )
  93. authentication_method = ChoiceField(
  94. choices=AuthenticationMethodChoices
  95. )
  96. encryption_algorithm = ChoiceField(
  97. choices=EncryptionAlgorithmChoices
  98. )
  99. authentication_algorithm = ChoiceField(
  100. choices=AuthenticationAlgorithmChoices
  101. )
  102. group = ChoiceField(
  103. choices=DHGroupChoices
  104. )
  105. class Meta:
  106. model = IKEProposal
  107. fields = (
  108. 'id', 'url', 'display', 'name', 'description', 'authentication_method', 'encryption_algorithm',
  109. 'authentication_algorithm', 'group', 'sa_lifetime', 'comments', 'tags', 'custom_fields', 'created',
  110. 'last_updated',
  111. )
  112. class IKEPolicySerializer(NetBoxModelSerializer):
  113. url = serializers.HyperlinkedIdentityField(
  114. view_name='vpn-api:ikepolicy-detail'
  115. )
  116. version = ChoiceField(
  117. choices=IKEVersionChoices
  118. )
  119. mode = ChoiceField(
  120. choices=IKEModeChoices
  121. )
  122. proposals = SerializedPKRelatedField(
  123. queryset=IKEProposal.objects.all(),
  124. serializer=NestedIKEProposalSerializer,
  125. required=False,
  126. many=True
  127. )
  128. class Meta:
  129. model = IKEPolicy
  130. fields = (
  131. 'id', 'url', 'display', 'name', 'description', 'version', 'mode', 'proposals', 'preshared_key', 'comments',
  132. 'tags', 'custom_fields', 'created', 'last_updated',
  133. )
  134. class IPSecProposalSerializer(NetBoxModelSerializer):
  135. url = serializers.HyperlinkedIdentityField(
  136. view_name='vpn-api:ipsecproposal-detail'
  137. )
  138. encryption_algorithm = ChoiceField(
  139. choices=EncryptionAlgorithmChoices
  140. )
  141. authentication_algorithm = ChoiceField(
  142. choices=AuthenticationAlgorithmChoices
  143. )
  144. class Meta:
  145. model = IPSecProposal
  146. fields = (
  147. 'id', 'url', 'display', 'name', 'description', 'encryption_algorithm', 'authentication_algorithm',
  148. 'sa_lifetime_seconds', 'sa_lifetime_data', 'comments', 'tags', 'custom_fields', 'created', 'last_updated',
  149. )
  150. class IPSecPolicySerializer(NetBoxModelSerializer):
  151. url = serializers.HyperlinkedIdentityField(
  152. view_name='vpn-api:ipsecpolicy-detail'
  153. )
  154. proposals = SerializedPKRelatedField(
  155. queryset=IPSecProposal.objects.all(),
  156. serializer=NestedIPSecProposalSerializer,
  157. required=False,
  158. many=True
  159. )
  160. pfs_group = ChoiceField(
  161. choices=DHGroupChoices,
  162. required=False
  163. )
  164. class Meta:
  165. model = IPSecPolicy
  166. fields = (
  167. 'id', 'url', 'display', 'name', 'description', 'proposals', 'pfs_group', 'comments', 'tags',
  168. 'custom_fields', 'created', 'last_updated',
  169. )
  170. class IPSecProfileSerializer(NetBoxModelSerializer):
  171. url = serializers.HyperlinkedIdentityField(
  172. view_name='vpn-api:ipsecprofile-detail'
  173. )
  174. mode = ChoiceField(
  175. choices=IPSecModeChoices
  176. )
  177. ike_policy = NestedIKEPolicySerializer()
  178. ipsec_policy = NestedIPSecPolicySerializer()
  179. class Meta:
  180. model = IPSecProfile
  181. fields = (
  182. 'id', 'url', 'display', 'name', 'description', 'mode', 'ike_policy', 'ipsec_policy', 'comments', 'tags',
  183. 'custom_fields', 'created', 'last_updated',
  184. )
  185. #
  186. # L2VPN
  187. #
  188. class L2VPNSerializer(NetBoxModelSerializer):
  189. url = serializers.HyperlinkedIdentityField(view_name='vpn-api:l2vpn-detail')
  190. type = ChoiceField(choices=L2VPNTypeChoices, required=False)
  191. import_targets = SerializedPKRelatedField(
  192. queryset=RouteTarget.objects.all(),
  193. serializer=NestedRouteTargetSerializer,
  194. required=False,
  195. many=True
  196. )
  197. export_targets = SerializedPKRelatedField(
  198. queryset=RouteTarget.objects.all(),
  199. serializer=NestedRouteTargetSerializer,
  200. required=False,
  201. many=True
  202. )
  203. tenant = NestedTenantSerializer(required=False, allow_null=True)
  204. class Meta:
  205. model = L2VPN
  206. fields = [
  207. 'id', 'url', 'display', 'identifier', 'name', 'slug', 'type', 'import_targets', 'export_targets',
  208. 'description', 'comments', 'tenant', 'tags', 'custom_fields', 'created', 'last_updated'
  209. ]
  210. class L2VPNTerminationSerializer(NetBoxModelSerializer):
  211. url = serializers.HyperlinkedIdentityField(view_name='vpn-api:l2vpntermination-detail')
  212. l2vpn = NestedL2VPNSerializer()
  213. assigned_object_type = ContentTypeField(
  214. queryset=ContentType.objects.all()
  215. )
  216. assigned_object = serializers.SerializerMethodField(read_only=True)
  217. class Meta:
  218. model = L2VPNTermination
  219. fields = [
  220. 'id', 'url', 'display', 'l2vpn', 'assigned_object_type', 'assigned_object_id',
  221. 'assigned_object', 'tags', 'custom_fields', 'created', 'last_updated'
  222. ]
  223. @extend_schema_field(serializers.JSONField(allow_null=True))
  224. def get_assigned_object(self, instance):
  225. serializer = get_serializer_for_model(instance.assigned_object, prefix=NESTED_SERIALIZER_PREFIX)
  226. context = {'request': self.context['request']}
  227. return serializer(instance.assigned_object, context=context).data