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:
@@ -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)
|
||||
|
@@ -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),
|
||||
])
|
||||
|
||||
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user