serializers.py 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  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. required=False,
  44. allow_null=True
  45. )
  46. encapsulation = ChoiceField(
  47. choices=TunnelEncapsulationChoices
  48. )
  49. ipsec_profile = NestedIPSecProfileSerializer(
  50. required=False,
  51. allow_null=True
  52. )
  53. tenant = NestedTenantSerializer(
  54. required=False,
  55. allow_null=True
  56. )
  57. class Meta:
  58. model = Tunnel
  59. fields = (
  60. 'id', 'url', 'display', 'name', 'status', 'group', 'encapsulation', 'ipsec_profile', 'tenant', 'tunnel_id',
  61. 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated',
  62. )
  63. class TunnelTerminationSerializer(NetBoxModelSerializer):
  64. url = serializers.HyperlinkedIdentityField(
  65. view_name='vpn-api:tunneltermination-detail'
  66. )
  67. tunnel = NestedTunnelSerializer()
  68. role = ChoiceField(
  69. choices=TunnelTerminationRoleChoices
  70. )
  71. termination_type = ContentTypeField(
  72. queryset=ContentType.objects.all()
  73. )
  74. termination = serializers.SerializerMethodField(
  75. read_only=True
  76. )
  77. outside_ip = NestedIPAddressSerializer(
  78. required=False,
  79. allow_null=True
  80. )
  81. class Meta:
  82. model = TunnelTermination
  83. fields = (
  84. 'id', 'url', 'display', 'tunnel', 'role', 'termination_type', 'termination_id', 'termination', 'outside_ip',
  85. 'tags', 'custom_fields', 'created', 'last_updated',
  86. )
  87. @extend_schema_field(serializers.JSONField(allow_null=True))
  88. def get_termination(self, obj):
  89. if not obj.termination:
  90. return None
  91. serializer = get_serializer_for_model(obj.termination, prefix=NESTED_SERIALIZER_PREFIX)
  92. context = {'request': self.context['request']}
  93. return serializer(obj.termination, context=context).data
  94. class IKEProposalSerializer(NetBoxModelSerializer):
  95. url = serializers.HyperlinkedIdentityField(
  96. view_name='vpn-api:ikeproposal-detail'
  97. )
  98. authentication_method = ChoiceField(
  99. choices=AuthenticationMethodChoices
  100. )
  101. encryption_algorithm = ChoiceField(
  102. choices=EncryptionAlgorithmChoices
  103. )
  104. authentication_algorithm = ChoiceField(
  105. choices=AuthenticationAlgorithmChoices
  106. )
  107. group = ChoiceField(
  108. choices=DHGroupChoices
  109. )
  110. class Meta:
  111. model = IKEProposal
  112. fields = (
  113. 'id', 'url', 'display', 'name', 'description', 'authentication_method', 'encryption_algorithm',
  114. 'authentication_algorithm', 'group', 'sa_lifetime', 'comments', 'tags', 'custom_fields', 'created',
  115. 'last_updated',
  116. )
  117. class IKEPolicySerializer(NetBoxModelSerializer):
  118. url = serializers.HyperlinkedIdentityField(
  119. view_name='vpn-api:ikepolicy-detail'
  120. )
  121. version = ChoiceField(
  122. choices=IKEVersionChoices
  123. )
  124. mode = ChoiceField(
  125. choices=IKEModeChoices
  126. )
  127. proposals = SerializedPKRelatedField(
  128. queryset=IKEProposal.objects.all(),
  129. serializer=NestedIKEProposalSerializer,
  130. required=False,
  131. many=True
  132. )
  133. class Meta:
  134. model = IKEPolicy
  135. fields = (
  136. 'id', 'url', 'display', 'name', 'description', 'version', 'mode', 'proposals', 'preshared_key', 'comments',
  137. 'tags', 'custom_fields', 'created', 'last_updated',
  138. )
  139. class IPSecProposalSerializer(NetBoxModelSerializer):
  140. url = serializers.HyperlinkedIdentityField(
  141. view_name='vpn-api:ipsecproposal-detail'
  142. )
  143. encryption_algorithm = ChoiceField(
  144. choices=EncryptionAlgorithmChoices
  145. )
  146. authentication_algorithm = ChoiceField(
  147. choices=AuthenticationAlgorithmChoices
  148. )
  149. class Meta:
  150. model = IPSecProposal
  151. fields = (
  152. 'id', 'url', 'display', 'name', 'description', 'encryption_algorithm', 'authentication_algorithm',
  153. 'sa_lifetime_seconds', 'sa_lifetime_data', 'comments', 'tags', 'custom_fields', 'created', 'last_updated',
  154. )
  155. class IPSecPolicySerializer(NetBoxModelSerializer):
  156. url = serializers.HyperlinkedIdentityField(
  157. view_name='vpn-api:ipsecpolicy-detail'
  158. )
  159. proposals = SerializedPKRelatedField(
  160. queryset=IPSecProposal.objects.all(),
  161. serializer=NestedIPSecProposalSerializer,
  162. required=False,
  163. many=True
  164. )
  165. pfs_group = ChoiceField(
  166. choices=DHGroupChoices,
  167. required=False
  168. )
  169. class Meta:
  170. model = IPSecPolicy
  171. fields = (
  172. 'id', 'url', 'display', 'name', 'description', 'proposals', 'pfs_group', 'comments', 'tags',
  173. 'custom_fields', 'created', 'last_updated',
  174. )
  175. class IPSecProfileSerializer(NetBoxModelSerializer):
  176. url = serializers.HyperlinkedIdentityField(
  177. view_name='vpn-api:ipsecprofile-detail'
  178. )
  179. mode = ChoiceField(
  180. choices=IPSecModeChoices
  181. )
  182. ike_policy = NestedIKEPolicySerializer()
  183. ipsec_policy = NestedIPSecPolicySerializer()
  184. class Meta:
  185. model = IPSecProfile
  186. fields = (
  187. 'id', 'url', 'display', 'name', 'description', 'mode', 'ike_policy', 'ipsec_policy', 'comments', 'tags',
  188. 'custom_fields', 'created', 'last_updated',
  189. )
  190. #
  191. # L2VPN
  192. #
  193. class L2VPNSerializer(NetBoxModelSerializer):
  194. url = serializers.HyperlinkedIdentityField(view_name='vpn-api:l2vpn-detail')
  195. type = ChoiceField(choices=L2VPNTypeChoices, required=False)
  196. import_targets = SerializedPKRelatedField(
  197. queryset=RouteTarget.objects.all(),
  198. serializer=NestedRouteTargetSerializer,
  199. required=False,
  200. many=True
  201. )
  202. export_targets = SerializedPKRelatedField(
  203. queryset=RouteTarget.objects.all(),
  204. serializer=NestedRouteTargetSerializer,
  205. required=False,
  206. many=True
  207. )
  208. tenant = NestedTenantSerializer(required=False, allow_null=True)
  209. class Meta:
  210. model = L2VPN
  211. fields = [
  212. 'id', 'url', 'display', 'identifier', 'name', 'slug', 'type', 'import_targets', 'export_targets',
  213. 'description', 'comments', 'tenant', 'tags', 'custom_fields', 'created', 'last_updated'
  214. ]
  215. class L2VPNTerminationSerializer(NetBoxModelSerializer):
  216. url = serializers.HyperlinkedIdentityField(view_name='vpn-api:l2vpntermination-detail')
  217. l2vpn = NestedL2VPNSerializer()
  218. assigned_object_type = ContentTypeField(
  219. queryset=ContentType.objects.all()
  220. )
  221. assigned_object = serializers.SerializerMethodField(read_only=True)
  222. class Meta:
  223. model = L2VPNTermination
  224. fields = [
  225. 'id', 'url', 'display', 'l2vpn', 'assigned_object_type', 'assigned_object_id',
  226. 'assigned_object', 'tags', 'custom_fields', 'created', 'last_updated'
  227. ]
  228. @extend_schema_field(serializers.JSONField(allow_null=True))
  229. def get_assigned_object(self, instance):
  230. serializer = get_serializer_for_model(instance.assigned_object, prefix=NESTED_SERIALIZER_PREFIX)
  231. context = {'request': self.context['request']}
  232. return serializer(instance.assigned_object, context=context).data