82 lines
2.9 KiB
Python
82 lines
2.9 KiB
Python
import enum
|
|
from datetime import datetime
|
|
|
|
from sqlalchemy import (
|
|
Column, Integer, String, Boolean, DateTime, ForeignKey, Enum,
|
|
)
|
|
from sqlalchemy.orm import relationship
|
|
|
|
from .database import Base
|
|
|
|
|
|
class Role(str, enum.Enum):
|
|
admin = "admin"
|
|
client = "client"
|
|
|
|
|
|
class GuestType(str, enum.Enum):
|
|
vm = "vm"
|
|
lxc = "lxc"
|
|
|
|
|
|
class InstanceStatus(str, enum.Enum):
|
|
creating = "creating"
|
|
running = "running"
|
|
stopped = "stopped"
|
|
error = "error"
|
|
deleting = "deleting"
|
|
deleted = "deleted"
|
|
|
|
|
|
class User(Base):
|
|
__tablename__ = "users"
|
|
|
|
id = Column(Integer, primary_key=True, index=True)
|
|
email = Column(String, unique=True, index=True, nullable=False)
|
|
password_hash = Column(String, nullable=False)
|
|
role = Column(Enum(Role), default=Role.client, nullable=False)
|
|
is_active = Column(Boolean, default=True)
|
|
created_at = Column(DateTime, default=datetime.utcnow)
|
|
|
|
instances = relationship("Instance", back_populates="owner")
|
|
|
|
|
|
class Template(Base):
|
|
"""Шаблон VPS: связывает тарифный план с исходным Proxmox-шаблоном (VM template / CT template)."""
|
|
__tablename__ = "templates"
|
|
|
|
id = Column(Integer, primary_key=True, index=True)
|
|
name = Column(String, nullable=False)
|
|
description = Column(String, default="")
|
|
guest_type = Column(Enum(GuestType), nullable=False)
|
|
# VMID шаблона в Proxmox, с которого делаем клон (для VM) или CT template volid (для LXC, напр. local:vztmpl/....tar.zst)
|
|
source_vmid = Column(Integer, nullable=True) # для VM-шаблонов (клонирование)
|
|
source_template = Column(String, nullable=True) # для LXC (путь к .tar.zst шаблону)
|
|
cores = Column(Integer, default=1)
|
|
memory_mb = Column(Integer, default=1024)
|
|
disk_gb = Column(Integer, default=10)
|
|
is_active = Column(Boolean, default=True)
|
|
|
|
instances = relationship("Instance", back_populates="template")
|
|
|
|
|
|
class Instance(Base):
|
|
__tablename__ = "instances"
|
|
|
|
id = Column(Integer, primary_key=True, index=True)
|
|
name = Column(String, nullable=False)
|
|
vmid = Column(Integer, unique=True, index=True, nullable=False)
|
|
node = Column(String, nullable=False)
|
|
guest_type = Column(Enum(GuestType), nullable=False)
|
|
status = Column(Enum(InstanceStatus), default=InstanceStatus.creating)
|
|
root_password = Column(String, nullable=True)
|
|
ciuser = Column(String, nullable=True) # хранится только для LXC при создании, чтобы показать один раз
|
|
|
|
owner_id = Column(Integer, ForeignKey("users.id"))
|
|
template_id = Column(Integer, ForeignKey("templates.id"))
|
|
|
|
created_at = Column(DateTime, default=datetime.utcnow)
|
|
|
|
owner = relationship("User", back_populates="instances")
|
|
template = relationship("Template", back_populates="instances")
|