@namzu/sandbox 13.0.0 → 14.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 +309 -0
- package/README.md +151 -0
- package/dist/backends/firecracker/protocol.d.ts +22 -0
- package/dist/backends/firecracker/protocol.d.ts.map +1 -1
- package/dist/backends/firecracker/protocol.js.map +1 -1
- package/dist/backends/firecracker/transport.d.ts +104 -9
- package/dist/backends/firecracker/transport.d.ts.map +1 -1
- package/dist/backends/firecracker/transport.js +139 -13
- package/dist/backends/firecracker/transport.js.map +1 -1
- package/dist/backends/kubernetes/egress-policy.d.ts +219 -0
- package/dist/backends/kubernetes/egress-policy.d.ts.map +1 -0
- package/dist/backends/kubernetes/egress-policy.js +314 -0
- package/dist/backends/kubernetes/egress-policy.js.map +1 -0
- package/dist/backends/kubernetes/index.d.ts +374 -0
- package/dist/backends/kubernetes/index.d.ts.map +1 -0
- package/dist/backends/kubernetes/index.js +671 -0
- package/dist/backends/kubernetes/index.js.map +1 -0
- package/dist/backends/kubernetes/k8s-client.d.ts +125 -0
- package/dist/backends/kubernetes/k8s-client.d.ts.map +1 -0
- package/dist/backends/kubernetes/k8s-client.js +246 -0
- package/dist/backends/kubernetes/k8s-client.js.map +1 -0
- package/dist/backends/kubernetes/lease.d.ts +119 -0
- package/dist/backends/kubernetes/lease.d.ts.map +1 -0
- package/dist/backends/kubernetes/lease.js +151 -0
- package/dist/backends/kubernetes/lease.js.map +1 -0
- package/dist/backends/kubernetes/objects.d.ts +282 -0
- package/dist/backends/kubernetes/objects.d.ts.map +1 -0
- package/dist/backends/kubernetes/objects.js +156 -0
- package/dist/backends/kubernetes/objects.js.map +1 -0
- package/dist/backends/kubernetes/privilege-probe.d.ts +136 -0
- package/dist/backends/kubernetes/privilege-probe.d.ts.map +1 -0
- package/dist/backends/kubernetes/privilege-probe.js +185 -0
- package/dist/backends/kubernetes/privilege-probe.js.map +1 -0
- package/dist/backends/kubernetes/sandbox.d.ts +123 -0
- package/dist/backends/kubernetes/sandbox.d.ts.map +1 -0
- package/dist/backends/kubernetes/sandbox.js +299 -0
- package/dist/backends/kubernetes/sandbox.js.map +1 -0
- package/dist/backends/kubernetes/transport.d.ts +122 -0
- package/dist/backends/kubernetes/transport.d.ts.map +1 -0
- package/dist/backends/kubernetes/transport.js +197 -0
- package/dist/backends/kubernetes/transport.js.map +1 -0
- package/dist/backends/kubernetes/workspace.d.ts +381 -0
- package/dist/backends/kubernetes/workspace.d.ts.map +1 -0
- package/dist/backends/kubernetes/workspace.js +1064 -0
- package/dist/backends/kubernetes/workspace.js.map +1 -0
- package/dist/index.d.ts +132 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +102 -34
- package/dist/index.js.map +1 -1
- package/dist/testing/sandbox-conformance.d.ts +193 -0
- package/dist/testing/sandbox-conformance.d.ts.map +1 -0
- package/dist/testing/sandbox-conformance.js +465 -0
- package/dist/testing/sandbox-conformance.js.map +1 -0
- package/package.json +5 -4
- package/src/backends/firecracker/protocol.ts +27 -0
- package/src/backends/firecracker/transport.ts +199 -28
- package/src/backends/kubernetes/egress-policy.ts +437 -0
- package/src/backends/kubernetes/index.ts +1012 -0
- package/src/backends/kubernetes/k8s-client.ts +352 -0
- package/src/backends/kubernetes/lease.ts +198 -0
- package/src/backends/kubernetes/objects.ts +363 -0
- package/src/backends/kubernetes/privilege-probe.ts +261 -0
- package/src/backends/kubernetes/sandbox.ts +395 -0
- package/src/backends/kubernetes/transport.ts +286 -0
- package/src/backends/kubernetes/workspace.ts +1386 -0
- package/src/index.ts +257 -35
- package/src/testing/sandbox-conformance.ts +667 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/backends/kubernetes/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal Kubernetes API client: bare fetch/https transport plus in-cluster
|
|
3
|
+
* ServiceAccount bootstrap.
|
|
4
|
+
*
|
|
5
|
+
* Sibling of the ACI and Firecracker control-plane clients: same
|
|
6
|
+
* dependency-free shape, different API. No `@kubernetes/client-node`, no
|
|
7
|
+
* kubeconfig parsing, no exec-credential-plugin invocation, no YAML anywhere
|
|
8
|
+
* — `@namzu/sandbox` still declares zero runtime `dependencies` after this
|
|
9
|
+
* module.
|
|
10
|
+
*
|
|
11
|
+
* ## Auth / SDK-dependency boundary
|
|
12
|
+
* Two access sources, neither needing a YAML parser:
|
|
13
|
+
* - `{ inCluster: true }` reads the projected ServiceAccount volume
|
|
14
|
+
* (`token`, `ca.crt`, `namespace`) plus `KUBERNETES_SERVICE_HOST` /
|
|
15
|
+
* `KUBERNETES_SERVICE_PORT` — pure file + env reads, the same boundary
|
|
16
|
+
* `kubectl` itself uses inside a pod. The token file is re-read on EVERY
|
|
17
|
+
* request because kubelet rotates projected tokens under the pod; caching
|
|
18
|
+
* it would produce an intermittent 401 hours into a long-lived host
|
|
19
|
+
* process.
|
|
20
|
+
* - `{ server, ca?, getToken }` supplied by the caller mirrors ACI's
|
|
21
|
+
* `ArmTokenProvider` and Firecracker's `OrchestratorTokenProvider`
|
|
22
|
+
* (`../aci-standby-pool/index.ts`, `../firecracker/index.ts`). Kubeconfig
|
|
23
|
+
* parsing, context merging and exec-credential-plugin invocation
|
|
24
|
+
* (kubelogin, gcloud, aws-iam-authenticator, ...) all stay OUTSIDE this
|
|
25
|
+
* package; the caller resolves a bearer token however it likes.
|
|
26
|
+
*
|
|
27
|
+
* ## Transport
|
|
28
|
+
* Default path is bare global `fetch`. When a custom CA is present — always
|
|
29
|
+
* true in-cluster, since the cluster CA is never in the process's system
|
|
30
|
+
* trust store — the call goes through `node:https.request` with that `ca`
|
|
31
|
+
* and `rejectUnauthorized: true` instead, exactly as
|
|
32
|
+
* `../firecracker/index.ts` splits `fetchOrchestratorRequest` from
|
|
33
|
+
* `httpsOrchestratorRequest` ("the package declares no undici dependency").
|
|
34
|
+
*
|
|
35
|
+
* ## Status mapping
|
|
36
|
+
* 404/410 become an `AlreadyGoneError` sentinel a teardown path can treat as
|
|
37
|
+
* success (ACI's `armCall(..., [404, 410])` accepts the same pair for
|
|
38
|
+
* exactly that reason — see `../aci-standby-pool/index.ts`). 409 becomes a
|
|
39
|
+
* `ConflictError` an adoption/retry path can catch. 401/403 become a
|
|
40
|
+
* `CredentialError` naming the attempted verb and resource — never the
|
|
41
|
+
* token, which this module never logs or embeds in any thrown message.
|
|
42
|
+
*
|
|
43
|
+
* ## Not in v1
|
|
44
|
+
* No watch, no informers, no resourceVersion/bookmark tracking. Readiness is
|
|
45
|
+
* polled by the caller with `../readiness.js`'s `OperationDeadline`, exactly
|
|
46
|
+
* as ACI polls `provisioningState`.
|
|
47
|
+
*/
|
|
48
|
+
/** The only verbs anything in this backend needs to send. */
|
|
49
|
+
export type KubernetesHttpMethod = 'GET' | 'POST' | 'PATCH' | 'DELETE';
|
|
50
|
+
/**
|
|
51
|
+
* Authentication callback. Caller returns a fresh bearer token. Invoked on
|
|
52
|
+
* every request so a long-running host survives token rotation — the same
|
|
53
|
+
* contract as ACI's `ArmTokenProvider` and Firecracker's
|
|
54
|
+
* `OrchestratorTokenProvider`.
|
|
55
|
+
*/
|
|
56
|
+
export type KubernetesTokenProvider = () => Promise<string>;
|
|
57
|
+
/**
|
|
58
|
+
* In-cluster bootstrap. The token, CA and namespace come off the projected
|
|
59
|
+
* ServiceAccount volume; the API server address comes off the env vars the
|
|
60
|
+
* kubelet always sets for the pod's default-namespace Service.
|
|
61
|
+
*/
|
|
62
|
+
export interface InClusterKubernetesAccess {
|
|
63
|
+
readonly inCluster: true;
|
|
64
|
+
/**
|
|
65
|
+
* Overridable so tests never touch the real projected-volume path.
|
|
66
|
+
* Defaults to `/var/run/secrets/kubernetes.io/serviceaccount`.
|
|
67
|
+
*/
|
|
68
|
+
readonly serviceAccountDir?: string;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Caller-supplied server + credential (see {@link KubernetesTokenProvider}).
|
|
72
|
+
* `namespace` is required here because, unlike the in-cluster path, there is
|
|
73
|
+
* no ServiceAccount file to read it from — the caller must say which
|
|
74
|
+
* namespace this client operates in.
|
|
75
|
+
*/
|
|
76
|
+
export interface ExplicitKubernetesAccess {
|
|
77
|
+
readonly inCluster?: false;
|
|
78
|
+
readonly server: string;
|
|
79
|
+
readonly namespace: string;
|
|
80
|
+
/** Custom cluster CA. Present → the client dials over `node:https`. */
|
|
81
|
+
readonly ca?: string | Buffer;
|
|
82
|
+
readonly getToken: KubernetesTokenProvider;
|
|
83
|
+
}
|
|
84
|
+
export type KubernetesAccess = InClusterKubernetesAccess | ExplicitKubernetesAccess;
|
|
85
|
+
export interface KubernetesClient {
|
|
86
|
+
/**
|
|
87
|
+
* `path` is the API-server path (e.g.
|
|
88
|
+
* `/apis/agents.x-k8s.io/v1/namespaces/ns/sandboxclaims/id`), not a full
|
|
89
|
+
* URL. Returns the parsed JSON body, or `undefined` for a 204 or an empty
|
|
90
|
+
* body. Rejects with {@link KubernetesAlreadyGoneError},
|
|
91
|
+
* {@link KubernetesConflictError} or {@link KubernetesCredentialError} for
|
|
92
|
+
* the status codes each names; any other non-2xx status rejects with a
|
|
93
|
+
* plain `Error`.
|
|
94
|
+
*/
|
|
95
|
+
request<T>(method: KubernetesHttpMethod, path: string, body?: unknown, signal?: AbortSignal): Promise<T | undefined>;
|
|
96
|
+
/** From the ServiceAccount file in-cluster, from config otherwise. */
|
|
97
|
+
namespace(): string;
|
|
98
|
+
}
|
|
99
|
+
/** 404/410 → this. A teardown path treats it as "already achieved". */
|
|
100
|
+
export declare class KubernetesAlreadyGoneError extends Error {
|
|
101
|
+
readonly method: KubernetesHttpMethod;
|
|
102
|
+
readonly resource: string;
|
|
103
|
+
readonly status: number;
|
|
104
|
+
constructor(method: KubernetesHttpMethod, resource: string, status: number);
|
|
105
|
+
}
|
|
106
|
+
/** 409 → this. An adoption/retry path can catch it and re-read + retry. */
|
|
107
|
+
export declare class KubernetesConflictError extends Error {
|
|
108
|
+
readonly method: KubernetesHttpMethod;
|
|
109
|
+
readonly resource: string;
|
|
110
|
+
constructor(method: KubernetesHttpMethod, resource: string);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* 401/403 → this. Names the attempted verb and resource only — never the
|
|
114
|
+
* token, and never the response body (the API server does not echo the
|
|
115
|
+
* token back, but the body is untrusted content this module has no reason
|
|
116
|
+
* to repeat into a thrown message).
|
|
117
|
+
*/
|
|
118
|
+
export declare class KubernetesCredentialError extends Error {
|
|
119
|
+
readonly verb: KubernetesHttpMethod;
|
|
120
|
+
readonly resource: string;
|
|
121
|
+
readonly status: number;
|
|
122
|
+
constructor(verb: KubernetesHttpMethod, resource: string, status: number);
|
|
123
|
+
}
|
|
124
|
+
export declare function createKubernetesClient(access: KubernetesAccess): KubernetesClient;
|
|
125
|
+
//# sourceMappingURL=k8s-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"k8s-client.d.ts","sourceRoot":"","sources":["../../../src/backends/kubernetes/k8s-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAKH,6DAA6D;AAC7D,MAAM,MAAM,oBAAoB,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAA;AAEtE;;;;;GAKG;AACH,MAAM,MAAM,uBAAuB,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,CAAA;AAE3D;;;;GAIG;AACH,MAAM,WAAW,yBAAyB;IACzC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAA;IACxB;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;CACnC;AAED;;;;;GAKG;AACH,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,CAAA;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,uEAAuE;IACvE,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC7B,QAAQ,CAAC,QAAQ,EAAE,uBAAuB,CAAA;CAC1C;AAED,MAAM,MAAM,gBAAgB,GAAG,yBAAyB,GAAG,wBAAwB,CAAA;AAEnF,MAAM,WAAW,gBAAgB;IAChC;;;;;;;;OAQG;IACH,OAAO,CAAC,CAAC,EACR,MAAM,EAAE,oBAAoB,EAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,EACd,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAA;IACzB,sEAAsE;IACtE,SAAS,IAAI,MAAM,CAAA;CACnB;AAID,uEAAuE;AACvE,qBAAa,0BAA2B,SAAQ,KAAK;IAEnD,QAAQ,CAAC,MAAM,EAAE,oBAAoB;IACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM;gBAFd,MAAM,EAAE,oBAAoB,EAC5B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM;CAKxB;AAED,2EAA2E;AAC3E,qBAAa,uBAAwB,SAAQ,KAAK;IAEhD,QAAQ,CAAC,MAAM,EAAE,oBAAoB;IACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM;gBADhB,MAAM,EAAE,oBAAoB,EAC5B,QAAQ,EAAE,MAAM;CAK1B;AAED;;;;;GAKG;AACH,qBAAa,yBAA0B,SAAQ,KAAK;IAElD,QAAQ,CAAC,IAAI,EAAE,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM;gBAFd,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM;CAKxB;AAoID,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,CAkEjF"}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal Kubernetes API client: bare fetch/https transport plus in-cluster
|
|
3
|
+
* ServiceAccount bootstrap.
|
|
4
|
+
*
|
|
5
|
+
* Sibling of the ACI and Firecracker control-plane clients: same
|
|
6
|
+
* dependency-free shape, different API. No `@kubernetes/client-node`, no
|
|
7
|
+
* kubeconfig parsing, no exec-credential-plugin invocation, no YAML anywhere
|
|
8
|
+
* — `@namzu/sandbox` still declares zero runtime `dependencies` after this
|
|
9
|
+
* module.
|
|
10
|
+
*
|
|
11
|
+
* ## Auth / SDK-dependency boundary
|
|
12
|
+
* Two access sources, neither needing a YAML parser:
|
|
13
|
+
* - `{ inCluster: true }` reads the projected ServiceAccount volume
|
|
14
|
+
* (`token`, `ca.crt`, `namespace`) plus `KUBERNETES_SERVICE_HOST` /
|
|
15
|
+
* `KUBERNETES_SERVICE_PORT` — pure file + env reads, the same boundary
|
|
16
|
+
* `kubectl` itself uses inside a pod. The token file is re-read on EVERY
|
|
17
|
+
* request because kubelet rotates projected tokens under the pod; caching
|
|
18
|
+
* it would produce an intermittent 401 hours into a long-lived host
|
|
19
|
+
* process.
|
|
20
|
+
* - `{ server, ca?, getToken }` supplied by the caller mirrors ACI's
|
|
21
|
+
* `ArmTokenProvider` and Firecracker's `OrchestratorTokenProvider`
|
|
22
|
+
* (`../aci-standby-pool/index.ts`, `../firecracker/index.ts`). Kubeconfig
|
|
23
|
+
* parsing, context merging and exec-credential-plugin invocation
|
|
24
|
+
* (kubelogin, gcloud, aws-iam-authenticator, ...) all stay OUTSIDE this
|
|
25
|
+
* package; the caller resolves a bearer token however it likes.
|
|
26
|
+
*
|
|
27
|
+
* ## Transport
|
|
28
|
+
* Default path is bare global `fetch`. When a custom CA is present — always
|
|
29
|
+
* true in-cluster, since the cluster CA is never in the process's system
|
|
30
|
+
* trust store — the call goes through `node:https.request` with that `ca`
|
|
31
|
+
* and `rejectUnauthorized: true` instead, exactly as
|
|
32
|
+
* `../firecracker/index.ts` splits `fetchOrchestratorRequest` from
|
|
33
|
+
* `httpsOrchestratorRequest` ("the package declares no undici dependency").
|
|
34
|
+
*
|
|
35
|
+
* ## Status mapping
|
|
36
|
+
* 404/410 become an `AlreadyGoneError` sentinel a teardown path can treat as
|
|
37
|
+
* success (ACI's `armCall(..., [404, 410])` accepts the same pair for
|
|
38
|
+
* exactly that reason — see `../aci-standby-pool/index.ts`). 409 becomes a
|
|
39
|
+
* `ConflictError` an adoption/retry path can catch. 401/403 become a
|
|
40
|
+
* `CredentialError` naming the attempted verb and resource — never the
|
|
41
|
+
* token, which this module never logs or embeds in any thrown message.
|
|
42
|
+
*
|
|
43
|
+
* ## Not in v1
|
|
44
|
+
* No watch, no informers, no resourceVersion/bookmark tracking. Readiness is
|
|
45
|
+
* polled by the caller with `../readiness.js`'s `OperationDeadline`, exactly
|
|
46
|
+
* as ACI polls `provisioningState`.
|
|
47
|
+
*/
|
|
48
|
+
import { readFileSync } from 'node:fs';
|
|
49
|
+
import https from 'node:https';
|
|
50
|
+
const DEFAULT_SERVICE_ACCOUNT_DIR = '/var/run/secrets/kubernetes.io/serviceaccount';
|
|
51
|
+
/** 404/410 → this. A teardown path treats it as "already achieved". */
|
|
52
|
+
export class KubernetesAlreadyGoneError extends Error {
|
|
53
|
+
method;
|
|
54
|
+
resource;
|
|
55
|
+
status;
|
|
56
|
+
constructor(method, resource, status) {
|
|
57
|
+
super(`kubernetes ${method} ${resource} -> ${status}: already gone`);
|
|
58
|
+
this.method = method;
|
|
59
|
+
this.resource = resource;
|
|
60
|
+
this.status = status;
|
|
61
|
+
this.name = 'KubernetesAlreadyGoneError';
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/** 409 → this. An adoption/retry path can catch it and re-read + retry. */
|
|
65
|
+
export class KubernetesConflictError extends Error {
|
|
66
|
+
method;
|
|
67
|
+
resource;
|
|
68
|
+
constructor(method, resource) {
|
|
69
|
+
super(`kubernetes ${method} ${resource} -> 409: conflict`);
|
|
70
|
+
this.method = method;
|
|
71
|
+
this.resource = resource;
|
|
72
|
+
this.name = 'KubernetesConflictError';
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* 401/403 → this. Names the attempted verb and resource only — never the
|
|
77
|
+
* token, and never the response body (the API server does not echo the
|
|
78
|
+
* token back, but the body is untrusted content this module has no reason
|
|
79
|
+
* to repeat into a thrown message).
|
|
80
|
+
*/
|
|
81
|
+
export class KubernetesCredentialError extends Error {
|
|
82
|
+
verb;
|
|
83
|
+
resource;
|
|
84
|
+
status;
|
|
85
|
+
constructor(verb, resource, status) {
|
|
86
|
+
super(`kubernetes API refused ${verb} ${resource}: ${status}`);
|
|
87
|
+
this.verb = verb;
|
|
88
|
+
this.resource = resource;
|
|
89
|
+
this.status = status;
|
|
90
|
+
this.name = 'KubernetesCredentialError';
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function stripTrailingSlash(url) {
|
|
94
|
+
return url.endsWith('/') ? url.slice(0, -1) : url;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Reads `ca.crt` and `namespace` once (they do not rotate for the pod's
|
|
98
|
+
* lifetime); returns a `getToken` closure that re-reads `token` on every
|
|
99
|
+
* call, because kubelet DOES rotate the projected token under a live pod.
|
|
100
|
+
*/
|
|
101
|
+
function resolveInCluster(access) {
|
|
102
|
+
const dir = access.serviceAccountDir ?? DEFAULT_SERVICE_ACCOUNT_DIR;
|
|
103
|
+
const host = process.env.KUBERNETES_SERVICE_HOST;
|
|
104
|
+
const port = process.env.KUBERNETES_SERVICE_PORT;
|
|
105
|
+
if (host === undefined || host === '' || port === undefined || port === '') {
|
|
106
|
+
throw new Error('kubernetes: in-cluster access requires KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT');
|
|
107
|
+
}
|
|
108
|
+
const ca = readFileSync(`${dir}/ca.crt`);
|
|
109
|
+
const namespace = readFileSync(`${dir}/namespace`, 'utf8').trim();
|
|
110
|
+
return {
|
|
111
|
+
baseUrl: `https://${host}:${port}`,
|
|
112
|
+
ca,
|
|
113
|
+
namespace,
|
|
114
|
+
getToken: async () => readFileSync(`${dir}/token`, 'utf8').trim(),
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
function resolveExplicit(access) {
|
|
118
|
+
return {
|
|
119
|
+
baseUrl: stripTrailingSlash(access.server),
|
|
120
|
+
ca: access.ca,
|
|
121
|
+
namespace: access.namespace,
|
|
122
|
+
getToken: access.getToken,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
/** The plain-`fetch` path — the DEFAULT, used whenever no custom CA is set. */
|
|
126
|
+
async function fetchRequest(url, method, headers, payload, signal) {
|
|
127
|
+
const init = { method, headers };
|
|
128
|
+
if (payload !== undefined)
|
|
129
|
+
init.body = payload;
|
|
130
|
+
if (signal !== undefined)
|
|
131
|
+
init.signal = signal;
|
|
132
|
+
const res = await fetch(url, init);
|
|
133
|
+
return {
|
|
134
|
+
status: res.status,
|
|
135
|
+
contentType: res.headers.get('content-type') ?? '',
|
|
136
|
+
text: () => res.text(),
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* The custom-CA path: a `node:https` request presenting the injected `ca`
|
|
141
|
+
* and verifying the API server's cert against it (`rejectUnauthorized:
|
|
142
|
+
* true`). `node:https` is used rather than fetch+a custom dispatcher because
|
|
143
|
+
* the package declares no undici dependency — `node:https` is always
|
|
144
|
+
* importable and needs nothing added (mirrors
|
|
145
|
+
* `../firecracker/index.ts`'s `httpsOrchestratorRequest`).
|
|
146
|
+
*/
|
|
147
|
+
function httpsRequest(url, method, headers, payload, ca, signal) {
|
|
148
|
+
const target = new URL(url);
|
|
149
|
+
return new Promise((resolve, reject) => {
|
|
150
|
+
const req = https.request({
|
|
151
|
+
protocol: target.protocol,
|
|
152
|
+
hostname: target.hostname,
|
|
153
|
+
port: target.port !== '' ? Number(target.port) : 443,
|
|
154
|
+
path: `${target.pathname}${target.search}`,
|
|
155
|
+
method,
|
|
156
|
+
headers,
|
|
157
|
+
ca,
|
|
158
|
+
rejectUnauthorized: true,
|
|
159
|
+
...(signal !== undefined ? { signal } : {}),
|
|
160
|
+
}, (res) => {
|
|
161
|
+
const chunks = [];
|
|
162
|
+
res.on('data', (chunk) => chunks.push(chunk));
|
|
163
|
+
res.on('end', () => {
|
|
164
|
+
const ct = res.headers['content-type'];
|
|
165
|
+
resolve({
|
|
166
|
+
status: res.statusCode ?? 0,
|
|
167
|
+
contentType: Array.isArray(ct) ? (ct[0] ?? '') : (ct ?? ''),
|
|
168
|
+
text: async () => Buffer.concat(chunks).toString('utf8'),
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
res.on('error', reject);
|
|
172
|
+
});
|
|
173
|
+
req.on('error', reject);
|
|
174
|
+
if (payload !== undefined)
|
|
175
|
+
req.write(payload);
|
|
176
|
+
req.end();
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* `PATCH` always carries a JSON MERGE patch body (RFC 7386) — never
|
|
181
|
+
* server-side apply, never YAML. `POST` carries a plain JSON create body.
|
|
182
|
+
* `GET`/`DELETE` normally carry no body; if a caller ever does pass one to
|
|
183
|
+
* `DELETE` it is sent as plain JSON.
|
|
184
|
+
*/
|
|
185
|
+
function contentTypeFor(method) {
|
|
186
|
+
return method === 'PATCH' ? 'application/merge-patch+json' : 'application/json';
|
|
187
|
+
}
|
|
188
|
+
export function createKubernetesClient(access) {
|
|
189
|
+
const resolved = access.inCluster === true ? resolveInCluster(access) : resolveExplicit(access);
|
|
190
|
+
async function request(method, path, body, signal) {
|
|
191
|
+
signal?.throwIfAborted();
|
|
192
|
+
const token = await resolved.getToken();
|
|
193
|
+
signal?.throwIfAborted();
|
|
194
|
+
const url = `${resolved.baseUrl}${path}`;
|
|
195
|
+
const payload = body !== undefined ? JSON.stringify(body) : undefined;
|
|
196
|
+
const headers = {
|
|
197
|
+
Authorization: `Bearer ${token}`,
|
|
198
|
+
Accept: 'application/json',
|
|
199
|
+
};
|
|
200
|
+
if (payload !== undefined)
|
|
201
|
+
headers['content-type'] = contentTypeFor(method);
|
|
202
|
+
let res;
|
|
203
|
+
try {
|
|
204
|
+
res =
|
|
205
|
+
resolved.ca !== undefined
|
|
206
|
+
? await httpsRequest(url, method, headers, payload, resolved.ca, signal)
|
|
207
|
+
: await fetchRequest(url, method, headers, payload, signal);
|
|
208
|
+
}
|
|
209
|
+
catch (err) {
|
|
210
|
+
throw new Error(`kubernetes ${method} ${path} failed: ${err instanceof Error ? err.message : String(err)}`, { cause: err });
|
|
211
|
+
}
|
|
212
|
+
if (res.status === 401 || res.status === 403) {
|
|
213
|
+
await res.text();
|
|
214
|
+
signal?.throwIfAborted();
|
|
215
|
+
throw new KubernetesCredentialError(method, path, res.status);
|
|
216
|
+
}
|
|
217
|
+
if (res.status === 404 || res.status === 410) {
|
|
218
|
+
await res.text();
|
|
219
|
+
signal?.throwIfAborted();
|
|
220
|
+
throw new KubernetesAlreadyGoneError(method, path, res.status);
|
|
221
|
+
}
|
|
222
|
+
if (res.status === 409) {
|
|
223
|
+
await res.text();
|
|
224
|
+
signal?.throwIfAborted();
|
|
225
|
+
throw new KubernetesConflictError(method, path);
|
|
226
|
+
}
|
|
227
|
+
if (res.status < 200 || res.status >= 300) {
|
|
228
|
+
const text = await res.text();
|
|
229
|
+
signal?.throwIfAborted();
|
|
230
|
+
throw new Error(`kubernetes ${method} ${path} -> ${res.status}: ${text}`);
|
|
231
|
+
}
|
|
232
|
+
if (res.status === 204)
|
|
233
|
+
return undefined;
|
|
234
|
+
if (res.contentType.includes('application/json')) {
|
|
235
|
+
const text = await res.text();
|
|
236
|
+
signal?.throwIfAborted();
|
|
237
|
+
return text.length > 0 ? JSON.parse(text) : undefined;
|
|
238
|
+
}
|
|
239
|
+
return undefined;
|
|
240
|
+
}
|
|
241
|
+
return {
|
|
242
|
+
request,
|
|
243
|
+
namespace: () => resolved.namespace,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=k8s-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"k8s-client.js","sourceRoot":"","sources":["../../../src/backends/kubernetes/k8s-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lease renewal for an acquired kubernetes sandbox.
|
|
3
|
+
*
|
|
4
|
+
* Acquire stamps an ABSOLUTE `shutdownTime` (now + `claimTtlSeconds`) plus
|
|
5
|
+
* `shutdownPolicy: Delete` onto every object it creates. That is the leak
|
|
6
|
+
* guard: a host that dies mid-run costs the cluster one expiry rather than a
|
|
7
|
+
* sandbox that lives forever. It is also, unrenewed, a deadline on the RUN —
|
|
8
|
+
* a session that outlives the TTL has its pod deleted underneath it, mid
|
|
9
|
+
* command, with no error the host can attribute to anything.
|
|
10
|
+
*
|
|
11
|
+
* The two requirements are not in tension, they just need a second half:
|
|
12
|
+
* a live handle renews its own lease, and a dead host stops renewing. So
|
|
13
|
+
* this timer is owned by the Sandbox handle, and `destroy()` stops it.
|
|
14
|
+
*
|
|
15
|
+
* ## The shape of the timer
|
|
16
|
+
*
|
|
17
|
+
* One `setTimeout` chained per tick, never `setInterval`: a renewal PATCH
|
|
18
|
+
* that takes longer than the interval must not queue a second one behind
|
|
19
|
+
* it. The interval is HALF the TTL, so a single failed tick still leaves a
|
|
20
|
+
* whole half-TTL of headroom for the next one to succeed, and it is
|
|
21
|
+
* jittered ±10% so a hundred handles acquired in the same second do not
|
|
22
|
+
* PATCH the API server in the same millisecond forever after.
|
|
23
|
+
*
|
|
24
|
+
* The timer is `unref`'d: a host process that has finished its work should
|
|
25
|
+
* exit, not linger because a sandbox handle is still counting. A handle
|
|
26
|
+
* nobody destroyed then expires on the cluster's clock exactly as an
|
|
27
|
+
* abandoned one does, which is the behaviour the TTL exists for.
|
|
28
|
+
*
|
|
29
|
+
* ## Every tick is bounded
|
|
30
|
+
*
|
|
31
|
+
* A renewal that FAILS is survivable — it is reported and retried with half
|
|
32
|
+
* a TTL of headroom. A renewal that HANGS is not: the next tick is scheduled
|
|
33
|
+
* only after the current one settles, so a PATCH that never answers parks
|
|
34
|
+
* the loop forever, reports nothing, and lets the lease expire in silence —
|
|
35
|
+
* precisely the defect this file exists to close, moved onto the failure
|
|
36
|
+
* path. An API server that accepts a connection and then never responds is
|
|
37
|
+
* an ordinary cluster event, so each PATCH runs under its own deadline: it
|
|
38
|
+
* aborts the request through the signal the client already takes, and an
|
|
39
|
+
* expiry is then just another reported failure that retries on the next
|
|
40
|
+
* tick.
|
|
41
|
+
*
|
|
42
|
+
* ## What each outcome means
|
|
43
|
+
*
|
|
44
|
+
* - Success → the object's expiry moves a full TTL into the future.
|
|
45
|
+
* - Any error, a tick that ran out of time included → reported to
|
|
46
|
+
* `onRenewalError` and RETRIED on the next tick. A transient API blip
|
|
47
|
+
* must not tear down a working sandbox, and there is still half a TTL of
|
|
48
|
+
* headroom.
|
|
49
|
+
* - Already gone (404/410) → the object this handle owns no longer exists.
|
|
50
|
+
* Nothing will bring it back, so the loop stops and the handle is marked
|
|
51
|
+
* gone; every later call fails with a named error instead of dialing an
|
|
52
|
+
* address whose pod the controller has already deleted.
|
|
53
|
+
*/
|
|
54
|
+
/** How far each tick pushes the expiry, and how often ticks happen. */
|
|
55
|
+
export interface LeaseRenewalOptions {
|
|
56
|
+
/** The same TTL acquire stamped. Each tick sets `now + ttlSeconds`. */
|
|
57
|
+
readonly ttlSeconds: number;
|
|
58
|
+
/**
|
|
59
|
+
* Send the merge patch. Rejects with whatever the client rejects with.
|
|
60
|
+
*
|
|
61
|
+
* The `signal` is the tick's own deadline and IS passed on every call —
|
|
62
|
+
* an implementation that drops it still gets abandoned on time, but its
|
|
63
|
+
* socket then stays open until the peer or the OS closes it.
|
|
64
|
+
*/
|
|
65
|
+
readonly renew: (shutdownTime: string, signal?: AbortSignal) => Promise<void>;
|
|
66
|
+
/** Called once, when the renewed object turns out to be gone. */
|
|
67
|
+
readonly onGone: () => void;
|
|
68
|
+
/**
|
|
69
|
+
* Every renewal failure that is not "already gone". `@namzu/sandbox` has
|
|
70
|
+
* no logger of its own and reads none from module scope, so a diagnostic
|
|
71
|
+
* this package cannot print is handed to the caller that can.
|
|
72
|
+
*/
|
|
73
|
+
readonly onRenewalError?: (error: unknown) => void;
|
|
74
|
+
/**
|
|
75
|
+
* Base interval between ticks. Defaults to half the TTL. Present so a
|
|
76
|
+
* test can drive many ticks in a few milliseconds without pretending a
|
|
77
|
+
* sub-second TTL is a realistic configuration.
|
|
78
|
+
*/
|
|
79
|
+
readonly intervalMs?: number;
|
|
80
|
+
/**
|
|
81
|
+
* How long ONE renewal PATCH may take before it is abandoned and retried.
|
|
82
|
+
* Defaults to a quarter of the interval, capped at
|
|
83
|
+
* {@link MAX_RENEWAL_TIMEOUT_MS} — a fraction rather than the whole
|
|
84
|
+
* interval so that a stalled API server still leaves the loop several
|
|
85
|
+
* attempts inside the half-TTL of headroom.
|
|
86
|
+
*/
|
|
87
|
+
readonly patchTimeoutMs?: number;
|
|
88
|
+
/** Deterministic jitter for tests. Defaults to `Math.random`. */
|
|
89
|
+
readonly random?: () => number;
|
|
90
|
+
}
|
|
91
|
+
export declare function jitteredInterval(baseMs: number, random: () => number): number;
|
|
92
|
+
/**
|
|
93
|
+
* The renewal loop. Start it when the handle is handed out, stop it on
|
|
94
|
+
* `destroy()`. Both are idempotent.
|
|
95
|
+
*/
|
|
96
|
+
export declare class KubernetesLeaseRenewal {
|
|
97
|
+
private readonly options;
|
|
98
|
+
private timer;
|
|
99
|
+
private stopped;
|
|
100
|
+
private started;
|
|
101
|
+
private readonly baseIntervalMs;
|
|
102
|
+
private readonly patchTimeoutMs;
|
|
103
|
+
private readonly random;
|
|
104
|
+
constructor(options: LeaseRenewalOptions);
|
|
105
|
+
/**
|
|
106
|
+
* The loop is alive: it has been started and not stopped. Deliberately
|
|
107
|
+
* NOT "a timer is pending" — `tick()` clears the timer before it awaits,
|
|
108
|
+
* so a liveness check written that way reads false for the whole duration
|
|
109
|
+
* of an in-flight renewal and would quietly pass against a loop that had
|
|
110
|
+
* parked forever inside one.
|
|
111
|
+
*/
|
|
112
|
+
get active(): boolean;
|
|
113
|
+
start(): void;
|
|
114
|
+
stop(): void;
|
|
115
|
+
private schedule;
|
|
116
|
+
/** Exposed for tests: one renewal attempt plus its scheduling decision. */
|
|
117
|
+
tick(): Promise<void>;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=lease.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lease.d.ts","sourceRoot":"","sources":["../../../src/backends/kubernetes/lease.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDG;AAKH,uEAAuE;AACvE,MAAM,WAAW,mBAAmB;IACnC,uEAAuE;IACvE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B;;;;;;OAMG;IACH,QAAQ,CAAC,KAAK,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7E,iEAAiE;IACjE,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,CAAA;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IAClD;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B;;;;;;OAMG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC,iEAAiE;IACjE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,MAAM,CAAA;CAC9B;AAaD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,MAAM,GAAG,MAAM,CAI7E;AAED;;;GAGG;AACH,qBAAa,sBAAsB;IAQtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAPpC,OAAO,CAAC,KAAK,CAA2C;IACxD,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;IACvC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;gBAER,OAAO,EAAE,mBAAmB;IAQzD;;;;;;OAMG;IACH,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,KAAK,IAAI,IAAI;IAMb,IAAI,IAAI,IAAI;IAQZ,OAAO,CAAC,QAAQ;IAahB,2EAA2E;IACrE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CA0B3B"}
|