serializers.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. from __future__ import unicode_literals
  2. from rest_framework import serializers
  3. from taggit_serializer.serializers import TaggitSerializer, TagListSerializerField
  4. from dcim.api.serializers import NestedDeviceRoleSerializer, NestedPlatformSerializer, NestedSiteSerializer
  5. from dcim.constants import IFACE_FF_CHOICES, IFACE_FF_VIRTUAL, IFACE_MODE_CHOICES
  6. from dcim.models import Interface
  7. from extras.api.customfields import CustomFieldModelSerializer
  8. from ipam.models import IPAddress, VLAN
  9. from tenancy.api.serializers import NestedTenantSerializer
  10. from utilities.api import ChoiceField, SerializedPKRelatedField, ValidatedModelSerializer, WritableNestedSerializer
  11. from virtualization.constants import VM_STATUS_CHOICES
  12. from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine
  13. #
  14. # Cluster types
  15. #
  16. class ClusterTypeSerializer(ValidatedModelSerializer):
  17. class Meta:
  18. model = ClusterType
  19. fields = ['id', 'name', 'slug']
  20. class NestedClusterTypeSerializer(WritableNestedSerializer):
  21. url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustertype-detail')
  22. class Meta:
  23. model = ClusterType
  24. fields = ['id', 'url', 'name', 'slug']
  25. #
  26. # Cluster groups
  27. #
  28. class ClusterGroupSerializer(ValidatedModelSerializer):
  29. class Meta:
  30. model = ClusterGroup
  31. fields = ['id', 'name', 'slug']
  32. class NestedClusterGroupSerializer(WritableNestedSerializer):
  33. url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:clustergroup-detail')
  34. class Meta:
  35. model = ClusterGroup
  36. fields = ['id', 'url', 'name', 'slug']
  37. #
  38. # Clusters
  39. #
  40. class ClusterSerializer(TaggitSerializer, CustomFieldModelSerializer):
  41. type = NestedClusterTypeSerializer()
  42. group = NestedClusterGroupSerializer(required=False, allow_null=True)
  43. site = NestedSiteSerializer(required=False, allow_null=True)
  44. tags = TagListSerializerField(required=False)
  45. class Meta:
  46. model = Cluster
  47. fields = [
  48. 'id', 'name', 'type', 'group', 'site', 'comments', 'tags', 'custom_fields', 'created', 'last_updated',
  49. ]
  50. class NestedClusterSerializer(WritableNestedSerializer):
  51. url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:cluster-detail')
  52. class Meta:
  53. model = Cluster
  54. fields = ['id', 'url', 'name']
  55. #
  56. # Virtual machines
  57. #
  58. # Cannot import ipam.api.NestedIPAddressSerializer due to circular dependency
  59. class VirtualMachineIPAddressSerializer(WritableNestedSerializer):
  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(TaggitSerializer, CustomFieldModelSerializer):
  65. status = ChoiceField(choices=VM_STATUS_CHOICES, required=False)
  66. cluster = NestedClusterSerializer(required=False, allow_null=True)
  67. role = NestedDeviceRoleSerializer(required=False, allow_null=True)
  68. tenant = NestedTenantSerializer(required=False, allow_null=True)
  69. platform = NestedPlatformSerializer(required=False, allow_null=True)
  70. primary_ip = VirtualMachineIPAddressSerializer(read_only=True)
  71. primary_ip4 = VirtualMachineIPAddressSerializer(required=False, allow_null=True)
  72. primary_ip6 = VirtualMachineIPAddressSerializer(required=False, allow_null=True)
  73. tags = TagListSerializerField(required=False)
  74. class Meta:
  75. model = VirtualMachine
  76. fields = [
  77. 'id', 'name', 'status', 'cluster', 'role', 'tenant', 'platform', 'primary_ip', 'primary_ip4', 'primary_ip6',
  78. 'vcpus', 'memory', 'disk', 'comments', 'tags', 'custom_fields', 'created', 'last_updated',
  79. ]
  80. class VirtualMachineWithConfigContextSerializer(VirtualMachineSerializer):
  81. config_context = serializers.SerializerMethodField()
  82. class Meta(VirtualMachineSerializer.Meta):
  83. fields = [
  84. 'id', 'name', 'status', 'cluster', 'role', 'tenant', 'platform', 'primary_ip', 'primary_ip4', 'primary_ip6',
  85. 'vcpus', 'memory', 'disk', 'comments', 'tags', 'custom_fields', 'config_context', 'created', 'last_updated',
  86. ]
  87. def get_config_context(self, obj):
  88. return obj.get_config_context()
  89. class NestedVirtualMachineSerializer(WritableNestedSerializer):
  90. url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:virtualmachine-detail')
  91. class Meta:
  92. model = VirtualMachine
  93. fields = ['id', 'url', 'name']
  94. #
  95. # VM interfaces
  96. #
  97. # Cannot import ipam.api.serializers.NestedVLANSerializer due to circular dependency
  98. class InterfaceVLANSerializer(WritableNestedSerializer):
  99. url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vlan-detail')
  100. class Meta:
  101. model = VLAN
  102. fields = ['id', 'url', 'vid', 'name', 'display_name']
  103. class InterfaceSerializer(TaggitSerializer, ValidatedModelSerializer):
  104. virtual_machine = NestedVirtualMachineSerializer()
  105. form_factor = ChoiceField(choices=IFACE_FF_CHOICES, default=IFACE_FF_VIRTUAL, required=False)
  106. mode = ChoiceField(choices=IFACE_MODE_CHOICES, required=False)
  107. untagged_vlan = InterfaceVLANSerializer(required=False, allow_null=True)
  108. tagged_vlans = SerializedPKRelatedField(
  109. queryset=VLAN.objects.all(),
  110. serializer=InterfaceVLANSerializer,
  111. required=False,
  112. many=True
  113. )
  114. tags = TagListSerializerField(required=False)
  115. class Meta:
  116. model = Interface
  117. fields = [
  118. 'id', 'virtual_machine', 'name', 'form_factor', 'enabled', 'mtu', 'mac_address', 'description', 'mode',
  119. 'untagged_vlan', 'tagged_vlans', 'tags',
  120. ]
  121. class NestedInterfaceSerializer(WritableNestedSerializer):
  122. url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:interface-detail')
  123. class Meta:
  124. model = Interface
  125. fields = ['id', 'url', 'name']