clawsql 0.1.6 → 0.1.8

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.
Files changed (74) hide show
  1. package/README.md +49 -21
  2. package/dist/api/routes/instances.d.ts.map +1 -1
  3. package/dist/api/routes/instances.js +9 -6
  4. package/dist/api/routes/instances.js.map +1 -1
  5. package/dist/api/schemas/index.d.ts +142 -142
  6. package/dist/app.js +2 -2
  7. package/dist/cli/commands/cleanup.d.ts.map +1 -1
  8. package/dist/cli/commands/cleanup.js +40 -44
  9. package/dist/cli/commands/cleanup.js.map +1 -1
  10. package/dist/cli/commands/instances.d.ts.map +1 -1
  11. package/dist/cli/commands/instances.js +41 -22
  12. package/dist/cli/commands/instances.js.map +1 -1
  13. package/dist/cli/commands/start.d.ts.map +1 -1
  14. package/dist/cli/commands/start.js +16 -36
  15. package/dist/cli/commands/start.js.map +1 -1
  16. package/dist/cli/commands/stop.d.ts.map +1 -1
  17. package/dist/cli/commands/stop.js +18 -35
  18. package/dist/cli/commands/stop.js.map +1 -1
  19. package/dist/cli/utils/command-executor.d.ts +62 -0
  20. package/dist/cli/utils/command-executor.d.ts.map +1 -0
  21. package/dist/cli/utils/command-executor.js +224 -0
  22. package/dist/cli/utils/command-executor.js.map +1 -0
  23. package/dist/config/settings.js +1 -1
  24. package/dist/core/discovery/topology.d.ts +2 -0
  25. package/dist/core/discovery/topology.d.ts.map +1 -1
  26. package/dist/core/discovery/topology.js +48 -7
  27. package/dist/core/discovery/topology.js.map +1 -1
  28. package/docker/Dockerfile.allinone +37 -28
  29. package/docker/orchestrator/orchestrator.conf.json +2 -2
  30. package/docker-compose.demo.yml +26 -17
  31. package/docker-compose.yml +3 -0
  32. package/init/metadata.sql +11 -0
  33. package/init/primary.sql +2 -12
  34. package/init/replica-host.sql +7 -0
  35. package/init/replica.sql +12 -2
  36. package/package.json +1 -1
  37. package/dist/__tests__/config/settings.test.d.ts +0 -5
  38. package/dist/__tests__/config/settings.test.d.ts.map +0 -1
  39. package/dist/__tests__/config/settings.test.js +0 -154
  40. package/dist/__tests__/config/settings.test.js.map +0 -1
  41. package/dist/__tests__/core/discovery/topology.test.d.ts +0 -5
  42. package/dist/__tests__/core/discovery/topology.test.d.ts.map +0 -1
  43. package/dist/__tests__/core/discovery/topology.test.js +0 -191
  44. package/dist/__tests__/core/discovery/topology.test.js.map +0 -1
  45. package/dist/__tests__/core/failover/executor.test.d.ts +0 -5
  46. package/dist/__tests__/core/failover/executor.test.d.ts.map +0 -1
  47. package/dist/__tests__/core/failover/executor.test.js +0 -256
  48. package/dist/__tests__/core/failover/executor.test.js.map +0 -1
  49. package/dist/__tests__/core/monitoring/collector.test.d.ts +0 -5
  50. package/dist/__tests__/core/monitoring/collector.test.d.ts.map +0 -1
  51. package/dist/__tests__/core/monitoring/collector.test.js +0 -131
  52. package/dist/__tests__/core/monitoring/collector.test.js.map +0 -1
  53. package/dist/__tests__/core/monitoring/exporters.test.d.ts +0 -5
  54. package/dist/__tests__/core/monitoring/exporters.test.d.ts.map +0 -1
  55. package/dist/__tests__/core/monitoring/exporters.test.js +0 -90
  56. package/dist/__tests__/core/monitoring/exporters.test.js.map +0 -1
  57. package/dist/__tests__/core/routing/proxysql-manager.test.d.ts +0 -5
  58. package/dist/__tests__/core/routing/proxysql-manager.test.d.ts.map +0 -1
  59. package/dist/__tests__/core/routing/proxysql-manager.test.js +0 -155
  60. package/dist/__tests__/core/routing/proxysql-manager.test.js.map +0 -1
  61. package/dist/__tests__/types/index.test.d.ts +0 -5
  62. package/dist/__tests__/types/index.test.d.ts.map +0 -1
  63. package/dist/__tests__/types/index.test.js +0 -290
  64. package/dist/__tests__/types/index.test.js.map +0 -1
  65. package/dist/__tests__/utils/exceptions.test.d.ts +0 -5
  66. package/dist/__tests__/utils/exceptions.test.d.ts.map +0 -1
  67. package/dist/__tests__/utils/exceptions.test.js +0 -142
  68. package/dist/__tests__/utils/exceptions.test.js.map +0 -1
  69. package/dist/cli/commands/health.d.ts +0 -12
  70. package/dist/cli/commands/health.d.ts.map +0 -1
  71. package/dist/cli/commands/health.js +0 -125
  72. package/dist/cli/commands/health.js.map +0 -1
  73. package/docker/init/primary.sql +0 -26
  74. package/docker/init/replica.sql +0 -16
