alasio 7.0.0 → 9.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.
Files changed (161) hide show
  1. package/dist/cli/src/api-server.js +18 -0
  2. package/dist/cli/src/api-server.js.map +1 -0
  3. package/dist/cli/src/branches.js +123 -46
  4. package/dist/cli/src/branches.js.map +1 -1
  5. package/dist/cli/src/cluster/docker.js +25 -10
  6. package/dist/cli/src/cluster/docker.js.map +1 -1
  7. package/dist/cli/src/cluster/host.js +33 -7
  8. package/dist/cli/src/cluster/host.js.map +1 -1
  9. package/dist/cli/src/cluster/k3s.js +51 -12
  10. package/dist/cli/src/cluster/k3s.js.map +1 -1
  11. package/dist/cli/src/cluster/node.js +115 -33
  12. package/dist/cli/src/cluster/node.js.map +1 -1
  13. package/dist/cli/src/cluster/stargz.js +55 -0
  14. package/dist/cli/src/cluster/stargz.js.map +1 -0
  15. package/dist/cli/src/commands/branch.js +5 -4
  16. package/dist/cli/src/commands/branch.js.map +1 -1
  17. package/dist/cli/src/commands/common.js +9 -3
  18. package/dist/cli/src/commands/common.js.map +1 -1
  19. package/dist/cli/src/commands/folder.js +14 -0
  20. package/dist/cli/src/commands/folder.js.map +1 -0
  21. package/dist/cli/src/commands/init.js +54 -4
  22. package/dist/cli/src/commands/init.js.map +1 -1
  23. package/dist/cli/src/commands/lake.js +40 -6
  24. package/dist/cli/src/commands/lake.js.map +1 -1
  25. package/dist/cli/src/commands/restore-filer-store.js +40 -8
  26. package/dist/cli/src/commands/restore-filer-store.js.map +1 -1
  27. package/dist/cli/src/commands/status.js +216 -20
  28. package/dist/cli/src/commands/status.js.map +1 -1
  29. package/dist/cli/src/commands/uninstall.js +8 -9
  30. package/dist/cli/src/commands/uninstall.js.map +1 -1
  31. package/dist/cli/src/commands/up.js +11 -3
  32. package/dist/cli/src/commands/up.js.map +1 -1
  33. package/dist/cli/src/commands/upgrade.js +1 -1
  34. package/dist/cli/src/commands/upgrade.js.map +1 -1
  35. package/dist/cli/src/commands.js +2 -1
  36. package/dist/cli/src/commands.js.map +1 -1
  37. package/dist/cli/src/config.js +24 -9
  38. package/dist/cli/src/config.js.map +1 -1
  39. package/dist/cli/src/cpu-baseline.js +8 -4
  40. package/dist/cli/src/cpu-baseline.js.map +1 -1
  41. package/dist/cli/src/folders.js +67 -0
  42. package/dist/cli/src/folders.js.map +1 -0
  43. package/dist/cli/src/gateway-calls.js +58 -0
  44. package/dist/cli/src/gateway-calls.js.map +1 -0
  45. package/dist/cli/src/install.js +119 -17
  46. package/dist/cli/src/install.js.map +1 -1
  47. package/dist/cli/src/kept-releases.js +27 -20
  48. package/dist/cli/src/kept-releases.js.map +1 -1
  49. package/dist/cli/src/kube/api.js +11 -5
  50. package/dist/cli/src/kube/api.js.map +1 -1
  51. package/dist/cli/src/kube/apply.js +16 -73
  52. package/dist/cli/src/kube/apply.js.map +1 -1
  53. package/dist/cli/src/kube/rollout.js +84 -26
  54. package/dist/cli/src/kube/rollout.js.map +1 -1
  55. package/dist/cli/src/lake.js +124 -0
  56. package/dist/cli/src/lake.js.map +1 -0
  57. package/dist/cli/src/manifests/admission.js +381 -223
  58. package/dist/cli/src/manifests/admission.js.map +1 -1
  59. package/dist/cli/src/manifests/alasio.js +79 -362
  60. package/dist/cli/src/manifests/alasio.js.map +1 -1
  61. package/dist/cli/src/manifests/branch.js +10 -26
  62. package/dist/cli/src/manifests/branch.js.map +1 -1
  63. package/dist/cli/src/manifests/collector.js +250 -135
  64. package/dist/cli/src/manifests/collector.js.map +1 -1
  65. package/dist/cli/src/manifests/common.js +32 -2
  66. package/dist/cli/src/manifests/common.js.map +1 -1
  67. package/dist/cli/src/manifests/config.js +256 -92
  68. package/dist/cli/src/manifests/config.js.map +1 -1
  69. package/dist/cli/src/manifests/disruption.js +10 -0
  70. package/dist/cli/src/manifests/disruption.js.map +1 -1
  71. package/dist/cli/src/manifests/folders.js +128 -0
  72. package/dist/cli/src/manifests/folders.js.map +1 -0
  73. package/dist/cli/src/manifests/grafana.js +4 -2
  74. package/dist/cli/src/manifests/grafana.js.map +1 -1
  75. package/dist/cli/src/manifests/index.js +15 -8
  76. package/dist/cli/src/manifests/index.js.map +1 -1
  77. package/dist/cli/src/manifests/keda.js +2 -1
  78. package/dist/cli/src/manifests/keda.js.map +1 -1
  79. package/dist/cli/src/manifests/lake.js +350 -73
  80. package/dist/cli/src/manifests/lake.js.map +1 -1
  81. package/dist/cli/src/manifests/log.js +316 -0
  82. package/dist/cli/src/manifests/log.js.map +1 -0
  83. package/dist/cli/src/manifests/neon.js +128 -49
  84. package/dist/cli/src/manifests/neon.js.map +1 -1
  85. package/dist/cli/src/manifests/network-policies.js +263 -100
  86. package/dist/cli/src/manifests/network-policies.js.map +1 -1
  87. package/dist/cli/src/manifests/node-agent.js +24 -8
  88. package/dist/cli/src/manifests/node-agent.js.map +1 -1
  89. package/dist/cli/src/manifests/object-store.js +4 -2
  90. package/dist/cli/src/manifests/object-store.js.map +1 -1
  91. package/dist/cli/src/manifests/sandbox-gateway.js +663 -0
  92. package/dist/cli/src/manifests/sandbox-gateway.js.map +1 -0
  93. package/dist/cli/src/manifests/scalers.js +16 -5
  94. package/dist/cli/src/manifests/scalers.js.map +1 -1
  95. package/dist/cli/src/manifests/sizing.js +16 -8
  96. package/dist/cli/src/manifests/sizing.js.map +1 -1
  97. package/dist/cli/src/manifests/valkey.js +11 -5
  98. package/dist/cli/src/manifests/valkey.js.map +1 -1
  99. package/dist/cli/src/manifests/vpa.js +3 -1
  100. package/dist/cli/src/manifests/vpa.js.map +1 -1
  101. package/dist/cli/src/manifests/webhook.js +102 -0
  102. package/dist/cli/src/manifests/webhook.js.map +1 -0
  103. package/dist/cli/src/manifests/workspace-storage.js +174 -89
  104. package/dist/cli/src/manifests/workspace-storage.js.map +1 -1
  105. package/dist/cli/src/neon-storage.js +155 -0
  106. package/dist/cli/src/neon-storage.js.map +1 -0
  107. package/dist/cli/src/release.js +9 -6
  108. package/dist/cli/src/release.js.map +1 -1
  109. package/dist/cli/src/secrets.js +45 -4
  110. package/dist/cli/src/secrets.js.map +1 -1
  111. package/dist/cli/src/target.js +1 -1
  112. package/dist/cli/src/target.js.map +1 -1
  113. package/dist/cli/src/telegram.js +56 -10
  114. package/dist/cli/src/telegram.js.map +1 -1
  115. package/dist/cli/src/webhook.js +182 -0
  116. package/dist/cli/src/webhook.js.map +1 -0
  117. package/dist/cluster/node/pins.json +12 -2
  118. package/dist/neon/control/branches.js +126 -21
  119. package/dist/neon/control/branches.js.map +1 -1
  120. package/dist/neon/control/endpoints.js +9 -0
  121. package/dist/neon/control/endpoints.js.map +1 -1
  122. package/dist/neon/control/jwt.js +16 -3
  123. package/dist/neon/control/jwt.js.map +1 -1
  124. package/dist/neon/control/secrets.js +51 -7
  125. package/dist/neon/control/secrets.js.map +1 -1
  126. package/dist/src/binder/names.js +33 -0
  127. package/dist/src/binder/names.js.map +1 -0
  128. package/dist/src/binder/tokens.js +58 -0
  129. package/dist/src/binder/tokens.js.map +1 -0
  130. package/dist/src/branch/names.js +12 -2
  131. package/dist/src/branch/names.js.map +1 -1
  132. package/dist/src/events/names.js +7 -0
  133. package/dist/src/events/names.js.map +1 -0
  134. package/dist/src/gateway/names.js +201 -0
  135. package/dist/src/gateway/names.js.map +1 -0
  136. package/dist/src/harness/names.js +49 -0
  137. package/dist/src/harness/names.js.map +1 -0
  138. package/dist/src/kube/sandbox-shape.js +19 -69
  139. package/dist/src/kube/sandbox-shape.js.map +1 -1
  140. package/dist/src/node-agent/names.js +118 -2
  141. package/dist/src/node-agent/names.js.map +1 -1
  142. package/dist/src/sandbox/names.js +12 -20
  143. package/dist/src/sandbox/names.js.map +1 -1
  144. package/dist/src/sandbox/otlp-resource.js +173 -0
  145. package/dist/src/sandbox/otlp-resource.js.map +1 -0
  146. package/dist/src/sandbox/telemetry.js +43 -0
  147. package/dist/src/sandbox/telemetry.js.map +1 -0
  148. package/dist/src/telegram/deliveries.js +40 -0
  149. package/dist/src/telegram/deliveries.js.map +1 -0
  150. package/dist/src/telemetry/config.js +131 -0
  151. package/dist/src/telemetry/config.js.map +1 -0
  152. package/dist/src/telemetry/forward.js +154 -0
  153. package/dist/src/telemetry/forward.js.map +1 -0
  154. package/package.json +1 -1
  155. package/dist/cli/src/manifests/agent-sandbox.js +0 -92
  156. package/dist/cli/src/manifests/agent-sandbox.js.map +0 -1
  157. package/dist/cli/src/manifests/juicefs-csi.js +0 -319
  158. package/dist/cli/src/manifests/juicefs-csi.js.map +0 -1
  159. package/dist/cli/src/manifests/sandboxes.agents.x-k8s.io.json +0 -6295
  160. package/dist/src/kube/config.js +0 -143
  161. package/dist/src/kube/config.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../src/telemetry/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Exports OTLP requests that something else encoded, as they are, over OTLP/HTTP to
