alasio 8.0.0 → 10.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 (183) 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/bound-harnesses.js +98 -0
  4. package/dist/cli/src/bound-harnesses.js.map +1 -0
  5. package/dist/cli/src/branches.js +79 -22
  6. package/dist/cli/src/branches.js.map +1 -1
  7. package/dist/cli/src/cluster/docker.js +40 -15
  8. package/dist/cli/src/cluster/docker.js.map +1 -1
  9. package/dist/cli/src/cluster/host.js +38 -8
  10. package/dist/cli/src/cluster/host.js.map +1 -1
  11. package/dist/cli/src/cluster/k3s.js +105 -14
  12. package/dist/cli/src/cluster/k3s.js.map +1 -1
  13. package/dist/cli/src/cluster/node.js +142 -33
  14. package/dist/cli/src/cluster/node.js.map +1 -1
  15. package/dist/cli/src/cluster/stargz.js +92 -0
  16. package/dist/cli/src/cluster/stargz.js.map +1 -0
  17. package/dist/cli/src/commands/branch.js +5 -4
  18. package/dist/cli/src/commands/branch.js.map +1 -1
  19. package/dist/cli/src/commands/common.js +11 -5
  20. package/dist/cli/src/commands/common.js.map +1 -1
  21. package/dist/cli/src/commands/folder.js +14 -0
  22. package/dist/cli/src/commands/folder.js.map +1 -0
  23. package/dist/cli/src/commands/lake.js +1 -1
  24. package/dist/cli/src/commands/lake.js.map +1 -1
  25. package/dist/cli/src/commands/login-relay.js +91 -0
  26. package/dist/cli/src/commands/login-relay.js.map +1 -0
  27. package/dist/cli/src/commands/login.js +11 -10
  28. package/dist/cli/src/commands/login.js.map +1 -1
  29. package/dist/cli/src/commands/logs.js +89 -6
  30. package/dist/cli/src/commands/logs.js.map +1 -1
  31. package/dist/cli/src/commands/restart.js +10 -4
  32. package/dist/cli/src/commands/restart.js.map +1 -1
  33. package/dist/cli/src/commands/restore-filer-store.js +27 -10
  34. package/dist/cli/src/commands/restore-filer-store.js.map +1 -1
  35. package/dist/cli/src/commands/status.js +119 -20
  36. package/dist/cli/src/commands/status.js.map +1 -1
  37. package/dist/cli/src/commands/uninstall.js +8 -9
  38. package/dist/cli/src/commands/uninstall.js.map +1 -1
  39. package/dist/cli/src/commands/up.js +20 -9
  40. package/dist/cli/src/commands/up.js.map +1 -1
  41. package/dist/cli/src/commands/upgrade.js +22 -6
  42. package/dist/cli/src/commands/upgrade.js.map +1 -1
  43. package/dist/cli/src/commands.js +2 -1
  44. package/dist/cli/src/commands.js.map +1 -1
  45. package/dist/cli/src/config.js +4 -1
  46. package/dist/cli/src/config.js.map +1 -1
  47. package/dist/cli/src/cpu-baseline.js +8 -4
  48. package/dist/cli/src/cpu-baseline.js.map +1 -1
  49. package/dist/cli/src/folders.js +63 -0
  50. package/dist/cli/src/folders.js.map +1 -0
  51. package/dist/cli/src/gateway-calls.js +64 -0
  52. package/dist/cli/src/gateway-calls.js.map +1 -0
  53. package/dist/cli/src/install.js +45 -31
  54. package/dist/cli/src/install.js.map +1 -1
  55. package/dist/cli/src/kept-releases.js +27 -20
  56. package/dist/cli/src/kept-releases.js.map +1 -1
  57. package/dist/cli/src/kube/api.js +61 -15
  58. package/dist/cli/src/kube/api.js.map +1 -1
  59. package/dist/cli/src/kube/apply.js +122 -81
  60. package/dist/cli/src/kube/apply.js.map +1 -1
  61. package/dist/cli/src/kube/rollout.js +43 -21
  62. package/dist/cli/src/kube/rollout.js.map +1 -1
  63. package/dist/cli/src/main.js +2 -1
  64. package/dist/cli/src/main.js.map +1 -1
  65. package/dist/cli/src/manifests/admission.js +558 -222
  66. package/dist/cli/src/manifests/admission.js.map +1 -1
  67. package/dist/cli/src/manifests/alasio.js +180 -428
  68. package/dist/cli/src/manifests/alasio.js.map +1 -1
  69. package/dist/cli/src/manifests/branch.js +16 -27
  70. package/dist/cli/src/manifests/branch.js.map +1 -1
  71. package/dist/cli/src/manifests/codex-login.js +101 -0
  72. package/dist/cli/src/manifests/codex-login.js.map +1 -0
  73. package/dist/cli/src/manifests/collector.js +83 -62
  74. package/dist/cli/src/manifests/collector.js.map +1 -1
  75. package/dist/cli/src/manifests/common.js +82 -25
  76. package/dist/cli/src/manifests/common.js.map +1 -1
  77. package/dist/cli/src/manifests/config.js +137 -105
  78. package/dist/cli/src/manifests/config.js.map +1 -1
  79. package/dist/cli/src/manifests/disruption.js +18 -3
  80. package/dist/cli/src/manifests/disruption.js.map +1 -1
  81. package/dist/cli/src/manifests/folders.js +131 -0
  82. package/dist/cli/src/manifests/folders.js.map +1 -0
  83. package/dist/cli/src/manifests/grafana.js +4 -2
  84. package/dist/cli/src/manifests/grafana.js.map +1 -1
  85. package/dist/cli/src/manifests/harness-pools.js +236 -0
  86. package/dist/cli/src/manifests/harness-pools.js.map +1 -0
  87. package/dist/cli/src/manifests/image-holder.js +61 -0
  88. package/dist/cli/src/manifests/image-holder.js.map +1 -0
  89. package/dist/cli/src/manifests/index.js +14 -7
  90. package/dist/cli/src/manifests/index.js.map +1 -1
  91. package/dist/cli/src/manifests/keda.js +4 -2
  92. package/dist/cli/src/manifests/keda.js.map +1 -1
  93. package/dist/cli/src/manifests/lake.js +18 -20
  94. package/dist/cli/src/manifests/lake.js.map +1 -1
  95. package/dist/cli/src/manifests/log.js +84 -19
  96. package/dist/cli/src/manifests/log.js.map +1 -1
  97. package/dist/cli/src/manifests/neon.js +60 -80
  98. package/dist/cli/src/manifests/neon.js.map +1 -1
  99. package/dist/cli/src/manifests/network-policies.js +232 -94
  100. package/dist/cli/src/manifests/network-policies.js.map +1 -1
  101. package/dist/cli/src/manifests/node-agent.js +42 -15
  102. package/dist/cli/src/manifests/node-agent.js.map +1 -1
  103. package/dist/cli/src/manifests/object-store.js +99 -25
  104. package/dist/cli/src/manifests/object-store.js.map +1 -1
  105. package/dist/cli/src/manifests/sandbox-gateway.js +761 -0
  106. package/dist/cli/src/manifests/sandbox-gateway.js.map +1 -0
  107. package/dist/cli/src/manifests/scalers.js +17 -5
  108. package/dist/cli/src/manifests/scalers.js.map +1 -1
  109. package/dist/cli/src/manifests/sizing.js +17 -9
  110. package/dist/cli/src/manifests/sizing.js.map +1 -1
  111. package/dist/cli/src/manifests/valkey.js +30 -10
  112. package/dist/cli/src/manifests/valkey.js.map +1 -1
  113. package/dist/cli/src/manifests/volume-lock.js +43 -0
  114. package/dist/cli/src/manifests/volume-lock.js.map +1 -0
  115. package/dist/cli/src/manifests/vpa.js +15 -2
  116. package/dist/cli/src/manifests/vpa.js.map +1 -1
  117. package/dist/cli/src/manifests/workspace-storage.js +182 -94
  118. package/dist/cli/src/manifests/workspace-storage.js.map +1 -1
  119. package/dist/cli/src/neon-storage.js +54 -16
  120. package/dist/cli/src/neon-storage.js.map +1 -1
  121. package/dist/cli/src/release.js +9 -9
  122. package/dist/cli/src/release.js.map +1 -1
  123. package/dist/cli/src/setup-pod.js +44 -0
  124. package/dist/cli/src/setup-pod.js.map +1 -0
  125. package/dist/cli/src/target.js +2 -2
  126. package/dist/cli/src/target.js.map +1 -1
  127. package/dist/cli/src/telegram.js +13 -4
  128. package/dist/cli/src/telegram.js.map +1 -1
  129. package/dist/cli/src/wakes.js +68 -0
  130. package/dist/cli/src/wakes.js.map +1 -0
  131. package/dist/cli/src/webhook.js +5 -2
  132. package/dist/cli/src/webhook.js.map +1 -1
  133. package/dist/cluster/node/pins.json +11 -5
  134. package/dist/neon/control/branches.js +13 -6
  135. package/dist/neon/control/branches.js.map +1 -1
  136. package/dist/neon/control/endpoints.js +81 -10
  137. package/dist/neon/control/endpoints.js.map +1 -1
  138. package/dist/neon/control/secrets.js +24 -8
  139. package/dist/neon/control/secrets.js.map +1 -1
  140. package/dist/src/binder/bindings.js +195 -0
  141. package/dist/src/binder/bindings.js.map +1 -0
  142. package/dist/src/binder/names.js +63 -0
  143. package/dist/src/binder/names.js.map +1 -0
  144. package/dist/src/binder/tokens.js +71 -0
  145. package/dist/src/binder/tokens.js.map +1 -0
  146. package/dist/src/branch/names.js +20 -6
  147. package/dist/src/branch/names.js.map +1 -1
  148. package/dist/src/events/names.js +28 -0
  149. package/dist/src/events/names.js.map +1 -0
  150. package/dist/src/gateway/names.js +240 -0
  151. package/dist/src/gateway/names.js.map +1 -0
  152. package/dist/src/harness/names.js +67 -0
  153. package/dist/src/harness/names.js.map +1 -0
  154. package/dist/src/kube/client.js +212 -0
  155. package/dist/src/kube/client.js.map +1 -0
  156. package/dist/src/kube/sandbox-shape.js +14 -68
  157. package/dist/src/kube/sandbox-shape.js.map +1 -1
  158. package/dist/src/kube/started-map.js +12 -0
  159. package/dist/src/kube/started-map.js.map +1 -0
  160. package/dist/src/node-agent/names.js +62 -5
  161. package/dist/src/node-agent/names.js.map +1 -1
  162. package/dist/src/sandbox/names.js +12 -20
  163. package/dist/src/sandbox/names.js.map +1 -1
  164. package/dist/src/sandbox/otlp-resource.js +173 -0
  165. package/dist/src/sandbox/otlp-resource.js.map +1 -0
  166. package/dist/src/sandbox/telemetry.js +43 -0
  167. package/dist/src/sandbox/telemetry.js.map +1 -0
  168. package/dist/src/telegram/bot-commands.js +17 -0
  169. package/dist/src/telegram/bot-commands.js.map +1 -0
  170. package/dist/src/telegram/stop.js +12 -0
  171. package/dist/src/telegram/stop.js.map +1 -0
  172. package/dist/src/telemetry/config.js +131 -0
  173. package/dist/src/telemetry/config.js.map +1 -0
  174. package/dist/src/telemetry/forward.js +154 -0
  175. package/dist/src/telemetry/forward.js.map +1 -0
  176. package/package.json +1 -1
  177. package/dist/cli/src/manifests/agent-sandbox.js +0 -92
  178. package/dist/cli/src/manifests/agent-sandbox.js.map +0 -1
  179. package/dist/cli/src/manifests/juicefs-csi.js +0 -320
  180. package/dist/cli/src/manifests/juicefs-csi.js.map +0 -1
  181. package/dist/cli/src/manifests/sandboxes.agents.x-k8s.io.json +0 -6295
  182. package/dist/src/kube/config.js +0 -145
  183. package/dist/src/kube/config.js.map +0 -1
