serializers.py 12 KB

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