alasio 4.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 (72) hide show
  1. package/dist/cli/src/cluster/docker.js +219 -0
  2. package/dist/cli/src/cluster/docker.js.map +1 -0
  3. package/dist/cli/src/cluster/local.js +392 -0
  4. package/dist/cli/src/cluster/local.js.map +1 -0
  5. package/dist/cli/src/commands/common.js +108 -0
  6. package/dist/cli/src/commands/common.js.map +1 -0
  7. package/dist/cli/src/commands/down.js +26 -0
  8. package/dist/cli/src/commands/down.js.map +1 -0
  9. package/dist/cli/src/commands/init.js +314 -0
  10. package/dist/cli/src/commands/init.js.map +1 -0
  11. package/dist/cli/src/commands/lake.js +33 -0
  12. package/dist/cli/src/commands/lake.js.map +1 -0
  13. package/dist/cli/src/commands/login.js +38 -0
  14. package/dist/cli/src/commands/login.js.map +1 -0
  15. package/dist/cli/src/commands/logs.js +27 -0
  16. package/dist/cli/src/commands/logs.js.map +1 -0
  17. package/dist/cli/src/commands/restart.js +23 -0
  18. package/dist/cli/src/commands/restart.js.map +1 -0
  19. package/dist/cli/src/commands/status.js +58 -0
  20. package/dist/cli/src/commands/status.js.map +1 -0
  21. package/dist/cli/src/commands/uninstall.js +47 -0
  22. package/dist/cli/src/commands/uninstall.js.map +1 -0
  23. package/dist/cli/src/commands/up.js +33 -0
  24. package/dist/cli/src/commands/up.js.map +1 -0
  25. package/dist/cli/src/commands/upgrade.js +50 -0
  26. package/dist/cli/src/commands/upgrade.js.map +1 -0
  27. package/dist/cli/src/commands.js +16 -0
  28. package/dist/cli/src/commands.js.map +1 -0
  29. package/dist/cli/src/config.js +169 -0
  30. package/dist/cli/src/config.js.map +1 -0
  31. package/dist/cli/src/images.js +7 -0
  32. package/dist/cli/src/images.js.map +1 -0
  33. package/dist/cli/src/install.js +39 -0
  34. package/dist/cli/src/install.js.map +1 -0
  35. package/dist/cli/src/kube/api.js +231 -0
  36. package/dist/cli/src/kube/api.js.map +1 -0
  37. package/dist/cli/src/kube/apply.js +98 -0
  38. package/dist/cli/src/kube/apply.js.map +1 -0
  39. package/dist/cli/src/kube/rollout.js +166 -0
  40. package/dist/cli/src/kube/rollout.js.map +1 -0
  41. package/dist/cli/src/main.js +30 -0
  42. package/dist/cli/src/main.js.map +1 -0
  43. package/dist/cli/src/manifests/agent-sandbox.js +89 -0
  44. package/dist/cli/src/manifests/agent-sandbox.js.map +1 -0
  45. package/dist/cli/src/manifests/alasio.js +367 -0
  46. package/dist/cli/src/manifests/alasio.js.map +1 -0
  47. package/dist/cli/src/manifests/common.js +157 -0
  48. package/dist/cli/src/manifests/common.js.map +1 -0
  49. package/dist/cli/src/manifests/config.js +283 -0
  50. package/dist/cli/src/manifests/config.js.map +1 -0
  51. package/dist/cli/src/manifests/index.js +20 -0
  52. package/dist/cli/src/manifests/index.js.map +1 -0
  53. package/dist/cli/src/manifests/lake.js +56 -0
  54. package/dist/cli/src/manifests/lake.js.map +1 -0
  55. package/dist/cli/src/manifests/neon.js +656 -0
  56. package/dist/cli/src/manifests/neon.js.map +1 -0
  57. package/dist/cli/src/manifests/network-policies.js +86 -0
  58. package/dist/cli/src/manifests/network-policies.js.map +1 -0
  59. package/dist/cli/src/manifests/object-store.js +204 -0
  60. package/dist/cli/src/manifests/object-store.js.map +1 -0
  61. package/dist/cli/src/manifests/sandboxes.agents.x-k8s.io.json +6295 -0
  62. package/dist/cli/src/release.js +15 -0
  63. package/dist/cli/src/release.js.map +1 -0
  64. package/dist/cli/src/secrets.js +49 -0
  65. package/dist/cli/src/secrets.js.map +1 -0
  66. package/dist/cli/src/target.js +55 -0
  67. package/dist/cli/src/target.js.map +1 -0
  68. package/dist/cli/src/telegram.js +27 -0
  69. package/dist/cli/src/telegram.js.map +1 -0
  70. package/dist/src/kube/config.js +99 -0
  71. package/dist/src/kube/config.js.map +1 -0
  72. package/package.json +32 -0
