serializers.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  1. from rest_framework import serializers
  2. from ipam.models import IPAddress
  3. from dcim.models import (
  4. ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay, DeviceType,
  5. DeviceRole, Interface, InterfaceConnection, InterfaceTemplate, Manufacturer, Platform, PowerOutlet,
  6. PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack, RackGroup, RACK_FACE_FRONT, RACK_FACE_REAR, Site,
  7. )
  8. #
  9. # Sites
  10. #
  11. class SiteSerializer(serializers.ModelSerializer):
  12. class Meta:
  13. model = Site
  14. fields = ['id', 'name', 'slug', 'facility', 'asn', 'physical_address', 'shipping_address', 'comments',
  15. 'count_prefixes', 'count_vlans', 'count_racks', 'count_devices', 'count_circuits']
  16. class SiteNestedSerializer(SiteSerializer):
  17. class Meta(SiteSerializer.Meta):
  18. fields = ['id', 'name', 'slug']
  19. #
  20. # Rack groups
  21. #
  22. class RackGroupSerializer(serializers.ModelSerializer):
  23. site = SiteNestedSerializer()
  24. class Meta:
  25. model = RackGroup
  26. fields = ['id', 'name', 'slug', 'site']
  27. class RackGroupNestedSerializer(RackGroupSerializer):
  28. class Meta(SiteSerializer.Meta):
  29. fields = ['id', 'name', 'slug']
  30. #
  31. # Racks
  32. #
  33. class RackSerializer(serializers.ModelSerializer):
  34. site = SiteNestedSerializer()
  35. group = RackGroupNestedSerializer()
  36. class Meta:
  37. model = Rack
  38. fields = ['id', 'name', 'facility_id', 'display_name', 'site', 'group', 'u_height', 'comments']
  39. class RackNestedSerializer(RackSerializer):
  40. class Meta(RackSerializer.Meta):
  41. fields = ['id', 'name', 'facility_id', 'display_name']
  42. class RackDetailSerializer(RackSerializer):
  43. front_units = serializers.SerializerMethodField()
  44. rear_units = serializers.SerializerMethodField()
  45. class Meta(RackSerializer.Meta):
  46. fields = ['id', 'name', 'facility_id', 'display_name', 'site', 'group', 'u_height', 'comments', 'front_units',
  47. 'rear_units']
  48. def get_front_units(self, obj):
  49. units = obj.get_rack_units(face=RACK_FACE_FRONT)
  50. for u in units:
  51. u['device'] = DeviceNestedSerializer(u['device']).data if u['device'] else None
  52. return units
  53. def get_rear_units(self, obj):
  54. units = obj.get_rack_units(face=RACK_FACE_REAR)
  55. for u in units:
  56. u['device'] = DeviceNestedSerializer(u['device']).data if u['device'] else None
  57. return units
  58. #
  59. # Manufacturers
  60. #
  61. class ManufacturerSerializer(serializers.ModelSerializer):
  62. class Meta:
  63. model = Manufacturer
  64. fields = ['id', 'name', 'slug']
  65. class ManufacturerNestedSerializer(ManufacturerSerializer):
  66. class Meta(ManufacturerSerializer.Meta):
  67. pass
  68. #
  69. # Device types
  70. #
  71. class DeviceTypeSerializer(serializers.ModelSerializer):
  72. manufacturer = ManufacturerNestedSerializer()
  73. class Meta:
  74. model = DeviceType
  75. fields = ['id', 'manufacturer', 'model', 'slug', 'u_height', 'is_full_depth', 'is_console_server', 'is_pdu',
  76. 'is_network_device']
  77. class DeviceTypeNestedSerializer(DeviceTypeSerializer):
  78. class Meta(DeviceTypeSerializer.Meta):
  79. fields = ['id', 'manufacturer', 'model', 'slug']
  80. class ConsolePortTemplateNestedSerializer(serializers.ModelSerializer):
  81. class Meta:
  82. model = ConsolePortTemplate
  83. fields = ['id', 'name']
  84. class ConsoleServerPortTemplateNestedSerializer(serializers.ModelSerializer):
  85. class Meta:
  86. model = ConsoleServerPortTemplate
  87. fields = ['id', 'name']
  88. class PowerPortTemplateNestedSerializer(serializers.ModelSerializer):
  89. class Meta:
  90. model = PowerPortTemplate
  91. fields = ['id', 'name']
  92. class PowerOutletTemplateNestedSerializer(serializers.ModelSerializer):
  93. class Meta:
  94. model = PowerOutletTemplate
  95. fields = ['id', 'name']
  96. class InterfaceTemplateNestedSerializer(serializers.ModelSerializer):
  97. class Meta:
  98. model = InterfaceTemplate
  99. fields = ['id', 'name', 'form_factor', 'mgmt_only']
  100. class DeviceTypeDetailSerializer(DeviceTypeSerializer):
  101. console_port_templates = ConsolePortTemplateNestedSerializer(many=True, read_only=True)
  102. cs_port_templates = ConsoleServerPortTemplateNestedSerializer(many=True, read_only=True)
  103. power_port_templates = PowerPortTemplateNestedSerializer(many=True, read_only=True)
  104. power_outlet_templates = PowerPortTemplateNestedSerializer(many=True, read_only=True)
  105. interface_templates = InterfaceTemplateNestedSerializer(many=True, read_only=True)
  106. class Meta(DeviceTypeSerializer.Meta):
  107. fields = ['id', 'manufacturer', 'model', 'slug', 'u_height', 'is_full_depth', 'is_console_server', 'is_pdu',
  108. 'is_network_device', 'console_port_templates', 'cs_port_templates', 'power_port_templates',
  109. 'power_outlet_templates', 'interface_templates']
  110. #
  111. # Device roles
  112. #
  113. class DeviceRoleSerializer(serializers.ModelSerializer):
  114. class Meta:
  115. model = DeviceRole
  116. fields = ['id', 'name', 'slug', 'color']
  117. class DeviceRoleNestedSerializer(DeviceRoleSerializer):
  118. class Meta(DeviceRoleSerializer.Meta):
  119. fields = ['id', 'name', 'slug']
  120. #
  121. # Platforms
  122. #
  123. class PlatformSerializer(serializers.ModelSerializer):
  124. class Meta:
  125. model = Platform
  126. fields = ['id', 'name', 'slug', 'rpc_client']
  127. class PlatformNestedSerializer(PlatformSerializer):
  128. class Meta(PlatformSerializer.Meta):
  129. fields = ['id', 'name', 'slug']
  130. #
  131. # Devices
  132. #
  133. # Cannot import ipam.api.IPAddressNestedSerializer due to circular dependency
  134. class DeviceIPAddressNestedSerializer(serializers.ModelSerializer):
  135. class Meta:
  136. model = IPAddress
  137. fields = ['id', 'family', 'address']
  138. class DeviceSerializer(serializers.ModelSerializer):
  139. device_type = DeviceTypeNestedSerializer()
  140. device_role = DeviceRoleNestedSerializer()
  141. platform = PlatformNestedSerializer()
  142. rack = RackNestedSerializer()
  143. primary_ip = DeviceIPAddressNestedSerializer()
  144. primary_ip4 = DeviceIPAddressNestedSerializer()
  145. primary_ip6 = DeviceIPAddressNestedSerializer()
  146. parent_device = serializers.SerializerMethodField()
  147. class Meta:
  148. model = Device
  149. fields = ['id', 'name', 'display_name', 'device_type', 'device_role', 'platform', 'serial', 'rack', 'position',
  150. 'face', 'parent_device', 'status', 'primary_ip', 'primary_ip4', 'primary_ip6', 'comments']
  151. def get_parent_device(self, obj):
  152. try:
  153. device_bay = obj.parent_bay
  154. except DeviceBay.DoesNotExist:
  155. return None
  156. return {
  157. 'id': device_bay.device.pk,
  158. 'name': device_bay.device.name,
  159. 'device_bay': {
  160. 'id': device_bay.pk,
  161. 'name': device_bay.name,
  162. }
  163. }
  164. class DeviceNestedSerializer(serializers.ModelSerializer):
  165. class Meta:
  166. model = Device
  167. fields = ['id', 'name', 'display_name']
  168. #
  169. # Console server ports
  170. #
  171. class ConsoleServerPortSerializer(serializers.ModelSerializer):
  172. device = DeviceNestedSerializer()
  173. class Meta:
  174. model = ConsoleServerPort
  175. fields = ['id', 'device', 'name', 'connected_console']
  176. class ConsoleServerPortNestedSerializer(ConsoleServerPortSerializer):
  177. class Meta(ConsoleServerPortSerializer.Meta):
  178. fields = ['id', 'device', 'name']
  179. #
  180. # Console ports
  181. #
  182. class ConsolePortSerializer(serializers.ModelSerializer):
  183. device = DeviceNestedSerializer()
  184. cs_port = ConsoleServerPortNestedSerializer()
  185. class Meta:
  186. model = ConsolePort
  187. fields = ['id', 'device', 'name', 'cs_port', 'connection_status']
  188. class ConsolePortNestedSerializer(ConsolePortSerializer):
  189. class Meta(ConsolePortSerializer.Meta):
  190. fields = ['id', 'device', 'name']
  191. #
  192. # Power outlets
  193. #
  194. class PowerOutletSerializer(serializers.ModelSerializer):
  195. device = DeviceNestedSerializer()
  196. class Meta:
  197. model = PowerOutlet
  198. fields = ['id', 'device', 'name', 'connected_port']
  199. class PowerOutletNestedSerializer(PowerOutletSerializer):
  200. class Meta(PowerOutletSerializer.Meta):
  201. fields = ['id', 'device', 'name']
  202. #
  203. # Power ports
  204. #
  205. class PowerPortSerializer(serializers.ModelSerializer):
  206. device = DeviceNestedSerializer()
  207. power_outlet = PowerOutletNestedSerializer()
  208. class Meta:
  209. model = PowerPort
  210. fields = ['id', 'device', 'name', 'power_outlet', 'connection_status']
  211. class PowerPortNestedSerializer(PowerPortSerializer):
  212. class Meta(PowerPortSerializer.Meta):
  213. fields = ['id', 'device', 'name']
  214. #
  215. # Interfaces
  216. #
  217. class InterfaceSerializer(serializers.ModelSerializer):
  218. device = DeviceNestedSerializer()
  219. form_factor = serializers.ReadOnlyField(source='get_form_factor_display')
  220. class Meta:
  221. model = Interface
  222. fields = ['id', 'device', 'name', 'form_factor', 'mac_address', 'mgmt_only', 'description', 'is_connected']
  223. class InterfaceNestedSerializer(InterfaceSerializer):
  224. form_factor = serializers.ReadOnlyField(source='get_form_factor_display')
  225. class Meta(InterfaceSerializer.Meta):
  226. fields = ['id', 'device', 'name']
  227. class InterfaceDetailSerializer(InterfaceSerializer):
  228. connected_interface = InterfaceSerializer(source='get_connected_interface')
  229. class Meta(InterfaceSerializer.Meta):
  230. fields = ['id', 'device', 'name', 'form_factor', 'mac_address', 'mgmt_only', 'description', 'is_connected',
  231. 'connected_interface']
  232. #
  233. # Device bays
  234. #
  235. class DeviceBaySerializer(serializers.ModelSerializer):
  236. device = DeviceNestedSerializer()
  237. class Meta:
  238. model = DeviceBay
  239. fields = ['id', 'device', 'name']
  240. class DeviceBayNestedSerializer(DeviceBaySerializer):
  241. installed_device = DeviceNestedSerializer()
  242. class Meta(DeviceBaySerializer.Meta):
  243. fields = ['id', 'name', 'installed_device']
  244. class DeviceBayDetailSerializer(DeviceBaySerializer):
  245. installed_device = DeviceNestedSerializer()
  246. class Meta(DeviceBaySerializer.Meta):
  247. fields = ['id', 'device', 'name', 'installed_device']
  248. #
  249. # Interface connections
  250. #
  251. class InterfaceConnectionSerializer(serializers.ModelSerializer):
  252. class Meta:
  253. model = InterfaceConnection
  254. fields = ['id', 'interface_a', 'interface_b', 'connection_status']