Coverage for vpn/api/serializers_/tunnels.py: 100%

37 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-10-10 18:35 +0000

1from django.contrib.contenttypes.models import ContentType 

2 

3from ipam.api.serializers_.ip import IPAddressSerializer 

4from netbox.api.fields import ChoiceField, ContentTypeField, RelatedObjectCountField 

5from netbox.api.gfk_fields import GFKSerializerField 

6from netbox.api.serializers import NetBoxModelSerializer, OrganizationalModelSerializer, PrimaryModelSerializer 

7from tenancy.api.serializers_.tenants import TenantSerializer 

8from vpn.choices import * 

9from vpn.models import Tunnel, TunnelGroup, TunnelTermination 

10 

11from .crypto import IPSecProfileSerializer 

12 

13__all__ = ( 

14 'TunnelGroupSerializer', 

15 'TunnelSerializer', 

16 'TunnelTerminationSerializer', 

17) 

18 

19 

20# 

21# Tunnels 

22# 

23 

24class TunnelGroupSerializer(OrganizationalModelSerializer): 

25 

26 # Related object counts 

27 tunnel_count = RelatedObjectCountField('tunnels') 

28 

29 class Meta: 

30 model = TunnelGroup 

31 fields = [ 

32 'id', 'url', 'display_url', 'display', 'name', 'slug', 'description', 'owner', 'comments', 'tags', 

33 'custom_fields', 'created', 'last_updated', 'tunnel_count', 

34 ] 

35 brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'tunnel_count') 

36 

37 

38class TunnelSerializer(PrimaryModelSerializer): 

39 status = ChoiceField( 

40 choices=TunnelStatusChoices 

41 ) 

42 group = TunnelGroupSerializer( 

43 nested=True, 

44 required=False, 

45 allow_null=True, 

46 default=None 

47 ) 

48 encapsulation = ChoiceField( 

49 choices=TunnelEncapsulationChoices 

50 ) 

51 ipsec_profile = IPSecProfileSerializer( 

52 nested=True, 

53 required=False, 

54 allow_null=True 

55 ) 

56 tenant = TenantSerializer( 

57 nested=True, 

58 required=False, 

59 allow_null=True 

60 ) 

61 

62 # Related object counts 

63 terminations_count = RelatedObjectCountField('terminations') 

64 

65 class Meta: 

66 model = Tunnel 

67 fields = ( 

68 'id', 'url', 'display_url', 'display', 'name', 'status', 'group', 'encapsulation', 'ipsec_profile', 

69 'tenant', 'tunnel_id', 'description', 'owner', 'comments', 'tags', 'custom_fields', 'created', 

70 'last_updated', 'terminations_count', 

71 ) 

72 brief_fields = ('id', 'url', 'display', 'name', 'description') 

73 

74 

75class TunnelTerminationSerializer(NetBoxModelSerializer): 

76 tunnel = TunnelSerializer( 

77 nested=True 

78 ) 

79 role = ChoiceField( 

80 choices=TunnelTerminationRoleChoices 

81 ) 

82 termination_type = ContentTypeField( 

83 queryset=ContentType.objects.all() 

84 ) 

85 termination = GFKSerializerField(read_only=True) 

86 outside_ip = IPAddressSerializer( 

87 nested=True, 

88 required=False, 

89 allow_null=True 

90 ) 

91 

92 class Meta: 

93 model = TunnelTermination 

94 fields = ( 

95 'id', 'url', 'display_url', 'display', 'tunnel', 'role', 'termination_type', 'termination_id', 

96 'termination', 'outside_ip', 'tags', 'custom_fields', 'created', 'last_updated', 

97 ) 

98 brief_fields = ('id', 'url', 'display')