| #!/bin/bash |
| # |
| # Licensed to the Apache Software Foundation (ASF) under one or more |
| # contributor license agreements. See the NOTICE file distributed with |
| # this work for additional information regarding copyright ownership. |
| # The ASF licenses this file to You under the Apache License, Version 2.0 |
| # (the "License"); you may not use this file except in compliance with |
| # the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| # |
| |
| set -e |
| |
| # Wait for PostgreSQL to be ready |
| echo "Waiting for database to be ready..." |
| for i in {1..30}; do |
| if python3 -c " |
| import psycopg2 |
| try: |
| conn = psycopg2.connect(host='db-light', user='superset', password='superset', database='superset_light') |
| conn.close() |
| print('Database is ready!') |
| except: |
| exit(1) |
| " 2>/dev/null; then |
| echo "Database connection established!" |
| break |
| fi |
| echo "Waiting for database... ($i/30)" |
| if [ $i -eq 30 ]; then |
| echo "Database connection timeout after 30 seconds" |
| exit 1 |
| fi |
| sleep 1 |
| done |
| |
| # Handle database setup based on FORCE_RELOAD |
| if [ "${FORCE_RELOAD}" = "true" ]; then |
| echo "Force reload requested - resetting test database" |
| # Drop and recreate the test database using Python |
| python3 -c " |
| import psycopg2 |
| from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT |
| |
| # Connect to default database |
| conn = psycopg2.connect(host='db-light', user='superset', password='superset', database='superset_light') |
| conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) |
| cur = conn.cursor() |
| |
| # Drop and recreate test database |
| try: |
| cur.execute('DROP DATABASE IF EXISTS test') |
| except: |
| pass |
| |
| cur.execute('CREATE DATABASE test') |
| conn.close() |
| |
| # Connect to test database to create schemas |
| conn = psycopg2.connect(host='db-light', user='superset', password='superset', database='test') |
| conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) |
| cur = conn.cursor() |
| |
| cur.execute('CREATE SCHEMA sqllab_test_db') |
| cur.execute('CREATE SCHEMA admin_database') |
| |
| cur.close() |
| conn.close() |
| print('Test database reset successfully') |
| " |
| # Use --no-reset-db since we already reset it |
| FLAGS="--no-reset-db" |
| else |
| echo "Using existing test database (set FORCE_RELOAD=true to reset)" |
| FLAGS="--no-reset-db" |
| |
| # Ensure test database exists using Python |
| python3 -c " |
| import psycopg2 |
| from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT |
| |
| # Check if test database exists |
| try: |
| conn = psycopg2.connect(host='db-light', user='superset', password='superset', database='test') |
| conn.close() |
| print('Test database already exists') |
| except: |
| print('Creating test database...') |
| # Connect to default database to create test database |
| conn = psycopg2.connect(host='db-light', user='superset', password='superset', database='superset_light') |
| conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) |
| cur = conn.cursor() |
| |
| # Create test database |
| cur.execute('CREATE DATABASE test') |
| conn.close() |
| |
| # Connect to test database to create schemas |
| conn = psycopg2.connect(host='db-light', user='superset', password='superset', database='test') |
| conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) |
| cur = conn.cursor() |
| |
| cur.execute('CREATE SCHEMA IF NOT EXISTS sqllab_test_db') |
| cur.execute('CREATE SCHEMA IF NOT EXISTS admin_database') |
| |
| cur.close() |
| conn.close() |
| print('Test database created successfully') |
| " |
| fi |
| |
| # Always run database migrations to ensure schema is up to date |
| echo "Running database migrations..." |
| cd /app |
| superset db upgrade |
| |
| # Initialize test environment if needed |
| if [ "${FORCE_RELOAD}" = "true" ] || [ ! -f "/app/superset_home/.test_initialized" ]; then |
| echo "Initializing test environment..." |
| # Run initialization commands |
| superset init |
| echo "Loading test users..." |
| superset load-test-users |
| |
| # Mark as initialized |
| touch /app/superset_home/.test_initialized |
| else |
| echo "Test environment already initialized (skipping init and load-test-users)" |
| echo "Tip: Use FORCE_RELOAD=true to reinitialize the test database" |
| fi |
| |
| # Create missing scripts needed for tests |
| if [ ! -f "/app/scripts/tag_latest_release.sh" ]; then |
| echo "Creating missing tag_latest_release.sh script for tests..." |
| cp /app/docker/tag_latest_release.sh /app/scripts/tag_latest_release.sh 2>/dev/null || true |
| fi |
| |
| # Install pip module for Shillelagh compatibility (aligns with CI environment) |
| echo "Installing pip module for Shillelagh compatibility..." |
| uv pip install pip |
| |
| # If arguments provided, execute them |
| if [ $# -gt 0 ]; then |
| exec "$@" |
| fi |