"""Server inventory model.""" import enum from datetime import UTC, datetime from sqlalchemy import DateTime, Enum, ForeignKey, String, Text from sqlalchemy.orm import Mapped, mapped_column, relationship from app.core.database import Base class ServerType(str, enum.Enum): WINDOWS = "windows" # WinRM LINUX = "linux" # SSH CAU_CLUSTER = "cau_cluster" # Cluster-Aware Updating class Server(Base): __tablename__ = "servers" id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] = mapped_column(String(255), unique=True, index=True) hostname: Mapped[str] = mapped_column(String(255)) port: Mapped[int] = mapped_column(default=5985) type: Mapped[ServerType] = mapped_column(Enum(ServerType), default=ServerType.WINDOWS) description: Mapped[str | None] = mapped_column(Text, nullable=True) tags: Mapped[str | None] = mapped_column(String(500), nullable=True) # comma-separated credential_id: Mapped[int | None] = mapped_column( ForeignKey("credentials.id"), nullable=True ) credential: Mapped["Credential | None"] = relationship(lazy="selectin") # noqa: F821 last_health_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) last_health_ok: Mapped[bool | None] = mapped_column(nullable=True) created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=lambda: datetime.now(UTC) ) updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=lambda: datetime.now(UTC), onupdate=lambda: datetime.now(UTC), ) jobs: Mapped[list["UpdateJob"]] = relationship( # noqa: F821 back_populates="server", cascade="all, delete-orphan" )