@alchemy.run/kubernetes 0.0.0 → 2.0.0-beta.85
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.
- package/LICENSE +201 -0
- package/README.md +41 -4
- package/lib/BuiltinAdapters.d.ts +43 -0
- package/lib/BuiltinAdapters.d.ts.map +1 -0
- package/lib/BuiltinAdapters.js +129 -0
- package/lib/BuiltinAdapters.js.map +1 -0
- package/lib/Client.d.ts +97 -0
- package/lib/Client.d.ts.map +1 -0
- package/lib/Client.js +312 -0
- package/lib/Client.js.map +1 -0
- package/lib/ClusterAdapter.d.ts +324 -0
- package/lib/ClusterAdapter.d.ts.map +1 -0
- package/lib/ClusterAdapter.js +65 -0
- package/lib/ClusterAdapter.js.map +1 -0
- package/lib/Connection.d.ts +210 -0
- package/lib/Connection.d.ts.map +1 -0
- package/lib/Connection.js +58 -0
- package/lib/Connection.js.map +1 -0
- package/lib/Deployment.d.ts +401 -0
- package/lib/Deployment.d.ts.map +1 -0
- package/lib/Deployment.js +550 -0
- package/lib/Deployment.js.map +1 -0
- package/lib/HelmChart.d.ts +147 -0
- package/lib/HelmChart.d.ts.map +1 -0
- package/lib/HelmChart.js +248 -0
- package/lib/HelmChart.js.map +1 -0
- package/lib/Job.d.ts +333 -0
- package/lib/Job.d.ts.map +1 -0
- package/lib/Job.js +443 -0
- package/lib/Job.js.map +1 -0
- package/lib/LocalCluster.d.ts +243 -0
- package/lib/LocalCluster.d.ts.map +1 -0
- package/lib/LocalCluster.js +359 -0
- package/lib/LocalCluster.js.map +1 -0
- package/lib/Manifest.d.ts +157 -0
- package/lib/Manifest.d.ts.map +1 -0
- package/lib/Manifest.js +205 -0
- package/lib/Manifest.js.map +1 -0
- package/lib/Objects.d.ts +60 -0
- package/lib/Objects.d.ts.map +1 -0
- package/lib/Objects.js +132 -0
- package/lib/Objects.js.map +1 -0
- package/lib/Providers.d.ts +24 -0
- package/lib/Providers.d.ts.map +1 -0
- package/lib/Providers.js +36 -0
- package/lib/Providers.js.map +1 -0
- package/lib/index.d.ts +10 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +10 -0
- package/lib/index.js.map +1 -0
- package/lib/internal/declared.d.ts +19 -0
- package/lib/internal/declared.d.ts.map +1 -0
- package/lib/internal/declared.js +435 -0
- package/lib/internal/declared.js.map +1 -0
- package/lib/internal/helm.d.ts +65 -0
- package/lib/internal/helm.d.ts.map +1 -0
- package/lib/internal/helm.js +173 -0
- package/lib/internal/helm.js.map +1 -0
- package/lib/internal/kind.d.ts +17 -0
- package/lib/internal/kind.d.ts.map +1 -0
- package/lib/internal/kind.js +31 -0
- package/lib/internal/kind.js.map +1 -0
- package/lib/internal/kubeconfig.d.ts +79 -0
- package/lib/internal/kubeconfig.d.ts.map +1 -0
- package/lib/internal/kubeconfig.js +222 -0
- package/lib/internal/kubeconfig.js.map +1 -0
- package/lib/internal/registry.d.ts +44 -0
- package/lib/internal/registry.d.ts.map +1 -0
- package/lib/internal/registry.js +72 -0
- package/lib/internal/registry.js.map +1 -0
- package/lib/internal/workload.d.ts +127 -0
- package/lib/internal/workload.d.ts.map +1 -0
- package/lib/internal/workload.js +411 -0
- package/lib/internal/workload.js.map +1 -0
- package/package.json +55 -3
- package/src/BuiltinAdapters.ts +202 -0
- package/src/Client.ts +496 -0
- package/src/ClusterAdapter.ts +373 -0
- package/src/Connection.ts +234 -0
- package/src/Deployment.ts +872 -0
- package/src/HelmChart.ts +388 -0
- package/src/Job.ts +709 -0
- package/src/LocalCluster.ts +631 -0
- package/src/Manifest.ts +301 -0
- package/src/Objects.ts +213 -0
- package/src/Providers.ts +52 -0
- package/src/globals.d.ts +2 -0
- package/src/index.ts +9 -0
- package/src/internal/declared.ts +471 -0
- package/src/internal/helm.ts +245 -0
- package/src/internal/kind.ts +43 -0
- package/src/internal/kubeconfig.ts +364 -0
- package/src/internal/registry.ts +108 -0
- package/src/internal/workload.ts +504 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import * as Provider from "alchemy/Provider";
|
|
2
|
+
import { Resource } from "alchemy/Resource";
|
|
3
|
+
import { type ClusterLike, type Connection } from "./Connection.ts";
|
|
4
|
+
import type { KubernetesObjectRef } from "./Objects.ts";
|
|
5
|
+
import type { Providers } from "./Providers.ts";
|
|
6
|
+
declare const ManifestInvalidProps_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
7
|
+
readonly _tag: "ManifestInvalidProps";
|
|
8
|
+
} & Readonly<A>;
|
|
9
|
+
export declare class ManifestInvalidProps extends ManifestInvalidProps_base<{
|
|
10
|
+
readonly message: string;
|
|
11
|
+
readonly cause?: unknown;
|
|
12
|
+
}> {
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* A literal Kubernetes object: `apiVersion` + `kind` + `metadata`, with the
|
|
16
|
+
* rest of the object's fields (`spec`, `data`, …) carried as-is. Any kind is
|
|
17
|
+
* accepted — built-in objects and CRDs alike; the API server validates the
|
|
18
|
+
* shape on apply.
|
|
19
|
+
*/
|
|
20
|
+
export interface KubernetesManifest {
|
|
21
|
+
apiVersion: string;
|
|
22
|
+
kind: string;
|
|
23
|
+
metadata?: {
|
|
24
|
+
name?: string;
|
|
25
|
+
namespace?: string;
|
|
26
|
+
labels?: Record<string, string>;
|
|
27
|
+
annotations?: Record<string, string>;
|
|
28
|
+
[key: string]: unknown;
|
|
29
|
+
};
|
|
30
|
+
[key: string]: unknown;
|
|
31
|
+
}
|
|
32
|
+
export interface ManifestProps {
|
|
33
|
+
/**
|
|
34
|
+
* Target cluster the manifest is applied onto. Pass a managed cluster
|
|
35
|
+
* resource (e.g. `AWS.EKS.Cluster`), a `Kubernetes.KubeConfig(...)`, or
|
|
36
|
+
* a raw `Kubernetes.Connection`.
|
|
37
|
+
*/
|
|
38
|
+
cluster: ClusterLike;
|
|
39
|
+
/**
|
|
40
|
+
* The Kubernetes object to apply (server-side apply, field manager
|
|
41
|
+
* `alchemy`) — a literal object with `apiVersion`, `kind`, `metadata`, and
|
|
42
|
+
* the kind's own fields. Arbitrary CRDs are supported via API discovery.
|
|
43
|
+
*/
|
|
44
|
+
manifest: KubernetesManifest;
|
|
45
|
+
}
|
|
46
|
+
export interface Manifest extends Resource<"Kubernetes.Manifest", ManifestProps, {
|
|
47
|
+
/** The connection of the cluster the object is applied to. */
|
|
48
|
+
connection: Connection;
|
|
49
|
+
/** The Kubernetes API version of the applied object. */
|
|
50
|
+
apiVersion: string;
|
|
51
|
+
/** The Kubernetes kind of the applied object. */
|
|
52
|
+
kind: string;
|
|
53
|
+
/** The name of the applied object. */
|
|
54
|
+
name: string;
|
|
55
|
+
/** The namespace of the applied object (`undefined` for cluster-scoped kinds). */
|
|
56
|
+
namespace: string | undefined;
|
|
57
|
+
/** Reference to the applied Kubernetes object. */
|
|
58
|
+
ref: KubernetesObjectRef;
|
|
59
|
+
/** The server-assigned UID of the applied object, when returned. */
|
|
60
|
+
uid: string | undefined;
|
|
61
|
+
/**
|
|
62
|
+
* Fingerprint of the declared fields last applied. `read` compares a GET
|
|
63
|
+
* projected through {@link driftMask} to this.
|
|
64
|
+
*/
|
|
65
|
+
baselineHash?: string;
|
|
66
|
+
/**
|
|
67
|
+
* Declared-field mask from the last apply. Older state omits it and is
|
|
68
|
+
* compared with the same selection against the stored manifest.
|
|
69
|
+
*/
|
|
70
|
+
driftMask?: unknown;
|
|
71
|
+
/**
|
|
72
|
+
* Set by `read` when the live object diverges. Reconcile does not persist
|
|
73
|
+
* it; the extra field is what `alchemy drift` compares.
|
|
74
|
+
*/
|
|
75
|
+
observedHash?: string;
|
|
76
|
+
}, {}, Providers> {
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Applies a raw Kubernetes manifest onto any cluster via server-side
|
|
80
|
+
* apply.
|
|
81
|
+
*
|
|
82
|
+
* Any literal object is accepted — built-in kinds and custom resources
|
|
83
|
+
* alike; unknown kinds are resolved through the Kubernetes API discovery
|
|
84
|
+
* endpoint, so CRDs work without any registration. The target `cluster`
|
|
85
|
+
* can be a managed cluster resource (e.g. `AWS.EKS.Cluster`) or any
|
|
86
|
+
* cluster your kubeconfig can reach (`Kubernetes.KubeConfig(...)`).
|
|
87
|
+
* ### Applying Manifests
|
|
88
|
+
* **Example:** StatefulSet
|
|
89
|
+
* ```typescript
|
|
90
|
+
* const sts = yield* Kubernetes.Manifest("Cache", {
|
|
91
|
+
* cluster,
|
|
92
|
+
* manifest: {
|
|
93
|
+
* apiVersion: "apps/v1",
|
|
94
|
+
* kind: "StatefulSet",
|
|
95
|
+
* metadata: { name: "cache", namespace: "apps" },
|
|
96
|
+
* spec: {
|
|
97
|
+
* serviceName: "cache",
|
|
98
|
+
* replicas: 3,
|
|
99
|
+
* selector: { matchLabels: { app: "cache" } },
|
|
100
|
+
* template: {
|
|
101
|
+
* metadata: { labels: { app: "cache" } },
|
|
102
|
+
* spec: { containers: [{ name: "redis", image: "redis:7" }] },
|
|
103
|
+
* },
|
|
104
|
+
* },
|
|
105
|
+
* },
|
|
106
|
+
* });
|
|
107
|
+
* ```
|
|
108
|
+
*
|
|
109
|
+
* **Example:** Custom resource (CRD)
|
|
110
|
+
* ```typescript
|
|
111
|
+
* const widget = yield* Kubernetes.Manifest("Widget", {
|
|
112
|
+
* cluster,
|
|
113
|
+
* manifest: {
|
|
114
|
+
* apiVersion: "acme.io/v1",
|
|
115
|
+
* kind: "Widget",
|
|
116
|
+
* metadata: { name: "w", namespace: "default" },
|
|
117
|
+
* spec: { size: 3 },
|
|
118
|
+
* },
|
|
119
|
+
* });
|
|
120
|
+
* ```
|
|
121
|
+
*
|
|
122
|
+
* ### Namespaces
|
|
123
|
+
* **Example:** Create a Namespace
|
|
124
|
+
* ```typescript
|
|
125
|
+
* const ns = yield* Kubernetes.Manifest("AppsNamespace", {
|
|
126
|
+
* cluster,
|
|
127
|
+
* manifest: {
|
|
128
|
+
* apiVersion: "v1",
|
|
129
|
+
* kind: "Namespace",
|
|
130
|
+
* metadata: { name: "apps" },
|
|
131
|
+
* },
|
|
132
|
+
* });
|
|
133
|
+
* ```
|
|
134
|
+
*
|
|
135
|
+
* ### Any Cluster
|
|
136
|
+
* **Example:** Apply onto a kubeconfig context
|
|
137
|
+
* ```typescript
|
|
138
|
+
* const local = Kubernetes.KubeConfig({ context: "kind-dev" });
|
|
139
|
+
*
|
|
140
|
+
* const config = yield* Kubernetes.Manifest("AppConfig", {
|
|
141
|
+
* cluster: local,
|
|
142
|
+
* manifest: {
|
|
143
|
+
* apiVersion: "v1",
|
|
144
|
+
* kind: "ConfigMap",
|
|
145
|
+
* metadata: { name: "app-config", namespace: "default" },
|
|
146
|
+
* data: { LOG_LEVEL: "info" },
|
|
147
|
+
* },
|
|
148
|
+
* });
|
|
149
|
+
* ```
|
|
150
|
+
*
|
|
151
|
+
* @resource
|
|
152
|
+
* @product Manifest
|
|
153
|
+
*/
|
|
154
|
+
export declare const Manifest: import("alchemy/Resource").ResourceClass<Manifest>;
|
|
155
|
+
export declare const ManifestProvider: () => import("effect/Layer").Layer<Provider.Provider<Manifest>, never, never>;
|
|
156
|
+
export {};
|
|
157
|
+
//# sourceMappingURL=Manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Manifest.d.ts","sourceRoot":"","sources":["../src/Manifest.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAW5C,OAAO,EAAgB,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGlF,OAAO,KAAK,EAA8B,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACpF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;;;;AAEhD,qBAAa,oBAAqB,SAAQ,0BAAyC;IACjF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;CAAG;AAEL;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE;QACT,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;IACF,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,OAAO,EAAE,WAAW,CAAC;IACrB;;;;OAIG;IACH,QAAQ,EAAE,kBAAkB,CAAC;CAC9B;AAED,MAAM,WAAW,QAAS,SAAQ,QAAQ,CACxC,qBAAqB,EACrB,aAAa,EACb;IACE,8DAA8D;IAC9D,UAAU,EAAE,UAAU,CAAC;IACvB,wDAAwD;IACxD,UAAU,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,kFAAkF;IAClF,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,kDAAkD;IAClD,GAAG,EAAE,mBAAmB,CAAC;IACzB,oEAAoE;IACpE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,EACD,EAAE,EACF,SAAS,CACV;CAAG;AAEJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2EG;AACH,eAAO,MAAM,QAAQ,oDAEnB,CAAC;AAgBH,eAAO,MAAM,gBAAgB,+EA8G1B,CAAC"}
|
package/lib/Manifest.js
ADDED
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { isResolved } from "alchemy/Diff";
|
|
2
|
+
import * as Provider from "alchemy/Provider";
|
|
3
|
+
import { Resource } from "alchemy/Resource";
|
|
4
|
+
import { isPlainObject } from "alchemy/Util/data";
|
|
5
|
+
import * as Data from "effect/Data";
|
|
6
|
+
import * as Effect from "effect/Effect";
|
|
7
|
+
import { applyObject, connectCluster, deleteObject, ifClusterExists, readObject, } from "./Client.js";
|
|
8
|
+
import { toConnection } from "./Connection.js";
|
|
9
|
+
import { driftMask, hashDriftSelection } from "./internal/declared.js";
|
|
10
|
+
import { connectionIdentity, connectionOfOutput, tryConnectionOf } from "./internal/workload.js";
|
|
11
|
+
export class ManifestInvalidProps extends Data.TaggedError("ManifestInvalidProps") {
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Applies a raw Kubernetes manifest onto any cluster via server-side
|
|
15
|
+
* apply.
|
|
16
|
+
*
|
|
17
|
+
* Any literal object is accepted — built-in kinds and custom resources
|
|
18
|
+
* alike; unknown kinds are resolved through the Kubernetes API discovery
|
|
19
|
+
* endpoint, so CRDs work without any registration. The target `cluster`
|
|
20
|
+
* can be a managed cluster resource (e.g. `AWS.EKS.Cluster`) or any
|
|
21
|
+
* cluster your kubeconfig can reach (`Kubernetes.KubeConfig(...)`).
|
|
22
|
+
* ### Applying Manifests
|
|
23
|
+
* **Example:** StatefulSet
|
|
24
|
+
* ```typescript
|
|
25
|
+
* const sts = yield* Kubernetes.Manifest("Cache", {
|
|
26
|
+
* cluster,
|
|
27
|
+
* manifest: {
|
|
28
|
+
* apiVersion: "apps/v1",
|
|
29
|
+
* kind: "StatefulSet",
|
|
30
|
+
* metadata: { name: "cache", namespace: "apps" },
|
|
31
|
+
* spec: {
|
|
32
|
+
* serviceName: "cache",
|
|
33
|
+
* replicas: 3,
|
|
34
|
+
* selector: { matchLabels: { app: "cache" } },
|
|
35
|
+
* template: {
|
|
36
|
+
* metadata: { labels: { app: "cache" } },
|
|
37
|
+
* spec: { containers: [{ name: "redis", image: "redis:7" }] },
|
|
38
|
+
* },
|
|
39
|
+
* },
|
|
40
|
+
* },
|
|
41
|
+
* });
|
|
42
|
+
* ```
|
|
43
|
+
*
|
|
44
|
+
* **Example:** Custom resource (CRD)
|
|
45
|
+
* ```typescript
|
|
46
|
+
* const widget = yield* Kubernetes.Manifest("Widget", {
|
|
47
|
+
* cluster,
|
|
48
|
+
* manifest: {
|
|
49
|
+
* apiVersion: "acme.io/v1",
|
|
50
|
+
* kind: "Widget",
|
|
51
|
+
* metadata: { name: "w", namespace: "default" },
|
|
52
|
+
* spec: { size: 3 },
|
|
53
|
+
* },
|
|
54
|
+
* });
|
|
55
|
+
* ```
|
|
56
|
+
*
|
|
57
|
+
* ### Namespaces
|
|
58
|
+
* **Example:** Create a Namespace
|
|
59
|
+
* ```typescript
|
|
60
|
+
* const ns = yield* Kubernetes.Manifest("AppsNamespace", {
|
|
61
|
+
* cluster,
|
|
62
|
+
* manifest: {
|
|
63
|
+
* apiVersion: "v1",
|
|
64
|
+
* kind: "Namespace",
|
|
65
|
+
* metadata: { name: "apps" },
|
|
66
|
+
* },
|
|
67
|
+
* });
|
|
68
|
+
* ```
|
|
69
|
+
*
|
|
70
|
+
* ### Any Cluster
|
|
71
|
+
* **Example:** Apply onto a kubeconfig context
|
|
72
|
+
* ```typescript
|
|
73
|
+
* const local = Kubernetes.KubeConfig({ context: "kind-dev" });
|
|
74
|
+
*
|
|
75
|
+
* const config = yield* Kubernetes.Manifest("AppConfig", {
|
|
76
|
+
* cluster: local,
|
|
77
|
+
* manifest: {
|
|
78
|
+
* apiVersion: "v1",
|
|
79
|
+
* kind: "ConfigMap",
|
|
80
|
+
* metadata: { name: "app-config", namespace: "default" },
|
|
81
|
+
* data: { LOG_LEVEL: "info" },
|
|
82
|
+
* },
|
|
83
|
+
* });
|
|
84
|
+
* ```
|
|
85
|
+
*
|
|
86
|
+
* @resource
|
|
87
|
+
* @product Manifest
|
|
88
|
+
*/
|
|
89
|
+
export const Manifest = Resource("Kubernetes.Manifest", {
|
|
90
|
+
aliases: ["AWS.EKS.Manifest"],
|
|
91
|
+
});
|
|
92
|
+
const toObjectDefinition = (manifest) => {
|
|
93
|
+
const name = manifest.metadata?.name;
|
|
94
|
+
if (!name) {
|
|
95
|
+
return Effect.fail(new ManifestInvalidProps({
|
|
96
|
+
message: `Kubernetes.Manifest requires manifest.metadata.name (got ${manifest.apiVersion}/${manifest.kind})`,
|
|
97
|
+
}));
|
|
98
|
+
}
|
|
99
|
+
return Effect.succeed(manifest);
|
|
100
|
+
};
|
|
101
|
+
export const ManifestProvider = () => Provider.effect(Manifest, Effect.gen(function* () {
|
|
102
|
+
return {
|
|
103
|
+
stables: ["connection", "apiVersion", "kind", "name", "namespace"],
|
|
104
|
+
// In-cluster objects have no cloud-side enumeration that attributes
|
|
105
|
+
// them to alchemy; refresh happens per-instance through `read`.
|
|
106
|
+
list: () => Effect.succeed([]),
|
|
107
|
+
diff: Effect.fn(function* ({ olds = {}, news }) {
|
|
108
|
+
if (!isResolved(news))
|
|
109
|
+
return;
|
|
110
|
+
const oldManifest = olds.manifest;
|
|
111
|
+
const newManifest = news.manifest;
|
|
112
|
+
const oldCluster = connectionIdentity(tryConnectionOf(olds.cluster));
|
|
113
|
+
const newCluster = connectionIdentity(tryConnectionOf(news.cluster));
|
|
114
|
+
// Object identity (cluster, group/version/kind, name, namespace) is
|
|
115
|
+
// immutable — changing any of it is a replacement.
|
|
116
|
+
if (oldManifest &&
|
|
117
|
+
((oldCluster !== undefined && newCluster !== undefined && oldCluster !== newCluster) ||
|
|
118
|
+
oldManifest.apiVersion !== newManifest.apiVersion ||
|
|
119
|
+
oldManifest.kind !== newManifest.kind ||
|
|
120
|
+
oldManifest.metadata?.name !== newManifest.metadata?.name ||
|
|
121
|
+
oldManifest.metadata?.namespace !== newManifest.metadata?.namespace)) {
|
|
122
|
+
return { action: "replace" };
|
|
123
|
+
}
|
|
124
|
+
}),
|
|
125
|
+
read: Effect.fn(function* ({ output, olds }) {
|
|
126
|
+
if (!output)
|
|
127
|
+
return undefined;
|
|
128
|
+
const connection = connectionOfOutput(output);
|
|
129
|
+
if (!connection)
|
|
130
|
+
return undefined;
|
|
131
|
+
// ClusterNotFound fails the drift row. undefined means this object is gone.
|
|
132
|
+
const transport = yield* connectCluster(connection);
|
|
133
|
+
const observed = yield* readObject({
|
|
134
|
+
transport,
|
|
135
|
+
object: output.ref,
|
|
136
|
+
}).pipe(Effect.catchTag("KubernetesNotFound", () => Effect.undefined));
|
|
137
|
+
if (!observed)
|
|
138
|
+
return undefined;
|
|
139
|
+
const uid = observed.metadata?.uid;
|
|
140
|
+
const attrs = { ...output, uid };
|
|
141
|
+
const manifest = olds?.manifest;
|
|
142
|
+
// A stored mask is the apply-time selection. Older rows have the
|
|
143
|
+
// manifest and no mask; they use that same selection, not the
|
|
144
|
+
// previous whole-object hash.
|
|
145
|
+
const desired = output.driftMask === undefined && manifest !== undefined
|
|
146
|
+
? yield* toObjectDefinition(manifest)
|
|
147
|
+
: undefined;
|
|
148
|
+
const mask = output.driftMask ?? (desired === undefined ? undefined : driftMask(desired));
|
|
149
|
+
if (mask === undefined)
|
|
150
|
+
return attrs;
|
|
151
|
+
const liveHash = yield* hashDriftSelection(mask, observed);
|
|
152
|
+
const baseline = output.driftMask !== undefined && output.baselineHash !== undefined
|
|
153
|
+
? output.baselineHash
|
|
154
|
+
: desired === undefined
|
|
155
|
+
? undefined
|
|
156
|
+
: yield* hashDriftSelection(mask, desired);
|
|
157
|
+
if (baseline !== undefined && liveHash !== baseline) {
|
|
158
|
+
return { ...attrs, observedHash: liveHash };
|
|
159
|
+
}
|
|
160
|
+
return attrs;
|
|
161
|
+
}),
|
|
162
|
+
reconcile: Effect.fn(function* ({ news, output, session }) {
|
|
163
|
+
const connection = toConnection(news.cluster);
|
|
164
|
+
const transport = yield* connectCluster(connection);
|
|
165
|
+
const object = yield* toObjectDefinition(news.manifest);
|
|
166
|
+
const ref = {
|
|
167
|
+
apiVersion: object.apiVersion,
|
|
168
|
+
kind: object.kind,
|
|
169
|
+
name: object.metadata.name,
|
|
170
|
+
namespace: object.metadata.namespace,
|
|
171
|
+
};
|
|
172
|
+
// Server-side apply is a true upsert: create-if-missing and
|
|
173
|
+
// converge-if-present in one call, `force: true` so alchemy owns
|
|
174
|
+
// the fields it manages regardless of prior managers.
|
|
175
|
+
const applied = yield* applyObject({ transport, object });
|
|
176
|
+
const witnessed = isPlainObject(applied) ? applied : undefined;
|
|
177
|
+
const baselineHash = yield* hashDriftSelection(object, witnessed ?? object);
|
|
178
|
+
yield* session.note(`Applied ${ref.apiVersion}/${ref.kind} ${ref.namespace ? `${ref.namespace}/` : ""}${ref.name}`);
|
|
179
|
+
const uid = applied?.metadata?.uid ?? output?.uid;
|
|
180
|
+
return {
|
|
181
|
+
connection,
|
|
182
|
+
apiVersion: ref.apiVersion,
|
|
183
|
+
kind: ref.kind,
|
|
184
|
+
name: ref.name,
|
|
185
|
+
namespace: ref.namespace,
|
|
186
|
+
ref,
|
|
187
|
+
uid,
|
|
188
|
+
baselineHash,
|
|
189
|
+
driftMask: driftMask(object, witnessed),
|
|
190
|
+
};
|
|
191
|
+
}),
|
|
192
|
+
delete: Effect.fn(function* ({ output }) {
|
|
193
|
+
const connection = connectionOfOutput(output);
|
|
194
|
+
if (!connection)
|
|
195
|
+
return;
|
|
196
|
+
const transport = yield* ifClusterExists(connectCluster(connection));
|
|
197
|
+
if (!transport)
|
|
198
|
+
return;
|
|
199
|
+
// 404 (including a removed CRD's discovery 404) is already success.
|
|
200
|
+
// 403/5xx must surface: the object is still there.
|
|
201
|
+
yield* deleteObject({ transport, object: output.ref });
|
|
202
|
+
}),
|
|
203
|
+
};
|
|
204
|
+
}));
|
|
205
|
+
//# sourceMappingURL=Manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Manifest.js","sourceRoot":"","sources":["../src/Manifest.ts"],"names":[],"mappings":"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"}
|
package/lib/Objects.d.ts
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal Kubernetes object model + ordering/path helpers powering
|
|
3
|
+
* `Kubernetes.Manifest` and the workload platforms (`Deployment`, `Job`).
|
|
4
|
+
* Not part of the public surface — the public manifest shape is the literal
|
|
5
|
+
* `KubernetesManifest` on `Kubernetes.Manifest`.
|
|
6
|
+
*/
|
|
7
|
+
export interface KubernetesObjectMetadata {
|
|
8
|
+
name: string;
|
|
9
|
+
namespace?: string;
|
|
10
|
+
labels?: Record<string, string>;
|
|
11
|
+
annotations?: Record<string, string>;
|
|
12
|
+
}
|
|
13
|
+
export type KubernetesObjectDefinition = {
|
|
14
|
+
apiVersion: string;
|
|
15
|
+
kind: string;
|
|
16
|
+
metadata: KubernetesObjectMetadata;
|
|
17
|
+
} & Record<string, unknown>;
|
|
18
|
+
export interface KubernetesObjectRef {
|
|
19
|
+
apiVersion: string;
|
|
20
|
+
kind: string;
|
|
21
|
+
name: string;
|
|
22
|
+
namespace?: string;
|
|
23
|
+
/**
|
|
24
|
+
* Fingerprint of the declared fields last applied. Reads compare a GET
|
|
25
|
+
* projected through {@link driftMask} to this.
|
|
26
|
+
*/
|
|
27
|
+
baselineHash?: string;
|
|
28
|
+
/**
|
|
29
|
+
* Declared-field mask from the last apply. Absent on state written before
|
|
30
|
+
* selections existed; those rows still detect a deleted object.
|
|
31
|
+
*/
|
|
32
|
+
driftMask?: unknown;
|
|
33
|
+
}
|
|
34
|
+
export interface KubernetesObjectBinding {
|
|
35
|
+
type: "kubernetes-object";
|
|
36
|
+
object: KubernetesObjectDefinition;
|
|
37
|
+
}
|
|
38
|
+
export type KubernetesObjectScope = "Cluster" | "Namespaced";
|
|
39
|
+
export interface KubernetesObjectKindSpec {
|
|
40
|
+
plural: string;
|
|
41
|
+
scope: KubernetesObjectScope;
|
|
42
|
+
applyRank: number;
|
|
43
|
+
}
|
|
44
|
+
/** Apply rank for kinds not in the static table (applied last, deleted first). */
|
|
45
|
+
export declare const DEFAULT_APPLY_RANK = 100;
|
|
46
|
+
/** Look up the static kind table; `undefined` for kinds needing discovery. */
|
|
47
|
+
export declare const lookupKubernetesKindSpec: (input: Pick<KubernetesObjectRef, "apiVersion" | "kind">) => KubernetesObjectKindSpec | undefined;
|
|
48
|
+
export declare const getKubernetesKindSpec: (input: Pick<KubernetesObjectRef, "apiVersion" | "kind">) => KubernetesObjectKindSpec;
|
|
49
|
+
export declare const toKubernetesObjectRef: (object: KubernetesObjectDefinition) => KubernetesObjectRef;
|
|
50
|
+
export declare const kubernetesObjectKey: (input: Pick<KubernetesObjectRef, "apiVersion" | "kind" | "name" | "namespace">) => string;
|
|
51
|
+
export declare const sortObjectsForApply: (objects: ReadonlyArray<KubernetesObjectDefinition>) => KubernetesObjectDefinition[];
|
|
52
|
+
export declare const sortRefsForDelete: (objects: ReadonlyArray<KubernetesObjectRef>) => KubernetesObjectRef[];
|
|
53
|
+
export declare const chunkByApplyRank: (objects: ReadonlyArray<KubernetesObjectDefinition>) => KubernetesObjectDefinition[][];
|
|
54
|
+
/**
|
|
55
|
+
* Build the REST path for an object given its (statically-known or
|
|
56
|
+
* discovered) kind spec.
|
|
57
|
+
*/
|
|
58
|
+
export declare const buildKubernetesObjectPathWithSpec: (input: Pick<KubernetesObjectRef, "apiVersion" | "kind" | "name" | "namespace">, spec: KubernetesObjectKindSpec) => string;
|
|
59
|
+
export declare const buildKubernetesObjectPath: (input: Pick<KubernetesObjectRef, "apiVersion" | "kind" | "name" | "namespace">) => string;
|
|
60
|
+
//# sourceMappingURL=Objects.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Objects.d.ts","sourceRoot":"","sources":["../src/Objects.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,wBAAwB,CAAC;CACpC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE5B,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,MAAM,EAAE,0BAA0B,CAAC;CACpC;AAED,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,YAAY,CAAC;AAE7D,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,qBAAqB,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,kFAAkF;AAClF,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAsEtC,8EAA8E;AAC9E,eAAO,MAAM,wBAAwB,UAC5B,IAAI,CAAC,mBAAmB,EAAE,YAAY,GAAG,MAAM,CAAC,KACtD,wBAAwB,GAAG,SAAiD,CAAC;AAEhF,eAAO,MAAM,qBAAqB,UAAW,IAAI,CAAC,mBAAmB,EAAE,YAAY,GAAG,MAAM,CAAC,6BAM5F,CAAC;AAKF,eAAO,MAAM,qBAAqB,WAAY,0BAA0B,KAAG,mBAKzE,CAAC;AAEH,eAAO,MAAM,mBAAmB,UACvB,IAAI,CAAC,mBAAmB,EAAE,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC,WACQ,CAAC;AAKzF,eAAO,MAAM,mBAAmB,YAAa,aAAa,CAAC,0BAA0B,CAAC,iCAKnF,CAAC;AAEJ,eAAO,MAAM,iBAAiB,YAAa,aAAa,CAAC,mBAAmB,CAAC,0BACM,CAAC;AAEpF,eAAO,MAAM,gBAAgB,YAAa,aAAa,CAAC,0BAA0B,CAAC,mCAoBlF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iCAAiC,UACrC,IAAI,CAAC,mBAAmB,EAAE,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC,QACxE,wBAAwB,WAmB/B,CAAC;AAEF,eAAO,MAAM,yBAAyB,UAC7B,IAAI,CAAC,mBAAmB,EAAE,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC,WACL,CAAC"}
|
package/lib/Objects.js
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal Kubernetes object model + ordering/path helpers powering
|
|
3
|
+
* `Kubernetes.Manifest` and the workload platforms (`Deployment`, `Job`).
|
|
4
|
+
* Not part of the public surface — the public manifest shape is the literal
|
|
5
|
+
* `KubernetesManifest` on `Kubernetes.Manifest`.
|
|
6
|
+
*/
|
|
7
|
+
/** Apply rank for kinds not in the static table (applied last, deleted first). */
|
|
8
|
+
export const DEFAULT_APPLY_RANK = 100;
|
|
9
|
+
const supportedKinds = {
|
|
10
|
+
"v1/Namespace": {
|
|
11
|
+
plural: "namespaces",
|
|
12
|
+
scope: "Cluster",
|
|
13
|
+
applyRank: 10,
|
|
14
|
+
},
|
|
15
|
+
// CRDs apply right after namespaces so a chart's custom resources
|
|
16
|
+
// (default rank 100) always find their definition registered.
|
|
17
|
+
"apiextensions.k8s.io/v1/CustomResourceDefinition": {
|
|
18
|
+
plural: "customresourcedefinitions",
|
|
19
|
+
scope: "Cluster",
|
|
20
|
+
applyRank: 15,
|
|
21
|
+
},
|
|
22
|
+
"v1/ServiceAccount": {
|
|
23
|
+
plural: "serviceaccounts",
|
|
24
|
+
scope: "Namespaced",
|
|
25
|
+
applyRank: 20,
|
|
26
|
+
},
|
|
27
|
+
"v1/ConfigMap": {
|
|
28
|
+
plural: "configmaps",
|
|
29
|
+
scope: "Namespaced",
|
|
30
|
+
applyRank: 30,
|
|
31
|
+
},
|
|
32
|
+
"v1/Secret": {
|
|
33
|
+
plural: "secrets",
|
|
34
|
+
scope: "Namespaced",
|
|
35
|
+
applyRank: 30,
|
|
36
|
+
},
|
|
37
|
+
"v1/Service": {
|
|
38
|
+
plural: "services",
|
|
39
|
+
scope: "Namespaced",
|
|
40
|
+
applyRank: 40,
|
|
41
|
+
},
|
|
42
|
+
"apps/v1/Deployment": {
|
|
43
|
+
plural: "deployments",
|
|
44
|
+
scope: "Namespaced",
|
|
45
|
+
applyRank: 50,
|
|
46
|
+
},
|
|
47
|
+
"apps/v1/StatefulSet": {
|
|
48
|
+
plural: "statefulsets",
|
|
49
|
+
scope: "Namespaced",
|
|
50
|
+
applyRank: 50,
|
|
51
|
+
},
|
|
52
|
+
"apps/v1/DaemonSet": {
|
|
53
|
+
plural: "daemonsets",
|
|
54
|
+
scope: "Namespaced",
|
|
55
|
+
applyRank: 50,
|
|
56
|
+
},
|
|
57
|
+
"batch/v1/Job": {
|
|
58
|
+
plural: "jobs",
|
|
59
|
+
scope: "Namespaced",
|
|
60
|
+
applyRank: 60,
|
|
61
|
+
},
|
|
62
|
+
"batch/v1/CronJob": {
|
|
63
|
+
plural: "cronjobs",
|
|
64
|
+
scope: "Namespaced",
|
|
65
|
+
applyRank: 60,
|
|
66
|
+
},
|
|
67
|
+
"v1/Pod": {
|
|
68
|
+
plural: "pods",
|
|
69
|
+
scope: "Namespaced",
|
|
70
|
+
applyRank: 60,
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
const objectTypeKey = (input) => `${input.apiVersion}/${input.kind}`;
|
|
74
|
+
/** Look up the static kind table; `undefined` for kinds needing discovery. */
|
|
75
|
+
export const lookupKubernetesKindSpec = (input) => supportedKinds[objectTypeKey(input)];
|
|
76
|
+
export const getKubernetesKindSpec = (input) => {
|
|
77
|
+
const spec = lookupKubernetesKindSpec(input);
|
|
78
|
+
if (!spec) {
|
|
79
|
+
throw new Error(`Unsupported Kubernetes object ${input.apiVersion}/${input.kind}`);
|
|
80
|
+
}
|
|
81
|
+
return spec;
|
|
82
|
+
};
|
|
83
|
+
const applyRankOf = (input) => lookupKubernetesKindSpec(input)?.applyRank ?? DEFAULT_APPLY_RANK;
|
|
84
|
+
export const toKubernetesObjectRef = (object) => ({
|
|
85
|
+
apiVersion: object.apiVersion,
|
|
86
|
+
kind: object.kind,
|
|
87
|
+
name: object.metadata.name,
|
|
88
|
+
namespace: object.metadata.namespace,
|
|
89
|
+
});
|
|
90
|
+
export const kubernetesObjectKey = (input) => [input.apiVersion, input.kind, input.namespace ?? "_cluster", input.name].join("/");
|
|
91
|
+
const compareRefs = (a, b) => kubernetesObjectKey(a).localeCompare(kubernetesObjectKey(b));
|
|
92
|
+
export const sortObjectsForApply = (objects) => [...objects].sort((a, b) => applyRankOf(a) - applyRankOf(b) ||
|
|
93
|
+
compareRefs(toKubernetesObjectRef(a), toKubernetesObjectRef(b)));
|
|
94
|
+
export const sortRefsForDelete = (objects) => [...objects].sort((a, b) => applyRankOf(b) - applyRankOf(a) || compareRefs(a, b));
|
|
95
|
+
export const chunkByApplyRank = (objects) => {
|
|
96
|
+
const chunks = [];
|
|
97
|
+
for (const object of sortObjectsForApply(objects)) {
|
|
98
|
+
const rank = applyRankOf(object);
|
|
99
|
+
const current = chunks[chunks.length - 1];
|
|
100
|
+
if (!current) {
|
|
101
|
+
chunks.push([object]);
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
const currentRank = applyRankOf(current[0]);
|
|
105
|
+
if (currentRank === rank) {
|
|
106
|
+
current.push(object);
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
chunks.push([object]);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return chunks;
|
|
113
|
+
};
|
|
114
|
+
/**
|
|
115
|
+
* Build the REST path for an object given its (statically-known or
|
|
116
|
+
* discovered) kind spec.
|
|
117
|
+
*/
|
|
118
|
+
export const buildKubernetesObjectPathWithSpec = (input, spec) => {
|
|
119
|
+
const [group, version] = input.apiVersion.includes("/")
|
|
120
|
+
? input.apiVersion.split("/", 2)
|
|
121
|
+
: [undefined, input.apiVersion];
|
|
122
|
+
const base = group ? `/apis/${group}/${version}` : `/api/${version}`;
|
|
123
|
+
if (spec.scope === "Namespaced") {
|
|
124
|
+
if (!input.namespace) {
|
|
125
|
+
throw new Error(`Kubernetes object ${input.apiVersion}/${input.kind}/${input.name} requires a namespace`);
|
|
126
|
+
}
|
|
127
|
+
return `${base}/namespaces/${input.namespace}/${spec.plural}/${input.name}`;
|
|
128
|
+
}
|
|
129
|
+
return `${base}/${spec.plural}/${input.name}`;
|
|
130
|
+
};
|
|
131
|
+
export const buildKubernetesObjectPath = (input) => buildKubernetesObjectPathWithSpec(input, getKubernetesKindSpec(input));
|
|
132
|
+
//# sourceMappingURL=Objects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Objects.js","sourceRoot":"","sources":["../src/Objects.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as Provider from "alchemy/Provider";
|
|
2
|
+
import * as Layer from "effect/Layer";
|
|
3
|
+
declare const Providers_base: Provider.ProviderCollection<Providers, "Kubernetes">;
|
|
4
|
+
export declare class Providers extends Providers_base {
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* The Kubernetes provider layer: the cluster-agnostic workload providers
|
|
8
|
+
* (`Deployment`, `Job`, `Manifest`, `HelmChart`), `LocalCluster`, and the
|
|
9
|
+
* built-in cluster adapters (`kubeconfig`, `token`, `client-cert`, `exec`).
|
|
10
|
+
*
|
|
11
|
+
* Managed-cloud clusters need their platform's adapter alongside — e.g.
|
|
12
|
+
* targeting an `AWS.EKS.Cluster` requires `AWS.providers()` in the same
|
|
13
|
+
* stack:
|
|
14
|
+
*
|
|
15
|
+
* ```ts
|
|
16
|
+
* const stack = Alchemy.Stack("app", {
|
|
17
|
+
* providers: Layer.mergeAll(AWS.providers(), Kubernetes.providers()),
|
|
18
|
+
* state: AWS.state(),
|
|
19
|
+
* });
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export declare const providers: () => Layer.Layer<import("./ClusterAdapter.ts").ClusterAdapterService | Providers, never, import("alchemy/AlchemyContext").AlchemyContext | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("effect/FileSystem").FileSystem | import("effect/Path").Path | import("alchemy/Stack").Stack | import("alchemy/Stage").Stage>;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=Providers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Providers.d.ts","sourceRoot":"","sources":["../src/Providers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;;AAQtC,qBAAa,SAAU,SAAQ,cAAsD;CAAG;AAExF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,SAAS,qVAuBnB,CAAC"}
|
package/lib/Providers.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { DockerLive } from "@alchemy.run/docker/Docker";
|
|
2
|
+
import * as Provider from "alchemy/Provider";
|
|
3
|
+
import * as Layer from "effect/Layer";
|
|
4
|
+
import { builtinAdapters } from "./BuiltinAdapters.js";
|
|
5
|
+
import { Deployment, DeploymentProvider } from "./Deployment.js";
|
|
6
|
+
import { HelmChart, HelmChartProvider } from "./HelmChart.js";
|
|
7
|
+
import { Job, JobProvider } from "./Job.js";
|
|
8
|
+
import { LocalCluster, LocalClusterProvider } from "./LocalCluster.js";
|
|
9
|
+
import { Manifest, ManifestProvider } from "./Manifest.js";
|
|
10
|
+
export class Providers extends Provider.ProviderCollection()("Kubernetes") {
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* The Kubernetes provider layer: the cluster-agnostic workload providers
|
|
14
|
+
* (`Deployment`, `Job`, `Manifest`, `HelmChart`), `LocalCluster`, and the
|
|
15
|
+
* built-in cluster adapters (`kubeconfig`, `token`, `client-cert`, `exec`).
|
|
16
|
+
*
|
|
17
|
+
* Managed-cloud clusters need their platform's adapter alongside — e.g.
|
|
18
|
+
* targeting an `AWS.EKS.Cluster` requires `AWS.providers()` in the same
|
|
19
|
+
* stack:
|
|
20
|
+
*
|
|
21
|
+
* ```ts
|
|
22
|
+
* const stack = Alchemy.Stack("app", {
|
|
23
|
+
* providers: Layer.mergeAll(AWS.providers(), Kubernetes.providers()),
|
|
24
|
+
* state: AWS.state(),
|
|
25
|
+
* });
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export const providers = () => Layer.effect(Providers, Provider.collection([Deployment, HelmChart, Job, LocalCluster, Manifest])).pipe(Layer.provide(Layer.mergeAll(DeploymentProvider(), HelmChartProvider(), JobProvider(), LocalClusterProvider(), ManifestProvider()).pipe(
|
|
29
|
+
// Workloads build `main` / `context` images with the Docker CLI for
|
|
30
|
+
// connections that declare a `registry`.
|
|
31
|
+
Layer.provide(DockerLive))),
|
|
32
|
+
// The built-in adapters are provideMerged (not just provided) so the
|
|
33
|
+
// workloads' dynamic `findClusterAdapter` lookups see them in the
|
|
34
|
+
// ambient stack context.
|
|
35
|
+
Layer.provideMerge(builtinAdapters()), Layer.orDie);
|
|
36
|
+
//# sourceMappingURL=Providers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Providers.js","sourceRoot":"","sources":["../src/Providers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAE3D,MAAM,OAAO,SAAU,SAAQ,QAAQ,CAAC,kBAAkB,EAAa,CAAC,YAAY,CAAC;CAAG;AAExF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,EAAE,CAC5B,KAAK,CAAC,MAAM,CACV,SAAS,EACT,QAAQ,CAAC,UAAU,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC,CAC1E,CAAC,IAAI,CACJ,KAAK,CAAC,OAAO,CACX,KAAK,CAAC,QAAQ,CACZ,kBAAkB,EAAE,EACpB,iBAAiB,EAAE,EACnB,WAAW,EAAE,EACb,oBAAoB,EAAE,EACtB,gBAAgB,EAAE,CACnB,CAAC,IAAI;AACJ,oEAAoE;AACpE,yCAAyC;AACzC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAC1B,CACF;AACD,qEAAqE;AACrE,kEAAkE;AAClE,yBAAyB;AACzB,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC,EACrC,KAAK,CAAC,KAAK,CACZ,CAAC"}
|