Добавлены модели шаблонов и инстансов

This commit is contained in:
2026-08-09 14:31:01 +03:00
parent efae38ef4e
commit 9144f30a18
+68 -2
View File
@@ -1,8 +1,8 @@
from datetime import datetime, timezone from datetime import datetime, timezone
from enum import Enum from enum import Enum
from sqlalchemy import Boolean, DateTime, Enum as SqlEnum, Integer, String from sqlalchemy import Boolean, DateTime, Enum as SqlEnum, ForeignKey, Integer, String, Text
from sqlalchemy.orm import Mapped, mapped_column from sqlalchemy.orm import Mapped, mapped_column, relationship
from .database import Base from .database import Base
@@ -14,6 +14,24 @@ class UserRole(str, Enum):
client = "client" client = "client"
class GuestType(str, Enum):
"""Тип виртуализированной системы."""
vm = "vm"
lxc = "lxc"
class InstanceStatus(str, Enum):
"""Состояние инстанса в панели."""
creating = "creating"
running = "running"
stopped = "stopped"
error = "error"
deleting = "deleting"
deleted = "deleted"
class User(Base): class User(Base):
"""Пользователь панели с Argon2id-хешем пароля.""" """Пользователь панели с Argon2id-хешем пароля."""
@@ -31,3 +49,51 @@ class User(Base):
default=lambda: datetime.now(timezone.utc), default=lambda: datetime.now(timezone.utc),
nullable=False, nullable=False,
) )
instances: Mapped[list["Instance"]] = relationship(back_populates="owner")
class Template(Base):
"""Тарифный шаблон VM или LXC, доступный клиентам."""
__tablename__ = "templates"
id: Mapped[int] = mapped_column(Integer, primary_key=True)
name: Mapped[str] = mapped_column(String(64), unique=True, index=True)
description: Mapped[str] = mapped_column(Text, default="")
guest_type: Mapped[GuestType] = mapped_column(SqlEnum(GuestType), nullable=False)
source_vmid: Mapped[int | None] = mapped_column(Integer, nullable=True)
source_template: Mapped[str | None] = mapped_column(String(512), nullable=True)
cores: Mapped[int] = mapped_column(Integer, default=1, nullable=False)
memory_mb: Mapped[int] = mapped_column(Integer, default=1024, nullable=False)
disk_gb: Mapped[int] = mapped_column(Integer, default=10, nullable=False)
is_active: Mapped[bool] = mapped_column(Boolean, default=True, nullable=False)
created_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True),
default=lambda: datetime.now(timezone.utc),
nullable=False,
)
instances: Mapped[list["Instance"]] = relationship(back_populates="template")
class Instance(Base):
"""Инстанс VM/LXC, принадлежащий пользователю."""
__tablename__ = "instances"
id: Mapped[int] = mapped_column(Integer, primary_key=True)
name: Mapped[str] = mapped_column(String(63))
vmid: Mapped[int | None] = mapped_column(Integer, unique=True, nullable=True)
node: Mapped[str] = mapped_column(String(64))
guest_type: Mapped[GuestType] = mapped_column(SqlEnum(GuestType), nullable=False)
status: Mapped[InstanceStatus] = mapped_column(
SqlEnum(InstanceStatus), default=InstanceStatus.creating, nullable=False
)
owner_id: Mapped[int] = mapped_column(ForeignKey("users.id"), index=True)
template_id: Mapped[int] = mapped_column(ForeignKey("templates.id"), index=True)
created_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True),
default=lambda: datetime.now(timezone.utc),
nullable=False,
)
owner: Mapped[User] = relationship(back_populates="instances")
template: Mapped[Template] = relationship(back_populates="instances")