"""Seed truthful monitoring and cost coverage governance rules. Revision ID: 537 Revises: 536 Create Date: 2026-08-24 """ from __future__ import annotations import uuid import sqlalchemy as sa from alembic import op revision = "537" down_revision = "536" branch_labels = None depends_on = None _RULES = ( ( "resource.monitoring_missing", "应监控资源缺少监控数据", "observability", "high", "monitoring_missing", "检查云监控只读权限、指标同步作业和资源运行状态;不适用或云厂商不支持的资源不会命中。", ), ( "resource.cost_unavailable", "资源所属连接缺少成本数据", "cost", "medium", "cost_unavailable", "检查账单连接、账单导出和成本同步;订阅级或共享成本会明确标记但不会误报为缺失。", ), ) def upgrade() -> None: bind = op.get_bind() for rule_key, name, category, severity, evaluator, recommendation in _RULES: if bind.execute( sa.text( "SELECT 1 FROM cmdb_resource_governance_rules " "WHERE rule_key=:key LIMIT 1" ), {"key": rule_key}, ).scalar(): continue bind.execute( sa.text( """INSERT INTO cmdb_resource_governance_rules (id, rule_key, name, category, severity, evaluator, recommendation, enabled, built_in, version, created_at, updated_at) VALUES (:id, :key, :name, :category, :severity, :evaluator, :recommendation, 1, 1, 1, UTC_TIMESTAMP(), UTC_TIMESTAMP())""" ), { "id": str(uuid.uuid4()), "key": rule_key, "name": name, "category": category, "severity": severity, "evaluator": evaluator, "recommendation": recommendation, }, ) def downgrade() -> None: bind = op.get_bind() bind.execute( sa.text( "DELETE FROM cmdb_resource_governance_rules " "WHERE rule_key IN " "('resource.monitoring_missing', 'resource.cost_unavailable')" ), )