serializers.py 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. from __future__ import unicode_literals
  2. from rest_framework import serializers
  3. from rest_framework.validators import UniqueTogetherValidator
  4. from dcim.api.serializers import NestedDeviceSerializer, InterfaceSerializer, NestedSiteSerializer
  5. from extras.api.customfields import CustomFieldModelSerializer
  6. from ipam.models import (
  7. Aggregate, IPAddress, IPADDRESS_STATUS_CHOICES, IP_PROTOCOL_CHOICES, Prefix, PREFIX_STATUS_CHOICES, RIR, Role,
  8. Service, VLAN, VLAN_STATUS_CHOICES, VLANGroup, VRF,
  9. )
  10. from tenancy.api.serializers import NestedTenantSerializer
  11. from utilities.api import ChoiceFieldSerializer
  12. #
  13. # VRFs
  14. #
  15. class VRFSerializer(CustomFieldModelSerializer):
  16. tenant = NestedTenantSerializer()
  17. class Meta:
  18. model = VRF
  19. fields = ['id', 'name', 'rd', 'tenant', 'enforce_unique', 'description', 'custom_fields']
  20. class NestedVRFSerializer(serializers.ModelSerializer):
  21. url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vrf-detail')
  22. class Meta:
  23. model = VRF
  24. fields = ['id', 'url', 'name', 'rd']
  25. class WritableVRFSerializer(CustomFieldModelSerializer):
  26. class Meta:
  27. model = VRF
  28. fields = ['id', 'name', 'rd', 'tenant', 'enforce_unique', 'description', 'custom_fields']
  29. #
  30. # Roles
  31. #
  32. class RoleSerializer(serializers.ModelSerializer):
  33. class Meta:
  34. model = Role
  35. fields = ['id', 'name', 'slug', 'weight']
  36. class NestedRoleSerializer(serializers.ModelSerializer):
  37. url = serializers.HyperlinkedIdentityField(view_name='ipam-api:role-detail')
  38. class Meta:
  39. model = Role
  40. fields = ['id', 'url', 'name', 'slug']
  41. #
  42. # RIRs
  43. #
  44. class RIRSerializer(serializers.ModelSerializer):
  45. class Meta:
  46. model = RIR
  47. fields = ['id', 'name', 'slug', 'is_private']
  48. class NestedRIRSerializer(serializers.ModelSerializer):
  49. url = serializers.HyperlinkedIdentityField(view_name='ipam-api:rir-detail')
  50. class Meta:
  51. model = RIR
  52. fields = ['id', 'url', 'name', 'slug']
  53. #
  54. # Aggregates
  55. #
  56. class AggregateSerializer(CustomFieldModelSerializer):
  57. rir = NestedRIRSerializer()
  58. class Meta:
  59. model = Aggregate
  60. fields = ['id', 'family', 'prefix', 'rir', 'date_added', 'description', 'custom_fields']
  61. class NestedAggregateSerializer(serializers.ModelSerializer):
  62. url = serializers.HyperlinkedIdentityField(view_name='ipam-api:aggregate-detail')
  63. class Meta(AggregateSerializer.Meta):
  64. model = Aggregate
  65. fields = ['id', 'url', 'family', 'prefix']
  66. class WritableAggregateSerializer(CustomFieldModelSerializer):
  67. class Meta:
  68. model = Aggregate
  69. fields = ['id', 'prefix', 'rir', 'date_added', 'description', 'custom_fields']
  70. #
  71. # VLAN groups
  72. #
  73. class VLANGroupSerializer(serializers.ModelSerializer):
  74. site = NestedSiteSerializer()
  75. class Meta:
  76. model = VLANGroup
  77. fields = ['id', 'name', 'slug', 'site']
  78. class NestedVLANGroupSerializer(serializers.ModelSerializer):
  79. url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vlangroup-detail')
  80. class Meta:
  81. model = VLANGroup
  82. fields = ['id', 'url', 'name', 'slug']
  83. class WritableVLANGroupSerializer(serializers.ModelSerializer):
  84. class Meta:
  85. model = VLANGroup
  86. fields = ['id', 'name', 'slug', 'site']
  87. validators = []
  88. def validate(self, data):
  89. # Validate uniqueness of name and slug if a site has been assigned.
  90. if data.get('site', None):
  91. for field in ['name', 'slug']:
  92. validator = UniqueTogetherValidator(queryset=VLAN.objects.all(), fields=('site', field))
  93. validator.set_context(self)
  94. validator(data)
  95. return data
  96. #
  97. # VLANs
  98. #
  99. class VLANSerializer(CustomFieldModelSerializer):
  100. site = NestedSiteSerializer()
  101. group = NestedVLANGroupSerializer()
  102. tenant = NestedTenantSerializer()
  103. status = ChoiceFieldSerializer(choices=VLAN_STATUS_CHOICES)
  104. role = NestedRoleSerializer()
  105. class Meta:
  106. model = VLAN
  107. fields = [
  108. 'id', 'site', 'group', 'vid', 'name', 'tenant', 'status', 'role', 'description', 'display_name',
  109. 'custom_fields',
  110. ]
  111. class NestedVLANSerializer(serializers.ModelSerializer):
  112. url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vlan-detail')
  113. class Meta:
  114. model = VLAN
  115. fields = ['id', 'url', 'vid', 'name', 'display_name']
  116. class WritableVLANSerializer(CustomFieldModelSerializer):
  117. class Meta:
  118. model = VLAN
  119. fields = ['id', 'site', 'group', 'vid', 'name', 'tenant', 'status', 'role', 'description', 'custom_fields']
  120. validators = []
  121. def validate(self, data):
  122. # Validate uniqueness of vid and name if a group has been assigned.
  123. if data.get('group', None):
  124. for field in ['vid', 'name']:
  125. validator = UniqueTogetherValidator(queryset=VLAN.objects.all(), fields=('group', field))
  126. validator.set_context(self)
  127. validator(data)
  128. return data
  129. #
  130. # Prefixes
  131. #
  132. class PrefixSerializer(CustomFieldModelSerializer):
  133. site = NestedSiteSerializer()
  134. vrf = NestedVRFSerializer()
  135. tenant = NestedTenantSerializer()
  136. vlan = NestedVLANSerializer()
  137. status = ChoiceFieldSerializer(choices=PREFIX_STATUS_CHOICES)
  138. role = NestedRoleSerializer()
  139. class Meta:
  140. model = Prefix
  141. fields = [
  142. 'id', 'family', 'prefix', 'site', 'vrf', 'tenant', 'vlan', 'status', 'role', 'is_pool', 'description',
  143. 'custom_fields',
  144. ]
  145. class NestedPrefixSerializer(serializers.ModelSerializer):
  146. url = serializers.HyperlinkedIdentityField(view_name='ipam-api:prefix-detail')
  147. class Meta:
  148. model = Prefix
  149. fields = ['id', 'url', 'family', 'prefix']
  150. class WritablePrefixSerializer(CustomFieldModelSerializer):
  151. class Meta:
  152. model = Prefix
  153. fields = [
  154. 'id', 'prefix', 'site', 'vrf', 'tenant', 'vlan', 'status', 'role', 'is_pool', 'description',
  155. 'custom_fields',
  156. ]
  157. #
  158. # IP addresses
  159. #
  160. class IPAddressSerializer(CustomFieldModelSerializer):
  161. vrf = NestedVRFSerializer()
  162. tenant = NestedTenantSerializer()
  163. status = ChoiceFieldSerializer(choices=IPADDRESS_STATUS_CHOICES)
  164. interface = InterfaceSerializer()
  165. class Meta:
  166. model = IPAddress
  167. fields = [
  168. 'id', 'family', 'address', 'vrf', 'tenant', 'status', 'interface', 'description', 'nat_inside',
  169. 'nat_outside', 'custom_fields',
  170. ]
  171. class NestedIPAddressSerializer(serializers.ModelSerializer):
  172. url = serializers.HyperlinkedIdentityField(view_name='ipam-api:ipaddress-detail')
  173. class Meta:
  174. model = IPAddress
  175. fields = ['id', 'url', 'family', 'address']
  176. IPAddressSerializer._declared_fields['nat_inside'] = NestedIPAddressSerializer()
  177. IPAddressSerializer._declared_fields['nat_outside'] = NestedIPAddressSerializer()
  178. class WritableIPAddressSerializer(CustomFieldModelSerializer):
  179. class Meta:
  180. model = IPAddress
  181. fields = ['id', 'address', 'vrf', 'tenant', 'status', 'interface', 'description', 'nat_inside', 'custom_fields']
  182. #
  183. # Services
  184. #
  185. class ServiceSerializer(serializers.ModelSerializer):
  186. device = NestedDeviceSerializer()
  187. protocol = ChoiceFieldSerializer(choices=IP_PROTOCOL_CHOICES)
  188. ipaddresses = NestedIPAddressSerializer(many=True)
  189. class Meta:
  190. model = Service
  191. fields = ['id', 'device', 'name', 'port', 'protocol', 'ipaddresses', 'description']
  192. class WritableServiceSerializer(serializers.ModelSerializer):
  193. class Meta:
  194. model = Service
  195. fields = ['id', 'device', 'name', 'port', 'protocol', 'ipaddresses', 'description']