Example #1
0
class CustomFieldSerializer(ValidatedModelSerializer):
    url = serializers.HyperlinkedIdentityField(
        view_name='extras-api:customfield-detail')
    content_types = ContentTypeField(queryset=ContentType.objects.filter(
        FeatureQuery('custom_fields').get_query()),
                                     many=True)
    type = ChoiceField(choices=CustomFieldTypeChoices)
    filter_logic = ChoiceField(choices=CustomFieldFilterLogicChoices,
                               required=False)

    class Meta:
        model = CustomField
        fields = [
            'id',
            'url',
            'display',
            'content_types',
            'type',
            'name',
            'label',
            'description',
            'required',
            'filter_logic',
            'default',
            'weight',
            'validation_minimum',
            'validation_maximum',
            'validation_regex',
            'choices',
        ]
Example #2
0
class WirelessLANSerializer(PrimaryModelSerializer):
    url = serializers.HyperlinkedIdentityField(
        view_name='wireless-api:wirelesslan-detail')
    group = NestedWirelessLANGroupSerializer(required=False, allow_null=True)
    vlan = NestedVLANSerializer(required=False, allow_null=True)
    auth_type = ChoiceField(choices=WirelessAuthTypeChoices,
                            required=False,
                            allow_blank=True)
    auth_cipher = ChoiceField(choices=WirelessAuthCipherChoices,
                              required=False,
                              allow_blank=True)

    class Meta:
        model = WirelessLAN
        fields = [
            'id',
            'url',
            'display',
            'ssid',
            'description',
            'group',
            'vlan',
            'auth_type',
            'auth_cipher',
            'auth_psk',
            'description',
            'tags',
            'custom_fields',
            'created',
            'last_updated',
        ]
Example #3
0
class IPAddressSerializer(PrimaryModelSerializer):
    url = serializers.HyperlinkedIdentityField(view_name='ipam-api:ipaddress-detail')
    family = ChoiceField(choices=IPAddressFamilyChoices, read_only=True)
    vrf = NestedVRFSerializer(required=False, allow_null=True)
    tenant = NestedTenantSerializer(required=False, allow_null=True)
    status = ChoiceField(choices=IPAddressStatusChoices, required=False)
    role = ChoiceField(choices=IPAddressRoleChoices, allow_blank=True, required=False)
    assigned_object_type = ContentTypeField(
        queryset=ContentType.objects.filter(IPADDRESS_ASSIGNMENT_MODELS),
        required=False,
        allow_null=True
    )
    assigned_object = serializers.SerializerMethodField(read_only=True)
    nat_inside = NestedIPAddressSerializer(required=False, allow_null=True)
    nat_outside = NestedIPAddressSerializer(read_only=True)

    class Meta:
        model = IPAddress
        fields = [
            'id', 'url', 'display', 'family', 'address', 'vrf', 'tenant', 'status', 'role', 'assigned_object_type',
            'assigned_object_id', 'assigned_object', 'nat_inside', 'nat_outside', 'dns_name', 'description', 'tags',
            'custom_fields', 'created', 'last_updated',
        ]
        read_only_fields = ['family']

    @swagger_serializer_method(serializer_or_field=serializers.DictField)
    def get_assigned_object(self, obj):
        if obj.assigned_object is None:
            return None
        serializer = get_serializer_for_model(obj.assigned_object, prefix='Nested')
        context = {'request': self.context['request']}
        return serializer(obj.assigned_object, context=context).data
Example #4
0
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']
Example #5
0
class WirelessLinkSerializer(PrimaryModelSerializer):
    url = serializers.HyperlinkedIdentityField(
        view_name='wireless-api:wirelesslink-detail')
    status = ChoiceField(choices=LinkStatusChoices, required=False)
    interface_a = NestedInterfaceSerializer()
    interface_b = NestedInterfaceSerializer()
    auth_type = ChoiceField(choices=WirelessAuthTypeChoices,
                            required=False,
                            allow_blank=True)
    auth_cipher = ChoiceField(choices=WirelessAuthCipherChoices,
                              required=False,
                              allow_blank=True)

    class Meta:
        model = WirelessLink
        fields = [
            'id',
            'url',
            'display',
            'interface_a',
            'interface_b',
            'ssid',
            'status',
            'description',
            'auth_type',
            'auth_cipher',
            'auth_psk',
            'description',
            'tags',
            'custom_fields',
            'created',
            'last_updated',
        ]
