Files
comet-ml--opik/scripts/check_clickhouse_migrations_cluster.sh
wehub-resource-sync 5a558eb09e
TypeScript SDK Compatibility V1.x E2E Tests / Select Node version matrix (push) Has been cancelled
TypeScript SDK Compatibility V1.x E2E Tests / TypeScript SDK Compatibility V1.x E2E Tests Node ${{matrix.node_version}} (push) Has been cancelled
TypeScript SDK E2E Tests / TypeScript SDK E2E Tests Node ${{matrix.node_version}} (push) Has been cancelled
Opik Optimizer - E2E Tests / build-opik (push) Has been cancelled
TypeScript SDK Compatibility V1.x E2E Tests / build-opik (push) Has been cancelled
Python SDK E2E Tests / Select Python version matrix (push) Has been cancelled
Python SDK E2E Tests / Python SDK E2E Tests ${{matrix.python_version}} (push) Has been cancelled
Python SDK E2E Tests / build-opik (push) Has been cancelled
Python SDK Compatibility V1.x E2E Tests / Select Python version matrix (push) Has been cancelled
Python SDK Compatibility V1.x E2E Tests / Python SDK Compatibility V1.x E2E Tests ${{matrix.python_version}} (push) Has been cancelled
Python SDK Compatibility V1.x E2E Tests / build-opik (push) Has been cancelled
TypeScript SDK E2E Tests / Select Node version matrix (push) Has been cancelled
TypeScript SDK E2E Tests / build-opik (push) Has been cancelled
Opik Optimizer - E2E Tests / Opik Optimizer E2E Tests Python ${{matrix.python_version}} (push) Has been cancelled
Opik Optimizer - E2E Tests / Opik Optimizer Integration Smoke Tests (push) Has been cancelled
🐙 Code Quality / detect (push) Has been cancelled
🐙 Code Quality / lint (${{ matrix.leg.name }}) (push) Has been cancelled
🐙 Code Quality / summary (push) Has been cancelled
TypeScript SDK Library Integration Tests / Check Secrets (push) Has been cancelled
TypeScript SDK Library Integration Tests / opik-vercel (Vercel AI SDK / eve) (push) Has been cancelled
SDK Library Integration Tests Runner / Check Secrets (push) Has been cancelled
SDK Library Integration Tests Runner / Missed OpenAI API Key Warning (push) Has been cancelled
SDK Library Integration Tests Runner / Build (push) Has been cancelled
SDK Library Integration Tests Runner / openai_tests (push) Has been cancelled
SDK Library Integration Tests Runner / langchain_tests (push) Has been cancelled
SDK Library Integration Tests Runner / langchain_legacy_tests (push) Has been cancelled
SDK Library Integration Tests Runner / llama_index_tests (push) Has been cancelled
SDK Library Integration Tests Runner / anthropic_tests (push) Has been cancelled
SDK Library Integration Tests Runner / mistral_tests (push) Has been cancelled
SDK Library Integration Tests Runner / groq_tests (push) Has been cancelled
SDK Library Integration Tests Runner / aisuite_tests (push) Has been cancelled
SDK Library Integration Tests Runner / haystack_tests (push) Has been cancelled
SDK Library Integration Tests Runner / dspy_tests (push) Has been cancelled
SDK Library Integration Tests Runner / crewai_v0_tests (push) Has been cancelled
SDK Library Integration Tests Runner / crewai_v1_tests (push) Has been cancelled
SDK Library Integration Tests Runner / genai_tests (push) Has been cancelled
SDK Library Integration Tests Runner / adk_tests (push) Has been cancelled
SDK Library Integration Tests Runner / adk_legacy_1_3_0_tests (push) Has been cancelled
SDK Library Integration Tests Runner / evaluation_metrics_tests (push) Has been cancelled
SDK Library Integration Tests Runner / bedrock_tests (push) Has been cancelled
SDK Library Integration Tests Runner / litellm_tests (push) Has been cancelled
SDK Library Integration Tests Runner / harbor_tests (push) Has been cancelled
SDK Library Integration Tests Runner / Slack Notification (push) Has been cancelled
Lint Opik Helm Chart / render-equality (push) Has been cancelled
Opik Optimizer - Unit Tests / Opik Optimizer Unit Tests Python ${{matrix.python_version}} (push) Has been cancelled
Python BE E2E Tests / Python BE E2E (push) Has been cancelled
Python Backend Tests / run-python-backend-tests (push) Has been cancelled
Python SDK Unit Tests / Python SDK Unit Tests ${{matrix.python_version}} (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
SDK E2E Libraries Integration Tests / Check Secrets (push) Has been cancelled
SDK E2E Libraries Integration Tests / Missed OpenAI API Key Warning (push) Has been cancelled
SDK E2E Libraries Integration Tests / build-opik (push) Has been cancelled
SDK E2E Libraries Integration Tests / E2E Lib Integration Python ${{matrix.python_version}} (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-gemini) (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-langchain) (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-openai) (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-otel) (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-vercel) (push) Has been cancelled
TypeScript SDK Build & Publish / build-and-publish (push) Has been cancelled
TypeScript SDK Unit Tests / Test on Node ${{ matrix.node-version }} (push) Has been cancelled
Backend Tests / discover-tests (push) Has been cancelled
Backend Tests / ${{ matrix.name }} (push) Has been cancelled
Build and Publish SDK / build-and-publish (push) Has been cancelled
Build Opik Docker Images / set-version (push) Has been cancelled
Build Opik Docker Images / build-backend (push) Has been cancelled
Build Opik Docker Images / build-sandbox-executor-python (push) Has been cancelled
Build Opik Docker Images / build-python-backend (push) Has been cancelled
Build Opik Docker Images / build-frontend (push) Has been cancelled
Build Opik Docker Images / create-git-tag (push) Has been cancelled
ClickHouse Migration Cluster Check / validate-clickhouse-migrations (push) Has been cancelled
Docs - Publish / run (push) Has been cancelled
E2E Tests - Post Merge (v2) / 🧪 E2E v2 Tests (${{ github.event.inputs.tier || 't1' }}) (push) Has been cancelled
E2E Tests - Post Merge (v2) / 📢 Slack Notification (push) Has been cancelled
Frontend Unit Tests / Test on Node 20 (push) Has been cancelled
Guardrails E2E Tests / Select Python version matrix (push) Has been cancelled
Guardrails E2E Tests / Guardrails E2E Tests ${{matrix.python_version}} (push) Has been cancelled
Guardrails E2E Tests / 📢 Slack Notification (push) Has been cancelled
Guardrails Backend Unit Tests / Guardrails Backend Unit Tests (push) Has been cancelled
Guardrails Backend Unit Tests / 📢 Slack Notification (push) Has been cancelled
Lint Opik Helm Chart / lint-helm-chart (Helm v3.21.0) (push) Has been cancelled
Lint Opik Helm Chart / lint-helm-chart (Helm v4.2.0) (push) Has been cancelled
Lint Opik Helm Chart / unittest-helm-chart (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:25:44 +08:00

224 lines
8.1 KiB
Bash
Executable File

#!/bin/bash
# Script to check ClickHouse migrations for proper ON CLUSTER clause usage
# This script validates that all DDL operations in ClickHouse migrations include the ON CLUSTER '{cluster}' clause
# Reference: https://clickhouse.com/docs/sql-reference/distributed-ddl
#
# Usage:
# ./check_clickhouse_migrations_cluster.sh # Check all migration files
# ./check_clickhouse_migrations_cluster.sh file1.sql file2.sql # Check specific files
set -uo pipefail
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# Configuration
MIGRATION_DIR="apps/opik-backend/src/main/resources/liquibase/db-app-analytics/migrations"
EXIT_CODE=0
# DDL patterns that require ON CLUSTER clause
# Reference: https://clickhouse.com/docs/sql-reference/distributed-ddl
# EXCHANGE covers the Distributed-layer cutover shape (EXCHANGE TABLES foo_local AND foo_shadow_local)
# used from Hyperscale Slice 2 onward. The check is table-name agnostic: both _local shadow tables
# and their unsuffixed Distributed wrappers are validated the same way.
DDL_COMMANDS_REGEX="(CREATE|DROP|ALTER|RENAME|EXCHANGE)"
# Combined pattern for detecting DDL statements that need ON CLUSTER
DDL_DETECTION_REGEX="^\s*${DDL_COMMANDS_REGEX}\s+"
# Exact pattern for ON CLUSTER clause validation (project-specific)
ON_CLUSTER_REGEX="ON\s+CLUSTER\s+['\"]\\{cluster\\}['\"]"
# Pattern for detecting rollback comments in migration files
ROLLBACK_COMMENT_REGEX="^[[:space:]]*--[[:space:]]*rollback[[:space:]]+"
# Pattern for extracting DDL from rollback comments (for sed substitution)
ROLLBACK_EXTRACT_REGEX="s/^[[:space:]]*--[[:space:]]*rollback[[:space:]]+//i"
echo "🔍 Checking ClickHouse migrations for ON CLUSTER clause usage..."
echo "📁 Migration directory: ${MIGRATION_DIR}"
echo
# Function to check if a DDL statement has ON CLUSTER clause
check_ddl_statement() {
local file="$1"
local line_num="$2"
local line="$3"
local ddl_type="$4"
# Skip if line is a comment (but rollback DDL should already be extracted by the caller)
if echo "$line" | grep -qE "^\s*--"; then
return 0
fi
# Check if the DDL statement has ON CLUSTER clause using centralized regex
# Required pattern: ON CLUSTER '{cluster}' (exact match for this project)
if ! echo "$line" | grep -qiE "$ON_CLUSTER_REGEX"; then
echo -e "${RED}❌ ERROR: Missing ON CLUSTER clause${NC}"
echo -e " 📄 File: ${file}"
echo -e " 📍 Line ${line_num}: ${line}"
echo -e " 🔧 Expected: ${ddl_type} ... ON CLUSTER '{cluster}'"
echo
return 1
fi
return 0
}
# Function to validate a single migration file
validate_migration_file() {
local file="$1"
local file_errors=0
echo "📋 Checking: $(basename "$file")"
echo "🔍 DEBUG: Full file path: $file"
echo "🔍 DEBUG: File exists: $(test -f "$file" && echo "YES" || echo "NO")"
echo "🔍 DEBUG: File readable: $(test -r "$file" && echo "YES" || echo "NO")"
# Read file line by line
local line_num=0
while IFS= read -r line; do
((line_num++))
# Remove leading/trailing whitespace (but preserve quotes)
line="${line#"${line%%[![:space:]]*}"}" # Remove leading whitespace
line="${line%"${line##*[![:space:]]}"}" # Remove trailing whitespace
# Skip empty lines and regular comments (but not rollback statements)
if [[ -z "$line" ]]; then
continue
fi
# Handle rollback statements specially
if echo "$line" | grep -qiE "$ROLLBACK_COMMENT_REGEX"; then
# Extract the DDL statement from the rollback comment
local rollback_ddl=$(echo "$line" | sed -E "$ROLLBACK_EXTRACT_REGEX")
# Check if the rollback contains DDL statements using centralized regex
if echo "$rollback_ddl" | grep -qiE "$DDL_DETECTION_REGEX"; then
# Extract DDL type using centralized regex
local ddl_type=$(echo "$rollback_ddl" | sed -nE "s/$DDL_DETECTION_REGEX.*/\1/Ip")
if ! check_ddl_statement "$file" "$line_num" "$rollback_ddl" "$ddl_type"; then
((file_errors++))
fi
fi
continue
fi
# Skip other comments
if [[ "$line" =~ ^[[:space:]]*-- ]]; then
continue
fi
# Check for DDL statements using centralized regex (case insensitive)
if echo "$line" | grep -qiE "$DDL_DETECTION_REGEX"; then
# Extract DDL type using centralized regex
local ddl_type=$(echo "$line" | sed -nE "s/$DDL_DETECTION_REGEX.*/\1/Ip")
if ! check_ddl_statement "$file" "$line_num" "$line" "$ddl_type"; then
((file_errors++))
fi
fi
done < "$file"
if [[ $file_errors -eq 0 ]]; then
echo -e " ✅ ${GREEN}All DDL statements have proper ON CLUSTER clause${NC}"
else
echo -e " ❌ ${RED}Found $file_errors DDL statement(s) missing ON CLUSTER clause${NC}"
fi
echo
return $file_errors
}
# Main validation logic
main() {
local total_errors=0
local total_files=0
local migration_files=()
# Check if specific files were provided as arguments
if [[ $# -gt 0 ]]; then
# Use provided file arguments
migration_files=("$@")
echo "🎯 Validating specific migration files provided as arguments..."
# Validate that all provided files exist and are SQL files
for file in "${migration_files[@]}"; do
if [[ ! -f "$file" ]]; then
echo -e "${RED}❌ ERROR: File not found: $file${NC}"
exit 1
fi
if [[ ! "$file" =~ \.sql$ ]]; then
echo -e "${YELLOW}⚠️ WARNING: Skipping non-SQL file: $file${NC}"
continue
fi
done
else
# Check if migration directory exists
if [[ ! -d "$MIGRATION_DIR" ]]; then
echo -e "${RED}❌ ERROR: Migration directory not found: $MIGRATION_DIR${NC}"
exit 1
fi
# Find all SQL migration files in the directory
migration_files=($(find "$MIGRATION_DIR" -name "*.sql" | sort))
echo "📊 Validating all migration files in directory..."
fi
# Filter out non-SQL files and files that don't exist
local valid_files=()
for file in "${migration_files[@]}"; do
if [[ -f "$file" && "$file" =~ \.sql$ ]]; then
valid_files+=("$file")
fi
done
if [[ ${#valid_files[@]} -eq 0 ]]; then
echo -e "${YELLOW}⚠️ WARNING: No valid SQL migration files to check${NC}"
exit 0
fi
echo "📊 Found ${#valid_files[@]} migration file(s) to check"
echo "=" $(printf '=%.0s' {1..50})
echo
# Validate each migration file
for file in "${valid_files[@]}"; do
((total_files++))
echo "🔍 DEBUG: About to validate file: $file"
if validate_migration_file "$file"; then
echo "🔍 DEBUG: File validation succeeded: $file"
else
echo "🔍 DEBUG: File validation failed: $file"
((total_errors++))
fi
done
# Summary
echo "=" $(printf '=%.0s' {1..50})
echo "📈 SUMMARY:"
echo " 📁 Total files checked: $total_files"
if [[ $total_errors -eq 0 ]]; then
echo -e " ✅ ${GREEN}All migration files are valid!${NC}"
echo -e " 🎉 ${GREEN}All DDL operations include proper ON CLUSTER clause${NC}"
else
echo -e " ❌ ${RED}Found $total_errors file(s) with missing ON CLUSTER clauses${NC}"
echo -e " 🛠️ ${YELLOW}Please add 'ON CLUSTER '\"'\"'{cluster}'\"'\"'' to all CREATE, DROP, ALTER, RENAME, and EXCHANGE statements${NC}"
echo
echo -e "${YELLOW}📖 Reference: https://clickhouse.com/docs/sql-reference/distributed-ddl${NC}"
echo -e "${YELLOW}🔧 Example: CREATE TABLE my_table ON CLUSTER '{cluster}' (...);${NC}"
EXIT_CODE=1
fi
echo
}
# Run main function
main "$@"
exit $EXIT_CODE