# coding:utf-8 from rest_framework.response import Response from rest_framework.views import APIView from drf_spectacular.utils import extend_schema, OpenApiResponse, OpenApiParameter, OpenApiExample, OpenApiTypes from .serializers import ProcessListSerializer, ProcessDetailPutSerializer, ProcessDetailDeleteSerializer from monitor.pagination import CustomPagination from utils.supervisord_utils import SupervisordUtils from monitor.permissions import LoginPermission class ProcessListView(APIView): permission_classes = [LoginPermission] @extend_schema( parameters=[ OpenApiParameter( name='page', type=OpenApiTypes.STR, location=OpenApiParameter.QUERY, description='页码,第几页', ), OpenApiParameter( name='size', type=OpenApiTypes.STR, location=OpenApiParameter.QUERY, description='每页条目数', ), OpenApiParameter( name='name', type=OpenApiTypes.STR, location=OpenApiParameter.QUERY, description='进程名称', ), ], description="获取监控列表接口", request=None, responses=ProcessListSerializer ) def get(self, request): name = request.query_params.get('name', '').strip() data_list = SupervisordUtils().list(name) page = CustomPagination() queryset = page.paginate_queryset(data_list, request=request, view=self) serobj = ProcessListSerializer(queryset, many=True) return page.get_paginated_response(serobj.data) class ProcessDetailView(APIView): permission_classes = [LoginPermission] @extend_schema( description="停止/重启进程接口", request=ProcessDetailPutSerializer, responses={ 200: OpenApiResponse(description="无返回值") } ) def post(self, request, *args, **kwargs): serobj = ProcessDetailPutSerializer(data=request.data) if not serobj.is_valid(): return Response(serobj.errors, status=400) action = request.data['action'] name = request.data['name'] sup = SupervisordUtils() if action == 'restart': sup.restart(name) else: sup.stop(name) return Response(status=200) class ProcessDeleteView(APIView): permission_classes = [LoginPermission] @extend_schema( description="删除进程进程接口", request=ProcessDetailDeleteSerializer, responses={ 200: OpenApiResponse(description="无返回值") } ) def post(self, request, *args, **kwargs): serobj = ProcessDetailDeleteSerializer(data=request.data) if not serobj.is_valid(): return Response(serobj.errors, status=400) name = request.data['name'] sup = SupervisordUtils() sup.remove(name) return Response(status=200)