serializers.py 4.3 KB

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