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.
- package/README.md +110 -260
- package/dist/api/schemas/index.d.ts +20 -20
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +12 -0
- package/dist/app.js.map +1 -1
- package/dist/bin/clawsql.js +0 -0
- package/dist/cli/commands/clusters.d.ts +1 -1
- package/dist/cli/commands/clusters.d.ts.map +1 -1
- package/dist/cli/commands/clusters.js +291 -56
- package/dist/cli/commands/clusters.js.map +1 -1
- package/dist/cli/commands/templates.d.ts +11 -0
- package/dist/cli/commands/templates.d.ts.map +1 -0
- package/dist/cli/commands/templates.js +206 -0
- package/dist/cli/commands/templates.js.map +1 -0
- package/dist/cli/formatter.d.ts +24 -0
- package/dist/cli/formatter.d.ts.map +1 -1
- package/dist/cli/formatter.js +22 -0
- package/dist/cli/formatter.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/raw-input.d.ts +9 -1
- package/dist/cli/raw-input.d.ts.map +1 -1
- package/dist/cli/raw-input.js +146 -10
- package/dist/cli/raw-input.js.map +1 -1
- package/dist/cli/repl.d.ts.map +1 -1
- package/dist/cli/repl.js +94 -29
- package/dist/cli/repl.js.map +1 -1
- package/dist/cli/ui/components.d.ts.map +1 -1
- package/dist/cli/ui/components.js +21 -5
- package/dist/cli/ui/components.js.map +1 -1
- package/dist/cli/utils/args.d.ts +25 -0
- package/dist/cli/utils/args.d.ts.map +1 -0
- package/dist/cli/utils/args.js +51 -0
- package/dist/cli/utils/args.js.map +1 -0
- package/dist/config/settings.d.ts +38 -6
- package/dist/config/settings.d.ts.map +1 -1
- package/dist/config/settings.js +8 -0
- package/dist/config/settings.js.map +1 -1
- package/dist/core/provisioning/cluster-provisioner.d.ts +99 -0
- package/dist/core/provisioning/cluster-provisioner.d.ts.map +1 -0
- package/dist/core/provisioning/cluster-provisioner.js +415 -0
- package/dist/core/provisioning/cluster-provisioner.js.map +1 -0
- package/dist/core/provisioning/index.d.ts +12 -0
- package/dist/core/provisioning/index.d.ts.map +1 -0
- package/dist/core/provisioning/index.js +21 -0
- package/dist/core/provisioning/index.js.map +1 -0
- package/dist/core/provisioning/predefined-templates.d.ts +43 -0
- package/dist/core/provisioning/predefined-templates.d.ts.map +1 -0
- package/dist/core/provisioning/predefined-templates.js +117 -0
- package/dist/core/provisioning/predefined-templates.js.map +1 -0
- package/dist/core/provisioning/template-manager.d.ts +113 -0
- package/dist/core/provisioning/template-manager.d.ts.map +1 -0
- package/dist/core/provisioning/template-manager.js +274 -0
- package/dist/core/provisioning/template-manager.js.map +1 -0
- package/dist/core/routing/proxysql-manager.d.ts +17 -0
- package/dist/core/routing/proxysql-manager.d.ts.map +1 -1
- package/dist/core/routing/proxysql-manager.js +77 -0
- package/dist/core/routing/proxysql-manager.js.map +1 -1
- package/dist/types/index.d.ts +52 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +45 -1
- package/dist/types/index.js.map +1 -1
- package/dist/utils/database.d.ts.map +1 -1
- package/dist/utils/database.js +40 -0
- package/dist/utils/database.js.map +1 -1
- package/docker/Dockerfile.allinone +1 -1
- package/docker/Dockerfile.node +1 -1
- 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":";AAAA;;;;;GAKG;;;AA4FH,4DAWC;AAKD,sDAEC;AAKD,oDAEC;AAKD,gEAEC;AA1HD,mDAAiG;AACjG,mCAAoC;AAepC;;;;;GAKG;AACU,QAAA,oBAAoB,GAAmC;IAClE;QACE,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,+CAA+C;QAC5D,YAAY,EAAE,CAAC;QACf,YAAY,EAAE,CAAC;QACf,eAAe,EAAE,0BAAe,CAAC,KAAK;QACtC,OAAO,EAAE,6CAA6C;KACvD;IACD;QACE,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,0DAA0D;QACvE,YAAY,EAAE,CAAC;QACf,YAAY,EAAE,CAAC;QACf,eAAe,EAAE,0BAAe,CAAC,KAAK;QACtC,QAAQ,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE;QACnC,OAAO,EAAE,6CAA6C;KACvD;IACD;QACE,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,yDAAyD;QACtE,YAAY,EAAE,CAAC;QACf,YAAY,EAAE,CAAC;QACf,eAAe,EAAE,0BAAe,CAAC,KAAK;QACtC,QAAQ,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,gBAAgB,EAAE,YAAY,EAAE;QACnE,OAAO,EAAE,qDAAqD;KAC/D;IACD;QACE,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,sEAAsE;QACnF,YAAY,EAAE,CAAC;QACf,YAAY,EAAE,CAAC;QACf,eAAe,EAAE,0BAAe,CAAC,SAAS;QAC1C,QAAQ,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,gBAAgB,EAAE,gBAAgB,EAAE;QACvE,OAAO,EAAE,yEAAyE;KACnF;IACD;QACE,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,mDAAmD;QAChE,YAAY,EAAE,CAAC;QACf,YAAY,EAAE,CAAC;QACf,eAAe,EAAE,0BAAe,CAAC,KAAK;QACtC,QAAQ,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,gBAAgB,EAAE,YAAY,EAAE;QACnE,OAAO,EAAE,8DAA8D;KACxE;IACD;QACE,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,wDAAwD;QACrE,YAAY,EAAE,CAAC;QACf,YAAY,EAAE,CAAC;QACf,eAAe,EAAE,0BAAe,CAAC,SAAS;QAC1C,QAAQ,EAAE,EAAE,iBAAiB,EAAE,CAAC,EAAE,gBAAgB,EAAE,gBAAgB,EAAE;QACtE,OAAO,EAAE,4EAA4E;KACtF;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,oEAAoE;QACjF,YAAY,EAAE,CAAC;QACf,YAAY,EAAE,CAAC;QACf,eAAe,EAAE,0BAAe,CAAC,KAAK;QACtC,QAAQ,EAAE,EAAE,iBAAiB,EAAE,GAAG,EAAE,gBAAgB,EAAE,YAAY,EAAE;QACpE,OAAO,EAAE,sEAAsE;KAChF;CACF,CAAC;AAEF;;GAEG;AACH,SAAgB,wBAAwB,CACtC,UAAwC;IAExC,OAAO,IAAA,iCAAsB,EAAC,IAAA,mBAAU,GAAE,EAAE;QAC1C,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,YAAY,EAAE,UAAU,CAAC,YAAY;QACrC,YAAY,EAAE,UAAU,CAAC,YAAY;QACrC,eAAe,EAAE,UAAU,CAAC,eAAe;QAC3C,QAAQ,EAAE,UAAU,CAAC,QAAQ;KAC9B,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAgB,qBAAqB,CAAC,IAAY;IAChD,OAAO,4BAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,SAAgB,oBAAoB,CAAC,IAAY;IAC/C,OAAO,4BAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,SAAgB,0BAA0B;IACxC,OAAO,4BAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACjD,CAAC"}
|