@alchemy.run/kubernetes 0.0.0 → 2.0.0-beta.84

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 (94) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +41 -4
  3. package/lib/BuiltinAdapters.d.ts +23 -0
  4. package/lib/BuiltinAdapters.d.ts.map +1 -0
  5. package/lib/BuiltinAdapters.js +124 -0
  6. package/lib/BuiltinAdapters.js.map +1 -0
  7. package/lib/Client.d.ts +80 -0
  8. package/lib/Client.d.ts.map +1 -0
  9. package/lib/Client.js +296 -0
  10. package/lib/Client.js.map +1 -0
  11. package/lib/ClusterAdapter.d.ts +322 -0
  12. package/lib/ClusterAdapter.d.ts.map +1 -0
  13. package/lib/ClusterAdapter.js +65 -0
  14. package/lib/ClusterAdapter.js.map +1 -0
  15. package/lib/Connection.d.ts +210 -0
  16. package/lib/Connection.d.ts.map +1 -0
  17. package/lib/Connection.js +58 -0
  18. package/lib/Connection.js.map +1 -0
  19. package/lib/Deployment.d.ts +382 -0
  20. package/lib/Deployment.d.ts.map +1 -0
  21. package/lib/Deployment.js +533 -0
  22. package/lib/Deployment.js.map +1 -0
  23. package/lib/HelmChart.d.ts +147 -0
  24. package/lib/HelmChart.d.ts.map +1 -0
  25. package/lib/HelmChart.js +248 -0
  26. package/lib/HelmChart.js.map +1 -0
  27. package/lib/Job.d.ts +314 -0
  28. package/lib/Job.d.ts.map +1 -0
  29. package/lib/Job.js +426 -0
  30. package/lib/Job.js.map +1 -0
  31. package/lib/LocalCluster.d.ts +243 -0
  32. package/lib/LocalCluster.d.ts.map +1 -0
  33. package/lib/LocalCluster.js +359 -0
  34. package/lib/LocalCluster.js.map +1 -0
  35. package/lib/Manifest.d.ts +148 -0
  36. package/lib/Manifest.d.ts.map +1 -0
  37. package/lib/Manifest.js +200 -0
  38. package/lib/Manifest.js.map +1 -0
  39. package/lib/Objects.d.ts +60 -0
  40. package/lib/Objects.d.ts.map +1 -0
  41. package/lib/Objects.js +132 -0
  42. package/lib/Objects.js.map +1 -0
  43. package/lib/Providers.d.ts +24 -0
  44. package/lib/Providers.d.ts.map +1 -0
  45. package/lib/Providers.js +36 -0
  46. package/lib/Providers.js.map +1 -0
  47. package/lib/index.d.ts +10 -0
  48. package/lib/index.d.ts.map +1 -0
  49. package/lib/index.js +10 -0
  50. package/lib/index.js.map +1 -0
  51. package/lib/internal/declared.d.ts +19 -0
  52. package/lib/internal/declared.d.ts.map +1 -0
  53. package/lib/internal/declared.js +435 -0
  54. package/lib/internal/declared.js.map +1 -0
  55. package/lib/internal/helm.d.ts +65 -0
  56. package/lib/internal/helm.d.ts.map +1 -0
  57. package/lib/internal/helm.js +173 -0
  58. package/lib/internal/helm.js.map +1 -0
  59. package/lib/internal/kind.d.ts +17 -0
  60. package/lib/internal/kind.d.ts.map +1 -0
  61. package/lib/internal/kind.js +31 -0
  62. package/lib/internal/kind.js.map +1 -0
  63. package/lib/internal/kubeconfig.d.ts +79 -0
  64. package/lib/internal/kubeconfig.d.ts.map +1 -0
  65. package/lib/internal/kubeconfig.js +222 -0
  66. package/lib/internal/kubeconfig.js.map +1 -0
  67. package/lib/internal/registry.d.ts +44 -0
  68. package/lib/internal/registry.d.ts.map +1 -0
  69. package/lib/internal/registry.js +72 -0
  70. package/lib/internal/registry.js.map +1 -0
  71. package/lib/internal/workload.d.ts +127 -0
  72. package/lib/internal/workload.d.ts.map +1 -0
  73. package/lib/internal/workload.js +411 -0
  74. package/lib/internal/workload.js.map +1 -0
  75. package/package.json +55 -3
  76. package/src/BuiltinAdapters.ts +194 -0
  77. package/src/Client.ts +465 -0
  78. package/src/ClusterAdapter.ts +370 -0
  79. package/src/Connection.ts +234 -0
  80. package/src/Deployment.ts +851 -0
  81. package/src/HelmChart.ts +388 -0
  82. package/src/Job.ts +689 -0
  83. package/src/LocalCluster.ts +631 -0
  84. package/src/Manifest.ts +295 -0
  85. package/src/Objects.ts +213 -0
  86. package/src/Providers.ts +52 -0
  87. package/src/globals.d.ts +2 -0
  88. package/src/index.ts +9 -0
  89. package/src/internal/declared.ts +471 -0
  90. package/src/internal/helm.ts +245 -0
  91. package/src/internal/kind.ts +43 -0
  92. package/src/internal/kubeconfig.ts +364 -0
  93. package/src/internal/registry.ts +108 -0
  94. package/src/internal/workload.ts +503 -0
