serializers.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. from __future__ import unicode_literals
  2. from rest_framework import serializers
  3. from dcim.api.serializers import NestedDeviceRoleSerializer, NestedPlatformSerializer, NestedSiteSerializer
  4. from dcim.constants import IFACE_FF_VIRTUAL
  5. from dcim.models import Interface
  6. from extras.api.customfields import CustomFieldModelSerializer
  7. from ipam.models import IPAddress
  8. from tenancy.api.serializers import NestedTenantSerializer
  9. from utilities.api import ChoiceFieldSerializer, ValidatedModelSerializer
  10. from virtualization.constants import STATUS_CHOICES
  11. from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine
  12. #
  13. # Cluster types
  14. #
  15. class ClusterTypeSerializer(ValidatedModelSerializer):
  16. class Meta:
  17. model = ClusterType
  18. fields = ['id', 'name', 'slug']
  19. class NestedClusterTypeSerializer(serializers.ModelSerializer):
  20. url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustertype-detail')
  21. class Meta:
  22. model = ClusterType
  23. fields = ['id', 'url', 'name', 'slug']
  24. #
  25. # Cluster groups
  26. #
  27. class ClusterGroupSerializer(ValidatedModelSerializer):
  28. class Meta:
  29. model = ClusterGroup
  30. fields = ['id', 'name', 'slug']
  31. class NestedClusterGroupSerializer(serializers.ModelSerializer):
  32. url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustergroup-detail')
  33. class Meta:
  34. model = ClusterGroup
  35. fields = ['id', 'url', 'name', 'slug']
  36. #
  37. # Clusters
  38. #
  39. class ClusterSerializer(CustomFieldModelSerializer):
  40. type = NestedClusterTypeSerializer()
  41. group = NestedClusterGroupSerializer()
  42. site = NestedSiteSerializer()
  43. class Meta:
  44. model = Cluster
  45. fields = ['id', 'name', 'type', 'group', 'site', 'comments', 'custom_fields', 'created', 'last_updated']
  46. class NestedClusterSerializer(serializers.ModelSerializer):
  47. url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:cluster-detail')
  48. class Meta:
  49. model = Cluster
  50. fields = ['id', 'url', 'name']
  51. class WritableClusterSerializer(CustomFieldModelSerializer):
  52. class Meta:
  53. model = Cluster
  54. fields = ['id', 'name', 'type', 'group', 'site', 'comments', 'custom_fields', 'created', 'last_updated']
  55. #
  56. # Virtual machines
  57. #
  58. # Cannot import ipam.api.NestedIPAddressSerializer due to circular dependency
  59. class VirtualMachineIPAddressSerializer(serializers.ModelSerializer):
  60. url = serializers.HyperlinkedIdentityField(view_name='ipam-api:ipaddress-detail')
  61. class Meta:
  62. model = IPAddress
  63. fields = ['id', 'url', 'family', 'address']
  64. class VirtualMachineSerializer(CustomFieldModelSerializer):
  65. status = ChoiceFieldSerializer(choices=STATUS_CHOICES)
  66. cluster = NestedClusterSerializer()
  67. role = NestedDeviceRoleSerializer()
  68. tenant = NestedTenantSerializer()
  69. platform = NestedPlatformSerializer()
  70. primary_ip = VirtualMachineIPAddressSerializer()
  71. primary_ip4 = VirtualMachineIPAddressSerializer()
  72. primary_ip6 = VirtualMachineIPAddressSerializer()
  73. class Meta:
  74. model = VirtualMachine
  75. fields = [
  76. 'id', 'name', 'status', 'cluster', 'role', 'tenant', 'platform', 'primary_ip', 'primary_ip4', 'primary_ip6',
  77. 'vcpus', 'memory', 'disk', 'comments', 'custom_fields', 'created', 'last_updated',
  78. ]
  79. class NestedVirtualMachineSerializer(serializers.ModelSerializer):
  80. url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:virtualmachine-detail')
  81. class Meta:
  82. model = VirtualMachine
  83. fields = ['id', 'url', 'name']
  84. class WritableVirtualMachineSerializer(CustomFieldModelSerializer):
  85. class Meta:
  86. model = VirtualMachine
  87. fields = [
  88. 'id', 'name', 'status', 'cluster', 'role', 'tenant', 'platform', 'primary_ip4', 'primary_ip6', 'vcpus',
  89. 'memory', 'disk', 'comments', 'custom_fields', 'created', 'last_updated',
  90. ]
  91. #
  92. # VM interfaces
  93. #
  94. class InterfaceSerializer(serializers.ModelSerializer):
  95. virtual_machine = NestedVirtualMachineSerializer()
  96. class Meta:
  97. model = Interface
  98. fields = [
  99. 'id', 'name', 'virtual_machine', 'enabled', 'mac_address', 'mtu', 'description',
  100. ]
  101. class NestedInterfaceSerializer(serializers.ModelSerializer):
  102. url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:interface-detail')
  103. class Meta:
  104. model = Interface
  105. fields = ['id', 'url', 'name']
  106. class WritableInterfaceSerializer(ValidatedModelSerializer):
  107. form_factor = serializers.IntegerField(default=IFACE_FF_VIRTUAL)
  108. class Meta:
  109. model = Interface
  110. fields = [
  111. 'id', 'name', 'virtual_machine', 'form_factor', 'enabled', 'mac_address', 'mtu', 'description',
  112. ]