tunnels.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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.serializers_.ip import IPAddressSerializer
  5. from netbox.api.fields import ChoiceField, ContentTypeField, RelatedObjectCountField
  6. from netbox.api.serializers import NetBoxModelSerializer
  7. from netbox.constants import NESTED_SERIALIZER_PREFIX
  8. from tenancy.api.serializers_.tenants import TenantSerializer
  9. from utilities.api import get_serializer_for_model
  10. from vpn.choices import *
  11. from vpn.models import Tunnel, TunnelGroup, TunnelTermination
  12. from .crypto import IPSecProfileSerializer
  13. __all__ = (
  14. 'TunnelGroupSerializer',
  15. 'TunnelSerializer',
  16. 'TunnelTerminationSerializer',
  17. )
  18. #
  19. # Tunnels
  20. #
  21. class TunnelGroupSerializer(NetBoxModelSerializer):
  22. url = serializers.HyperlinkedIdentityField(view_name='vpn-api:tunnelgroup-detail')
  23. # Related object counts
  24. tunnel_count = RelatedObjectCountField('tunnels')
  25. class Meta:
  26. model = TunnelGroup
  27. fields = [
  28. 'id', 'url', 'display', 'name', 'slug', 'description', 'tags', 'custom_fields', 'created', 'last_updated',
  29. 'tunnel_count',
  30. ]
  31. brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'tunnel_count')
  32. class TunnelSerializer(NetBoxModelSerializer):
  33. url = serializers.HyperlinkedIdentityField(
  34. view_name='vpn-api:tunnel-detail'
  35. )
  36. status = ChoiceField(
  37. choices=TunnelStatusChoices
  38. )
  39. group = TunnelGroupSerializer(
  40. nested=True,
  41. required=False,
  42. allow_null=True
  43. )
  44. encapsulation = ChoiceField(
  45. choices=TunnelEncapsulationChoices
  46. )
  47. ipsec_profile = IPSecProfileSerializer(
  48. nested=True,
  49. required=False,
  50. allow_null=True
  51. )
  52. tenant = TenantSerializer(
  53. nested=True,
  54. required=False,
  55. allow_null=True
  56. )
  57. # Related object counts
  58. terminations_count = RelatedObjectCountField('terminations')
  59. class Meta:
  60. model = Tunnel
  61. fields = (
  62. 'id', 'url', 'display', 'name', 'status', 'group', 'encapsulation', 'ipsec_profile', 'tenant', 'tunnel_id',
  63. 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', 'terminations_count',
  64. )
  65. brief_fields = ('id', 'url', 'display', 'name', 'description')
  66. class TunnelTerminationSerializer(NetBoxModelSerializer):
  67. url = serializers.HyperlinkedIdentityField(
  68. view_name='vpn-api:tunneltermination-detail'
  69. )
  70. tunnel = TunnelSerializer(
  71. nested=True
  72. )
  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 = IPAddressSerializer(
  83. nested=True,
  84. required=False,
  85. allow_null=True
  86. )
  87. class Meta:
  88. model = TunnelTermination
  89. fields = (
  90. 'id', 'url', 'display', 'tunnel', 'role', 'termination_type', 'termination_id', 'termination', 'outside_ip',
  91. 'tags', 'custom_fields', 'created', 'last_updated',
  92. )
  93. brief_fields = ('id', 'url', 'display')
  94. @extend_schema_field(serializers.JSONField(allow_null=True))
  95. def get_termination(self, obj):
  96. serializer = get_serializer_for_model(obj.termination, prefix=NESTED_SERIALIZER_PREFIX)
  97. context = {'request': self.context['request']}
  98. return serializer(obj.termination, context=context).data