package/lib/Job.js ADDED
@@ -0,0 +1,426 @@
1
+ import { isResolved } from "alchemy/Diff";
2
+ import * as Output from "alchemy/Output";
3
+ import { createPhysicalName } from "alchemy/PhysicalName";
4
+ import { Platform } from "alchemy/Platform";
5
+ import * as Provider from "alchemy/Provider";
6
+ import { Resource } from "alchemy/Resource";
7
+ import { packEnvValue, unpackEnvValue, RuntimeContext } from "alchemy/RuntimeContext";
8
+ import { Stack } from "alchemy/Stack";
9
+ import { createInternalTags } from "alchemy/Tags";
10
+ import { unwrapRedacted } from "alchemy/Util/data";
11
+ import { sha256Object } from "alchemy/Util/sha256";
12
+ import * as Effect from "effect/Effect";
13
+ import { connectCluster, deleteObjects, ifClusterExists, readObject, reconcileObjects, } from "./Client.js";
14
+ import { findClusterAdapter, } from "./ClusterAdapter.js";
15
+ import { toConnection } from "./Connection.js";
16
+ import { makeConnectionRegistry } from "./internal/registry.js";
17
+ import { collectBindingEnv, containerEnvValue, connectionIdentity, connectionOfOutput, deepMerge, imagePlatformOf, makeJobBootstrap, resolveWorkloadImage, tryConnectionOf, workloadImageHash, } from "./internal/workload.js";
18
+ export const isJob = (value) => typeof value === "object" && value !== null && "Type" in value && value.Type === "Kubernetes.Job";
19
+ /**
20
+ * Run-to-completion work on any Kubernetes cluster, as a container image
21
+ * or an Effect program.
22
+ *
23
+ * `Job` provisions a Kubernetes `Job` (or `CronJob` when `schedule` is
24
+ * set) via server-side apply and a ServiceAccount, plus — through the
25
+ * target cluster's platform adapter — workload identity and a container
26
+ * image from exactly one of three sources flat on props: `main` (bundle an
27
+ * inline Effect program whose impl returns `{ run }`), `context` (build
28
+ * your own Dockerfile), or `image` (a pre-built registry reference).
29
+ * `main` and `context` images are built on the deploying machine and
30
+ * pushed to the connection's registry (`Kubernetes.LocalCluster` includes
31
+ * one; EKS uses ECR; GKE uses Artifact Registry). On `AWS.EKS.Cluster`
32
+ * targets, bindings attach IAM policy statements to a generated
33
+ * pod-identity role; on `GCP.Container.Cluster` targets, GCP bindings grant
34
+ * their IAM roles to the Kubernetes ServiceAccount's Workload Identity
35
+ * Federation principal — exactly like `Kubernetes.Deployment`.
36
+ * ### Creating a Job
37
+ * **Example:** Remote image (external — no Effect runtime in the container)
38
+ * ```typescript
39
+ * const migrate = yield* Kubernetes.Job("DbMigrate", {
40
+ * cluster,
41
+ * image: "ghcr.io/acme/migrator:v3",
42
+ * backoffLimit: 2,
43
+ * });
44
+ * ```
45
+ *
46
+ * **Example:** Inline Effect program
47
+ * ```typescript
48
+ * const cluster = yield* Kubernetes.LocalCluster("Cluster", {
49
+ * name: "alchemy",
50
+ * });
51
+ *
52
+ * const hello = yield* Kubernetes.Job(
53
+ * "Hello",
54
+ * { cluster, main: import.meta.url, backoffLimit: 2 },
55
+ * Effect.gen(function* () {
56
+ * return {
57
+ * run: Effect.log("hello from a Job"),
58
+ * };
59
+ * }),
60
+ * );
61
+ * ```
62
+ *
63
+ * **Example:** Inline Effect program with a DynamoDB binding (EKS)
64
+ * ```typescript
65
+ * const seed = yield* Kubernetes.Job(
66
+ * "SeedData",
67
+ * { cluster, main: import.meta.url },
68
+ * Effect.gen(function* () {
69
+ * const putItem = yield* AWS.DynamoDB.PutItem(table);
70
+ * return {
71
+ * run: Effect.gen(function* () {
72
+ * yield* putItem({ Item: { id: { S: "seed" } } });
73
+ * }),
74
+ * };
75
+ * }).pipe(Effect.provide(AWS.DynamoDB.PutItemHttp)),
76
+ * );
77
+ * ```
78
+ *
79
+ * **Example:** Tagged Effect program
80
+ * ```typescript
81
+ * export class Backfill extends Kubernetes.Job<Backfill, {
82
+ * progress: () => Effect.Effect<number>;
83
+ * }>()("Backfill") {}
84
+ *
85
+ * export default Backfill.make(
86
+ * { cluster, main: import.meta.url, backoffLimit: 1 },
87
+ * Effect.gen(function* () {
88
+ * return {
89
+ * run: Effect.gen(function* () { }),
90
+ * progress: () => Effect.succeed(0),
91
+ * };
92
+ * }),
93
+ * );
94
+ * ```
95
+ *
96
+ * ### Bundling & Tree-shaking
97
+ * `main` is bundled with rolldown at deploy time. Unused code is
98
+ * tree-shaken. `effect`, alchemy, and `@distilled.cloud` are marked
99
+ * pure so unused parts prune more aggressively. Your app is not
100
+ * marked pure.
101
+ *
102
+ * **Example:** Mark additional packages as pure
103
+ * Only list packages with no top-level side effects.
104
+ * ```typescript
105
+ * {
106
+ * main: import.meta.url,
107
+ * build: {
108
+ * pure: { packages: ["my-lib", "@my-scope/*"] },
109
+ * },
110
+ * }
111
+ * ```
112
+ *
113
+ * **Example:** Turn it off
114
+ * ```typescript
115
+ * {
116
+ * main: import.meta.url,
117
+ * build: { pure: false },
118
+ * }
119
+ * ```
120
+ *
121
+ * ### Scheduling
122
+ * **Example:** Nightly CronJob
123
+ * ```typescript
124
+ * const nightly = yield* Kubernetes.Job("NightlyBackfill", {
125
+ * cluster,
126
+ * main: import.meta.url,
127
+ * schedule: "0 3 * * *",
128
+ * });
129
+ * ```
130
+ *
131
+ * @resource
132
+ * @product Workloads
133
+ */
134
+ export const Job = Platform("Kubernetes.Job", {
135
+ aliases: ["AWS.EKS.Job"],
136
+ createRuntimeContext: (id) => {
137
+ // A one-shot host context: `serve` (invoked by the Platform machinery
138
+ // with the impl shape) registers the shape's `run` effect as the
139
+ // program instead of an HTTP server, so the generated entry executes
140
+ // it to completion and exits.
141
+ const runners = [];
142
+ const env = {};
143
+ const context = {
144
+ Type: "Kubernetes.Job",
145
+ id,
146
+ env,
147
+ set: (bindingId, output) => Effect.sync(() => {
148
+ const key = bindingId.replaceAll(/[^a-zA-Z0-9]/g, "_");
149
+ env[key] = output.pipe(Output.map(packEnvValue));
150
+ return key;
151
+ }),
152
+ get: (key) => Effect.sync(() => unpackEnvValue(process.env[key])),
153
+ run: (effect) => Effect.sync(() => {
154
+ runners.push(effect);
155
+ }),
156
+ serve: ((_handler, options) => Effect.sync(() => {
157
+ const run = options?.shape?.run;
158
+ if (Effect.isEffect(run)) {
159
+ // oxlint-disable-next-line effecttsgo/unsafe-effect-type-assertion -- `run` is a user program; the host runner surfaces its failures
160
+ runners.push(run);
161
+ }
162
+ })),
163
+ exports: Effect.sync(() => ({
164
+ program: Effect.all(runners, { concurrency: "unbounded" }).pipe(Effect.asVoid),
165
+ })),
166
+ };
167
+ return context;
168
+ },
169
+ });
170
+ export const JobProvider = () => Provider.effect(Job, Effect.gen(function* () {
171
+ const stack = yield* Stack;
172
+ const connectionRegistry = yield* makeConnectionRegistry;
173
+ const alchemyEnv = {
174
+ ALCHEMY_STACK_NAME: stack.name,
175
+ ALCHEMY_STAGE: stack.stage,
176
+ ALCHEMY_PHASE: "runtime",
177
+ };
178
+ // The base name doubles as the `app.kubernetes.io/name` label value
179
+ // (and the Service name), both capped at 63 characters.
180
+ const toBaseName = (id, props = {}) => props.name
181
+ ? Effect.succeed(props.name)
182
+ : createPhysicalName({ id, maxLength: 63, lowercase: true }).pipe(Effect.map((name) => name.replaceAll(/[^a-z0-9-]/g, "-")));
183
+ return {
184
+ stables: ["connection", "namespace", "serviceAccountName", "identity", "registry"],
185
+ // A Job's identity spans in-cluster Kubernetes objects plus
186
+ // adapter-owned cloud resources — no single enumeration
187
+ // reconstructs the composite, so enumeration is empty; `read`
188
+ // refreshes known instances.
189
+ list: () => Effect.succeed([]),
190
+ diff: Effect.fn(function* ({ olds = {}, news: input, output }) {
191
+ // `exports` carries the program's runtime Effects (never plain
192
+ // data); everything else must be resolved to diff.
193
+ const { exports: _exports, ...declared } = input;
194
+ if (!isResolved(declared))
195
+ return;
196
+ const news = input;
197
+ const oldCluster = connectionIdentity(tryConnectionOf(olds.cluster));
198
+ const newCluster = connectionIdentity(tryConnectionOf(news.cluster));
199
+ if (oldCluster !== undefined && newCluster !== undefined && oldCluster !== newCluster) {
200
+ return { action: "replace" };
201
+ }
202
+ if (oldCluster !== undefined &&
203
+ (olds.namespace ?? "default") !== (news.namespace ?? "default")) {
204
+ return { action: "replace" };
205
+ }
206
+ // Content drift (see Deployment).
207
+ const connection = tryConnectionOf(news.cluster);
208
+ if (output && connection) {
209
+ const adapter = yield* findClusterAdapter(connection.auth.kind);
210
+ const source = news;
211
+ const hash = yield* workloadImageHash({
212
+ adapter,
213
+ connection,
214
+ connectionRegistry,
215
+ source,
216
+ platform: imagePlatformOf(news.architecture, connection),
217
+ isExternal: news.isExternal,
218
+ bootstrap: (adapter.bootstrap?.job ?? makeJobBootstrap)(source.handler ?? "default"),
219
+ });
220
+ if (hash !== undefined && hash !== output.code.hash) {
221
+ return { action: "update" };
222
+ }
223
+ }
224
+ }),
225
+ read: Effect.fn(function* ({ output }) {
226
+ if (!output)
227
+ return undefined;
228
+ const connection = connectionOfOutput(output);
229
+ if (!connection)
230
+ return undefined;
231
+ const transport = yield* connectCluster(connection);
232
+ // The ServiceAccount is the stable existence anchor: one-shot Job
233
+ // objects are content-addressed and may have been TTL-collected.
234
+ const anchor = (output.kubernetesObjects ?? [])[0];
235
+ if (!anchor)
236
+ return output;
237
+ const observed = yield* readObject({
238
+ transport,
239
+ object: anchor,
240
+ }).pipe(Effect.catchTag("KubernetesNotFound", () => Effect.succeed(undefined)));
241
+ if (observed === undefined)
242
+ return undefined;
243
+ return output;
244
+ }),
245
+ reconcile: Effect.fn(function* ({ id, news, bindings, output, session }) {
246
+ const connection = toConnection(news.cluster);
247
+ const adapter = yield* findClusterAdapter(connection.auth.kind);
248
+ const transport = yield* adapter.connect(connection);
249
+ const namespace = news.namespace ?? "default";
250
+ const baseName = yield* toBaseName(id, news);
251
+ const serviceAccountName = output?.serviceAccountName ?? baseName;
252
+ const tags = {
253
+ ...(yield* createInternalTags(id)),
254
+ ...news.tags,
255
+ };
256
+ const { env: bindingEnv, grantKeys } = collectBindingEnv(bindings);
257
+ if (grantKeys.length > 0 && adapter.identity === undefined) {
258
+ return yield* Effect.die(new Error(`'${id}': bindings carry cloud credential grants ` +
259
+ `(${grantKeys.join(", ")}) but this cluster's platform ` +
260
+ "has no workload-identity adapter. Target a managed " +
261
+ "cluster (e.g. AWS.EKS.Cluster) or bind through " +
262
+ "environment variables instead."));
263
+ }
264
+ const identity = adapter.identity
265
+ ? yield* adapter.identity.reconcile({
266
+ id,
267
+ connection,
268
+ namespace,
269
+ serviceAccount: serviceAccountName,
270
+ bindings,
271
+ options: news.identity,
272
+ state: output?.identity ??
273
+ output,
274
+ tags,
275
+ })
276
+ : undefined;
277
+ // Resolve the container image (`main` | `context` | `image`).
278
+ const source = news;
279
+ const resolved = yield* resolveWorkloadImage({
280
+ adapter,
281
+ connection,
282
+ connectionRegistry,
283
+ id,
284
+ source,
285
+ platform: imagePlatformOf(news.architecture, connection),
286
+ isExternal: news.isExternal,
287
+ bootstrap: (adapter.bootstrap?.job ?? makeJobBootstrap)(source.handler ?? "default"),
288
+ tags,
289
+ state: output?.registry ??
290
+ output,
291
+ session,
292
+ });
293
+ // Synthesize the Kubernetes objects. The generated name label is
294
+ // always present so selectors and Kueue-style extra labels
295
+ // compose without erasing the workload's identity label.
296
+ const labels = {
297
+ "app.kubernetes.io/name": baseName,
298
+ ...news.labels,
299
+ };
300
+ const containerEnv = {
301
+ ...bindingEnv,
302
+ ...identity?.env,
303
+ ...alchemyEnv,
304
+ ...news.env,
305
+ };
306
+ const serviceAccountObject = {
307
+ apiVersion: "v1",
308
+ kind: "ServiceAccount",
309
+ metadata: {
310
+ name: serviceAccountName,
311
+ namespace,
312
+ labels,
313
+ ...(identity?.serviceAccountAnnotations
314
+ ? { annotations: identity.serviceAccountAnnotations }
315
+ : {}),
316
+ },
317
+ };
318
+ const podTemplate = deepMerge({
319
+ metadata: { labels },
320
+ spec: {
321
+ serviceAccountName,
322
+ restartPolicy: news.restartPolicy ?? "Never",
323
+ containers: [
324
+ {
325
+ name: baseName,
326
+ image: resolved.imageUri,
327
+ command: news.command,
328
+ args: news.args,
329
+ env: Object.entries(containerEnv).map(([name, value]) => ({
330
+ name,
331
+ value: containerEnvValue(value),
332
+ })),
333
+ resources: news.resources,
334
+ },
335
+ ],
336
+ },
337
+ }, news.podTemplate);
338
+ const jobSpec = {
339
+ backoffLimit: news.backoffLimit,
340
+ ttlSecondsAfterFinished: news.ttlSecondsAfterFinished,
341
+ template: podTemplate,
342
+ };
343
+ const kind = news.schedule ? "CronJob" : "Job";
344
+ // A Kubernetes Job's pod template is immutable after creation, so
345
+ // one-shot Jobs are content-addressed: the object name embeds a
346
+ // hash of the spec, and a spec change applies a NEW Job (which
347
+ // runs) while `reconcileObjects` deletes the previous one.
348
+ // CronJobs are mutable and keep the stable base name.
349
+ // Kubernetes rejects Job names over 63 characters (the API
350
+ // stamps the name into the batch.kubernetes.io/job-name pod
351
+ // label, and label values cap at 63) — truncate the base so the
352
+ // content-address suffix always fits.
353
+ const jobName = news.schedule
354
+ ? baseName.slice(0, 52).replace(/-+$/, "")
355
+ : `${baseName.slice(0, 54).replace(/-+$/, "")}-${(yield* sha256Object(unwrapRedacted(jobSpec))).slice(0, 8)}`;
356
+ const workloadObject = news.schedule
357
+ ? {
358
+ apiVersion: "batch/v1",
359
+ kind: "CronJob",
360
+ metadata: { name: jobName, namespace, labels },
361
+ spec: {
362
+ schedule: news.schedule,
363
+ jobTemplate: {
364
+ metadata: { labels },
365
+ spec: jobSpec,
366
+ },
367
+ },
368
+ }
369
+ : {
370
+ apiVersion: "batch/v1",
371
+ kind: "Job",
372
+ metadata: { name: jobName, namespace, labels },
373
+ spec: jobSpec,
374
+ };
375
+ const desiredObjects = [serviceAccountObject, workloadObject];
376
+ const kubernetesObjects = yield* reconcileObjects({
377
+ transport,
378
+ previousObjects: output?.kubernetesObjects ?? [],
379
+ desiredObjects,
380
+ });
381
+ yield* session.note(`Applied Kubernetes ${kind} ${namespace}/${jobName}`);
382
+ return {
383
+ connection,
384
+ namespace,
385
+ kind,
386
+ jobName,
387
+ schedule: news.schedule,
388
+ serviceAccountName,
389
+ imageUri: resolved.imageUri,
390
+ identity: identity?.state,
391
+ registry: resolved.state,
392
+ kubernetesObjects,
393
+ code: { hash: resolved.codeHash },
394
+ };
395
+ }),
396
+ delete: Effect.fn(function* ({ output }) {
397
+ const connection = connectionOfOutput(output);
398
+ if (!connection)
399
+ return;
400
+ const adapter = yield* findClusterAdapter(connection.auth.kind);
401
+ // Skip only a missing cluster, then still clean up adapter-owned
402
+ // cloud resources (image repository, identity role).
403
+ const transport = yield* ifClusterExists(adapter.connect(connection));
404
+ if (transport && (output.kubernetesObjects ?? []).length > 0) {
405
+ yield* deleteObjects({
406
+ transport,
407
+ objects: output.kubernetesObjects ?? [],
408
+ });
409
+ }
410
+ if (adapter.identity) {
411
+ yield* adapter.identity.delete({
412
+ connection,
413
+ state: output.identity ??
414
+ output,
415
+ });
416
+ }
417
+ if (adapter.registry) {
418
+ yield* adapter.registry.delete({
419
+ state: output.registry ??
420
+ output,
421
+ });
422
+ }
423
+ }),
424
+ };
425
+ }));
426
+ //# sourceMappingURL=Job.js.map
package/lib/Job.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Job.js","sourceRoot":"","sources":["../src/Job.ts"],"names":[],"mappings":"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"}