87 lines
3.1 KiB
Python
87 lines
3.1 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: ``source_vmid`` — VMID VM-шаблона (клонирование через qemu/clone).
|
|
Для LXC: ``source_template`` — volid архива .tar.zst на storage
|
|
(например ``local:vztmpl/debian-12-standard_12.7-1_amd64.tar.zst``);
|
|
клонирование существующего LXC по VMID не поддерживается.
|
|
"""
|
|
__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)
|
|
source_vmid = Column(Integer, nullable=True) # только для VM (клонирование qemu/clone)
|
|
source_template = Column(String, nullable=True) # только для LXC (volid .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")
|