@@ -0,0 +1,231 @@
1
+ /**
2
+ * The Kubernetes API, as alasio's command line calls it: objects applied, read, listed,
3
+ * patched and deleted as the plain JSON the API server takes and gives, over HTTP(S) with
4
+ * a kubeconfig's credentials. Nothing of client-node's object model is between the
5
+ * manifests and the cluster, as its serializer drops what its model lacks (a
6
+ * NetworkPolicy's `from`, a CRD schema's `x-kubernetes-*` keys); client-node only reads
7
+ * the kubeconfig, and runs commands in containers over its websocket.
8
+ *
9
+ * Objects are addressed by their kind, as KINDS lists those alasio reads or makes, so
10
+ * no discovery is needed.
11
+ */
12
+ import { request as httpRequest, STATUS_CODES } from "node:http";
13
+ import { request as httpsRequest } from "node:https";
14
+ import { buffer } from "node:stream/consumers";
15
+ import { inspect } from "node:util";
16
+ import { NodeStream } from "@effect/platform-node";
17
+ import { Exec, KubeConfig } from "@kubernetes/client-node";
18
+ import { Context, Effect, Layer, Predicate, Schema, Stream } from "effect";
19
+ /** The kinds alasio's command line reads or makes, by name: their API version, their resource's plural, and whether their objects are in a namespace. */
20
+ const KINDS = {
21
+ CustomResourceDefinition: { apiVersion: "apiextensions.k8s.io/v1", plural: "customresourcedefinitions", namespaced: false },
22
+ Namespace: { apiVersion: "v1", plural: "namespaces", namespaced: false },
23
+ Node: { apiVersion: "v1", plural: "nodes", namespaced: false },
24
+ ClusterRole: { apiVersion: "rbac.authorization.k8s.io/v1", plural: "clusterroles", namespaced: false },
25
+ ClusterRoleBinding: { apiVersion: "rbac.authorization.k8s.io/v1", plural: "clusterrolebindings", namespaced: false },
26
+ Role: { apiVersion: "rbac.authorization.k8s.io/v1", plural: "roles", namespaced: true },
27
+ RoleBinding: { apiVersion: "rbac.authorization.k8s.io/v1", plural: "rolebindings", namespaced: true },
28
+ ServiceAccount: { apiVersion: "v1", plural: "serviceaccounts", namespaced: true },
29
+ ConfigMap: { apiVersion: "v1", plural: "configmaps", namespaced: true },
30
+ Secret: { apiVersion: "v1", plural: "secrets", namespaced: true },
31
+ PersistentVolumeClaim: { apiVersion: "v1", plural: "persistentvolumeclaims", namespaced: true },
32
+ Service: { apiVersion: "v1", plural: "services", namespaced: true },
33
+ Pod: { apiVersion: "v1", plural: "pods", namespaced: true },
34
+ Event: { apiVersion: "v1", plural: "events", namespaced: true },
35
+ NetworkPolicy: { apiVersion: "networking.k8s.io/v1", plural: "networkpolicies", namespaced: true },
36
+ Deployment: { apiVersion: "apps/v1", plural: "deployments", namespaced: true },
37
+ StatefulSet: { apiVersion: "apps/v1", plural: "statefulsets", namespaced: true },
38
+ Job: { apiVersion: "batch/v1", plural: "jobs", namespaced: true },
39
+ CronJob: { apiVersion: "batch/v1", plural: "cronjobs", namespaced: true },
40
+ };
41
+ /** The kind of that name. */
42
+ export function kind(name) {
43
+ return { apiVersion: KINDS[name].apiVersion, kind: name };
44
+ }
45
+ /** The resource of `kind`; a kind not in KINDS is a defect of the caller's. */
46
+ function resource({ apiVersion, kind: name }) {
47
+ const found = Object.hasOwn(KINDS, name) ? KINDS[name] : undefined;
48
+ if (found?.apiVersion !== apiVersion)
49
+ throw new Error(`alasio does not know the kind ${name} of ${apiVersion}`);
50
+ return found;
51
+ }
52
+ /** The path of the objects of `kind`: in `namespace`, or, for a namespaced kind without one, in every namespace. */
53
+ function collectionPath(kind, namespace) {
54
+ const { plural, namespaced: inNamespace } = resource(kind);
55
+ const group = kind.apiVersion === "v1" ? "/api/v1" : `/apis/${kind.apiVersion}`;
56
+ return inNamespace && namespace ? `${group}/namespaces/${encodeURIComponent(namespace)}/${plural}` : `${group}/${plural}`;
57
+ }
58
+ /** The path of the object `ref`. */
59
+ function objectPath(ref) {
60
+ return `${collectionPath(ref, ref.namespace)}/${encodeURIComponent(ref.name)}`;
61
+ }
62
+ /** The reference of `object`, by its own kind, namespace and name. */
63
+ export function refOf(object) {
64
+ return { apiVersion: object.apiVersion ?? "", kind: object.kind ?? "", namespace: object.metadata?.namespace, name: object.metadata?.name ?? "" };
65
+ }
66
+ /** `ref` as people read it: `Kind namespace/name`, or `Kind name` when it is in no namespace. */
67
+ export function describeRef(ref) {
68
+ return `${ref.kind} ${ref.namespace ? `${ref.namespace}/` : ""}${ref.name}`;
69
+ }
70
+ /** The API refused a call, or could not be reached: the status it answered with, when it answered. */
71
+ export class KubeApiError extends Schema.TaggedError()("KubeApiError", {
72
+ /** The call, as its method and path. */
73
+ call: Schema.String,
74
+ /** The API's HTTP status (404 for absent, 409 for a conflict), when it answered. */
75
+ status: Schema.optional(Schema.Number),
76
+ /** What the API answered, or why it could not be reached. */
77
+ reason: Schema.String,
78
+ }) {
79
+ get message() {
80
+ return `Kubernetes ${this.status === undefined ? "could not be reached for" : `answered ${this.status} to`} ${this.call}: ${this.reason}`;
81
+ }
82
+ }
83
+ /** The kubeconfig cannot reach a cluster: it cannot be read, or lacks the context or cluster asked for. */
84
+ export class KubeconfigUnusable extends Schema.TaggedError()("KubeconfigUnusable", {
85
+ kubeconfig: Schema.String,
86
+ reason: Schema.String,
87
+ }) {
88
+ get message() {
89
+ return `the kubeconfig ${this.kubeconfig} cannot be used: ${this.reason}`;
90
+ }
91
+ }
92
+ /** A command run in a container came to no exit code. */
93
+ export class KubeExecError extends Schema.TaggedError()("KubeExecError", {
94
+ message: Schema.String,
95
+ }) {
96
+ }
97
+ /** Whether `error` is the API's answer `status`. */
98
+ export const hasStatus = (status) => (error) => error.status === status;
99
+ /** The manager alasio applies its objects as, which owns every field it sets. */
100
+ const FIELD_MANAGER = "alasio";
101
+ /** The Kubernetes API a kubeconfig reaches, as alasio's command line calls it. */
102
+ export class KubeApi extends Context.Service()("alasio/kube/KubeApi") {
103
+ /** The API `kubeconfig` reaches. */
104
+ static layer = (kubeconfig) => Layer.effect(KubeApi, Effect.map(loadKubeConfig(kubeconfig), makeKubeApi));
105
+ }
106
+ /** The kubeconfig `ref` names, at its context. */
107
+ const loadKubeConfig = (ref) => Effect.try({
108
+ try: () => {
109
+ const kubeConfig = new KubeConfig();
110
+ if (ref.path)
111
+ kubeConfig.loadFromFile(ref.path);
112
+ else
113
+ kubeConfig.loadFromDefault();
114
+ if (ref.context) {
115
+ const contexts = kubeConfig.getContexts().map(({ name }) => name);
116
+ if (!contexts.includes(ref.context))
117
+ throw new Error(`it has no context ${ref.context}, only ${contexts.join(", ") || "none"}`);
118
+ kubeConfig.setCurrentContext(ref.context);
119
+ }
120
+ if (!kubeConfig.getCurrentCluster())
121
+ throw new Error(`its context ${kubeConfig.getCurrentContext() || "(none)"} names no cluster`);
122
+ return kubeConfig;
123
+ },
124
+ catch: (cause) => new KubeconfigUnusable({ kubeconfig: ref.path ?? "of KUBECONFIG or ~/.kube/config", reason: cause instanceof Error ? cause.message : String(cause) }),
125
+ });
126
+ const describeCall = (call) => `${call.method} ${call.path}`;
127
+ /** `call` failed, without the API's answer: why, as `cause` (an Error, or an event of a websocket's that carries a message) says. */
128
+ const unreachable = (call, cause) => new KubeApiError({ call: describeCall(call), reason: Predicate.hasProperty(cause, "message") && Predicate.isString(cause.message) ? cause.message : inspect(cause) });
129
+ /** The exit code a `pods/exec` status reports: 0 on success, the process's own otherwise; null when it reports none. */
130
+ function exitCodeOf(status) {
131
+ if (status.status === "Success")
132
+ return 0;
133
+ const cause = status.details?.causes?.find((entry) => entry.reason === "ExitCode");
134
+ return cause ? Number(cause.message) : null;
135
+ }
136
+ /** The API `kubeConfig` reaches, at its current context. */
137
+ function makeKubeApi(kubeConfig) {
138
+ const server = new URL(kubeConfig.getCurrentCluster()?.server ?? "");
139
+ const request = server.protocol === "http:" ? httpRequest : httpsRequest;
140
+ const executor = new Exec(kubeConfig);
141
+ /** Sends `call` with the kubeconfig's credentials. */
142
+ const send = (call) => Effect.tryPromise({
143
+ try: async () => {
144
+ const query = new URLSearchParams(Object.entries(call.query ?? {}).filter((entry) => entry[1] !== undefined));
145
+ const body = call.body === undefined ? undefined : JSON.stringify(call.body.content);
146
+ const options = {
147
+ method: call.method,
148
+ headers: { Accept: "application/json", ...(call.body && body !== undefined ? { "Content-Type": call.body.contentType, "Content-Length": Buffer.byteLength(body) } : {}) },
149
+ };
150
+ await kubeConfig.applyToHTTPSOptions(options);
151
+ const url = new URL(`${server.pathname.replace(/\/$/u, "")}${call.path}${query.size ? `?${query}` : ""}`, server);
152
+ const sent = request(url, options);
153
+ sent.end(body);
154
+ return sent;
155
+ },
156
+ catch: (cause) => unreachable(call, cause),
157
+ });
158
+ const readAll = (call, stream) => Effect.tryPromise({ try: () => buffer(stream), catch: (cause) => unreachable(call, cause) });
159
+ /** The API's refusal of `call`: the status of `response`, and the message of the Status its body holds. */
160
+ const refusal = (call, response) => readAll(call, response).pipe(Effect.flatMap((content) => {
161
+ const status = response.statusCode ?? 0;
162
+ const text = content.toString("utf8").trim();
163
+ let reason = text || STATUS_CODES[status] || "no message";
164
+ try {
165
+ const parsed = JSON.parse(text);
166
+ if (Predicate.hasProperty(parsed, "message") && Predicate.isString(parsed.message))
167
+ reason = parsed.message;
168
+ }
169
+ catch {
170
+ // Not JSON: the text is the message.
171
+ }
172
+ return Effect.fail(new KubeApiError({ call: describeCall(call), status, reason }));
173
+ }));
174
+ /** The response to `call`, open while the scope is; a status of 400 or over is its refusal. */
175
+ const open = (call) => Effect.acquireRelease(Effect.flatMap(send(call), (sent) => Effect.callback((resume) => {
176
+ sent.on("response", (response) => resume(Effect.succeed(response)));
177
+ sent.on("error", (cause) => resume(Effect.fail(unreachable(call, cause))));
178
+ return Effect.sync(() => sent.destroy());
179
+ })), (response) => Effect.sync(() => response.destroy())).pipe(Effect.tap((response) => ((response.statusCode ?? 0) >= 400 ? refusal(call, response) : Effect.void)));
180
+ /** The JSON the API answers `call` with. */
181
+ const json = (call) => Effect.scoped(Effect.flatMap(open(call), (response) => readAll(call, response))).pipe(Effect.map((content) => JSON.parse(content.toString("utf8"))));
182
+ const exec = Effect.fnUntraced(function* ({ namespace, pod, container }, command, { stdin, stdout, stderr, tty }) {
183
+ const call = { method: "GET", path: `/api/v1/namespaces/${namespace}/pods/${pod}/exec` };
184
+ // Held in an object: the status callback sets it where control flow cannot see.
185
+ const reported = { status: null };
186
+ yield* Effect.callback((resume) => {
187
+ let socket = null;
188
+ executor
189
+ .exec(namespace, pod, container, [...command], stdout, stderr, stdin, tty, (status) => {
190
+ reported.status = status;
191
+ })
192
+ .then((opened) => {
193
+ socket = opened;
194
+ opened.on("close", () => resume(Effect.void));
195
+ opened.on("error", (cause) => resume(Effect.fail(unreachable(call, cause))));
196
+ }, (cause) => resume(Effect.fail(unreachable(call, cause))));
197
+ return Effect.sync(() => socket?.close());
198
+ });
199
+ const exitCode = reported.status ? exitCodeOf(reported.status) : null;
200
+ if (exitCode === null) {
201
+ return yield* new KubeExecError({
202
+ message: `${command[0] ?? "the command"} in ${namespace}/${pod} came to no exit code${reported.status?.message ? `: ${reported.status.message}` : ""}`,
203
+ });
204
+ }
205
+ return exitCode;
206
+ });
207
+ return KubeApi.of({
208
+ server: server.href.replace(/\/$/u, ""),
209
+ apply: (object) => json({
210
+ method: "PATCH",
211
+ path: objectPath(refOf(object)),
212
+ query: { fieldManager: FIELD_MANAGER, force: "true" },
213
+ // JSON is YAML, which an apply patch is sent as.
214
+ body: { contentType: "application/apply-patch+yaml", content: object },
215
+ }),
216
+ get: (ref) => json({ method: "GET", path: objectPath(ref) }).pipe(Effect.catchIf(hasStatus(404), () => Effect.succeed(null))),
217
+ list: (kind, { namespace, labelSelector, fieldSelector } = {}) => json({ method: "GET", path: collectionPath(kind, namespace), query: { labelSelector, fieldSelector } }).pipe(Effect.map(({ items }) => items.map((item) => ({ ...item, apiVersion: kind.apiVersion, kind: kind.kind })))),
218
+ patch: (ref, patch, fieldManager) => json({ method: "PATCH", path: objectPath(ref), query: { fieldManager }, body: { contentType: "application/merge-patch+json", content: patch } }),
219
+ remove: (ref) => json({ method: "DELETE", path: objectPath(ref), query: { propagationPolicy: "Background" } }).pipe(Effect.asVoid, Effect.catchIf(hasStatus(404), () => Effect.void)),
220
+ logs: (namespace, pod, { container, follow = false, sinceSeconds }) => {
221
+ const call = {
222
+ method: "GET",
223
+ path: `/api/v1/namespaces/${encodeURIComponent(namespace)}/pods/${encodeURIComponent(pod)}/log`,
224
+ query: { container, follow: String(follow), sinceSeconds: sinceSeconds === undefined ? undefined : String(sinceSeconds) },
225
+ };
226
+ return Stream.unwrap(Effect.map(open(call), (response) => NodeStream.fromReadable({ evaluate: () => response, onError: (cause) => unreachable(call, cause) })));
227
+ },
228
+ exec,
229
+ });
230
+ }
231
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../../src/kube/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ import { Effect } from "effect";
2
+ import { RELEASE } from "../manifests/common.js";
3
+ import { describeRef, kind, KubeApi, refOf } from "./api.js";
4
+ import { awaitGone, awaitReady, selectorOf } from "./rollout.js";
5
+ /** The label every object of an installation carries, whose value is the installation: what prune and removal find its objects by. */
6
+ const INSTALLATION_LABEL = "alasio.dev/installation";
7
+ /** The installation's objects, as a label selector. */
8
+ export const INSTALLATION_SELECTOR = selectorOf({ [INSTALLATION_LABEL]: RELEASE });
9
+ /** The kinds alasio makes, in the order it applies them; each phase's objects are applied together. */
10
+ const PHASES = [
11
+ ["CustomResourceDefinition"],
12
+ ["Namespace"],
13
+ ["ServiceAccount", "ClusterRole", "ClusterRoleBinding", "Role", "RoleBinding", "ConfigMap", "PersistentVolumeClaim", "Service", "NetworkPolicy"],
14
+ ["Job"],
15
+ ["Deployment", "StatefulSet", "CronJob"],
16
+ ];
17
+ /** The kinds alasio makes, in the order it applies them. */
18
+ const MADE_KINDS = PHASES.flat().map(kind);
19
+ /**
20
+ * What holds data, which neither a prune nor a removal deletes unless asked to: volumes,
21
+ * the namespaces sessions' volumes are in, and the CRD whose deletion would delete every
22
+ * Sandbox, and with them their volumes.
23
+ */
24
+ const HOLDS_DATA = new Set(["PersistentVolumeClaim", "Namespace", "CustomResourceDefinition"]);
25
+ /** Whether `ref` holds data (HOLDS_DATA). */
26
+ const holdsData = (ref) => HOLDS_DATA.has(ref.kind);
27
+ /** `object`, labelled as the installation's. */
28
+ export function labelled(object) {
29
+ return { ...object, metadata: { ...object.metadata, labels: { ...object.metadata?.labels, [INSTALLATION_LABEL]: RELEASE } } };
30
+ }
31
+ const key = (ref) => `${ref.apiVersion}/${ref.kind}/${ref.namespace ?? ""}/${ref.name}`;
32
+ /** The installation's objects of `kinds`, as it has them now. */
33
+ const installed = (kinds) => Effect.flatMap(KubeApi, (kube) => Effect.forEach(kinds, (each) => kube.list(each, { labelSelector: INSTALLATION_SELECTOR }), { concurrency: 4 }).pipe(Effect.map((lists) => lists.flat().map(refOf))));
34
+ /** Runs `job` to completion afresh: one of its name that ran before is deleted first, as a Job's pod template cannot change, and it is deleted once done. */
35
+ const runJob = Effect.fnUntraced(function* (job, options) {
36
+ const kube = yield* KubeApi;
37
+ const ref = refOf(job);
38
+ if (yield* kube.get(ref)) {
39
+ yield* kube.remove(ref);
40
+ yield* awaitGone([ref], options);
41
+ }
42
+ yield* Effect.logInfo(`running ${describeRef(ref)}`);
43
+ yield* kube.apply(job);
44
+ yield* awaitReady([ref], options);
45
+ yield* kube.remove(ref);
46
+ });
47
+ /** Deletes the installation's objects that are not `desired`, keeping what holds data. */
48
+ const prune = Effect.fnUntraced(function* (desired) {
49
+ const kube = yield* KubeApi;
50
+ const wanted = new Set(desired.map((object) => key(refOf(object))));
51
+ // Workloads first, what they need after.
52
+ const stale = (yield* installed(MADE_KINDS.toReversed())).filter((ref) => !wanted.has(key(ref)));
53
+ for (const ref of stale) {
54
+ if (holdsData(ref)) {
55
+ yield* Effect.logInfo(`kept ${describeRef(ref)}, no longer part of alasio, as it holds data; alasio uninstall --purge deletes it`);
56
+ }
57
+ else {
58
+ yield* kube.remove(ref);
59
+ yield* Effect.logInfo(`deleted ${describeRef(ref)}, no longer part of alasio`);
60
+ }
61
+ }
62
+ });
63
+ /** Applies the installation `objects` are, deletes what it no longer has, and waits until its workloads run. */
64
+ export const applyInstallation = Effect.fnUntraced(function* (objects, options) {
65
+ const kube = yield* KubeApi;
66
+ const desired = objects.map(labelled);
67
+ const unplaced = desired.filter((object) => !MADE_KINDS.some((each) => each.kind === object.kind && each.apiVersion === object.apiVersion));
68
+ if (unplaced.length > 0)
69
+ return yield* Effect.die(new Error(`alasio does not apply ${unplaced.map((object) => describeRef(refOf(object))).join(", ")}`));
70
+ const ofPhase = (phase) => desired.filter((object) => phase.some((name) => name === object.kind));
71
+ yield* Effect.logInfo(`applying ${desired.length} objects to ${kube.server}`);
72
+ for (const phase of PHASES) {
73
+ const batch = ofPhase(phase);
74
+ if (phase.includes("Job")) {
75
+ for (const job of batch)
76
+ yield* runJob(job, options);
77
+ continue;
78
+ }
79
+ yield* Effect.forEach(batch, (object) => kube.apply(object), { concurrency: 8, discard: true });
80
+ if (phase.includes("CustomResourceDefinition"))
81
+ yield* awaitReady(batch.map(refOf), options);
82
+ }
83
+ yield* prune(desired);
84
+ yield* awaitReady(ofPhase(["Deployment", "StatefulSet"]).map(refOf), options);
85
+ });
86
+ /** Deletes the installation's objects, but for what holds data unless `purge`, and with `purge` waits until that is gone: what it deleted. */
87
+ export const removeInstallation = Effect.fnUntraced(function* ({ purge }, options) {
88
+ const kube = yield* KubeApi;
89
+ const found = yield* installed(MADE_KINDS.toReversed());
90
+ const removed = found.filter((ref) => purge || !holdsData(ref));
91
+ yield* Effect.forEach(removed, (ref) => kube.remove(ref), { concurrency: 8, discard: true });
92
+ for (const ref of found.filter((each) => !removed.includes(each)))
93
+ yield* Effect.logInfo(`kept ${describeRef(ref)}, as it holds data`);
94
+ if (purge)
95
+ yield* awaitGone(removed.filter(holdsData), options);
96
+ return removed;
97
+ });
98
+ //# sourceMappingURL=apply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../../../src/kube/apply.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,166 @@
1
+ import { Duration, Effect, Schedule, Schema } from "effect";
2
+ import { describeRef, kind, KubeApi } from "./api.js";
3
+ const READY = { _tag: "Ready" };
4
+ const waiting = (status) => ({ _tag: "Waiting", status });
5
+ /** Where `object` is: a CRD, Job, Deployment or StatefulSet by its status, anything else ready once it exists. */
6
+ export function readiness(object) {
7
+ const { metadata, spec, status } = object;
8
+ const condition = (type) => status?.conditions?.find((each) => each.type === type && each.status === "True");
9
+ const unseen = (status?.observedGeneration ?? 0) < (metadata?.generation ?? 0);
10
+ const replicas = spec?.replicas ?? 1;
11
+ switch (object.kind) {
12
+ case "CustomResourceDefinition":
13
+ return condition("Established") ? READY : waiting("not established");
14
+ case "Job": {
15
+ const failed = condition("Failed");
16
+ if (failed)
17
+ return { _tag: "Failed", reason: [failed.reason, failed.message].filter(Boolean).join(": ") || "it failed" };
18
+ return condition("Complete") ? READY : waiting("running");
19
+ }
20
+ case "Deployment": {
21
+ const updated = status?.updatedReplicas ?? 0;
22
+ const available = status?.availableReplicas ?? 0;
23
+ if (unseen)
24
+ return waiting("not yet rolled out");
25
+ if (updated < replicas)
26
+ return waiting(`${updated} of ${replicas} updated`);
27
+ if ((status?.replicas ?? 0) > updated)
28
+ return waiting(`${(status?.replicas ?? 0) - updated} old pods stopping`);
29
+ return available < replicas ? waiting(`${available} of ${replicas} available`) : READY;
30
+ }
31
+ case "StatefulSet": {
32
+ const updated = status?.updatedReplicas ?? 0;
33
+ const ready = status?.readyReplicas ?? 0;
34
+ if (unseen)
35
+ return waiting("not yet rolled out");
36
+ if (updated < replicas)
37
+ return waiting(`${updated} of ${replicas} updated`);
38
+ return ready < replicas ? waiting(`${ready} of ${replicas} ready`) : READY;
39
+ }
40
+ default:
41
+ return READY;
42
+ }
43
+ }
44
+ /** Something waited for that is not ready, as people read it: the object, and what it is at. */
45
+ const NotReadyObject = Schema.Struct({
46
+ object: Schema.String,
47
+ status: Schema.String,
48
+ /** Why: its pods' state and the cluster's warnings about it. */
49
+ why: Schema.Array(Schema.String),
50
+ });
51
+ const indented = ({ object, status, why }) => [` ${object}: ${status}`, ...why.map((line) => ` ${line}`)].join("\n");
52
+ /** A wait gave up: what it still waited for, and why each was not ready. */
53
+ export class NotReadyInTime extends Schema.TaggedError()("NotReadyInTime", {
54
+ /** How long it was given, in seconds. */
55
+ within: Schema.Number,
56
+ waiting: Schema.Array(NotReadyObject),
57
+ }) {
58
+ get message() {
59
+ return `not ready within ${this.within}s, still waiting for:\n${this.waiting.map(indented).join("\n")}`;
60
+ }
61
+ }
62
+ /** Something waited for failed, as a Job that ran out of retries: what, and why. */
63
+ export class RolloutFailed extends Schema.TaggedError()("RolloutFailed", {
64
+ failed: NotReadyObject,
65
+ }) {
66
+ get message() {
67
+ return `failed:\n${indented(this.failed)}`;
68
+ }
69
+ }
70
+ /** A look found something still waiting; the wait's NotReadyInTime says what when it gives up. */
71
+ class Pending extends Schema.TaggedError()("Pending", {}) {
72
+ }
73
+ const POD = kind("Pod");
74
+ const EVENT = kind("Event");
75
+ /** `labels` as a label selector. */
76
+ export function selectorOf(labels) {
77
+ return Object.entries(labels).map(([key, value]) => `${key}=${value}`).join(",");
78
+ }
79
+ /** What is wrong with `container`, unless nothing is. */
80
+ function containerProblem(pod, container) {
81
+ const { state, lastState, restartCount } = container;
82
+ const where = `container ${container.name} of pod ${pod}`;
83
+ const lastExit = lastState?.terminated && restartCount > 0
84
+ ? `, restarted ${restartCount} times, last exiting with ${lastState.terminated.exitCode}${lastState.terminated.reason ? ` (${lastState.terminated.reason})` : ""}`
85
+ : "";
86
+ if (state?.waiting)
87
+ return `${where} is waiting: ${[state.waiting.reason, state.waiting.message].filter(Boolean).join(": ")}${lastExit}`;
88
+ if (state?.terminated && state.terminated.exitCode !== 0) {
89
+ return `${where} exited with ${state.terminated.exitCode}${state.terminated.reason ? ` (${state.terminated.reason})` : ""}${state.terminated.message ? `: ${state.terminated.message}` : ""}`;
90
+ }
91
+ if (state?.running && !container.ready)
92
+ return `${where} runs, not ready${lastExit}`;
93
+ return null;
94
+ }
95
+ /** What is wrong with `pod`: unscheduled, or its containers' problems; nothing when it is ready. */
96
+ export function podProblems(pod) {
97
+ const name = pod.metadata?.name ?? "";
98
+ const unscheduled = pod.status?.conditions?.find(({ type, status }) => type === "PodScheduled" && status === "False");
99
+ if (unscheduled)
100
+ return [`pod ${name} is not scheduled: ${unscheduled.message ?? unscheduled.reason ?? "no node takes it"}`];
101
+ const problems = [...(pod.status?.initContainerStatuses ?? []), ...(pod.status?.containerStatuses ?? [])]
102
+ .map((container) => containerProblem(name, container))
103
+ .filter((problem) => problem !== null);
104
+ const ready = pod.status?.conditions?.some(({ type, status }) => type === "Ready" && status === "True") ?? false;
105
+ return problems.length > 0 || ready ? problems : [`pod ${name} is ${pod.status?.phase ?? "not yet started"}`];
106
+ }
107
+ /** When `event` last happened. */
108
+ const lastSeen = (event) => new Date(event.lastTimestamp ?? event.eventTime ?? event.metadata.creationTimestamp ?? 0).getTime();
109
+ /**
110
+ * Why `ref` is not ready: its pods' problems, and the latest of the cluster's warnings
111
+ * about them, it, or what it made (a Deployment's ReplicaSets, named after it).
112
+ */
113
+ export const diagnose = Effect.fnUntraced(function* (ref) {
114
+ const kube = yield* KubeApi;
115
+ const object = yield* kube.get(ref);
116
+ const matchLabels = object?.spec?.selector?.matchLabels;
117
+ const pods = matchLabels ? yield* kube.list(POD, { namespace: ref.namespace, labelSelector: selectorOf(matchLabels) }) : [];
118
+ const warnings = ref.namespace ? yield* kube.list(EVENT, { namespace: ref.namespace, fieldSelector: "type=Warning" }) : [];
119
+ const about = (names) => warnings
120
+ .filter(({ involvedObject }) => names.some((name) => involvedObject.name === name || involvedObject.name?.startsWith(`${name}-`)))
121
+ .sort((a, b) => lastSeen(b) - lastSeen(a))
122
+ .map(({ reason, message }) => `warning: ${[reason, message?.trim()].filter(Boolean).join(": ")}`)
123
+ .filter((line, index, lines) => lines.indexOf(line) === index)
124
+ .slice(0, 3);
125
+ if (pods.length === 0)
126
+ return [...(matchLabels ? ["no pods"] : []), ...about([ref.name])];
127
+ const notReady = pods.filter((pod) => podProblems(pod).length > 0);
128
+ return [...notReady.flatMap(podProblems), ...about(notReady.map((pod) => pod.metadata?.name ?? ""))];
129
+ });
130
+ /**
131
+ * Looks at every ref by `look` until each is ready, every `poll` for `timeout`, saying
132
+ * what it still waits for whenever that changes; fails with why when one fails, or when
133
+ * time runs out.
134
+ */
135
+ const awaitAll = Effect.fnUntraced(function* (refs, look, why, { timeout, poll }) {
136
+ // What the last look found still waiting, and what was last said of it.
137
+ let pending = [];
138
+ let said = "";
139
+ const once = Effect.gen(function* () {
140
+ const states = yield* Effect.forEach(refs, (ref) => Effect.map(look(ref), (state) => [ref, state]), { concurrency: 8 });
141
+ for (const [ref, state] of states) {
142
+ if (state._tag === "Failed")
143
+ return yield* new RolloutFailed({ failed: { object: describeRef(ref), status: state.reason, why: yield* why(ref) } });
144
+ }
145
+ pending = states.flatMap(([ref, state]) => (state._tag === "Waiting" ? [[ref, state.status]] : []));
146
+ if (pending.length === 0)
147
+ return;
148
+ const saying = pending.map(([ref, status]) => `${ref.name} (${status})`).join(", ");
149
+ if (saying !== said) {
150
+ said = saying;
151
+ yield* Effect.logInfo(`waiting for ${saying}`);
152
+ }
153
+ return yield* new Pending();
154
+ });
155
+ yield* once.pipe(Effect.retry({
156
+ while: (error) => error._tag !== "RolloutFailed",
157
+ schedule: Schedule.max([Schedule.spaced(poll), Schedule.during(timeout)]),
158
+ }), Effect.catchTag("Pending", () => Effect.forEach(pending, ([ref, status]) => Effect.map(why(ref), (lines) => ({ object: describeRef(ref), status, why: lines }))).pipe(Effect.flatMap((notReady) => Effect.fail(new NotReadyInTime({ within: Duration.toSeconds(timeout), waiting: notReady }))))));
159
+ });
160
+ /** The object `ref`, or null when there is none. */
161
+ const current = (ref) => Effect.flatMap(KubeApi, (kube) => kube.get(ref));
162
+ /** Waits until every ref is ready (readiness). */
163
+ export const awaitReady = (refs, options) => awaitAll(refs, (ref) => Effect.map(current(ref), (object) => (object ? readiness(object) : waiting("not found"))), diagnose, options);
164
+ /** Waits until every ref is gone, its deletion done. */
165
+ export const awaitGone = (refs, options) => awaitAll(refs, (ref) => Effect.map(current(ref), (object) => (object ? waiting("being deleted") : READY)), (ref) => Effect.map(current(ref), (object) => (object?.metadata?.finalizers?.length ? [`waits on its finalizers: ${object.metadata.finalizers.join(", ")}`] : [])), options);
166
+ //# sourceMappingURL=rollout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rollout.js","sourceRoot":"","sources":["../../../../src/kube/rollout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * alasio's command line: `npx alasio <command>`, which installs alasio, runs it, and
4
+ * looks after it, on a cluster it makes on this machine or one a kubeconfig reaches.
5
+ *
6
+ * What a command is doing is said on stderr as it goes; what it answers, on stdout. A
7
+ * command that fails says why on stderr and exits with 1, or 130 when interrupted.
8
+ */
9
+ import { NodeRuntime, NodeServices } from "@effect/platform-node";
10
+ import { Cause, Console, Effect, Layer, Logger, Result } from "effect";
11
+ import { CliError, Command } from "effect/cli";
12
+ import { alasio } from "./commands.js";
13
+ import { VERSION } from "./release.js";
14
+ import { TelegramBotApi } from "./telegram.js";
15
+ /** Progress, as a line of its message on stderr. */
16
+ const progress = Logger.make(({ message }) => {
17
+ process.stderr.write(`${(Array.isArray(message) ? message : [message]).map(String).join(" ")}\n`);
18
+ });
19
+ /** What failed, on stderr: a typed failure by its message (the command line's own, which it showed, not again), a defect whole. */
20
+ const report = (cause) => {
21
+ if (Cause.hasInterruptsOnly(cause))
22
+ return Effect.void;
23
+ const error = Cause.findError(cause);
24
+ if (Result.isSuccess(error)) {
25
+ return CliError.isCliError(error.success) ? Effect.void : Console.error(`alasio: ${error.success instanceof Error ? error.success.message : String(error.success)}`);
26
+ }
27
+ return Console.error(Cause.pretty(cause));
28
+ };
29
+ Command.run(alasio, { version: VERSION }).pipe(Effect.tapCause(report), Effect.provide(Layer.mergeAll(TelegramBotApi.layer, Logger.layer([progress]))), Effect.provide(NodeServices.layer), NodeRuntime.runMain({ disableErrorReporting: true }));
30
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../../src/main.ts"],"names":[],"mappings":";AACA;;;;;;GAMG;AACH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,oDAAoD;AACpD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;IAC3C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACpG,CAAC,CAAC,CAAC;AAEH,mIAAmI;AACnI,MAAM,MAAM,GAAG,CAAC,KAA2B,EAAuB,EAAE;IAClE,IAAI,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC;IACvD,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,KAAK,CAAC,OAAO,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACvK,CAAC;IACD,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5C,CAAC,CAAC;AAEF,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAC5C,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EACvB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAC9E,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,EAClC,WAAW,CAAC,OAAO,CAAC,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAAC,CACrD,CAAC"}