3
+ * where alasio exports its own signals: what the sandbox service's receiver relays from
4
+ * inside a session's sandbox (src/receiver/receiver.ts). Each signal goes to its endpoint with its headers,
5
+ * timeout, compression, and TLS files from the standard variables, as OpenTelemetry's
6
+ * own exporters send alasio's, and is retried as they retry: on 429, 502, 503, and 504
7
+ * and on a failed connection, after the server's Retry-After or a jittered backoff,
8
+ * within the signal's timeout. alasio's deployment has it export to the stack's
9
+ * collector over OTLP/HTTP, which bayma exports over too.
10
+ */
11
+ import { readFileSync } from "node:fs";
12
+ import { Agent as HttpAgent, request as httpRequest } from "node:http";
13
+ import { Agent as HttpsAgent, request as httpsRequest } from "node:https";
14
+ import { setTimeout as sleep } from "node:timers/promises";
15
+ import { gzipSync } from "node:zlib";
16
+ import { context } from "@opentelemetry/api";
17
+ import { suppressTracing } from "@opentelemetry/core";
18
+ import { parseKeyValueList, resolveTelemetry, SIGNALS, signalSetting } from "./config.js";
19
+ const CONTENT_TYPES = { protobuf: "application/x-protobuf", json: "application/json" };
20
+ const DEFAULT_TIMEOUT_MS = 10_000;
21
+ const RETRYABLE_STATUS = new Set([429, 502, 503, 504]);
22
+ const MAX_RETRIES = 5;
23
+ const INITIAL_BACKOFF_MS = 1000;
24
+ const MAX_BACKOFF_MS = 5000;
25
+ const BACKOFF_MULTIPLIER = 1.5;
26
+ const JITTER = 0.2;
27
+ // A response body is never needed, only drained; one this large is not an OTLP server's.
28
+ const MAX_RESPONSE_BYTES = 4 * 1024 * 1024;
29
+ /** The milliseconds a Retry-After header asks to wait, or null. */
30
+ export function retryAfterMs(header, now = Date.now()) {
31
+ if (!header)
32
+ return null;
33
+ const seconds = Number(header);
34
+ if (Number.isFinite(seconds) && seconds >= 0)
35
+ return seconds * 1000;
36
+ const at = Date.parse(header);
37
+ return Number.isNaN(at) ? null : Math.max(0, at - now);
38
+ }
39
+ const TLS_FILES = [["ca", "CERTIFICATE"], ["cert", "CLIENT_CERTIFICATE"], ["key", "CLIENT_KEY"]];
40
+ function tlsFiles(env, signal, warn) {
41
+ const files = {};
42
+ for (const [option, name] of TLS_FILES) {
43
+ const path = signalSetting(env, signal, name);
44
+ if (!path)
45
+ continue;
46
+ try {
47
+ files[option] = readFileSync(path);
48
+ }
49
+ catch (error) {
50
+ warn(`${signal}: cannot read OTEL_EXPORTER_OTLP_${name} ${path}: ${error instanceof Error ? error.message : String(error)}`);
51
+ }
52
+ }
53
+ return files;
54
+ }
55
+ /** How each exported signal is sent, from the standard variables. */
56
+ function signalTargets(env, warn) {
57
+ const telemetry = resolveTelemetry(env);
58
+ const targets = {};
59
+ for (const signal of SIGNALS) {
60
+ const exporter = telemetry[signal];
61
+ if (!exporter)
62
+ continue;
63
+ const url = new URL(exporter.endpoint);
64
+ const timeout = Number(signalSetting(env, signal, "TIMEOUT"));
65
+ const https = url.protocol === "https:";
66
+ targets[signal] = {
67
+ url,
68
+ protocol: exporter.protocol,
69
+ headers: parseKeyValueList(exporter.headers),
70
+ timeoutMs: Number.isFinite(timeout) && timeout > 0 ? timeout : DEFAULT_TIMEOUT_MS,
71
+ gzip: signalSetting(env, signal, "COMPRESSION") === "gzip",
72
+ request: https ? httpsRequest : httpRequest,
73
+ agent: https ? new HttpsAgent({ keepAlive: true, ...tlsFiles(env, signal, warn) }) : new HttpAgent({ keepAlive: true }),
74
+ };
75
+ }
76
+ return targets;
77
+ }
78
+ /** One POST: `{ status, retryAfter }`, or `{ error }` for a connection that failed. */
79
+ function post(target, body, headers, timeoutMs, signal) {
80
+ return new Promise((resolve) => {
81
+ // alasio's own HTTP instrumentation would otherwise trace every export it relays.
82
+ context.with(suppressTracing(context.active()), () => {
83
+ const req = target.request(target.url, { method: "POST", agent: target.agent, headers, timeout: timeoutMs, ...(signal ? { signal } : {}) }, (res) => {
84
+ let received = 0;
85
+ res.on("data", (chunk) => {
86
+ received += chunk.length;
87
+ if (received > MAX_RESPONSE_BYTES)
88
+ res.destroy();
89
+ });
90
+ res.on("error", () => { });
91
+ res.on("close", () => resolve({ status: res.statusCode, retryAfter: retryAfterMs(res.headers["retry-after"]) }));
92
+ });
93
+ req.on("timeout", () => req.destroy(new Error(`no response within ${timeoutMs}ms`)));
94
+ req.on("error", (error) => resolve({ error }));
95
+ req.end(body);
96
+ });
97
+ });
98
+ }
99
+ /**
100
+ * The forwarder for the signals `env` exports. `protocols` maps each signal it forwards
101
+ * to the protocol alasio exports it over (http/protobuf or http/json); a signal it does
102
+ * not forward is absent. `export(signal, encoding, body)` sends one request, encoded as
103
+ * `encoding` ("protobuf" or "json"), within the signal's timeout or `withinMs` where less,
104
+ * and resolves `{ ok: true }` once a server took it, or `{ ok: false, ... }` once it is given
105
+ * up on (ForwardResult), or `signal` aborts it, which ends the request it is sending.
106
+ * `close()` ends the connections it keeps open.
107
+ */
108
+ export function createOtlpForwarder(env = process.env, { warn = () => { } } = {}) {
109
+ const targets = signalTargets(env, warn);
110
+ const protocols = {};
111
+ for (const signal of SIGNALS) {
112
+ const target = targets[signal];
113
+ if (target)
114
+ protocols[signal] = target.protocol;
115
+ }
116
+ return {
117
+ protocols,
118
+ async export(signal, encoding, body, { withinMs, signal: abort } = {}) {
119
+ const target = targets[signal];
120
+ if (!target)
121
+ return { ok: false, error: `${signal} are not forwarded`, retryable: false, retryAfterMs: null };
122
+ const headers = {
123
+ ...target.headers,
124
+ "content-type": CONTENT_TYPES[encoding],
125
+ ...(target.gzip ? { "content-encoding": "gzip" } : {}),
126
+ };
127
+ const payload = target.gzip ? gzipSync(body) : body;
128
+ const deadline = Date.now() + Math.min(target.timeoutMs, withinMs ?? Infinity);
129
+ let backoff = INITIAL_BACKOFF_MS;
130
+ for (let attempt = 0;; attempt += 1) {
131
+ const result = await post(target, payload, headers, Math.max(1, deadline - Date.now()), abort);
132
+ if (result.status !== undefined && result.status >= 200 && result.status < 300)
133
+ return { ok: true };
134
+ const error = result.error?.message ?? `HTTP ${result.status}`;
135
+ const retryable = result.error || (result.status !== undefined && RETRYABLE_STATUS.has(result.status));
136
+ const failed = { ok: false, error, retryable: Boolean(retryable), retryAfterMs: result.retryAfter ?? null };
137
+ if (attempt === MAX_RETRIES || !retryable)
138
+ return failed;
139
+ const wait = result.retryAfter ?? Math.min(backoff * (1 + (Math.random() * 2 - 1) * JITTER), MAX_BACKOFF_MS);
140
+ backoff *= BACKOFF_MULTIPLIER;
141
+ if (Date.now() + wait >= deadline || abort?.aborted)
142
+ return failed;
143
+ const waited = await sleep(wait, true, abort ? { signal: abort } : {}).catch(() => false);
144
+ if (!waited)
145
+ return failed;
146
+ }
147
+ },
148
+ close() {
149
+ for (const target of Object.values(targets))
150
+ target.agent.destroy();
151
+ },
152
+ };
153
+ }
154
+ //# sourceMappingURL=forward.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forward.js","sourceRoot":"","sources":["../../../../src/telemetry/forward.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "alasio",
3
- "version": "7.0.0",
3
+ "version": "9.0.0",
4
4
  "description": "alasio: coding agents you talk to from Telegram, installed and run with npx alasio",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -1,92 +0,0 @@