@@ -9,7 +9,7 @@
9
9
  # - Grafana (visualization)
10
10
  # - Supervisord (process manager)
11
11
 
12
- FROM docker.io/library/node:20-alpine AS clawsql-builder
12
+ FROM node:20-slim AS clawsql-builder
13
13
 
14
14
  WORKDIR /build
15
15
  COPY package.json package-lock.json* ./
@@ -18,27 +18,30 @@ COPY . .
18
18
  RUN npm run build
19
19
 
20
20
  # =============================================================================
21
- # Final all-in-one image
21
+ # Final all-in-one image (Debian-based for glibc compatibility)
22
22
  # =============================================================================
23
- FROM docker.io/library/alpine:3.19
23
+ FROM debian:bookworm-slim
24
24
 
25
25
  # Install all dependencies
26
- RUN apk add --no-cache \
26
+ RUN apt-get update && apt-get install -y --no-install-recommends \
27
27
  nodejs \
28
28
  npm \
29
29
  curl \
30
30
  wget \
31
- mysql-client \
31
+ default-mysql-client \
32
32
  supervisor \
33
33
  python3 \
34
- py3-pip \
34
+ python3-pip \
35
35
  bash \
36
- shadow \
37
- && pip3 install --break-system-packages supervisor
36
+ procps \
37
+ gnupg \
38
+ lsb-release \
39
+ ca-certificates \
40
+ && rm -rf /var/lib/apt/lists/*
38
41
 
39
42
  # Download and install components
40
- ARG ORCHESTRATOR_VERSION=latest
41
- ARG PROXYSQL_VERSION=latest
43
+ ARG ORCHESTRATOR_VERSION=3.2.6
44
+ ARG PROXYSQL_VERSION=3.0.6
42
45
  ARG PROMETHEUS_VERSION=2.45.0
43
46
  ARG GRAFANA_VERSION=10.2.0
44
47
 
@@ -54,24 +57,21 @@ RUN mkdir -p /opt/clawsql \
54
57
  /var/lib/grafana \
55
58
  /data
56
59
 
57
- # Copy ClawSQL application
58
- COPY --from=clawsql-builder /build/dist /opt/clawsql/dist
59
- COPY --from=clawsql-builder /build/node_modules /opt/clawsql/node_modules
60
- COPY --from=clawsql-builder /build/package.json /opt/clawsql/
61
- COPY docker/orchestrator/orchestrator.conf.json /etc/orchestrator.conf.json
62
- COPY docker/proxysql/proxysql.cnf /etc/proxysql.cnf
63
- COPY docker/prometheus/prometheus.yml /etc/prometheus.yml
64
- COPY docker/grafana/provisioning /opt/grafana/conf/provisioning
65
- COPY docker/grafana/dashboards /opt/grafana/dashboards
60
+ # Download Orchestrator
61
+ RUN ARCH=$(uname -m) && \
62
+ if [ "$ARCH" = "x86_64" ]; then ARCH="amd64"; elif [ "$ARCH" = "aarch64" ]; then ARCH="arm64"; fi && \
63
+ wget -q "https://github.com/openark/orchestrator/releases/download/v${ORCHESTRATOR_VERSION}/orchestrator-${ORCHESTRATOR_VERSION}-linux-${ARCH}.tar.gz" -O /tmp/orchestrator.tar.gz && \
64
+ tar -xzf /tmp/orchestrator.tar.gz -C /opt/orchestrator --strip-components=1 && \
65
+ rm /tmp/orchestrator.tar.gz
66
66
 
67
- # Download Orchestrator (we'll use a binary release if available, or the Docker image)
67
+ # Download and install ProxySQL (install before copying our config)
68
68
  RUN ARCH=$(uname -m) && \
69
- if [ "$ARCH" = "x86_64" ]; then ARCH="amd64"; fi && \
70
- wget -q "https://github.com/openark/orchestrator/releases/download/v3.2.6/orchestrator-${ARCH}.tar.gz" -O /tmp/orchestrator.tar.gz || true && \
71
- if [ -f /tmp/orchestrator.tar.gz ]; then \
72
- tar -xzf /tmp/orchestrator.tar.gz -C /opt/orchestrator --strip-components=1 && \
73
- rm /tmp/orchestrator.tar.gz; \
74
- fi
69
+ if [ "$ARCH" = "x86_64" ]; then ARCH="amd64"; elif [ "$ARCH" = "aarch64" ]; then ARCH="arm64"; fi && \
70
+ wget -q "https://github.com/sysown/proxysql/releases/download/v${PROXYSQL_VERSION}/proxysql_${PROXYSQL_VERSION}-debian12_${ARCH}.deb" -O /tmp/proxysql.deb && \
71
+ apt-get update && \
72
+ DEBIAN_FRONTEND=noninteractive apt-get install -y -o Dpkg::Options::="--force-confnew" /tmp/proxysql.deb && \
73
+ rm /tmp/proxysql.deb && \
74
+ rm -rf /var/lib/apt/lists/*
75
75
 
76
76
  # Download Prometheus
77
77
  RUN ARCH=$(uname -m) && \
@@ -87,8 +87,17 @@ RUN ARCH=$(uname -m) && \
87
87
  tar -xzf /tmp/grafana.tar.gz -C /opt/grafana --strip-components=1 && \
88
88
  rm /tmp/grafana.tar.gz
89
89
 
90
- # ProxySQL will be installed from Alpine package or downloaded
91
- RUN apk add --no-cache proxysql || true
90
+ # Copy ClawSQL application
91
+ COPY --from=clawsql-builder /build/dist /opt/clawsql/dist
92
+ COPY --from=clawsql-builder /build/node_modules /opt/clawsql/node_modules
93
+ COPY --from=clawsql-builder /build/package.json /opt/clawsql/
94
+
95
+ # Copy configuration files (after installing packages to avoid conflicts)
96
+ COPY docker/orchestrator/orchestrator.conf.json /etc/orchestrator.conf.json
97
+ COPY docker/proxysql/proxysql.cnf /etc/proxysql.cnf
98
+ COPY docker/prometheus/prometheus.yml /etc/prometheus.yml
99
+ COPY docker/grafana/provisioning /opt/grafana/conf/provisioning
100
+ COPY docker/grafana/dashboards /opt/grafana/dashboards
92
101
 
93
102
  # Copy supervisord configuration
94
103
  COPY docker/supervisord.conf /etc/supervisord.conf
@@ -23,8 +23,8 @@
23
23
  "DiscoverByShowSlaveHosts": true,
24
24
  "PowerOffInstancesMeta": true,
25
25
  "InstanceBulkOperationsWaitTimeoutSeconds": 300,
26
- "HostnameResolveMethod": "default",
27
- "MySQLHostnameResolveMethod": "@@hostname",
26
+ "HostnameResolveMethod": "none",
27
+ "MySQLHostnameResolveMethod": "@@report_host",
28
28
  "SkipBinlogServerUnresolveCheck": true,
29
29
  "ExpiryHostnameResolvesMinutes": 60,
30
30
  "RejectHostnameResolvePattern": "",
@@ -3,102 +3,111 @@
3
3
  #
4
4
  # This file adds a demo MySQL cluster (primary + 2 replicas) for testing.
5
5
  # Users with existing MySQL instances do NOT need this file.
6
+ #
7
+ # NOTE: MySQL containers use host networking to simulate real multi-node deployments.
8
+ # Each instance is accessible on the host IP with different ports:
9
+ # - Primary: <host-ip>:3306
10
+ # - Replica 1: <host-ip>:3307
11
+ # - Replica 2: <host-ip>:3308
6
12
 
7
13
  services:
8
14
  # =============================================================================
9
15
  # MySQL Primary (Writer)
16
+ # Uses host networking - accessible on host port 3306
10
17
  # =============================================================================
11
18
  mysql-primary:
12
19
  image: docker.io/library/mysql:8.0
13
20
  container_name: mysql-primary
14
21
  hostname: mysql-primary
15
- ports:
16
- - "3306:3306"
22
+ network_mode: host
17
23
  environment:
18
24
  - MYSQL_ROOT_PASSWORD=rootpassword
19
25
  command: >
20
26
  --server-id=1
27
+ --port=3306
21
28
  --log-bin=mysql-bin
22
29
  --binlog-format=ROW
23
30
  --gtid-mode=ON
24
31
  --enforce-gtid-consistency=ON
25
32
  --log-slave-updates=ON
33
+ --report-host=${HOST_IP:-127.0.0.1}
34
+ --report-port=3306
26
35
  volumes:
27
36
  - mysql-primary-data:/var/lib/mysql
28
37
  - ./init/primary.sql:/docker-entrypoint-initdb.d/01-primary.sql
29
- networks:
30
- - clawsql-network
31
38
  restart: unless-stopped
32
39
  healthcheck:
33
- test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-prootpassword"]
40
+ test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "-P", "3306", "-uroot", "-prootpassword"]
34
41
  interval: 10s
35
42
  timeout: 5s
36
43
  retries: 5
37
44
 
38
45
  # =============================================================================
39
46
  # MySQL Replica 1 (Reader)
47
+ # Uses host networking - accessible on host port 3307
40
48
  # =============================================================================
41
49
  mysql-replica-1:
42
50
  image: docker.io/library/mysql:8.0
43
51
  container_name: mysql-replica-1
44
52
  hostname: mysql-replica-1
45
- ports:
46
- - "3307:3306"
53
+ network_mode: host
47
54
  environment:
48
55
  - MYSQL_ROOT_PASSWORD=rootpassword
49
56
  command: >
50
57
  --server-id=2
58
+ --port=3307
51
59
  --log-bin=mysql-bin
52
60
  --binlog-format=ROW
53
61
  --gtid-mode=ON
54
62
  --enforce-gtid-consistency=ON
55
63
  --log-slave-updates=ON
56
64
  --read-only=ON
65
+ --report-host=${HOST_IP:-127.0.0.1}
66
+ --report-port=3307
57
67
  volumes:
58
68
  - mysql-replica-1-data:/var/lib/mysql
59
- - ./init/replica.sql:/docker-entrypoint-initdb.d/01-replica.sql
69
+ - ./init/replica-host.sql:/docker-entrypoint-initdb.d/01-replica.sql
60
70
  depends_on:
61
71
  mysql-primary:
62
72
  condition: service_healthy
63
- networks:
64
- - clawsql-network
65
73
  restart: unless-stopped
66
74
  healthcheck:
67
- test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-prootpassword"]
75
+ test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "-P", "3307", "-uroot", "-prootpassword"]
68
76
  interval: 10s
69
77
  timeout: 5s
70
78
  retries: 5
71
79
 
72
80
  # =============================================================================
73
81
  # MySQL Replica 2 (Reader)
82
+ # Uses host networking - accessible on host port 3308
74
83
  # =============================================================================
75
84
  mysql-replica-2:
76
85
  image: docker.io/library/mysql:8.0
77
86
  container_name: mysql-replica-2
78
87
  hostname: mysql-replica-2
79
- ports:
80
- - "3308:3306"
88
+ network_mode: host
81
89
  environment:
82
90
  - MYSQL_ROOT_PASSWORD=rootpassword
83
91
  command: >
84
92
  --server-id=3
93
+ --port=3308
85
94
  --log-bin=mysql-bin
86
95
  --binlog-format=ROW
87
96
  --gtid-mode=ON
88
97
  --enforce-gtid-consistency=ON
89
98
  --log-slave-updates=ON
90
99
  --read-only=ON
100
+ --report-host=${HOST_IP:-127.0.0.1}
101
+ --report-port=3308
91
102
  volumes:
92
103
  - mysql-replica-2-data:/var/lib/mysql
93
- - ./init/replica.sql:/docker-entrypoint-initdb.d/01-replica.sql
104
+ - ./init/replica-host.sql:/docker-entrypoint-initdb.d/01-replica.sql
94
105
  depends_on:
95
106
  mysql-primary:
96
107
  condition: service_healthy
97
- networks:
98
- - clawsql-network
99
108
  restart: unless-stopped
100
109
  healthcheck:
101
- test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-prootpassword"]
110
+ test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "-P", "3308", "-uroot", "-prootpassword"]
102
111
  interval: 10s
103
112
  timeout: 5s
104
113
  retries: 5
@@ -52,6 +52,8 @@ services:
52
52
  condition: service_started
53
53
  proxysql:
54
54
  condition: service_started
55
+ metadata-mysql:
56
+ condition: service_healthy
55
57
  networks:
56
58
  - clawsql-network
57
59
  restart: unless-stopped
@@ -189,6 +191,7 @@ services:
189
191
  MYSQL_PASSWORD: ${METADATA_DB_PASSWORD:-clawsql_password}
190
192
  volumes:
191
193
  - metadata-mysql-data:/var/lib/mysql
194
+ - ./init/metadata.sql:/docker-entrypoint-initdb.d/01-metadata.sql
192
195
  networks:
193
196
  - clawsql-network
194
197
  restart: unless-stopped
@@ -0,0 +1,11 @@
1
+ -- Metadata MySQL initialization script
2
+ -- Recreate clawsql user with mysql_native_password for Orchestrator compatibility
3
+
4
+ -- Drop the user created by MYSQL_USER env var (which uses caching_sha2_password)
5
+ DROP USER IF EXISTS 'clawsql'@'%';
6
+
7
+ -- Recreate with mysql_native_password
8
+ CREATE USER 'clawsql'@'%' IDENTIFIED WITH mysql_native_password BY 'clawsql_password';
9
+ GRANT ALL PRIVILEGES ON *.* TO 'clawsql'@'%' WITH GRANT OPTION;
10
+
11
+ FLUSH PRIVILEGES;
package/init/primary.sql CHANGED
@@ -1,15 +1,5 @@
1
1
  -- Primary initialization script
2
- -- Create replication user with mysql_native_password for compatibility
3
- CREATE USER IF NOT EXISTS 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'repl_password';
4
- GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
5
-
6
- -- Create monitoring user
7
- CREATE USER IF NOT EXISTS 'monitor'@'%' IDENTIFIED WITH mysql_native_password BY 'monitorpassword';
8
- GRANT REPLICATION CLIENT, PROCESS ON *.* TO 'monitor'@'%';
9
- GRANT SELECT ON mysql.* TO 'monitor'@'%';
10
-
11
- -- Create Orchestrator user (needs SUPER for topology management)
12
- -- Uses mysql_native_password for compatibility with Orchestrator
2
+ -- Create universal admin user for ClawSQL (used by Orchestrator, monitoring, and management)
13
3
  CREATE USER IF NOT EXISTS 'clawsql'@'%' IDENTIFIED WITH mysql_native_password BY 'clawsql_password';
14
4
  GRANT ALL PRIVILEGES ON *.* TO 'clawsql'@'%' WITH GRANT OPTION;
15
5
 
@@ -20,4 +10,4 @@ CREATE DATABASE IF NOT EXISTS clawsql;
20
10
  CREATE USER IF NOT EXISTS 'app'@'%' IDENTIFIED WITH mysql_native_password BY 'apppassword';
21
11
  GRANT ALL PRIVILEGES ON clawsql.* TO 'app'@'%';
22
12
 
23
- FLUSH PRIVILEGES;
13
+ FLUSH PRIVILEGES;
@@ -0,0 +1,7 @@
1
+ -- Replica initialization script for host-networked demo
2
+ -- Create universal admin user for ClawSQL (used by Orchestrator, monitoring, and management)
3
+ CREATE USER IF NOT EXISTS 'clawsql'@'%' IDENTIFIED WITH mysql_native_password BY 'clawsql_password';
4
+ GRANT ALL PRIVILEGES ON *.* TO 'clawsql'@'%' WITH GRANT OPTION;
5
+
6
+ FLUSH PRIVILEGES;
7
+ -- Note: Replication is configured via ClawSQL CLI: /instances setup-replication
package/init/replica.sql CHANGED
@@ -1,4 +1,14 @@
1
1
  -- Replica initialization script
2
+ -- Create users for Orchestrator access
3
+ CREATE USER IF NOT EXISTS 'clawsql'@'%' IDENTIFIED WITH mysql_native_password BY 'clawsql_password';
4
+ GRANT ALL PRIVILEGES ON *.* TO 'clawsql'@'%' WITH GRANT OPTION;
5
+
6
+ -- Create monitoring user
7
+ CREATE USER IF NOT EXISTS 'monitor'@'%' IDENTIFIED WITH mysql_native_password BY 'monitorpassword';
8
+ GRANT REPLICATION CLIENT, PROCESS ON *.* TO 'monitor'@'%';
9
+
10
+ FLUSH PRIVILEGES;
11
+
2
12
  -- Configure replication to primary
3
13
  STOP SLAVE;
4
14
 
@@ -6,8 +16,8 @@ CHANGE REPLICATION SOURCE TO
6
16
  SOURCE_HOST='mysql-primary',
7
17
  SOURCE_PORT=3306,
8
18
  SOURCE_USER='repl',
9
- SOURCE_PASSWORD='replpassword',
19
+ SOURCE_PASSWORD='repl_password',
10
20
  SOURCE_AUTO_POSITION=1,
11
21
  GET_SOURCE_PUBLIC_KEY=1;
12
22
 
13
- START SLAVE;
23
+ START SLAVE;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "clawsql",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "description": "MySQL Cluster Automation and Operations Management System",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -1,5 +0,0 @@
1
- /**
2
- * Tests for ClawSQL configuration settings
3
- */
4
- export {};
5
- //# sourceMappingURL=settings.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"settings.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/config/settings.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -1,154 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"settings.test.js","sourceRoot":"","sources":["../../../src/__tests__/config/settings.test.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- /**
2
- * Tests for Orchestrator client
3
- */
4
- export {};
5
- //# sourceMappingURL=topology.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"topology.test.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/core/discovery/topology.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}