20260802_474_connector_version_guardrails.py 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. """Continuously reject ambiguous active connector versions."""
  2. from alembic import op
  3. revision = "20260802_474"
  4. down_revision = "20260802_473"
  5. branch_labels = None
  6. depends_on = None
  7. def upgrade() -> None:
  8. op.execute("""
  9. DO $$ BEGIN
  10. IF EXISTS (
  11. SELECT 1
  12. FROM public.connector_principals p
  13. JOIN (
  14. SELECT connector_id
  15. FROM public.connector_manifests
  16. WHERE status='active'
  17. GROUP BY connector_id
  18. HAVING COUNT(DISTINCT connector_version)>1
  19. ) ambiguous USING(connector_id)
  20. ) THEN
  21. RAISE EXCEPTION
  22. 'connector 474 upgrade rejected: principal has multiple active manifest versions; provide an explicit principal-to-version mapping';
  23. END IF;
  24. END $$;
  25. CREATE OR REPLACE FUNCTION public.enforce_connector_active_version()
  26. RETURNS trigger LANGUAGE plpgsql AS $$
  27. DECLARE target_connector VARCHAR(64);
  28. BEGIN
  29. target_connector := COALESCE(NEW.connector_id, OLD.connector_id);
  30. IF EXISTS (SELECT 1 FROM public.connector_principals WHERE connector_id=target_connector)
  31. AND (SELECT COUNT(DISTINCT connector_version)
  32. FROM public.connector_manifests
  33. WHERE connector_id=target_connector AND status='active') > 1 THEN
  34. RAISE EXCEPTION
  35. 'multiple active connector versions require an explicit one-active-version mapping';
  36. END IF;
  37. RETURN COALESCE(NEW, OLD);
  38. END $$;
  39. CREATE TRIGGER trg_connector_manifest_active_version
  40. AFTER INSERT OR UPDATE OF connector_id,connector_version,status
  41. ON public.connector_manifests
  42. FOR EACH ROW EXECUTE FUNCTION public.enforce_connector_active_version();
  43. CREATE TRIGGER trg_connector_principal_active_version
  44. AFTER INSERT OR UPDATE OF connector_id,connector_version
  45. ON public.connector_principals
  46. FOR EACH ROW EXECUTE FUNCTION public.enforce_connector_active_version();
  47. """)
  48. def downgrade() -> None:
  49. op.execute("""
  50. DO $$ BEGIN
  51. IF EXISTS (
  52. SELECT 1
  53. FROM public.connector_principals
  54. GROUP BY connector_id,source_uid,business_domain_uid,environment
  55. HAVING COUNT(DISTINCT connector_version)>1
  56. ) THEN
  57. RAISE EXCEPTION
  58. 'connector downgrade below 474 rejected: multiple principal versions share one legacy binding; consolidate explicitly before downgrade';
  59. END IF;
  60. END $$;
  61. DROP TRIGGER IF EXISTS trg_connector_principal_active_version ON public.connector_principals;
  62. DROP TRIGGER IF EXISTS trg_connector_manifest_active_version ON public.connector_manifests;
  63. DROP FUNCTION IF EXISTS public.enforce_connector_active_version();
  64. """)