Files

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")