serializers.py 9.4 KB

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