@calltelemetry/ct-lab-mcp 0.8.96 → 0.8.97

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 (65) hide show
  1. package/README.md +28 -33
  2. package/dist/bin/ct-lab-mcp.js +3 -6
  3. package/dist/src/canonical/bridge.d.ts +5 -0
  4. package/dist/src/canonical/bridge.d.ts.map +1 -1
  5. package/dist/src/canonical/bridge.js +17 -14
  6. package/dist/src/canonical/bridge.js.map +1 -1
  7. package/dist/src/credentials/resolver.d.ts +2 -3
  8. package/dist/src/credentials/resolver.d.ts.map +1 -1
  9. package/dist/src/credentials/resolver.js +7 -121
  10. package/dist/src/credentials/resolver.js.map +1 -1
  11. package/dist/src/generated-version.d.ts +1 -1
  12. package/dist/src/generated-version.js +1 -1
  13. package/dist/src/hypervisors/esxi/retired.d.ts +7 -7
  14. package/dist/src/hypervisors/esxi/retired.d.ts.map +1 -1
  15. package/dist/src/hypervisors/esxi/retired.js +8 -8
  16. package/dist/src/hypervisors/esxi/retired.js.map +1 -1
  17. package/dist/src/hypervisors/index.d.ts +0 -2
  18. package/dist/src/hypervisors/index.d.ts.map +1 -1
  19. package/dist/src/hypervisors/index.js +0 -2
  20. package/dist/src/hypervisors/index.js.map +1 -1
  21. package/dist/src/hypervisors/manager.d.ts.map +1 -1
  22. package/dist/src/hypervisors/manager.js +14 -31
  23. package/dist/src/hypervisors/manager.js.map +1 -1
  24. package/dist/src/server.d.ts.map +1 -1
  25. package/dist/src/server.js +3 -7
  26. package/dist/src/server.js.map +1 -1
  27. package/dist/src/slot/manager.d.ts +2 -1
  28. package/dist/src/slot/manager.d.ts.map +1 -1
  29. package/dist/src/slot/manager.js +6 -19
  30. package/dist/src/slot/manager.js.map +1 -1
  31. package/dist/src/tools/claimed-import-qcow.d.ts +2 -2
  32. package/dist/src/tools/credential-status.d.ts +2 -2
  33. package/dist/src/tools/credential-status.d.ts.map +1 -1
  34. package/dist/src/tools/credential-status.js +3 -3
  35. package/dist/src/tools/credential-status.js.map +1 -1
  36. package/dist/src/tools/cube-provision.d.ts +2 -2
  37. package/dist/src/tools/find-slot.d.ts +2 -2
  38. package/dist/src/tools/import-qcow.d.ts +6 -6
  39. package/dist/src/tools/list-hosts.d.ts +1 -1
  40. package/dist/src/tools/list-hosts.d.ts.map +1 -1
  41. package/dist/src/tools/list-hosts.js +2 -10
  42. package/dist/src/tools/list-hosts.js.map +1 -1
  43. package/dist/src/tools/list-inventory.js +2 -2
  44. package/dist/src/tools/list-inventory.js.map +1 -1
  45. package/dist/src/tools/provision-tools.d.ts +8 -8
  46. package/dist/src/tools/quick-provision.d.ts +2 -2
  47. package/dist/src/tools/storage-tools.d.ts.map +1 -1
  48. package/dist/src/tools/storage-tools.js +2 -3
  49. package/dist/src/tools/storage-tools.js.map +1 -1
  50. package/dist/src/transports/sse.d.ts.map +1 -1
  51. package/dist/src/transports/sse.js +1 -1
  52. package/dist/src/transports/sse.js.map +1 -1
  53. package/dist/src/worker.d.ts +0 -2
  54. package/dist/src/worker.d.ts.map +1 -1
  55. package/dist/src/worker.js +0 -1
  56. package/dist/src/worker.js.map +1 -1
  57. package/package.json +2 -4
  58. package/dist/src/hypervisors/esxi/client.d.ts +0 -105
  59. package/dist/src/hypervisors/esxi/client.d.ts.map +0 -1
  60. package/dist/src/hypervisors/esxi/client.js +0 -607
  61. package/dist/src/hypervisors/esxi/client.js.map +0 -1
  62. package/dist/src/hypervisors/esxi/mock.d.ts +0 -46
  63. package/dist/src/hypervisors/esxi/mock.d.ts.map +0 -1
  64. package/dist/src/hypervisors/esxi/mock.js +0 -208
  65. package/dist/src/hypervisors/esxi/mock.js.map +0 -1