@@ -1,16 +1,22 @@
1
+ import { BINDING_LABEL } from "../../../src/binder/names.js";
1
2
  import { BUSY_LABEL } from "../../../src/kube/busy-label.js";
2
3
  import { componentName, labels, selectorLabels } from "./common.js";
3
4
  /** Whether a component of `scale` may run more than one replica. */
4
5
  export const replicated = ({ max }) => max > 1;
5
- /** The budget of `component`'s pods in `namespace`, of `scale`: one of them evicted at a time; none for a component of one replica. */
6
- export function replicaBudget(component, namespace, scale) {
6
+ /**
7
+ * The budget of `component`'s pods in `namespace`, of `scale`: one of them evicted at a time;
8
+ * none for a component of one replica. `unlessBusy`, of its pods not labelled busy alone,
9
+ * which the budget of busy pods holds (busyBudget).
10
+ */
11
+ export function replicaBudget(component, namespace, scale, { unlessBusy = false } = {}) {
7
12
  if (!replicated(scale))
8
13
  return [];
14
+ const notBusy = unlessBusy ? { matchExpressions: [{ key: BUSY_LABEL, operator: "NotIn", values: ["true"] }] } : {};
9
15
  return [{
10
16
  apiVersion: "policy/v1",
11
17
  kind: "PodDisruptionBudget",
12
18
  metadata: { name: componentName(component), namespace, labels: labels(component) },
13
- spec: { maxUnavailable: 1, selector: { matchLabels: selectorLabels(component) } },
19
+ spec: { maxUnavailable: 1, selector: { matchLabels: selectorLabels(component), ...notBusy } },
14
20
  }];
15
21
  }
16
22
  /**
@@ -26,6 +32,15 @@ export function busyBudget(namespace) {
26
32
  spec: { maxUnavailable: 0, selector: { matchLabels: { [BUSY_LABEL]: "true" } }, unhealthyPodEvictionPolicy: "AlwaysAllow" },
27
33
  };
28
34
  }
35
+ /** The budget of `namespace`'s bound pods, the sandbox service's: none of them evicted, but one not ready, as busyBudget's. */
36
+ export function boundBudget(namespace) {
37
+ return {
38
+ apiVersion: "policy/v1",
39
+ kind: "PodDisruptionBudget",
40
+ metadata: { name: componentName("bound"), namespace, labels: labels("session") },
41
+ spec: { maxUnavailable: 0, selector: { matchExpressions: [{ key: BINDING_LABEL, operator: "Exists" }] }, unhealthyPodEvictionPolicy: "AlwaysAllow" },
42
+ };
43
+ }
29
44
  /**
30
45
  * Where `component`'s replicas go, of `scale`: spread across nodes, where the cluster has
31
46
  * them, and zones; nothing to say of one replica. `strictly`, a replica is left unplaced
@@ -1 +1 @@
1
- {"version":3,"file":"disruption.js","sourceRoot":"","sources":["../../../../src/manifests/disruption.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGpE,oEAAoE;AACpE,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,EAAE,GAAG,EAAS,EAAW,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;AAE/D,uIAAuI;AACvI,MAAM,UAAU,aAAa,CAAC,SAAiB,EAAE,SAAiB,EAAE,KAAY;IAC9E,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAClC,OAAO,CAAC;YACN,UAAU,EAAE,WAAW;YACvB,IAAI,EAAE,qBAAqB;YAC3B,QAAQ,EAAE,EAAE,IAAI,EAAE,aAAa,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE;YAClF,IAAI,EAAE,EAAE,cAAc,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,cAAc,CAAC,SAAS,CAAC,EAAE,EAAE;SAClF,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,SAAiB;IAC1C,OAAO;QACL,UAAU,EAAE,WAAW;QACvB,IAAI,EAAE,qBAAqB;QAC3B,QAAQ,EAAE,EAAE,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE;QAC9E,IAAI,EAAE,EAAE,cAAc,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,0BAA0B,EAAE,aAAa,EAAE;KAC5H,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,MAAM,CAAC,SAAiB,EAAE,KAAY,EAAE,QAAQ,GAAG,KAAK;IACtE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,CAAC,WAAmB,EAAE,IAAa,EAA8B,EAAE,CAAC,CAAC;QAClF,OAAO,EAAE,CAAC;QACV,WAAW;QACX,iBAAiB,EAAE,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,gBAAgB;QAC5D,aAAa,EAAE,EAAE,WAAW,EAAE,cAAc,CAAC,SAAS,CAAC,EAAE;KAC1D,CAAC,CAAC;IACH,6GAA6G;IAC7G,OAAO,EAAE,yBAAyB,EAAE,CAAC,MAAM,CAAC,wBAAwB,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;AACnI,CAAC"}
1
+ {"version":3,"file":"disruption.js","sourceRoot":"","sources":["../../../../src/manifests/disruption.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,131 @@
1
+ import { FOLDER_TOKEN_FILE } from "../../../src/gateway/names.js";
2
+ import { sandboxBaymaTelemetryEnv } from "../../../src/sandbox/telemetry.js";
3
+ import { imageReference } from "../images.js";
4
+ import { accountRole, componentName, envOf, given, hostVolumeMounts, hostVolumes, imagePullSecrets, NAMESPACE, otelEnv, RELEASE } from "./common.js";
5
+ import { folderDeletionPolicy, folderPodPolicy, folderSecretPolicy } from "./admission.js";
6
+ import { boundBudget } from "./disruption.js";
7
+ import { priority } from "./priorities.js";
8
+ /** The port a folder instance's bayma serves MCP on, as every bound pod's does, which the gateway passes requests to (./sandbox-gateway.ts POOL_POD_PORT). */
9
+ export const FOLDER_PORT = 7290;
10
+ /** The gateway's ServiceAccount, its user's name, and the receiver's Service (./sandbox-gateway.ts). */
11
+ const GATEWAY = componentName("sandbox-gateway");
12
+ const GATEWAY_USER = `system:serviceaccount:${NAMESPACE}:${GATEWAY}`;
13
+ const RECEIVER = componentName("receiver");
14
+ /** Whether the installation has folder workspaces, whose instances the sandbox gateway makes: the host profile. */
15
+ export function foldersRun(config) {
16
+ return config.host.enabled;
17
+ }
18
+ /** The template of a folder instance's pod, as the operator runs bayma on their own machine: bayma itself, as them, with the machine's mounts, under the cluster's own runtime, which its process snapshots need. */
19
+ export function hostPodTemplate(config) {
20
+ const { host } = config;
21
+ return {
22
+ metadata: { labels: { "app.kubernetes.io/part-of": "alasio", "app.kubernetes.io/instance": RELEASE, "app.kubernetes.io/component": "folder-bayma" } },
23
+ spec: {
24
+ // May restart alasio, by rolling out its Deployment, as an agent restarts it; its token
25
+ // mounted by the template itself, where the API server would mount one, so the pod the
26
+ // folder pods' policy pins is the pod as made.
27
+ serviceAccountName: componentName("host-agent"),
28
+ automountServiceAccountToken: false,
29
+ ...priority("turn"),
30
+ securityContext: {
31
+ runAsUser: host.uid,
32
+ runAsGroup: host.gid,
33
+ // The group the bayma token's Secret volume is given, which the operator's user
34
+ // reads it as; the node's own paths the mounts give are left as they are.
35
+ fsGroup: host.gid,
36
+ ...given("supplementalGroups", [...host.supplementalGroups]),
37
+ },
38
+ ...imagePullSecrets(config),
39
+ containers: [{
40
+ name: "bayma",
41
+ image: imageReference(host.baymaImage),
42
+ imagePullPolicy: "IfNotPresent",
43
+ args: ["mcp-http", "--host", "0.0.0.0", "--port", String(FOLDER_PORT), "--default-durability", "checkpointed"],
44
+ workingDir: host.home,
45
+ env: [{ name: "HOME", value: host.home }, ...envOf(host.env)],
46
+ ports: [{ name: "mcp", containerPort: FOLDER_PORT }],
47
+ securityContext: {
48
+ // What bayma needs to snapshot its REPL sessions' processes as it stops and
49
+ // restore them whole as it starts again.
50
+ capabilities: { add: ["CHECKPOINT_RESTORE", "SYS_PTRACE"] },
51
+ seccompProfile: { type: "Unconfined" },
52
+ appArmorProfile: { type: "Unconfined" },
53
+ },
54
+ resources: host.resources,
55
+ volumeMounts: [...hostVolumeMounts(config), { name: ACCOUNT_VOLUME, mountPath: ACCOUNT_DIRECTORY, readOnly: true }],
56
+ }],
57
+ volumes: [...hostVolumes(config), accountVolume],
58
+ },
59
+ };
60
+ }
61
+ /** The volume of the folder instances' account's token, and where it is mounted, as the API server mounts one. */
62
+ const ACCOUNT_VOLUME = "alasio-host-agent-token";
63
+ const ACCOUNT_DIRECTORY = "/var/run/secrets/kubernetes.io/serviceaccount";
64
+ const accountVolume = {
65
+ name: ACCOUNT_VOLUME,
66
+ projected: {
67
+ defaultMode: 0o644,
68
+ sources: [
69
+ { serviceAccountToken: { expirationSeconds: 3607, path: "token" } },
70
+ { configMap: { name: "kube-root-ca.crt", items: [{ key: "ca.crt", path: "ca.crt" }] } },
71
+ { downwardAPI: { items: [{ path: "namespace", fieldRef: { apiVersion: "v1", fieldPath: "metadata.namespace" } }] } },
72
+ ],
73
+ },
74
+ };
75
+ /**
76
+ * The folder instances' template, as the gateway's configuration carries it: the host
77
+ * profile's, its bayma exporting its telemetry to the session telemetry receiver, as a
78
+ * bound pool pod's does, with its binding's token, the signals the installation exports, in
79
+ * their protocols, where it exports any.
80
+ */
81
+ export function folderTemplate(config) {
82
+ const template = hostPodTemplate(config);
83
+ const exported = sandboxBaymaTelemetryEnv(Object.fromEntries(otelEnv(config).map(({ name, value }) => [name, value ?? ""])));
84
+ if (Object.keys(exported).length === 0)
85
+ return template;
86
+ const telemetry = [
87
+ { name: "OTEL_EXPORTER_OTLP_ENDPOINT", value: `http://${RECEIVER}.${NAMESPACE}.svc.cluster.local:${config.telemetry.receiverPort}` },
88
+ ...Object.entries(exported).map(([name, value]) => ({ name, value })),
89
+ ];
90
+ return {
91
+ ...template,
92
+ spec: {
93
+ ...template.spec,
94
+ containers: (template.spec?.containers ?? []).map((container) => ({
95
+ ...container,
96
+ args: [...(container.args ?? []), "--telemetry-token-file", FOLDER_TOKEN_FILE],
97
+ env: [...(container.env ?? []), ...telemetry],
98
+ })),
99
+ },
100
+ };
101
+ }
102
+ /**
103
+ * The gateway's identity in the folder namespace: it makes and deletes the folder instances'
104
+ * pods, reads their status and what the metrics server says they use, and holds their
105
+ * bindings' Leases there, and its folders' records beside them; and makes the Secret of each
106
+ * one's token, which the pod then owns. A bound one no drain evicts.
107
+ */
108
+ export function folderObjects(config) {
109
+ if (!foldersRun(config))
110
+ return [];
111
+ const scope = { namespace: config.host.namespace, maker: GATEWAY_USER };
112
+ return [
113
+ ...accountRole(GATEWAY, "sandbox-gateway", config.host.namespace, [
114
+ { apiGroups: [""], resources: ["pods"], verbs: ["get", "list", "watch", "create", "update", "delete"] },
115
+ { apiGroups: [""], resources: ["secrets"], verbs: ["create", "patch", "delete"] },
116
+ { apiGroups: ["coordination.k8s.io"], resources: ["leases"], verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] },
117
+ // What each instance's bayma uses, which its folder's next instance requests (src/gateway/folders.ts SIZING).
118
+ { apiGroups: ["metrics.k8s.io"], resources: ["pods"], verbs: ["list"] },
119
+ ]),
120
+ // The receiver, which takes the telemetry of folder instances' bindings, watching their Leases.
121
+ ...accountRole(RECEIVER, "receiver", config.host.namespace, [{ apiGroups: ["coordination.k8s.io"], resources: ["leases"], verbs: ["list", "watch"] }]),
122
+ // Every pod of the folder namespace held to the folder template, as Pod Security cannot, and the gateway's Secrets there to their tokens.
123
+ ...folderPodPolicy(folderTemplate(config), { ...scope, stateRoot: config.host.stateRoot }),
124
+ ...folderSecretPolicy(scope),
125
+ // And what it deletes there, its own instances' pods and tokens alone.
126
+ ...folderDeletionPolicy(scope),
127
+ // A bound instance holds its REPLs live until its release: no drain evicts it, as none does a bound pool pod.
128
+ boundBudget(config.host.namespace),
129
+ ];
130
+ }
131
+ //# sourceMappingURL=folders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folders.js","sourceRoot":"","sources":["../../../../src/manifests/folders.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@ import { replicaBudget, replicated, spread } from "./disruption.js";
6
6
  import { LAKE_QUERY_PORT } from "./lake.js";
