serializers.py 13 KB

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