clusters.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. from dcim.constants import LOCATION_SCOPE_TYPES
  2. from django.contrib.contenttypes.models import ContentType
  3. from drf_spectacular.utils import extend_schema_field
  4. from rest_framework import serializers
  5. from netbox.api.fields import ChoiceField, ContentTypeField, RelatedObjectCountField
  6. from netbox.api.serializers import NetBoxModelSerializer
  7. from tenancy.api.serializers_.tenants import TenantSerializer
  8. from virtualization.choices import *
  9. from virtualization.models import Cluster, ClusterGroup, ClusterType
  10. from utilities.api import get_serializer_for_model
  11. __all__ = (
  12. 'ClusterGroupSerializer',
  13. 'ClusterSerializer',
  14. 'ClusterTypeSerializer',
  15. )
  16. class ClusterTypeSerializer(NetBoxModelSerializer):
  17. # Related object counts
  18. cluster_count = RelatedObjectCountField('clusters')
  19. class Meta:
  20. model = ClusterType
  21. fields = [
  22. 'id', 'url', 'display_url', 'display', 'name', 'slug', 'description', 'tags', 'custom_fields',
  23. 'created', 'last_updated', 'cluster_count',
  24. ]
  25. brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'cluster_count')
  26. class ClusterGroupSerializer(NetBoxModelSerializer):
  27. # Related object counts
  28. cluster_count = RelatedObjectCountField('clusters')
  29. class Meta:
  30. model = ClusterGroup
  31. fields = [
  32. 'id', 'url', 'display_url', 'display', 'name', 'slug', 'description', 'tags', 'custom_fields',
  33. 'created', 'last_updated', 'cluster_count',
  34. ]
  35. brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'cluster_count')
  36. class ClusterSerializer(NetBoxModelSerializer):
  37. type = ClusterTypeSerializer(nested=True)
  38. group = ClusterGroupSerializer(nested=True, required=False, allow_null=True, default=None)
  39. status = ChoiceField(choices=ClusterStatusChoices, required=False)
  40. tenant = TenantSerializer(nested=True, required=False, allow_null=True)
  41. scope_type = ContentTypeField(
  42. queryset=ContentType.objects.filter(
  43. model__in=LOCATION_SCOPE_TYPES
  44. ),
  45. allow_null=True,
  46. required=False,
  47. default=None
  48. )
  49. scope_id = serializers.IntegerField(allow_null=True, required=False, default=None)
  50. scope = serializers.SerializerMethodField(read_only=True)
  51. # Related object counts
  52. device_count = RelatedObjectCountField('devices')
  53. virtualmachine_count = RelatedObjectCountField('virtual_machines')
  54. class Meta:
  55. model = Cluster
  56. fields = [
  57. 'id', 'url', 'display_url', 'display', 'name', 'type', 'group', 'status', 'tenant', 'scope_type', 'scope_id', 'scope',
  58. 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', 'device_count',
  59. 'virtualmachine_count',
  60. ]
  61. brief_fields = ('id', 'url', 'display', 'name', 'description', 'virtualmachine_count')
  62. @extend_schema_field(serializers.JSONField(allow_null=True))
  63. def get_scope(self, obj):
  64. if obj.scope_id is None:
  65. return None
  66. serializer = get_serializer_for_model(obj.scope)
  67. context = {'request': self.context['request']}
  68. return serializer(obj.scope, nested=True, context=context).data