from rest_framework import viewsets, status from rest_framework.response import Response from rest_framework.permissions import IsAuthenticated from rest_framework.decorators import action from .models import AnsibleTask from .serializers import AnsibleTaskSerializer, AnsibleTaskDetailSerializer from .services import run_ansible_job, get_ssh_key_from_auth_server class AnsibleTaskViewSet(viewsets.ModelViewSet): serializer_class = AnsibleTaskSerializer permission_classes = [IsAuthenticated] def get_queryset(self): # ✅ 현재 로그인한 사용자의 email로 필터 return AnsibleTask.objects.filter(author_email=self.request.user.email).order_by("-created_at") def get_serializer_class(self): if self.action == "retrieve": return AnsibleTaskDetailSerializer return AnsibleTaskSerializer def create(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) # ✅ author_email 저장 task = serializer.save(author_email=request.user.email) return Response(self.get_serializer(task).data, status=status.HTTP_201_CREATED) # try: # token = request.headers.get("Authorization", "").replace("Bearer ", "") # ssh_key = get_ssh_key_from_auth_server(token) # run_ansible_job(task, ssh_key) # return Response(self.get_serializer(task).data, status=status.HTTP_201_CREATED) # except Exception as e: # return Response({"error": f"작업 실행 실패: {str(e)}"}, status=500) @action(detail=True, methods=["post"], url_path="run") def run_task(self, request, pk=None): task = self.get_object() try: token = request.headers.get("Authorization", "").replace("Bearer ", "") ssh_key = get_ssh_key_from_auth_server(token) run_ansible_job(task, ssh_key) return Response(self.get_serializer(task).data) except Exception as e: return Response({"error": f"작업 실행 실패: {str(e)}"}, status=500)