serializers.py 4.7 KB

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