Example #6
0
class PowerOutletSerializer(PrimaryModelSerializer, CableTerminationSerializer, ConnectedEndpointSerializer):
    url = serializers.HyperlinkedIdentityField(view_name='dcim-api:poweroutlet-detail')
    device = NestedDeviceSerializer()
    type = ChoiceField(
        choices=PowerOutletTypeChoices,
        allow_blank=True,
        required=False
    )
    power_port = NestedPowerPortSerializer(
        required=False
    )
    feed_leg = ChoiceField(
        choices=PowerOutletFeedLegChoices,
        allow_blank=True,
        required=False
    )
    cable = NestedCableSerializer(
        read_only=True
    )

    class Meta:
        model = PowerOutlet
        fields = [
            'id', 'url', 'display', 'device', 'name', 'label', 'type', 'power_port', 'feed_leg', 'description',
            'mark_connected', 'cable', 'cable_peer', 'cable_peer_type', 'connected_endpoint', 'connected_endpoint_type',
            'connected_endpoint_reachable', 'tags', 'custom_fields', 'created', 'last_updated', '_occupied',
        ]
Example #7
0
class PowerOutletTemplateSerializer(ValidatedModelSerializer):
    url = serializers.HyperlinkedIdentityField(
        view_name='dcim-api:poweroutlettemplate-detail')
    device_type = NestedDeviceTypeSerializer()
    type = ChoiceField(choices=PowerOutletTypeChoices,
                       allow_blank=True,
                       required=False)
    power_port = NestedPowerPortTemplateSerializer(required=False)
    feed_leg = ChoiceField(choices=PowerOutletFeedLegChoices,
                           allow_blank=True,
                           required=False)

    class Meta:
        model = PowerOutletTemplate
        fields = [
            'id',
            'url',
            'display',
            'device_type',
            'name',
            'label',
            'type',
            'power_port',
            'feed_leg',
            'description',
            'created',
            'last_updated',
        ]
Example #8
0
class PowerFeedSerializer(PrimaryModelSerializer, CableTerminationSerializer, ConnectedEndpointSerializer):
    url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerfeed-detail')
    power_panel = NestedPowerPanelSerializer()
    rack = NestedRackSerializer(
        required=False,
        allow_null=True,
        default=None
    )
    type = ChoiceField(
        choices=PowerFeedTypeChoices,
        default=PowerFeedTypeChoices.TYPE_PRIMARY
    )
    status = ChoiceField(
        choices=PowerFeedStatusChoices,
        default=PowerFeedStatusChoices.STATUS_ACTIVE
    )
    supply = ChoiceField(
        choices=PowerFeedSupplyChoices,
        default=PowerFeedSupplyChoices.SUPPLY_AC
    )
    phase = ChoiceField(
        choices=PowerFeedPhaseChoices,
        default=PowerFeedPhaseChoices.PHASE_SINGLE
    )
    cable = NestedCableSerializer(read_only=True)

    class Meta:
        model = PowerFeed
        fields = [
            'id', 'url', 'display', 'power_panel', 'rack', 'name', 'status', 'type', 'supply', 'phase', 'voltage',
            'amperage', 'max_utilization', 'comments', 'mark_connected', 'cable', 'cable_peer', 'cable_peer_type',
            'connected_endpoint', 'connected_endpoint_type', 'connected_endpoint_reachable', 'tags', 'custom_fields',
            'created', 'last_updated', '_occupied',
        ]
Example #9
0
class IPRangeSerializer(PrimaryModelSerializer):
    url = serializers.HyperlinkedIdentityField(
        view_name='ipam-api:iprange-detail')
    family = ChoiceField(choices=IPAddressFamilyChoices, read_only=True)
    vrf = NestedVRFSerializer(required=False, allow_null=True)
    tenant = NestedTenantSerializer(required=False, allow_null=True)
    status = ChoiceField(choices=IPRangeStatusChoices, required=False)
    role = NestedRoleSerializer(required=False, allow_null=True)
    children = serializers.IntegerField(read_only=True)

    class Meta:
        model = IPRange
        fields = [
            'id',
            'url',
            'display',
            'family',
            'start_address',
            'end_address',
            'size',
            'vrf',
            'tenant',
            'status',
            'role',
            'description',
            'tags',
            'custom_fields',
            'created',
            'last_updated',
            'children',
        ]
        read_only_fields = ['family']
