serializers.py 11 KB

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