@namzu/sandbox 2.0.1 → 2.0.3

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 (75) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/dist/index.js +1 -1
  3. package/dist/index.js.map +1 -1
  4. package/package.json +12 -2
  5. package/src/index.ts +1 -1
  6. package/dist/backends/aci-standby-pool/__tests__/unenforceable-controls.test.d.ts +0 -2
  7. package/dist/backends/aci-standby-pool/__tests__/unenforceable-controls.test.d.ts.map +0 -1
  8. package/dist/backends/aci-standby-pool/__tests__/unenforceable-controls.test.js +0 -61
  9. package/dist/backends/aci-standby-pool/__tests__/unenforceable-controls.test.js.map +0 -1
  10. package/dist/backends/docker/__tests__/hardening.test.d.ts +0 -2
  11. package/dist/backends/docker/__tests__/hardening.test.d.ts.map +0 -1
  12. package/dist/backends/docker/__tests__/hardening.test.js +0 -32
  13. package/dist/backends/docker/__tests__/hardening.test.js.map +0 -1
  14. package/dist/backends/docker/__tests__/leaf-permissions.smoke.test.d.ts +0 -40
  15. package/dist/backends/docker/__tests__/leaf-permissions.smoke.test.d.ts.map +0 -1
  16. package/dist/backends/docker/__tests__/leaf-permissions.smoke.test.js +0 -157
  17. package/dist/backends/docker/__tests__/leaf-permissions.smoke.test.js.map +0 -1
  18. package/dist/backends/firecracker/__tests__/agent-timeout-clamp.test.d.ts +0 -16
  19. package/dist/backends/firecracker/__tests__/agent-timeout-clamp.test.d.ts.map +0 -1
  20. package/dist/backends/firecracker/__tests__/agent-timeout-clamp.test.js +0 -37
  21. package/dist/backends/firecracker/__tests__/agent-timeout-clamp.test.js.map +0 -1
  22. package/dist/backends/firecracker/__tests__/backend.test.d.ts +0 -13
  23. package/dist/backends/firecracker/__tests__/backend.test.d.ts.map +0 -1
  24. package/dist/backends/firecracker/__tests__/backend.test.js +0 -361
  25. package/dist/backends/firecracker/__tests__/backend.test.js.map +0 -1
  26. package/dist/backends/firecracker/__tests__/control-plane-mtls.test.d.ts +0 -19
  27. package/dist/backends/firecracker/__tests__/control-plane-mtls.test.d.ts.map +0 -1
  28. package/dist/backends/firecracker/__tests__/control-plane-mtls.test.js +0 -209
  29. package/dist/backends/firecracker/__tests__/control-plane-mtls.test.js.map +0 -1
  30. package/dist/backends/firecracker/__tests__/egress-policy.test.d.ts +0 -2
  31. package/dist/backends/firecracker/__tests__/egress-policy.test.d.ts.map +0 -1
  32. package/dist/backends/firecracker/__tests__/egress-policy.test.js +0 -67
  33. package/dist/backends/firecracker/__tests__/egress-policy.test.js.map +0 -1
  34. package/dist/backends/firecracker/__tests__/fixtures/ipc-path.d.ts +0 -21
  35. package/dist/backends/firecracker/__tests__/fixtures/ipc-path.d.ts.map +0 -1
  36. package/dist/backends/firecracker/__tests__/fixtures/ipc-path.js +0 -30
  37. package/dist/backends/firecracker/__tests__/fixtures/ipc-path.js.map +0 -1
  38. package/dist/backends/firecracker/__tests__/fixtures/mtls-pki.d.ts +0 -39
  39. package/dist/backends/firecracker/__tests__/fixtures/mtls-pki.d.ts.map +0 -1
  40. package/dist/backends/firecracker/__tests__/fixtures/mtls-pki.js +0 -149
  41. package/dist/backends/firecracker/__tests__/fixtures/mtls-pki.js.map +0 -1
  42. package/dist/backends/firecracker/__tests__/protocol.test.d.ts +0 -6
  43. package/dist/backends/firecracker/__tests__/protocol.test.d.ts.map +0 -1
  44. package/dist/backends/firecracker/__tests__/protocol.test.js +0 -67
  45. package/dist/backends/firecracker/__tests__/protocol.test.js.map +0 -1
  46. package/dist/backends/firecracker/__tests__/transport.test.d.ts +0 -20
  47. package/dist/backends/firecracker/__tests__/transport.test.d.ts.map +0 -1
  48. package/dist/backends/firecracker/__tests__/transport.test.js +0 -457
  49. package/dist/backends/firecracker/__tests__/transport.test.js.map +0 -1
  50. package/dist/egress/__tests__/allowlist.test.d.ts +0 -2
  51. package/dist/egress/__tests__/allowlist.test.d.ts.map +0 -1
  52. package/dist/egress/__tests__/allowlist.test.js +0 -85
  53. package/dist/egress/__tests__/allowlist.test.js.map +0 -1
  54. package/dist/egress/__tests__/proxy.test.d.ts +0 -2
  55. package/dist/egress/__tests__/proxy.test.d.ts.map +0 -1
  56. package/dist/egress/__tests__/proxy.test.js +0 -177
  57. package/dist/egress/__tests__/proxy.test.js.map +0 -1
  58. package/dist/index.test.d.ts +0 -28
  59. package/dist/index.test.d.ts.map +0 -1
  60. package/dist/index.test.js +0 -649
  61. package/dist/index.test.js.map +0 -1
  62. package/src/backends/aci-standby-pool/__tests__/unenforceable-controls.test.ts +0 -69
  63. package/src/backends/docker/__tests__/hardening.test.ts +0 -43
  64. package/src/backends/docker/__tests__/leaf-permissions.smoke.test.ts +0 -169
  65. package/src/backends/firecracker/__tests__/agent-timeout-clamp.test.ts +0 -48
  66. package/src/backends/firecracker/__tests__/backend.test.ts +0 -429
  67. package/src/backends/firecracker/__tests__/control-plane-mtls.test.ts +0 -261
  68. package/src/backends/firecracker/__tests__/egress-policy.test.ts +0 -91
  69. package/src/backends/firecracker/__tests__/fixtures/ipc-path.ts +0 -31
  70. package/src/backends/firecracker/__tests__/fixtures/mtls-pki.ts +0 -166
  71. package/src/backends/firecracker/__tests__/protocol.test.ts +0 -75
  72. package/src/backends/firecracker/__tests__/transport.test.ts +0 -534
  73. package/src/egress/__tests__/allowlist.test.ts +0 -103
  74. package/src/egress/__tests__/proxy.test.ts +0 -212
  75. package/src/index.test.ts +0 -709