@@ -1,607 +0,0 @@
1
- /**
2
- * VMware ESXi Hypervisor Driver
3
- * Implements IHypervisorDriver for VMware ESXi standalone and vCenter managed hosts.
4
- * Supports govc CLI execution and VMware REST/SOAP API fallback.
5
- */
6
- import { defaultSafetyGuardrailEngine } from "../../guardrails/safety.js";
7
- import { inheritedCloneDiskGb, assertInheritedDisk } from "../clone-size.js";
8
- import { logger } from "../../utils/logger.js";
9
- import { execFile } from "node:child_process";
10
- import { promisify } from "node:util";
11
- const execFileAsync = promisify(execFile);
12
- function virtualDiskBytes(devices) {
13
- if (!Array.isArray(devices))
14
- return undefined;
15
- const capacities = devices.map((device) => device?.CapacityInBytes ?? device?.capacityInBytes
16
- ?? ((device?.CapacityInKB ?? device?.capacityInKB) !== undefined
17
- ? (device.CapacityInKB ?? device.capacityInKB) * 1024 : undefined)).filter((value) => value !== undefined);
18
- if (!capacities.length || capacities.some((value) => !Number.isFinite(value) || value <= 0))
19
- return undefined;
20
- const total = capacities.reduce((sum, value) => sum + value, 0);
21
- return Number.isFinite(total) ? total : undefined;
22
- }
23
- /**
24
- * Real govc execution client
25
- */
26
- export class GovcClient {
27
- hostConfig;
28
- constructor(hostConfig) {
29
- this.hostConfig = hostConfig;
30
- }
31
- getGovcEnv() {
32
- return {
33
- ...process.env,
34
- GOVC_URL: this.hostConfig.url,
35
- GOVC_USERNAME: this.hostConfig.username,
36
- GOVC_PASSWORD: this.hostConfig.password,
37
- GOVC_INSECURE: this.hostConfig.allowInsecureTls ? "1" : "0",
38
- GOVC_DATASTORE: this.hostConfig.datastore || "datastore1",
39
- GOVC_RESOURCE_POOL: this.hostConfig.resourcePool,
40
- GOVC_DATACENTER: this.hostConfig.datacenter,
41
- GOVC_NETWORK: this.hostConfig.network || "VM Network"
42
- };
43
- }
44
- async execGovc(args, timeoutMs = 15_000) {
45
- // This packaged legacy client has no original claimed canonical authority.
46
- // Only its implemented provider-management reads may resolve credentials.
47
- if (!["collect", "host.info", "datastore.info", "vm.info"].includes(args[0])) {
48
- throw new Error("CANONICAL_PHYSICAL_SLOT_AUTHORITY_REQUIRED: direct govc guest effects are unavailable");
49
- }
50
- try {
51
- const { stdout } = await execFileAsync("govc", args, {
52
- env: this.getGovcEnv(),
53
- timeout: timeoutMs
54
- });
55
- return stdout.trim();
56
- }
57
- catch (err) {
58
- const msg = err instanceof Error ? err.message : String(err);
59
- throw new Error(`govc command failed (govc ${args.join(" ")}): ${msg}`);
60
- }
61
- }
62
- async getHostSummary() {
63
- const asFiniteNumber = (value) => typeof value === "number" && Number.isFinite(value) ? value : undefined;
64
- const buildHostStats = (cpuCoresValue, memorySizeBytesValue, memoryUsedMbValue, cpuUsageMhzValue, source) => {
65
- const cpuCores = asFiniteNumber(cpuCoresValue);
66
- const memorySizeBytes = asFiniteNumber(memorySizeBytesValue);
67
- const memoryUsedMb = asFiniteNumber(memoryUsedMbValue);
68
- const cpuUsageMhz = asFiniteNumber(cpuUsageMhzValue);
69
- if (!cpuCores || cpuCores <= 0 || !memorySizeBytes || memorySizeBytes <= 0) {
70
- throw new Error(`${source} returned unusable hardware data`);
71
- }
72
- if (memoryUsedMb === undefined || memoryUsedMb < 0) {
73
- throw new Error(`${source} returned unusable memory usage data`);
74
- }
75
- return {
76
- cpuCores,
77
- memoryTotalMb: memorySizeBytes / (1024 * 1024),
78
- memoryUsedMb,
79
- ...(cpuUsageMhz !== undefined && cpuUsageMhz >= 0 ? { cpuUsageMhz } : {}),
80
- };
81
- };
82
- let hostStats;
83
- // Fast PropertyCollector query via `govc collect` (runs in ~2s vs ~60s for host.info -json)
84
- try {
85
- const stdout = await this.execGovc([
86
- "collect",
87
- "-json",
88
- "-type",
89
- "h",
90
- "/",
91
- "name",
92
- "summary.hardware",
93
- "summary.quickStats"
94
- ]);
95
- let parsed;
96
- try {
97
- parsed = JSON.parse(stdout);
98
- }
99
- catch {
100
- const match = stdout.match(/\{[\s\S]*"summary\.hardware"[\s\S]*\}/);
101
- if (match)
102
- parsed = JSON.parse(match[0]);
103
- }
104
- if (!parsed || !Array.isArray(parsed.changeSet)) {
105
- throw new Error("collect returned unusable host data");
106
- }
107
- const getVal = (prop) => parsed.changeSet.find((c) => c?.name === prop)?.val;
108
- const hw = getVal("summary.hardware");
109
- const qs = getVal("summary.quickStats");
110
- hostStats = buildHostStats(hw?.numCpuCores, hw?.memorySize, qs?.overallMemoryUsage, qs?.overallCpuUsage, "collect");
111
- }
112
- catch (collectError) {
113
- // Best-effort fallback to host.info -json with short 5s timeout
114
- try {
115
- const jsonStr = await this.execGovc(["host.info", "-json"], 5_000);
116
- const parsed = JSON.parse(jsonStr);
117
- const host = parsed.HostSystems?.[0]?.Summary ?? parsed.hostSystems?.[0]?.summary;
118
- hostStats = buildHostStats(host?.Hardware?.NumCpuCores ?? host?.hardware?.numCpuCores, host?.Hardware?.MemorySize ?? host?.hardware?.memorySize, host?.QuickStats?.OverallMemoryUsage ?? host?.quickStats?.overallMemoryUsage, host?.QuickStats?.OverallCpuUsage ?? host?.quickStats?.overallCpuUsage, "host.info");
119
- }
120
- catch (hostInfoError) {
121
- const collectMessage = collectError instanceof Error ? collectError.message : String(collectError);
122
- const hostInfoMessage = hostInfoError instanceof Error ? hostInfoError.message : String(hostInfoError);
123
- throw new Error(`ESXi host summary unavailable: collect failed (${collectMessage}); host.info failed (${hostInfoMessage})`);
124
- }
125
- }
126
- const datastoreName = this.hostConfig.datastore || "datastore1";
127
- const datastoreJson = await this.execGovc(["datastore.info", "-json", datastoreName]);
128
- let datastoreSummary;
129
- try {
130
- const parsedDatastore = JSON.parse(datastoreJson);
131
- datastoreSummary =
132
- parsedDatastore?.Datastores?.[0]?.Summary ??
133
- parsedDatastore?.datastores?.[0]?.summary ??
134
- parsedDatastore?.datastores?.[0]?.Summary ??
135
- parsedDatastore?.Datastores?.[0]?.summary;
136
- }
137
- catch (error) {
138
- const message = error instanceof Error ? error.message : String(error);
139
- throw new Error(`datastore.info returned invalid JSON: ${message}`);
140
- }
141
- const datastoreTotalBytes = asFiniteNumber(datastoreSummary?.Capacity ?? datastoreSummary?.capacity);
142
- const datastoreFreeBytes = asFiniteNumber(datastoreSummary?.FreeSpace ?? datastoreSummary?.freeSpace);
143
- if (!datastoreTotalBytes ||
144
- datastoreTotalBytes <= 0 ||
145
- datastoreFreeBytes === undefined ||
146
- datastoreFreeBytes < 0 ||
147
- datastoreFreeBytes > datastoreTotalBytes) {
148
- throw new Error("datastore.info returned unusable capacity data");
149
- }
150
- return {
151
- cpuCores: hostStats.cpuCores,
152
- cpuUsageMhz: hostStats.cpuUsageMhz,
153
- memoryTotalMb: hostStats.memoryTotalMb,
154
- memoryUsedMb: hostStats.memoryUsedMb,
155
- datastoreTotalGb: datastoreTotalBytes / (1024 ** 3),
156
- datastoreFreeGb: datastoreFreeBytes / (1024 ** 3)
157
- };
158
- }
159
- async listVms() {
160
- try {
161
- const mapVmInfo = (stdout) => {
162
- const parsed = JSON.parse(stdout);
163
- const vms = Array.isArray(parsed?.VirtualMachines)
164
- ? parsed.VirtualMachines
165
- : Array.isArray(parsed?.virtualMachines)
166
- ? parsed.virtualMachines
167
- : null;
168
- if (!vms) {
169
- throw new Error("vm.info returned unusable VM inventory");
170
- }
171
- return vms.map((v) => {
172
- const summary = v?.Summary || v?.summary || {};
173
- const config = v?.Config || v?.config || summary?.Config || summary?.config || {};
174
- const runtime = summary?.Runtime || summary?.runtime || {};
175
- const guest = summary?.Guest || summary?.guest || {};
176
- const name = config?.Name || config?.name;
177
- if (typeof name !== "string" || name.trim() === "") {
178
- throw new Error("vm.info returned a VM without a valid name");
179
- }
180
- const powerStateRaw = runtime?.PowerState || runtime?.powerState;
181
- const powerState = powerStateRaw === "poweredOn"
182
- ? "poweredOn"
183
- : powerStateRaw === "poweredOff"
184
- ? "poweredOff"
185
- : "unknown";
186
- return {
187
- name,
188
- path: config?.VmPathName || config?.vmPathName || name,
189
- powerState,
190
- memoryMb: config?.MemorySizeMB || config?.memorySizeMB || 0,
191
- diskBytes: virtualDiskBytes(config?.Hardware?.Device ?? config?.hardware?.device),
192
- cpuCores: config?.NumCpu || config?.numCpu || 0,
193
- ipAddress: guest?.IpAddress || guest?.ipAddress,
194
- isTemplate: Boolean(config?.Template || config?.template),
195
- annotation: config?.Annotation || config?.annotation
196
- };
197
- });
198
- };
199
- let collectError;
200
- try {
201
- const stdout = await this.execGovc([
202
- "collect",
203
- "-json",
204
- "-type",
205
- "m",
206
- "/",
207
- "name",
208
- "runtime.powerState",
209
- "summary.config",
210
- "summary.guest",
211
- "config.hardware.device"
212
- ]);
213
- if (stdout.includes('"VirtualMachines"')) {
214
- return mapVmInfo(stdout);
215
- }
216
- // Parse JSON objects from `govc collect -json`.
217
- const items = [];
218
- let depth = 0;
219
- let start = -1;
220
- for (let i = 0; i < stdout.length; i++) {
221
- if (stdout[i] === "{") {
222
- if (depth === 0)
223
- start = i;
224
- depth++;
225
- }
226
- else if (stdout[i] === "}") {
227
- depth--;
228
- if (depth < 0)
229
- throw new Error("collect returned malformed VM inventory");
230
- if (depth === 0 && start !== -1) {
231
- items.push(JSON.parse(stdout.slice(start, i + 1)));
232
- start = -1;
233
- }
234
- }
235
- }
236
- if (depth !== 0 || items.length === 0) {
237
- throw new Error("collect returned unusable VM inventory");
238
- }
239
- return items.map((item) => {
240
- if (!Array.isArray(item?.changeSet)) {
241
- throw new Error("collect returned unusable VM inventory");
242
- }
243
- const getVal = (prop) => item.changeSet.find((c) => c?.name === prop)?.val;
244
- const name = getVal("name");
245
- const summaryConfig = getVal("summary.config");
246
- if (typeof name !== "string" || name.trim() === "" || !summaryConfig) {
247
- throw new Error("collect returned unusable VM inventory");
248
- }
249
- const powerStateRaw = getVal("runtime.powerState");
250
- const summaryGuest = getVal("summary.guest") || {};
251
- const powerState = powerStateRaw === "poweredOn"
252
- ? "poweredOn"
253
- : powerStateRaw === "poweredOff"
254
- ? "poweredOff"
255
- : "unknown";
256
- return {
257
- name,
258
- path: summaryConfig.vmPathName || name,
259
- powerState,
260
- memoryMb: summaryConfig.memorySizeMB || 0,
261
- diskBytes: virtualDiskBytes(getVal("config.hardware.device")),
262
- cpuCores: summaryConfig.numCpu || 0,
263
- ipAddress: summaryGuest.ipAddress,
264
- isTemplate: Boolean(summaryConfig.template),
265
- annotation: summaryConfig.annotation
266
- };
267
- });
268
- }
269
- catch (error) {
270
- collectError = error;
271
- }
272
- try {
273
- return mapVmInfo(await this.execGovc(["vm.info", "-json", "*"]));
274
- }
275
- catch (vmInfoError) {
276
- const collectMessage = collectError instanceof Error ? collectError.message : String(collectError);
277
- const vmInfoMessage = vmInfoError instanceof Error ? vmInfoError.message : String(vmInfoError);
278
- throw new Error(`VM inventory unavailable: collect failed (${collectMessage}); vm.info failed (${vmInfoMessage})`);
279
- }
280
- }
281
- catch (err) {
282
- const msg = err instanceof Error ? err.message : String(err);
283
- logger.warn(`govc vm query failed on ${this.hostConfig.id}: ${msg}`);
284
- throw err;
285
- }
286
- }
287
- async getVm(vmName) {
288
- const vms = await this.listVms();
289
- const query = vmName.toLowerCase().trim();
290
- return vms.find((v) => v.name.toLowerCase() === query) || null;
291
- }
292
- async cloneVm(sourceVmName, targetVmName, options = {}) {
293
- const args = ["vm.clone", "-vm", sourceVmName, "-on=false"];
294
- if (options.memoryMb !== undefined) {
295
- if (!Number.isSafeInteger(options.memoryMb) || options.memoryMb <= 0)
296
- throw new Error("Guest RAM must be positive integral MiB.");
297
- args.push("-m", String(options.memoryMb));
298
- }
299
- if (options.cpuCores !== undefined) {
300
- if (!Number.isSafeInteger(options.cpuCores) || options.cpuCores <= 0)
301
- throw new Error("Guest vCPUs must be a positive integer.");
302
- args.push("-c", String(options.cpuCores));
303
- }
304
- if (options.datastore || this.hostConfig.datastore) {
305
- args.push("-ds", options.datastore || this.hostConfig.datastore || "datastore1");
306
- }
307
- if (options.network || this.hostConfig.network) {
308
- args.push("-net", options.network || this.hostConfig.network || "VM Network");
309
- }
310
- args.push(targetVmName);
311
- await this.execGovc(args);
312
- return { success: true, vmName: targetVmName };
313
- }
314
- async startVm(vmName) {
315
- await this.execGovc(["vm.power", "-on", vmName]);
316
- }
317
- async stopVm(vmName, force = false) {
318
- const flag = force ? "-off" : "-s";
319
- await this.execGovc(["vm.power", flag, vmName]);
320
- }
321
- async rebootVm(vmName) {
322
- await this.execGovc(["vm.power", "-reset", vmName]);
323
- }
324
- async destroyVm(vmName) {
325
- await this.execGovc(["vm.destroy", vmName]);
326
- }
327
- }
328
- /**
329
- * VMware ESXi Hypervisor Driver implementing polymorphic IHypervisorDriver
330
- */
331
- export class EsxiDriver {
332
- hostName;
333
- hypervisorType = "esxi";
334
- hostConfig;
335
- isMock;
336
- client;
337
- safetyEngine;
338
- constructor(hostConfig, client, safetyEngine = defaultSafetyGuardrailEngine) {
339
- this.hostConfig = hostConfig;
340
- this.hostName = hostConfig.id;
341
- this.isMock = hostConfig.isMock === true;
342
- this.client = client || new GovcClient(hostConfig);
343
- this.safetyEngine = safetyEngine;
344
- }
345
- get rawClient() {
346
- return this.client;
347
- }
348
- async getHostCapacity() {
349
- try {
350
- const [summary, vms] = await Promise.all([
351
- this.client.getHostSummary(),
352
- this.client.listVms()
353
- ]);
354
- const runningVms = vms.filter((v) => v.powerState === "poweredOn").length;
355
- const totalVms = vms.length;
356
- const slotSizeBytes = 8192 * 1024 * 1024;
357
- const memoryTotalBytes = summary.memoryTotalMb * 1024 * 1024;
358
- const memoryUsedBytes = summary.memoryUsedMb * 1024 * 1024;
359
- const memoryFreeBytes = Math.max(0, memoryTotalBytes - memoryUsedBytes);
360
- const pureCapacitySlots = Math.max(0, Math.floor(memoryTotalBytes / slotSizeBytes));
361
- const availableSlotsByRam = Math.max(0, Math.floor(memoryFreeBytes / slotSizeBytes));
362
- // In mock test fixtures, preserve 0 for legacy mock assertions.
363
- // In live production, report true pure hardware capacity and claims!
364
- const maxSlots = this.isMock ? 0 : pureCapacitySlots;
365
- const availableSlots = this.isMock ? 0 : availableSlotsByRam;
366
- const usedSlots = this.isMock ? 0 : Math.max(0, pureCapacitySlots - availableSlotsByRam);
367
- const storageTotalBytes = summary.datastoreTotalGb * 1024 * 1024 * 1024;
368
- const storageFreeBytes = summary.datastoreFreeGb * 1024 * 1024 * 1024;
369
- const cpuUsedPercent = summary.cpuUsageMhz && summary.cpuCores
370
- ? Math.min(100, Math.round((summary.cpuUsageMhz / (summary.cpuCores * 2000)) * 100))
371
- : Math.round((runningVms / Math.max(1, summary.cpuCores)) * 100);
372
- return {
373
- name: this.hostName,
374
- type: "esxi",
375
- status: "online",
376
- cpuTotalCores: summary.cpuCores,
377
- cpuUsedPercent: Math.round((runningVms / Math.max(1, summary.cpuCores)) * 100),
378
- memoryTotalBytes,
379
- memoryUsedBytes,
380
- memoryFreeBytes,
381
- storageTotalBytes,
382
- storageFreeBytes,
383
- slotCapacity: {
384
- maxSlots,
385
- usedSlots,
386
- availableSlots,
387
- slotSizeBytes: 8192 * 1024 * 1024
388
- },
389
- endpoint: this.hostConfig.url,
390
- runningVms,
391
- totalVms,
392
- mock: this.isMock
393
- };
394
- }
395
- catch (err) {
396
- const msg = err instanceof Error ? err.message : String(err);
397
- logger.error(`Failed to get ESXi host capacity for ${this.hostName}: ${msg}`);
398
- return {
399
- name: this.hostName,
400
- type: "esxi",
401
- status: "offline",
402
- cpuTotalCores: 0,
403
- cpuUsedPercent: 0,
404
- memoryTotalBytes: 0,
405
- memoryUsedBytes: 0,
406
- memoryFreeBytes: 0,
407
- storageTotalBytes: 0,
408
- storageFreeBytes: 0,
409
- slotCapacity: {
410
- maxSlots: 0,
411
- usedSlots: 0,
412
- availableSlots: 0,
413
- slotSizeBytes: 8192 * 1024 * 1024
414
- },
415
- endpoint: this.hostConfig.url,
416
- mock: this.isMock
417
- };
418
- }
419
- }
420
- async listVms() {
421
- const rawVms = await this.client.listVms();
422
- return rawVms.map((raw) => this.mapToUnifiedVm(raw));
423
- }
424
- async getVm(vmIdOrName) {
425
- const vms = await this.listVms();
426
- const query = String(vmIdOrName).toLowerCase().trim();
427
- const found = vms.find((v) => v.id.toLowerCase() === query || v.name.toLowerCase() === query);
428
- return found || null;
429
- }
430
- async cloneVm(params) {
431
- const startTime = Date.now();
432
- const vms = await this.listVms();
433
- const sourceQuery = String(params.sourceVmIdOrName).toLowerCase().trim();
434
- const sourceVm = vms.find((v) => v.id.toLowerCase() === sourceQuery || v.name.toLowerCase() === sourceQuery);
435
- if (!sourceVm) {
436
- throw new Error(`Source VM/template '${params.sourceVmIdOrName}' not found on ESXi host '${this.hostName}'.`);
437
- }
438
- const targetVmName = params.newVmName;
439
- assertInheritedDisk(await inheritedCloneDiskGb(this, sourceVm), params.diskGb);
440
- const cloneRes = await this.client.cloneVm(sourceVm.name, targetVmName, {
441
- memoryMb: params.memoryBytes ? Math.round(params.memoryBytes / (1024 * 1024)) : undefined,
442
- cpuCores: params.cpuCores,
443
- datastore: params.storage || this.hostConfig.datastore,
444
- network: params.networkBridge || this.hostConfig.network
445
- });
446
- if (!cloneRes.success) {
447
- throw new Error(`ESXi clone failed for '${targetVmName}'.`);
448
- }
449
- // Start on deploy (default: true)
450
- let status = "stopped";
451
- if (params.startOnDeploy !== false) {
452
- await this.client.startVm(targetVmName);
453
- status = "running";
454
- }
455
- const assignedIp = params.ipAddress ||
456
- `192.168.124.${100 + Math.floor(Math.random() * 100)}`;
457
- return {
458
- vmId: targetVmName,
459
- name: targetVmName,
460
- hostName: this.hostName,
461
- hypervisor: "esxi",
462
- status,
463
- ipAddresses: [assignedIp],
464
- vlan: params.vlan,
465
- linearIssue: params.linearIssue,
466
- slotClaimId: params.slotClaimId,
467
- taskRef: cloneRes.taskRef || `esxi-task-clone-${Date.now()}`,
468
- createdAt: new Date().toISOString(),
469
- mock: this.isMock,
470
- transportEvidence: {
471
- endpoint: this.hostConfig.url,
472
- elapsedMs: Date.now() - startTime,
473
- real: !this.isMock
474
- }
475
- };
476
- }
477
- async startVm(vmIdOrName) {
478
- const vm = await this.getVm(vmIdOrName);
479
- if (!vm) {
480
- throw new Error(`VM '${vmIdOrName}' not found on ESXi host '${this.hostName}'.`);
481
- }
482
- await this.client.startVm(vm.name);
483
- }
484
- async stopVm(vmIdOrName, force = false) {
485
- const vm = await this.getVm(vmIdOrName);
486
- if (!vm) {
487
- throw new Error(`VM '${vmIdOrName}' not found on ESXi host '${this.hostName}'.`);
488
- }
489
- this.validateSafety(vm, force ? "stop" : "shutdown", force);
490
- await this.client.stopVm(vm.name, force);
491
- }
492
- async rebootVm(vmIdOrName) {
493
- const vm = await this.getVm(vmIdOrName);
494
- if (!vm) {
495
- throw new Error(`VM '${vmIdOrName}' not found on ESXi host '${this.hostName}'.`);
496
- }
497
- this.validateSafety(vm, "reboot");
498
- await this.client.rebootVm(vm.name);
499
- }
500
- async destroyVm(vmIdOrName) {
501
- const vm = await this.getVm(vmIdOrName);
502
- if (!vm) {
503
- throw new Error(`VM '${vmIdOrName}' not found on ESXi host '${this.hostName}'.`);
504
- }
505
- this.validateSafety(vm, "destroy");
506
- await this.client.destroyVm(vm.name);
507
- }
508
- isProtectedVmName(vmName) {
509
- const lower = vmName.toLowerCase();
510
- const protectedList = this.hostConfig.protectedVmNames || [
511
- "cucm-15",
512
- "cucm-pub",
513
- "cucm-sub",
514
- "cube-cat8000v",
515
- "runner-doks",
516
- "k8s-master",
517
- "esxi-template-base",
518
- "lab-k8s",
519
- "gh-runner"
520
- ];
521
- if (protectedList.some((p) => lower.includes(p.toLowerCase()))) {
522
- return true;
523
- }
524
- // Pattern check
525
- if (/(cucm|cube|cat8000v|runner|k8s|gh-runner|infra|golden|template)/i.test(vmName)) {
526
- return true;
527
- }
528
- return false;
529
- }
530
- validateSafety(vm, action, force = false) {
531
- const isProtected = vm.isProtected || this.isProtectedVmName(vm.name);
532
- if (isProtected) {
533
- this.safetyEngine.validateAction({
534
- vmid: 0,
535
- name: vm.name,
536
- template: vm.isTemplate,
537
- tags: vm.tags,
538
- notes: vm.protectionReason
539
- }, action, force);
540
- }
541
- }
542
- mapToUnifiedVm(raw) {
543
- const isProtectedName = this.isProtectedVmName(raw.name);
544
- const protection = this.safetyEngine.isProtected({
545
- vmid: 0,
546
- name: raw.name,
547
- template: raw.isTemplate,
548
- tags: raw.tags || []
549
- });
550
- const isProtected = isProtectedName || protection.protected || raw.isTemplate;
551
- const protectionReason = isProtected
552
- ? isProtectedName
553
- ? `Protected ESXi infrastructure asset (${raw.name})`
554
- : protection.reason || "Core ESXi protected fixture"
555
- : undefined;
556
- let status = "unknown";
557
- if (raw.powerState === "poweredOn")
558
- status = "running";
559
- else if (raw.powerState === "poweredOff")
560
- status = "stopped";
561
- else if (raw.powerState === "suspended")
562
- status = "paused";
563
- const tags = raw.tags ? [...raw.tags] : [];
564
- if (isProtected && !tags.includes("protected"))
565
- tags.push("protected");
566
- if (raw.isTemplate && !tags.includes("template"))
567
- tags.push("template");
568
- if (/cucm/i.test(raw.name) && !tags.includes("cucm"))
569
- tags.push("cucm");
570
- if (/cube/i.test(raw.name) && !tags.includes("cube"))
571
- tags.push("cube");
572
- // Extract linear issue if present in annotation or name
573
- let linearIssue;
574
- const linearMatch = (raw.annotation || raw.name).match(/(CTUAT-\d+|CT-\d+)/i);
575
- if (linearMatch) {
576
- linearIssue = linearMatch[1].toUpperCase();
577
- }
578
- // Extract release version
579
- let releaseVersion;
580
- const verMatch = (raw.annotation || raw.name).match(/(\d+\.\d+\.\d+(?:-[a-zA-Z0-9.]+)?)/);
581
- if (verMatch) {
582
- releaseVersion = verMatch[1];
583
- }
584
- const ipAddresses = [];
585
- if (raw.ipAddress) {
586
- ipAddresses.push(raw.ipAddress);
587
- }
588
- return {
589
- id: raw.name,
590
- name: raw.name,
591
- hypervisor: "esxi",
592
- hostName: this.hostName,
593
- status,
594
- cpuCores: raw.cpuCores,
595
- memoryBytes: raw.memoryMb * 1024 * 1024,
596
- diskBytes: raw.diskBytes,
597
- ipAddresses,
598
- isTemplate: raw.isTemplate,
599
- isProtected,
600
- protectionReason,
601
- linearIssue,
602
- releaseVersion,
603
- tags
604
- };
605
- }
606
- }
607
- //# sourceMappingURL=client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../src/hypervisors/esxi/client.ts"],"names":[],"mappings":"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"}