From ea05b5b60614940561931d52bd06e5f5735bfcf1 Mon Sep 17 00:00:00 2001 From: Saria Hajjar Date: Wed, 8 Jan 2020 13:34:46 +0000 Subject: [PATCH] Fixes #1982: Swagger NAPALM documentation --- docs/release-notes/version-2.6.md | 1 + netbox/dcim/api/serializers.py | 4 ++++ netbox/dcim/api/views.py | 11 +++++++++++ 3 files changed, 16 insertions(+) diff --git a/docs/release-notes/version-2.6.md b/docs/release-notes/version-2.6.md index f3ff8798a..90eba7327 100644 --- a/docs/release-notes/version-2.6.md +++ b/docs/release-notes/version-2.6.md @@ -2,6 +2,7 @@ ## Enhancements +* [#1982](https://github.com/netbox-community/netbox/issues/1982) - Improved NAPALM method documentation in Swagger * [#2050](https://github.com/netbox-community/netbox/issues/2050) - Preview image attachments when hovering the link * [#3187](https://github.com/netbox-community/netbox/issues/3187) - Add rack selection field to rack elevations diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index 495709268..db5fe992f 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -370,6 +370,10 @@ class DeviceWithConfigContextSerializer(DeviceSerializer): return obj.get_config_context() +class DeviceNAPALMSerializer(serializers.Serializer): + method = serializers.DictField() + + class ConsoleServerPortSerializer(TaggitSerializer, ConnectedEndpointSerializer): device = NestedDeviceSerializer() cable = NestedCableSerializer(read_only=True) diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index 12774e4be..9bfe0f421 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -327,6 +327,13 @@ class DeviceViewSet(CustomFieldModelViewSet): ) filterset_class = filters.DeviceFilter + _method = Parameter( + name='method', + in_='query', + required=True, + type=openapi.TYPE_STRING + ) + def get_serializer_class(self): """ Select the specific serializer based on the request context. @@ -358,11 +365,15 @@ class DeviceViewSet(CustomFieldModelViewSet): return Response(serializer.data) + @swagger_auto_schema(manual_parameters=[_method], responses={'200': serializers.DeviceNAPALMSerializer}) @action(detail=True, url_path='napalm') def napalm(self, request, pk): """ Execute a NAPALM method on a Device """ + if not request.GET.get('method'): + raise ServiceUnavailable('No NAPALM methods were specified.') + device = get_object_or_404(Device, pk=pk) if not device.primary_ip: raise ServiceUnavailable("This device does not have a primary IP address configured.")