Ansible schedule form: structured playbook-variable fields + first-item dropdown defaults #2

Merged
bvandeusen merged 126 commits from dev into main 2026-06-30 23:44:04 -04:00
3 changed files with 112 additions and 0 deletions
Showing only changes of commit c11b3f01ed - Show all commits
@@ -0,0 +1,41 @@
"""Add ansible_targets table
Revision ID: 0015_ansible_inventory_targets
Revises: 0014_alert_ansible_action
Create Date: 2026-06-05
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
revision: str = "0015_ansible_inventory_targets"
down_revision: Union[str, None] = "0014_alert_ansible_action"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
op.create_table(
"ansible_targets",
sa.Column("id", sa.String(36), primary_key=True),
sa.Column("name", sa.String(128), nullable=False),
sa.Column("address", sa.String(255), nullable=False),
sa.Column("ansible_vars", sa.JSON(), nullable=False, server_default="{}"),
sa.Column(
"host_id",
sa.String(36),
sa.ForeignKey("hosts.id", ondelete="SET NULL"),
nullable=True,
),
sa.Column(
"created_at",
sa.DateTime(timezone=True),
nullable=False,
server_default=sa.text("now()"),
),
sa.UniqueConstraint("name", name="uq_ansible_targets_name"),
)
def downgrade() -> None:
op.drop_table("ansible_targets")
+2
View File
@@ -5,6 +5,7 @@ from .monitors import PingResult, DnsResult, PingStatus, DnsStatus
from .metrics import PluginMetric from .metrics import PluginMetric
from .alerts import AlertRule, AlertState, AlertEvent, AlertOperator, AlertStateEnum from .alerts import AlertRule, AlertState, AlertEvent, AlertOperator, AlertStateEnum
from .ansible import AnsibleRun, AnsibleRunStatus from .ansible import AnsibleRun, AnsibleRunStatus
from .ansible_inventory import AnsibleTarget, AnsibleGroup, ansible_target_groups
from .settings import AppSetting from .settings import AppSetting
from .dashboard import Dashboard, DashboardWidget, DashboardShareToken from .dashboard import Dashboard, DashboardWidget, DashboardShareToken
@@ -15,6 +16,7 @@ __all__ = [
"PluginMetric", "PluginMetric",
"AlertRule", "AlertState", "AlertEvent", "AlertOperator", "AlertStateEnum", "AlertRule", "AlertState", "AlertEvent", "AlertOperator", "AlertStateEnum",
"AnsibleRun", "AnsibleRunStatus", "AnsibleRun", "AnsibleRunStatus",
"AnsibleTarget", "AnsibleGroup", "ansible_target_groups",
"AppSetting", "AppSetting",
"Dashboard", "DashboardWidget", "DashboardShareToken", "Dashboard", "DashboardWidget", "DashboardShareToken",
] ]
+69
View File
@@ -0,0 +1,69 @@
from __future__ import annotations
import uuid
from datetime import datetime, timezone
from sqlalchemy import Column, DateTime, ForeignKey, JSON, String, Table
from sqlalchemy.orm import Mapped, mapped_column, relationship
from .base import Base
ansible_target_groups = Table(
"ansible_target_groups",
Base.metadata,
Column(
"target_id",
String(36),
ForeignKey("ansible_targets.id", ondelete="CASCADE"),
primary_key=True,
),
Column(
"group_id",
String(36),
ForeignKey("ansible_groups.id", ondelete="CASCADE"),
primary_key=True,
),
)
class AnsibleTarget(Base):
__tablename__ = "ansible_targets"
id: Mapped[str] = mapped_column(
String(36), primary_key=True, default=lambda: str(uuid.uuid4())
)
name: Mapped[str] = mapped_column(String(128), nullable=False, unique=True)
address: Mapped[str] = mapped_column(String(255), nullable=False)
ansible_vars: Mapped[dict] = mapped_column(JSON, nullable=False, default=dict)
host_id: Mapped[str | None] = mapped_column(
String(36), ForeignKey("hosts.id", ondelete="SET NULL"), nullable=True
)
created_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True),
nullable=False,
default=lambda: datetime.now(timezone.utc),
)
groups: Mapped[list["AnsibleGroup"]] = relationship(
"AnsibleGroup",
secondary=ansible_target_groups,
back_populates="targets",
lazy="select",
)
class AnsibleGroup(Base):
__tablename__ = "ansible_groups"
id: Mapped[str] = mapped_column(
String(36), primary_key=True, default=lambda: str(uuid.uuid4())
)
name: Mapped[str] = mapped_column(String(128), nullable=False, unique=True)
ansible_vars: Mapped[dict] = mapped_column(JSON, nullable=False, default=dict)
created_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True),
nullable=False,
default=lambda: datetime.now(timezone.utc),
)
targets: Mapped[list["AnsibleTarget"]] = relationship(
"AnsibleTarget",
secondary=ansible_target_groups,
back_populates="groups",
lazy="select",
)