|
@@ -1,6 +1,8 @@
|
|
|
from __future__ import unicode_literals
|
|
|
|
|
|
+from rest_framework import status
|
|
|
from rest_framework.decorators import detail_route
|
|
|
+from rest_framework.exceptions import PermissionDenied
|
|
|
from rest_framework.response import Response
|
|
|
from rest_framework.viewsets import ModelViewSet
|
|
|
|
|
@@ -66,7 +68,7 @@ class PrefixViewSet(WritableSerializerMixin, CustomFieldModelViewSet):
|
|
|
write_serializer_class = serializers.WritablePrefixSerializer
|
|
|
filter_class = filters.PrefixFilter
|
|
|
|
|
|
- @detail_route(url_path='available-ips')
|
|
|
+ @detail_route(url_path='available-ips', methods=['get', 'post'])
|
|
|
def available_ips(self, request, pk=None):
|
|
|
"""
|
|
|
A convenience method for returning available IP addresses within a prefix. By default, the number of IPs
|
|
@@ -75,23 +77,52 @@ class PrefixViewSet(WritableSerializerMixin, CustomFieldModelViewSet):
|
|
|
"""
|
|
|
prefix = get_object_or_404(Prefix, pk=pk)
|
|
|
|
|
|
+
|
|
|
+ if request.method == 'POST':
|
|
|
+
|
|
|
+
|
|
|
+ if not request.user.has_perm('ipam.add_ipaddress'):
|
|
|
+ raise PermissionDenied()
|
|
|
+
|
|
|
+
|
|
|
+ try:
|
|
|
+ ipaddress = list(prefix.get_available_ips())[0]
|
|
|
+ except IndexError:
|
|
|
+ return Response(
|
|
|
+ {
|
|
|
+ "detail": "There are no available IPs within this prefix ({})".format(prefix)
|
|
|
+ },
|
|
|
+ status=status.HTTP_400_BAD_REQUEST
|
|
|
+ )
|
|
|
+
|
|
|
+
|
|
|
+ data = request.data.copy()
|
|
|
+ data['address'] = '{}/{}'.format(ipaddress, prefix.prefix.prefixlen)
|
|
|
+ data['vrf'] = prefix.vrf
|
|
|
+ serializer = serializers.WritableIPAddressSerializer(data=data)
|
|
|
+ if serializer.is_valid():
|
|
|
+ serializer.save()
|
|
|
+ return Response(serializer.data, status=status.HTTP_201_CREATED)
|
|
|
+ return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
|
|
+
|
|
|
|
|
|
- try:
|
|
|
- limit = int(request.query_params.get('limit', settings.PAGINATE_COUNT))
|
|
|
- except ValueError:
|
|
|
- limit = settings.PAGINATE_COUNT
|
|
|
- if settings.MAX_PAGE_SIZE:
|
|
|
- limit = min(limit, settings.MAX_PAGE_SIZE)
|
|
|
-
|
|
|
-
|
|
|
- ip_list = list(prefix.get_available_ips())[:limit]
|
|
|
- serializer = serializers.AvailableIPSerializer(ip_list, many=True, context={
|
|
|
- 'request': request,
|
|
|
- 'prefix': prefix.prefix,
|
|
|
- 'vrf': prefix.vrf,
|
|
|
- })
|
|
|
-
|
|
|
- return Response(serializer.data)
|
|
|
+ else:
|
|
|
+ try:
|
|
|
+ limit = int(request.query_params.get('limit', settings.PAGINATE_COUNT))
|
|
|
+ except ValueError:
|
|
|
+ limit = settings.PAGINATE_COUNT
|
|
|
+ if settings.MAX_PAGE_SIZE:
|
|
|
+ limit = min(limit, settings.MAX_PAGE_SIZE)
|
|
|
+
|
|
|
+
|
|
|
+ ip_list = list(prefix.get_available_ips())[:limit]
|
|
|
+ serializer = serializers.AvailableIPSerializer(ip_list, many=True, context={
|
|
|
+ 'request': request,
|
|
|
+ 'prefix': prefix.prefix,
|
|
|
+ 'vrf': prefix.vrf,
|
|
|
+ })
|
|
|
+
|
|
|
+ return Response(serializer.data)
|
|
|
|
|
|
|
|
|
|