7
7
  import { PROXY_HOST, PROXY_PORT } from "./neon.js";
8
8
  import { priority } from "./priorities.js";
9
- import { cpuUtilization, scaledObject } from "./scalers.js";
9
+ import { cpuScaledObject } from "./scalers.js";
10
10
  import { verticalPodAutoscaler } from "./sizing.js";
11
11
  /** Grafana's name, its Secret's, and its pods' component. */
12
12
  export const GRAFANA = componentName("grafana");
@@ -129,7 +129,9 @@ export function grafanaObjects(config) {
129
129
  service,
130
130
  ...(ha ? [peers] : []),
131
131
  deployment,
132
- ...scaledObject(deployment, scaling, [cpuUtilization(80)]),
132
+ // Its start (its plugins loaded, its database migrated, its alert rules first evaluated)
133
+ // keeps its CPU above 80 % of its request for up to two minutes or so.
134
+ ...cpuScaledObject(deployment, scaling, { percent: 80, startUpSeconds: 180 }),
133
135
  ...replicaBudget("grafana", NAMESPACE, scaling),
134
136
  verticalPodAutoscaler(deployment, "InPlace", scaled(scaling) ? ["memory"] : undefined),
135
137
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"grafana.js","sourceRoot":"","sources":["../../../../src/manifests/grafana.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"grafana.js","sourceRoot":"","sources":["../../../../src/manifests/grafana.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,236 @@
1
+ /**
2
+ * Conversations' harnesses' pools (src/gateway/harnesses.ts, src/harness/program.ts): each
3
+ * conversation's harness host, `alasio harness`, runs in a pod of its harness's pool, which the
4
+ * sandbox gateway binds to the conversation while it has work.
5
+ *
6
+ * - A pool of each harness in each environment's own namespace, beside its alasio (main's, or
7
+ * a branch's, ./branch.ts), for its session conversations: alasio's image, restricted, as
8
+ * alasio's own user, with no ServiceAccount token, its own directory on its node
9
+ * (src/node-agent/names.ts ATTACH_ROOT, by `subPathExpr` of its namespace and its name) at
10
+ * /attach, where its node's agent writes its binding once the gateway binds it; it serves
11
+ * once it is there, and is ready only then. Its database is its environment's Neon, as the
12
+ * harness host's role, its rows its conversation's alone, as its grant says
13
+ * (src/harness/grant.ts); what its harness does on its own it tells the sandbox gateway, with
14
+ * its binding's token, which tells it on its environment's events topic, as the pod reaches
15
+ * no log; and alasio tells its lake's loader of what it commits.
16
+ * - A pool of each harness of main's folder conversations, where the host profile is on,
17
+ * beside main's alasio: the same, run as the operator, in their home, with the machine's
18
+ * mounts, as alasio's own pod is under the host profile; not in the folder namespace, whose
19
+ * pods are the folder instances' alone, the operator's bayma, which the folder pods' policy
20
+ * holds them to (./admission.ts folderPodPolicy), and which has none of the Secrets a host
21
+ * runs on.
22
+ *
23
+ * KEDA keeps `min` free of each, and makes more, to `max`, for the binds that wait; a bound pod
24
+ * is out of its Deployment, which replaces it, and is evicted by no drain (./disruption.ts
25
+ * boundBudget). The gateway may claim, read and delete each pool's pods and hold their
26
+ * bindings' Leases, in each of their namespaces, and make no pod, nor write another Lease there
27
+ * (./admission.ts harnessPodPolicy). Every pool's pod is made of its template alone, and
28
+ * changes but its binding (./admission.ts harnessPoolPodPolicy): a folder conversation's as the
29
+ * operator, with the machine's mounts the host profile gives and no capability of its own, and
30
+ * nothing else; and its NetworkPolicies give it the gateway in, and what it needs out
31
+ * (./network-policies.ts). Its node's directory for it it reads alone: its binding, which it
32
+ * marks served in a directory of its own (src/harness/program.ts).
33
+ *
34
+ * What a pool's pod holds of the installation's secrets, as its harness runs on them: Claude
35
+ * Code's login, CLAUDE_CODE_OAUTH_TOKEN, where the installation gives one (alasio.claude), as
36
+ * alasio's own pod does; and, of a folder conversation's Codex, the operator's Codex
37
+ * configuration, copied each turn (src/codex/configuration.ts), whose config.toml may hold
38
+ * secrets of its own (an MCP server's token among them). Never Codex's login, which alasio
39
+ * alone holds and relays to it, each turn's token good for minutes (src/codex/login-relay.ts).
40
+ */
41
+ import { posix } from "node:path";
42
+ import { freeLabels } from "../../../src/binder/names.js";
43
+ import { ALASIO_GATEWAY_URL_VARIABLE, HARNESS_CONTAINER } from "../../../src/gateway/names.js";
44
+ import { HARNESS_NAMES } from "../../../src/harness/names.js";
45
+ import { ATTACH_ROOT, BINDING_FILE } from "../../../src/node-agent/names.js";
46
+ import { imageReference } from "../images.js";
47
+ import { READY_ONCE_BOUND_ANNOTATION } from "../kube/rollout.js";
48
+ import { componentName, envOf, given, hostVolumeMounts, hostVolumes, imagePullSecrets, labels, NAMESPACE, otelEnv, restrictedContainer, restrictedPod, } from "./common.js";
49
+ import { durationSeconds } from "./config.js";
50
+ import { boundBudget } from "./disruption.js";
51
+ import { foldersRun } from "./folders.js";
52
+ import { priority } from "./priorities.js";
53
+ import { GATEWAY, GATEWAY_COMPONENT, GATEWAY_PORT, GATEWAY_USER } from "./sandbox-gateway.js";
54
+ import { harnessPodPolicy, harnessPoolPodPolicy } from "./admission.js";
55
+ import { scaledObject } from "./scalers.js";
56
+ import { verticalPodAutoscaler } from "./sizing.js";
57
+ /** The component of a harness pool's pods. */
58
+ export const HARNESS_COMPONENT = "harness";
59
+ /** The port a harness pool's pod's host serves on. */
60
+ export const HARNESS_POD_PORT = 8080;
61
+ /** How long a released harness pool's pod's host is given to drain: no turn after, the turn running waited for, its harness's session mirrored. */
62
+ const DRAIN_SECONDS = 120;
63
+ /** Each harness's pool's name, of session conversations, in each environment's namespace; and of main's folder conversations, in main's namespace beside them. */
64
+ export const HARNESS_POOLS = { codex: "harness-codex", claude: "harness-claude" };
65
+ export const FOLDER_HARNESS_POOLS = { codex: "harness-folder-codex", claude: "harness-folder-claude" };
66
+ /** Where a harness pool's pod keeps what it writes as it runs (received files, its session filesystems' Codex home): alasio's own, so a session's harness directory is where alasio's would be. */
67
+ const STATE_DIR = "/var/lib/alasio/state";
68
+ /** Where a pool's pod's Codex has its home, of its own: no login in it, alasio's relayed to it (src/harness/given-codex-login.ts). */
69
+ const CODEX_HOME = "/var/lib/alasio/codex";
70
+ /** Where a session pool's pod's harnesses have their home, of their own. */
71
+ const SESSION_HOME = "/var/lib/alasio/home";
72
+ /**
73
+ * The template of the pool `pool`'s pods, of `environment`, as the module says: of its session
74
+ * conversations; or, `folder`, of main's folder conversations, as the operator.
75
+ */
76
+ function harnessTemplate(config, environment, pool, folder) {
77
+ const { alasio, host, sessions } = config;
78
+ const home = folder ? host.home : SESSION_HOME;
79
+ const [uid, gid] = folder ? [host.uid, host.gid] : [alasio.runAsUser, alasio.runAsGroup];
80
+ const groups = folder ? [...new Set([...alasio.supplementalGroups, ...host.supplementalGroups])] : [...alasio.supplementalGroups];
81
+ const env = [
82
+ // alasio's, first, so that what the pod sets itself is its own: its homes, which the configuration may not set (config.ts), among it.
83
+ ...envOf(alasio.env),
84
+ { name: "POD_NAME", valueFrom: { fieldRef: { fieldPath: "metadata.name" } } },
85
+ { name: "POD_NAMESPACE", valueFrom: { fieldRef: { fieldPath: "metadata.namespace" } } },
86
+ { name: "ALASIO_HARNESS_BINDING_FILE", value: `/attach/${BINDING_FILE}` },
87
+ { name: "ALASIO_HARNESS_PORT", value: String(HARNESS_POD_PORT) },
88
+ { name: "ALASIO_STATE_DIR", value: STATE_DIR },
89
+ { name: "HOME", value: home },
90
+ // Its Codex's home, its own, which holds no login: a folder conversation's is given the operator's configuration each turn.
91
+ { name: "CODEX_HOME", value: CODEX_HOME },
92
+ { name: "ALASIO_DATABASE_URL_FILE", value: "/run/alasio/database/url" },
93
+ ...(environment.branch ? [{ name: "ALASIO_BRANCH", value: environment.branch }] : []),
94
+ // Its turns' workspaces' bayma, and its session's files, through the gateway, by what each turn gives.
95
+ { name: ALASIO_GATEWAY_URL_VARIABLE, value: `http://${GATEWAY}.${NAMESPACE}.svc.cluster.local:${GATEWAY_PORT}` },
96
+ ...(alasio.claude.existingSecret ? [{ name: "CLAUDE_CODE_OAUTH_TOKEN", valueFrom: { secretKeyRef: { name: alasio.claude.existingSecret, key: alasio.claude.key } } }] : []),
97
+ ...otelEnv(config, environment),
98
+ ];
99
+ const volumeMounts = [
100
+ // Its own directory on its node, by its namespace and its name, as pods of two namespaces may share a name, where its binding is written: its to read alone, so it fills nothing of its node's.
101
+ { name: "attach", mountPath: "/attach", subPathExpr: "$(POD_NAMESPACE)/$(POD_NAME)", readOnly: true },
102
+ { name: "state", mountPath: STATE_DIR },
103
+ { name: "codex", mountPath: CODEX_HOME },
104
+ // The operator's own Codex home, their login in it, hidden where the machine's mounts would show it.
105
+ ...(folder ? [...hostVolumeMounts(config), { name: "codex-hidden", mountPath: posix.join(home, ".codex"), readOnly: true }] : [{ name: "home", mountPath: home }]),
106
+ { name: "database", mountPath: "/run/alasio/database", readOnly: true },
107
+ ];
108
+ const volumes = [
109
+ { name: "attach", hostPath: { path: ATTACH_ROOT, type: "DirectoryOrCreate" } },
110
+ { name: "state", emptyDir: {} },
111
+ { name: "codex", emptyDir: {} },
112
+ ...(folder ? [...hostVolumes(config), { name: "codex-hidden", emptyDir: {} }] : [{ name: "home", emptyDir: {} }]),
113
+ { name: "database", secret: { secretName: componentName("harness-database"), items: [{ key: "url", path: "url" }] } },
114
+ ];
115
+ return {
116
+ metadata: { labels: { ...labels(HARNESS_COMPONENT), ...freeLabels(pool) } },
117
+ spec: {
118
+ ...priority("turn"),
119
+ securityContext: { ...restrictedPod(uid, gid), ...given("supplementalGroups", groups) },
120
+ automountServiceAccountToken: false,
121
+ enableServiceLinks: false,
122
+ ...imagePullSecrets(config),
123
+ // On the nodes the node agents run on, as its node's agent writes its binding beside it:
124
+ // the sessions' nodes. The untrusted code there runs under gVisor, in pods of its own, in
125
+ // its sessions' namespace, behind their deny-all, so a harness pod sits beside it, not in
126
+ // it; the agents themselves run there alone, as they assume gVisor's runtime and are
127
+ // privileged, so they are not run on alasio's nodes for it.
128
+ ...given("nodeSelector", { ...sessions.nodeSelector }),
129
+ ...given("tolerations", [...sessions.tolerations]),
130
+ containers: [{
131
+ name: HARNESS_CONTAINER,
132
+ image: imageReference(config.images.alasio),
133
+ imagePullPolicy: config.images.pullPolicy,
134
+ args: ["node", "/opt/alasio/src/harness/main.ts"],
135
+ workingDir: home,
136
+ env,
137
+ ports: [{ name: "host", containerPort: HARNESS_POD_PORT }],
138
+ // Ready once it serves, which it does once bound.
139
+ readinessProbe: { httpGet: { path: "/healthz", port: "host" }, periodSeconds: 2 },
140
+ securityContext: restrictedContainer(),
141
+ resources: folder ? config.harness.folder.resources : config.harness.session.resources,
142
+ volumeMounts,
143
+ }],
144
+ volumes,
145
+ },
146
+ };
147
+ }
148
+ /** A pool's Deployment, the ScaledObject that keeps its free pods, and its VPA. */
149
+ function poolObjects(config, environment, pool, folder) {
150
+ const deployment = {
151
+ apiVersion: "apps/v1",
152
+ kind: "Deployment",
153
+ // Ready, as `alasio up` and `alasio status` say it, once its pods run: each is ready only once bound.
154
+ metadata: { name: pool.name, namespace: pool.namespace, labels: labels(HARNESS_COMPONENT), annotations: { [READY_ONCE_BOUND_ANNOTATION]: "true" } },
155
+ spec: {
156
+ selector: { matchLabels: { ...freeLabels(pool) } },
157
+ // None is ready before it is bound: the old free pods go as the new come.
158
+ strategy: { type: "Recreate" },
159
+ template: harnessTemplate(config, environment, pool, folder),
160
+ },
161
+ };
162
+ // As many free as binds wait for, past `min`: each is claimed by one.
163
+ const waiting = {
164
+ type: "metrics-api",
165
+ metadata: { url: `http://${GATEWAY}.${NAMESPACE}.svc.cluster.local:${GATEWAY_PORT}/counts/${pool.namespace}/${pool.name}`, valueLocation: "waiting", targetValue: "1" },
166
+ };
167
+ // Sized as recommended alone: a host's resources change only as a new pod is made.
168
+ return [deployment, ...scaledObject(deployment, config.harness.pools.scaling, [waiting]), verticalPodAutoscaler(deployment, "Recommended")];
169
+ }
170
+ /** What the gateway may do with a namespace's harness pools: claim, read and delete their pods, and hold their Leases; make none. */
171
+ function gatewayRole(namespace, pools) {
172
+ const metadata = { name: componentName("sandbox-gateway-harnesses"), namespace, labels: labels(GATEWAY_COMPONENT) };
173
+ const role = {
174
+ apiVersion: "rbac.authorization.k8s.io/v1",
175
+ kind: "Role",
176
+ metadata,
177
+ rules: [
178
+ // Its pools' pods, claimed by an update of the version read, and deleted as they are released.
179
+ { apiGroups: [""], resources: ["pods"], verbs: ["get", "list", "watch", "update", "delete"] },
180
+ { apiGroups: ["coordination.k8s.io"], resources: ["leases"], verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] },
181
+ { apiGroups: ["apps"], resources: ["deployments"], verbs: ["get"], resourceNames: [...pools] },
182
+ ],
183
+ };
184
+ const binding = {
185
+ apiVersion: "rbac.authorization.k8s.io/v1",
186
+ kind: "RoleBinding",
187
+ metadata,
188
+ roleRef: { apiGroup: "rbac.authorization.k8s.io", kind: "Role", name: metadata.name },
189
+ subjects: [{ kind: "ServiceAccount", name: GATEWAY, namespace: NAMESPACE }],
190
+ };
191
+ return [role, binding];
192
+ }
193
+ /** The templates of `environment`'s harness pools, its session conversations' and, main's, its folder conversations'. */
194
+ function harnessTemplates(config, environment) {
195
+ const sessions = HARNESS_NAMES.map((harness) => harnessTemplate(config, environment, { name: HARNESS_POOLS[harness], namespace: environment.namespace }, false));
196
+ const folders = environment.branch === null && foldersRun(config)
197
+ ? HARNESS_NAMES.map((harness) => harnessTemplate(config, environment, { name: FOLDER_HARNESS_POOLS[harness], namespace: environment.namespace }, true))
198
+ : [];
199
+ return [...sessions, ...folders];
200
+ }
201
+ /** The pools of `environment`'s session conversations, by harness, in its own namespace. */
202
+ const harnessPoolsOf = (environment) => Object.fromEntries(HARNESS_NAMES.map((harness) => [harness, { name: HARNESS_POOLS[harness], namespace: environment.namespace }]));
203
+ /** The harness pools of `environment`, main's or a branch environment's, in its own namespace, as the module says; and, main's, its folder conversations'. */
204
+ export function harnessPoolObjects(config, environment) {
205
+ const pools = harnessPoolsOf(environment);
206
+ const folder = environment.branch === null && foldersRun(config);
207
+ const folderPools = folder ? HARNESS_NAMES.map((harness) => ({ name: FOLDER_HARNESS_POOLS[harness], namespace: environment.namespace })) : [];
208
+ return [
209
+ ...gatewayRole(environment.namespace, [...Object.values(HARNESS_POOLS), ...folderPools.map(({ name }) => name)]),
210
+ ...HARNESS_NAMES.flatMap((harness) => poolObjects(config, environment, pools[harness], false)),
211
+ ...folderPools.flatMap((pool) => poolObjects(config, environment, pool, true)),
212
+ boundBudget(environment.namespace),
213
+ // What the gateway does to the pods of every environment's namespace held to its pools' alone, as RBAC cannot:
214
+ // the cluster's, made with main's.
215
+ ...(environment.branch === null ? harnessPodPolicy(GATEWAY_USER, [...Object.values(HARNESS_POOLS), ...Object.values(FOLDER_HARNESS_POOLS)]) : []),
216
+ // Every pool's pod made in the environment's namespace held to its template, as this environment's
217
+ // configuration renders it: its folder conversations' to the operator's user, mounts and capabilities as
218
+ // the template has them, and no others. The environment's own, made and deleted with it.
219
+ ...harnessPoolPodPolicy({ namespace: environment.namespace, branch: environment.branch, templates: harnessTemplates(config, environment) }),
220
+ ];
221
+ }
222
+ /** What the gateway's configuration says of the harnesses' pools (src/gateway/names.ts GatewayConfig). */
223
+ export function harnessesConfig(config) {
224
+ const { alasio, host } = config;
225
+ return {
226
+ namespace: NAMESPACE,
227
+ pools: { ...HARNESS_POOLS },
228
+ podPort: HARNESS_POD_PORT,
229
+ owner: { uid: alasio.runAsUser, gid: alasio.runAsGroup },
230
+ // A duration, as the configuration checks it.
231
+ releaseAfterSeconds: durationSeconds(config.harness.pools.releaseAfter) ?? 0,
232
+ drainSeconds: DRAIN_SECONDS,
233
+ folders: foldersRun(config) ? { pools: { ...FOLDER_HARNESS_POOLS }, owner: { uid: host.uid, gid: host.gid } } : null,
234
+ };
235
+ }
236
+ //# sourceMappingURL=harness-pools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness-pools.js","sourceRoot":"","sources":["../../../../src/manifests/harness-pools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import { imageReference } from "../images.js";
2
+ import { componentName, given, imagePullSecrets, labels, lakeRuns, NAMESPACE, restrictedContainer, restrictedPod, selectorLabels } from "./common.js";
3
+ import { priority } from "./priorities.js";
4
+ /** The holder's component of alasio's image. */
5
+ export const IMAGE_HOLDER_COMPONENT = "image";
6
+ /** The holder's component of the lake's image. */
7
+ export const LAKE_IMAGE_HOLDER_COMPONENT = "lake-image";
8
+ /**
9
+ * What a holder runs where its image's entrypoint is no tini, as the lake's, node's image's, is
10
+ * not: a shell, PID 1, which the kernel sends no signal it has no handler for, so one that
11
+ * waits on nothing but a SIGTERM, which it traps and ends on, as its pod is stopped.
12
+ */
13
+ export const UNTIL_TERM = ["sh", "-c", "trap 'exit 0' TERM; while :; do sleep 86400 & wait $!; done"];
14
+ /** The DaemonSet that holds `held`'s image on its workload's nodes, as the module says. */
15
+ function holder(config, { component, image, args, runAsUser, runAsGroup, nodeSelector, tolerations, affinity }) {
16
+ return {
17
+ apiVersion: "apps/v1",
18
+ kind: "DaemonSet",
19
+ metadata: { name: componentName(component), namespace: NAMESPACE, labels: labels(component) },
20
+ spec: {
21
+ selector: { matchLabels: selectorLabels(component) },
22
+ // Every node's at once, as an upgrade's image is pulled on each before a wake asks for it there, and the holder serves nothing.
23
+ updateStrategy: { type: "RollingUpdate", rollingUpdate: { maxUnavailable: "100%", maxSurge: 0 } },
24
+ template: {
25
+ metadata: { labels: labels(component) },
26
+ spec: {
27
+ ...priority("component"),
28
+ automountServiceAccountToken: false,
29
+ enableServiceLinks: false,
30
+ terminationGracePeriodSeconds: 1,
31
+ securityContext: restrictedPod(runAsUser, runAsGroup),
32
+ ...imagePullSecrets(config),
33
+ containers: [{
34
+ name: "image",
35
+ image: imageReference(image),
36
+ imagePullPolicy: config.images.pullPolicy,
37
+ // Its arguments, not its command, so it runs under the image's entrypoint, which it ends with as its pod is
38
+ // stopped: alasio's, tini, passing the SIGTERM on to it; another's, its own (UNTIL_TERM).
39
+ args: [...args],
40
+ securityContext: { ...restrictedContainer(), readOnlyRootFilesystem: true },
41
+ resources: { requests: { cpu: "1m", memory: "8Mi" }, limits: { memory: "16Mi" } },
42
+ }],
43
+ ...given("nodeSelector", { ...nodeSelector }),
44
+ ...given("tolerations", [...tolerations]),
45
+ // Of its workload's affinity, what says which nodes: its pods' affinities place none of a DaemonSet's.
46
+ ...given("affinity", affinity?.nodeAffinity ? { nodeAffinity: affinity.nodeAffinity } : {}),
47
+ },
48
+ },
49
+ },
50
+ };
51
+ }
52
+ /** The objects that hold alasio's images that wake from none on their workloads' nodes, as the module says: alasio's, and the lake's where it runs. */
53
+ export function imageHolderObjects(config) {
54
+ const { alasio, neon } = config;
55
+ return [
56
+ holder(config, { component: IMAGE_HOLDER_COMPONENT, image: config.images.alasio, args: ["sleep", "infinity"], runAsUser: alasio.runAsUser, runAsGroup: alasio.runAsGroup, nodeSelector: alasio.nodeSelector, tolerations: alasio.tolerations, affinity: alasio.affinity }),
57
+ // The lake's on the stack's nodes, as its loader and intake are placed (./common.ts stackPodSpec).
58
+ ...(lakeRuns(config) ? [holder(config, { component: LAKE_IMAGE_HOLDER_COMPONENT, image: config.images.lake, args: UNTIL_TERM, runAsUser: neon.runAsUser, runAsGroup: neon.runAsGroup, nodeSelector: neon.nodeSelector, tolerations: neon.tolerations })] : []),
59
+ ];
60
+ }
61
+ //# sourceMappingURL=image-holder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-holder.js","sourceRoot":"","sources":["../../../../src/manifests/image-holder.ts"],"names":[],"mappings":"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"}