clawsql 0.2.4 → 0.2.7

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 (69) hide show
  1. package/README.md +110 -260
  2. package/dist/api/schemas/index.d.ts +20 -20
  3. package/dist/app.d.ts.map +1 -1
  4. package/dist/app.js +12 -0
  5. package/dist/app.js.map +1 -1
  6. package/dist/bin/clawsql.js +0 -0
  7. package/dist/cli/commands/clusters.d.ts +1 -1
  8. package/dist/cli/commands/clusters.d.ts.map +1 -1
  9. package/dist/cli/commands/clusters.js +291 -56
  10. package/dist/cli/commands/clusters.js.map +1 -1
  11. package/dist/cli/commands/templates.d.ts +11 -0
  12. package/dist/cli/commands/templates.d.ts.map +1 -0
  13. package/dist/cli/commands/templates.js +206 -0
  14. package/dist/cli/commands/templates.js.map +1 -0
  15. package/dist/cli/formatter.d.ts +24 -0
  16. package/dist/cli/formatter.d.ts.map +1 -1
  17. package/dist/cli/formatter.js +22 -0
  18. package/dist/cli/formatter.js.map +1 -1
  19. package/dist/cli/index.d.ts.map +1 -1
  20. package/dist/cli/index.js +2 -0
  21. package/dist/cli/index.js.map +1 -1
  22. package/dist/cli/raw-input.d.ts +9 -1
  23. package/dist/cli/raw-input.d.ts.map +1 -1
  24. package/dist/cli/raw-input.js +146 -10
  25. package/dist/cli/raw-input.js.map +1 -1
  26. package/dist/cli/repl.d.ts.map +1 -1
  27. package/dist/cli/repl.js +94 -29
  28. package/dist/cli/repl.js.map +1 -1
  29. package/dist/cli/ui/components.d.ts.map +1 -1
  30. package/dist/cli/ui/components.js +21 -5
  31. package/dist/cli/ui/components.js.map +1 -1
  32. package/dist/cli/utils/args.d.ts +25 -0
  33. package/dist/cli/utils/args.d.ts.map +1 -0
  34. package/dist/cli/utils/args.js +51 -0
  35. package/dist/cli/utils/args.js.map +1 -0
  36. package/dist/config/settings.d.ts +38 -6
  37. package/dist/config/settings.d.ts.map +1 -1
  38. package/dist/config/settings.js +8 -0
  39. package/dist/config/settings.js.map +1 -1
  40. package/dist/core/provisioning/cluster-provisioner.d.ts +99 -0
  41. package/dist/core/provisioning/cluster-provisioner.d.ts.map +1 -0
  42. package/dist/core/provisioning/cluster-provisioner.js +415 -0
  43. package/dist/core/provisioning/cluster-provisioner.js.map +1 -0
  44. package/dist/core/provisioning/index.d.ts +12 -0
  45. package/dist/core/provisioning/index.d.ts.map +1 -0
  46. package/dist/core/provisioning/index.js +21 -0
  47. package/dist/core/provisioning/index.js.map +1 -0
  48. package/dist/core/provisioning/predefined-templates.d.ts +43 -0
  49. package/dist/core/provisioning/predefined-templates.d.ts.map +1 -0
  50. package/dist/core/provisioning/predefined-templates.js +117 -0
  51. package/dist/core/provisioning/predefined-templates.js.map +1 -0
  52. package/dist/core/provisioning/template-manager.d.ts +113 -0
  53. package/dist/core/provisioning/template-manager.d.ts.map +1 -0
  54. package/dist/core/provisioning/template-manager.js +274 -0
  55. package/dist/core/provisioning/template-manager.js.map +1 -0
  56. package/dist/core/routing/proxysql-manager.d.ts +17 -0
  57. package/dist/core/routing/proxysql-manager.d.ts.map +1 -1
  58. package/dist/core/routing/proxysql-manager.js +77 -0
  59. package/dist/core/routing/proxysql-manager.js.map +1 -1
  60. package/dist/types/index.d.ts +52 -0
  61. package/dist/types/index.d.ts.map +1 -1
  62. package/dist/types/index.js +45 -1
  63. package/dist/types/index.js.map +1 -1
  64. package/dist/utils/database.d.ts.map +1 -1
  65. package/dist/utils/database.js +40 -0
  66. package/dist/utils/database.js.map +1 -1
  67. package/docker/Dockerfile.allinone +1 -1
  68. package/docker/Dockerfile.node +1 -1
  69. package/package.json +1 -1
