1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

Add available IPs REST API endpoint for IP ranges

This commit is contained in:
jeremystretch
2021-07-19 09:32:04 -04:00
parent 747c065213
commit 0fe1a426c0
4 changed files with 78 additions and 7 deletions

View File

@@ -98,6 +98,7 @@ class AvailablePrefixesMixin:
class AvailableIPsMixin:
parent_model = Prefix
@swagger_auto_schema(method='get', responses={200: serializers.AvailableIPSerializer(many=True)})
@swagger_auto_schema(method='post', responses={201: serializers.AvailableIPSerializer(many=True)},
@@ -113,7 +114,7 @@ class AvailableIPsMixin:
The advisory lock decorator uses a PostgreSQL advisory lock to prevent this API from being
invoked in parallel, which results in a race condition where multiple insertions can occur.
"""
parent = get_object_or_404(Prefix.objects.restrict(request.user), pk=pk)
parent = get_object_or_404(self.parent_model.objects.restrict(request.user), pk=pk)
# Create the next available IP
if request.method == 'POST':
@@ -174,8 +175,7 @@ class AvailableIPsMixin:
break
serializer = serializers.AvailableIPSerializer(ip_list, many=True, context={
'request': request,
'prefix': parent.prefix,
'vrf': parent.vrf,
'parent': parent,
})
return Response(serializer.data)

View File

@@ -329,9 +329,9 @@ class AvailableIPSerializer(serializers.Serializer):
else:
vrf = None
return OrderedDict([
('family', self.context['prefix'].version),
('address', '{}/{}'.format(instance, self.context['prefix'].prefixlen)),
('vrf', vrf),
('family', self.context['parent'].family),
('address', f"{instance}/{self.context['parent'].mask_length}"),
('vrf', self.context['parent'].vrf),
])

View File

@@ -87,6 +87,8 @@ class PrefixViewSet(mixins.AvailableIPsMixin, mixins.AvailablePrefixesMixin, Cus
serializer_class = serializers.PrefixSerializer
filterset_class = filtersets.PrefixFilterSet
parent_model = Prefix # AvailableIPsMixin
def get_serializer_class(self):
if self.action == "available_prefixes" and self.request.method == "POST":
return serializers.PrefixLengthSerializer
@@ -97,11 +99,13 @@ class PrefixViewSet(mixins.AvailableIPsMixin, mixins.AvailablePrefixesMixin, Cus
# IP ranges
#
class IPRangeViewSet(CustomFieldModelViewSet):
class IPRangeViewSet(mixins.AvailableIPsMixin, CustomFieldModelViewSet):
queryset = IPRange.objects.prefetch_related('vrf', 'role', 'tenant', 'tags')
serializer_class = serializers.IPRangeSerializer
filterset_class = filtersets.IPRangeFilterSet
parent_model = IPRange # AvailableIPsMixin
#
# IP addresses