@@ -1,361 +0,0 @@
1
- /**
2
- * Firecracker `SandboxBackend` end-to-end over the loopback agent.
3
- *
4
- * Stubs the orchestrator control plane (`fetch` for `/sandboxes` create
5
- * + `:delete`) and points the returned vsock handle at a unix-socket
6
- * loopback running the REAL `agent/agent.cjs`. Proves the full
7
- * {@link Sandbox} handle the SDK consumes — `exec` / `writeFile` /
8
- * `readFile` / `listFiles` / `destroy` / `status` — speaks the NDJSON
9
- * wire over the vsock transport, and that the readiness fence waits on
10
- * the agent's healthz (not the orchestrator 2xx).
11
- */
12
- import { chmodSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
13
- import { createRequire } from 'node:module';
14
- import { createServer } from 'node:net';
15
- import { tmpdir } from 'node:os';
16
- import { join } from 'node:path';
17
- import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
18
- import { buildFirecrackerBackend, normalizeHandle } from '../index.js';
19
- import { localIpcPath } from './fixtures/ipc-path.js';
20
- import { CA_CRT, CLIENT_CRT, CLIENT_KEY, startMtlsRelay, } from './fixtures/mtls-pki.js';
21
- // The loopback agent under test is the guest-side agent for a Linux microVM:
22
- // it spawns `/bin/sh` to run commands, and that binary does not exist on
23
- // Windows. These cases assert behavior the platform cannot produce, so they
24
- // skip there rather than leaving the suite permanently red for Windows
25
- // contributors. The socket-address fixture IS platform-correct, so the
26
- // transport is still exercised wherever it can be.
27
- const IS_WINDOWS = process.platform === 'win32';
28
- const require_ = createRequire(import.meta.url);
29
- let workDir;
30
- let sockPath;
31
- let server;
32
- let relay;
33
- let agent;
34
- const realFetch = globalThis.fetch;
35
- let realPath;
36
- beforeEach(() => {
37
- workDir = mkdtempSync(join(tmpdir(), 'fc-backend-test-'));
38
- sockPath = localIpcPath(workDir);
39
- realPath = process.env.PATH;
40
- process.env.NAMZU_SANDBOX_WORKSPACE = workDir;
41
- delete require_.cache[require_.resolve('../../../../agent/agent.cjs')];
42
- agent = require_('../../../../agent/agent.cjs');
43
- });
44
- afterEach(async () => {
45
- globalThis.fetch = realFetch;
46
- process.env.PATH = realPath;
47
- if (relay) {
48
- await new Promise((r) => relay?.server.close(() => r()));
49
- relay = undefined;
50
- }
51
- if (server) {
52
- await new Promise((r) => server?.close(() => r()));
53
- server = undefined;
54
- }
55
- rmSync(workDir, { recursive: true, force: true });
56
- });
57
- function startAgent() {
58
- return new Promise((resolve, reject) => {
59
- const s = createServer(agent.handleConnection);
60
- s.on('error', reject);
61
- s.listen(sockPath, () => resolve(s));
62
- });
63
- }
64
- /**
65
- * Stub the orchestrator: `POST /sandboxes` returns a handle pointing at
66
- * the loopback unix socket; `:delete` returns 204. Records calls so the
67
- * test can assert the create body + destroy round-trip.
68
- */
69
- function stubOrchestrator(handle) {
70
- const calls = [];
71
- globalThis.fetch = vi.fn(async (input, init) => {
72
- const url = String(input);
73
- const method = init?.method ?? 'GET';
74
- const body = init?.body ? JSON.parse(String(init.body)) : undefined;
75
- calls.push({ url, method, body });
76
- if (method === 'POST' && url.endsWith('/sandboxes')) {
77
- return new Response(JSON.stringify({ sandboxId: 'sbx_fc_test', agent: handle, rootDir: workDir }), { status: 200, headers: { 'content-type': 'application/json' } });
78
- }
79
- if (method === 'DELETE' && url.includes(':delete')) {
80
- return new Response(null, { status: 204 });
81
- }
82
- return new Response('unexpected', { status: 500 });
83
- });
84
- return { calls };
85
- }
86
- describe.skipIf(IS_WINDOWS)('buildFirecrackerBackend (loopback agent)', () => {
87
- it('creates a Sandbox handle and round-trips exec/write/read/listFiles/destroy', async () => {
88
- server = await startAgent();
89
- const { calls } = stubOrchestrator({ kind: 'unix', path: sockPath });
90
- const backend = buildFirecrackerBackend({
91
- orchestratorEndpoint: 'https://orchestrator.test/',
92
- getToken: async () => 'token-123',
93
- template: 'golden-rev-7',
94
- readyTimeoutMs: 5_000,
95
- readyPollIntervalMs: 50,
96
- });
97
- const sandbox = await backend.create({
98
- workingDirectory: workDir,
99
- memoryLimitMb: 512,
100
- maxProcesses: 64,
101
- timeoutMs: 60_000,
102
- egress: { kind: 'static', allowedHosts: ['api.example.com'] },
103
- });
104
- // Handle shape.
105
- expect(sandbox.id).toBe('sbx_fc_test');
106
- expect(sandbox.rootDir).toBe(workDir);
107
- expect(sandbox.environment).toBe('linux-namespace');
108
- expect(sandbox.status).toBe('ready');
109
- // Create body forwarded the resolved knobs + egress allowlist.
110
- const createCall = calls.find((c) => c.method === 'POST');
111
- expect(createCall?.body).toMatchObject({
112
- template: 'golden-rev-7',
113
- memoryLimitMb: 512,
114
- maxProcesses: 64,
115
- timeoutMs: 60_000,
116
- egressAllowlist: ['api.example.com'],
117
- });
118
- // exec over the wire.
119
- const r = await sandbox.exec('/bin/sh', ['-c', 'echo hello-fc']);
120
- expect(r.stdout).toContain('hello-fc');
121
- expect(r.exitCode).toBe(0);
122
- // writeFile + readFile round-trip.
123
- await sandbox.writeFile('out/result.txt', 'persisted');
124
- const read = await sandbox.readFile('out/result.txt');
125
- expect(read.toString('utf8')).toBe('persisted');
126
- // listFiles uses the same `find -printf '%p\t%s\n'` wire as
127
- // docker/aci. On a GNU-find host (the Ubuntu golden rootfs) it
128
- // enumerates the file we wrote; on a BSD-find host (macOS CI
129
- // runners) `-printf` is unsupported, find exits non-zero, and the
130
- // contract maps that to an empty listing — exactly as docker/aci
131
- // do. Assert the call path returns the SDK shape either way, and
132
- // the file when GNU find is present.
133
- const files = await sandbox.listFiles(workDir);
134
- expect(Array.isArray(files)).toBe(true);
135
- if (files.length > 0) {
136
- expect(files.some((f) => f.path.endsWith('out/result.txt'))).toBe(true);
137
- expect(files.every((f) => Number.isFinite(f.size))).toBe(true);
138
- }
139
- // destroy calls the orchestrator :delete and flips status.
140
- await sandbox.destroy();
141
- expect(sandbox.status).toBe('destroyed');
142
- expect(calls.some((c) => c.method === 'DELETE' && c.url.includes(':delete'))).toBe(true);
143
- });
144
- it('tears down the microVM when the readiness fence times out (no orphan)', async () => {
145
- // No agent listening → healthz never succeeds → readiness fence
146
- // times out → backend must DELETE to avoid orphaning the microVM.
147
- const { calls } = stubOrchestrator({ kind: 'unix', path: sockPath });
148
- const backend = buildFirecrackerBackend({
149
- orchestratorEndpoint: 'https://orchestrator.test/',
150
- getToken: async () => 'tok',
151
- readyTimeoutMs: 300,
152
- readyPollIntervalMs: 50,
153
- transport: { connectRetryBudgetMs: 100, connectTimeoutMs: 80, connectRetryIntervalMs: 30 },
154
- });
155
- await expect(backend.create({ workingDirectory: workDir })).rejects.toThrow(/did not become ready/);
156
- expect(calls.some((c) => c.method === 'DELETE')).toBe(true);
157
- });
158
- it('parses listFiles output into {path,size} entries (GNU-find-shaped wire)', async () => {
159
- // Make `find` deterministic across host platforms: shim a `find`
160
- // on PATH that emits the GNU `-printf '%p\t%s\n'` wire the Ubuntu
161
- // golden rootfs produces, so the backend's tab-split parser is
162
- // proven without depending on the host having GNU findutils.
163
- const binDir = mkdtempSync(join(tmpdir(), 'fc-bin-'));
164
- const findShim = join(binDir, 'find');
165
- writeFileSync(findShim, [
166
- '#!/bin/sh',
167
- `printf '%s\\t%s\\n' '${workDir}/out/result.txt' 9`,
168
- `printf '%s\\t%s\\n' '${workDir}/out/other.bin' 42`,
169
- ].join('\n'), { mode: 0o755 });
170
- chmodSync(findShim, 0o755);
171
- process.env.PATH = `${binDir}:${process.env.PATH}`;
172
- server = await startAgent();
173
- stubOrchestrator({ kind: 'unix', path: sockPath });
174
- const backend = buildFirecrackerBackend({
175
- orchestratorEndpoint: 'https://orchestrator.test/',
176
- getToken: async () => 'tok',
177
- readyTimeoutMs: 3_000,
178
- readyPollIntervalMs: 50,
179
- });
180
- const sandbox = await backend.create({ workingDirectory: workDir });
181
- const files = await sandbox.listFiles(workDir);
182
- expect(files).toEqual([
183
- { path: `${workDir}/out/result.txt`, size: 9 },
184
- { path: `${workDir}/out/other.bin`, size: 42 },
185
- ]);
186
- await sandbox.destroy();
187
- rmSync(binDir, { recursive: true, force: true });
188
- });
189
- it('fills the contract vsock port when the orchestrator omits it', async () => {
190
- // A vsock handle whose port is 0 should be normalized to the
191
- // configured agentVsockPort. We can't bind a real AF_VSOCK here, so
192
- // assert the normalization path via a unix handle is unaffected and
193
- // that a portless vsock handle does not crash create's pre-dial.
194
- // (Full vsock dial is the live increment.)
195
- server = await startAgent();
196
- stubOrchestrator({ kind: 'unix', path: sockPath });
197
- const backend = buildFirecrackerBackend({
198
- orchestratorEndpoint: 'https://orchestrator.test/',
199
- getToken: async () => 'tok',
200
- agentVsockPort: 1024,
201
- readyTimeoutMs: 3_000,
202
- readyPollIntervalMs: 50,
203
- });
204
- const sandbox = await backend.create({ workingDirectory: workDir });
205
- expect(sandbox.status).toBe('ready');
206
- await sandbox.destroy();
207
- });
208
- it('carries agentSnapshot in the create body when the backend config sets it', async () => {
209
- // OPEN-2 — the per-agent snapshot ref is a first-class, provider-agnostic
210
- // field on the create contract (sibling to `template`). When set it must
211
- // reach the orchestrator POST body verbatim.
212
- server = await startAgent();
213
- const { calls } = stubOrchestrator({ kind: 'unix', path: sockPath });
214
- const backend = buildFirecrackerBackend({
215
- orchestratorEndpoint: 'https://orchestrator.test/',
216
- getToken: async () => 'tok',
217
- template: 'golden-rev-7',
218
- agentSnapshot: { orgId: 'org1', agentId: 'agent9', version: '3' },
219
- readyTimeoutMs: 3_000,
220
- readyPollIntervalMs: 50,
221
- });
222
- const sandbox = await backend.create({ workingDirectory: workDir });
223
- const createCall = calls.find((c) => c.method === 'POST');
224
- expect(createCall?.body).toMatchObject({
225
- template: 'golden-rev-7',
226
- agentSnapshot: { orgId: 'org1', agentId: 'agent9', version: '3' },
227
- });
228
- await sandbox.destroy();
229
- });
230
- it('OMITS agentSnapshot from the create body when absent (byte-identical generic path)', async () => {
231
- // DORMANT contract: absent ⇒ the POST body must NOT carry an
232
- // `agentSnapshot` key at all (a JSON `undefined` would not serialise, but
233
- // the conditional spread must drop the key entirely so the body is
234
- // byte-identical to the pre-field generic create).
235
- server = await startAgent();
236
- const { calls } = stubOrchestrator({ kind: 'unix', path: sockPath });
237
- const backend = buildFirecrackerBackend({
238
- orchestratorEndpoint: 'https://orchestrator.test/',
239
- getToken: async () => 'tok',
240
- template: 'golden-rev-7',
241
- readyTimeoutMs: 3_000,
242
- readyPollIntervalMs: 50,
243
- });
244
- const sandbox = await backend.create({ workingDirectory: workDir });
245
- const createCall = calls.find((c) => c.method === 'POST');
246
- expect(createCall?.body).toEqual({ template: 'golden-rev-7' });
247
- expect(Object.prototype.hasOwnProperty.call(createCall?.body ?? {}, 'agentSnapshot')).toBe(false);
248
- await sandbox.destroy();
249
- });
250
- });
251
- // ---------------------------------------------------------------------------
252
- // Cert-injection seam (ses_051 P4 Track C) — the orchestrator returns a WIRE
253
- // `mtls` handle (host/port/sandboxId, NO certs); the consumer injects the
254
- // client CA/cert/key via `config.mtls`, which `normalizeHandle` MERGES onto
255
- // the handle before the transport dials the relay. Certs NEVER transit the
256
- // control plane.
257
- // ---------------------------------------------------------------------------
258
- describe('normalizeHandle (mtls cert injection)', () => {
259
- const WIRE_MTLS = {
260
- kind: 'mtls',
261
- host: '10.60.1.7',
262
- port: 8443,
263
- sandboxId: 'sb-net',
264
- };
265
- it('merges the injected cert material onto a wire mtls handle', () => {
266
- const handle = normalizeHandle(WIRE_MTLS, 1024, {
267
- ca: CA_CRT,
268
- cert: CLIENT_CRT,
269
- key: CLIENT_KEY,
270
- servername: 'sandbox.fc.internal',
271
- });
272
- expect(handle).toEqual({
273
- kind: 'mtls',
274
- host: '10.60.1.7',
275
- port: 8443,
276
- sandboxId: 'sb-net',
277
- tls: {
278
- ca: CA_CRT,
279
- cert: CLIENT_CRT,
280
- key: CLIENT_KEY,
281
- servername: 'sandbox.fc.internal',
282
- },
283
- });
284
- });
285
- it('throws when an mtls handle arrives with NO injected cert material', () => {
286
- // A network-mode backend that cannot present a client cert would be
287
- // rejected by the relay — fail loud at handle-normalization instead.
288
- expect(() => normalizeHandle(WIRE_MTLS, 1024, undefined)).toThrow(/no client cert material was injected/);
289
- });
290
- it('leaves vsock + unix handles untouched (cert material is ignored)', () => {
291
- expect(normalizeHandle({ kind: 'unix', path: '/tmp/a.sock' }, 1024, undefined)).toEqual({
292
- kind: 'unix',
293
- path: '/tmp/a.sock',
294
- });
295
- // A vsock handle with a 0 port still normalizes to the contract port.
296
- expect(normalizeHandle({ kind: 'vsock', udsPath: '/v.sock', port: 0 }, 1024, {
297
- ca: CA_CRT,
298
- cert: CLIENT_CRT,
299
- key: CLIENT_KEY,
300
- })).toEqual({ kind: 'vsock', udsPath: '/v.sock', port: 1024 });
301
- });
302
- });
303
- describe.skipIf(IS_WINDOWS)('buildFirecrackerBackend (network mode over a loopback mTLS relay)', () => {
304
- it('injects the client cert + round-trips exec/file-IO through the relay', async () => {
305
- // The agent on a unix socket; a loopback mTLS relay in front of it.
306
- server = await startAgent();
307
- relay = await startMtlsRelay(sockPath);
308
- // The orchestrator returns a WIRE mtls handle (NO cert material) whose
309
- // host:port point at the relay; the relay resolves the sandboxId.
310
- const { calls } = stubOrchestrator({
311
- kind: 'mtls',
312
- host: '127.0.0.1',
313
- port: relay.port,
314
- sandboxId: 'sb-net',
315
- });
316
- const backend = buildFirecrackerBackend({
317
- orchestratorEndpoint: 'https://orchestrator.test/',
318
- getToken: async () => 'tok',
319
- readyTimeoutMs: 5_000,
320
- readyPollIntervalMs: 50,
321
- // The CONSUMER-injected client material — never returned by the
322
- // orchestrator. Merged onto the handle's `tls` block.
323
- mtls: {
324
- ca: CA_CRT,
325
- cert: CLIENT_CRT,
326
- key: CLIENT_KEY,
327
- servername: 'sandbox.fc.internal',
328
- },
329
- });
330
- const sandbox = await backend.create({ workingDirectory: workDir });
331
- expect(sandbox.status).toBe('ready');
332
- // The dialer wrote the `SANDBOX <id>` routing preamble (the relay's key).
333
- expect(await relay.preamble()).toBe('sb-net');
334
- // Full exec + file-IO round-trip over the mTLS tunnel.
335
- const r = await sandbox.exec('/bin/sh', ['-c', 'echo hello-mtls']);
336
- expect(r.stdout).toContain('hello-mtls');
337
- await sandbox.writeFile('out/r.txt', 'via-relay');
338
- expect((await sandbox.readFile('out/r.txt')).toString('utf8')).toBe('via-relay');
339
- await sandbox.destroy();
340
- expect(calls.some((c) => c.method === 'DELETE')).toBe(true);
341
- });
342
- it('rejects a create when the orchestrator returns mtls but no cert material is injected', async () => {
343
- server = await startAgent();
344
- relay = await startMtlsRelay(sockPath);
345
- stubOrchestrator({
346
- kind: 'mtls',
347
- host: '127.0.0.1',
348
- port: relay.port,
349
- sandboxId: 'sb-net',
350
- });
351
- const backend = buildFirecrackerBackend({
352
- orchestratorEndpoint: 'https://orchestrator.test/',
353
- getToken: async () => 'tok',
354
- readyTimeoutMs: 2_000,
355
- readyPollIntervalMs: 50,
356
- // No `mtls` material → normalizeHandle must throw at create time.
357
- });
358
- await expect(backend.create({ workingDirectory: workDir })).rejects.toThrow(/no client cert material was injected/);
359
- });
360
- });
361
- //# sourceMappingURL=backend.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"backend.test.js","sourceRoot":"","sources":["../../../../src/backends/firecracker/__tests__/backend.test.ts"],"names":[],"mappings":"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"}
@@ -1,19 +0,0 @@
1
- /**
2
- * Control-plane mTLS dial for the Firecracker backend (additive
3
- * `config.controlPlaneMtls`).
4
- *
5
- * A loopback `https.createServer` with `requestCert + rejectUnauthorized`
6
- * (pinned to the test CA) stands in for the orchestrator over the public hop.
7
- * It serves the real `POST /sandboxes` + `:delete` routes; the create response
8
- * points the agent handle at a unix-socket loopback running the REAL
9
- * `agent/agent.cjs`, so the FULL create flow (control-plane POST over mTLS →
10
- * vsock readiness fence → exec) runs end to end.
11
- *
12
- * Proves:
13
- * - with `controlPlaneMtls` injected, the create POST succeeds over mTLS and
14
- * the sandbox round-trips an exec.
15
- * - WITHOUT the client cert (no `controlPlaneMtls`, so the backend uses plain
16
- * `fetch` against the https listener), create is rejected at the TLS layer.
17
- */
18
- export {};
19
- //# sourceMappingURL=control-plane-mtls.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"control-plane-mtls.test.d.ts","sourceRoot":"","sources":["../../../../src/backends/firecracker/__tests__/control-plane-mtls.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}
@@ -1,209 +0,0 @@
1
- /**
2
- * Control-plane mTLS dial for the Firecracker backend (additive
3
- * `config.controlPlaneMtls`).
4
- *
5
- * A loopback `https.createServer` with `requestCert + rejectUnauthorized`
6
- * (pinned to the test CA) stands in for the orchestrator over the public hop.
7
- * It serves the real `POST /sandboxes` + `:delete` routes; the create response
8
- * points the agent handle at a unix-socket loopback running the REAL
9
- * `agent/agent.cjs`, so the FULL create flow (control-plane POST over mTLS →
10
- * vsock readiness fence → exec) runs end to end.
11
- *
12
- * Proves:
13
- * - with `controlPlaneMtls` injected, the create POST succeeds over mTLS and
14
- * the sandbox round-trips an exec.
15
- * - WITHOUT the client cert (no `controlPlaneMtls`, so the backend uses plain
16
- * `fetch` against the https listener), create is rejected at the TLS layer.
17
- */
18
- import { mkdtempSync, rmSync } from 'node:fs';
19
- import { createServer as createHttpsServer, request as httpsRequest, } from 'node:https';
20
- import { createRequire } from 'node:module';
21
- import { createServer } from 'node:net';
22
- import { tmpdir } from 'node:os';
23
- import { join } from 'node:path';
24
- import { afterEach, beforeEach, describe, expect, it } from 'vitest';
25
- import { buildFirecrackerBackend } from '../index.js';
26
- import { localIpcPath } from './fixtures/ipc-path.js';
27
- import { CA_CRT, CLIENT_CRT, CLIENT_KEY, ROGUE_CLIENT_CRT, ROGUE_CLIENT_KEY, SERVER_CRT, SERVER_KEY, } from './fixtures/mtls-pki.js';
28
- // The loopback agent under test is the guest-side agent for a Linux microVM:
29
- // it spawns `/bin/sh` to run commands, and that binary does not exist on
30
- // Windows. These cases assert behavior the platform cannot produce, so they
31
- // skip there rather than leaving the suite permanently red for Windows
32
- // contributors. The socket-address fixture IS platform-correct, so the
33
- // transport is still exercised wherever it can be.
34
- const IS_WINDOWS = process.platform === 'win32';
35
- const require_ = createRequire(import.meta.url);
36
- let workDir;
37
- let sockPath;
38
- let agentServer;
39
- let orchestrator;
40
- let agent;
41
- beforeEach(() => {
42
- workDir = mkdtempSync(join(tmpdir(), 'fc-cp-mtls-'));
43
- sockPath = localIpcPath(workDir);
44
- process.env.NAMZU_SANDBOX_WORKSPACE = workDir;
45
- delete require_.cache[require_.resolve('../../../../agent/agent.cjs')];
46
- agent = require_('../../../../agent/agent.cjs');
47
- });
48
- afterEach(async () => {
49
- if (orchestrator) {
50
- await new Promise((r) => orchestrator?.close(() => r()));
51
- orchestrator = undefined;
52
- }
53
- if (agentServer) {
54
- await new Promise((r) => agentServer?.close(() => r()));
55
- agentServer = undefined;
56
- }
57
- rmSync(workDir, { recursive: true, force: true });
58
- });
59
- function startAgent() {
60
- return new Promise((resolve, reject) => {
61
- const s = createServer(agent.handleConnection);
62
- s.on('error', reject);
63
- s.listen(sockPath, () => resolve(s));
64
- });
65
- }
66
- /**
67
- * A loopback mTLS orchestrator. Requires + verifies a client cert chaining to
68
- * the test CA, then serves the control-plane routes: `POST /sandboxes` returns
69
- * a unix agent handle, `:delete` returns 204. Records calls so the test can
70
- * assert the create round-trip.
71
- */
72
- function startMtlsOrchestrator(handlePath) {
73
- const calls = [];
74
- return new Promise((resolve, reject) => {
75
- const server = createHttpsServer({
76
- cert: SERVER_CRT,
77
- key: SERVER_KEY,
78
- ca: CA_CRT,
79
- requestCert: true,
80
- rejectUnauthorized: true,
81
- minVersion: 'TLSv1.3',
82
- }, (req, res) => {
83
- const method = req.method ?? 'GET';
84
- const url = req.url ?? '/';
85
- calls.push({ method, url });
86
- // Drain the body, then respond per route.
87
- req.on('data', () => { });
88
- req.on('end', () => {
89
- if (method === 'POST' && url.endsWith('/sandboxes')) {
90
- res.statusCode = 200;
91
- res.setHeader('content-type', 'application/json');
92
- res.end(JSON.stringify({
93
- sandboxId: 'sbx_cp_mtls',
94
- agent: { kind: 'unix', path: handlePath },
95
- rootDir: workDir,
96
- }));
97
- return;
98
- }
99
- if (method === 'DELETE' && url.includes(':delete')) {
100
- res.statusCode = 204;
101
- res.end();
102
- return;
103
- }
104
- res.statusCode = 500;
105
- res.end('unexpected');
106
- });
107
- });
108
- server.on('error', reject);
109
- server.listen(0, '127.0.0.1', () => {
110
- const addr = server.address();
111
- if (addr === null || typeof addr === 'string') {
112
- reject(new Error('orchestrator: no TCP port'));
113
- return;
114
- }
115
- resolve({ server, port: addr.port, calls });
116
- });
117
- });
118
- }
119
- describe.skipIf(IS_WINDOWS)('buildFirecrackerBackend (control-plane mTLS dial)', () => {
120
- it('create POST succeeds over mTLS and round-trips an exec', async () => {
121
- agentServer = await startAgent();
122
- const orch = await startMtlsOrchestrator(sockPath);
123
- orchestrator = orch.server;
124
- const backend = buildFirecrackerBackend({
125
- // An https:// endpoint over the (loopback stand-in for the) public hop.
126
- orchestratorEndpoint: `https://127.0.0.1:${orch.port}/`,
127
- getToken: async () => 'tok',
128
- readyTimeoutMs: 5_000,
129
- readyPollIntervalMs: 50,
130
- // CONTROL-plane client material — injected by the consumer, never
131
- // shipped by the orchestrator. Drives the node:https mTLS dial.
132
- controlPlaneMtls: {
133
- ca: CA_CRT,
134
- cert: CLIENT_CRT,
135
- key: CLIENT_KEY,
136
- servername: 'sandbox.fc.internal',
137
- },
138
- });
139
- const sandbox = await backend.create({ workingDirectory: workDir });
140
- expect(sandbox.id).toBe('sbx_cp_mtls');
141
- expect(sandbox.status).toBe('ready');
142
- // The control-plane POST reached the mTLS orchestrator.
143
- expect(orch.calls.some((c) => c.method === 'POST' && c.url.endsWith('/sandboxes'))).toBe(true);
144
- // Exec over the vsock tunnel (the data plane), proving the whole flow.
145
- const r = await sandbox.exec('/bin/sh', ['-c', 'echo hello-cp-mtls']);
146
- expect(r.stdout).toContain('hello-cp-mtls');
147
- // destroy DELETE also rides the mTLS control plane.
148
- await sandbox.destroy();
149
- expect(orch.calls.some((c) => c.method === 'DELETE' && c.url.includes(':delete'))).toBe(true);
150
- });
151
- it('the backend without controlPlaneMtls cannot reach the mTLS orchestrator (plain fetch fails the handshake)', async () => {
152
- agentServer = await startAgent();
153
- const orch = await startMtlsOrchestrator(sockPath);
154
- orchestrator = orch.server;
155
- // No `controlPlaneMtls` → the backend uses plain `fetch`, which neither
156
- // presents a client cert nor trusts the test CA, so the TLS handshake
157
- // fails and create rejects BEFORE any route runs.
158
- const backend = buildFirecrackerBackend({
159
- orchestratorEndpoint: `https://127.0.0.1:${orch.port}/`,
160
- getToken: async () => 'tok',
161
- readyTimeoutMs: 2_000,
162
- readyPollIntervalMs: 50,
163
- });
164
- await expect(backend.create({ workingDirectory: workDir })).rejects.toThrow(/failed to create microVM sandbox/);
165
- expect(orch.calls.some((c) => c.method === 'POST' && c.url.endsWith('/sandboxes'))).toBe(false);
166
- });
167
- it("the orchestrator's requestCert rejects a client presenting NO cert (server-side proof)", async () => {
168
- // Isolate the SERVER's requestCert+rejectUnauthorized from any client-side
169
- // CA distrust: dial directly with node:https TRUSTING the server CA but
170
- // presenting NO client cert. The handshake must be rejected by the server.
171
- const orch = await startMtlsOrchestrator(sockPath);
172
- orchestrator = orch.server;
173
- const err = await new Promise((resolve) => {
174
- const req = httpsRequest({
175
- host: '127.0.0.1',
176
- port: orch.port,
177
- method: 'POST',
178
- path: '/sandboxes',
179
- ca: CA_CRT,
180
- servername: 'sandbox.fc.internal',
181
- }, () => resolve(undefined));
182
- req.on('error', (e) => resolve(e));
183
- req.end();
184
- });
185
- expect(err).toBeInstanceOf(Error);
186
- expect(orch.calls.some((c) => c.method === 'POST')).toBe(false);
187
- });
188
- it("the orchestrator's requestCert rejects a client cert from a DIFFERENT CA", async () => {
189
- const orch = await startMtlsOrchestrator(sockPath);
190
- orchestrator = orch.server;
191
- const err = await new Promise((resolve) => {
192
- const req = httpsRequest({
193
- host: '127.0.0.1',
194
- port: orch.port,
195
- method: 'POST',
196
- path: '/sandboxes',
197
- ca: CA_CRT,
198
- cert: ROGUE_CLIENT_CRT,
199
- key: ROGUE_CLIENT_KEY,
200
- servername: 'sandbox.fc.internal',
201
- }, () => resolve(undefined));
202
- req.on('error', (e) => resolve(e));
203
- req.end();
204
- });
205
- expect(err).toBeInstanceOf(Error);
206
- expect(orch.calls.some((c) => c.method === 'POST')).toBe(false);
207
- });
208
- });
209
- //# sourceMappingURL=control-plane-mtls.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"control-plane-mtls.test.js","sourceRoot":"","sources":["../../../../src/backends/firecracker/__tests__/control-plane-mtls.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAC7C,OAAO,EAEN,YAAY,IAAI,iBAAiB,EACjC,OAAO,IAAI,YAAY,GACvB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAA4B,YAAY,EAAE,MAAM,UAAU,CAAA;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAEpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AACrD,OAAO,EACN,MAAM,EACN,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,UAAU,GACV,MAAM,wBAAwB,CAAA;AAC/B,6EAA6E;AAC7E,yEAAyE;AACzE,4EAA4E;AAC5E,uEAAuE;AACvE,uEAAuE;AACvE,mDAAmD;AACnD,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAA;AAE/C,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAM/C,IAAI,OAAe,CAAA;AACnB,IAAI,QAAgB,CAAA;AACpB,IAAI,WAA+B,CAAA;AACnC,IAAI,YAAqC,CAAA;AACzC,IAAI,KAAkB,CAAA;AAEtB,UAAU,CAAC,GAAG,EAAE;IACf,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC,CAAA;IACpD,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;IAChC,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,OAAO,CAAA;IAC7C,OAAO,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC,CAAA;IACtE,KAAK,GAAG,QAAQ,CAAC,6BAA6B,CAAgB,CAAA;AAC/D,CAAC,CAAC,CAAA;AAEF,SAAS,CAAC,KAAK,IAAI,EAAE;IACpB,IAAI,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAC9D,YAAY,GAAG,SAAS,CAAA;IACzB,CAAC;IACD,IAAI,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAC7D,WAAW,GAAG,SAAS,CAAA;IACxB,CAAC;IACD,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;AAClD,CAAC,CAAC,CAAA;AAEF,SAAS,UAAU;IAClB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACtC,MAAM,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAA;QAC9C,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QACrB,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,qBAAqB,CAAC,UAAkB;IAKhD,MAAM,KAAK,GAA2C,EAAE,CAAA;IACxD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACtC,MAAM,MAAM,GAAG,iBAAiB,CAC/B;YACC,IAAI,EAAE,UAAU;YAChB,GAAG,EAAE,UAAU;YACf,EAAE,EAAE,MAAM;YACV,WAAW,EAAE,IAAI;YACjB,kBAAkB,EAAE,IAAI;YACxB,UAAU,EAAE,SAAS;SACrB,EACD,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACZ,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,KAAK,CAAA;YAClC,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAA;YAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;YAC3B,0CAA0C;YAC1C,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;YACxB,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBAClB,IAAI,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;oBACrD,GAAG,CAAC,UAAU,GAAG,GAAG,CAAA;oBACpB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAA;oBACjD,GAAG,CAAC,GAAG,CACN,IAAI,CAAC,SAAS,CAAC;wBACd,SAAS,EAAE,aAAa;wBACxB,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE;wBACzC,OAAO,EAAE,OAAO;qBAChB,CAAC,CACF,CAAA;oBACD,OAAM;gBACP,CAAC;gBACD,IAAI,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;oBACpD,GAAG,CAAC,UAAU,GAAG,GAAG,CAAA;oBACpB,GAAG,CAAC,GAAG,EAAE,CAAA;oBACT,OAAM;gBACP,CAAC;gBACD,GAAG,CAAC,UAAU,GAAG,GAAG,CAAA;gBACpB,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;YACtB,CAAC,CAAC,CAAA;QACH,CAAC,CACD,CAAA;QACD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QAC1B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE;YAClC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAA;YAC7B,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC/C,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAA;gBAC9C,OAAM;YACP,CAAC;YACD,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QAC5C,CAAC,CAAC,CAAA;IACH,CAAC,CAAC,CAAA;AACH,CAAC;AAED,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,mDAAmD,EAAE,GAAG,EAAE;IACrF,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACvE,WAAW,GAAG,MAAM,UAAU,EAAE,CAAA;QAChC,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,QAAQ,CAAC,CAAA;QAClD,YAAY,GAAG,IAAI,CAAC,MAAM,CAAA;QAE1B,MAAM,OAAO,GAAG,uBAAuB,CAAC;YACvC,wEAAwE;YACxE,oBAAoB,EAAE,qBAAqB,IAAI,CAAC,IAAI,GAAG;YACvD,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,KAAK;YAC3B,cAAc,EAAE,KAAK;YACrB,mBAAmB,EAAE,EAAE;YACvB,kEAAkE;YAClE,gEAAgE;YAChE,gBAAgB,EAAE;gBACjB,EAAE,EAAE,MAAM;gBACV,IAAI,EAAE,UAAU;gBAChB,GAAG,EAAE,UAAU;gBACf,UAAU,EAAE,qBAAqB;aACjC;SACD,CAAC,CAAA;QAEF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC,CAAA;QACnE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QACtC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAEpC,wDAAwD;QACxD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAE9F,uEAAuE;QACvE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAA;QACrE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAA;QAE3C,oDAAoD;QACpD,MAAM,OAAO,CAAC,OAAO,EAAE,CAAA;QACvB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC9F,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2GAA2G,EAAE,KAAK,IAAI,EAAE;QAC1H,WAAW,GAAG,MAAM,UAAU,EAAE,CAAA;QAChC,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,QAAQ,CAAC,CAAA;QAClD,YAAY,GAAG,IAAI,CAAC,MAAM,CAAA;QAE1B,wEAAwE;QACxE,sEAAsE;QACtE,kDAAkD;QAClD,MAAM,OAAO,GAAG,uBAAuB,CAAC;YACvC,oBAAoB,EAAE,qBAAqB,IAAI,CAAC,IAAI,GAAG;YACvD,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,KAAK;YAC3B,cAAc,EAAE,KAAK;YACrB,mBAAmB,EAAE,EAAE;SACvB,CAAC,CAAA;QAEF,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC1E,kCAAkC,CAClC,CAAA;QACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAChG,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wFAAwF,EAAE,KAAK,IAAI,EAAE;QACvG,2EAA2E;QAC3E,wEAAwE;QACxE,2EAA2E;QAC3E,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,QAAQ,CAAC,CAAA;QAClD,YAAY,GAAG,IAAI,CAAC,MAAM,CAAA;QAC1B,MAAM,GAAG,GAAG,MAAM,IAAI,OAAO,CAAoB,CAAC,OAAO,EAAE,EAAE;YAC5D,MAAM,GAAG,GAAG,YAAY,CACvB;gBACC,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,YAAY;gBAClB,EAAE,EAAE,MAAM;gBACV,UAAU,EAAE,qBAAqB;aACjC,EACD,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CACxB,CAAA;YACD,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;YACzC,GAAG,CAAC,GAAG,EAAE,CAAA;QACV,CAAC,CAAC,CAAA;QACF,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;QACjC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAChE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QACzF,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,QAAQ,CAAC,CAAA;QAClD,YAAY,GAAG,IAAI,CAAC,MAAM,CAAA;QAC1B,MAAM,GAAG,GAAG,MAAM,IAAI,OAAO,CAAoB,CAAC,OAAO,EAAE,EAAE;YAC5D,MAAM,GAAG,GAAG,YAAY,CACvB;gBACC,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,YAAY;gBAClB,EAAE,EAAE,MAAM;gBACV,IAAI,EAAE,gBAAgB;gBACtB,GAAG,EAAE,gBAAgB;gBACrB,UAAU,EAAE,qBAAqB;aACjC,EACD,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CACxB,CAAA;YACD,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;YACzC,GAAG,CAAC,GAAG,EAAE,CAAA;QACV,CAAC,CAAC,CAAA;QACF,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;QACjC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAChE,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=egress-policy.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"egress-policy.test.d.ts","sourceRoot":"","sources":["../../../../src/backends/firecracker/__tests__/egress-policy.test.ts"],"names":[],"mappings":""}