@@ -0,0 +1,415 @@
1
+ "use strict";
2
+ /**
3
+ * ClawSQL - Cluster Provisioner
4
+ *
5
+ * Provisioning engine for template-based cluster setup.
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.ClusterProvisioner = void 0;
12
+ exports.getClusterProvisioner = getClusterProvisioner;
13
+ const promise_1 = __importDefault(require("mysql2/promise"));
14
+ const logger_js_1 = require("../../utils/logger.js");
15
+ const database_js_1 = require("../../utils/database.js");
16
+ const settings_js_1 = require("../../config/settings.js");
17
+ const topology_js_1 = require("../discovery/topology.js");
18
+ const proxysql_manager_js_1 = require("../routing/proxysql-manager.js");
19
+ const template_manager_js_1 = require("./template-manager.js");
20
+ const index_js_1 = require("../../types/index.js");
21
+ const logger = (0, logger_js_1.getLogger)('cluster-provisioner');
22
+ // Timeouts for orchestrator and replication operations
23
+ const ORCHESTRATOR_DISCOVERY_DELAY_MS = 1000; // Wait for primary discovery
24
+ const TOPOLOGY_SYNC_DELAY_MS = 2000; // Wait for topology discovery
25
+ const REPLICATION_VERIFY_DELAY_MS = 2000; // Wait for replication to start
26
+ /**
27
+ * Cluster Provisioner
28
+ *
29
+ * Handles template-based cluster provisioning including:
30
+ * - Port allocation
31
+ * - Hostgroup allocation
32
+ * - Instance registration
33
+ * - Replication setup
34
+ * - ProxySQL configuration
35
+ */
36
+ class ClusterProvisioner {
37
+ templateManager = (0, template_manager_js_1.getTemplateManager)();
38
+ db = (0, database_js_1.getDatabase)();
39
+ /**
40
+ * Provision a cluster from a template
41
+ */
42
+ async provision(templateName, clusterName, hosts) {
43
+ const settings = (0, settings_js_1.getSettings)();
44
+ logger.info({ templateName, clusterName, hostCount: hosts.length }, 'Starting cluster provisioning');
45
+ const template = await this.templateManager.get(templateName);
46
+ if (!template) {
47
+ return this.failResult(clusterName, `Template "${templateName}" not found`);
48
+ }
49
+ const validation = await this.templateManager.validateHosts(template, hosts);
50
+ if (!validation.valid) {
51
+ return this.failResult(clusterName, validation.error);
52
+ }
53
+ const clusterId = clusterName;
54
+ const metadata = (0, index_js_1.createClusterMetadata)(clusterId, {
55
+ provisionStatus: index_js_1.ProvisionStatus.PROVISIONING,
56
+ templateId: template.templateId,
57
+ });
58
+ await this.saveMetadata(metadata);
59
+ try {
60
+ const allocation = await this.allocateResources(clusterId);
61
+ metadata.assignedPort = allocation.port;
62
+ metadata.writerHostgroup = allocation.writerHostgroup;
63
+ metadata.readerHostgroup = allocation.readerHostgroup;
64
+ metadata.provisionStatus = index_js_1.ProvisionStatus.PROVISIONING;
65
+ await this.updateMetadata(metadata);
66
+ const primary = hosts[0];
67
+ const replicas = hosts.slice(1);
68
+ await this.registerInstances(primary, replicas);
69
+ await this.setupReplication(primary, replicas, settings.mysql);
70
+ await this.configureProxySQL(clusterId, primary, replicas, allocation, settings.mysql);
71
+ await this.saveProvisionedInstances(clusterId, primary, replicas);
72
+ metadata.provisionStatus = index_js_1.ProvisionStatus.READY;
73
+ await this.updateMetadata(metadata);
74
+ logger.info({ clusterId, port: allocation.port, hostgroups: allocation }, 'Cluster provisioned successfully');
75
+ return {
76
+ success: true,
77
+ clusterId,
78
+ clusterName,
79
+ assignedPort: allocation.port,
80
+ writerHostgroup: allocation.writerHostgroup,
81
+ readerHostgroup: allocation.readerHostgroup,
82
+ primary,
83
+ replicas,
84
+ };
85
+ }
86
+ catch (error) {
87
+ const message = error instanceof Error ? error.message : String(error);
88
+ logger.error({ error, clusterId }, 'Provisioning failed');
89
+ // Update metadata to failed
90
+ metadata.provisionStatus = index_js_1.ProvisionStatus.FAILED;
91
+ await this.updateMetadata(metadata);
92
+ return this.failResult(clusterName, message);
93
+ }
94
+ }
95
+ /**
96
+ * Allocate port and hostgroups for a new cluster
97
+ */
98
+ async allocateResources(clusterId) {
99
+ const settings = (0, settings_js_1.getSettings)();
100
+ // Get all existing allocations
101
+ const existingPorts = await this.db.query('SELECT assigned_port FROM cluster_metadata WHERE assigned_port IS NOT NULL');
102
+ const existingHostgroups = await this.db.query('SELECT writer_hostgroup FROM cluster_metadata WHERE writer_hostgroup IS NOT NULL');
103
+ // Find next available port
104
+ const usedPorts = new Set(existingPorts.map((r) => r.assigned_port));
105
+ let port = settings.proxysql.portRangeStart;
106
+ while (usedPorts.has(port) && port <= settings.proxysql.portRangeEnd) {
107
+ port++;
108
+ }
109
+ if (port > settings.proxysql.portRangeEnd) {
110
+ throw new Error('No available ports in configured range');
111
+ }
112
+ // Find next available hostgroup block (each cluster gets writer=N, reader=N+10)
113
+ const usedWriterHG = new Set(existingHostgroups.map((r) => r.writer_hostgroup));
114
+ let writerHG = settings.proxysql.hostgroupRangeStart;
115
+ while (usedWriterHG.has(writerHG) && writerHG <= settings.proxysql.hostgroupRangeEnd) {
116
+ writerHG += 10; // Increment by 10 for each block
117
+ }
118
+ if (writerHG > settings.proxysql.hostgroupRangeEnd) {
119
+ throw new Error('No available hostgroups in configured range');
120
+ }
121
+ const readerHG = writerHG + 10;
122
+ logger.info({ clusterId, port, writerHG, readerHG }, 'Resources allocated');
123
+ return { port, writerHostgroup: writerHG, readerHostgroup: readerHG };
124
+ }
125
+ /**
126
+ * Register instances with Orchestrator
127
+ */
128
+ async registerInstances(primary, replicas) {
129
+ const orchestrator = (0, topology_js_1.getOrchestratorClient)();
130
+ // Register primary
131
+ logger.info({ host: primary.host, port: primary.port }, 'Registering primary');
132
+ await orchestrator.discoverInstance(primary.host, primary.port);
133
+ // Wait for primary discovery
134
+ await new Promise((resolve) => setTimeout(resolve, ORCHESTRATOR_DISCOVERY_DELAY_MS));
135
+ // Register replicas
136
+ for (const replica of replicas) {
137
+ logger.info({ host: replica.host, port: replica.port }, 'Registering replica');
138
+ await orchestrator.discoverInstance(replica.host, replica.port);
139
+ }
140
+ // Wait for topology discovery
141
+ await new Promise((resolve) => setTimeout(resolve, TOPOLOGY_SYNC_DELAY_MS));
142
+ }
143
+ /**
144
+ * Setup replication between primary and replicas
145
+ */
146
+ async setupReplication(primary, replicas, mysqlCredentials) {
147
+ const replUser = mysqlCredentials.replicationUser || 'repl';
148
+ const replPassword = mysqlCredentials.replicationPassword || 'repl_password';
149
+ // Escape values for safe SQL interpolation
150
+ const escape = promise_1.default.escape;
151
+ const escapedReplUser = escape(replUser);
152
+ const escapedReplPassword = escape(replPassword);
153
+ const escapedPrimaryHost = escape(primary.host);
154
+ // Create replication user on primary
155
+ logger.info({ host: primary.host }, 'Creating replication user on primary');
156
+ const primaryConn = await promise_1.default.createConnection({
157
+ host: primary.host,
158
+ port: primary.port,
159
+ user: mysqlCredentials.adminUser,
160
+ password: mysqlCredentials.adminPassword,
161
+ connectTimeout: 10000,
162
+ });
163
+ try {
164
+ await primaryConn.execute(`CREATE USER IF NOT EXISTS ${escapedReplUser}@'%' IDENTIFIED WITH mysql_native_password BY ${escapedReplPassword}`);
165
+ await primaryConn.execute(`GRANT REPLICATION SLAVE ON *.* TO ${escapedReplUser}@'%'`);
166
+ }
167
+ finally {
168
+ await primaryConn.end();
169
+ }
170
+ // Configure each replica
171
+ for (const replica of replicas) {
172
+ logger.info({ replica: `${replica.host}:${replica.port}`, primary: `${primary.host}:${primary.port}` }, 'Setting up replication');
173
+ const replicaConn = await promise_1.default.createConnection({
174
+ host: replica.host,
175
+ port: replica.port,
176
+ user: mysqlCredentials.adminUser,
177
+ password: mysqlCredentials.adminPassword,
178
+ connectTimeout: 10000,
179
+ });
180
+ try {
181
+ // Stop slave if running
182
+ await replicaConn.execute('STOP SLAVE');
183
+ // Configure replication with GTID
184
+ await replicaConn.execute(`CHANGE MASTER TO
185
+ MASTER_HOST = ${escapedPrimaryHost},
186
+ MASTER_PORT = ${primary.port},
187
+ MASTER_USER = ${escapedReplUser},
188
+ MASTER_PASSWORD = ${escapedReplPassword},
189
+ MASTER_AUTO_POSITION = 1`);
190
+ // Start slave
191
+ await replicaConn.execute('START SLAVE');
192
+ // Verify replication started
193
+ await new Promise((resolve) => setTimeout(resolve, REPLICATION_VERIFY_DELAY_MS));
194
+ const [status] = await replicaConn.execute('SHOW SLAVE STATUS');
195
+ const slaveStatus = status[0];
196
+ if (slaveStatus) {
197
+ const ioRunning = slaveStatus.Slave_IO_Running === 'Yes';
198
+ const sqlRunning = slaveStatus.Slave_SQL_Running === 'Yes';
199
+ if (!ioRunning || !sqlRunning) {
200
+ const error = slaveStatus.Last_IO_Error || slaveStatus.Last_SQL_Error || 'Unknown replication error';
201
+ throw new Error(`Replication not running on ${replica.host}:${replica.port}: ${error}`);
202
+ }
203
+ }
204
+ }
205
+ finally {
206
+ await replicaConn.end();
207
+ }
208
+ }
209
+ logger.info('Replication setup completed');
210
+ }
211
+ /**
212
+ * Configure ProxySQL with cluster hostgroups and port
213
+ */
214
+ async configureProxySQL(clusterId, primary, replicas, allocation, mysqlCredentials) {
215
+ const proxysql = (0, proxysql_manager_js_1.getProxySQLManager)();
216
+ // Connect to ProxySQL
217
+ await proxysql.connect();
218
+ // Set monitor credentials
219
+ await proxysql.setMonitorCredentials(mysqlCredentials.adminUser, mysqlCredentials.adminPassword);
220
+ // Create replication hostgroups
221
+ await this.createReplicationHostgroups(proxysql, clusterId, allocation);
222
+ // Add servers to hostgroups
223
+ await this.addServersToProxySQL(proxysql, primary, replicas, allocation);
224
+ // Configure port listening using existing method
225
+ await proxysql.addListeningPort(allocation.port);
226
+ // Load and save configuration
227
+ await proxysql.loadConfigToRuntime();
228
+ await proxysql.saveConfigToDisk();
229
+ logger.info({ clusterId, port: allocation.port, hostgroups: allocation }, 'ProxySQL configured');
230
+ }
231
+ /**
232
+ * Create replication hostgroups in ProxySQL
233
+ */
234
+ async createReplicationHostgroups(proxysql, clusterId, allocation) {
235
+ // Delete existing hostgroup entry if any
236
+ await proxysql.executeRaw('DELETE FROM mysql_replication_hostgroups WHERE writer_hostgroup = ?', [allocation.writerHostgroup]);
237
+ // Insert new hostgroup
238
+ await proxysql.executeRaw(`INSERT INTO mysql_replication_hostgroups
239
+ (writer_hostgroup, reader_hostgroup, comment)
240
+ VALUES (?, ?, ?)`, [allocation.writerHostgroup, allocation.readerHostgroup, `Cluster: ${clusterId}`]);
241
+ // Mirror to metadata database
242
+ await this.db.execute(`INSERT INTO proxysql_hostgroups (writer_hostgroup, reader_hostgroup, cluster_id, comment)
243
+ VALUES (?, ?, ?, ?)
244
+ ON DUPLICATE KEY UPDATE reader_hostgroup = VALUES(reader_hostgroup), cluster_id = VALUES(cluster_id)`, [allocation.writerHostgroup, allocation.readerHostgroup, clusterId, `Cluster: ${clusterId}`]);
245
+ }
246
+ /**
247
+ * Add servers to ProxySQL hostgroups
248
+ */
249
+ async addServersToProxySQL(proxysql, primary, replicas, allocation) {
250
+ // Add primary to writer hostgroup
251
+ await proxysql.executeRaw(`INSERT INTO mysql_servers (hostgroup_id, hostname, port, weight, max_connections, comment)
252
+ VALUES (?, ?, ?, 1, 1000, ?)`, [allocation.writerHostgroup, primary.host, primary.port, `ClawSQL: ${primary.host}:${primary.port}`]);
253
+ // Add replicas to reader hostgroup
254
+ for (const replica of replicas) {
255
+ await proxysql.executeRaw(`INSERT INTO mysql_servers (hostgroup_id, hostname, port, weight, max_connections, comment)
256
+ VALUES (?, ?, ?, 1, 1000, ?)`, [allocation.readerHostgroup, replica.host, replica.port, `ClawSQL: ${replica.host}:${replica.port}`]);
257
+ }
258
+ // Mirror to metadata database
259
+ for (const server of [primary, ...replicas]) {
260
+ const hg = server === primary ? allocation.writerHostgroup : allocation.readerHostgroup;
261
+ await this.db.execute(`INSERT INTO proxysql_servers (hostgroup_id, hostname, port, status, weight, max_connections, comment)
262
+ VALUES (?, ?, ?, 'ONLINE', 1, 1000, ?)
263
+ ON DUPLICATE KEY UPDATE status = 'ONLINE', synced_at = NOW()`, [hg, server.host, server.port, `ClawSQL: ${server.host}:${server.port}`]);
264
+ }
265
+ }
266
+ /**
267
+ * Save cluster metadata
268
+ */
269
+ async saveMetadata(metadata) {
270
+ await this.db.execute(`INSERT INTO cluster_metadata
271
+ (cluster_id, template_id, assigned_port, writer_hostgroup, reader_hostgroup, provision_status)
272
+ VALUES (?, ?, ?, ?, ?, ?)`, [
273
+ metadata.clusterId,
274
+ metadata.templateId ?? null,
275
+ metadata.assignedPort ?? null,
276
+ metadata.writerHostgroup ?? null,
277
+ metadata.readerHostgroup ?? null,
278
+ metadata.provisionStatus,
279
+ ]);
280
+ }
281
+ /**
282
+ * Update cluster metadata
283
+ */
284
+ async updateMetadata(metadata) {
285
+ await this.db.execute(`UPDATE cluster_metadata
286
+ SET template_id = ?, assigned_port = ?, writer_hostgroup = ?, reader_hostgroup = ?, provision_status = ?
287
+ WHERE cluster_id = ?`, [
288
+ metadata.templateId ?? null,
289
+ metadata.assignedPort ?? null,
290
+ metadata.writerHostgroup ?? null,
291
+ metadata.readerHostgroup ?? null,
292
+ metadata.provisionStatus,
293
+ metadata.clusterId,
294
+ ]);
295
+ }
296
+ /**
297
+ * Save provisioned instances
298
+ */
299
+ async saveProvisionedInstances(clusterId, primary, replicas) {
300
+ // Save primary
301
+ await this.db.execute(`INSERT INTO provisioned_instances (cluster_id, host, port, role, sequence)
302
+ VALUES (?, ?, ?, 'primary', 0)`, [clusterId, primary.host, primary.port]);
303
+ // Save replicas
304
+ for (let i = 0; i < replicas.length; i++) {
305
+ await this.db.execute(`INSERT INTO provisioned_instances (cluster_id, host, port, role, sequence)
306
+ VALUES (?, ?, ?, 'replica', ?)`, [clusterId, replicas[i].host, replicas[i].port, i + 1]);
307
+ }
308
+ }
309
+ /**
310
+ * Create a failed result
311
+ */
312
+ failResult(clusterName, error) {
313
+ return {
314
+ success: false,
315
+ clusterId: clusterName,
316
+ clusterName,
317
+ assignedPort: 0,
318
+ writerHostgroup: 0,
319
+ readerHostgroup: 0,
320
+ primary: { host: '', port: 0 },
321
+ replicas: [],
322
+ error,
323
+ };
324
+ }
325
+ /**
326
+ * Get cluster metadata
327
+ */
328
+ async getClusterMetadata(clusterId) {
329
+ const row = await this.db.get('SELECT * FROM cluster_metadata WHERE cluster_id = ?', [clusterId]);
330
+ if (!row)
331
+ return null;
332
+ return (0, index_js_1.createClusterMetadata)(row.cluster_id, {
333
+ templateId: row.template_id ?? undefined,
334
+ assignedPort: row.assigned_port ?? undefined,
335
+ writerHostgroup: row.writer_hostgroup ?? undefined,
336
+ readerHostgroup: row.reader_hostgroup ?? undefined,
337
+ provisionStatus: row.provision_status,
338
+ createdAt: row.created_at,
339
+ updatedAt: row.updated_at,
340
+ });
341
+ }
342
+ /**
343
+ * List all provisioned clusters
344
+ */
345
+ async listClusters() {
346
+ const rows = await this.db.query('SELECT * FROM cluster_metadata ORDER BY created_at DESC');
347
+ return rows.map((row) => (0, index_js_1.createClusterMetadata)(row.cluster_id, {
348
+ templateId: row.template_id ?? undefined,
349
+ assignedPort: row.assigned_port ?? undefined,
350
+ writerHostgroup: row.writer_hostgroup ?? undefined,
351
+ readerHostgroup: row.reader_hostgroup ?? undefined,
352
+ provisionStatus: row.provision_status,
353
+ createdAt: row.created_at,
354
+ updatedAt: row.updated_at,
355
+ }));
356
+ }
357
+ /**
358
+ * Deprovision a cluster
359
+ */
360
+ async deprovision(clusterId) {
361
+ const metadata = await this.getClusterMetadata(clusterId);
362
+ if (!metadata) {
363
+ return { success: false, error: `Cluster "${clusterId}" not found` };
364
+ }
365
+ if (!metadata.writerHostgroup || !metadata.readerHostgroup) {
366
+ return { success: false, error: `Cluster "${clusterId}" has incomplete hostgroup configuration` };
367
+ }
368
+ try {
369
+ const proxysql = (0, proxysql_manager_js_1.getProxySQLManager)();
370
+ await proxysql.connect();
371
+ // Remove servers from ProxySQL
372
+ await proxysql.executeRaw('DELETE FROM mysql_servers WHERE hostgroup_id IN (?, ?)', [metadata.writerHostgroup, metadata.readerHostgroup]);
373
+ // Remove replication hostgroups
374
+ await proxysql.executeRaw('DELETE FROM mysql_replication_hostgroups WHERE writer_hostgroup = ?', [metadata.writerHostgroup]);
375
+ await proxysql.loadConfigToRuntime();
376
+ await proxysql.saveConfigToDisk();
377
+ // Forget instances from Orchestrator
378
+ const orchestrator = (0, topology_js_1.getOrchestratorClient)();
379
+ const instances = await this.db.query('SELECT host, port FROM provisioned_instances WHERE cluster_id = ?', [clusterId]);
380
+ for (const inst of instances) {
381
+ await orchestrator.forgetInstance(inst.host, inst.port);
382
+ }
383
+ // Delete from database
384
+ await this.db.execute('DELETE FROM provisioned_instances WHERE cluster_id = ?', [clusterId]);
385
+ await this.db.execute('DELETE FROM proxysql_servers WHERE hostgroup_id IN (?, ?)', [
386
+ metadata.writerHostgroup,
387
+ metadata.readerHostgroup,
388
+ ]);
389
+ await this.db.execute('DELETE FROM proxysql_hostgroups WHERE writer_hostgroup = ?', [
390
+ metadata.writerHostgroup,
391
+ ]);
392
+ await this.db.execute('DELETE FROM cluster_metadata WHERE cluster_id = ?', [clusterId]);
393
+ logger.info({ clusterId }, 'Cluster deprovisioned');
394
+ return { success: true };
395
+ }
396
+ catch (error) {
397
+ const message = error instanceof Error ? error.message : String(error);
398
+ logger.error({ error, clusterId }, 'Deprovision failed');
399
+ return { success: false, error: message };
400
+ }
401
+ }
402
+ }
403
+ exports.ClusterProvisioner = ClusterProvisioner;
404
+ // Singleton instance
405
+ let clusterProvisioner = null;
406
+ /**
407
+ * Get the cluster provisioner instance
408
+ */
409
+ function getClusterProvisioner() {
410
+ if (!clusterProvisioner) {
411
+ clusterProvisioner = new ClusterProvisioner();
412
+ }
413
+ return clusterProvisioner;
414
+ }
415
+ //# sourceMappingURL=cluster-provisioner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cluster-provisioner.js","sourceRoot":"","sources":["../../../src/core/provisioning/cluster-provisioner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * ClawSQL - Provisioning Module
3
+ *
4
+ * Template-based cluster provisioning.
5
+ */
6
+ export { TemplateManager, getTemplateManager } from './template-manager.js';
7
+ export type { TemplateCreateOptions, TemplateUpdateOptions, HostValidationResult, HostSpec } from './template-manager.js';
8
+ export { ClusterProvisioner, getClusterProvisioner } from './cluster-provisioner.js';
9
+ export type { ProvisionResult } from './cluster-provisioner.js';
10
+ export { PREDEFINED_TEMPLATES, createPredefinedTemplate, getPredefinedTemplate, isPredefinedTemplate, getPredefinedTemplateNames, } from './predefined-templates.js';
11
+ export type { PredefinedTemplateDefinition } from './predefined-templates.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/provisioning/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC5E,YAAY,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC1H,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACrF,YAAY,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,qBAAqB,EACrB,oBAAoB,EACpB,0BAA0B,GAC3B,MAAM,2BAA2B,CAAC;AACnC,YAAY,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ /**
3
+ * ClawSQL - Provisioning Module
4
+ *
5
+ * Template-based cluster provisioning.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.getPredefinedTemplateNames = exports.isPredefinedTemplate = exports.getPredefinedTemplate = exports.createPredefinedTemplate = exports.PREDEFINED_TEMPLATES = exports.getClusterProvisioner = exports.ClusterProvisioner = exports.getTemplateManager = exports.TemplateManager = void 0;
9
+ var template_manager_js_1 = require("./template-manager.js");
10
+ Object.defineProperty(exports, "TemplateManager", { enumerable: true, get: function () { return template_manager_js_1.TemplateManager; } });
11
+ Object.defineProperty(exports, "getTemplateManager", { enumerable: true, get: function () { return template_manager_js_1.getTemplateManager; } });
12
+ var cluster_provisioner_js_1 = require("./cluster-provisioner.js");
13
+ Object.defineProperty(exports, "ClusterProvisioner", { enumerable: true, get: function () { return cluster_provisioner_js_1.ClusterProvisioner; } });
14
+ Object.defineProperty(exports, "getClusterProvisioner", { enumerable: true, get: function () { return cluster_provisioner_js_1.getClusterProvisioner; } });
15
+ var predefined_templates_js_1 = require("./predefined-templates.js");
16
+ Object.defineProperty(exports, "PREDEFINED_TEMPLATES", { enumerable: true, get: function () { return predefined_templates_js_1.PREDEFINED_TEMPLATES; } });
17
+ Object.defineProperty(exports, "createPredefinedTemplate", { enumerable: true, get: function () { return predefined_templates_js_1.createPredefinedTemplate; } });
18
+ Object.defineProperty(exports, "getPredefinedTemplate", { enumerable: true, get: function () { return predefined_templates_js_1.getPredefinedTemplate; } });
19
+ Object.defineProperty(exports, "isPredefinedTemplate", { enumerable: true, get: function () { return predefined_templates_js_1.isPredefinedTemplate; } });
20
+ Object.defineProperty(exports, "getPredefinedTemplateNames", { enumerable: true, get: function () { return predefined_templates_js_1.getPredefinedTemplateNames; } });
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/provisioning/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,6DAA4E;AAAnE,sHAAA,eAAe,OAAA;AAAE,yHAAA,kBAAkB,OAAA;AAE5C,mEAAqF;AAA5E,4HAAA,kBAAkB,OAAA;AAAE,+HAAA,qBAAqB,OAAA;AAElD,qEAMmC;AALjC,+HAAA,oBAAoB,OAAA;AACpB,mIAAA,wBAAwB,OAAA;AACxB,gIAAA,qBAAqB,OAAA;AACrB,+HAAA,oBAAoB,OAAA;AACpB,qIAAA,0BAA0B,OAAA"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * ClawSQL - Predefined Templates
3
+ *
4
+ * Benchmarking templates for common MySQL cluster scenarios.
5
+ * These templates are automatically initialized on first start.
6
+ */
7
+ import { TopologyTemplate, ReplicationMode } from '../../types/index.js';
8
+ /**
9
+ * Predefined template definitions
10
+ */
11
+ export interface PredefinedTemplateDefinition {
12
+ name: string;
13
+ description: string;
14
+ primaryCount: number;
15
+ replicaCount: number;
16
+ replicationMode: ReplicationMode;
17
+ settings?: TopologyTemplate['settings'];
18
+ useCase: string;
19
+ }
20
+ /**
21
+ * Predefined benchmarking templates for MySQL clusters
22
+ *
23
+ * These templates cover common deployment scenarios from development
24
+ * to high-availability production setups.
25
+ */
26
+ export declare const PREDEFINED_TEMPLATES: PredefinedTemplateDefinition[];
27
+ /**
28
+ * Create a TopologyTemplate from a predefined definition
29
+ */
30
+ export declare function createPredefinedTemplate(definition: PredefinedTemplateDefinition): TopologyTemplate;
31
+ /**
32
+ * Get predefined template by name
33
+ */
34
+ export declare function getPredefinedTemplate(name: string): PredefinedTemplateDefinition | undefined;
35
+ /**
36
+ * Check if a template name is a predefined template
37
+ */
38
+ export declare function isPredefinedTemplate(name: string): boolean;
39
+ /**
40
+ * Get all predefined template names
41
+ */
42
+ export declare function getPredefinedTemplateNames(): string[];
43
+ //# sourceMappingURL=predefined-templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"predefined-templates.d.ts","sourceRoot":"","sources":["../../../src/core/provisioning/predefined-templates.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAA0B,MAAM,sBAAsB,CAAC;AAGjG;;GAEG;AACH,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,EAAE,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACxC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,EAAE,4BAA4B,EA+D9D,CAAC;AAEF;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,4BAA4B,GACvC,gBAAgB,CASlB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,4BAA4B,GAAG,SAAS,CAE5F;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,EAAE,CAErD"}
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ /**
3
+ * ClawSQL - Predefined Templates
4
+ *
5
+ * Benchmarking templates for common MySQL cluster scenarios.
6
+ * These templates are automatically initialized on first start.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.PREDEFINED_TEMPLATES = void 0;
10
+ exports.createPredefinedTemplate = createPredefinedTemplate;
11
+ exports.getPredefinedTemplate = getPredefinedTemplate;
12
+ exports.isPredefinedTemplate = isPredefinedTemplate;
13
+ exports.getPredefinedTemplateNames = getPredefinedTemplateNames;
14
+ const index_js_1 = require("../../types/index.js");
15
+ const crypto_1 = require("crypto");
16
+ /**
17
+ * Predefined benchmarking templates for MySQL clusters
18
+ *
19
+ * These templates cover common deployment scenarios from development
20
+ * to high-availability production setups.
21
+ */
22
+ exports.PREDEFINED_TEMPLATES = [
23
+ {
24
+ name: 'dev-single',
25
+ description: 'Single MySQL instance for development/testing',
26
+ primaryCount: 1,
27
+ replicaCount: 0,
28
+ replicationMode: index_js_1.ReplicationMode.ASYNC,
29
+ useCase: 'Local development, testing, CI/CD pipelines',
30
+ },
31
+ {
32
+ name: 'dev-replica',
33
+ description: 'Primary with one replica for development with redundancy',
34
+ primaryCount: 1,
35
+ replicaCount: 1,
36
+ replicationMode: index_js_1.ReplicationMode.ASYNC,
37
+ settings: { maxReplicationLag: 60 },
38
+ useCase: 'Development with backup, read scaling tests',
39
+ },
40
+ {
41
+ name: 'standard',
42
+ description: 'Standard production setup: 1 primary + 2 async replicas',
43
+ primaryCount: 1,
44
+ replicaCount: 2,
45
+ replicationMode: index_js_1.ReplicationMode.ASYNC,
46
+ settings: { maxReplicationLag: 30, failoverPriority: 'lowest-lag' },
47
+ useCase: 'General production workloads, moderate read scaling',
48
+ },
49
+ {
50
+ name: 'ha-semisync',
51
+ description: 'High availability with semi-sync replication: 1 primary + 2 replicas',
52
+ primaryCount: 1,
53
+ replicaCount: 2,
54
+ replicationMode: index_js_1.ReplicationMode.SEMI_SYNC,
55
+ settings: { maxReplicationLag: 10, failoverPriority: 'highest-binlog' },
56
+ useCase: 'Critical production, financial transactions, zero data loss requirement',
57
+ },
58
+ {
59
+ name: 'read-heavy',
60
+ description: 'Read-heavy workload: 1 primary + 4 async replicas',
61
+ primaryCount: 1,
62
+ replicaCount: 4,
63
+ replicationMode: index_js_1.ReplicationMode.ASYNC,
64
+ settings: { maxReplicationLag: 30, failoverPriority: 'lowest-lag' },
65
+ useCase: 'Analytics, reporting, content delivery, high read throughput',
66
+ },
67
+ {
68
+ name: 'production-ha',
69
+ description: 'Maximum availability: 1 primary + 3 semi-sync replicas',
70
+ primaryCount: 1,
71
+ replicaCount: 3,
72
+ replicationMode: index_js_1.ReplicationMode.SEMI_SYNC,
73
+ settings: { maxReplicationLag: 5, failoverPriority: 'highest-binlog' },
74
+ useCase: 'Mission-critical production, enterprise databases, compliance requirements',
75
+ },
76
+ {
77
+ name: 'geo-distributed',
78
+ description: 'Geo-distributed setup: 1 primary + 5 async replicas across regions',
79
+ primaryCount: 1,
80
+ replicaCount: 5,
81
+ replicationMode: index_js_1.ReplicationMode.ASYNC,
82
+ settings: { maxReplicationLag: 120, failoverPriority: 'lowest-lag' },
83
+ useCase: 'Multi-region deployment, disaster recovery, global read availability',
84
+ },
85
+ ];
86
+ /**
87
+ * Create a TopologyTemplate from a predefined definition
88
+ */
89
+ function createPredefinedTemplate(definition) {
90
+ return (0, index_js_1.createTopologyTemplate)((0, crypto_1.randomUUID)(), {
91
+ name: definition.name,
92
+ description: definition.description,
93
+ primaryCount: definition.primaryCount,
94
+ replicaCount: definition.replicaCount,
95
+ replicationMode: definition.replicationMode,
96
+ settings: definition.settings,
97
+ });
98
+ }
99
+ /**
100
+ * Get predefined template by name
101
+ */
102
+ function getPredefinedTemplate(name) {
103
+ return exports.PREDEFINED_TEMPLATES.find((t) => t.name === name);
104
+ }
105
+ /**
106
+ * Check if a template name is a predefined template
107
+ */
108
+ function isPredefinedTemplate(name) {
109
+ return exports.PREDEFINED_TEMPLATES.some((t) => t.name === name);
110
+ }
111
+ /**
112
+ * Get all predefined template names
113
+ */
114
+ function getPredefinedTemplateNames() {
115
+ return exports.PREDEFINED_TEMPLATES.map((t) => t.name);
116
+ }
117
+ //# sourceMappingURL=predefined-templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"predefined-templates.js","sourceRoot":"","sources":["../../../src/core/provisioning/predefined-templates.ts"],"names":[],"mappings":"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"}