Coverage for virtualization/api/serializers_/clusters.py: 100%

39 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-10-10 18:35 +0000

1from django.contrib.contenttypes.models import ContentType 

2from rest_framework import serializers 

3 

4from dcim.constants import LOCATION_SCOPE_TYPES 

5from netbox.api.fields import ChoiceField, ContentTypeField, RelatedObjectCountField 

6from netbox.api.gfk_fields import GFKSerializerField 

7from netbox.api.serializers import OrganizationalModelSerializer, PrimaryModelSerializer 

8from tenancy.api.serializers_.tenants import TenantSerializer 

9from virtualization.choices import * 

10from virtualization.models import Cluster, ClusterGroup, ClusterType 

11 

12__all__ = ( 

13 'ClusterGroupSerializer', 

14 'ClusterSerializer', 

15 'ClusterTypeSerializer', 

16) 

17 

18 

19class ClusterTypeSerializer(OrganizationalModelSerializer): 

20 

21 # Related object counts 

22 cluster_count = RelatedObjectCountField('clusters') 

23 

24 class Meta: 

25 model = ClusterType 

26 fields = [ 

27 'id', 'url', 'display_url', 'display', 'name', 'slug', 'description', 'owner', 'comments', 'tags', 

28 'custom_fields', 'created', 'last_updated', 'cluster_count', 

29 ] 

30 brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'cluster_count') 

31 

32 

33class ClusterGroupSerializer(OrganizationalModelSerializer): 

34 

35 # Related object counts 

36 cluster_count = RelatedObjectCountField('clusters') 

37 

38 class Meta: 

39 model = ClusterGroup 

40 fields = [ 

41 'id', 'url', 'display_url', 'display', 'name', 'slug', 'description', 'owner', 'comments', 'tags', 

42 'custom_fields', 'created', 'last_updated', 'cluster_count', 

43 ] 

44 brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'cluster_count') 

45 

46 

47class ClusterSerializer(PrimaryModelSerializer): 

48 type = ClusterTypeSerializer(nested=True) 

49 group = ClusterGroupSerializer(nested=True, required=False, allow_null=True, default=None) 

50 status = ChoiceField(choices=ClusterStatusChoices, required=False) 

51 tenant = TenantSerializer(nested=True, required=False, allow_null=True) 

52 scope_type = ContentTypeField( 

53 queryset=ContentType.objects.filter( 

54 model__in=LOCATION_SCOPE_TYPES 

55 ), 

56 allow_null=True, 

57 required=False, 

58 default=None 

59 ) 

60 scope_id = serializers.IntegerField(allow_null=True, required=False, default=None) 

61 scope = GFKSerializerField(read_only=True) 

62 allocated_vcpus = serializers.DecimalField( 

63 read_only=True, 

64 max_digits=8, 

65 decimal_places=2, 

66 

67 ) 

68 allocated_memory = serializers.IntegerField(read_only=True) 

69 allocated_disk = serializers.IntegerField(read_only=True) 

70 

71 # Related object counts 

72 device_count = RelatedObjectCountField('devices') 

73 virtualmachine_count = RelatedObjectCountField('virtual_machines') 

74 

75 class Meta: 

76 model = Cluster 

77 fields = [ 

78 'id', 'url', 'display_url', 'display', 'name', 'type', 'group', 'status', 'tenant', 'scope_type', 

79 'scope_id', 'scope', 'description', 'owner', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', 

80 'device_count', 'virtualmachine_count', 'allocated_vcpus', 'allocated_memory', 'allocated_disk' 

81 ] 

82 brief_fields = ('id', 'url', 'display', 'name', 'description', 'virtualmachine_count')