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
« 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
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
12__all__ = (
13 'ClusterGroupSerializer',
14 'ClusterSerializer',
15 'ClusterTypeSerializer',
16)
19class ClusterTypeSerializer(OrganizationalModelSerializer):
21 # Related object counts
22 cluster_count = RelatedObjectCountField('clusters')
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')
33class ClusterGroupSerializer(OrganizationalModelSerializer):
35 # Related object counts
36 cluster_count = RelatedObjectCountField('clusters')
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')
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,
67 )
68 allocated_memory = serializers.IntegerField(read_only=True)
69 allocated_disk = serializers.IntegerField(read_only=True)
71 # Related object counts
72 device_count = RelatedObjectCountField('devices')
73 virtualmachine_count = RelatedObjectCountField('virtual_machines')
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')