Files
msa-django-ansible/ansible/views.py
2025-05-21 01:08:10 +09:00

48 lines
2.1 KiB
Python

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)