Example #10
0
class InterfaceSerializer(TaggedObjectSerializer, CableTerminationSerializer,
                          ConnectedEndpointSerializer):
    url = serializers.HyperlinkedIdentityField(
        view_name='dcim-api:interface-detail')
    device = NestedDeviceSerializer()
    type = ChoiceField(choices=InterfaceTypeChoices)
    lag = NestedInterfaceSerializer(required=False, allow_null=True)
    mode = ChoiceField(choices=InterfaceModeChoices,
                       allow_blank=True,
                       required=False)
    untagged_vlan = NestedVLANSerializer(required=False, allow_null=True)
    tagged_vlans = SerializedPKRelatedField(queryset=VLAN.objects.all(),
                                            serializer=NestedVLANSerializer,
                                            required=False,
                                            many=True)
    cable = NestedCableSerializer(read_only=True)
    count_ipaddresses = serializers.IntegerField(read_only=True)

    class Meta:
        model = Interface
        fields = [
            'id',
            'url',
            'device',
            'name',
            'label',
            'type',
            'enabled',
            'lag',
            'mtu',
            'mac_address',
            'mgmt_only',
            'description',
            'mode',
            'untagged_vlan',
            'tagged_vlans',
            'cable',
            'cable_peer',
            'cable_peer_type',
            'connected_endpoint',
            'connected_endpoint_type',
            'connected_endpoint_reachable',
            'tags',
            'count_ipaddresses',
        ]

    def validate(self, data):

        # Validate many-to-many VLAN assignments
        device = self.instance.device if self.instance else data.get('device')
        for vlan in data.get('tagged_vlans', []):
            if vlan.site not in [device.site, None]:
                raise serializers.ValidationError({
                    'tagged_vlans':
                    f"VLAN {vlan} must belong to the same site as the interface's parent device, or "
                    f"it must be global."
                })

        return super().validate(data)
Example #11
0
class CableSerializer(PrimaryModelSerializer):
    url = serializers.HyperlinkedIdentityField(
        view_name='dcim-api:cable-detail')
    termination_a_type = ContentTypeField(
        queryset=ContentType.objects.filter(CABLE_TERMINATION_MODELS))
    termination_b_type = ContentTypeField(
        queryset=ContentType.objects.filter(CABLE_TERMINATION_MODELS))
    termination_a = serializers.SerializerMethodField(read_only=True)
    termination_b = serializers.SerializerMethodField(read_only=True)
    status = ChoiceField(choices=CableStatusChoices, required=False)
    length_unit = ChoiceField(choices=CableLengthUnitChoices,
                              allow_blank=True,
                              required=False)

    class Meta:
        model = Cable
        fields = [
            'id',
            'url',
            'display',
            'termination_a_type',
            'termination_a_id',
            'termination_a',
            'termination_b_type',
            'termination_b_id',
            'termination_b',
            'type',
            'status',
            'label',
            'color',
            'length',
            'length_unit',
            'tags',
            'custom_fields',
        ]

    def _get_termination(self, obj, side):
        """
        Serialize a nested representation of a termination.
        """
        if side.lower() not in ['a', 'b']:
            raise ValueError("Termination side must be either A or B.")
        termination = getattr(obj, 'termination_{}'.format(side.lower()))
        if termination is None:
            return None
        serializer = get_serializer_for_model(termination, prefix='Nested')
        context = {'request': self.context['request']}
        data = serializer(termination, context=context).data

        return data

    @swagger_serializer_method(serializer_or_field=serializers.DictField)
    def get_termination_a(self, obj):
        return self._get_termination(obj, 'a')

    @swagger_serializer_method(serializer_or_field=serializers.DictField)
    def get_termination_b(self, obj):
        return self._get_termination(obj, 'b')
