2
0

serializers.py 11 KB

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