serializers.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. from rest_framework import serializers
  2. from taggit_serializer.serializers import TaggitSerializer, TagListSerializerField
  3. from dcim.api.nested_serializers import NestedDeviceRoleSerializer, NestedPlatformSerializer, NestedSiteSerializer
  4. from dcim.constants import IFACE_FF_CHOICES, IFACE_FF_VIRTUAL, IFACE_MODE_CHOICES
  5. from dcim.models import Interface
  6. from extras.api.customfields import CustomFieldModelSerializer
  7. from ipam.api.nested_serializers import NestedIPAddressSerializer, NestedVLANSerializer
  8. from ipam.models import VLAN
  9. from tenancy.api.nested_serializers import NestedTenantSerializer
  10. from utilities.api import ChoiceField, SerializedPKRelatedField, ValidatedModelSerializer
  11. from virtualization.constants import VM_STATUS_CHOICES
  12. from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine
  13. from .nested_serializers import *
  14. #
  15. # Clusters
  16. #
  17. class ClusterTypeSerializer(ValidatedModelSerializer):
  18. class Meta:
  19. model = ClusterType
  20. fields = ['id', 'name', 'slug']
  21. class ClusterGroupSerializer(ValidatedModelSerializer):
  22. class Meta:
  23. model = ClusterGroup
  24. fields = ['id', 'name', 'slug']
  25. class ClusterSerializer(TaggitSerializer, CustomFieldModelSerializer):
  26. type = NestedClusterTypeSerializer()
  27. group = NestedClusterGroupSerializer(required=False, allow_null=True)
  28. site = NestedSiteSerializer(required=False, allow_null=True)
  29. tags = TagListSerializerField(required=False)
  30. class Meta:
  31. model = Cluster
  32. fields = [
  33. 'id', 'name', 'type', 'group', 'site', 'comments', 'tags', 'custom_fields', 'created', 'last_updated',
  34. ]
  35. #
  36. # Virtual machines
  37. #
  38. class VirtualMachineSerializer(TaggitSerializer, CustomFieldModelSerializer):
  39. status = ChoiceField(choices=VM_STATUS_CHOICES, required=False)
  40. site = NestedSiteSerializer(read_only=True)
  41. cluster = NestedClusterSerializer(required=False, allow_null=True)
  42. role = NestedDeviceRoleSerializer(required=False, allow_null=True)
  43. tenant = NestedTenantSerializer(required=False, allow_null=True)
  44. platform = NestedPlatformSerializer(required=False, allow_null=True)
  45. primary_ip = NestedIPAddressSerializer(read_only=True)
  46. primary_ip4 = NestedIPAddressSerializer(required=False, allow_null=True)
  47. primary_ip6 = NestedIPAddressSerializer(required=False, allow_null=True)
  48. tags = TagListSerializerField(required=False)
  49. class Meta:
  50. model = VirtualMachine
  51. fields = [
  52. 'id', 'name', 'status', 'site', 'cluster', 'role', 'tenant', 'platform', 'primary_ip', 'primary_ip4',
  53. 'primary_ip6', 'vcpus', 'memory', 'disk', 'comments', 'local_context_data', 'tags', 'custom_fields',
  54. 'created', 'last_updated',
  55. ]
  56. class VirtualMachineWithConfigContextSerializer(VirtualMachineSerializer):
  57. config_context = serializers.SerializerMethodField()
  58. class Meta(VirtualMachineSerializer.Meta):
  59. fields = [
  60. 'id', 'name', 'status', 'site', 'cluster', 'role', 'tenant', 'platform', 'primary_ip', 'primary_ip4',
  61. 'primary_ip6', 'vcpus', 'memory', 'disk', 'comments', 'local_context_data', 'tags', 'custom_fields',
  62. 'config_context', 'created', 'last_updated',
  63. ]
  64. def get_config_context(self, obj):
  65. return obj.get_config_context()
  66. #
  67. # VM interfaces
  68. #
  69. class InterfaceSerializer(TaggitSerializer, ValidatedModelSerializer):
  70. virtual_machine = NestedVirtualMachineSerializer()
  71. form_factor = ChoiceField(choices=IFACE_FF_CHOICES, default=IFACE_FF_VIRTUAL, required=False)
  72. mode = ChoiceField(choices=IFACE_MODE_CHOICES, required=False, allow_null=True)
  73. untagged_vlan = NestedVLANSerializer(required=False, allow_null=True)
  74. tagged_vlans = SerializedPKRelatedField(
  75. queryset=VLAN.objects.all(),
  76. serializer=NestedVLANSerializer,
  77. required=False,
  78. many=True
  79. )
  80. tags = TagListSerializerField(required=False)
  81. class Meta:
  82. model = Interface
  83. fields = [
  84. 'id', 'virtual_machine', 'name', 'form_factor', 'enabled', 'mtu', 'mac_address', 'description', 'mode',
  85. 'untagged_vlan', 'tagged_vlans', 'tags',
  86. ]