Example #12
0
class InterfaceSerializer(PrimaryModelSerializer, LinkTerminationSerializer, ConnectedEndpointSerializer):
    url = serializers.HyperlinkedIdentityField(view_name='dcim-api:interface-detail')
    device = NestedDeviceSerializer()
    type = ChoiceField(choices=InterfaceTypeChoices)
    parent = NestedInterfaceSerializer(required=False, allow_null=True)
    bridge = NestedInterfaceSerializer(required=False, allow_null=True)
    lag = NestedInterfaceSerializer(required=False, allow_null=True)
    mode = ChoiceField(choices=InterfaceModeChoices, allow_blank=True, required=False)
    rf_role = ChoiceField(choices=WirelessRoleChoices, required=False, allow_null=True)
    rf_channel = ChoiceField(choices=WirelessChannelChoices, required=False)
    untagged_vlan = NestedVLANSerializer(required=False, allow_null=True)
    tagged_vlans = SerializedPKRelatedField(
        queryset=VLAN.objects.all(),
        serializer=NestedVLANSerializer,
        required=False,
        many=True
    )
    cable = NestedCableSerializer(read_only=True)
    wireless_link = NestedWirelessLinkSerializer(read_only=True)
    wireless_lans = SerializedPKRelatedField(
        queryset=WirelessLAN.objects.all(),
        serializer=NestedWirelessLANSerializer,
        required=False,
        many=True
    )
    count_ipaddresses = serializers.IntegerField(read_only=True)
    count_fhrp_groups = serializers.IntegerField(read_only=True)

    class Meta:
        model = Interface
        fields = [
            'id', 'url', 'display', 'device', 'name', 'label', 'type', 'enabled', 'parent', 'bridge', 'lag', 'mtu',
            'mac_address', 'wwn', 'mgmt_only', 'description', 'mode', 'rf_role', 'rf_channel', 'rf_channel_frequency',
            'rf_channel_width', 'tx_power', 'untagged_vlan', 'tagged_vlans', 'mark_connected', 'cable', 'wireless_link',
            'link_peer', 'link_peer_type', 'wireless_lans', 'connected_endpoint', 'connected_endpoint_type',
            'connected_endpoint_reachable', 'tags', 'custom_fields', 'created', 'last_updated', 'count_ipaddresses',
            'count_fhrp_groups', '_occupied',
        ]

    def validate(self, data):

        # Validate many-to-many VLAN assignments
        device = self.instance.device if self.instance else data.get('device')
        for vlan in data.get('tagged_vlans', []):
            if vlan.site not in [device.site, None]:
                raise serializers.ValidationError({
                    'tagged_vlans': f"VLAN {vlan} must belong to the same site as the interface's parent device, or "
                                    f"it must be global."
                })

        return super().validate(data)
Example #13
0
class DeviceTypeSerializer(PrimaryModelSerializer):
    url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicetype-detail')
    manufacturer = NestedManufacturerSerializer()
    subdevice_role = ChoiceField(choices=SubdeviceRoleChoices, allow_blank=True, required=False)
    airflow = ChoiceField(choices=DeviceAirflowChoices, allow_blank=True, required=False)
    device_count = serializers.IntegerField(read_only=True)

    class Meta:
        model = DeviceType
        fields = [
            'id', 'url', 'display', 'manufacturer', 'model', 'slug', 'part_number', 'u_height', 'is_full_depth',
            'subdevice_role', 'airflow', 'front_image', 'rear_image', 'comments', 'tags', 'custom_fields', 'created',
            'last_updated', 'device_count',
        ]
