|
|
@@ -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.")
|