Просмотр исходного кода

Fixes #1982: Swagger NAPALM documentation

Saria Hajjar 6 лет назад
Родитель
Сommit
ea05b5b606
3 измененных файлов с 16 добавлено и 0 удалено
  1. 1 0
      docs/release-notes/version-2.6.md
  2. 4 0
      netbox/dcim/api/serializers.py
  3. 11 0
      netbox/dcim/api/views.py

+ 1 - 0
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
 

+ 4 - 0
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)

+ 11 - 0
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.")