Example #14
0
class DeviceSerializer(PrimaryModelSerializer):
    url = serializers.HyperlinkedIdentityField(view_name='dcim-api:device-detail')
    device_type = NestedDeviceTypeSerializer()
    device_role = NestedDeviceRoleSerializer()
    tenant = NestedTenantSerializer(required=False, allow_null=True)
    platform = NestedPlatformSerializer(required=False, allow_null=True)
    site = NestedSiteSerializer()
    location = NestedLocationSerializer(required=False, allow_null=True, default=None)
    rack = NestedRackSerializer(required=False, allow_null=True)
    face = ChoiceField(choices=DeviceFaceChoices, allow_blank=True, required=False)
    status = ChoiceField(choices=DeviceStatusChoices, required=False)
    primary_ip = NestedIPAddressSerializer(read_only=True)
    primary_ip4 = NestedIPAddressSerializer(required=False, allow_null=True)
    primary_ip6 = NestedIPAddressSerializer(required=False, allow_null=True)
    parent_device = serializers.SerializerMethodField()
    cluster = NestedClusterSerializer(required=False, allow_null=True)
    virtual_chassis = NestedVirtualChassisSerializer(required=False, allow_null=True)

    class Meta:
        model = Device
        fields = [
            'id', 'url', 'display', 'name', 'display_name', 'device_type', 'device_role', 'tenant', 'platform',
            'serial', 'asset_tag', 'site', 'location', 'rack', 'position', 'face', 'parent_device', 'status',
            'primary_ip', 'primary_ip4', 'primary_ip6', 'cluster', 'virtual_chassis', 'vc_position', 'vc_priority',
            'comments', 'local_context_data', 'tags', 'custom_fields', 'created', 'last_updated',
        ]
        validators = []

    def validate(self, data):

        # Validate uniqueness of (rack, position, face) since we omitted the automatically-created validator from Meta.
        if data.get('rack') and data.get('position') and data.get('face'):
            validator = UniqueTogetherValidator(queryset=Device.objects.all(), fields=('rack', 'position', 'face'))
            validator(data, self)

        # Enforce model validation
        super().validate(data)

        return data

    @swagger_serializer_method(serializer_or_field=NestedDeviceSerializer)
    def get_parent_device(self, obj):
        try:
            device_bay = obj.parent_bay
        except DeviceBay.DoesNotExist:
            return None
        context = {'request': self.context['request']}
        data = NestedDeviceSerializer(instance=device_bay.device, context=context).data
        data['device_bay'] = NestedDeviceBaySerializer(instance=device_bay, context=context).data
        return data
Example #15
0
class PowerPortSerializer(TaggedObjectSerializer, CableTerminationSerializer,
                          ConnectedEndpointSerializer):
    url = serializers.HyperlinkedIdentityField(
        view_name='dcim-api:powerport-detail')
    device = NestedDeviceSerializer()
    type = ChoiceField(choices=PowerPortTypeChoices,
                       allow_blank=True,
                       required=False)
    cable = NestedCableSerializer(read_only=True)

    class Meta:
        model = PowerPort
        fields = [
            'id',
            'url',
            'device',
            'name',
            'label',
            'type',
            'maximum_draw',
            'allocated_draw',
            'description',
            'cable',
            'cable_peer',
            'cable_peer_type',
            'connected_endpoint',
            'connected_endpoint_type',
            'connected_endpoint_reachable',
            'tags',
        ]
Example #16
0
class FrontPortSerializer(PrimaryModelSerializer, CableTerminationSerializer):
    url = serializers.HyperlinkedIdentityField(
        view_name='dcim-api:frontport-detail')
    device = NestedDeviceSerializer()
    type = ChoiceField(choices=PortTypeChoices)
    rear_port = FrontPortRearPortSerializer()
    cable = NestedCableSerializer(read_only=True)

    class Meta:
        model = FrontPort
        fields = [
            'id',
            'url',
            'display',
            'device',
            'name',
            'label',
            'type',
            'rear_port',
            'rear_port_position',
            'description',
            'mark_connected',
            'cable',
            'cable_peer',
            'cable_peer_type',
            'tags',
            'custom_fields',
            'created',
            'last_updated',
            '_occupied',
        ]
Example #17
0
class CommunitySerializer(NetBoxModelSerializer):
    status = ChoiceField(choices=ASNStatusChoices, required=False)
    tenant = NestedTenantSerializer(required=False, allow_null=True)

    class Meta:
        model = Community
        fields = ['id', 'value', 'status', 'description', 'tenant', 'tags']
