@namzu/sandbox 14.0.0 → 16.0.0
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/CHANGELOG.md +924 -0
- package/README.md +369 -14
- package/dist/backends/aci-standby-pool/index.d.ts.map +1 -1
- package/dist/backends/aci-standby-pool/index.js +13 -1
- package/dist/backends/aci-standby-pool/index.js.map +1 -1
- package/dist/backends/docker/index.d.ts +169 -6
- package/dist/backends/docker/index.d.ts.map +1 -1
- package/dist/backends/docker/index.js +499 -85
- package/dist/backends/docker/index.js.map +1 -1
- package/dist/backends/firecracker/index.d.ts.map +1 -1
- package/dist/backends/firecracker/index.js +12 -2
- package/dist/backends/firecracker/index.js.map +1 -1
- package/dist/backends/firecracker/protocol.d.ts +459 -8
- package/dist/backends/firecracker/protocol.d.ts.map +1 -1
- package/dist/backends/firecracker/protocol.js +136 -0
- package/dist/backends/firecracker/protocol.js.map +1 -1
- package/dist/backends/firecracker/transport.d.ts +539 -6
- package/dist/backends/firecracker/transport.d.ts.map +1 -1
- package/dist/backends/firecracker/transport.js +1171 -24
- package/dist/backends/firecracker/transport.js.map +1 -1
- package/dist/backends/kubernetes/egress-policy.d.ts +1181 -13
- package/dist/backends/kubernetes/egress-policy.d.ts.map +1 -1
- package/dist/backends/kubernetes/egress-policy.js +2350 -31
- package/dist/backends/kubernetes/egress-policy.js.map +1 -1
- package/dist/backends/kubernetes/identity.d.ts +193 -0
- package/dist/backends/kubernetes/identity.d.ts.map +1 -0
- package/dist/backends/kubernetes/identity.js +147 -0
- package/dist/backends/kubernetes/identity.js.map +1 -0
- package/dist/backends/kubernetes/index.d.ts +678 -33
- package/dist/backends/kubernetes/index.d.ts.map +1 -1
- package/dist/backends/kubernetes/index.js +1180 -95
- package/dist/backends/kubernetes/index.js.map +1 -1
- package/dist/backends/kubernetes/ingress-policy.d.ts +375 -0
- package/dist/backends/kubernetes/ingress-policy.d.ts.map +1 -0
- package/dist/backends/kubernetes/ingress-policy.js +1050 -0
- package/dist/backends/kubernetes/ingress-policy.js.map +1 -0
- package/dist/backends/kubernetes/k8s-client.d.ts +213 -4
- package/dist/backends/kubernetes/k8s-client.d.ts.map +1 -1
- package/dist/backends/kubernetes/k8s-client.js +359 -52
- package/dist/backends/kubernetes/k8s-client.js.map +1 -1
- package/dist/backends/kubernetes/lease.d.ts +40 -14
- package/dist/backends/kubernetes/lease.d.ts.map +1 -1
- package/dist/backends/kubernetes/lease.js +68 -18
- package/dist/backends/kubernetes/lease.js.map +1 -1
- package/dist/backends/kubernetes/objects.d.ts +423 -3
- package/dist/backends/kubernetes/objects.d.ts.map +1 -1
- package/dist/backends/kubernetes/objects.js +364 -2
- package/dist/backends/kubernetes/objects.js.map +1 -1
- package/dist/backends/kubernetes/per-sandbox-policy.d.ts +219 -0
- package/dist/backends/kubernetes/per-sandbox-policy.d.ts.map +1 -0
- package/dist/backends/kubernetes/per-sandbox-policy.js +375 -0
- package/dist/backends/kubernetes/per-sandbox-policy.js.map +1 -0
- package/dist/backends/kubernetes/rbac.d.ts +153 -0
- package/dist/backends/kubernetes/rbac.d.ts.map +1 -0
- package/dist/backends/kubernetes/rbac.js +177 -0
- package/dist/backends/kubernetes/rbac.js.map +1 -0
- package/dist/backends/kubernetes/sandbox.d.ts +81 -14
- package/dist/backends/kubernetes/sandbox.d.ts.map +1 -1
- package/dist/backends/kubernetes/sandbox.js +149 -15
- package/dist/backends/kubernetes/sandbox.js.map +1 -1
- package/dist/backends/kubernetes/transport.d.ts +935 -9
- package/dist/backends/kubernetes/transport.d.ts.map +1 -1
- package/dist/backends/kubernetes/transport.js +1958 -62
- package/dist/backends/kubernetes/transport.js.map +1 -1
- package/dist/backends/kubernetes/workspace.d.ts +1149 -18
- package/dist/backends/kubernetes/workspace.d.ts.map +1 -1
- package/dist/backends/kubernetes/workspace.js +2825 -186
- package/dist/backends/kubernetes/workspace.js.map +1 -1
- package/dist/backends/remote-execution-controller.d.ts +14 -0
- package/dist/backends/remote-execution-controller.d.ts.map +1 -1
- package/dist/backends/remote-execution-controller.js.map +1 -1
- package/dist/index.d.ts +294 -18
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +280 -10
- package/dist/index.js.map +1 -1
- package/dist/testing/sandbox-conformance.d.ts +39 -5
- package/dist/testing/sandbox-conformance.d.ts.map +1 -1
- package/dist/testing/sandbox-conformance.js +436 -5
- package/dist/testing/sandbox-conformance.js.map +1 -1
- package/package.json +3 -3
- package/src/backends/aci-standby-pool/index.ts +16 -1
- package/src/backends/docker/index.ts +617 -100
- package/src/backends/firecracker/index.ts +14 -2
- package/src/backends/firecracker/protocol.ts +514 -6
- package/src/backends/firecracker/transport.ts +1492 -40
- package/src/backends/kubernetes/egress-policy.ts +3334 -55
- package/src/backends/kubernetes/identity.ts +261 -0
- package/src/backends/kubernetes/index.ts +1785 -127
- package/src/backends/kubernetes/ingress-policy.ts +1344 -0
- package/src/backends/kubernetes/k8s-client.ts +444 -54
- package/src/backends/kubernetes/lease.ts +75 -19
- package/src/backends/kubernetes/objects.ts +626 -6
- package/src/backends/kubernetes/per-sandbox-policy.ts +497 -0
- package/src/backends/kubernetes/rbac.ts +192 -0
- package/src/backends/kubernetes/sandbox.ts +218 -20
- package/src/backends/kubernetes/transport.ts +2733 -124
- package/src/backends/kubernetes/workspace.ts +4476 -222
- package/src/backends/remote-execution-controller.ts +14 -0
- package/src/index.ts +668 -19
- package/src/testing/sandbox-conformance.ts +540 -5
|
@@ -11,20 +11,36 @@
|
|
|
11
11
|
*
|
|
12
12
|
* Implemented: `exec` (through the shared {@link RemoteExecutionController},
|
|
13
13
|
* so an `AbortSignal` terminates the guest process rather than abandoning
|
|
14
|
-
* the wait), `writeFile`, `readFile`, `listFiles`, `
|
|
15
|
-
* `openTcpConnection`, `destroy`.
|
|
14
|
+
* the wait), `writeFile`, `readFile`, `listFiles`, `walkFiles`,
|
|
15
|
+
* `openTerminal`, `openTcpConnection`, `destroy`.
|
|
16
|
+
*
|
|
17
|
+
* Conditionally present, on the same contract read the other way:
|
|
18
|
+
*
|
|
19
|
+
* - `setNetworkPolicy` — present on a TASK handle exactly when the backend
|
|
20
|
+
* was configured with `egress.perSandbox`, which is what gives this host
|
|
21
|
+
* an object to write (one `CiliumNetworkPolicy` per sandbox, owned by the
|
|
22
|
+
* claim), an admission fence bounding what it may write, and the RBAC to
|
|
23
|
+
* write it. Without that configuration there is still no per-running-pod
|
|
24
|
+
* knob to turn, so the method is ABSENT rather than present and throwing —
|
|
25
|
+
* the same rule, applied to a capability that now sometimes exists.
|
|
26
|
+
* Presence follows configuration alone, never a probe of the cluster. See
|
|
27
|
+
* `per-sandbox-policy.ts`.
|
|
28
|
+
*
|
|
29
|
+
* A WORKSPACE handle never carries it: `KubernetesWorkspace`'s create path
|
|
30
|
+
* builds its handle through `buildKubernetesSandbox` without this option,
|
|
31
|
+
* because it composes no per-sandbox pod label and tracks no owner uid for
|
|
32
|
+
* one. That is a property of the PATH and not of the configuration, so it
|
|
33
|
+
* is not answered by omission: `createKubernetesWorkspace` refuses a
|
|
34
|
+
* config carrying `egress.perSandbox` outright
|
|
35
|
+
* (`KubernetesWorkspacePerSandboxEgressConfigError`, before any request)
|
|
36
|
+
* rather than letting the option declare a capability the path never
|
|
37
|
+
* serves — see `workspace.ts`.
|
|
16
38
|
*
|
|
17
39
|
* Absent on purpose, because the SDK's contract says a backend that cannot
|
|
18
40
|
* honour an optional method must omit it rather than accept and ignore:
|
|
19
41
|
*
|
|
20
|
-
* - `setNetworkPolicy` — egress here is a `NetworkPolicy` attached to the
|
|
21
|
-
* pool's `SandboxTemplate`. There is no per-running-pod knob to turn, and
|
|
22
|
-
* a policy accepted and not applied is worse than one never offered: the
|
|
23
|
-
* caller stops looking.
|
|
24
42
|
* - `spawnDetached` — the guest agent has no op that starts a process and
|
|
25
43
|
* returns it running. A host asking for background jobs must be told no.
|
|
26
|
-
* - `walkFiles` — not in this batch. A host that requires bounded search
|
|
27
|
-
* refuses an absent method, which is the honest answer today.
|
|
28
44
|
*
|
|
29
45
|
* ## Terminals are owned
|
|
30
46
|
*
|
|
@@ -42,6 +58,7 @@
|
|
|
42
58
|
* {@link KubernetesSandboxGoneError} (the cluster deleted it — the lease
|
|
43
59
|
* renewal found the object already gone).
|
|
44
60
|
*/
|
|
61
|
+
import { walkFilesViaExec } from '@namzu/sdk';
|
|
45
62
|
import { OperationDeadline } from '../readiness.js';
|
|
46
63
|
import { RemoteCancellationUnknownError, } from '../remote-execution-controller.js';
|
|
47
64
|
import { KubernetesLeaseRenewal } from './lease.js';
|
|
@@ -99,6 +116,9 @@ export function buildKubernetesSandbox(options) {
|
|
|
99
116
|
// line carrying an id is also a `kubectl get sandbox` argument.
|
|
100
117
|
const id = options.name;
|
|
101
118
|
const transport = options.transport;
|
|
119
|
+
// Captured as a const so the conditional member below narrows: the method
|
|
120
|
+
// is on the handle if and only if this is defined, decided once, here.
|
|
121
|
+
const setNetworkPolicy = options.setNetworkPolicy;
|
|
102
122
|
let lifecycle = 'active';
|
|
103
123
|
let activeExecutions = 0;
|
|
104
124
|
let teardownPromise;
|
|
@@ -186,6 +206,28 @@ export function buildKubernetesSandbox(options) {
|
|
|
186
206
|
}));
|
|
187
207
|
return retirementPromise;
|
|
188
208
|
};
|
|
209
|
+
/**
|
|
210
|
+
* What an unconfirmed cancellation does to THIS sandbox: retire it, or
|
|
211
|
+
* whatever the owner's hook decided instead — see
|
|
212
|
+
* {@link KubernetesSandboxBaseOptions.onUnconfirmedCancellation}.
|
|
213
|
+
*/
|
|
214
|
+
const observeUnconfirmedCancellation = async (error) => {
|
|
215
|
+
const decide = options.onUnconfirmedCancellation;
|
|
216
|
+
if (decide === undefined)
|
|
217
|
+
return await retire();
|
|
218
|
+
try {
|
|
219
|
+
return await decide(error);
|
|
220
|
+
}
|
|
221
|
+
catch (hookError) {
|
|
222
|
+
// The caller is already receiving `error`; a hook that threw must
|
|
223
|
+
// not replace it, and must not be reported as a teardown that was
|
|
224
|
+
// attempted either.
|
|
225
|
+
return {
|
|
226
|
+
accepted: false,
|
|
227
|
+
error: hookError instanceof Error ? hookError : new Error(String(hookError)),
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
};
|
|
189
231
|
const runExecution = async (operation, run) => {
|
|
190
232
|
assertAdmissible(operation);
|
|
191
233
|
activeExecutions += 1;
|
|
@@ -194,7 +236,7 @@ export function buildKubernetesSandbox(options) {
|
|
|
194
236
|
}
|
|
195
237
|
catch (error) {
|
|
196
238
|
if (error instanceof RemoteCancellationUnknownError) {
|
|
197
|
-
error.retirement = await
|
|
239
|
+
error.retirement = await observeUnconfirmedCancellation(error);
|
|
198
240
|
}
|
|
199
241
|
throw error;
|
|
200
242
|
}
|
|
@@ -221,20 +263,59 @@ export function buildKubernetesSandbox(options) {
|
|
|
221
263
|
* Every `tcp` request dials a fresh connection, so its envelope is
|
|
222
264
|
* also that connection's first, not-yet-authenticated frame and is
|
|
223
265
|
* bounded by the guest's pre-auth frame ceiling (8 MiB by default).
|
|
224
|
-
*
|
|
225
|
-
*
|
|
226
|
-
*
|
|
227
|
-
*
|
|
266
|
+
* A body above it is no longer a refusal: the transport splits it
|
|
267
|
+
* into parts that each fit, writes them to a temporary sibling of
|
|
268
|
+
* the target and finishes with an atomic rename, so this method
|
|
269
|
+
* takes a body of any size the transport's `maxWriteFileBytes`
|
|
270
|
+
* admits (1 GiB by default). The named refusals that remain are
|
|
271
|
+
* passed through unwrapped so a caller can catch them BY CLASS:
|
|
272
|
+
* `AgentWriteFileTooLargeError` for a body above that bound, and
|
|
273
|
+
* `AgentPreauthFrameTooLargeError` for an oversized body against a
|
|
274
|
+
* guest too old to advertise the part protocol.
|
|
228
275
|
*/
|
|
229
276
|
async writeFile(path, content) {
|
|
230
277
|
assertAdmissible('writeFile');
|
|
231
278
|
const buf = Buffer.isBuffer(content) ? content : Buffer.from(content, 'utf8');
|
|
232
279
|
await transport.writeFile(path, buf);
|
|
233
280
|
},
|
|
234
|
-
|
|
281
|
+
/**
|
|
282
|
+
* A whole-file read is served by the guest's streamed op when the
|
|
283
|
+
* guest advertises it, so neither side holds the file's base64 form
|
|
284
|
+
* or its JSON envelope in one piece and a file of any size this
|
|
285
|
+
* workspace's disk holds can be read. `offset`/`length` ask for one
|
|
286
|
+
* slice instead; a guest too old to honour them is refused with
|
|
287
|
+
* `AgentReadFileStreamUnsupportedError` rather than answering with
|
|
288
|
+
* the whole file.
|
|
289
|
+
*/
|
|
290
|
+
async readFile(path, readOptions) {
|
|
235
291
|
assertAdmissible('readFile');
|
|
236
|
-
return await transport.readFile(path);
|
|
292
|
+
return await transport.readFile(path, readOptions);
|
|
237
293
|
},
|
|
294
|
+
/**
|
|
295
|
+
* Chunks, in order, with nothing whole at either end — what a host
|
|
296
|
+
* draining a large output file before `destroy()` needs. The
|
|
297
|
+
* admissibility check runs at the call, not per chunk: a workspace
|
|
298
|
+
* suspended mid-stream takes its pod's connection with it, which is
|
|
299
|
+
* what ends the iteration.
|
|
300
|
+
*/
|
|
301
|
+
readFileStream(path, readOptions) {
|
|
302
|
+
assertAdmissible('readFileStream');
|
|
303
|
+
return transport.readFileStream(path, readOptions);
|
|
304
|
+
},
|
|
305
|
+
// Present only when the backend was configured for per-sandbox egress
|
|
306
|
+
// — see {@link KubernetesSandboxBaseOptions.setNetworkPolicy}. The
|
|
307
|
+
// admissibility gate is this file's, not the writer's, so a destroyed
|
|
308
|
+
// or cluster-removed sandbox refuses BY NAME here, exactly as every
|
|
309
|
+
// other method does, rather than failing at the API server one round
|
|
310
|
+
// trip later.
|
|
311
|
+
...(setNetworkPolicy !== undefined
|
|
312
|
+
? {
|
|
313
|
+
setNetworkPolicy: async (policy) => {
|
|
314
|
+
assertAdmissible('setNetworkPolicy');
|
|
315
|
+
await setNetworkPolicy(policy);
|
|
316
|
+
},
|
|
317
|
+
}
|
|
318
|
+
: {}),
|
|
238
319
|
async openTerminal(terminalOptions) {
|
|
239
320
|
assertAdmissible('openTerminal');
|
|
240
321
|
const terminal = await transport.openTerminal(terminalOptions);
|
|
@@ -270,6 +351,59 @@ export function buildKubernetesSandbox(options) {
|
|
|
270
351
|
return entries;
|
|
271
352
|
});
|
|
272
353
|
},
|
|
354
|
+
/**
|
|
355
|
+
* Bounded, lazy file discovery — the method the SDK's `glob` and
|
|
356
|
+
* `grep` builtins refuse a sandbox for not having.
|
|
357
|
+
*
|
|
358
|
+
* Built on {@link walkFilesViaExec}, the same host-side enumerator the
|
|
359
|
+
* Firecracker and docker backends use, over this transport's `exec`:
|
|
360
|
+
* the guest needs no new agent op, because the walk IS an execution —
|
|
361
|
+
* `node -e` running the SDK's own walk program and streaming one JSONL
|
|
362
|
+
* record per match. The guest image is `node:22-bookworm-slim` (see
|
|
363
|
+
* `k8s/Dockerfile`) and the agent is itself node, so node on the
|
|
364
|
+
* guest's PATH is a precondition of the agent existing rather than a
|
|
365
|
+
* new requirement this method introduces.
|
|
366
|
+
*
|
|
367
|
+
* Ownership is the same as `exec`'s, and deliberately NOT
|
|
368
|
+
* `runExecution`'s: that helper wraps one awaited call, and a walk is a
|
|
369
|
+
* sequence of them. `activeExecutions` is therefore held for the whole
|
|
370
|
+
* walk rather than per entry — `status` reads `busy` from the first
|
|
371
|
+
* `next()` to the last, never flapping between yields — and an
|
|
372
|
+
* unconfirmed cancellation retires this handle exactly as a failed
|
|
373
|
+
* `exec` cancel does, on the same error class and through the same
|
|
374
|
+
* `retire()`.
|
|
375
|
+
*
|
|
376
|
+
* Cancellation: `options.signal` and the consumer's own
|
|
377
|
+
* `iterator.return()` both abort the underlying `exec`, which sends
|
|
378
|
+
* the guest a `cancel-execution` and kills the walk's process group —
|
|
379
|
+
* so breaking out of the loop after five entries leaves nothing
|
|
380
|
+
* running in the pod.
|
|
381
|
+
*/
|
|
382
|
+
async *walkFiles(rootPath, walkOptions) {
|
|
383
|
+
assertAdmissible('walkFiles');
|
|
384
|
+
activeExecutions += 1;
|
|
385
|
+
try {
|
|
386
|
+
yield* walkFilesViaExec(async (command, argv, execOpts) => await transport.exec(command, argv, execOpts), rootPath, walkOptions);
|
|
387
|
+
}
|
|
388
|
+
catch (error) {
|
|
389
|
+
// The same rule `runExecution` applies, inlined because a
|
|
390
|
+
// generator cannot be wrapped by it: a command whose
|
|
391
|
+
// cancellation the guest could not confirm may still be running
|
|
392
|
+
// in that pod, so the pod stops being reusable.
|
|
393
|
+
//
|
|
394
|
+
// TWO SITES, ONE RULE. This block and `runExecution`'s must
|
|
395
|
+
// change together — #480, which owns the unconfirmed-cancel
|
|
396
|
+
// rule for this backend, is the next change to both, and a
|
|
397
|
+
// change that lands in one of them is a bug in the other.
|
|
398
|
+
if (error instanceof RemoteCancellationUnknownError) {
|
|
399
|
+
error.retirement = await retire();
|
|
400
|
+
}
|
|
401
|
+
throw error;
|
|
402
|
+
}
|
|
403
|
+
finally {
|
|
404
|
+
activeExecutions = Math.max(0, activeExecutions - 1);
|
|
405
|
+
}
|
|
406
|
+
},
|
|
273
407
|
async destroy(destroyOptions) {
|
|
274
408
|
if (retirementPromise) {
|
|
275
409
|
const observation = await retirementPromise;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../../src/backends/kubernetes/sandbox.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../../src/backends/kubernetes/sandbox.ts"],"names":[],"mappings":"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"}
|