first commit
This commit is contained in:
141
app/api/vms.py
Normal file
141
app/api/vms.py
Normal file
@@ -0,0 +1,141 @@
|
||||
from fastapi import APIRouter, Depends
|
||||
from sqlalchemy.orm import Session
|
||||
from typing import List
|
||||
from app.database import get_db
|
||||
from app.schemas.vm import VMInfo, VMListResponse, VMDetail, VMControlRequest, VMControlResponse
|
||||
from app.schemas.auth import CurrentUser
|
||||
from app.api.auth import get_current_user
|
||||
from app.services.proxmox_service import proxmox_service
|
||||
from app.models.vm import VMAccess
|
||||
from app.utils.exceptions import NotFoundError, PermissionDeniedError
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
@router.get("/my", response_model=VMListResponse)
|
||||
async def get_my_vms(
|
||||
current_user: CurrentUser = Depends(get_current_user),
|
||||
db: Session = Depends(get_db)
|
||||
):
|
||||
"""
|
||||
내 VM 목록 조회
|
||||
|
||||
현재 사용자가 접근 가능한 VM 목록을 반환합니다.
|
||||
"""
|
||||
# Proxmox에서 모든 VM 가져오기
|
||||
all_vms = await proxmox_service.get_all_vms()
|
||||
|
||||
# 현재 사용자의 VMAccess 정보 조회
|
||||
vm_accesses = db.query(VMAccess).filter(
|
||||
VMAccess.user_id == current_user.id,
|
||||
VMAccess.is_active == True
|
||||
).all()
|
||||
|
||||
# vm_id를 키로 하는 딕셔너리 생성
|
||||
access_map = {access.vm_id: access for access in vm_accesses}
|
||||
|
||||
vm_list = []
|
||||
for vm in all_vms:
|
||||
vm_id = vm["vmid"]
|
||||
access = access_map.get(vm_id)
|
||||
|
||||
# VMAccess가 있으면 해당 정보 사용, 없으면 기본값
|
||||
vm_info = VMInfo(
|
||||
vm_id=vm_id,
|
||||
node=vm["node"],
|
||||
name=vm.get("name", "Unknown"),
|
||||
status=vm.get("status", "unknown"),
|
||||
ip_address=access.static_ip if access else None, # Static IP 자동 설정
|
||||
cpus=vm.get("cpus", 0),
|
||||
memory=vm.get("maxmem", 0) // (1024 * 1024), # bytes to MB
|
||||
memory_usage=vm.get("mem", 0) // (1024 * 1024) if vm.get("mem") else None,
|
||||
cpu_usage=vm.get("cpu", 0),
|
||||
can_start=True,
|
||||
can_stop=True,
|
||||
can_reboot=True,
|
||||
can_connect=True,
|
||||
rdp_username=access.rdp_username if access else None, # RDP 사용자명
|
||||
rdp_password=access.rdp_password if access else None, # RDP 비밀번호
|
||||
rdp_port=access.rdp_port if access else 3389 # RDP 포트
|
||||
)
|
||||
vm_list.append(vm_info)
|
||||
|
||||
return VMListResponse(total=len(vm_list), vms=vm_list)
|
||||
|
||||
@router.get("/{vm_id}", response_model=VMDetail)
|
||||
async def get_vm_detail(
|
||||
vm_id: int,
|
||||
node: str,
|
||||
current_user: CurrentUser = Depends(get_current_user)
|
||||
):
|
||||
"""
|
||||
VM 상세 정보 조회
|
||||
"""
|
||||
# VM 상태 조회
|
||||
status = await proxmox_service.get_vm_status(node, vm_id)
|
||||
|
||||
if not status:
|
||||
raise NotFoundError(f"VM {vm_id}를 찾을 수 없습니다")
|
||||
|
||||
# IP 조회 제거 - 연결에 필요하지 않음
|
||||
return VMDetail(
|
||||
vm_id=vm_id,
|
||||
node=node,
|
||||
name=status.get("name", "Unknown"),
|
||||
status=status.get("status", "unknown"),
|
||||
ip_address=None, # IP 조회 안 함
|
||||
cpus=status.get("cpus", 0),
|
||||
memory=status.get("maxmem", 0) // (1024 * 1024),
|
||||
memory_usage=status.get("mem", 0) // (1024 * 1024) if status.get("mem") else None,
|
||||
cpu_usage=status.get("cpu", 0),
|
||||
uptime=status.get("uptime"),
|
||||
rdp_port=3389,
|
||||
has_guest_agent=False # Guest Agent 불필요
|
||||
)
|
||||
|
||||
@router.post("/{vm_id}/start", response_model=VMControlResponse)
|
||||
async def start_vm(
|
||||
vm_id: int,
|
||||
node: str,
|
||||
current_user: CurrentUser = Depends(get_current_user)
|
||||
):
|
||||
"""VM 시작"""
|
||||
success = await proxmox_service.start_vm(node, vm_id)
|
||||
|
||||
return VMControlResponse(
|
||||
success=success,
|
||||
message="VM이 시작되었습니다" if success else "VM 시작에 실패했습니다",
|
||||
vm_id=vm_id,
|
||||
action="start"
|
||||
)
|
||||
|
||||
@router.post("/{vm_id}/stop", response_model=VMControlResponse)
|
||||
async def stop_vm(
|
||||
vm_id: int,
|
||||
node: str,
|
||||
current_user: CurrentUser = Depends(get_current_user)
|
||||
):
|
||||
"""VM 종료"""
|
||||
success = await proxmox_service.stop_vm(node, vm_id)
|
||||
|
||||
return VMControlResponse(
|
||||
success=success,
|
||||
message="VM이 종료되었습니다" if success else "VM 종료에 실패했습니다",
|
||||
vm_id=vm_id,
|
||||
action="stop"
|
||||
)
|
||||
|
||||
@router.post("/{vm_id}/reboot", response_model=VMControlResponse)
|
||||
async def reboot_vm(
|
||||
vm_id: int,
|
||||
node: str,
|
||||
current_user: CurrentUser = Depends(get_current_user)
|
||||
):
|
||||
"""VM 재시작"""
|
||||
success = await proxmox_service.reboot_vm(node, vm_id)
|
||||
|
||||
return VMControlResponse(
|
||||
success=success,
|
||||
message="VM이 재시작되었습니다" if success else "VM 재시작에 실패했습니다",
|
||||
vm_id=vm_id,
|
||||
action="reboot"
|
||||
)
|
||||
Reference in New Issue
Block a user