serializers.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508
  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 NestedTenantSerializer
  11. #
  12. # Sites
  13. #
  14. class SiteSerializer(CustomFieldSerializer, serializers.ModelSerializer):
  15. tenant = NestedTenantSerializer()
  16. class Meta:
  17. model = Site
  18. fields = [
  19. 'id', 'name', 'slug', 'tenant', 'facility', 'asn', 'physical_address', 'shipping_address', 'contact_name',
  20. 'contact_phone', 'contact_email', 'comments', 'custom_fields', 'count_prefixes', 'count_vlans',
  21. 'count_racks', 'count_devices', 'count_circuits',
  22. ]
  23. class NestedSiteSerializer(serializers.HyperlinkedModelSerializer):
  24. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:site-detail')
  25. class Meta:
  26. model = Site
  27. fields = ['id', 'url', 'name', 'slug']
  28. #
  29. # Rack groups
  30. #
  31. class RackGroupSerializer(serializers.ModelSerializer):
  32. site = NestedSiteSerializer()
  33. class Meta:
  34. model = RackGroup
  35. fields = ['id', 'name', 'slug', 'site']
  36. class NestedRackGroupSerializer(serializers.HyperlinkedModelSerializer):
  37. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rackgroup-detail')
  38. class Meta:
  39. model = RackGroup
  40. fields = ['id', 'url', 'name', 'slug']
  41. #
  42. # Rack roles
  43. #
  44. class RackRoleSerializer(serializers.ModelSerializer):
  45. class Meta:
  46. model = RackRole
  47. fields = ['id', 'name', 'slug', 'color']
  48. class NestedRackRoleSerializer(serializers.HyperlinkedModelSerializer):
  49. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rackrole-detail')
  50. class Meta:
  51. model = RackRole
  52. fields = ['id', 'url', 'name', 'slug']
  53. #
  54. # Racks
  55. #
  56. class RackSerializer(CustomFieldSerializer, serializers.ModelSerializer):
  57. site = NestedSiteSerializer()
  58. group = NestedRackGroupSerializer()
  59. tenant = NestedTenantSerializer()
  60. role = NestedRackRoleSerializer()
  61. class Meta:
  62. model = Rack
  63. fields = [
  64. 'id', 'name', 'facility_id', 'display_name', 'site', 'group', 'tenant', 'role', 'type', 'width', 'u_height',
  65. 'desc_units', 'comments', 'custom_fields',
  66. ]
  67. class NestedRackSerializer(serializers.HyperlinkedModelSerializer):
  68. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rack-detail')
  69. class Meta:
  70. model = Rack
  71. fields = ['id', 'url', 'name', 'display_name']
  72. class RackDetailSerializer(RackSerializer):
  73. front_units = serializers.SerializerMethodField()
  74. rear_units = serializers.SerializerMethodField()
  75. class Meta(RackSerializer.Meta):
  76. fields = [
  77. 'id', 'name', 'facility_id', 'display_name', 'site', 'group', 'tenant', 'role', 'type', 'width', 'u_height',
  78. 'desc_units', 'comments', 'custom_fields', 'front_units', 'rear_units',
  79. ]
  80. def get_front_units(self, obj):
  81. units = obj.get_rack_units(face=RACK_FACE_FRONT)
  82. for u in units:
  83. u['device'] = NestedDeviceSerializer(u['device']).data if u['device'] else None
  84. return units
  85. def get_rear_units(self, obj):
  86. units = obj.get_rack_units(face=RACK_FACE_REAR)
  87. for u in units:
  88. u['device'] = NestedDeviceSerializer(u['device']).data if u['device'] else None
  89. return units
  90. #
  91. # Manufacturers
  92. #
  93. class ManufacturerSerializer(serializers.ModelSerializer):
  94. class Meta:
  95. model = Manufacturer
  96. fields = ['id', 'name', 'slug']
  97. class NestedManufacturerSerializer(serializers.HyperlinkedModelSerializer):
  98. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:manufacturer-detail')
  99. class Meta:
  100. model = Manufacturer
  101. fields = ['id', 'url', 'name', 'slug']
  102. #
  103. # Device types
  104. #
  105. class DeviceTypeSerializer(CustomFieldSerializer, serializers.ModelSerializer):
  106. manufacturer = NestedManufacturerSerializer()
  107. subdevice_role = serializers.SerializerMethodField()
  108. instance_count = serializers.IntegerField(source='instances.count', read_only=True)
  109. class Meta:
  110. model = DeviceType
  111. fields = [
  112. 'id', 'manufacturer', 'model', 'slug', 'part_number', 'u_height', 'is_full_depth', 'interface_ordering',
  113. 'is_console_server', 'is_pdu', 'is_network_device', 'subdevice_role', 'comments', 'custom_fields',
  114. 'instance_count',
  115. ]
  116. def get_subdevice_role(self, obj):
  117. return {
  118. SUBDEVICE_ROLE_PARENT: 'parent',
  119. SUBDEVICE_ROLE_CHILD: 'child',
  120. None: None,
  121. }[obj.subdevice_role]
  122. class NestedDeviceTypeSerializer(serializers.HyperlinkedModelSerializer):
  123. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicetype-detail')
  124. manufacturer = NestedManufacturerSerializer()
  125. class Meta:
  126. model = DeviceType
  127. fields = ['id', 'url', 'manufacturer', 'model', 'slug']
  128. class ConsolePortTemplateSerializer(serializers.ModelSerializer):
  129. class Meta:
  130. model = ConsolePortTemplate
  131. fields = ['id', 'name']
  132. class ConsoleServerPortTemplateSerializer(serializers.ModelSerializer):
  133. class Meta:
  134. model = ConsoleServerPortTemplate
  135. fields = ['id', 'name']
  136. class PowerPortTemplateSerializer(serializers.ModelSerializer):
  137. class Meta:
  138. model = PowerPortTemplate
  139. fields = ['id', 'name']
  140. class PowerOutletTemplateSerializer(serializers.ModelSerializer):
  141. class Meta:
  142. model = PowerOutletTemplate
  143. fields = ['id', 'name']
  144. class InterfaceTemplateSerializer(serializers.ModelSerializer):
  145. class Meta:
  146. model = InterfaceTemplate
  147. fields = ['id', 'name', 'form_factor', 'mgmt_only']
  148. class DeviceBayTemplateSerializer(serializers.ModelSerializer):
  149. class Meta:
  150. model = DeviceBay
  151. fields = ['id', 'name',]
  152. #
  153. # Device roles
  154. #
  155. class DeviceRoleSerializer(serializers.ModelSerializer):
  156. class Meta:
  157. model = DeviceRole
  158. fields = ['id', 'name', 'slug', 'color']
  159. class NestedDeviceRoleSerializer(serializers.HyperlinkedModelSerializer):
  160. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicerole-detail')
  161. class Meta:
  162. model = DeviceRole
  163. fields = ['id', 'url', 'name', 'slug']
  164. #
  165. # Platforms
  166. #
  167. class PlatformSerializer(serializers.ModelSerializer):
  168. class Meta:
  169. model = Platform
  170. fields = ['id', 'name', 'slug', 'rpc_client']
  171. class NestedPlatformSerializer(serializers.HyperlinkedModelSerializer):
  172. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:platform-detail')
  173. class Meta:
  174. model = Platform
  175. fields = ['id', 'url', 'name', 'slug']
  176. #
  177. # Devices
  178. #
  179. # Cannot import ipam.api.NestedIPAddressSerializer due to circular dependency
  180. class DeviceIPAddressSerializer(serializers.HyperlinkedModelSerializer):
  181. url = serializers.HyperlinkedIdentityField(view_name='ipam-api:ipaddress-detail')
  182. class Meta:
  183. model = IPAddress
  184. fields = ['id', 'url', 'family', 'address']
  185. class DeviceSerializer(CustomFieldSerializer, serializers.ModelSerializer):
  186. device_type = NestedDeviceTypeSerializer()
  187. device_role = NestedDeviceRoleSerializer()
  188. tenant = NestedTenantSerializer()
  189. platform = NestedPlatformSerializer()
  190. rack = NestedRackSerializer()
  191. primary_ip = DeviceIPAddressSerializer()
  192. primary_ip4 = DeviceIPAddressSerializer()
  193. primary_ip6 = DeviceIPAddressSerializer()
  194. parent_device = serializers.SerializerMethodField()
  195. class Meta:
  196. model = Device
  197. fields = [
  198. 'id', 'name', 'display_name', 'device_type', 'device_role', 'tenant', 'platform', 'serial', 'asset_tag',
  199. 'rack', 'position', 'face', 'parent_device', 'status', 'primary_ip', 'primary_ip4', 'primary_ip6',
  200. 'comments', 'custom_fields',
  201. ]
  202. def get_parent_device(self, obj):
  203. try:
  204. device_bay = obj.parent_bay
  205. except DeviceBay.DoesNotExist:
  206. return None
  207. return {
  208. 'id': device_bay.device.pk,
  209. 'name': device_bay.device.name,
  210. 'device_bay': {
  211. 'id': device_bay.pk,
  212. 'name': device_bay.name,
  213. }
  214. }
  215. class NestedDeviceSerializer(serializers.HyperlinkedModelSerializer):
  216. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:device-detail')
  217. class Meta:
  218. model = Device
  219. fields = ['id', 'url', 'name', 'display_name']
  220. #
  221. # Console server ports
  222. #
  223. class ConsoleServerPortSerializer(serializers.ModelSerializer):
  224. device = NestedDeviceSerializer()
  225. class Meta:
  226. model = ConsoleServerPort
  227. fields = ['id', 'device', 'name', 'connected_console']
  228. class DeviceConsoleServerPortSerializer(serializers.HyperlinkedModelSerializer):
  229. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleserverport-detail')
  230. class Meta:
  231. model = ConsoleServerPort
  232. fields = ['id', 'url', 'name', 'connected_console']
  233. #
  234. # Console ports
  235. #
  236. class ConsolePortSerializer(serializers.ModelSerializer):
  237. device = NestedDeviceSerializer()
  238. cs_port = ConsoleServerPortSerializer()
  239. class Meta:
  240. model = ConsolePort
  241. fields = ['id', 'device', 'name', 'cs_port', 'connection_status']
  242. class DeviceConsolePortSerializer(serializers.HyperlinkedModelSerializer):
  243. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleport-detail')
  244. class Meta:
  245. model = ConsolePort
  246. fields = ['id', 'url', 'name', 'cs_port', 'connection_status']
  247. #
  248. # Power outlets
  249. #
  250. class PowerOutletSerializer(serializers.ModelSerializer):
  251. device = NestedDeviceSerializer()
  252. class Meta:
  253. model = PowerOutlet
  254. fields = ['id', 'device', 'name', 'connected_port']
  255. class DevicePowerOutletSerializer(serializers.HyperlinkedModelSerializer):
  256. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:poweroutlet-detail')
  257. class Meta:
  258. model = PowerOutlet
  259. fields = ['id', 'url', 'name', 'connected_port']
  260. #
  261. # Power ports
  262. #
  263. class PowerPortSerializer(serializers.ModelSerializer):
  264. device = NestedDeviceSerializer()
  265. power_outlet = PowerOutletSerializer()
  266. class Meta:
  267. model = PowerPort
  268. fields = ['id', 'device', 'name', 'power_outlet', 'connection_status']
  269. class DevicePowerPortSerializer(serializers.HyperlinkedModelSerializer):
  270. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerport-detail')
  271. class Meta:
  272. model = PowerPort
  273. fields = ['id', 'url', 'name', 'power_outlet', 'connection_status']
  274. #
  275. # Interfaces
  276. #
  277. class InterfaceSerializer(serializers.ModelSerializer):
  278. device = NestedDeviceSerializer()
  279. connection = serializers.SerializerMethodField(read_only=True)
  280. connected_interface = serializers.SerializerMethodField(read_only=True)
  281. class Meta:
  282. model = Interface
  283. fields = [
  284. 'id', 'device', 'name', 'form_factor', 'mac_address', 'mgmt_only', 'description', 'connection',
  285. 'connected_interface',
  286. ]
  287. def get_connection(self, obj):
  288. if obj.connection:
  289. return NestedInterfaceConnectionSerializer(obj.connection, context=self.context).data
  290. return None
  291. def get_connected_interface(self, obj):
  292. if obj.connected_interface:
  293. return PeerInterfaceSerializer(obj.connected_interface, context=self.context).data
  294. return None
  295. class PeerInterfaceSerializer(serializers.HyperlinkedModelSerializer):
  296. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:interface-detail')
  297. device = NestedDeviceSerializer()
  298. class Meta:
  299. model = Interface
  300. fields = ['id', 'url', 'device', 'name', 'form_factor', 'mac_address', 'mgmt_only', 'description']
  301. class DeviceInterfaceSerializer(serializers.HyperlinkedModelSerializer):
  302. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:interface-detail')
  303. connection = serializers.SerializerMethodField()
  304. class Meta:
  305. model = Interface
  306. fields = ['id', 'url', 'name', 'form_factor', 'mac_address', 'mgmt_only', 'description', 'connection']
  307. def get_connection(self, obj):
  308. if obj.connection:
  309. return NestedInterfaceConnectionSerializer(obj.connection, context=self.context).data
  310. return None
  311. #
  312. # Interface connections
  313. #
  314. class InterfaceConnectionSerializer(serializers.ModelSerializer):
  315. interface_a = PeerInterfaceSerializer()
  316. interface_b = PeerInterfaceSerializer()
  317. class Meta:
  318. model = InterfaceConnection
  319. fields = ['id', 'interface_a', 'interface_b', 'connection_status']
  320. class NestedInterfaceConnectionSerializer(serializers.HyperlinkedModelSerializer):
  321. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:interfaceconnection-detail')
  322. class Meta:
  323. model = InterfaceConnection
  324. fields = ['id', 'url', 'connection_status']
  325. #
  326. # Device bays
  327. #
  328. class DeviceBaySerializer(serializers.ModelSerializer):
  329. device = NestedDeviceSerializer()
  330. installed_device = NestedDeviceSerializer()
  331. class Meta:
  332. model = DeviceBay
  333. fields = ['id', 'device', 'name', 'installed_device']
  334. class DeviceDeviceBaySerializer(serializers.HyperlinkedModelSerializer):
  335. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicebay-detail')
  336. class Meta:
  337. model = DeviceBay
  338. fields = ['id', 'url', 'name', 'installed_device']
  339. #
  340. # Modules
  341. #
  342. class ModuleSerializer(serializers.ModelSerializer):
  343. device = NestedDeviceSerializer()
  344. manufacturer = NestedManufacturerSerializer()
  345. class Meta:
  346. model = Module
  347. fields = ['id', 'device', 'parent', 'name', 'manufacturer', 'part_id', 'serial', 'discovered']
  348. class DeviceModuleSerializer(serializers.HyperlinkedModelSerializer):
  349. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:module-detail')
  350. class Meta:
  351. model = Module
  352. fields = ['id', 'url', 'parent', 'name', 'manufacturer', 'part_id', 'serial', 'discovered']