clawsql 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +97 -0
- package/README.md +372 -0
- package/dist/__tests__/config/settings.test.d.ts +5 -0
- package/dist/__tests__/config/settings.test.d.ts.map +1 -0
- package/dist/__tests__/config/settings.test.js +154 -0
- package/dist/__tests__/config/settings.test.js.map +1 -0
- package/dist/__tests__/core/discovery/topology.test.d.ts +5 -0
- package/dist/__tests__/core/discovery/topology.test.d.ts.map +1 -0
- package/dist/__tests__/core/discovery/topology.test.js +191 -0
- package/dist/__tests__/core/discovery/topology.test.js.map +1 -0
- package/dist/__tests__/core/failover/executor.test.d.ts +5 -0
- package/dist/__tests__/core/failover/executor.test.d.ts.map +1 -0
- package/dist/__tests__/core/failover/executor.test.js +256 -0
- package/dist/__tests__/core/failover/executor.test.js.map +1 -0
- package/dist/__tests__/core/monitoring/collector.test.d.ts +5 -0
- package/dist/__tests__/core/monitoring/collector.test.d.ts.map +1 -0
- package/dist/__tests__/core/monitoring/collector.test.js +131 -0
- package/dist/__tests__/core/monitoring/collector.test.js.map +1 -0
- package/dist/__tests__/core/monitoring/exporters.test.d.ts +5 -0
- package/dist/__tests__/core/monitoring/exporters.test.d.ts.map +1 -0
- package/dist/__tests__/core/monitoring/exporters.test.js +90 -0
- package/dist/__tests__/core/monitoring/exporters.test.js.map +1 -0
- package/dist/__tests__/core/routing/proxysql-manager.test.d.ts +5 -0
- package/dist/__tests__/core/routing/proxysql-manager.test.d.ts.map +1 -0
- package/dist/__tests__/core/routing/proxysql-manager.test.js +155 -0
- package/dist/__tests__/core/routing/proxysql-manager.test.js.map +1 -0
- package/dist/__tests__/types/index.test.d.ts +5 -0
- package/dist/__tests__/types/index.test.d.ts.map +1 -0
- package/dist/__tests__/types/index.test.js +290 -0
- package/dist/__tests__/types/index.test.js.map +1 -0
- package/dist/__tests__/utils/exceptions.test.d.ts +5 -0
- package/dist/__tests__/utils/exceptions.test.d.ts.map +1 -0
- package/dist/__tests__/utils/exceptions.test.js +142 -0
- package/dist/__tests__/utils/exceptions.test.js.map +1 -0
- package/dist/api/routes/clusters.d.ts +7 -0
- package/dist/api/routes/clusters.d.ts.map +1 -0
- package/dist/api/routes/clusters.js +123 -0
- package/dist/api/routes/clusters.js.map +1 -0
- package/dist/api/routes/config.d.ts +7 -0
- package/dist/api/routes/config.d.ts.map +1 -0
- package/dist/api/routes/config.js +65 -0
- package/dist/api/routes/config.js.map +1 -0
- package/dist/api/routes/failover.d.ts +7 -0
- package/dist/api/routes/failover.d.ts.map +1 -0
- package/dist/api/routes/failover.js +100 -0
- package/dist/api/routes/failover.js.map +1 -0
- package/dist/api/routes/instances.d.ts +11 -0
- package/dist/api/routes/instances.d.ts.map +1 -0
- package/dist/api/routes/instances.js +315 -0
- package/dist/api/routes/instances.js.map +1 -0
- package/dist/api/routes/monitoring.d.ts +7 -0
- package/dist/api/routes/monitoring.d.ts.map +1 -0
- package/dist/api/routes/monitoring.js +72 -0
- package/dist/api/routes/monitoring.js.map +1 -0
- package/dist/api/routes/webhooks.d.ts +12 -0
- package/dist/api/routes/webhooks.d.ts.map +1 -0
- package/dist/api/routes/webhooks.js +232 -0
- package/dist/api/routes/webhooks.js.map +1 -0
- package/dist/api/schemas/index.d.ts +965 -0
- package/dist/api/schemas/index.d.ts.map +1 -0
- package/dist/api/schemas/index.js +171 -0
- package/dist/api/schemas/index.js.map +1 -0
- package/dist/app.d.ts +13 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +197 -0
- package/dist/app.js.map +1 -0
- package/dist/bin/clawsql.d.ts +12 -0
- package/dist/bin/clawsql.d.ts.map +1 -0
- package/dist/bin/clawsql.js +43 -0
- package/dist/bin/clawsql.js.map +1 -0
- package/dist/cli/agent/handler.d.ts +73 -0
- package/dist/cli/agent/handler.d.ts.map +1 -0
- package/dist/cli/agent/handler.js +258 -0
- package/dist/cli/agent/handler.js.map +1 -0
- package/dist/cli/agent/index.d.ts +14 -0
- package/dist/cli/agent/index.d.ts.map +1 -0
- package/dist/cli/agent/index.js +30 -0
- package/dist/cli/agent/index.js.map +1 -0
- package/dist/cli/agent/openclaw-integration.d.ts +81 -0
- package/dist/cli/agent/openclaw-integration.d.ts.map +1 -0
- package/dist/cli/agent/openclaw-integration.js +341 -0
- package/dist/cli/agent/openclaw-integration.js.map +1 -0
- package/dist/cli/agent/providers/anthropic.d.ts +27 -0
- package/dist/cli/agent/providers/anthropic.d.ts.map +1 -0
- package/dist/cli/agent/providers/anthropic.js +106 -0
- package/dist/cli/agent/providers/anthropic.js.map +1 -0
- package/dist/cli/agent/providers/base.d.ts +91 -0
- package/dist/cli/agent/providers/base.d.ts.map +1 -0
- package/dist/cli/agent/providers/base.js +24 -0
- package/dist/cli/agent/providers/base.js.map +1 -0
- package/dist/cli/agent/providers/openai.d.ts +27 -0
- package/dist/cli/agent/providers/openai.d.ts.map +1 -0
- package/dist/cli/agent/providers/openai.js +98 -0
- package/dist/cli/agent/providers/openai.js.map +1 -0
- package/dist/cli/agent/tools/index.d.ts +32 -0
- package/dist/cli/agent/tools/index.d.ts.map +1 -0
- package/dist/cli/agent/tools/index.js +263 -0
- package/dist/cli/agent/tools/index.js.map +1 -0
- package/dist/cli/commands/cleanup.d.ts +12 -0
- package/dist/cli/commands/cleanup.d.ts.map +1 -0
- package/dist/cli/commands/cleanup.js +205 -0
- package/dist/cli/commands/cleanup.js.map +1 -0
- package/dist/cli/commands/clusters.d.ts +12 -0
- package/dist/cli/commands/clusters.d.ts.map +1 -0
- package/dist/cli/commands/clusters.js +468 -0
- package/dist/cli/commands/clusters.js.map +1 -0
- package/dist/cli/commands/config.d.ts +12 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +406 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/cron.d.ts +12 -0
- package/dist/cli/commands/cron.d.ts.map +1 -0
- package/dist/cli/commands/cron.js +215 -0
- package/dist/cli/commands/cron.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +13 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +687 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/failover.d.ts +16 -0
- package/dist/cli/commands/failover.d.ts.map +1 -0
- package/dist/cli/commands/failover.js +333 -0
- package/dist/cli/commands/failover.js.map +1 -0
- package/dist/cli/commands/health.d.ts +12 -0
- package/dist/cli/commands/health.d.ts.map +1 -0
- package/dist/cli/commands/health.js +125 -0
- package/dist/cli/commands/health.js.map +1 -0
- package/dist/cli/commands/help.d.ts +12 -0
- package/dist/cli/commands/help.d.ts.map +1 -0
- package/dist/cli/commands/help.js +52 -0
- package/dist/cli/commands/help.js.map +1 -0
- package/dist/cli/commands/instances.d.ts +12 -0
- package/dist/cli/commands/instances.d.ts.map +1 -0
- package/dist/cli/commands/instances.js +801 -0
- package/dist/cli/commands/instances.js.map +1 -0
- package/dist/cli/commands/notify.d.ts +12 -0
- package/dist/cli/commands/notify.d.ts.map +1 -0
- package/dist/cli/commands/notify.js +43 -0
- package/dist/cli/commands/notify.js.map +1 -0
- package/dist/cli/commands/sql.d.ts +12 -0
- package/dist/cli/commands/sql.d.ts.map +1 -0
- package/dist/cli/commands/sql.js +90 -0
- package/dist/cli/commands/sql.js.map +1 -0
- package/dist/cli/commands/start.d.ts +12 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +174 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/status.d.ts +12 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +218 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/stop.d.ts +12 -0
- package/dist/cli/commands/stop.d.ts.map +1 -0
- package/dist/cli/commands/stop.js +128 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/commands/topology.d.ts +12 -0
- package/dist/cli/commands/topology.d.ts.map +1 -0
- package/dist/cli/commands/topology.js +106 -0
- package/dist/cli/commands/topology.js.map +1 -0
- package/dist/cli/completer.d.ts +47 -0
- package/dist/cli/completer.d.ts.map +1 -0
- package/dist/cli/completer.js +332 -0
- package/dist/cli/completer.js.map +1 -0
- package/dist/cli/formatter.d.ts +165 -0
- package/dist/cli/formatter.d.ts.map +1 -0
- package/dist/cli/formatter.js +408 -0
- package/dist/cli/formatter.js.map +1 -0
- package/dist/cli/index.d.ts +21 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +79 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/raw-input.d.ts +97 -0
- package/dist/cli/raw-input.d.ts.map +1 -0
- package/dist/cli/raw-input.js +493 -0
- package/dist/cli/raw-input.js.map +1 -0
- package/dist/cli/registry.d.ts +103 -0
- package/dist/cli/registry.d.ts.map +1 -0
- package/dist/cli/registry.js +205 -0
- package/dist/cli/registry.js.map +1 -0
- package/dist/cli/repl.d.ts +83 -0
- package/dist/cli/repl.d.ts.map +1 -0
- package/dist/cli/repl.js +447 -0
- package/dist/cli/repl.js.map +1 -0
- package/dist/cli/ui/components.d.ts +144 -0
- package/dist/cli/ui/components.d.ts.map +1 -0
- package/dist/cli/ui/components.js +331 -0
- package/dist/cli/ui/components.js.map +1 -0
- package/dist/cli/ui/index.d.ts +7 -0
- package/dist/cli/ui/index.d.ts.map +1 -0
- package/dist/cli/ui/index.js +23 -0
- package/dist/cli/ui/index.js.map +1 -0
- package/dist/cli/utils/docker-files.d.ts +39 -0
- package/dist/cli/utils/docker-files.d.ts.map +1 -0
- package/dist/cli/utils/docker-files.js +223 -0
- package/dist/cli/utils/docker-files.js.map +1 -0
- package/dist/cli/utils/docker-prereq.d.ts +48 -0
- package/dist/cli/utils/docker-prereq.d.ts.map +1 -0
- package/dist/cli/utils/docker-prereq.js +203 -0
- package/dist/cli/utils/docker-prereq.js.map +1 -0
- package/dist/config/settings.d.ts +594 -0
- package/dist/config/settings.d.ts.map +1 -0
- package/dist/config/settings.js +250 -0
- package/dist/config/settings.js.map +1 -0
- package/dist/core/discovery/cluster-view.d.ts +50 -0
- package/dist/core/discovery/cluster-view.d.ts.map +1 -0
- package/dist/core/discovery/cluster-view.js +235 -0
- package/dist/core/discovery/cluster-view.js.map +1 -0
- package/dist/core/discovery/scanner.d.ts +70 -0
- package/dist/core/discovery/scanner.d.ts.map +1 -0
- package/dist/core/discovery/scanner.js +197 -0
- package/dist/core/discovery/scanner.js.map +1 -0
- package/dist/core/discovery/topology.d.ts +118 -0
- package/dist/core/discovery/topology.d.ts.map +1 -0
- package/dist/core/discovery/topology.js +550 -0
- package/dist/core/discovery/topology.js.map +1 -0
- package/dist/core/failover/candidate-selector.d.ts +46 -0
- package/dist/core/failover/candidate-selector.d.ts.map +1 -0
- package/dist/core/failover/candidate-selector.js +70 -0
- package/dist/core/failover/candidate-selector.js.map +1 -0
- package/dist/core/failover/executor.d.ts +104 -0
- package/dist/core/failover/executor.d.ts.map +1 -0
- package/dist/core/failover/executor.js +248 -0
- package/dist/core/failover/executor.js.map +1 -0
- package/dist/core/failover/operation-builder.d.ts +71 -0
- package/dist/core/failover/operation-builder.d.ts.map +1 -0
- package/dist/core/failover/operation-builder.js +157 -0
- package/dist/core/failover/operation-builder.js.map +1 -0
- package/dist/core/failover/operation-runner.d.ts +75 -0
- package/dist/core/failover/operation-runner.d.ts.map +1 -0
- package/dist/core/failover/operation-runner.js +191 -0
- package/dist/core/failover/operation-runner.js.map +1 -0
- package/dist/core/failover/promoter.d.ts +33 -0
- package/dist/core/failover/promoter.d.ts.map +1 -0
- package/dist/core/failover/promoter.js +97 -0
- package/dist/core/failover/promoter.js.map +1 -0
- package/dist/core/failover/recovery-manager.d.ts +47 -0
- package/dist/core/failover/recovery-manager.d.ts.map +1 -0
- package/dist/core/failover/recovery-manager.js +145 -0
- package/dist/core/failover/recovery-manager.js.map +1 -0
- package/dist/core/failover/types.d.ts +54 -0
- package/dist/core/failover/types.d.ts.map +1 -0
- package/dist/core/failover/types.js +8 -0
- package/dist/core/failover/types.js.map +1 -0
- package/dist/core/monitoring/collector.d.ts +25 -0
- package/dist/core/monitoring/collector.d.ts.map +1 -0
- package/dist/core/monitoring/collector.js +115 -0
- package/dist/core/monitoring/collector.js.map +1 -0
- package/dist/core/monitoring/exporters.d.ts +49 -0
- package/dist/core/monitoring/exporters.d.ts.map +1 -0
- package/dist/core/monitoring/exporters.js +126 -0
- package/dist/core/monitoring/exporters.js.map +1 -0
- package/dist/core/routing/proxysql-manager.d.ts +213 -0
- package/dist/core/routing/proxysql-manager.d.ts.map +1 -0
- package/dist/core/routing/proxysql-manager.js +632 -0
- package/dist/core/routing/proxysql-manager.js.map +1 -0
- package/dist/core/sync/replica-recovery.d.ts +40 -0
- package/dist/core/sync/replica-recovery.d.ts.map +1 -0
- package/dist/core/sync/replica-recovery.js +134 -0
- package/dist/core/sync/replica-recovery.js.map +1 -0
- package/dist/core/sync/sync-coordinator.d.ts +83 -0
- package/dist/core/sync/sync-coordinator.d.ts.map +1 -0
- package/dist/core/sync/sync-coordinator.js +254 -0
- package/dist/core/sync/sync-coordinator.js.map +1 -0
- package/dist/core/sync/topology-watcher.d.ts +76 -0
- package/dist/core/sync/topology-watcher.d.ts.map +1 -0
- package/dist/core/sync/topology-watcher.js +222 -0
- package/dist/core/sync/topology-watcher.js.map +1 -0
- package/dist/core/sync/types.d.ts +85 -0
- package/dist/core/sync/types.d.ts.map +1 -0
- package/dist/core/sync/types.js +8 -0
- package/dist/core/sync/types.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +212 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +153 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/database.d.ts +62 -0
- package/dist/utils/database.d.ts.map +1 -0
- package/dist/utils/database.js +257 -0
- package/dist/utils/database.js.map +1 -0
- package/dist/utils/exceptions.d.ts +69 -0
- package/dist/utils/exceptions.d.ts.map +1 -0
- package/dist/utils/exceptions.js +121 -0
- package/dist/utils/exceptions.js.map +1 -0
- package/dist/utils/logger.d.ts +20 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +90 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/mysql-client.d.ts +43 -0
- package/dist/utils/mysql-client.d.ts.map +1 -0
- package/dist/utils/mysql-client.js +125 -0
- package/dist/utils/mysql-client.js.map +1 -0
- package/docker/Dockerfile +61 -0
- package/docker/Dockerfile.node +41 -0
- package/docker/grafana/dashboards/clawsql.json +212 -0
- package/docker/grafana/provisioning/dashboards/dashboards.yml +13 -0
- package/docker/grafana/provisioning/datasources/datasources.yml +12 -0
- package/docker/init/primary.sql +26 -0
- package/docker/init/replica.sql +16 -0
- package/docker/orchestrator/orchestrator.conf.json +98 -0
- package/docker/prometheus/prometheus.yml +45 -0
- package/docker/proxysql/entrypoint.sh +8 -0
- package/docker/proxysql/init.sql.demo +30 -0
- package/docker/proxysql/proxysql.cnf +38 -0
- package/docker-compose.demo.yml +115 -0
- package/docker-compose.yml +217 -0
- package/init/primary.sql +19 -0
- package/init/replica.sql +13 -0
- package/package.json +84 -0
package/.env.example
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# ClawSQL Configuration Template
|
|
2
|
+
# Copy this file to .env and customize for your environment
|
|
3
|
+
|
|
4
|
+
# =============================================================================
|
|
5
|
+
# Quick Start
|
|
6
|
+
# =============================================================================
|
|
7
|
+
# Run: ./start.sh
|
|
8
|
+
# Then register your MySQL instances via API:
|
|
9
|
+
# curl -X POST http://localhost:8080/api/v1/instances \
|
|
10
|
+
# -H 'Content-Type: application/json' \
|
|
11
|
+
# -d '{"host": "your-mysql", "port": 3306}'
|
|
12
|
+
|
|
13
|
+
# =============================================================================
|
|
14
|
+
# API Configuration
|
|
15
|
+
# =============================================================================
|
|
16
|
+
API_HOST=0.0.0.0
|
|
17
|
+
API_PORT=8080
|
|
18
|
+
API_TOKEN_SECRET=change-me-in-production
|
|
19
|
+
API_TOKEN_EXPIRY_HOURS=24
|
|
20
|
+
|
|
21
|
+
# =============================================================================
|
|
22
|
+
# Metadata Database Configuration
|
|
23
|
+
# =============================================================================
|
|
24
|
+
# Shared MySQL database for ClawSQL and Orchestrator metadata
|
|
25
|
+
# Leave METADATA_DB_HOST empty to auto-provision a MySQL container
|
|
26
|
+
|
|
27
|
+
# Metadata Database (optional - auto-provisioned if METADATA_DB_HOST is empty)
|
|
28
|
+
METADATA_DB_HOST=
|
|
29
|
+
METADATA_DB_PORT=3306
|
|
30
|
+
METADATA_DB_NAME=clawsql_meta
|
|
31
|
+
METADATA_DB_USER=clawsql
|
|
32
|
+
METADATA_DB_PASSWORD=clawsql_password
|
|
33
|
+
METADATA_DB_ROOT_PASSWORD=metadata_root
|
|
34
|
+
METADATA_DB_POOL_SIZE=10
|
|
35
|
+
|
|
36
|
+
# =============================================================================
|
|
37
|
+
# Orchestrator Configuration
|
|
38
|
+
# =============================================================================
|
|
39
|
+
ORCHESTRATOR_URL=http://orchestrator:3000
|
|
40
|
+
ORCHESTRATOR_TIMEOUT=30.0
|
|
41
|
+
ORCHESTRATOR_TLS_ENABLED=false
|
|
42
|
+
ORCHESTRATOR_TLS_CERT=
|
|
43
|
+
ORCHESTRATOR_TLS_KEY=
|
|
44
|
+
|
|
45
|
+
# =============================================================================
|
|
46
|
+
# ProxySQL Configuration
|
|
47
|
+
# =============================================================================
|
|
48
|
+
PROXYSQL_HOST=proxysql
|
|
49
|
+
PROXYSQL_ADMIN_PORT=6032
|
|
50
|
+
PROXYSQL_MYSQL_PORT=6033
|
|
51
|
+
PROXYSQL_ADMIN_USER=admin
|
|
52
|
+
PROXYSQL_ADMIN_PASSWORD=admin
|
|
53
|
+
|
|
54
|
+
# =============================================================================
|
|
55
|
+
# Prometheus Configuration
|
|
56
|
+
# =============================================================================
|
|
57
|
+
PROMETHEUS_URL=http://prometheus:9090
|
|
58
|
+
PROMETHEUS_RETENTION_DAYS=15
|
|
59
|
+
|
|
60
|
+
# =============================================================================
|
|
61
|
+
# Monitoring Settings
|
|
62
|
+
# =============================================================================
|
|
63
|
+
COLLECTION_INTERVAL=15.0
|
|
64
|
+
HEALTH_CHECK_INTERVAL=10.0
|
|
65
|
+
ALERT_COOLDOWN_MINUTES=5
|
|
66
|
+
|
|
67
|
+
# =============================================================================
|
|
68
|
+
# Failover Settings
|
|
69
|
+
# =============================================================================
|
|
70
|
+
AUTO_FAILOVER_ENABLED=true
|
|
71
|
+
FAILOVER_TIMEOUT_SECONDS=30
|
|
72
|
+
MIN_REPLICAS_FOR_FAILOVER=2
|
|
73
|
+
CONFIRMATION_CHECKS=3
|
|
74
|
+
|
|
75
|
+
# =============================================================================
|
|
76
|
+
# MySQL Connection Credentials
|
|
77
|
+
# These are used to connect to YOUR MySQL instances for monitoring and management
|
|
78
|
+
# =============================================================================
|
|
79
|
+
# Admin user for SQL queries, monitoring, and metadata management
|
|
80
|
+
MYSQL_ADMIN_USER=clawsql
|
|
81
|
+
MYSQL_ADMIN_PASSWORD=clawsql_password
|
|
82
|
+
# Replication user (required for MySQL replication)
|
|
83
|
+
MYSQL_REPLICATION_USER=repl
|
|
84
|
+
MYSQL_REPLICATION_PASSWORD=repl_password
|
|
85
|
+
|
|
86
|
+
# =============================================================================
|
|
87
|
+
# Logging Configuration
|
|
88
|
+
# =============================================================================
|
|
89
|
+
LOG_LEVEL=INFO
|
|
90
|
+
LOG_FORMAT=json
|
|
91
|
+
|
|
92
|
+
# =============================================================================
|
|
93
|
+
# TLS Configuration (optional)
|
|
94
|
+
# =============================================================================
|
|
95
|
+
TLS_ENABLED=false
|
|
96
|
+
TLS_CERT_PATH=
|
|
97
|
+
TLS_KEY_PATH=
|
package/README.md
ADDED
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
# ClawSQL
|
|
2
|
+
|
|
3
|
+
MySQL High Availability Management Platform with automatic failover, read/write splitting, and topology management.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Automatic Failover**: Detect primary failures and promote replicas automatically
|
|
8
|
+
- **Read/Write Splitting**: ProxySQL integration for transparent traffic routing
|
|
9
|
+
- **Topology Management**: Orchestrator-powered MySQL cluster management
|
|
10
|
+
- **Instance Discovery**: Network scanning to find MySQL instances automatically
|
|
11
|
+
- **Monitoring**: Built-in Prometheus metrics and Grafana dashboards
|
|
12
|
+
- **Interactive CLI**: Full-featured command-line interface for all operations
|
|
13
|
+
|
|
14
|
+
## Prerequisites
|
|
15
|
+
|
|
16
|
+
- **Container Runtime**: Docker or Podman
|
|
17
|
+
- **Docker Compose**: docker-compose or podman-compose
|
|
18
|
+
- **Node.js**: v18+ (for CLI development)
|
|
19
|
+
|
|
20
|
+
## Quick Start
|
|
21
|
+
|
|
22
|
+
**New to ClawSQL?** See the **[Getting Started Guide](docs/GET_STARTED.md)** for a step-by-step tutorial.
|
|
23
|
+
|
|
24
|
+
### Option 1: Demo Mode (Recommended for Testing)
|
|
25
|
+
|
|
26
|
+
Start with a pre-configured demo MySQL cluster:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
./start.sh --demo
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
This starts:
|
|
33
|
+
- ClawSQL platform (API, Orchestrator, ProxySQL, Prometheus, Grafana)
|
|
34
|
+
- Demo MySQL cluster (1 primary + 2 replicas)
|
|
35
|
+
|
|
36
|
+
### Option 2: Production Mode (Bring Your Own MySQL)
|
|
37
|
+
|
|
38
|
+
Start the platform and connect to your existing MySQL instances:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
# Start platform
|
|
42
|
+
./start.sh
|
|
43
|
+
|
|
44
|
+
# Configure MySQL credentials
|
|
45
|
+
node dist/bin/clawsql.js -c "/config set mysql.admin_user root"
|
|
46
|
+
node dist/bin/clawsql.js -c "/config set mysql.admin_password yourpassword"
|
|
47
|
+
|
|
48
|
+
# Create Orchestrator user on your MySQL instances
|
|
49
|
+
mysql -e "CREATE USER 'clawsql'@'%' IDENTIFIED BY 'clawsql_password'; GRANT ALL ON *.* TO 'clawsql'@'%' WITH GRANT OPTION;"
|
|
50
|
+
|
|
51
|
+
# Discover MySQL instances on your network
|
|
52
|
+
node dist/bin/clawsql.js -c "/instances discover 172.18.0.0/24 --user root --password yourpassword"
|
|
53
|
+
|
|
54
|
+
# Or register instances manually
|
|
55
|
+
node dist/bin/clawsql.js -c "/instances register --host mysql-primary --port 3306"
|
|
56
|
+
|
|
57
|
+
# Sync to ProxySQL
|
|
58
|
+
node dist/bin/clawsql.js -c "/clusters sync"
|
|
59
|
+
|
|
60
|
+
# Verify health
|
|
61
|
+
node dist/bin/clawsql.js -c "/doctor"
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Services
|
|
65
|
+
|
|
66
|
+
After starting, access these services:
|
|
67
|
+
|
|
68
|
+
| Service | URL | Description |
|
|
69
|
+
|---------|-----|-------------|
|
|
70
|
+
| ClawSQL API | http://localhost:8080 | REST API |
|
|
71
|
+
| API Docs | http://localhost:8080/docs | OpenAPI documentation |
|
|
72
|
+
| Orchestrator | http://localhost:3000 | MySQL topology manager |
|
|
73
|
+
| Prometheus | http://localhost:9090 | Metrics collection |
|
|
74
|
+
| Grafana | http://localhost:3001 | Dashboards (admin/admin) |
|
|
75
|
+
| ProxySQL | localhost:6033 | MySQL traffic (read/write split) |
|
|
76
|
+
|
|
77
|
+
### Demo MySQL Cluster
|
|
78
|
+
|
|
79
|
+
When started with `--demo`:
|
|
80
|
+
|
|
81
|
+
| Instance | Port | Credentials |
|
|
82
|
+
|----------|------|-------------|
|
|
83
|
+
| Primary | 3306 | root/rootpassword |
|
|
84
|
+
| Replica 1 | 3307 | root/rootpassword |
|
|
85
|
+
| Replica 2 | 3308 | root/rootpassword |
|
|
86
|
+
|
|
87
|
+
## CLI Commands
|
|
88
|
+
|
|
89
|
+
### Platform Lifecycle
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
/start [--demo] # Start ClawSQL platform
|
|
93
|
+
/stop # Stop all services
|
|
94
|
+
/status # Show platform status
|
|
95
|
+
/cleanup # Remove all containers and data
|
|
96
|
+
/doctor # Run diagnostics and suggest fixes
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Configuration
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
/config show # Display current configuration
|
|
103
|
+
/config init # Interactive configuration wizard
|
|
104
|
+
/config set <key> <value> # Set configuration value
|
|
105
|
+
/config get <key> # Get configuration value
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Available configuration keys:
|
|
109
|
+
- `mysql.admin_user` - MySQL admin username
|
|
110
|
+
- `mysql.admin_password` - MySQL admin password
|
|
111
|
+
- `mysql.repl_user` - MySQL replication username
|
|
112
|
+
- `mysql.repl_password` - MySQL replication password
|
|
113
|
+
- `orchestrator.url` - Orchestrator URL
|
|
114
|
+
- `proxysql.host` - ProxySQL hostname
|
|
115
|
+
- `proxysql.admin_port` - ProxySQL admin port
|
|
116
|
+
- `failover.auto_enabled` - Enable auto failover (true/false)
|
|
117
|
+
- `log.level` - Log level (DEBUG/INFO/WARNING/ERROR/SILENT)
|
|
118
|
+
|
|
119
|
+
### Instance Management
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
/instances list # List discovered instances
|
|
123
|
+
/instances discover <network> [options] # Scan network for MySQL
|
|
124
|
+
--user <user> MySQL username for discovery
|
|
125
|
+
--password <pass> MySQL password
|
|
126
|
+
--port <port> Port range (default: 3306)
|
|
127
|
+
--auto-register Auto-register discovered instances
|
|
128
|
+
|
|
129
|
+
/instances register --host <host> [options] # Register instance manually
|
|
130
|
+
--port <port> MySQL port (default: 3306)
|
|
131
|
+
--user <user> MySQL username
|
|
132
|
+
--password <pass> MySQL password
|
|
133
|
+
|
|
134
|
+
/instances remove --host <host> [--port <port>] # Remove instance
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Cluster Management
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
/clusters list # List all clusters
|
|
141
|
+
/clusters topology [--name <cluster>] # Show topology
|
|
142
|
+
/clusters import --primary <host:port> # Import existing topology
|
|
143
|
+
/clusters create --name <name> --primary <h:p> # Create new cluster
|
|
144
|
+
--replicas <h:p,...> Replica instances (optional)
|
|
145
|
+
|
|
146
|
+
/clusters sync [--name <cluster>] # Sync to ProxySQL
|
|
147
|
+
/clusters add-replica --name <cluster> --host <h:p> # Add replica
|
|
148
|
+
/clusters remove-replica --name <cluster> --host <h:p> # Remove replica
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Failover Operations
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
/failover status # Show failover configuration
|
|
155
|
+
/failover history # Show operation history
|
|
156
|
+
/failover switchover <cluster> [target] # Planned primary change (primary healthy)
|
|
157
|
+
/failover failover <cluster> [target] # Emergency failover (primary down)
|
|
158
|
+
/failover recover list # List instances pending recovery
|
|
159
|
+
/failover recover <instance> # Recover specific instance
|
|
160
|
+
/failover recover --all # Recover all pending instances
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
> **Note:** For promoting replicas, use `/failover switchover` instead of `/clusters promote`.
|
|
164
|
+
|
|
165
|
+
### Additional Commands
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
/topology [--name <cluster>] # Quick topology view
|
|
169
|
+
/sql <host:port> "<query>" # Execute SQL query on instance
|
|
170
|
+
/cron list # List scheduled tasks
|
|
171
|
+
/cron create "<cron>" "<command>" # Schedule a recurring task
|
|
172
|
+
/cron remove <task-id> # Remove scheduled task
|
|
173
|
+
/notify send --message "<msg>" # Send notification
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
## MySQL Configuration Requirements
|
|
177
|
+
|
|
178
|
+
### Orchestrator User
|
|
179
|
+
|
|
180
|
+
Create a user for Orchestrator on your MySQL instances:
|
|
181
|
+
|
|
182
|
+
```sql
|
|
183
|
+
CREATE USER 'clawsql'@'%' IDENTIFIED BY 'clawsql_password';
|
|
184
|
+
GRANT ALL PRIVILEGES ON *.* TO 'clawsql'@'%' WITH GRANT OPTION;
|
|
185
|
+
FLUSH PRIVILEGES;
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### Replication User (for GTID replication)
|
|
189
|
+
|
|
190
|
+
```sql
|
|
191
|
+
CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'repl_password';
|
|
192
|
+
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
|
|
193
|
+
FLUSH PRIVILEGES;
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### MySQL Server Configuration
|
|
197
|
+
|
|
198
|
+
For replication, your MySQL instances should have:
|
|
199
|
+
|
|
200
|
+
```ini
|
|
201
|
+
[mysqld]
|
|
202
|
+
server-id = 1 # Unique for each server
|
|
203
|
+
log-bin = mysql-bin
|
|
204
|
+
binlog-format = ROW
|
|
205
|
+
gtid-mode = ON
|
|
206
|
+
enforce-gtid-consistency = ON
|
|
207
|
+
log-slave-updates = ON
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
## Configuration
|
|
211
|
+
|
|
212
|
+
Configuration is managed via environment variables. Copy `.env.example` to `.env`:
|
|
213
|
+
|
|
214
|
+
```bash
|
|
215
|
+
cp .env.example .env
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
Key settings:
|
|
219
|
+
|
|
220
|
+
| Variable | Default | Description |
|
|
221
|
+
|----------|---------|-------------|
|
|
222
|
+
| `API_PORT` | 8080 | API server port |
|
|
223
|
+
| `API_TOKEN_SECRET` | change-me | JWT secret (change in production!) |
|
|
224
|
+
| `MYSQL_ADMIN_USER` | clawsql | MySQL admin username |
|
|
225
|
+
| `MYSQL_ADMIN_PASSWORD` | clawsql_password | MySQL admin password |
|
|
226
|
+
| `AUTO_FAILOVER_ENABLED` | true | Enable automatic failover |
|
|
227
|
+
| `LOG_LEVEL` | INFO | Logging level |
|
|
228
|
+
|
|
229
|
+
## Architecture
|
|
230
|
+
|
|
231
|
+
```
|
|
232
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
233
|
+
│ Your Application │
|
|
234
|
+
└───────────────────────────────┬─────────────────────────────────┘
|
|
235
|
+
│
|
|
236
|
+
▼
|
|
237
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
238
|
+
│ ProxySQL │
|
|
239
|
+
│ (Read/Write Splitting) │
|
|
240
|
+
│ Port 6033 - MySQL Traffic | Port 6032 - Admin │
|
|
241
|
+
└───────────────┬─────────────────────────────┬───────────────────┘
|
|
242
|
+
│ │
|
|
243
|
+
┌───────▼───────┐ ┌───────▼───────┐
|
|
244
|
+
│ Primary │ │ Replica │
|
|
245
|
+
│ (Writer) │────────────▶│ (Reader) │
|
|
246
|
+
│ Port 3306 │ Repl │ Port 3306 │
|
|
247
|
+
└───────────────┘ └───────────────┘
|
|
248
|
+
│ │
|
|
249
|
+
└──────────────┬──────────────┘
|
|
250
|
+
│
|
|
251
|
+
┌──────────────────────────────▼──────────────────────────────────┐
|
|
252
|
+
│ ClawSQL │
|
|
253
|
+
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
|
254
|
+
│ │ Orchestrator│ │ Failover │ │ Monitoring │ │
|
|
255
|
+
│ │ Client │ │ Engine │ │ Service │ │
|
|
256
|
+
│ └─────────────┘ └─────────────┘ └─────────────┘ │
|
|
257
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
## AI Agent Integration
|
|
261
|
+
|
|
262
|
+
ClawSQL includes an AI-powered assistant for database operations using [OpenClaw](https://github.com/anthropics/openclaw).
|
|
263
|
+
|
|
264
|
+
### Prerequisites
|
|
265
|
+
|
|
266
|
+
Install and configure the OpenClaw CLI following the [OpenClaw documentation](https://github.com/anthropics/openclaw#installation).
|
|
267
|
+
|
|
268
|
+
### Using the AI Agent
|
|
269
|
+
|
|
270
|
+
Start the CLI and interact naturally:
|
|
271
|
+
|
|
272
|
+
```
|
|
273
|
+
clawsql> show me the cluster topology
|
|
274
|
+
clawsql> what's the replication lag on replica-1?
|
|
275
|
+
clawsql> help me set up a new replica
|
|
276
|
+
clawsql> explain the failover process
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
### Supported Operations
|
|
280
|
+
|
|
281
|
+
- **Topology queries**: "show me the cluster", "what's the primary?"
|
|
282
|
+
- **Status checks**: "check replication status", "is the cluster healthy?"
|
|
283
|
+
- **Guided operations**: "how do I add a replica?", "help me set up failover"
|
|
284
|
+
- **Troubleshooting**: "why is replication lag high?", "diagnose connection issues"
|
|
285
|
+
- **Explanations**: "explain read/write splitting", "how does failover work?"
|
|
286
|
+
|
|
287
|
+
### Stopping AI Operations
|
|
288
|
+
|
|
289
|
+
During AI processing, press **ESC twice** (within 500ms) to stop the current operation.
|
|
290
|
+
|
|
291
|
+
## Development
|
|
292
|
+
|
|
293
|
+
```bash
|
|
294
|
+
# Install dependencies
|
|
295
|
+
npm install
|
|
296
|
+
|
|
297
|
+
# Build TypeScript
|
|
298
|
+
npm run build
|
|
299
|
+
|
|
300
|
+
# Run CLI
|
|
301
|
+
node dist/bin/clawsql.js
|
|
302
|
+
|
|
303
|
+
# Run tests
|
|
304
|
+
npm test
|
|
305
|
+
|
|
306
|
+
# Run with file watcher
|
|
307
|
+
npm run dev
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
### Project Structure
|
|
311
|
+
|
|
312
|
+
```
|
|
313
|
+
clawsql/
|
|
314
|
+
├── src/
|
|
315
|
+
│ ├── index.ts # Entry point
|
|
316
|
+
│ ├── app.ts # Fastify application setup
|
|
317
|
+
│ ├── config/ # Configuration management
|
|
318
|
+
│ ├── types/ # TypeScript types and interfaces
|
|
319
|
+
│ ├── core/ # Core business logic
|
|
320
|
+
│ │ ├── discovery/ # Instance discovery and topology
|
|
321
|
+
│ │ ├── monitoring/ # Metrics and health checks
|
|
322
|
+
│ │ ├── failover/ # Failover operations
|
|
323
|
+
│ │ └── routing/ # ProxySQL integration
|
|
324
|
+
│ ├── api/ # REST API routes
|
|
325
|
+
│ ├── cli/ # CLI commands
|
|
326
|
+
│ ├── utils/ # Utilities
|
|
327
|
+
│ └── __tests__/ # Test files
|
|
328
|
+
├── docker/ # Docker configurations
|
|
329
|
+
├── scripts/ # Utility scripts
|
|
330
|
+
├── package.json # Node.js dependencies
|
|
331
|
+
└── tsconfig.json # TypeScript configuration
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
## Troubleshooting
|
|
335
|
+
|
|
336
|
+
### Check Platform Health
|
|
337
|
+
|
|
338
|
+
```bash
|
|
339
|
+
node dist/bin/clawsql.js -c "/doctor"
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
### View Logs
|
|
343
|
+
|
|
344
|
+
```bash
|
|
345
|
+
docker-compose logs -f clawsql
|
|
346
|
+
docker-compose logs -f orchestrator
|
|
347
|
+
docker-compose logs -f proxysql
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
### Check MySQL Replication
|
|
351
|
+
|
|
352
|
+
```bash
|
|
353
|
+
docker exec mysql-replica-1 mysql -uroot -prootpassword -e "SHOW REPLICA STATUS\G"
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
### Reset ProxySQL
|
|
357
|
+
|
|
358
|
+
```bash
|
|
359
|
+
docker exec proxysql mysql -h127.0.0.1 -P6032 -uadmin -padmin -e "DELETE FROM mysql_servers; LOAD MYSQL SERVERS TO RUNTIME;"
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
## Documentation
|
|
363
|
+
|
|
364
|
+
- [Getting Started](docs/GET_STARTED.md) - Step-by-step tutorial
|
|
365
|
+
- [API Documentation](docs/API.md) - REST API reference
|
|
366
|
+
- [Demo Guide](docs/DEMO.md) - Testing with demo cluster
|
|
367
|
+
- [Failover Documentation](docs/failover.md) - Failover architecture and operations
|
|
368
|
+
- [System Architecture](docs/architecture/system_design.md) - Technical details
|
|
369
|
+
|
|
370
|
+
## License
|
|
371
|
+
|
|
372
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/config/settings.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tests for ClawSQL configuration settings
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
// Store original env
|
|
7
|
+
const originalEnv = { ...process.env };
|
|
8
|
+
// Mock dotenv to prevent loading .env
|
|
9
|
+
jest.mock('dotenv', () => ({
|
|
10
|
+
config: jest.fn(),
|
|
11
|
+
}));
|
|
12
|
+
const settings_1 = require("../../config/settings");
|
|
13
|
+
describe('Settings', () => {
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
// Clear all env vars that affect settings
|
|
16
|
+
delete process.env.API_PORT;
|
|
17
|
+
delete process.env.DB_TYPE;
|
|
18
|
+
delete process.env.AUTO_FAILOVER_ENABLED;
|
|
19
|
+
delete process.env.PROXYSQL_ADMIN_USER;
|
|
20
|
+
delete process.env.PROXYSQL_ADMIN_PASSWORD;
|
|
21
|
+
delete process.env.API_TOKEN_SECRET;
|
|
22
|
+
delete process.env.MYSQL_MONITOR_PASSWORD;
|
|
23
|
+
// Reset settings cache before each test
|
|
24
|
+
(0, settings_1.resetSettings)();
|
|
25
|
+
});
|
|
26
|
+
afterEach(() => {
|
|
27
|
+
// Restore original env
|
|
28
|
+
process.env = { ...originalEnv };
|
|
29
|
+
(0, settings_1.resetSettings)();
|
|
30
|
+
});
|
|
31
|
+
describe('getSettings', () => {
|
|
32
|
+
it('should return default settings when no env vars set', () => {
|
|
33
|
+
const settings = (0, settings_1.getSettings)();
|
|
34
|
+
expect(settings.appName).toBe('ClawSQL');
|
|
35
|
+
expect(settings.appVersion).toBe('0.1.0');
|
|
36
|
+
expect(settings.debug).toBe(false);
|
|
37
|
+
});
|
|
38
|
+
it('should return cached settings on subsequent calls', () => {
|
|
39
|
+
const settings1 = (0, settings_1.getSettings)();
|
|
40
|
+
const settings2 = (0, settings_1.getSettings)();
|
|
41
|
+
expect(settings1).toBe(settings2);
|
|
42
|
+
});
|
|
43
|
+
it('should load new settings after reset', () => {
|
|
44
|
+
const settings1 = (0, settings_1.getSettings)();
|
|
45
|
+
(0, settings_1.resetSettings)();
|
|
46
|
+
const settings2 = (0, settings_1.getSettings)();
|
|
47
|
+
// Different object references but same values
|
|
48
|
+
expect(settings1).not.toBe(settings2);
|
|
49
|
+
expect(settings1.appName).toBe(settings2.appName);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
describe('DatabaseSettings', () => {
|
|
53
|
+
it('should have correct defaults', () => {
|
|
54
|
+
const settings = (0, settings_1.getSettings)();
|
|
55
|
+
expect(settings.database.type).toBe('sqlite');
|
|
56
|
+
expect(settings.database.sqlitePath).toBe('/data/clawsql.db');
|
|
57
|
+
expect(settings.database.host).toBe('localhost');
|
|
58
|
+
expect(settings.database.port).toBe(3306);
|
|
59
|
+
expect(settings.database.name).toBe('clawsql');
|
|
60
|
+
expect(settings.database.user).toBe('clawsql');
|
|
61
|
+
expect(settings.database.poolSize).toBe(10);
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
describe('OrchestratorSettings', () => {
|
|
65
|
+
it('should have correct defaults', () => {
|
|
66
|
+
const settings = (0, settings_1.getSettings)();
|
|
67
|
+
expect(settings.orchestrator.url).toBe('http://orchestrator:3000');
|
|
68
|
+
expect(settings.orchestrator.timeout).toBe(30);
|
|
69
|
+
expect(settings.orchestrator.tlsEnabled).toBe(false);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
describe('ProxySQLSettings', () => {
|
|
73
|
+
it('should have correct defaults', () => {
|
|
74
|
+
const settings = (0, settings_1.getSettings)();
|
|
75
|
+
expect(settings.proxysql.host).toBe('proxysql');
|
|
76
|
+
expect(settings.proxysql.adminPort).toBe(6032);
|
|
77
|
+
expect(settings.proxysql.mysqlPort).toBe(6033);
|
|
78
|
+
expect(settings.proxysql.adminUser).toBe('clawsql');
|
|
79
|
+
expect(settings.proxysql.adminPassword).toBe('clawsql');
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
describe('PrometheusSettings', () => {
|
|
83
|
+
it('should have correct defaults', () => {
|
|
84
|
+
const settings = (0, settings_1.getSettings)();
|
|
85
|
+
expect(settings.prometheus.url).toBe('http://prometheus:9090');
|
|
86
|
+
expect(settings.prometheus.retentionDays).toBe(15);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
describe('MonitoringSettings', () => {
|
|
90
|
+
it('should have correct defaults', () => {
|
|
91
|
+
const settings = (0, settings_1.getSettings)();
|
|
92
|
+
expect(settings.monitoring.collectionInterval).toBe(15);
|
|
93
|
+
expect(settings.monitoring.healthCheckInterval).toBe(10);
|
|
94
|
+
expect(settings.monitoring.alertCooldownMinutes).toBe(5);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
describe('FailoverSettings', () => {
|
|
98
|
+
it('should have correct defaults', () => {
|
|
99
|
+
const settings = (0, settings_1.getSettings)();
|
|
100
|
+
expect(settings.failover.autoFailoverEnabled).toBe(true);
|
|
101
|
+
expect(settings.failover.timeoutSeconds).toBe(30);
|
|
102
|
+
expect(settings.failover.minReplicasForFailover).toBe(2);
|
|
103
|
+
expect(settings.failover.confirmationChecks).toBe(3);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
describe('DiscoverySettings', () => {
|
|
107
|
+
it('should have correct defaults', () => {
|
|
108
|
+
const settings = (0, settings_1.getSettings)();
|
|
109
|
+
expect(settings.discovery.networkSegments).toBe('172.18.0.0/24');
|
|
110
|
+
expect(settings.discovery.portRangeStart).toBe(3306);
|
|
111
|
+
expect(settings.discovery.portRangeEnd).toBe(3306);
|
|
112
|
+
expect(settings.discovery.timeout).toBe(2);
|
|
113
|
+
expect(settings.discovery.maxConcurrent).toBe(100);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
describe('APISettings', () => {
|
|
117
|
+
it('should have correct defaults', () => {
|
|
118
|
+
const settings = (0, settings_1.getSettings)();
|
|
119
|
+
expect(settings.api.host).toBe('0.0.0.0');
|
|
120
|
+
expect(settings.api.port).toBe(8080);
|
|
121
|
+
expect(settings.api.tokenSecret).toBe('change-me-in-production');
|
|
122
|
+
expect(settings.api.tokenExpiryHours).toBe(24);
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
describe('MySQLCredentials', () => {
|
|
126
|
+
it('should have correct defaults', () => {
|
|
127
|
+
const settings = (0, settings_1.getSettings)();
|
|
128
|
+
expect(settings.mysql.monitorUser).toBe('monitor');
|
|
129
|
+
expect(settings.mysql.monitorPassword).toBe('');
|
|
130
|
+
expect(settings.mysql.replicationUser).toBe('repl');
|
|
131
|
+
expect(settings.mysql.replicationPassword).toBe('');
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
describe('LogSettings', () => {
|
|
135
|
+
it('should have correct defaults', () => {
|
|
136
|
+
const settings = (0, settings_1.getSettings)();
|
|
137
|
+
expect(settings.logging.level).toBe('INFO');
|
|
138
|
+
expect(settings.logging.format).toBe('json');
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
describe('Environment variable loading', () => {
|
|
142
|
+
it('should load settings from environment variables', () => {
|
|
143
|
+
process.env.API_PORT = '9090';
|
|
144
|
+
process.env.DB_TYPE = 'mysql';
|
|
145
|
+
process.env.AUTO_FAILOVER_ENABLED = 'false';
|
|
146
|
+
(0, settings_1.resetSettings)();
|
|
147
|
+
const settings = (0, settings_1.getSettings)();
|
|
148
|
+
expect(settings.api.port).toBe(9090);
|
|
149
|
+
expect(settings.database.type).toBe('mysql');
|
|
150
|
+
expect(settings.failover.autoFailoverEnabled).toBe(false);
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
//# sourceMappingURL=settings.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.test.js","sourceRoot":"","sources":["../../../src/__tests__/config/settings.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"topology.test.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/core/discovery/topology.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|