Some checks failed
go: build dev binaries / cleanup (push) Successful in 4s
Codespell / Check for spelling errors (push) Failing after 3s
docker: build dev containers / build-rust-binaries (amd64, x86_64-unknown-linux-musl) (push) Failing after 3s
docker: build dev containers / build-dev-containers (push) Has been skipped
docker: build dev containers / build-rust-binaries (arm64, true, aarch64-unknown-linux-musl) (push) Failing after 3s
End to End / FUSE Mount (push) Failing after 2s
EC Integration Tests / EC Integration Tests (push) Failing after 30s
FUSE DLM Integration Tests / FUSE DLM Integration Tests (push) Failing after 3s
FUSE Volume Server Failover Tests / FUSE Volume Server Failover (push) Failing after 3s
FUSE Integration Tests / FUSE Integration Testing (push) Failing after 2s
FUSE P2P Peer Chunk Sharing Integration Tests / FUSE P2P Peer Chunk Sharing (push) Failing after 3s
go: build binary / Go Vet (push) Failing after 2s
go: build binary / Go Vet 32-bit (push) Failing after 3s
go: build binary / Build (push) Failing after 4s
go: build binary / Build cross-platform (freebsd/amd64) (push) Failing after 3s
go: build binary / Build cross-platform (windows/amd64) (push) Failing after 3s
go: build binary / Build cross-platform (darwin/arm64) (push) Failing after 3s
go: build binary / Build cross-platform (windows/arm64) (push) Failing after 3s
go: build binary / Test (push) Failing after 2s
go: build binary / Test 32-bit (push) Failing after 3s
helm: lint and test charts / lint-test (push) Failing after 3s
Java Client Integration Tests / Java Integration Tests (11) (push) Failing after 3s
Java Client Integration Tests / Java Integration Tests (17) (push) Failing after 3s
go: build dev binaries / build_dev_linux_windows (amd64, linux) (push) Failing after 2s
go: build dev binaries / build_dev_linux_windows (amd64, windows) (push) Failing after 3s
go: build dev binaries / build_dev_darwin (amd64, darwin) (push) Has been skipped
go: build dev binaries / build_dev_darwin (arm64, darwin) (push) Has been skipped
Java Client Unit Tests / Java Unit Tests (11) (push) Failing after 3s
Java Client Unit Tests / Java Unit Tests (17) (push) Failing after 2s
Java Client Unit Tests / Java Unit Tests (21) (push) Failing after 3s
Java Client Unit Tests / Java Unit Tests (8) (push) Failing after 3s
Kafka Quick Test (Load Test with Schema Registry) / Kafka Client Load Test (Quick) (push) Failing after 3s
Kafka Gateway Tests / Kafka Unit Tests (unit-tests-1) (push) Failing after 11s
Kafka Gateway Tests / Kafka Integration Tests (Critical) (integration-1) (push) Failing after 3s
Kafka Gateway Tests / Kafka End-to-End Tests (with SMQ) (e2e-1) (push) Failing after 3s
Kafka Gateway Tests / Kafka Consumer Group Tests (Highly Isolated) (consumer-group-1) (push) Failing after 2s
Kafka Gateway Tests / Kafka Client Compatibility (with SMQ) (client-compat-1) (push) Failing after 3s
Kafka Gateway Tests / Kafka SMQ Integration Tests (Full Stack) (smq-integration-1) (push) Failing after 3s
Kafka Gateway Tests / Kafka Protocol Tests (Isolated) (protocol-1) (push) Failing after 3s
KMS Tests / KMS Provider Integration Tests (push) Failing after 2s
KMS Tests / S3 KMS End-to-End Tests (push) Failing after 3s
Master Cold Start Tests / Master Cold Start Tests (push) Failing after 4s
Metadata Subscribe Integration Tests / Metadata Subscribe Integration Tests (push) Failing after 3s
Multi-Master Tests / Multi-Master Failover Tests (push) Failing after 3s
Performance / CPU and Heap Profile (push) Failing after 2s
Performance / S3 Read/Write Benchmark (rust volume) (push) Failing after 3s
pjdfstest POSIX Compliance / pjdfstest (push) Failing after 2s
Plugin Worker Integration Tests / Plugin Worker: erasure_coding (push) Failing after 3s
Plugin Worker Integration Tests / Plugin Worker: vacuum (push) Failing after 3s
Rust Volume Server Tests / Rust Integration Tests (push) Failing after 3s
Rust Volume Server Tests / Go Tests with Rust Volume (grpc - Shard 1) (push) Failing after 2s
Rust Volume Server Tests / Go Tests with Rust Volume (http - Shard 1) (push) Failing after 3s
Rust Volume Server Tests / Go Tests with Rust Volume (grpc - Shard 2) (push) Failing after 3s
Rust Volume Server Tests / Go Tests with Rust Volume (http - Shard 2) (push) Failing after 3s
Rust Volume Server Tests / Go Tests with Rust Volume (grpc - Shard 3) (push) Failing after 3s
S3 IAM Integration Tests / S3 IAM Distributed Tests (push) Failing after 2s
S3 IAM Integration Tests / S3 IAM Performance Tests (push) Failing after 3s
Performance / Throughput Benchmark (go volume) (push) Failing after 3s
Performance / Throughput Benchmark (rust volume) (push) Failing after 2s
Performance / S3 Read/Write Benchmark (go volume) (push) Failing after 3s
Plugin Worker Integration Tests / Plugin Worker: volume_balance (push) Failing after 3s
PostgreSQL Gateway Tests / PostgreSQL Basic Tests (push) Failing after 3s
Rust Volume Server Tests / Rust Unit Tests (push) Failing after 2s
Rust Volume Server Tests / Go Tests with Rust Volume (http - Shard 3) (push) Failing after 3s
Rust Plugin Worker Tests / Rust Plugin Worker Build and Unit Tests (push) Failing after 3s
rust: build dev volume server binaries / cleanup (push) Successful in 3s
S3 ETag and ACL Tests / S3 ETag + ACL Integration Tests (push) Failing after 3s
S3 IAM Integration Tests / IAM Unit Tests (push) Failing after 3s
S3 IAM Integration Tests / S3 IAM Integration Tests (advanced) (push) Failing after 3s
S3 IAM Integration Tests / S3 IAM Integration Tests (basic) (push) Failing after 2s
S3 IAM Integration Tests / S3 IAM Integration Tests (group) (push) Failing after 3s
S3 IAM Integration Tests / S3 IAM Integration Tests (policy-enforcement) (push) Failing after 2s
S3 IAM Integration Tests / S3 IAM Integration Tests (sts) (push) Failing after 4s
S3 Keycloak Integration Tests / S3 Keycloak Integration Tests (push) Failing after 3s
S3 PyArrow Parquet Tests / PyArrow Parquet Tests (Python 3.11) (push) Failing after 3s
S3 PyArrow Parquet Tests / Go Unit Tests (Implicit Directory) (push) Has been cancelled
S3 PyArrow Parquet Tests / PyArrow Parquet Tests (Python 3.12) (push) Has been cancelled
rust: build dev volume server binaries / build-rust-volume-dev-darwin (darwin-amd64, x86_64-apple-darwin) (push) Has been cancelled
rust: build dev volume server binaries / build-rust-volume-dev-darwin (darwin-arm64, aarch64-apple-darwin) (push) Has been cancelled
rust: build dev volume server binaries / build-rust-volume-dev-linux (linux-amd64, x86_64-unknown-linux-gnu) (push) Has been cancelled
S3 PyArrow Parquet Tests / PyArrow Parquet Tests (Python 3.9) (push) Has been cancelled
S3 Proxy Signature Tests / S3 Proxy Signature Verification Tests (push) Has been cancelled
S3 SDK V2 Route Disambiguation Tests / S3 SDK V2 Routing Tests (push) Has been cancelled
S3 SSE Tests / S3 SSE Integration Tests (quick) (push) Has been cancelled
S3 SSE Tests / S3 SSE Compatibility Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Metadata Persistence Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Copy Operations Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Multipart Upload Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Performance Test (push) Has been cancelled
S3 SSE Tests / S3 Volume Encryption Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Integration Tests (comprehensive) (push) Has been cancelled
Spark Integration Tests / Spark Integration Tests (push) Failing after 2s
Telemetry Integration Tests / telemetry-integration-test (push) Failing after 3s
Volume Server Integration Tests / Volume Server Integration Tests (grpc - Shard 1) (push) Failing after 3s
Volume Server Integration Tests / Volume Server Integration Tests (http - Shard 1) (push) Failing after 3s
Ceph S3 tests / Basic S3 tests (KV store) (push) Has been cancelled
Ceph S3 tests / S3 Versioning & Object Lock tests (push) Has been cancelled
S3 Policy Integration Tests / S3 Policy Unit Tests (push) Failing after 3s
Ceph S3 tests / S3 CORS tests (push) Has been cancelled
Ceph S3 tests / SeaweedFS Custom S3 Copy tests (push) Has been cancelled
Ceph S3 tests / Basic S3 tests (SQL store) (push) Has been cancelled
test s3 over https using aws-cli / awscli-tests (push) Has been cancelled
TLS Rotation Integration Tests / TLS Rotation Integration Tests (push) Has been cancelled
Vacuum Integration Tests / Vacuum Integration Tests (push) Has been cancelled
S3 Policy Integration Tests / S3 Policy Variables Integration Tests (push) Failing after 3s
S3 Policy Integration Tests / S3 Policy Enforcement Integration Tests (advanced-policy) (push) Failing after 3s
S3 Policy Integration Tests / S3 Policy Enforcement Integration Tests (basic-policy) (push) Failing after 2s
S3 Policy Integration Tests / S3 Policy Enforcement Integration Tests (contextual-policy) (push) Failing after 4s
S3 Policy Integration Tests / Trusted Proxy Detection Tests (push) Failing after 2s
S3 Policy Integration Tests / S3 Policy Shell Integration Tests (push) Failing after 3s
Samba on FUSE Integration / samba-integration (push) Failing after 2s
SFTP Integration Tests / SFTP Integration Testing (push) Failing after 3s
terraform: validate and test modules / fmt, validate, plan-level tests (push) Failing after 3s
terraform: validate and test modules / local cluster smoke test (real weed) (push) Failing after 2s
Volume Server Integration Tests / Volume Server Integration Tests (grpc - Shard 3) (push) Failing after 3s
Volume Server Integration Tests / Volume Server Integration Tests (grpc - Shard 2) (push) Failing after 3s
Volume Server Integration Tests / Volume Server Integration Tests (http - Shard 2) (push) Failing after 2s
Volume Server Integration Tests / Volume Server Integration Tests (http - Shard 3) (push) Failing after 5s
mount: windows conformance / WinFsp conformance (push) Has been cancelled
mount: windows / Mount on Windows (push) Has been cancelled
375 lines
12 KiB
Python
375 lines
12 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
Test client for SeaweedFS PostgreSQL protocol support.
|
||
|
||
This script demonstrates how to connect to SeaweedFS using standard PostgreSQL
|
||
libraries and execute various types of queries.
|
||
|
||
Requirements:
|
||
pip install psycopg2-binary
|
||
|
||
Usage:
|
||
python test_client.py
|
||
python test_client.py --host localhost --port 5432 --user seaweedfs --database default
|
||
"""
|
||
|
||
import sys
|
||
import argparse
|
||
import time
|
||
import traceback
|
||
|
||
try:
|
||
import psycopg2
|
||
import psycopg2.extras
|
||
except ImportError:
|
||
print("Error: psycopg2 not found. Install with: pip install psycopg2-binary")
|
||
sys.exit(1)
|
||
|
||
|
||
def test_connection(host, port, user, database, password=None):
|
||
"""Test basic connection to SeaweedFS PostgreSQL server."""
|
||
print(f"🔗 Testing connection to {host}:{port}/{database} as user '{user}'")
|
||
|
||
try:
|
||
conn_params = {
|
||
'host': host,
|
||
'port': port,
|
||
'user': user,
|
||
'database': database,
|
||
'connect_timeout': 10
|
||
}
|
||
|
||
if password:
|
||
conn_params['password'] = password
|
||
|
||
conn = psycopg2.connect(**conn_params)
|
||
print("✅ Connection successful!")
|
||
|
||
# Test basic query
|
||
cursor = conn.cursor()
|
||
cursor.execute("SELECT 1 as test")
|
||
result = cursor.fetchone()
|
||
print(f"✅ Basic query successful: {result}")
|
||
|
||
cursor.close()
|
||
conn.close()
|
||
return True
|
||
|
||
except Exception as e:
|
||
print(f"❌ Connection failed: {e}")
|
||
return False
|
||
|
||
|
||
def test_system_queries(host, port, user, database, password=None):
|
||
"""Test PostgreSQL system queries."""
|
||
print("\n🔧 Testing PostgreSQL system queries...")
|
||
|
||
try:
|
||
conn_params = {
|
||
'host': host,
|
||
'port': port,
|
||
'user': user,
|
||
'database': database
|
||
}
|
||
if password:
|
||
conn_params['password'] = password
|
||
|
||
conn = psycopg2.connect(**conn_params)
|
||
cursor = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
|
||
|
||
system_queries = [
|
||
("Version", "SELECT version()"),
|
||
("Current Database", "SELECT current_database()"),
|
||
("Current User", "SELECT current_user"),
|
||
("Server Encoding", "SELECT current_setting('server_encoding')"),
|
||
("Client Encoding", "SELECT current_setting('client_encoding')"),
|
||
]
|
||
|
||
for name, query in system_queries:
|
||
try:
|
||
cursor.execute(query)
|
||
result = cursor.fetchone()
|
||
print(f" ✅ {name}: {result[0]}")
|
||
except Exception as e:
|
||
print(f" ❌ {name}: {e}")
|
||
|
||
cursor.close()
|
||
conn.close()
|
||
|
||
except Exception as e:
|
||
print(f"❌ System queries failed: {e}")
|
||
|
||
|
||
def test_schema_queries(host, port, user, database, password=None):
|
||
"""Test schema and metadata queries."""
|
||
print("\n📊 Testing schema queries...")
|
||
|
||
try:
|
||
conn_params = {
|
||
'host': host,
|
||
'port': port,
|
||
'user': user,
|
||
'database': database
|
||
}
|
||
if password:
|
||
conn_params['password'] = password
|
||
|
||
conn = psycopg2.connect(**conn_params)
|
||
cursor = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
|
||
|
||
schema_queries = [
|
||
("Show Databases", "SHOW DATABASES"),
|
||
("Show Tables", "SHOW TABLES"),
|
||
("List Schemas", "SELECT 'public' as schema_name"),
|
||
]
|
||
|
||
for name, query in schema_queries:
|
||
try:
|
||
cursor.execute(query)
|
||
results = cursor.fetchall()
|
||
print(f" ✅ {name}: Found {len(results)} items")
|
||
for row in results[:3]: # Show first 3 results
|
||
print(f" - {dict(row)}")
|
||
if len(results) > 3:
|
||
print(f" ... and {len(results) - 3} more")
|
||
except Exception as e:
|
||
print(f" ❌ {name}: {e}")
|
||
|
||
cursor.close()
|
||
conn.close()
|
||
|
||
except Exception as e:
|
||
print(f"❌ Schema queries failed: {e}")
|
||
|
||
|
||
def test_data_queries(host, port, user, database, password=None):
|
||
"""Test data queries on actual topics."""
|
||
print("\n📝 Testing data queries...")
|
||
|
||
try:
|
||
conn_params = {
|
||
'host': host,
|
||
'port': port,
|
||
'user': user,
|
||
'database': database
|
||
}
|
||
if password:
|
||
conn_params['password'] = password
|
||
|
||
conn = psycopg2.connect(**conn_params)
|
||
cursor = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
|
||
|
||
# First, try to get available tables/topics
|
||
cursor.execute("SHOW TABLES")
|
||
tables = cursor.fetchall()
|
||
|
||
if not tables:
|
||
print(" ℹ️ No tables/topics found for data testing")
|
||
cursor.close()
|
||
conn.close()
|
||
return
|
||
|
||
# Test with first available table
|
||
table_name = tables[0][0] if tables[0] else 'test_topic'
|
||
print(f" 📋 Testing with table: {table_name}")
|
||
|
||
test_queries = [
|
||
(f"Count records in {table_name}", f"SELECT COUNT(*) FROM \"{table_name}\""),
|
||
(f"Sample data from {table_name}", f"SELECT * FROM \"{table_name}\" LIMIT 3"),
|
||
(f"System columns from {table_name}", f"SELECT _timestamp_ns, _key, _source FROM \"{table_name}\" LIMIT 3"),
|
||
(f"Describe {table_name}", f"DESCRIBE \"{table_name}\""),
|
||
]
|
||
|
||
for name, query in test_queries:
|
||
try:
|
||
cursor.execute(query)
|
||
results = cursor.fetchall()
|
||
|
||
if "COUNT" in query.upper():
|
||
count = results[0][0] if results else 0
|
||
print(f" ✅ {name}: {count} records")
|
||
elif "DESCRIBE" in query.upper():
|
||
print(f" ✅ {name}: {len(results)} columns")
|
||
for row in results[:5]: # Show first 5 columns
|
||
print(f" - {dict(row)}")
|
||
else:
|
||
print(f" ✅ {name}: {len(results)} rows")
|
||
for row in results:
|
||
print(f" - {dict(row)}")
|
||
|
||
except Exception as e:
|
||
print(f" ❌ {name}: {e}")
|
||
|
||
cursor.close()
|
||
conn.close()
|
||
|
||
except Exception as e:
|
||
print(f"❌ Data queries failed: {e}")
|
||
|
||
|
||
def test_prepared_statements(host, port, user, database, password=None):
|
||
"""Test prepared statements."""
|
||
print("\n📝 Testing prepared statements...")
|
||
|
||
try:
|
||
conn_params = {
|
||
'host': host,
|
||
'port': port,
|
||
'user': user,
|
||
'database': database
|
||
}
|
||
if password:
|
||
conn_params['password'] = password
|
||
|
||
conn = psycopg2.connect(**conn_params)
|
||
cursor = conn.cursor()
|
||
|
||
# Test parameterized query
|
||
try:
|
||
cursor.execute("SELECT %s as param1, %s as param2", ("hello", 42))
|
||
result = cursor.fetchone()
|
||
print(f" ✅ Prepared statement: {result}")
|
||
except Exception as e:
|
||
print(f" ❌ Prepared statement: {e}")
|
||
|
||
cursor.close()
|
||
conn.close()
|
||
|
||
except Exception as e:
|
||
print(f"❌ Prepared statements test failed: {e}")
|
||
|
||
|
||
def test_transaction_support(host, port, user, database, password=None):
|
||
"""Test transaction support (should be no-op for read-only)."""
|
||
print("\n🔄 Testing transaction support...")
|
||
|
||
try:
|
||
conn_params = {
|
||
'host': host,
|
||
'port': port,
|
||
'user': user,
|
||
'database': database
|
||
}
|
||
if password:
|
||
conn_params['password'] = password
|
||
|
||
conn = psycopg2.connect(**conn_params)
|
||
cursor = conn.cursor()
|
||
|
||
transaction_commands = [
|
||
"BEGIN",
|
||
"SELECT 1 as in_transaction",
|
||
"COMMIT",
|
||
"SELECT 1 as after_commit",
|
||
]
|
||
|
||
for cmd in transaction_commands:
|
||
try:
|
||
cursor.execute(cmd)
|
||
if "SELECT" in cmd:
|
||
result = cursor.fetchone()
|
||
print(f" ✅ {cmd}: {result}")
|
||
else:
|
||
print(f" ✅ {cmd}: OK")
|
||
except Exception as e:
|
||
print(f" ❌ {cmd}: {e}")
|
||
|
||
cursor.close()
|
||
conn.close()
|
||
|
||
except Exception as e:
|
||
print(f"❌ Transaction test failed: {e}")
|
||
|
||
|
||
def test_performance(host, port, user, database, password=None, iterations=10):
|
||
"""Test query performance."""
|
||
print(f"\n⚡ Testing performance ({iterations} iterations)...")
|
||
|
||
try:
|
||
conn_params = {
|
||
'host': host,
|
||
'port': port,
|
||
'user': user,
|
||
'database': database
|
||
}
|
||
if password:
|
||
conn_params['password'] = password
|
||
|
||
times = []
|
||
|
||
for i in range(iterations):
|
||
start_time = time.time()
|
||
|
||
conn = psycopg2.connect(**conn_params)
|
||
cursor = conn.cursor()
|
||
cursor.execute("SELECT 1")
|
||
result = cursor.fetchone()
|
||
cursor.close()
|
||
conn.close()
|
||
|
||
elapsed = time.time() - start_time
|
||
times.append(elapsed)
|
||
|
||
if i < 3: # Show first 3 iterations
|
||
print(f" Iteration {i+1}: {elapsed:.3f}s")
|
||
|
||
avg_time = sum(times) / len(times)
|
||
min_time = min(times)
|
||
max_time = max(times)
|
||
|
||
print(f" ✅ Performance results:")
|
||
print(f" - Average: {avg_time:.3f}s")
|
||
print(f" - Min: {min_time:.3f}s")
|
||
print(f" - Max: {max_time:.3f}s")
|
||
|
||
except Exception as e:
|
||
print(f"❌ Performance test failed: {e}")
|
||
|
||
|
||
def main():
|
||
parser = argparse.ArgumentParser(description="Test SeaweedFS PostgreSQL Protocol")
|
||
parser.add_argument("--host", default="localhost", help="PostgreSQL server host")
|
||
parser.add_argument("--port", type=int, default=5432, help="PostgreSQL server port")
|
||
parser.add_argument("--user", default="seaweedfs", help="PostgreSQL username")
|
||
parser.add_argument("--password", help="PostgreSQL password")
|
||
parser.add_argument("--database", default="default", help="PostgreSQL database")
|
||
parser.add_argument("--skip-performance", action="store_true", help="Skip performance tests")
|
||
|
||
args = parser.parse_args()
|
||
|
||
print("🧪 SeaweedFS PostgreSQL Protocol Test Client")
|
||
print("=" * 50)
|
||
|
||
# Test basic connection first
|
||
if not test_connection(args.host, args.port, args.user, args.database, args.password):
|
||
print("\n❌ Basic connection failed. Cannot continue with other tests.")
|
||
sys.exit(1)
|
||
|
||
# Run all tests
|
||
try:
|
||
test_system_queries(args.host, args.port, args.user, args.database, args.password)
|
||
test_schema_queries(args.host, args.port, args.user, args.database, args.password)
|
||
test_data_queries(args.host, args.port, args.user, args.database, args.password)
|
||
test_prepared_statements(args.host, args.port, args.user, args.database, args.password)
|
||
test_transaction_support(args.host, args.port, args.user, args.database, args.password)
|
||
|
||
if not args.skip_performance:
|
||
test_performance(args.host, args.port, args.user, args.database, args.password)
|
||
|
||
except KeyboardInterrupt:
|
||
print("\n\n⚠️ Tests interrupted by user")
|
||
sys.exit(0)
|
||
except Exception as e:
|
||
print(f"\n❌ Unexpected error during testing: {e}")
|
||
traceback.print_exc()
|
||
sys.exit(1)
|
||
|
||
print("\n🎉 All tests completed!")
|
||
print("\nTo use SeaweedFS with PostgreSQL tools:")
|
||
print(f" psql -h {args.host} -p {args.port} -U {args.user} -d {args.database}")
|
||
print(f" Connection string: postgresql://{args.user}@{args.host}:{args.port}/{args.database}")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main()
|