From 17950faa870cd48fa114fc87d7c3b5755c12fd32 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 16 Mar 2022 13:37:47 -0400 Subject: [PATCH] Implement REST API --- netbox_access_lists/api/__init__.py | 0 netbox_access_lists/api/serializers.py | 58 ++++++++++++++++++++++++++ netbox_access_lists/api/urls.py | 12 ++++++ netbox_access_lists/api/views.py | 22 ++++++++++ 4 files changed, 92 insertions(+) create mode 100644 netbox_access_lists/api/__init__.py create mode 100644 netbox_access_lists/api/serializers.py create mode 100644 netbox_access_lists/api/urls.py create mode 100644 netbox_access_lists/api/views.py diff --git a/netbox_access_lists/api/__init__.py b/netbox_access_lists/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/netbox_access_lists/api/serializers.py b/netbox_access_lists/api/serializers.py new file mode 100644 index 0000000..391019f --- /dev/null +++ b/netbox_access_lists/api/serializers.py @@ -0,0 +1,58 @@ +from rest_framework import serializers + +from ipam.api.serializers import NestedPrefixSerializer +from netbox.api.serializers import NetBoxModelSerializer, WritableNestedSerializer +from ..models import AccessList, AccessListRule + + +# +# Nested serializers +# + +class NestedAccessListSerializer(WritableNestedSerializer): + url = serializers.HyperlinkedIdentityField(view_name='plugins-api:netbox_access_lists-api:accesslist-detail') + + class Meta: + model = AccessList + fields = ('id', 'url', 'display', 'name') + + +class NestedAccessListRuleSerializer(WritableNestedSerializer): + url = serializers.HyperlinkedIdentityField(view_name='plugins-api:netbox_access_lists-api:accesslistrule-detail') + + class Meta: + model = AccessListRule + fields = ('id', 'url', 'display', 'index') + + +# +# Regular serializers +# + +class AccessListSerializer(NetBoxModelSerializer): + url = serializers.HyperlinkedIdentityField( + view_name='plugins-api:netbox_access_lists-api:accesslist-detail' + ) + rule_count = serializers.IntegerField(read_only=True) + + class Meta: + model = AccessList + fields = ( + 'id', 'url', 'display', 'name', 'default_action', 'comments', 'tags', 'custom_fields', 'created', + 'last_updated', 'rule_count', + ) + + +class AccessListRuleSerializer(NetBoxModelSerializer): + url = serializers.HyperlinkedIdentityField(view_name='plugins-api:netbox_access_lists-api:accesslistrule-detail') + access_list = NestedAccessListSerializer() + source_prefix = NestedPrefixSerializer() + destination_prefix = NestedPrefixSerializer() + + class Meta: + model = AccessListRule + fields = ( + 'id', 'url', 'display', 'access_list', 'index', 'protocol', 'source_prefix', 'source_ports', + 'destination_prefix', 'destination_ports', 'action', 'tags', 'custom_fields', 'created', 'last_updated', + ) + diff --git a/netbox_access_lists/api/urls.py b/netbox_access_lists/api/urls.py new file mode 100644 index 0000000..3906e8d --- /dev/null +++ b/netbox_access_lists/api/urls.py @@ -0,0 +1,12 @@ +from netbox.api.routers import NetBoxRouter +from . import views + + +app_name = 'netbox_access_list' + +router = NetBoxRouter() +router.register('access-lists', views.AccessListViewSet) +router.register('access-list-rules', views.AccessListRuleViewSet) + +urlpatterns = router.urls + diff --git a/netbox_access_lists/api/views.py b/netbox_access_lists/api/views.py new file mode 100644 index 0000000..db33cfa --- /dev/null +++ b/netbox_access_lists/api/views.py @@ -0,0 +1,22 @@ +from django.db.models import Count + +from netbox.api.viewsets import NetBoxModelViewSet + +from .. import filtersets, models +from .serializers import AccessListSerializer, AccessListRuleSerializer + + +class AccessListViewSet(NetBoxModelViewSet): + queryset = models.AccessList.objects.prefetch_related('tags').annotate( + rule_count=Count('rules') + ) + serializer_class = AccessListSerializer + + +class AccessListRuleViewSet(NetBoxModelViewSet): + queryset = models.AccessListRule.objects.prefetch_related( + 'access_list', 'source_prefix', 'destination_prefix', 'tags' + ) + serializer_class = AccessListRuleSerializer + filterset_class = filtersets.AccessListRuleFilterSet +