Example #18
0
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
Example #19
0
class FrontPortSerializer(TaggedObjectSerializer, CableTerminationSerializer,
                          ValidatedModelSerializer):
    url = serializers.HyperlinkedIdentityField(
        view_name='dcim-api:frontport-detail')
    device = NestedDeviceSerializer()
    type = ChoiceField(choices=PortTypeChoices)
    rear_port = FrontPortRearPortSerializer()
    cable = NestedCableSerializer(read_only=True)

    class Meta:
        model = FrontPort
        fields = [
            'id',
            'url',
            'device',
            'name',
            'label',
            'type',
            'rear_port',
            'rear_port_position',
            'description',
            'cable',
            'cable_peer',
            'cable_peer_type',
            'tags',
        ]
Example #20
0
class SiteSerializer(PrimaryModelSerializer):
    url = serializers.HyperlinkedIdentityField(view_name='dcim-api:site-detail')
    status = ChoiceField(choices=SiteStatusChoices, required=False)
    region = NestedRegionSerializer(required=False, allow_null=True)
    group = NestedSiteGroupSerializer(required=False, allow_null=True)
    tenant = NestedTenantSerializer(required=False, allow_null=True)
    time_zone = TimeZoneSerializerField(required=False)
    asns = SerializedPKRelatedField(
        queryset=ASN.objects.all(),
        serializer=NestedASNSerializer,
        required=False,
        many=True
    )

    # Related object counts
    circuit_count = serializers.IntegerField(read_only=True)
    device_count = serializers.IntegerField(read_only=True)
    prefix_count = serializers.IntegerField(read_only=True)
    rack_count = serializers.IntegerField(read_only=True)
    virtualmachine_count = serializers.IntegerField(read_only=True)
    vlan_count = serializers.IntegerField(read_only=True)

    class Meta:
        model = Site
        fields = [
            'id', 'url', 'display', 'name', 'slug', 'status', 'region', 'group', 'tenant', 'facility', 'asn', 'asns',
            'time_zone', 'description', 'physical_address', 'shipping_address', 'latitude', 'longitude', 'contact_name',
            'contact_phone', 'contact_email', 'comments', 'tags', 'custom_fields', 'created', 'last_updated',
            'circuit_count', 'device_count', 'prefix_count', 'rack_count', 'virtualmachine_count', 'vlan_count',
        ]
Example #21
0
class CircuitSerializer(TaggedObjectSerializer, CustomFieldModelSerializer):
    url = serializers.HyperlinkedIdentityField(
        view_name='circuits-api:circuit-detail')
    provider = NestedProviderSerializer()
    status = ChoiceField(choices=CircuitStatusChoices, required=False)
    type = NestedCircuitTypeSerializer()
    tenant = NestedTenantSerializer(required=False, allow_null=True)
    termination_a = CircuitCircuitTerminationSerializer(read_only=True)
    termination_z = CircuitCircuitTerminationSerializer(read_only=True)

    class Meta:
        model = Circuit
        fields = [
            'id',
            'url',
            'cid',
            'provider',
            'type',
            'status',
            'tenant',
            'install_date',
            'commit_rate',
            'description',
            'termination_a',
            'termination_z',
            'comments',
            'tags',
            'custom_fields',
            'created',
            'last_updated',
        ]
Example #22
0
class AggregateSerializer(PrimaryModelSerializer):
    url = serializers.HyperlinkedIdentityField(
        view_name='ipam-api:aggregate-detail')
    family = ChoiceField(choices=IPAddressFamilyChoices, read_only=True)
    rir = NestedRIRSerializer()
    tenant = NestedTenantSerializer(required=False, allow_null=True)

    class Meta:
        model = Aggregate
        fields = [
            'id',
            'url',
            'display',
            'family',
            'prefix',
            'rir',
            'tenant',
            'date_added',
            'description',
            'tags',
            'custom_fields',
            'created',
            'last_updated',
        ]
        read_only_fields = ['family']
