utp_service/backend/app/models/dashboard.py

116 lines
5.4 KiB
Python

from datetime import datetime
from typing import Optional
from sqlalchemy import Boolean, DateTime, ForeignKey, Integer, String, Text, UniqueConstraint
from sqlalchemy.dialects.postgresql import ARRAY, JSONB
from sqlalchemy.orm import Mapped, mapped_column
from .base import Base, TimestampMixin
CHECK_STATUS_VALUES = (
"online",
"offline",
"unknown",
"ok",
"warn",
"failed",
)
MONITOR_POLICY_MODES = ("inherit", "include", "exclude")
class DashboardCheckDefinition(Base, TimestampMixin):
__tablename__ = "dashboard_check_definitions"
check_key: Mapped[str] = mapped_column(String(64), primary_key=True)
enabled: Mapped[bool] = mapped_column(Boolean, nullable=False, default=True)
interval_sec_default: Mapped[int] = mapped_column(Integer, nullable=False, default=300)
plugin_action: Mapped[str] = mapped_column(String(128), nullable=False)
categories: Mapped[list[str]] = mapped_column(ARRAY(String), nullable=False, default=list)
timeout_sec: Mapped[int] = mapped_column(Integer, nullable=False, default=30)
concurrency: Mapped[int] = mapped_column(Integer, nullable=False, default=20)
class DashboardObjectCheckOverride(Base, TimestampMixin):
__tablename__ = "dashboard_object_check_overrides"
__table_args__ = (UniqueConstraint("object_id", "check_key", name="uq_dashboard_obj_check"),)
id: Mapped[int] = mapped_column(Integer, primary_key=True)
object_id: Mapped[int] = mapped_column(
Integer, ForeignKey("objects.id", ondelete="CASCADE"), nullable=False, index=True
)
check_key: Mapped[str] = mapped_column(
String(64), ForeignKey("dashboard_check_definitions.check_key", ondelete="CASCADE"), nullable=False
)
enabled_override: Mapped[Optional[bool]] = mapped_column(Boolean, nullable=True)
interval_sec_override: Mapped[Optional[int]] = mapped_column(Integer, nullable=True)
categories_override: Mapped[Optional[list[str]]] = mapped_column(ARRAY(String), nullable=True)
class DashboardDeviceLiveState(Base):
__tablename__ = "dashboard_device_live_state"
__table_args__ = (UniqueConstraint("device_id", "check_key", name="uq_dashboard_device_check"),)
id: Mapped[int] = mapped_column(Integer, primary_key=True)
device_id: Mapped[int] = mapped_column(
Integer, ForeignKey("devices.id", ondelete="CASCADE"), nullable=False, index=True
)
check_key: Mapped[str] = mapped_column(
String(64), ForeignKey("dashboard_check_definitions.check_key", ondelete="CASCADE"), nullable=False, index=True
)
status: Mapped[str] = mapped_column(String(20), nullable=False, default="unknown")
value_json: Mapped[Optional[dict]] = mapped_column(JSONB, nullable=True)
error: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
checked_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False, index=True)
duration_ms: Mapped[Optional[int]] = mapped_column(Integer, nullable=True)
source: Mapped[str] = mapped_column(String(32), nullable=False, default="dashboard_monitor")
class DashboardDeviceCheckHistory(Base):
__tablename__ = "dashboard_device_check_history"
id: Mapped[int] = mapped_column(Integer, primary_key=True)
device_id: Mapped[int] = mapped_column(
Integer, ForeignKey("devices.id", ondelete="CASCADE"), nullable=False, index=True
)
check_key: Mapped[str] = mapped_column(
String(64), ForeignKey("dashboard_check_definitions.check_key", ondelete="CASCADE"), nullable=False, index=True
)
status: Mapped[str] = mapped_column(String(20), nullable=False, default="unknown")
ping_ms: Mapped[Optional[int]] = mapped_column(Integer, nullable=True)
checked_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False, index=True)
duration_ms: Mapped[Optional[int]] = mapped_column(Integer, nullable=True)
error: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
source: Mapped[str] = mapped_column(String(32), nullable=False, default="dashboard_monitor")
class DashboardObjectMonitorPolicy(Base, TimestampMixin):
__tablename__ = "dashboard_object_monitor_policy"
object_id: Mapped[int] = mapped_column(
Integer, ForeignKey("objects.id", ondelete="CASCADE"), primary_key=True
)
mode: Mapped[str] = mapped_column(String(16), nullable=False, default="inherit")
class DashboardTagMonitorPolicy(Base, TimestampMixin):
__tablename__ = "dashboard_tag_monitor_policy"
tag_id: Mapped[int] = mapped_column(
Integer, ForeignKey("tags.id", ondelete="CASCADE"), primary_key=True
)
enabled: Mapped[bool] = mapped_column(Boolean, nullable=False, default=True)
class DashboardMonitorRunState(Base):
__tablename__ = "dashboard_monitor_run_state"
id: Mapped[int] = mapped_column(Integer, primary_key=True)
status: Mapped[str] = mapped_column(String(20), nullable=False, default="idle")
run_type: Mapped[Optional[str]] = mapped_column(String(20), nullable=True)
scope: Mapped[Optional[dict]] = mapped_column(JSONB, nullable=True)
started_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True), nullable=True)
finished_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True), nullable=True)
last_success_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True), nullable=True)
last_error: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
last_counts: Mapped[Optional[dict]] = mapped_column(JSONB, nullable=True)