feat: govern connector configurations and simulations
This commit is contained in:
+214
@@ -0,0 +1,214 @@
|
||||
"""governed connector definitions and simulation evidence
|
||||
|
||||
Revision ID: a8d9e0f1b2c3
|
||||
Revises: f7c8d9e0a1b2
|
||||
Create Date: 2026-08-20 12:30:00.000000
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
|
||||
|
||||
revision = "a8d9e0f1b2c3"
|
||||
down_revision = "f7c8d9e0a1b2"
|
||||
branch_labels = None
|
||||
depends_on = None
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
op.create_table(
|
||||
"connector_definitions",
|
||||
sa.Column("id", sa.String(length=36), nullable=False),
|
||||
sa.Column("tenant_id", sa.String(length=36), nullable=False),
|
||||
sa.Column("definition_key", sa.String(length=160), nullable=False),
|
||||
sa.Column("name", sa.String(length=300), nullable=False),
|
||||
sa.Column("description", sa.Text(), nullable=True),
|
||||
sa.Column("status", sa.String(length=30), nullable=False),
|
||||
sa.Column("current_revision", sa.Integer(), nullable=False),
|
||||
sa.Column("source_package", sa.String(length=300), nullable=True),
|
||||
sa.Column("local_definition", sa.Boolean(), nullable=False),
|
||||
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
|
||||
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False),
|
||||
sa.PrimaryKeyConstraint("id", name=op.f("pk_connector_definitions")),
|
||||
sa.UniqueConstraint(
|
||||
"tenant_id",
|
||||
"definition_key",
|
||||
name="uq_connector_definition_tenant_key",
|
||||
),
|
||||
)
|
||||
op.create_index(
|
||||
op.f("ix_connector_definitions_tenant_id"),
|
||||
"connector_definitions",
|
||||
["tenant_id"],
|
||||
)
|
||||
op.create_index(
|
||||
op.f("ix_connector_definitions_status"),
|
||||
"connector_definitions",
|
||||
["status"],
|
||||
)
|
||||
op.create_index(
|
||||
"ix_connector_definitions_tenant_status",
|
||||
"connector_definitions",
|
||||
["tenant_id", "status"],
|
||||
)
|
||||
|
||||
op.create_table(
|
||||
"connector_definition_revisions",
|
||||
sa.Column("id", sa.String(length=36), nullable=False),
|
||||
sa.Column("definition_id", sa.String(length=36), nullable=False),
|
||||
sa.Column("revision", sa.Integer(), nullable=False),
|
||||
sa.Column("specification", sa.JSON(), nullable=False),
|
||||
sa.Column("definition_hash", sa.String(length=64), nullable=False),
|
||||
sa.Column("origin", sa.String(length=30), nullable=False),
|
||||
sa.Column("package_ref", sa.String(length=300), nullable=True),
|
||||
sa.Column("created_by", sa.String(length=255), nullable=True),
|
||||
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
|
||||
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False),
|
||||
sa.ForeignKeyConstraint(
|
||||
["definition_id"],
|
||||
["connector_definitions.id"],
|
||||
name=op.f(
|
||||
"fk_connector_definition_revisions_definition_id_connector_definitions"
|
||||
),
|
||||
ondelete="CASCADE",
|
||||
),
|
||||
sa.PrimaryKeyConstraint(
|
||||
"id",
|
||||
name=op.f("pk_connector_definition_revisions"),
|
||||
),
|
||||
sa.UniqueConstraint(
|
||||
"definition_id",
|
||||
"revision",
|
||||
name="uq_connector_definition_revision",
|
||||
),
|
||||
)
|
||||
op.create_index(
|
||||
op.f("ix_connector_definition_revisions_definition_id"),
|
||||
"connector_definition_revisions",
|
||||
["definition_id"],
|
||||
)
|
||||
op.create_index(
|
||||
op.f("ix_connector_definition_revisions_definition_hash"),
|
||||
"connector_definition_revisions",
|
||||
["definition_hash"],
|
||||
)
|
||||
op.create_index(
|
||||
op.f("ix_connector_definition_revisions_created_by"),
|
||||
"connector_definition_revisions",
|
||||
["created_by"],
|
||||
)
|
||||
op.create_table(
|
||||
"connector_configurations",
|
||||
sa.Column("id", sa.String(length=36), nullable=False),
|
||||
sa.Column("tenant_id", sa.String(length=36), nullable=False),
|
||||
sa.Column("definition_id", sa.String(length=36), nullable=False),
|
||||
sa.Column("name", sa.String(length=300), nullable=False),
|
||||
sa.Column("status", sa.String(length=30), nullable=False),
|
||||
sa.Column("endpoint_url", sa.String(length=1500), nullable=True),
|
||||
sa.Column("credential_ref", sa.String(length=500), nullable=True),
|
||||
sa.Column("base_definition_revision", sa.Integer(), nullable=False),
|
||||
sa.Column("local_overrides", sa.JSON(), nullable=False),
|
||||
sa.Column("protected_paths", sa.JSON(), nullable=False),
|
||||
sa.Column("effective_configuration", sa.JSON(), nullable=False),
|
||||
sa.Column("effective_hash", sa.String(length=64), nullable=False),
|
||||
sa.Column("resource_revision", sa.Integer(), nullable=False),
|
||||
sa.Column("ambiguity_policy", sa.String(length=30), nullable=False),
|
||||
sa.Column("updated_by", sa.String(length=255), nullable=True),
|
||||
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
|
||||
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False),
|
||||
sa.ForeignKeyConstraint(
|
||||
["definition_id"],
|
||||
["connector_definitions.id"],
|
||||
name=op.f(
|
||||
"fk_connector_configurations_definition_id_connector_definitions"
|
||||
),
|
||||
ondelete="RESTRICT",
|
||||
),
|
||||
sa.PrimaryKeyConstraint("id", name=op.f("pk_connector_configurations")),
|
||||
sa.UniqueConstraint(
|
||||
"tenant_id",
|
||||
"name",
|
||||
name="uq_connector_configuration_tenant_name",
|
||||
),
|
||||
)
|
||||
for name, columns in (
|
||||
("ix_connector_configurations_tenant_id", ["tenant_id"]),
|
||||
("ix_connector_configurations_definition_id", ["definition_id"]),
|
||||
("ix_connector_configurations_status", ["status"]),
|
||||
("ix_connector_configurations_effective_hash", ["effective_hash"]),
|
||||
("ix_connector_configurations_updated_by", ["updated_by"]),
|
||||
):
|
||||
op.create_index(op.f(name), "connector_configurations", columns)
|
||||
op.create_index(
|
||||
"ix_connector_configurations_tenant_status",
|
||||
"connector_configurations",
|
||||
["tenant_id", "status"],
|
||||
)
|
||||
|
||||
op.create_table(
|
||||
"connector_simulation_runs",
|
||||
sa.Column("id", sa.String(length=36), nullable=False),
|
||||
sa.Column("tenant_id", sa.String(length=36), nullable=False),
|
||||
sa.Column("configuration_id", sa.String(length=36), nullable=False),
|
||||
sa.Column("mode", sa.String(length=30), nullable=False),
|
||||
sa.Column("idempotency_key", sa.String(length=255), nullable=False),
|
||||
sa.Column("request_hash", sa.String(length=64), nullable=False),
|
||||
sa.Column("status", sa.String(length=30), nullable=False),
|
||||
sa.Column("review_state", sa.String(length=30), nullable=False),
|
||||
sa.Column("definition_revision", sa.Integer(), nullable=False),
|
||||
sa.Column("configuration_revision", sa.Integer(), nullable=False),
|
||||
sa.Column("configuration_hash", sa.String(length=64), nullable=False),
|
||||
sa.Column("input_hash", sa.String(length=64), nullable=False),
|
||||
sa.Column("summary", sa.JSON(), nullable=False),
|
||||
sa.Column("effects", sa.JSON(), nullable=False),
|
||||
sa.Column("diagnostics", sa.JSON(), nullable=False),
|
||||
sa.Column("provenance", sa.JSON(), nullable=False),
|
||||
sa.Column("created_by", sa.String(length=255), nullable=True),
|
||||
sa.Column("reviewed_by", sa.String(length=255), nullable=True),
|
||||
sa.Column("reviewed_at", sa.DateTime(timezone=True), nullable=True),
|
||||
sa.Column("review_reason", sa.Text(), nullable=True),
|
||||
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
|
||||
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False),
|
||||
sa.ForeignKeyConstraint(
|
||||
["configuration_id"],
|
||||
["connector_configurations.id"],
|
||||
name=op.f(
|
||||
"fk_connector_simulation_runs_configuration_id_connector_configurations"
|
||||
),
|
||||
ondelete="CASCADE",
|
||||
),
|
||||
sa.PrimaryKeyConstraint(
|
||||
"id",
|
||||
name=op.f("pk_connector_simulation_runs"),
|
||||
),
|
||||
sa.UniqueConstraint(
|
||||
"tenant_id",
|
||||
"configuration_id",
|
||||
"mode",
|
||||
"idempotency_key",
|
||||
name="uq_connector_simulation_run_idempotency",
|
||||
),
|
||||
)
|
||||
for name, columns in (
|
||||
("ix_connector_simulation_runs_tenant_id", ["tenant_id"]),
|
||||
("ix_connector_simulation_runs_configuration_id", ["configuration_id"]),
|
||||
("ix_connector_simulation_runs_mode", ["mode"]),
|
||||
("ix_connector_simulation_runs_status", ["status"]),
|
||||
("ix_connector_simulation_runs_review_state", ["review_state"]),
|
||||
("ix_connector_simulation_runs_created_by", ["created_by"]),
|
||||
("ix_connector_simulation_runs_reviewed_by", ["reviewed_by"]),
|
||||
):
|
||||
op.create_index(op.f(name), "connector_simulation_runs", columns)
|
||||
op.create_index(
|
||||
"ix_connector_simulation_runs_review",
|
||||
"connector_simulation_runs",
|
||||
["tenant_id", "review_state", "created_at"],
|
||||
)
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
op.drop_table("connector_simulation_runs")
|
||||
op.drop_table("connector_configurations")
|
||||
op.drop_table("connector_definition_revisions")
|
||||
op.drop_table("connector_definitions")
|
||||
Reference in New Issue
Block a user