@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.d.ts ADDED
@@ -0,0 +1,314 @@
1
+ import { Platform, type PlatformProps, type PlatformServices } from "alchemy/Platform";
2
+ import * as Provider from "alchemy/Provider";
3
+ import { Resource } from "alchemy/Resource";
4
+ import type { HostRuntimeContext } from "alchemy/Runtime/Process";
5
+ import { RuntimeContext } from "alchemy/RuntimeContext";
6
+ import { Stack } from "alchemy/Stack";
7
+ import * as Effect from "effect/Effect";
8
+ import type { Scope } from "effect/Scope";
9
+ import { type IdentityState, type RegistryState, type WorkloadBindingContract, type WorkloadIdentityOptions, type WorkloadImageSource, type WorkloadServices } from "./ClusterAdapter.ts";
10
+ import { type ClusterLike, type Connection } from "./Connection.ts";
11
+ import type { KubernetesObjectRef } from "./Objects.ts";
12
+ import type { Providers } from "./Providers.ts";
13
+ export declare const isJob: (value: any) => value is Job;
14
+ export interface JobPropsBase extends PlatformProps {
15
+ /**
16
+ * Target cluster the job runs on: a cluster resource
17
+ * (`Kubernetes.LocalCluster`, `AWS.EKS.Cluster`), a
18
+ * `Kubernetes.KubeConfig(...)`, or a raw `Kubernetes.Connection`. The
19
+ * connection supplies authentication and the registry `main` / `context`
20
+ * images are pushed to.
21
+ */
22
+ cluster: ClusterLike;
23
+ /**
24
+ * Base name for the generated Job / ServiceAccount. If omitted, a
25
+ * deterministic name is derived from the stack, stage, and logical id.
26
+ */
27
+ name?: string;
28
+ /**
29
+ * Kubernetes namespace to run in. The namespace must already exist.
30
+ * @default "default"
31
+ */
32
+ namespace?: string;
33
+ /**
34
+ * Number of retries before the Job is marked failed (Kubernetes
35
+ * `backoffLimit`).
36
+ */
37
+ backoffLimit?: number;
38
+ /**
39
+ * Cron schedule (standard 5-field cron, e.g. `"0 3 * * *"`). When set, a
40
+ * Kubernetes `CronJob` is synthesized instead of a plain `Job`.
41
+ */
42
+ schedule?: string;
43
+ /**
44
+ * Restart policy for the job's pods.
45
+ * @default "Never"
46
+ */
47
+ restartPolicy?: "Never" | "OnFailure";
48
+ /**
49
+ * Seconds after completion before the finished Job is garbage-collected
50
+ * (Kubernetes `ttlSecondsAfterFinished`).
51
+ */
52
+ ttlSecondsAfterFinished?: number;
53
+ /**
54
+ * Container entrypoint override (Kubernetes `command`). Mostly useful with
55
+ * `image` / `context` sources.
56
+ */
57
+ command?: string[];
58
+ /**
59
+ * Container arguments (Kubernetes `args`).
60
+ */
61
+ args?: string[];
62
+ /**
63
+ * Container CPU/memory requests + limits (Kubernetes resource quantities).
64
+ */
65
+ resources?: {
66
+ requests?: {
67
+ cpu?: string;
68
+ memory?: string;
69
+ };
70
+ limits?: {
71
+ cpu?: string;
72
+ memory?: string;
73
+ };
74
+ };
75
+ /**
76
+ * Additional environment variables for the container.
77
+ */
78
+ env?: Record<string, any>;
79
+ /**
80
+ * Container image build architecture.
81
+ * @default the connection's `architecture`, else "amd64"
82
+ */
83
+ architecture?: "amd64" | "arm64";
84
+ /**
85
+ * Deep-partial Kubernetes Pod template merged into the synthesized
86
+ * template (objects merge recursively; arrays and primitives replace) —
87
+ * a literal object in the shape of `PodTemplateSpec`, e.g.
88
+ * `{ spec: { tolerations: [...], nodeSelector: {...} } }`.
89
+ */
90
+ podTemplate?: Record<string, unknown>;
91
+ /**
92
+ * Cloud-specific workload-identity options, consumed by the cluster
93
+ * platform's identity adapter (on EKS: `{ managedPolicyArns: [...] }`
94
+ * attaches extra managed policies to the generated pod-identity role; on
95
+ * GKE: `{ gcpServiceAccount }` runs the pods as an existing Google
96
+ * service account instead of the ServiceAccount's own principal).
97
+ */
98
+ identity?: WorkloadIdentityOptions;
99
+ /**
100
+ * Job / pod labels, merged over the generated `app.kubernetes.io/name`
101
+ * label.
102
+ */
103
+ labels?: Record<string, string>;
104
+ /**
105
+ * User-defined tags applied to workload-owned cloud resources (identity
106
+ * roles, image repositories).
107
+ */
108
+ tags?: Record<string, string>;
109
+ }
110
+ /** Bundle an inline Effect program (`main`) into a generated image. */
111
+ export interface BundledJobProps extends JobPropsBase {
112
+ /**
113
+ * Module entrypoint for the bundled program. This should typically be
114
+ * `import.meta.url` from an inline Effect program.
115
+ */
116
+ main: string;
117
+ /**
118
+ * Environment image used as the generated Dockerfile's `FROM`; must be
119
+ * able to run the bun runtime.
120
+ * @default "oven/bun:1"
121
+ */
122
+ image?: string;
123
+ /** Named export to load from `main`. @default "default" */
124
+ handler?: string;
125
+ /** Bundler configuration for the entrypoint. */
126
+ build?: WorkloadImageSource["build"];
127
+ /** Environment Dockerfile (path or inline content). */
128
+ dockerfile?: WorkloadImageSource["dockerfile"];
129
+ /** Build context for a path {@link dockerfile} environment. */
130
+ context?: string;
131
+ }
132
+ /** Build the user's own Dockerfile (`context` + optional `dockerfile` path). */
133
+ export interface DockerfileJobProps extends JobPropsBase {
134
+ /** Docker build context directory. */
135
+ context?: string;
136
+ /**
137
+ * Path to the Dockerfile (relative to the cwd), or inline content.
138
+ * @default `${context}/Dockerfile`
139
+ */
140
+ dockerfile?: WorkloadImageSource["dockerfile"];
141
+ }
142
+ /** Run a pre-built registry image. */
143
+ export interface ImageJobProps extends JobPropsBase {
144
+ /**
145
+ * A pre-built image reference, e.g. `ghcr.io/acme/migrator:v3`, pulled
146
+ * by the nodes as written. EKS clusters mirror it into ECR first.
147
+ */
148
+ image: string;
149
+ }
150
+ export type JobProps = BundledJobProps | DockerfileJobProps | ImageJobProps;
151
+ export interface Job extends Resource<"Kubernetes.Job", JobProps, {
152
+ /** The connection of the cluster the job runs on. */
153
+ connection: Connection;
154
+ /** The Kubernetes namespace the job's objects live in. */
155
+ namespace: string;
156
+ /** The Kubernetes kind synthesized for the workload (`Job`, or `CronJob` when `schedule` is set). */
157
+ kind: "Job" | "CronJob";
158
+ /** The name of the Kubernetes Job/CronJob object. */
159
+ jobName: string;
160
+ /** The cron schedule, when the workload is a CronJob. */
161
+ schedule: string | undefined;
162
+ /** The name of the service account the pods run as. */
163
+ serviceAccountName: string;
164
+ /** The URI of the container image the job runs. */
165
+ imageUri: string;
166
+ /**
167
+ * Workload-identity state provisioned by the cluster platform's
168
+ * adapter (on EKS: the pod-identity role + association; on GKE: the
169
+ * Workload Identity principal and the IAM grants applied to it).
170
+ */
171
+ identity: IdentityState | undefined;
172
+ /**
173
+ * Image-registry state provisioned by the cluster platform's adapter
174
+ * (on EKS: the ECR repository).
175
+ */
176
+ registry: RegistryState | undefined;
177
+ /** References to the Kubernetes objects created for the job. */
178
+ kubernetesObjects: KubernetesObjectRef[];
179
+ /** The content hash of the container image source. */
180
+ code: {
181
+ hash: string;
182
+ };
183
+ }, WorkloadBindingContract, Providers> {
184
+ }
185
+ export type JobServices = WorkloadServices;
186
+ /**
187
+ * The impl shape: `{ run, ...rpc }`. `run` executes to completion inside
188
+ * the pod; the process exits when it returns.
189
+ */
190
+ export type JobMain<InitServices = never> = void | {
191
+ run?: Effect.Effect<void, never, InitServices | PlatformServices | RuntimeContext | Scope>;
192
+ };
193
+ export type JobShape = JobMain<JobServices>;
194
+ export interface JobRuntimeContext extends HostRuntimeContext {
195
+ readonly Type: "Kubernetes.Job";
196
+ }
197
+ /**
198
+ * Run-to-completion work on any Kubernetes cluster, as a container image
199
+ * or an Effect program.
200
+ *
201
+ * `Job` provisions a Kubernetes `Job` (or `CronJob` when `schedule` is
202
+ * set) via server-side apply and a ServiceAccount, plus — through the
203
+ * target cluster's platform adapter — workload identity and a container
204
+ * image from exactly one of three sources flat on props: `main` (bundle an
205
+ * inline Effect program whose impl returns `{ run }`), `context` (build
206
+ * your own Dockerfile), or `image` (a pre-built registry reference).
207
+ * `main` and `context` images are built on the deploying machine and
208
+ * pushed to the connection's registry (`Kubernetes.LocalCluster` includes
209
+ * one; EKS uses ECR; GKE uses Artifact Registry). On `AWS.EKS.Cluster`
210
+ * targets, bindings attach IAM policy statements to a generated
211
+ * pod-identity role; on `GCP.Container.Cluster` targets, GCP bindings grant
212
+ * their IAM roles to the Kubernetes ServiceAccount's Workload Identity
213
+ * Federation principal — exactly like `Kubernetes.Deployment`.
214
+ * ### Creating a Job
215
+ * **Example:** Remote image (external — no Effect runtime in the container)
216
+ * ```typescript
217
+ * const migrate = yield* Kubernetes.Job("DbMigrate", {
218
+ * cluster,
219
+ * image: "ghcr.io/acme/migrator:v3",
220
+ * backoffLimit: 2,
221
+ * });
222
+ * ```
223
+ *
224
+ * **Example:** Inline Effect program
225
+ * ```typescript
226
+ * const cluster = yield* Kubernetes.LocalCluster("Cluster", {
227
+ * name: "alchemy",
228
+ * });
229
+ *
230
+ * const hello = yield* Kubernetes.Job(
231
+ * "Hello",
232
+ * { cluster, main: import.meta.url, backoffLimit: 2 },
233
+ * Effect.gen(function* () {
234
+ * return {
235
+ * run: Effect.log("hello from a Job"),
236
+ * };
237
+ * }),
238
+ * );
239
+ * ```
240
+ *
241
+ * **Example:** Inline Effect program with a DynamoDB binding (EKS)
242
+ * ```typescript
243
+ * const seed = yield* Kubernetes.Job(
244
+ * "SeedData",
245
+ * { cluster, main: import.meta.url },
246
+ * Effect.gen(function* () {
247
+ * const putItem = yield* AWS.DynamoDB.PutItem(table);
248
+ * return {
249
+ * run: Effect.gen(function* () {
250
+ * yield* putItem({ Item: { id: { S: "seed" } } });
251
+ * }),
252
+ * };
253
+ * }).pipe(Effect.provide(AWS.DynamoDB.PutItemHttp)),
254
+ * );
255
+ * ```
256
+ *
257
+ * **Example:** Tagged Effect program
258
+ * ```typescript
259
+ * export class Backfill extends Kubernetes.Job<Backfill, {
260
+ * progress: () => Effect.Effect<number>;
261
+ * }>()("Backfill") {}
262
+ *
263
+ * export default Backfill.make(
264
+ * { cluster, main: import.meta.url, backoffLimit: 1 },
265
+ * Effect.gen(function* () {
266
+ * return {
267
+ * run: Effect.gen(function* () { }),
268
+ * progress: () => Effect.succeed(0),
269
+ * };
270
+ * }),
271
+ * );
272
+ * ```
273
+ *
274
+ * ### Bundling & Tree-shaking
275
+ * `main` is bundled with rolldown at deploy time. Unused code is
276
+ * tree-shaken. `effect`, alchemy, and `@distilled.cloud` are marked
277
+ * pure so unused parts prune more aggressively. Your app is not
278
+ * marked pure.
279
+ *
280
+ * **Example:** Mark additional packages as pure
281
+ * Only list packages with no top-level side effects.
282
+ * ```typescript
283
+ * {
284
+ * main: import.meta.url,
285
+ * build: {
286
+ * pure: { packages: ["my-lib", "@my-scope/*"] },
287
+ * },
288
+ * }
289
+ * ```
290
+ *
291
+ * **Example:** Turn it off
292
+ * ```typescript
293
+ * {
294
+ * main: import.meta.url,
295
+ * build: { pure: false },
296
+ * }
297
+ * ```
298
+ *
299
+ * ### Scheduling
300
+ * **Example:** Nightly CronJob
301
+ * ```typescript
302
+ * const nightly = yield* Kubernetes.Job("NightlyBackfill", {
303
+ * cluster,
304
+ * main: import.meta.url,
305
+ * schedule: "0 3 * * *",
306
+ * });
307
+ * ```
308
+ *
309
+ * @resource
310
+ * @product Workloads
311
+ */
312
+ export declare const Job: Platform<Job, JobServices, JobShape, JobRuntimeContext>;
313
+ export declare const JobProvider: () => import("effect/Layer").Layer<Provider.Provider<Job>, never, import("alchemy/AlchemyContext").AlchemyContext | import("@alchemy.run/docker/Docker").Docker | import("effect/FileSystem").FileSystem | import("effect/Path").Path | Stack | import("alchemy/Stage").Stage>;
314
+ //# sourceMappingURL=Job.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Job.d.ts","sourceRoot":"","sources":["../src/Job.ts"],"names":[],"mappings":"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"}