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

260 lines
7.3 KiB
Bash
Executable File

#!/bin/bash
# Test Database Setup Script
# This script helps set up and manage the test database for Attune
set -e
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# Configuration
DB_NAME="attune_test"
DB_USER="${POSTGRES_USER:-postgres}"
DB_HOST="${POSTGRES_HOST:-localhost}"
DB_PORT="${POSTGRES_PORT:-5432}"
# Handle password: use env var if set, otherwise prompt once
if [ -z "$POSTGRES_PASSWORD" ]; then
if [ -z "$PGPASSWORD" ]; then
# Prompt for password once
read -sp "Enter PostgreSQL password for user $DB_USER: " DB_PASSWORD
echo ""
export PGPASSWORD="$DB_PASSWORD"
fi
# else PGPASSWORD is already set, use it
else
# POSTGRES_PASSWORD was provided, use it
export PGPASSWORD="$POSTGRES_PASSWORD"
fi
DB_URL="postgresql://${DB_USER}:${PGPASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}"
# Functions
print_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
print_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
print_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
check_postgres() {
print_info "Checking PostgreSQL connection..."
if ! pg_isready -h "$DB_HOST" -p "$DB_PORT" > /dev/null 2>&1; then
print_error "PostgreSQL is not running or not accessible at ${DB_HOST}:${DB_PORT}"
exit 1
fi
print_info "PostgreSQL is running"
}
db_exists() {
psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -lqt | cut -d \| -f 1 | grep -qw "$DB_NAME"
}
create_database() {
print_info "Creating test database: $DB_NAME"
if db_exists; then
print_warn "Database $DB_NAME already exists"
else
createdb -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" "$DB_NAME"
print_info "Database $DB_NAME created successfully"
fi
}
drop_database() {
print_info "Dropping test database: $DB_NAME"
if db_exists; then
dropdb -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" "$DB_NAME"
print_info "Database $DB_NAME dropped successfully"
else
print_warn "Database $DB_NAME does not exist"
fi
}
run_migrations() {
print_info "Running migrations on test database..."
DATABASE_URL="$DB_URL" sqlx migrate run
print_info "Migrations completed successfully"
}
clean_database() {
print_info "Cleaning test database..."
PSQL_CMD="psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME"
# Disable triggers to avoid constraint issues
$PSQL_CMD -c "SET session_replication_role = replica;"
# Delete in reverse dependency order
$PSQL_CMD -c "DELETE FROM executions;"
$PSQL_CMD -c "DELETE FROM inquiries;"
$PSQL_CMD -c "DELETE FROM enforcements;"
$PSQL_CMD -c "DELETE FROM events;"
$PSQL_CMD -c "DELETE FROM rules;"
$PSQL_CMD -c "DELETE FROM triggers;"
$PSQL_CMD -c "DELETE FROM notifications;"
$PSQL_CMD -c "DELETE FROM keys;"
$PSQL_CMD -c "DELETE FROM identities;"
$PSQL_CMD -c "DELETE FROM workers;"
$PSQL_CMD -c "DELETE FROM runtimes;"
$PSQL_CMD -c "DELETE FROM actions;"
$PSQL_CMD -c "DELETE FROM packs;"
# Re-enable triggers
$PSQL_CMD -c "SET session_replication_role = DEFAULT;"
print_info "Database cleaned successfully"
}
verify_schema() {
print_info "Verifying database schema..."
PSQL_CMD="psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -t"
# Check for essential tables in attune schema
TABLES=("pack" "action" "runtime" "worker" "trigger" "rule" "event" "enforcement" "execution" "inquiry" "identity" "key" "notification")
for table in "${TABLES[@]}"; do
if $PSQL_CMD -c "SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_schema = 'attune' AND table_name = '$table');" | grep -q 't'; then
echo -e " ${GREEN}${NC} Table 'attune.$table' exists"
else
echo -e " ${RED}${NC} Table 'attune.$table' missing"
return 1
fi
done
print_info "Schema verification passed"
}
show_status() {
print_info "Test Database Status"
echo " Database: $DB_NAME"
echo " Host: $DB_HOST:$DB_PORT"
echo " User: $DB_USER"
echo " URL: $DB_URL"
echo ""
if db_exists; then
echo -e " Status: ${GREEN}EXISTS${NC}"
PSQL_CMD="psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -t -c"
# Count tables
TABLE_COUNT=$($PSQL_CMD "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'attune' AND table_type = 'BASE TABLE';" | tr -d ' ')
echo " Tables: $TABLE_COUNT"
# Count migrations
MIGRATION_COUNT=$($PSQL_CMD "SELECT COUNT(*) FROM _sqlx_migrations WHERE success = true;" 2>/dev/null | tr -d ' ' || echo "0")
echo " Migrations: $MIGRATION_COUNT"
# Count records in each table
echo ""
echo " Record counts:"
for table in pack action runtime worker trigger rule event enforcement execution inquiry identity key notification; do
COUNT=$($PSQL_CMD "SELECT COUNT(*) FROM attune.$table;" 2>/dev/null | tr -d ' ' || echo "0")
printf " %-15s %s\n" "$table:" "$COUNT"
done
else
echo -e " Status: ${RED}DOES NOT EXIST${NC}"
fi
}
show_help() {
cat << EOF
Test Database Setup Script for Attune
Usage: $0 [command]
Commands:
setup Create database and run migrations (default)
create Create the test database
drop Drop the test database
reset Drop, create, and migrate the database
migrate Run migrations on existing database
clean Delete all data from tables
verify Verify database schema
status Show database status and record counts
help Show this help message
Environment Variables:
POSTGRES_USER PostgreSQL user (default: postgres)
POSTGRES_PASSWORD PostgreSQL password (prompted if not set)
PGPASSWORD PostgreSQL password (alternative to POSTGRES_PASSWORD)
POSTGRES_HOST PostgreSQL host (default: localhost)
POSTGRES_PORT PostgreSQL port (default: 5432)
Examples:
$0 setup # Create and setup test database
$0 reset # Reset test database
$0 clean # Clean all data
$0 status # Show database status
EOF
}
# Main
case "${1:-setup}" in
setup)
check_postgres
create_database
run_migrations
verify_schema
print_info "Test database setup complete!"
;;
create)
check_postgres
create_database
;;
drop)
check_postgres
drop_database
;;
reset)
check_postgres
drop_database
create_database
run_migrations
verify_schema
print_info "Test database reset complete!"
;;
migrate)
check_postgres
run_migrations
;;
clean)
check_postgres
if ! db_exists; then
print_error "Database $DB_NAME does not exist"
exit 1
fi
clean_database
;;
verify)
check_postgres
if ! db_exists; then
print_error "Database $DB_NAME does not exist"
exit 1
fi
verify_schema
;;
status)
check_postgres
show_status
;;
help|--help|-h)
show_help
;;
*)
print_error "Unknown command: $1"
show_help
exit 1
;;
esac