serializers.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  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. site = NestedSiteSerializer(read_only=True)
  67. cluster = NestedClusterSerializer(required=False, allow_null=True)
  68. role = NestedDeviceRoleSerializer(required=False, allow_null=True)
  69. tenant = NestedTenantSerializer(required=False, allow_null=True)
  70. platform = NestedPlatformSerializer(required=False, allow_null=True)
  71. primary_ip = VirtualMachineIPAddressSerializer(read_only=True)
  72. primary_ip4 = VirtualMachineIPAddressSerializer(required=False, allow_null=True)
  73. primary_ip6 = VirtualMachineIPAddressSerializer(required=False, allow_null=True)
  74. tags = TagListSerializerField(required=False)
  75. class Meta:
  76. model = VirtualMachine
  77. fields = [
  78. 'id', 'name', 'status', 'site', 'cluster', 'role', 'tenant', 'platform', 'primary_ip', 'primary_ip4',
  79. 'primary_ip6', 'vcpus', 'memory', 'disk', 'comments', 'tags', 'custom_fields', 'created', 'last_updated',
  80. 'local_context_data',
  81. ]
  82. class VirtualMachineWithConfigContextSerializer(VirtualMachineSerializer):
  83. config_context = serializers.SerializerMethodField()
  84. class Meta(VirtualMachineSerializer.Meta):
  85. fields = [
  86. 'id', 'name', 'status', 'cluster', 'role', 'tenant', 'platform', 'primary_ip', 'primary_ip4', 'primary_ip6',
  87. 'vcpus', 'memory', 'disk', 'comments', 'tags', 'custom_fields', 'config_context', 'created', 'last_updated',
  88. 'local_context_data',
  89. ]
  90. def get_config_context(self, obj):
  91. return obj.get_config_context()
  92. class NestedVirtualMachineSerializer(WritableNestedSerializer):
  93. url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:virtualmachine-detail')
  94. class Meta:
  95. model = VirtualMachine
  96. fields = ['id', 'url', 'name']
  97. #
  98. # VM interfaces
  99. #
  100. # Cannot import ipam.api.serializers.NestedVLANSerializer due to circular dependency
  101. class InterfaceVLANSerializer(WritableNestedSerializer):
  102. url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vlan-detail')
  103. class Meta:
  104. model = VLAN
  105. fields = ['id', 'url', 'vid', 'name', 'display_name']
  106. class InterfaceSerializer(TaggitSerializer, ValidatedModelSerializer):
  107. virtual_machine = NestedVirtualMachineSerializer()
  108. form_factor = ChoiceField(choices=IFACE_FF_CHOICES, default=IFACE_FF_VIRTUAL, required=False)
  109. mode = ChoiceField(choices=IFACE_MODE_CHOICES, required=False, allow_null=True)
  110. untagged_vlan = InterfaceVLANSerializer(required=False, allow_null=True)
  111. tagged_vlans = SerializedPKRelatedField(
  112. queryset=VLAN.objects.all(),
  113. serializer=InterfaceVLANSerializer,
  114. required=False,
  115. many=True
  116. )
  117. tags = TagListSerializerField(required=False)
  118. class Meta:
  119. model = Interface
  120. fields = [
  121. 'id', 'virtual_machine', 'name', 'form_factor', 'enabled', 'mtu', 'mac_address', 'description', 'mode',
  122. 'untagged_vlan', 'tagged_vlans', 'tags',
  123. ]
  124. class NestedInterfaceSerializer(WritableNestedSerializer):
  125. url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:interface-detail')
  126. class Meta:
  127. model = Interface
  128. fields = ['id', 'url', 'name']