class VLANSerializer(PrimaryModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vlan-detail') site = NestedSiteSerializer(required=False, allow_null=True) group = NestedVLANGroupSerializer(required=False, allow_null=True) tenant = NestedTenantSerializer(required=False, allow_null=True) status = ChoiceField(choices=VLANStatusChoices, required=False) role = NestedRoleSerializer(required=False, allow_null=True) prefix_count = serializers.IntegerField(read_only=True) class Meta: model = VLAN fields = [ 'id', 'url', 'display', 'site', 'group', 'vid', 'name', 'tenant', 'status', 'role', 'description', 'tags', 'display_name', 'custom_fields', 'created', 'last_updated', 'prefix_count', ] validators = [] def validate(self, data): # Validate uniqueness of vid and name if a group has been assigned. if data.get('group', None): for field in ['vid', 'name']: validator = UniqueTogetherValidator(queryset=VLAN.objects.all(), fields=('group', field)) validator(data, self) # Enforce model validation super().validate(data) return data
class PrefixSerializer(PrimaryModelSerializer): url = serializers.HyperlinkedIdentityField( view_name='ipam-api:prefix-detail') family = ChoiceField(choices=IPAddressFamilyChoices, read_only=True) site = NestedSiteSerializer(required=False, allow_null=True) vrf = NestedVRFSerializer(required=False, allow_null=True) tenant = NestedTenantSerializer(required=False, allow_null=True) vlan = NestedVLANSerializer(required=False, allow_null=True) status = ChoiceField(choices=PrefixStatusChoices, required=False) role = NestedRoleSerializer(required=False, allow_null=True) class Meta: model = Prefix fields = [ 'id', 'url', 'display', 'family', 'prefix', 'site', 'vrf', 'tenant', 'vlan', 'status', 'role', 'is_pool', 'description', 'tags', 'custom_fields', 'created', 'last_updated', ] read_only_fields = ['family']
class ClusterSerializer(PrimaryModelSerializer): url = serializers.HyperlinkedIdentityField( view_name='virtualization-api:cluster-detail') type = NestedClusterTypeSerializer() group = NestedClusterGroupSerializer(required=False, allow_null=True, default=None) tenant = NestedTenantSerializer(required=False, allow_null=True) site = NestedSiteSerializer(required=False, allow_null=True, default=None) device_count = serializers.IntegerField(read_only=True) virtualmachine_count = serializers.IntegerField(read_only=True) class Meta: model = Cluster fields = [ 'id', 'url', 'display', 'name', 'type', 'group', 'tenant', 'site', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', 'device_count', 'virtualmachine_count', ]
class VLANGroupSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField( view_name='ipam-api:vlangroup-detail') site = NestedSiteSerializer(required=False, allow_null=True) vlan_count = serializers.IntegerField(read_only=True) class Meta: model = VLANGroup fields = [ 'id', 'url', 'name', 'slug', 'site', 'description', 'vlan_count' ] validators = [] def validate(self, data): # Validate uniqueness of name and slug if a site has been assigned. if data.get('site', None): for field in ['name', 'slug']: validator = UniqueTogetherValidator( queryset=VLANGroup.objects.all(), fields=('site', field)) validator(data, self) # Enforce model validation super().validate(data) return data
class CircuitTerminationSerializer(BaseModelSerializer, CableTerminationSerializer): url = serializers.HyperlinkedIdentityField( view_name='circuits-api:circuittermination-detail') circuit = NestedCircuitSerializer() site = NestedSiteSerializer(required=False) provider_network = NestedProviderNetworkSerializer(required=False) cable = NestedCableSerializer(read_only=True) class Meta: model = CircuitTermination fields = [ 'id', 'url', 'display', 'circuit', 'term_side', 'site', 'provider_network', 'port_speed', 'upstream_speed', 'xconnect_id', 'pp_info', 'description', 'mark_connected', 'cable', 'cable_peer', 'cable_peer_type', '_occupied', ]
class ClusterSerializer(TaggitSerializer, CustomFieldModelSerializer): type = NestedClusterTypeSerializer() group = NestedClusterGroupSerializer(required=False, allow_null=True) tenant = NestedTenantSerializer(required=False, allow_null=True) site = NestedSiteSerializer(required=False, allow_null=True) tags = TagListSerializerField(required=False) device_count = serializers.IntegerField(read_only=True) virtualmachine_count = serializers.IntegerField(read_only=True) class Meta: model = Cluster fields = [ 'id', 'name', 'type', 'group', 'tenant', 'site', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', 'device_count', 'virtualmachine_count', ]
class VLANSerializer(PrimaryModelSerializer): url = serializers.HyperlinkedIdentityField( view_name='ipam-api:vlan-detail') site = NestedSiteSerializer(required=False, allow_null=True) group = NestedVLANGroupSerializer(required=False, allow_null=True, default=None) tenant = NestedTenantSerializer(required=False, allow_null=True) status = ChoiceField(choices=VLANStatusChoices, required=False) role = NestedRoleSerializer(required=False, allow_null=True) prefix_count = serializers.IntegerField(read_only=True) class Meta: model = VLAN fields = [ 'id', 'url', 'display', 'site', 'group', 'vid', 'name', 'tenant', 'status', 'role', 'description', 'tags', 'custom_fields', 'created', 'last_updated', 'prefix_count', ]
class VLANSerializer(TaggitSerializer, CustomFieldModelSerializer): site = NestedSiteSerializer(required=False, allow_null=True) group = NestedVLANGroupSerializer(required=False, allow_null=True) tenant = NestedTenantSerializer(required=False, allow_null=True) status = ChoiceField(choices=VLAN_STATUS_CHOICES, required=False) role = NestedRoleSerializer(required=False, allow_null=True) tags = TagListSerializerField(required=False) class Meta: model = VLAN fields = [ 'id', 'site', 'group', 'vid', 'name', 'tenant', 'status', 'role', 'description', 'tags', 'display_name', 'custom_fields', 'created', 'last_updated', ] validators = [] def validate(self, data): # Validate uniqueness of vid and name if a group has been assigned. if data.get('group', None): for field in ['vid', 'name']: validator = UniqueTogetherValidator(queryset=VLAN.objects.all(), fields=('group', field)) validator.set_context(self) validator(data) # Enforce model validation super().validate(data) return data
class PrefixSerializer(TaggitSerializer, CustomFieldModelSerializer): family = ChoiceField(choices=IPAddressFamilyChoices, read_only=True) site = NestedSiteSerializer(required=False, allow_null=True) vrf = NestedVRFSerializer(required=False, allow_null=True) tenant = NestedTenantSerializer(required=False, allow_null=True) vlan = NestedVLANSerializer(required=False, allow_null=True) status = ChoiceField(choices=PrefixStatusChoices, required=False) role = NestedRoleSerializer(required=False, allow_null=True) tags = TagListSerializerField(required=False) class Meta: model = Prefix fields = [ 'id', 'family', 'prefix', 'site', 'vrf', 'tenant', 'vlan', 'status', 'role', 'is_pool', 'description', 'tags', 'custom_fields', 'created', 'last_updated', ] read_only_fields = ['family']
class TopologyMapSerializer(ValidatedModelSerializer): site = NestedSiteSerializer() class Meta: model = TopologyMap fields = [ 'id', 'name', 'slug', 'site', 'device_patterns', 'description' ]
class CircuitCircuitTerminationSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuittermination-detail') site = NestedSiteSerializer() connected_endpoint = NestedInterfaceSerializer() class Meta: model = CircuitTermination fields = ['id', 'url', 'site', 'connected_endpoint', 'port_speed', 'upstream_speed', 'xconnect_id']
class ASNSerializer(TaggedObjectSerializer, CustomFieldModelSerializer): status = ChoiceField(choices=ASNStatusChoices, required=False) site = NestedSiteSerializer(required=False, allow_null=True) tenant = NestedTenantSerializer(required=False, allow_null=True) class Meta: model = ASN fields = [ 'number', 'id', 'status', 'description', 'site', 'tenant', 'tags' ]
class CircuitTerminationSerializer(ConnectedEndpointSerializer): circuit = NestedCircuitSerializer() site = NestedSiteSerializer() cable = NestedCableSerializer(read_only=True) class Meta: model = CircuitTermination fields = [ 'id', 'circuit', 'term_side', 'site', 'port_speed', 'upstream_speed', 'xconnect_id', 'pp_info', 'description', 'connected_endpoint_type', 'connected_endpoint', 'connection_status', 'cable', ]
class CircuitTerminationSerializer(ConnectedEndpointSerializer): url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuittermination-detail') circuit = NestedCircuitSerializer() site = NestedSiteSerializer() cable = NestedCableSerializer(read_only=True) class Meta: model = CircuitTermination fields = [ 'id', 'url', 'circuit', 'term_side', 'site', 'port_speed', 'upstream_speed', 'xconnect_id', 'pp_info', 'description', 'connected_endpoint_type', 'connected_endpoint', 'connection_status', 'cable', ]
class BGPSessionSerializer(TaggedObjectSerializer, CustomFieldModelSerializer): status = ChoiceField(choices=SessionStatusChoices, required=False) site = NestedSiteSerializer(required=False, allow_null=True) tenant = NestedTenantSerializer(required=False, allow_null=True) device = NestedDeviceSerializer(required=False, allow_null=True) local_address = NestedIPAddressSerializer(required=True, allow_null=False) remote_address = NestedIPAddressSerializer(required=True, allow_null=False) local_as = ASNSerializer(required=True, allow_null=False) remote_as = ASNSerializer(required=True, allow_null=False) class Meta: model = BGPSession fields = '__all__'
class ASNSerializer(TaggedObjectSerializer, CustomFieldModelSerializer): status = ChoiceField(choices=ASNStatusChoices, required=False) site = NestedSiteSerializer(required=False, allow_null=True) tenant = NestedTenantSerializer(required=False, allow_null=True) def validate(self, attrs): if ASN.objects.filter(number=attrs['number'], tenant=attrs.get('tenant')).exists(): raise ValidationError( {'error': 'Asn with this Number and Tenant already exists.'} ) return attrs class Meta: model = ASN fields = ['number', 'id', 'status', 'description', 'custom_fields', 'site', 'tenant', 'tags']
class CircuitCircuitTerminationSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField( view_name='circuits-api:circuittermination-detail') site = NestedSiteSerializer() provider_network = NestedProviderNetworkSerializer() class Meta: model = CircuitTermination fields = [ 'id', 'url', 'display', 'site', 'provider_network', 'port_speed', 'upstream_speed', 'xconnect_id', ]
class BGPSessionSerializer(TaggedObjectSerializer, CustomFieldModelSerializer): status = ChoiceField(choices=SessionStatusChoices, required=False) site = NestedSiteSerializer(required=False, allow_null=True) tenant = NestedTenantSerializer(required=False, allow_null=True) device = NestedDeviceSerializer(required=False, allow_null=True) local_address = NestedIPAddressSerializer(required=True, allow_null=False) remote_address = NestedIPAddressSerializer(required=True, allow_null=False) local_as = NestedASNSerializer(required=True, allow_null=False) remote_as = NestedASNSerializer(required=True, allow_null=False) peer_group = NestedBGPPeerGroupSerializer(required=False, allow_null=True) import_policies = SerializedPKRelatedField( queryset=RoutingPolicy.objects.all(), serializer=NestedRoutingPolicySerializer, required=False, allow_null=True, many=True ) export_policies = SerializedPKRelatedField( queryset=RoutingPolicy.objects.all(), serializer=NestedRoutingPolicySerializer, required=False, allow_null=True, many=True ) class Meta: model = BGPSession fields = '__all__' def to_representation(self, instance): ret = super().to_representation(instance) if instance is not None: if instance.peer_group: for pol in instance.peer_group.import_policies.difference(instance.import_policies.all()): ret['import_policies'].append( NestedRoutingPolicySerializer(pol, context={'request': self.context['request']}).data ) for pol in instance.peer_group.export_policies.difference(instance.export_policies.all()): ret['export_policies'].append( NestedRoutingPolicySerializer(pol, context={'request': self.context['request']}).data ) return ret
class ClusterSerializer(TaggitSerializer, CustomFieldModelSerializer): type = NestedClusterTypeSerializer() group = NestedClusterGroupSerializer(required=False, allow_null=True) site = NestedSiteSerializer(required=False, allow_null=True) tags = TagListSerializerField(required=False) class Meta: model = Cluster fields = [ 'id', 'name', 'type', 'group', 'site', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', ]
class VirtualMachineSerializer(TaggitSerializer, CustomFieldModelSerializer): status = ChoiceField(choices=VirtualMachineStatusChoices, required=False) site = NestedSiteSerializer(read_only=True) cluster = NestedClusterSerializer() role = NestedDeviceRoleSerializer(required=False, allow_null=True) tenant = NestedTenantSerializer(required=False, allow_null=True) platform = NestedPlatformSerializer(required=False, allow_null=True) primary_ip = NestedIPAddressSerializer(read_only=True) primary_ip4 = NestedIPAddressSerializer(required=False, allow_null=True) primary_ip6 = NestedIPAddressSerializer(required=False, allow_null=True) tags = TagListSerializerField(required=False) class Meta: model = VirtualMachine fields = [ 'id', 'name', 'status', 'site', 'cluster', 'role', 'tenant', 'platform', 'primary_ip', 'primary_ip4', 'primary_ip6', 'vcpus', 'memory', 'disk', 'comments', 'local_context_data', 'tags', 'custom_fields', 'created', 'last_updated', ] validators = []
class VLANGroupSerializer(ValidatedModelSerializer): site = NestedSiteSerializer(required=False, allow_null=True) class Meta: model = VLANGroup fields = ['id', 'name', 'slug', 'site'] validators = [] def validate(self, data): # Validate uniqueness of name and slug if a site has been assigned. if data.get('site', None): for field in ['name', 'slug']: validator = UniqueTogetherValidator(queryset=VLANGroup.objects.all(), fields=('site', field)) validator.set_context(self) validator(data) # Enforce model validation super().validate(data) return data
class VirtualMachineSerializer(PrimaryModelSerializer): url = serializers.HyperlinkedIdentityField( view_name='virtualization-api:virtualmachine-detail') status = ChoiceField(choices=VirtualMachineStatusChoices, required=False) site = NestedSiteSerializer(read_only=True) cluster = NestedClusterSerializer() role = NestedDeviceRoleSerializer(required=False, allow_null=True) tenant = NestedTenantSerializer(required=False, allow_null=True) platform = NestedPlatformSerializer(required=False, allow_null=True) primary_ip = NestedIPAddressSerializer(read_only=True) primary_ip4 = NestedIPAddressSerializer(required=False, allow_null=True) primary_ip6 = NestedIPAddressSerializer(required=False, allow_null=True) class Meta: model = VirtualMachine fields = [ 'id', 'url', 'display', 'name', 'status', 'site', 'cluster', 'role', 'tenant', 'platform', 'primary_ip', 'primary_ip4', 'primary_ip6', 'vcpus', 'memory', 'disk', 'comments', 'local_context_data', 'tags', 'custom_fields', 'created', 'last_updated', ] validators = []
class BgpPeeringSerializer(serializers.ModelSerializer): """Serializer for the BgpPeering model.""" site = NestedSiteSerializer( many=False, read_only=False, required=False, help_text="BgpPeering Site", ) device = NestedDeviceSerializer( many=False, read_only=False, required=True, help_text="BgpPeering Device", ) local_ip = NestedIPAddressSerializer( many=False, read_only=False, required=True, help_text="Local peering IP", ) class Meta: model = BgpPeering fields = [ "id", "site", "device", "local_ip", "local_as", "remote_ip", "remote_as", "peer_name", "description", ]
class ASNSerializer(NetBoxModelSerializer): status = ChoiceField(choices=ASNStatusChoices, required=False) site = NestedSiteSerializer(required=False, allow_null=True) tenant = NestedTenantSerializer(required=False, allow_null=True) def validate(self, attrs): try: number = attrs['number'] tenant = attrs.get('tenant') except KeyError: # this is patch return attrs if ASN.objects.filter(number=number, tenant=tenant).exists(): raise ValidationError( {'error': 'Asn with this Number and Tenant already exists.'}) return attrs class Meta: ref_name = 'BGP_ASN' model = ASN fields = [ 'number', 'id', 'display', 'status', 'description', 'custom_fields', 'site', 'tenant', 'tags' ]
class BGPSessionSerializer(NetBoxModelSerializer): status = ChoiceField(choices=SessionStatusChoices, required=False) site = NestedSiteSerializer(required=False, allow_null=True) tenant = NestedTenantSerializer(required=False, allow_null=True) device = NestedDeviceSerializer(required=False, allow_null=True) local_address = NestedIPAddressSerializer(required=True, allow_null=False) remote_address = NestedIPAddressSerializer(required=True, allow_null=False) local_as = NestedASNSerializer(required=True, allow_null=False) remote_as = NestedASNSerializer(required=True, allow_null=False) peer_group = NestedBGPPeerGroupSerializer(required=False, allow_null=True) import_policies = SerializedPKRelatedField( queryset=RoutingPolicy.objects.all(), serializer=NestedRoutingPolicySerializer, required=False, allow_null=True, many=True) export_policies = SerializedPKRelatedField( queryset=RoutingPolicy.objects.all(), serializer=NestedRoutingPolicySerializer, required=False, allow_null=True, many=True) class Meta: model = BGPSession fields = '__all__' validators = [] def validate(self, attrs): qs = BGPSession.objects.filter( device=attrs.get('device'), local_as=attrs.get('local_as'), local_address=attrs.get('local_address'), remote_as=attrs.get('remote_as'), remote_address=attrs.get('remote_address'), ) if qs.exists(): raise ValidationError({ 'error': 'BGP Session with this Device, Local address, Local AS, Remote address and Remote AS already exists.' }) return attrs def to_representation(self, instance): ret = super().to_representation(instance) if instance is not None: if instance.peer_group: for pol in instance.peer_group.import_policies.difference( instance.import_policies.all()): ret['import_policies'].append( NestedRoutingPolicySerializer( pol, context={ 'request': self.context['request'] }).data) for pol in instance.peer_group.export_policies.difference( instance.export_policies.all()): ret['export_policies'].append( NestedRoutingPolicySerializer( pol, context={ 'request': self.context['request'] }).data) return ret