20260817_510_tenant_downgrade_security_fence.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. """Fence downgrades before they can re-expose revoked tenant gateways.
  2. Alembic downgrades one revision at a time. This marker's downgrade is the
  3. first step from every secured WP10 head, so live tenant data is rejected
  4. before 509..504 can be unwound and before 503's payload-authorized functions
  5. could ever be restored.
  6. """
  7. from alembic import op
  8. revision = "20260817_510"
  9. down_revision = "20260817_509"
  10. branch_labels = None
  11. depends_on = None
  12. def upgrade() -> None:
  13. # Marker-only upgrade; the fail-closed behavior belongs to the first
  14. # downgrade edge, not to a mutable historical revision.
  15. return None
  16. def downgrade() -> None:
  17. op.execute(
  18. """
  19. DO $$ BEGIN
  20. IF EXISTS (SELECT 1 FROM public.tenants LIMIT 1)
  21. OR EXISTS (SELECT 1 FROM public.tenant_quotas LIMIT 1)
  22. OR EXISTS (SELECT 1 FROM public.tenant_quota_reservations LIMIT 1)
  23. OR EXISTS (SELECT 1 FROM public.tenant_lifecycle_events LIMIT 1)
  24. OR EXISTS (SELECT 1 FROM public.tenant_audit_events LIMIT 1)
  25. OR EXISTS (SELECT 1 FROM public.tenant_resource_manifests LIMIT 1)
  26. OR EXISTS (SELECT 1 FROM public.tenant_control_memberships LIMIT 1)
  27. OR EXISTS (SELECT 1 FROM public.tenant_control_claims LIMIT 1)
  28. OR EXISTS (SELECT 1 FROM public.tenant_legal_holds LIMIT 1) THEN
  29. RAISE EXCEPTION 'tenant security downgrade refused while tenant data exists';
  30. END IF;
  31. END $$;
  32. """
  33. )