1
- import { given, NAMESPACE, ONE, RELEASE, replicasOf } from "./common.js";
2
- import { priority } from "./priorities.js";
3
- import { verticalPodAutoscaler } from "./sizing.js";
4
- import sandboxes from "./sandboxes.agents.x-k8s.io.json" with { type: "json" };
5
- /**
6
- * The Sandbox CRD, agents.x-k8s.io's `sandboxes`, as the API server takes it, whose
7
- * schema's keys (`x-kubernetes-*`, say) are not client-node's model's.
8
- */
9
- export const SANDBOX_CRD = sandboxes;
10
- const NAME = `${RELEASE}-agent-sandbox-controller`;
11
- /** The labels of the controller's objects: the controller's name and version, the installation, and alasio as their manager. */
12
- const LABELS = {
13
- "app.kubernetes.io/name": "agent-sandbox-controller",
14
- "app.kubernetes.io/instance": RELEASE,
15
- "app.kubernetes.io/version": "v1.0.5",
16
- "app.kubernetes.io/managed-by": "alasio",
17
- };
18
- /** The controller: its identity, what it may do (Sandboxes and their pods, volumes and Services, cluster-wide; its leader lease, here), and its Deployment. */
19
- function controller(config) {
20
- const { image, resources, nodeSelector, tolerations, affinity } = config.agentSandbox;
21
- const serviceAccount = { apiVersion: "v1", kind: "ServiceAccount", metadata: { name: NAME, namespace: NAMESPACE, labels: LABELS } };
22
- const clusterRole = {
23
- apiVersion: "rbac.authorization.k8s.io/v1",
24
- kind: "ClusterRole",
25
- metadata: { name: NAME, labels: LABELS },
26
- rules: [
27
- { apiGroups: [""], resources: ["persistentvolumeclaims", "pods", "services"], verbs: ["create", "delete", "get", "list", "patch", "update", "watch"] },
28
- { apiGroups: ["", "events.k8s.io"], resources: ["events"], verbs: ["create", "patch"] },
29
- { apiGroups: ["agents.x-k8s.io"], resources: ["sandboxes"], verbs: ["create", "delete", "get", "list", "patch", "update", "watch"] },
30
- { apiGroups: ["agents.x-k8s.io"], resources: ["sandboxes/finalizers", "sandboxes/status"], verbs: ["get", "patch", "update"] },
31
- ],
32
- };
33
- const subjects = [{ kind: "ServiceAccount", name: NAME, namespace: NAMESPACE }];
34
- const clusterRoleBinding = {
35
- apiVersion: "rbac.authorization.k8s.io/v1",
36
- kind: "ClusterRoleBinding",
37
- metadata: { name: NAME, labels: LABELS },
38
- subjects,
39
- roleRef: { apiGroup: "rbac.authorization.k8s.io", kind: "ClusterRole", name: NAME },
40
- };
41
- // Leader election's lease, in the controller's own namespace only.
42
- const role = {
43
- apiVersion: "rbac.authorization.k8s.io/v1",
44
- kind: "Role",
45
- metadata: { name: NAME, namespace: NAMESPACE, labels: LABELS },
46
- rules: [{ apiGroups: ["coordination.k8s.io"], resources: ["leases"], verbs: ["create", "get", "list", "patch", "update", "watch"] }],
47
- };
48
- const roleBinding = {
49
- apiVersion: "rbac.authorization.k8s.io/v1",
50
- kind: "RoleBinding",
51
- metadata: { name: NAME, namespace: NAMESPACE, labels: LABELS },
52
- subjects,
53
- roleRef: { apiGroup: "rbac.authorization.k8s.io", kind: "Role", name: NAME },
54
- };
55
- const deployment = {
56
- apiVersion: "apps/v1",
57
- kind: "Deployment",
58
- metadata: { name: NAME, namespace: NAMESPACE, labels: LABELS },
59
- spec: {
60
- ...replicasOf(ONE),
61
- selector: { matchLabels: { "app.kubernetes.io/name": "agent-sandbox-controller", "app.kubernetes.io/instance": RELEASE } },
62
- template: {
63
- metadata: { labels: LABELS },
64
- spec: {
65
- serviceAccountName: NAME,
66
- ...priority("floor"),
67
- securityContext: { runAsNonRoot: true, seccompProfile: { type: "RuntimeDefault" } },
68
- containers: [{
69
- name: "controller",
70
- image: `${image.repository}:${image.tag}${image.digest ? `@${image.digest}` : ""}`,
71
- imagePullPolicy: image.pullPolicy,
72
- args: ["--leader-elect=true"],
73
- ports: [{ name: "metrics", containerPort: 8080 }, { name: "healthz", containerPort: 8081 }],
74
- livenessProbe: { httpGet: { path: "/healthz", port: "healthz" } },
75
- readinessProbe: { httpGet: { path: "/readyz", port: "healthz" } },
76
- securityContext: { allowPrivilegeEscalation: false, readOnlyRootFilesystem: true, runAsNonRoot: true, capabilities: { drop: ["ALL"] } },
77
- resources,
78
- }],
79
- ...given("nodeSelector", { ...nodeSelector }),
80
- ...given("tolerations", [...tolerations]),
81
- ...given("affinity", affinity),
82
- },
83
- },
84
- },
85
- };
86
- return [serviceAccount, clusterRole, clusterRoleBinding, role, roleBinding, deployment, verticalPodAutoscaler(deployment, "InPlace")];
87
- }
88
- /** agent-sandbox's objects, unless the cluster already has it. */
89
- export function agentSandboxObjects(config) {
90
- return config.agentSandbox.enabled ? [SANDBOX_CRD, ...controller(config)] : [];
91
- }
92
- //# sourceMappingURL=agent-sandbox.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"agent-sandbox.js","sourceRoot":"","sources":["../../../../src/manifests/agent-sandbox.ts"],"names":[],"mappings":"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"}
@@ -1,319 +0,0 @@
1
- import { imageReference } from "../images.js";
2
- import { VOLUME_DRIVER_LABEL } from "../kube/apply.js";
3
- import { goJson, ONE, replicasOf } from "./common.js";
4
- import { verticalPodAutoscaler } from "./sizing.js";
5
- /** The driver's name, which StorageClasses name as their provisioner. */
6
- export const CSI_DRIVER = "csi.juicefs.com";
7
- const VERSION = "v0.33.0";
8
- const CONTROLLER = "juicefs-csi-controller";
9
- const NODE = "juicefs-csi-node";
10
- const CONFIG = "juicefs-csi-driver-config";
11
- const CONTROLLER_ACCOUNT = "juicefs-csi-controller-sa";
12
- const NODE_ACCOUNT = "juicefs-csi-node-sa";
13
- /** The PriorityClass of mount pods. */
14
- const MOUNT_PRIORITY_CLASS = "alasio-juicefs-mount";
15
- /** The name label of the node service's mount pods, the clients. */
16
- export const MOUNT_POD_NAME = "juicefs-mount";
17
- /** The name label of the controller's and the node service's pods, the driver. */
18
- export const DRIVER_POD_NAME = "juicefs-csi-driver";
19
- /** The labels of the node service's mount pods. */
20
- export const MOUNT_POD_LABELS = { "app.kubernetes.io/name": MOUNT_POD_NAME };
21
- /** The labels that select the controller's and the node service's pods, upstream's but for its version. */
22
- export const CONTROLLER_POD_LABELS = { app: CONTROLLER, "app.kubernetes.io/name": DRIVER_POD_NAME, "app.kubernetes.io/instance": DRIVER_POD_NAME };
23
- export const NODE_POD_LABELS = { app: NODE, "app.kubernetes.io/name": DRIVER_POD_NAME, "app.kubernetes.io/instance": DRIVER_POD_NAME };
24
- /**
25
- * What selects the pods of the Jobs the controller runs to delete a volume's directory
26
- * once its claim is gone: upstream labels such a Job but not its pod template
27
- * (pkg/juicefs/mount/builder/job.go), so its pod carries only what Kubernetes gives a
28
- * Job's pods, the name of its Job.
29
- */
30
- export const JOB_POD_SELECTOR = { matchExpressions: [{ key: "batch.kubernetes.io/job-name", operator: "Exists" }] };
31
- /** The selector of the controller's, the node service's and the mount pods' pods, by their name labels. */
32
- export const JUICEFS_PODS_SELECTOR = `app.kubernetes.io/name in (${MOUNT_POD_NAME}, ${DRIVER_POD_NAME})`;
33
- /** Where mount pods serve their Prometheus metrics, the client's (administration/monitoring.md). */
34
- export const JUICEFS_METRICS_PORT = 9567;
35
- /** Where the controller's and the node service's pods serve theirs, the driver's own: its provisioning and volume errors among them. */
36
- export const DRIVER_METRICS_PORT = 8080;
37
- /** The label of what the driver needs to delete its volumes' data, which alasio keeps while they remain. */
38
- export const VOLUME_DRIVER = { [VOLUME_DRIVER_LABEL]: CSI_DRIVER };
39
- /** The labels of the driver's objects: upstream's, at its version, managed by alasio, and needed by its volumes. */
40
- const LABELS = {
41
- "app.kubernetes.io/name": "juicefs-csi-driver",
42
- "app.kubernetes.io/instance": "juicefs-csi-driver",
43
- "app.kubernetes.io/version": VERSION,
44
- "app.kubernetes.io/managed-by": "alasio",
45
- ...VOLUME_DRIVER,
46
- };
47
- /** Where the controller and node service keep mount points and the client's configuration, on the node. */
48
- const MOUNT_PATH = "/var/lib/juicefs/volume";
49
- const CONFIG_PATH = "/var/lib/juicefs/config";
50
- /** The controller's socket, which its sidecars reach it by. */
51
- const CONTROLLER_SOCKET_DIR = "/var/lib/csi/sockets/pluginproxy/";
52
- /**
53
- * The driver's configuration, its ConfigMap's config.yaml: one patch, for the mount pods
54
- * of workspace storage's class. Mount options here take precedence over a volume's, and
55
- * reach mount pods made after a change.
56
- */
57
- export function driverConfig({ workspaceStorage }) {
58
- const { csi, storageClassName, cacheSizeMiB, backupInterval } = workspaceStorage;
59
- return {
60
- enableNodeSelector: false,
61
- mountPodPatch: [{
62
- pvcSelector: { matchStorageClassName: storageClassName },
63
- ceMountImage: imageReference(csi.mountImage),
64
- resources: csi.mountPod.resources,
65
- mountOptions: [
66
- // The read cache, bounded, and keeping a fifth of the node's disk free.
67
- `cache-size=${cacheSizeMiB}`,
68
- "free-space-ratio=0.2",
69
- `backup-meta=${backupInterval}`,
70
- ],
71
- // Ready once the mount answers as FUSE's. A mount pod mounts its volume's directory
72
- // alone (as `subdir`), so that is the mount's root, and nothing is under it by the
73
- // volume's path; unmounted, the root is the node's own directory.
74
- readinessProbe: { exec: { command: ["sh", "-c", 'test "$(stat --file-system --format=%T ${MOUNT_POINT})" = fuseblk'] }, initialDelaySeconds: 5, periodSeconds: 10, failureThreshold: 3 },
75
- }],
76
- };
77
- }
78
- /** What the controller and node service are told alike: where they are, where mount pods keep their mounts, and the pods' priority. */
79
- function pluginEnv({ workspaceStorage }) {
80
- return [
81
- { name: "NODE_NAME", valueFrom: { fieldRef: { fieldPath: "spec.nodeName" } } },
82
- { name: "JUICEFS_MOUNT_NAMESPACE", valueFrom: { fieldRef: { fieldPath: "metadata.namespace" } } },
83
- { name: "POD_NAME", valueFrom: { fieldRef: { fieldPath: "metadata.name" } } },
84
- { name: "JUICEFS_MOUNT_PATH", value: MOUNT_PATH },
85
- { name: "JUICEFS_CONFIG_PATH", value: CONFIG_PATH },
86
- { name: "JUICEFS_MOUNT_PRIORITY_NAME", value: MOUNT_PRIORITY_CLASS },
87
- { name: "JUICEFS_MOUNT_PREEMPTION_POLICY", value: "Never" },
88
- ...(workspaceStorage.csi.shareMountPod ? [{ name: "FS_SHARE_MOUNT", value: "true" }] : []),
89
- ];
90
- }
91
- /** The plugin's liveness, which its liveness-probe sidecar answers on the plugin's healthz port. */
92
- const PLUGIN_PROBE = { httpGet: { path: "/healthz", port: "healthz" }, initialDelaySeconds: 10, periodSeconds: 10, timeoutSeconds: 3, failureThreshold: 5 };
93
- /** The liveness-probe sidecar, for the plugin's socket in `socketVolume`. */
94
- function livenessProbe({ workspaceStorage }, socketVolume) {
95
- return {
96
- name: "liveness-probe",
97
- image: imageReference(workspaceStorage.csi.livenessProbeImage),
98
- args: ["--csi-address=/csi/csi.sock", "--health-port=9909"],
99
- resources: { requests: { cpu: "5m", memory: "16Mi" }, limits: { memory: "64Mi" } },
100
- volumeMounts: [{ name: socketVolume, mountPath: "/csi" }],
101
- };
102
- }
103
- /** A rule granting `verbs` on `resources` of `apiGroups`. */
104
- function rule(apiGroups, resources, verbs) {
105
- return { apiGroups, resources, verbs };
106
- }
107
- /** Who the controller and node service are, and what they may do, as upstream grants it. */
108
- function identities({ workspaceStorage }) {
109
- const { namespace } = workspaceStorage.csi;
110
- const account = (name) => ({ apiVersion: "v1", kind: "ServiceAccount", metadata: { name, namespace, labels: LABELS } });
111
- const role = (name, rules) => ({
112
- apiVersion: "rbac.authorization.k8s.io/v1",
113
- kind: "ClusterRole",
114
- metadata: { name, labels: LABELS },
115
- rules,
116
- });
117
- const binding = (name, roleName, accountName) => ({
118
- apiVersion: "rbac.authorization.k8s.io/v1",
119
- kind: "ClusterRoleBinding",
120
- metadata: { name, labels: LABELS },
121
- subjects: [{ kind: "ServiceAccount", name: accountName, namespace }],
122
- roleRef: { apiGroup: "rbac.authorization.k8s.io", kind: "ClusterRole", name: roleName },
123
- });
124
- const provisioner = "juicefs-external-provisioner-role";
125
- const nodeService = "juicefs-csi-external-node-service-role";
126
- return [
127
- account(CONTROLLER_ACCOUNT),
128
- account(NODE_ACCOUNT),
129
- role(provisioner, [
130
- rule([""], ["persistentvolumes"], ["get", "list", "watch", "create", "delete", "patch"]),
131
- rule([""], ["persistentvolumeclaims", "persistentvolumeclaims/status"], ["get", "list", "watch", "update", "patch"]),
132
- rule(["storage.k8s.io"], ["storageclasses"], ["get", "list", "watch"]),
133
- rule([""], ["events"], ["list", "watch", "create", "update", "patch"]),
134
- rule(["storage.k8s.io"], ["csinodes"], ["get", "list", "watch"]),
135
- rule([""], ["nodes"], ["get", "list", "watch"]),
136
- rule([""], ["secrets"], ["get", "list", "watch", "create", "update", "patch", "delete"]),
137
- rule([""], ["pods", "pods/log"], ["get", "list", "watch", "create", "update", "patch", "delete"]),
138
- rule(["batch"], ["jobs"], ["get", "create", "update", "patch", "delete", "list", "watch"]),
139
- rule([""], ["endpoints"], ["get", "list", "watch", "create", "update", "patch"]),
140
- rule(["apps"], ["daemonsets"], ["get", "list"]),
141
- rule([""], ["configmaps"], ["get", "watch", "list", "delete", "update", "create"]),
142
- ]),
143
- role(nodeService, [
144
- rule([""], ["pods"], ["get", "list", "create", "update", "delete", "patch", "watch"]),
145
- rule([""], ["pods/log"], ["get"]),
146
- rule([""], ["secrets"], ["get", "create", "update", "delete", "patch"]),
147
- rule(["batch"], ["jobs"], ["get", "create", "update", "delete", "patch"]),
148
- rule([""], ["nodes"], ["get", "list"]),
149
- rule([""], ["nodes/proxy"], ["*"]),
150
- rule([""], ["persistentvolumes", "persistentvolumeclaims"], ["get", "list"]),
151
- rule([""], ["pods/exec"], ["create"]),
152
- rule([""], ["events"], ["create", "get"]),
153
- rule(["storage.k8s.io"], ["storageclasses"], ["get", "watch"]),
154
- rule([""], ["configmaps"], ["get", "update"]),
155
- ]),
156
- binding("juicefs-csi-provisioner-binding", provisioner, CONTROLLER_ACCOUNT),
157
- binding("juicefs-csi-node-service-binding", nodeService, NODE_ACCOUNT),
158
- ];
159
- }
160
- /** The controller: the plugin, provisioning, and the resizer, which grows a volume's quota as its claim grows. */
161
- function controller(config) {
162
- const { csi } = config.workspaceStorage;
163
- return {
164
- apiVersion: "apps/v1",
165
- kind: "StatefulSet",
166
- metadata: { name: CONTROLLER, namespace: csi.namespace, labels: { ...LABELS, "app.kubernetes.io/component": "controller" } },
167
- spec: {
168
- serviceName: CONTROLLER,
169
- // One, and never more: without an election, two would provision alike.
170
- ...replicasOf(ONE),
171
- selector: { matchLabels: CONTROLLER_POD_LABELS },
172
- template: {
173
- metadata: { labels: { ...LABELS, ...CONTROLLER_POD_LABELS } },
174
- spec: {
175
- serviceAccountName: CONTROLLER_ACCOUNT,
176
- priorityClassName: "system-cluster-critical",
177
- tolerations: [{ key: "CriticalAddonsOnly", operator: "Exists" }],
178
- containers: [
179
- {
180
- name: "juicefs-plugin",
181
- image: imageReference(csi.image),
182
- args: ["--endpoint=$(CSI_ENDPOINT)", "--logtostderr", "--nodeid=$(NODE_NAME)", "--provisioner=true", "--config=/etc/config/config.yaml"],
183
- env: [{ name: "CSI_ENDPOINT", value: `unix://${CONTROLLER_SOCKET_DIR}csi.sock` }, ...pluginEnv(config)],
184
- ports: [{ name: "healthz", containerPort: 9909, protocol: "TCP" }],
185
- livenessProbe: PLUGIN_PROBE,
186
- // It mounts the file system itself, to make and remove volumes' directories.
187
- securityContext: { privileged: true, capabilities: { add: ["SYS_ADMIN"] } },
188
- resources: csi.controller.resources,
189
- volumeMounts: [
190
- { name: "socket-dir", mountPath: CONTROLLER_SOCKET_DIR },
191
- { name: "jfs-dir", mountPath: "/jfs", mountPropagation: "Bidirectional" },
192
- { name: "jfs-root-dir", mountPath: "/root/.juicefs", mountPropagation: "Bidirectional" },
193
- { name: "juicefs-config", mountPath: "/etc/config" },
194
- ],
195
- },
196
- {
197
- name: "csi-resizer",
198
- image: imageReference(csi.resizerImage),
199
- args: ["--csi-address=$(ADDRESS)", "--timeout=20s", "--v=2"],
200
- env: [{ name: "ADDRESS", value: `${CONTROLLER_SOCKET_DIR}csi.sock` }],
201
- resources: { requests: { cpu: "5m", memory: "24Mi" }, limits: { memory: "128Mi" } },
202
- volumeMounts: [{ name: "socket-dir", mountPath: CONTROLLER_SOCKET_DIR }],
203
- },
204
- livenessProbe(config, "socket-dir"),
205
- ],
206
- volumes: [
207
- { name: "socket-dir", emptyDir: {} },
208
- { name: "jfs-dir", hostPath: { path: MOUNT_PATH, type: "DirectoryOrCreate" } },
209
- { name: "jfs-root-dir", hostPath: { path: CONFIG_PATH, type: "DirectoryOrCreate" } },
210
- { name: "juicefs-config", configMap: { name: CONFIG } },
211
- ],
212
- },
213
- },
214
- },
215
- };
216
- }
217
- /** The node service: the plugin, which makes mount pods and binds their mounts into pods, and the registrar, which names it to kubelet. */
218
- function nodeService(config) {
219
- const { csi } = config.workspaceStorage;
220
- const pluginDir = `/var/lib/kubelet/csi-plugins/${CSI_DRIVER}/`;
221
- return {
222
- apiVersion: "apps/v1",
223
- kind: "DaemonSet",
224
- metadata: { name: NODE, namespace: csi.namespace, labels: { ...LABELS, "app.kubernetes.io/component": "node" } },
225
- spec: {
226
- selector: { matchLabels: NODE_POD_LABELS },
227
- template: {
228
- metadata: { labels: { ...LABELS, ...NODE_POD_LABELS } },
229
- spec: {
230
- serviceAccountName: NODE_ACCOUNT,
231
- priorityClassName: "system-node-critical",
232
- dnsPolicy: "ClusterFirstWithHostNet",
233
- tolerations: [{ key: "CriticalAddonsOnly", operator: "Exists" }],
234
- containers: [
235
- {
236
- name: "juicefs-plugin",
237
- image: imageReference(csi.image),
238
- args: ["--endpoint=$(CSI_ENDPOINT)", "--logtostderr", "--nodeid=$(NODE_NAME)", "--enable-manager=true", "--config=/etc/config/config.yaml"],
239
- env: [
240
- { name: "CSI_ENDPOINT", value: "unix:/csi/csi.sock" },
241
- { name: "HOST_IP", valueFrom: { fieldRef: { fieldPath: "status.hostIP" } } },
242
- { name: "KUBELET_PORT", value: "10250" },
243
- ...pluginEnv(config),
244
- ],
245
- ports: [{ name: "healthz", containerPort: 9909, protocol: "TCP" }],
246
- livenessProbe: PLUGIN_PROBE,
247
- securityContext: { privileged: true },
248
- resources: csi.node.resources,
249
- volumeMounts: [
250
- { name: "kubelet-dir", mountPath: "/var/lib/kubelet", mountPropagation: "Bidirectional" },
251
- { name: "plugin-dir", mountPath: "/csi" },
252
- { name: "device-dir", mountPath: "/dev" },
253
- { name: "jfs-dir", mountPath: "/jfs", mountPropagation: "Bidirectional" },
254
- { name: "jfs-root-dir", mountPath: "/root/.juicefs", mountPropagation: "Bidirectional" },
255
- { name: "juicefs-config", mountPath: "/etc/config" },
256
- // Where it keeps each mount's FUSE descriptor, by which a mount pod that
257
- // crashes comes back under the same mount (guide/configurations.md
258
- // "Automatic mount point recovery").
259
- { name: "jfs-fuse-fd", mountPath: "/tmp" },
260
- ],
261
- },
262
- {
263
- name: "node-driver-registrar",
264
- image: imageReference(csi.registrarImage),
265
- args: ["--csi-address=$(ADDRESS)", "--kubelet-registration-path=$(DRIVER_REG_SOCK_PATH)", "--v=5"],
266
- env: [{ name: "ADDRESS", value: "/csi/csi.sock" }, { name: "DRIVER_REG_SOCK_PATH", value: `${pluginDir}csi.sock` }],
267
- resources: { requests: { cpu: "5m", memory: "16Mi" }, limits: { memory: "64Mi" } },
268
- volumeMounts: [{ name: "plugin-dir", mountPath: "/csi" }, { name: "registration-dir", mountPath: "/registration" }],
269
- },
270
- livenessProbe(config, "plugin-dir"),
271
- ],
272
- volumes: [
273
- { name: "kubelet-dir", hostPath: { path: "/var/lib/kubelet", type: "Directory" } },
274
- { name: "plugin-dir", hostPath: { path: pluginDir, type: "DirectoryOrCreate" } },
275
- { name: "registration-dir", hostPath: { path: "/var/lib/kubelet/plugins_registry/", type: "Directory" } },
276
- { name: "device-dir", hostPath: { path: "/dev", type: "Directory" } },
277
- { name: "jfs-dir", hostPath: { path: MOUNT_PATH, type: "DirectoryOrCreate" } },
278
- { name: "jfs-root-dir", hostPath: { path: CONFIG_PATH, type: "DirectoryOrCreate" } },
279
- { name: "juicefs-config", configMap: { name: CONFIG } },
280
- { name: "jfs-fuse-fd", hostPath: { path: "/var/run/juicefs-csi", type: "DirectoryOrCreate" } },
281
- ],
282
- },
283
- },
284
- },
285
- };
286
- }
287
- /** The driver's objects, unless the cluster already has the driver: the CSIDriver and the mount pods' PriorityClass among them, which are the cluster's. */
288
- export function juicefsCsiObjects(config) {
289
- const { csi } = config.workspaceStorage;
290
- if (!csi.enabled)
291
- return [];
292
- const csiDriver = {
293
- apiVersion: "storage.k8s.io/v1",
294
- kind: "CSIDriver",
295
- metadata: { name: CSI_DRIVER, labels: LABELS },
296
- spec: { attachRequired: false, podInfoOnMount: true },
297
- };
298
- const priorityClass = {
299
- apiVersion: "scheduling.k8s.io/v1",
300
- kind: "PriorityClass",
301
- metadata: { name: MOUNT_PRIORITY_CLASS, labels: LABELS },
302
- // As high as a pod's may be, so mount pods outlast the workspaces they serve, and
303
- // never preempting, so a new one evicts nothing.
304
- value: 1_000_000_000,
305
- preemptionPolicy: "Never",
306
- globalDefault: false,
307
- description: "JuiceFS's mount pods, which serve alasio's workspaces",
308
- };
309
- const configMap = {
310
- apiVersion: "v1",
311
- kind: "ConfigMap",
312
- metadata: { name: CONFIG, namespace: csi.namespace, labels: LABELS },
313
- data: { "config.yaml": goJson(driverConfig(config), " ") },
314
- };
315
- // Each serves workspaces' mounts, which its recreation would interrupt.
316
- const workloads = [controller(config), nodeService(config)];
317
- return [csiDriver, priorityClass, ...identities(config), configMap, ...workloads.flatMap((workload) => [workload, verticalPodAutoscaler(workload, "Recommended")])];
318
- }
319
- //# sourceMappingURL=juicefs-csi.js.map