Example #23
0
class ServiceSerializer(PrimaryModelSerializer):
    url = serializers.HyperlinkedIdentityField(
        view_name='ipam-api:service-detail')
    device = NestedDeviceSerializer(required=False, allow_null=True)
    virtual_machine = NestedVirtualMachineSerializer(required=False,
                                                     allow_null=True)
    protocol = ChoiceField(choices=ServiceProtocolChoices, required=False)
    ipaddresses = SerializedPKRelatedField(
        queryset=IPAddress.objects.all(),
        serializer=NestedIPAddressSerializer,
        required=False,
        many=True)

    class Meta:
        model = Service
        fields = [
            'id',
            'url',
            'display',
            'device',
            'virtual_machine',
            'name',
            'ports',
            'protocol',
            'ipaddresses',
            'description',
            'tags',
            'custom_fields',
            'created',
            'last_updated',
        ]
Example #24
0
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',
        ]
Example #25
0
class InterfaceTemplateSerializer(ValidatedModelSerializer):
    url = serializers.HyperlinkedIdentityField(view_name='dcim-api:interfacetemplate-detail')
    device_type = NestedDeviceTypeSerializer()
    type = ChoiceField(choices=InterfaceTypeChoices)

    class Meta:
        model = InterfaceTemplate
        fields = ['id', 'url', 'device_type', 'name', 'label', 'type', 'mgmt_only', 'description']
Example #26
0
class RearPortTemplateSerializer(ValidatedModelSerializer):
    url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rearporttemplate-detail')
    device_type = NestedDeviceTypeSerializer()
    type = ChoiceField(choices=PortTypeChoices)

    class Meta:
        model = RearPortTemplate
        fields = ['id', 'url', 'device_type', 'name', 'label', 'type', 'positions', 'description']
Example #27
0
class NestedJobResultSerializer(serializers.ModelSerializer):
    url = serializers.HyperlinkedIdentityField(
        view_name='extras-api:jobresult-detail')
    status = ChoiceField(choices=choices.JobResultStatusChoices)
    user = NestedUserSerializer(read_only=True)

    class Meta:
        model = models.JobResult
        fields = ['url', 'created', 'completed', 'user', 'status']
Example #28
0
class RackUnitSerializer(serializers.Serializer):
    """
    A rack unit is an abstraction formed by the set (rack, position, face); it does not exist as a row in the database.
    """
    id = serializers.IntegerField(read_only=True)
    name = serializers.CharField(read_only=True)
    face = ChoiceField(choices=DeviceFaceChoices, read_only=True)
    device = NestedDeviceSerializer(read_only=True)
    occupied = serializers.BooleanField(read_only=True)
Example #29
0
class VMInterfaceSerializer(PrimaryModelSerializer):
    url = serializers.HyperlinkedIdentityField(
        view_name='virtualization-api:vminterface-detail')
    virtual_machine = NestedVirtualMachineSerializer()
    parent = NestedVMInterfaceSerializer(required=False, allow_null=True)
    bridge = NestedVMInterfaceSerializer(required=False, allow_null=True)
    mode = ChoiceField(choices=InterfaceModeChoices,
                       allow_blank=True,
                       required=False)
    untagged_vlan = NestedVLANSerializer(required=False, allow_null=True)
    tagged_vlans = SerializedPKRelatedField(queryset=VLAN.objects.all(),
                                            serializer=NestedVLANSerializer,
                                            required=False,
                                            many=True)
    count_ipaddresses = serializers.IntegerField(read_only=True)
    count_fhrp_groups = serializers.IntegerField(read_only=True)

    class Meta:
        model = VMInterface
        fields = [
            'id',
            'url',
            'display',
            'virtual_machine',
            'name',
            'enabled',
            'parent',
            'bridge',
            'mtu',
            'mac_address',
            'description',
            'mode',
            'untagged_vlan',
            'tagged_vlans',
            'tags',
            'custom_fields',
            'created',
            'last_updated',
            'count_ipaddresses',
            'count_fhrp_groups',
        ]

    def validate(self, data):

        # Validate many-to-many VLAN assignments
        virtual_machine = self.instance.virtual_machine if self.instance else data.get(
            'virtual_machine')
        for vlan in data.get('tagged_vlans', []):
            if vlan.site not in [virtual_machine.site, None]:
                raise serializers.ValidationError({
                    'tagged_vlans':
                    f"VLAN {vlan} must belong to the same site as the interface's parent virtual "
                    f"machine, or it must be global."
                })

        return super().validate(data)
Example #30
0
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'
        ]