from datetime import datetime from typing import Optional from pydantic import BaseModel, EmailStr from .models import Role, GuestType, InstanceStatus # ---------- Auth ---------- class UserCreate(BaseModel): email: EmailStr password: str class UserLogin(BaseModel): email: EmailStr password: str class UserOut(BaseModel): id: int email: EmailStr role: Role is_active: bool created_at: datetime class Config: from_attributes = True class Token(BaseModel): access_token: str token_type: str = "bearer" # ---------- Templates ---------- class TemplateCreate(BaseModel): name: str description: str = "" guest_type: GuestType source_vmid: Optional[int] = None source_template: Optional[str] = None cores: int = 1 memory_mb: int = 1024 disk_gb: int = 10 class TemplateOut(BaseModel): id: int name: str description: str guest_type: GuestType cores: int memory_mb: int disk_gb: int is_active: bool class Config: from_attributes = True # ---------- Instances ---------- class InstanceCreate(BaseModel): ciuser: str = "" cipassword: str = "" name: str template_id: int class InstanceOut(BaseModel): id: int name: str vmid: int node: str guest_type: GuestType status: InstanceStatus template_id: int template: Optional["TemplateOut"] = None owner_id: int created_at: datetime class Config: from_attributes = True class InstanceCreatedOut(InstanceOut): """Расширенный ответ с одноразовыми секретами (root-пароль и т.п.).""" root_password: Optional[str] = None class InstanceAction(BaseModel): action: str # start | stop | reboot | shutdown class InstanceIPOut(BaseModel): ip: str