Skip to content

Nautobot IP Availability API Package

nautobot_ip_availability.api

REST API module for nautobot_ip_availability app.

serializers

API serializers for nautobot_ip_availability.

AvailablePrefixResultSerializer

Bases: Serializer

Serializes an available prefix result (read-only).

Source code in nautobot_ip_availability/api/serializers.py
class AvailablePrefixResultSerializer(serializers.Serializer):
    """Serializes an available prefix result (read-only)."""

    prefix = serializers.CharField()
    prefix_length = serializers.IntegerField()
    ip_version = serializers.IntegerField()
    size = serializers.IntegerField()
    parent_prefix = serializers.CharField()

    def create(self, validated_data):
        """Not used — this serializer is read-only."""
        raise NotImplementedError("AvailablePrefixResultSerializer is read-only.")

    def update(self, instance, validated_data):
        """Not used — this serializer is read-only."""
        raise NotImplementedError("AvailablePrefixResultSerializer is read-only.")
create(validated_data)

Not used — this serializer is read-only.

Source code in nautobot_ip_availability/api/serializers.py
def create(self, validated_data):
    """Not used — this serializer is read-only."""
    raise NotImplementedError("AvailablePrefixResultSerializer is read-only.")
update(instance, validated_data)

Not used — this serializer is read-only.

Source code in nautobot_ip_availability/api/serializers.py
def update(self, instance, validated_data):
    """Not used — this serializer is read-only."""
    raise NotImplementedError("AvailablePrefixResultSerializer is read-only.")

PrefixAvailabilityRequestSerializer

Bases: Serializer

Validates input for the available prefixes query.

Source code in nautobot_ip_availability/api/serializers.py
class PrefixAvailabilityRequestSerializer(serializers.Serializer):
    """Validates input for the available prefixes query."""

    parent_prefix = serializers.UUIDField(
        required=True,
        help_text="UUID of the parent prefix to search within.",
    )
    prefix_lengths = serializers.ListField(
        child=serializers.IntegerField(min_value=1, max_value=128),
        required=True,
        help_text="List of desired prefix lengths, e.g. [24, 28].",
    )

    def validate_prefix_lengths(self, value):
        """Ensure at least one prefix length is provided."""
        if not value:
            raise serializers.ValidationError("At least one prefix length is required.")
        return sorted(set(value))

    def create(self, validated_data):
        """Not used — this serializer is for input validation only."""
        raise NotImplementedError("PrefixAvailabilityRequestSerializer is read-only.")

    def update(self, instance, validated_data):
        """Not used — this serializer is for input validation only."""
        raise NotImplementedError("PrefixAvailabilityRequestSerializer is read-only.")
create(validated_data)

Not used — this serializer is for input validation only.

Source code in nautobot_ip_availability/api/serializers.py
def create(self, validated_data):
    """Not used — this serializer is for input validation only."""
    raise NotImplementedError("PrefixAvailabilityRequestSerializer is read-only.")
update(instance, validated_data)

Not used — this serializer is for input validation only.

Source code in nautobot_ip_availability/api/serializers.py
def update(self, instance, validated_data):
    """Not used — this serializer is for input validation only."""
    raise NotImplementedError("PrefixAvailabilityRequestSerializer is read-only.")
validate_prefix_lengths(value)

Ensure at least one prefix length is provided.

Source code in nautobot_ip_availability/api/serializers.py
def validate_prefix_lengths(self, value):
    """Ensure at least one prefix length is provided."""
    if not value:
        raise serializers.ValidationError("At least one prefix length is required.")
    return sorted(set(value))

urls

Django API urlpatterns declaration for nautobot_ip_availability app.

views

API views for nautobot_ip_availability.

AvailablePrefixesAPIView

Bases: APIView

API endpoint to query available IP prefixes within a parent prefix.

Source code in nautobot_ip_availability/api/views.py
class AvailablePrefixesAPIView(APIView):
    """API endpoint to query available IP prefixes within a parent prefix."""

    permission_classes = [IsAuthenticated]

    def post(self, request):
        """Find available prefixes based on parent prefix and desired CIDR sizes."""
        serializer = PrefixAvailabilityRequestSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        parent_prefix_id = serializer.validated_data["parent_prefix"]
        prefix_lengths = serializer.validated_data["prefix_lengths"]

        try:
            parent_prefix = Prefix.objects.get(pk=parent_prefix_id)
        except Prefix.DoesNotExist:
            return Response(
                {"detail": f"Prefix with id '{parent_prefix_id}' not found."},
                status=status.HTTP_404_NOT_FOUND,
            )

        # Validate prefix lengths against parent
        for length in prefix_lengths:
            if length <= parent_prefix.prefix_length:
                return Response(
                    {"detail": f"Prefix length /{length} must be greater than parent /{parent_prefix.prefix_length}."},
                    status=status.HTTP_400_BAD_REQUEST,
                )

        results, truncated = get_available_prefixes_for_parent(
            parent_prefix=parent_prefix,
            prefix_lengths=prefix_lengths,
        )

        result_serializer = AvailablePrefixResultSerializer(results, many=True)
        return Response(
            {
                "parent_prefix": str(parent_prefix.prefix),
                "requested_prefix_lengths": prefix_lengths,
                "count": len(results),
                "truncated": truncated,
                "results": result_serializer.data,
            },
            status=status.HTTP_200_OK,
        )
post(request)

Find available prefixes based on parent prefix and desired CIDR sizes.

Source code in nautobot_ip_availability/api/views.py
def post(self, request):
    """Find available prefixes based on parent prefix and desired CIDR sizes."""
    serializer = PrefixAvailabilityRequestSerializer(data=request.data)
    serializer.is_valid(raise_exception=True)

    parent_prefix_id = serializer.validated_data["parent_prefix"]
    prefix_lengths = serializer.validated_data["prefix_lengths"]

    try:
        parent_prefix = Prefix.objects.get(pk=parent_prefix_id)
    except Prefix.DoesNotExist:
        return Response(
            {"detail": f"Prefix with id '{parent_prefix_id}' not found."},
            status=status.HTTP_404_NOT_FOUND,
        )

    # Validate prefix lengths against parent
    for length in prefix_lengths:
        if length <= parent_prefix.prefix_length:
            return Response(
                {"detail": f"Prefix length /{length} must be greater than parent /{parent_prefix.prefix_length}."},
                status=status.HTTP_400_BAD_REQUEST,
            )

    results, truncated = get_available_prefixes_for_parent(
        parent_prefix=parent_prefix,
        prefix_lengths=prefix_lengths,
    )

    result_serializer = AvailablePrefixResultSerializer(results, many=True)
    return Response(
        {
            "parent_prefix": str(parent_prefix.prefix),
            "requested_prefix_lengths": prefix_lengths,
            "count": len(results),
            "truncated": truncated,
            "results": result_serializer.data,
        },
        status=status.HTTP_200_OK,
    )