Files
attune/scripts/cleanup-test-schemas.sh
2026-02-04 17:46:30 -06:00

130 lines
3.6 KiB
Bash
Executable File

#!/bin/bash
set -e
# Cleanup orphaned test schemas
# Run this periodically in development or CI to remove leftover test schemas
# Default to attune_test database, can be overridden with DATABASE_URL env var
DATABASE_URL="${DATABASE_URL:-postgresql://postgres:postgres@localhost:5432/attune_test}"
echo "============================================="
echo "Attune Test Schema Cleanup Utility"
echo "============================================="
echo "Target database: $DATABASE_URL"
echo ""
# Check if psql is available
if ! command -v psql &> /dev/null; then
echo "ERROR: psql command not found. Please install PostgreSQL client."
exit 1
fi
# Count schemas before cleanup
BEFORE_COUNT=$(psql "$DATABASE_URL" -t -c "SELECT COUNT(*) FROM pg_namespace WHERE nspname LIKE 'test_%';" 2>/dev/null || echo "0")
BEFORE_COUNT=$(echo "$BEFORE_COUNT" | xargs) # trim whitespace
echo "Found $BEFORE_COUNT test schema(s) to clean up"
echo ""
if [ "$BEFORE_COUNT" = "0" ]; then
echo "No test schemas to clean up. Exiting."
exit 0
fi
# Confirm cleanup in interactive mode (skip if CI or --force flag)
if [ -t 0 ] && [ "$1" != "--force" ] && [ "$CI" != "true" ]; then
read -p "Do you want to proceed with cleanup? (y/N) " -n 1 -r
echo ""
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
echo "Cleanup cancelled."
exit 0
fi
fi
echo "Starting cleanup..."
echo ""
# Process schemas in batches to avoid PostgreSQL shared memory issues
BATCH_SIZE=50
TOTAL_DROPPED=0
BATCH_NUM=1
while true; do
# Get next batch of schemas
SCHEMAS=$(psql "$DATABASE_URL" -t -c "SELECT nspname FROM pg_namespace WHERE nspname LIKE 'test_%' ORDER BY nspname LIMIT $BATCH_SIZE;" 2>/dev/null | xargs)
if [ -z "$SCHEMAS" ]; then
echo "No more schemas to clean up"
break
fi
echo "Processing batch $BATCH_NUM (up to $BATCH_SIZE schemas)..."
# Drop schemas in this batch
BATCH_DROPPED=$(psql "$DATABASE_URL" -t <<EOF 2>&1
DO \$\$
DECLARE
schema_name TEXT;
schema_count INTEGER := 0;
BEGIN
FOR schema_name IN
SELECT nspname
FROM pg_namespace
WHERE nspname LIKE 'test_%'
ORDER BY nspname
LIMIT $BATCH_SIZE
LOOP
BEGIN
EXECUTE format('DROP SCHEMA IF EXISTS %I CASCADE', schema_name);
schema_count := schema_count + 1;
EXCEPTION WHEN OTHERS THEN
RAISE WARNING 'Failed to drop schema %: %', schema_name, SQLERRM;
END;
END LOOP;
RAISE NOTICE 'Batch complete: % schemas dropped', schema_count;
-- Return the count
PERFORM schema_count;
END \$\$;
EOF
)
echo " Batch $BATCH_NUM complete"
BATCH_NUM=$((BATCH_NUM + 1))
TOTAL_DROPPED=$((TOTAL_DROPPED + BATCH_SIZE))
# Brief pause to let PostgreSQL clean up
sleep 0.5
done
echo ""
echo "============================================"
echo "Cleanup Summary"
echo "============================================"
echo "Total batches processed: $((BATCH_NUM - 1))"
echo "Estimated schemas processed: ~$TOTAL_DROPPED"
EXIT_CODE=$?
echo ""
if [ $EXIT_CODE -eq 0 ]; then
echo "✓ Cleanup completed successfully"
else
echo "✗ Cleanup failed with exit code $EXIT_CODE"
exit $EXIT_CODE
fi
# Verify cleanup
AFTER_COUNT=$(psql "$DATABASE_URL" -t -c "SELECT COUNT(*) FROM pg_namespace WHERE nspname LIKE 'test_%';" 2>/dev/null || echo "0")
AFTER_COUNT=$(echo "$AFTER_COUNT" | xargs) # trim whitespace
echo "Remaining test schemas: $AFTER_COUNT"
echo ""
if [ "$AFTER_COUNT" != "0" ]; then
echo "WARNING: Some test schemas were not cleaned up. Please investigate."
exit 1
fi
echo "All test schemas have been removed."