@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
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from "./BuiltinAdapters.ts";
|
|
2
|
+
export * from "./ClusterAdapter.ts";
|
|
3
|
+
export * from "./Connection.ts";
|
|
4
|
+
export * from "./Deployment.ts";
|
|
5
|
+
export * from "./HelmChart.ts";
|
|
6
|
+
export * from "./Job.ts";
|
|
7
|
+
export * from "./LocalCluster.ts";
|
|
8
|
+
export * from "./Manifest.ts";
|
|
9
|
+
export * from "./Providers.ts";
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC"}
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from "./BuiltinAdapters.js";
|
|
2
|
+
export * from "./ClusterAdapter.js";
|
|
3
|
+
export * from "./Connection.js";
|
|
4
|
+
export * from "./Deployment.js";
|
|
5
|
+
export * from "./HelmChart.js";
|
|
6
|
+
export * from "./Job.js";
|
|
7
|
+
export * from "./LocalCluster.js";
|
|
8
|
+
export * from "./Manifest.js";
|
|
9
|
+
export * from "./Providers.js";
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
/**
|
|
3
|
+
* Fields alchemy applied. Leaf `null` is a scalar slot filled from the
|
|
4
|
+
* document. Merge-key scalars and set members stay so list identity still
|
|
5
|
+
* matches. A Redacted identity stays wrapped; other secret leaves are null
|
|
6
|
+
* so they are not copied into state.
|
|
7
|
+
*
|
|
8
|
+
* When any list is a map or a set, the mask is `{ $fields, $lists }`. `$lists`
|
|
9
|
+
* is the topology taken from `witness` (the apply response's fieldsV1) so a
|
|
10
|
+
* later GET is classified the same way. A plain object mask has only atomic lists.
|
|
11
|
+
*/
|
|
12
|
+
export declare const driftMask: (declaration: unknown, witness?: unknown) => unknown;
|
|
13
|
+
/** Selection of `document` through `declaration` (or a {@link driftMask}). */
|
|
14
|
+
export declare const selectDrift: (declaration: unknown, document: unknown) => unknown;
|
|
15
|
+
/** True when a live object and a baseline agree on the declared fields. */
|
|
16
|
+
export declare const appliedObjectsMatch: (live: unknown, preview: unknown, desired: unknown) => boolean;
|
|
17
|
+
/** Hash of {@link selectDrift}. The apply response and a later GET share it. */
|
|
18
|
+
export declare const hashDriftSelection: (declaration: unknown, document: unknown) => Effect.Effect<string, never, never>;
|
|
19
|
+
//# sourceMappingURL=declared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"declared.d.ts","sourceRoot":"","sources":["../../src/internal/declared.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAqUxC;;;;;;;;;GASG;AACH,eAAO,MAAM,SAAS,gBAAiB,OAAO,YAAY,OAAO,KAAG,OAKnE,CAAC;AAgHF,8EAA8E;AAC9E,eAAO,MAAM,WAAW,gBAAiB,OAAO,YAAY,OAAO,KAAG,OAGrE,CAAC;AAEF,2EAA2E;AAC3E,eAAO,MAAM,mBAAmB,SAAU,OAAO,WAAW,OAAO,WAAW,OAAO,KAAG,OAClB,CAAC;AAEvE,gFAAgF;AAChF,eAAO,MAAM,kBAAkB,gBAAiB,OAAO,YAAY,OAAO,wCAInC,CAAC"}
|
|
@@ -0,0 +1,435 @@
|
|
|
1
|
+
import { deepEqual } from "alchemy/Diff";
|
|
2
|
+
import { isPlainObject } from "alchemy/Util/data";
|
|
3
|
+
import { sha256Object } from "alchemy/Util/sha256";
|
|
4
|
+
import * as Effect from "effect/Effect";
|
|
5
|
+
import * as Redacted from "effect/Redacted";
|
|
6
|
+
/**
|
|
7
|
+
* Core list keys. Used only for the upstream groups in {@link builtinGroups}
|
|
8
|
+
* when `fieldsV1` did not describe that path. `ports` is `containerPort`+
|
|
9
|
+
* `protocol` on containers and `port`+`protocol` on Services. Every other
|
|
10
|
+
* list is atomic, Kubernetes' default — a CRD field named `containers` included.
|
|
11
|
+
*/
|
|
12
|
+
const listKeys = {
|
|
13
|
+
containers: [["name"]],
|
|
14
|
+
initContainers: [["name"]],
|
|
15
|
+
ephemeralContainers: [["name"]],
|
|
16
|
+
volumes: [["name"]],
|
|
17
|
+
env: [["name"]],
|
|
18
|
+
imagePullSecrets: [["name"]],
|
|
19
|
+
volumeMounts: [["mountPath"]],
|
|
20
|
+
volumeDevices: [["devicePath"]],
|
|
21
|
+
ports: [
|
|
22
|
+
["containerPort", "protocol"],
|
|
23
|
+
["port", "protocol"],
|
|
24
|
+
],
|
|
25
|
+
readinessGates: [["conditionType"]],
|
|
26
|
+
};
|
|
27
|
+
/** Absent apiserver default, so a declared port matches `{ protocol: TCP }`. */
|
|
28
|
+
const listDefaults = {
|
|
29
|
+
ports: { protocol: "TCP" },
|
|
30
|
+
};
|
|
31
|
+
/** Scalar merge sets. Identity is the string itself. */
|
|
32
|
+
const scalarSets = new Set(["finalizers"]);
|
|
33
|
+
/**
|
|
34
|
+
* Maps whose values are Kubernetes quantities. The apiserver rewrites
|
|
35
|
+
* `"0.1"` to `"100m"` and `"1.5Gi"` to `"1536Mi"`. Keying this off the
|
|
36
|
+
* value's own name would also rewrite ConfigMap `data.memory`.
|
|
37
|
+
*/
|
|
38
|
+
const quantityParents = new Set(["requests", "limits", "hard"]);
|
|
39
|
+
const decimalNanos = {
|
|
40
|
+
n: 1n,
|
|
41
|
+
u: 1000n,
|
|
42
|
+
m: 1000000n,
|
|
43
|
+
"": 1000000000n,
|
|
44
|
+
k: 1000000000000n,
|
|
45
|
+
M: 1000000000000000n,
|
|
46
|
+
G: 1000000000000000000n,
|
|
47
|
+
T: 1000000000000000000000n,
|
|
48
|
+
P: 1000000000000000000000000n,
|
|
49
|
+
E: 1000000000000000000000000000n,
|
|
50
|
+
};
|
|
51
|
+
const binaryFactor = {
|
|
52
|
+
Ki: 1024n,
|
|
53
|
+
Mi: 1024n ** 2n,
|
|
54
|
+
Gi: 1024n ** 3n,
|
|
55
|
+
Ti: 1024n ** 4n,
|
|
56
|
+
Pi: 1024n ** 5n,
|
|
57
|
+
Ei: 1024n ** 6n,
|
|
58
|
+
};
|
|
59
|
+
const quantityPattern = /^([+-])?(\d+)(?:\.(\d+))?(n|u|m|k|M|G|T|P|E|Ki|Mi|Gi|Ti|Pi|Ei)?$/;
|
|
60
|
+
/** Nanounits, or undefined when `raw` is not a Kubernetes quantity. */
|
|
61
|
+
const parseQuantityNanos = (raw) => {
|
|
62
|
+
const match = quantityPattern.exec(raw);
|
|
63
|
+
if (!match)
|
|
64
|
+
return undefined;
|
|
65
|
+
const suffix = match[4] ?? "";
|
|
66
|
+
const scale = suffix in binaryFactor ? binaryFactor[suffix] * 1000000000n : decimalNanos[suffix];
|
|
67
|
+
if (scale === undefined)
|
|
68
|
+
return undefined;
|
|
69
|
+
const fraction = match[3] ?? "";
|
|
70
|
+
const numerator = BigInt((match[2] ?? "") + fraction) * scale;
|
|
71
|
+
const denominator = 10n ** BigInt(fraction.length);
|
|
72
|
+
if (denominator === 0n || numerator % denominator !== 0n)
|
|
73
|
+
return undefined;
|
|
74
|
+
const magnitude = numerator / denominator;
|
|
75
|
+
return match[1] === "-" ? -magnitude : magnitude;
|
|
76
|
+
};
|
|
77
|
+
const canonicalScalar = (parent, field, value) => {
|
|
78
|
+
if (parent === "ports" && field === "protocol" && typeof value === "string") {
|
|
79
|
+
return value.toUpperCase();
|
|
80
|
+
}
|
|
81
|
+
if (typeof value === "string" && parent !== undefined && quantityParents.has(parent)) {
|
|
82
|
+
const nanos = parseQuantityNanos(value);
|
|
83
|
+
if (nanos !== undefined)
|
|
84
|
+
return nanos.toString();
|
|
85
|
+
}
|
|
86
|
+
return value;
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* `stringData` is write-only. The apiserver stores it as base64 `data` and
|
|
90
|
+
* omits `stringData` from GET and apply responses, so compare the declared
|
|
91
|
+
* strings with `data` decoded on both sides.
|
|
92
|
+
*/
|
|
93
|
+
const decodeSecretData = (data) => {
|
|
94
|
+
if (!isPlainObject(data))
|
|
95
|
+
return {};
|
|
96
|
+
const decoded = {};
|
|
97
|
+
for (const [key, value] of Object.entries(data)) {
|
|
98
|
+
decoded[key] =
|
|
99
|
+
typeof value === "string" ? Buffer.from(value, "base64").toString("utf8") : value;
|
|
100
|
+
}
|
|
101
|
+
return decoded;
|
|
102
|
+
};
|
|
103
|
+
/** Root-only: Secret `stringData` is compared as decoded `data`. */
|
|
104
|
+
const normalizeApplied = (applied, desired) => {
|
|
105
|
+
if (!isPlainObject(applied) || !isPlainObject(desired))
|
|
106
|
+
return applied;
|
|
107
|
+
if ((applied.kind === "Secret" || desired.kind === "Secret") &&
|
|
108
|
+
"stringData" in desired &&
|
|
109
|
+
isPlainObject(applied.data)) {
|
|
110
|
+
return { ...applied, stringData: decodeSecretData(applied.data) };
|
|
111
|
+
}
|
|
112
|
+
return applied;
|
|
113
|
+
};
|
|
114
|
+
const fieldValue = (item, key, field) => {
|
|
115
|
+
if (isPlainObject(item)) {
|
|
116
|
+
const raw = item[key];
|
|
117
|
+
const value = Redacted.isRedacted(raw) ? Redacted.value(raw) : raw;
|
|
118
|
+
if (typeof value === "string")
|
|
119
|
+
return key === "protocol" ? value.toUpperCase() : value;
|
|
120
|
+
if (typeof value === "number")
|
|
121
|
+
return value;
|
|
122
|
+
}
|
|
123
|
+
return field === undefined ? undefined : listDefaults[field]?.[key];
|
|
124
|
+
};
|
|
125
|
+
const alignKeys = (field, desired) => {
|
|
126
|
+
for (const keys of (field === undefined ? undefined : listKeys[field]) ?? []) {
|
|
127
|
+
if (desired.every((item) => keys.every((key) => fieldValue(item, key, field) !== undefined))) {
|
|
128
|
+
return keys;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return undefined;
|
|
132
|
+
};
|
|
133
|
+
const apiVersionOf = (value) => isPlainObject(value) && typeof value.apiVersion === "string" ? value.apiVersion : undefined;
|
|
134
|
+
/**
|
|
135
|
+
* Upstream groups whose OpenAPI matches {@link listKeys}. A CRD group is
|
|
136
|
+
* absent even when it ends in `.k8s.io`.
|
|
137
|
+
*/
|
|
138
|
+
const builtinGroups = new Set(["", "apps", "batch", "policy", "autoscaling"]);
|
|
139
|
+
const builtinGroup = (apiVersion) => {
|
|
140
|
+
if (apiVersion === undefined)
|
|
141
|
+
return false;
|
|
142
|
+
const slash = apiVersion.indexOf("/");
|
|
143
|
+
const group = slash === -1 ? "" : apiVersion.slice(0, slash);
|
|
144
|
+
return builtinGroups.has(group);
|
|
145
|
+
};
|
|
146
|
+
const parseMapKeys = (encoded) => {
|
|
147
|
+
try {
|
|
148
|
+
const value = JSON.parse(encoded);
|
|
149
|
+
return isPlainObject(value) ? Object.keys(value) : undefined;
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
return undefined;
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
/**
|
|
156
|
+
* List paths encoded by the apiserver in `metadata.managedFields[].fieldsV1`.
|
|
157
|
+
* `arrays` drops scalar leaves: an owned `{".":{}}` is a list only when the
|
|
158
|
+
* declaration has an array there.
|
|
159
|
+
*/
|
|
160
|
+
const fieldsV1Topo = (document, arrays) => {
|
|
161
|
+
if (!isPlainObject(document) || !isPlainObject(document.metadata))
|
|
162
|
+
return undefined;
|
|
163
|
+
const managed = document.metadata.managedFields;
|
|
164
|
+
if (!Array.isArray(managed))
|
|
165
|
+
return undefined;
|
|
166
|
+
const topo = new Map();
|
|
167
|
+
const visit = (node, path) => {
|
|
168
|
+
if (!isPlainObject(node))
|
|
169
|
+
return;
|
|
170
|
+
const id = path.join(".");
|
|
171
|
+
let mapKeys;
|
|
172
|
+
let set = false;
|
|
173
|
+
let atomic = false;
|
|
174
|
+
// `{".":{}}` is an owned list with no element yet. A scalar leaf looks the same.
|
|
175
|
+
let sawDot = false;
|
|
176
|
+
let sawOther = false;
|
|
177
|
+
for (const key of Object.keys(node)) {
|
|
178
|
+
if (key === ".") {
|
|
179
|
+
sawDot = true;
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
sawOther = true;
|
|
183
|
+
if (!mapKeys && key.startsWith("k:"))
|
|
184
|
+
mapKeys = parseMapKeys(key.slice(2));
|
|
185
|
+
else if (key.startsWith("v:"))
|
|
186
|
+
set = true;
|
|
187
|
+
else if (key.startsWith("i:"))
|
|
188
|
+
atomic = true;
|
|
189
|
+
}
|
|
190
|
+
const ownedEmpty = sawDot && !sawOther;
|
|
191
|
+
const field = path[path.length - 1];
|
|
192
|
+
// `k:` is the list identity. A later `v:` or empty owner must not replace it.
|
|
193
|
+
const keyed = Array.isArray(topo.get(id));
|
|
194
|
+
if (id.length > 0 && mapKeys && mapKeys.length > 0)
|
|
195
|
+
topo.set(id, mapKeys);
|
|
196
|
+
else if (id.length > 0 &&
|
|
197
|
+
!keyed &&
|
|
198
|
+
(set || (ownedEmpty && arrays.has(id) && scalarSets.has(field ?? "")))) {
|
|
199
|
+
topo.set(id, "set");
|
|
200
|
+
}
|
|
201
|
+
else if (id.length > 0 && (atomic || ownedEmpty) && arrays.has(id) && !topo.has(id)) {
|
|
202
|
+
topo.set(id, "atomic");
|
|
203
|
+
}
|
|
204
|
+
for (const [key, child] of Object.entries(node)) {
|
|
205
|
+
if (key.startsWith("f:"))
|
|
206
|
+
visit(child, [...path, key.slice(2)]);
|
|
207
|
+
else if (key.startsWith("k:") || key.startsWith("i:"))
|
|
208
|
+
visit(child, path);
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
for (const entry of managed) {
|
|
212
|
+
if (!isPlainObject(entry) || !isPlainObject(entry.fieldsV1))
|
|
213
|
+
continue;
|
|
214
|
+
visit(entry.fieldsV1, []);
|
|
215
|
+
}
|
|
216
|
+
return topo;
|
|
217
|
+
};
|
|
218
|
+
const builtinTopo = (declaration) => {
|
|
219
|
+
const topo = new Map();
|
|
220
|
+
const visit = (node, path) => {
|
|
221
|
+
if (Array.isArray(node))
|
|
222
|
+
return;
|
|
223
|
+
if (Redacted.isRedacted(node))
|
|
224
|
+
return visit(Redacted.value(node), path);
|
|
225
|
+
if (!isPlainObject(node))
|
|
226
|
+
return;
|
|
227
|
+
for (const [key, child] of Object.entries(node)) {
|
|
228
|
+
const next = [...path, key];
|
|
229
|
+
const value = Redacted.isRedacted(child) ? Redacted.value(child) : child;
|
|
230
|
+
if (Array.isArray(value)) {
|
|
231
|
+
const id = next.join(".");
|
|
232
|
+
if (scalarSets.has(key))
|
|
233
|
+
topo.set(id, "set");
|
|
234
|
+
else {
|
|
235
|
+
const keys = alignKeys(key, value);
|
|
236
|
+
if (keys)
|
|
237
|
+
topo.set(id, keys);
|
|
238
|
+
}
|
|
239
|
+
for (const item of value)
|
|
240
|
+
visit(item, next);
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
visit(value, next);
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
visit(declaration, []);
|
|
247
|
+
return topo;
|
|
248
|
+
};
|
|
249
|
+
/** Array paths in `declaration`. Scalar `{".":{}}` leaves are not lists. */
|
|
250
|
+
const listPaths = (declaration) => {
|
|
251
|
+
const paths = new Set();
|
|
252
|
+
const visit = (node, path) => {
|
|
253
|
+
const value = Redacted.isRedacted(node) ? Redacted.value(node) : node;
|
|
254
|
+
if (Array.isArray(value)) {
|
|
255
|
+
if (path.length > 0)
|
|
256
|
+
paths.add(path.join("."));
|
|
257
|
+
for (const item of value)
|
|
258
|
+
visit(item, path);
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
if (!isPlainObject(value))
|
|
262
|
+
return;
|
|
263
|
+
for (const [key, child] of Object.entries(value))
|
|
264
|
+
visit(child, [...path, key]);
|
|
265
|
+
};
|
|
266
|
+
visit(declaration, []);
|
|
267
|
+
return paths;
|
|
268
|
+
};
|
|
269
|
+
/**
|
|
270
|
+
* The document (apply response or live GET) wins per path. The declaration
|
|
271
|
+
* fills paths it described and the document did not. Built-in groups then
|
|
272
|
+
* fill paths fieldsV1 left blank. An owned `{".":{}}` map list and an `i:`
|
|
273
|
+
* list stay atomic, so the built-in table cannot reclassify them. A `v:`
|
|
274
|
+
* member replaces that mark, and an empty scalar set is stored as a set.
|
|
275
|
+
*/
|
|
276
|
+
const topologyOf = (declaration, document) => {
|
|
277
|
+
const lists = new Map();
|
|
278
|
+
const arrays = listPaths(declaration);
|
|
279
|
+
for (const source of [fieldsV1Topo(declaration, arrays), fieldsV1Topo(document, arrays)]) {
|
|
280
|
+
if (!source)
|
|
281
|
+
continue;
|
|
282
|
+
for (const [path, keys] of source)
|
|
283
|
+
lists.set(path, keys);
|
|
284
|
+
}
|
|
285
|
+
const version = apiVersionOf(declaration) ?? apiVersionOf(document);
|
|
286
|
+
if (builtinGroup(version)) {
|
|
287
|
+
for (const [path, keys] of builtinTopo(declaration)) {
|
|
288
|
+
if (!lists.has(path))
|
|
289
|
+
lists.set(path, keys);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
return lists;
|
|
293
|
+
};
|
|
294
|
+
const storedTopology = (encoded) => {
|
|
295
|
+
const lists = new Map();
|
|
296
|
+
if (!isPlainObject(encoded))
|
|
297
|
+
return lists;
|
|
298
|
+
for (const [path, keys] of Object.entries(encoded)) {
|
|
299
|
+
if (keys === "set" || keys === "atomic") {
|
|
300
|
+
lists.set(path, keys);
|
|
301
|
+
continue;
|
|
302
|
+
}
|
|
303
|
+
if (Array.isArray(keys) && keys.every((key) => typeof key === "string")) {
|
|
304
|
+
lists.set(path, keys);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
return lists;
|
|
308
|
+
};
|
|
309
|
+
const mergeKey = (item, keys, field) => keys.map((key) => String(fieldValue(item, key, field))).join("\0");
|
|
310
|
+
const scalarIdentity = (item) => {
|
|
311
|
+
const value = Redacted.isRedacted(item) ? Redacted.value(item) : item;
|
|
312
|
+
if (typeof value === "string")
|
|
313
|
+
return value;
|
|
314
|
+
if (typeof value === "number" || typeof value === "boolean")
|
|
315
|
+
return JSON.stringify(value);
|
|
316
|
+
return undefined;
|
|
317
|
+
};
|
|
318
|
+
/**
|
|
319
|
+
* Fields alchemy applied. Leaf `null` is a scalar slot filled from the
|
|
320
|
+
* document. Merge-key scalars and set members stay so list identity still
|
|
321
|
+
* matches. A Redacted identity stays wrapped; other secret leaves are null
|
|
322
|
+
* so they are not copied into state.
|
|
323
|
+
*
|
|
324
|
+
* When any list is a map or a set, the mask is `{ $fields, $lists }`. `$lists`
|
|
325
|
+
* is the topology taken from `witness` (the apply response's fieldsV1) so a
|
|
326
|
+
* later GET is classified the same way. A plain object mask has only atomic lists.
|
|
327
|
+
*/
|
|
328
|
+
export const driftMask = (declaration, witness) => {
|
|
329
|
+
const lists = topologyOf(declaration, witness ?? declaration);
|
|
330
|
+
const fields = maskOf(declaration, lists, []);
|
|
331
|
+
if (lists.size === 0)
|
|
332
|
+
return fields;
|
|
333
|
+
return { $fields: fields, $lists: Object.fromEntries(lists) };
|
|
334
|
+
};
|
|
335
|
+
const maskOf = (declaration, lists, path, keep, sensitive = false) => {
|
|
336
|
+
if (Redacted.isRedacted(declaration)) {
|
|
337
|
+
return maskOf(Redacted.value(declaration), lists, path, keep, true);
|
|
338
|
+
}
|
|
339
|
+
if (Array.isArray(declaration)) {
|
|
340
|
+
const spec = lists.get(path.join("."));
|
|
341
|
+
if (spec === "set") {
|
|
342
|
+
return declaration.map((item) => {
|
|
343
|
+
const identity = scalarIdentity(item);
|
|
344
|
+
if (identity === undefined)
|
|
345
|
+
return null;
|
|
346
|
+
return sensitive || Redacted.isRedacted(item) ? Redacted.make(identity) : identity;
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
const keepKeys = Array.isArray(spec) ? new Set(spec) : undefined;
|
|
350
|
+
return declaration.map((item) => maskOf(item, lists, path, keepKeys, sensitive || Redacted.isRedacted(item)));
|
|
351
|
+
}
|
|
352
|
+
if (!isPlainObject(declaration))
|
|
353
|
+
return null;
|
|
354
|
+
const out = {};
|
|
355
|
+
for (const [key, child] of Object.entries(declaration)) {
|
|
356
|
+
const redacted = Redacted.isRedacted(child);
|
|
357
|
+
const value = redacted ? Redacted.value(child) : child;
|
|
358
|
+
const leaf = !isPlainObject(value) && !Array.isArray(value);
|
|
359
|
+
const secret = sensitive || redacted;
|
|
360
|
+
out[key] =
|
|
361
|
+
keep?.has(key) && leaf
|
|
362
|
+
? secret
|
|
363
|
+
? Redacted.make(value)
|
|
364
|
+
: value
|
|
365
|
+
: maskOf(child, lists, [...path, key], undefined, sensitive);
|
|
366
|
+
}
|
|
367
|
+
return out;
|
|
368
|
+
};
|
|
369
|
+
/**
|
|
370
|
+
* Declared paths, values taken from `document` (the apply response or a later
|
|
371
|
+
* GET). Undeclared keys — HPA replicas, controller annotations, apiserver
|
|
372
|
+
* defaults — are absent. Map-list order is not significant.
|
|
373
|
+
*/
|
|
374
|
+
const selectDeclared = (declaration, document, lists, path) => {
|
|
375
|
+
if (Redacted.isRedacted(declaration)) {
|
|
376
|
+
return selectDeclared(Redacted.value(declaration), document, lists, path);
|
|
377
|
+
}
|
|
378
|
+
if (Redacted.isRedacted(document)) {
|
|
379
|
+
return selectDeclared(declaration, Redacted.value(document), lists, path);
|
|
380
|
+
}
|
|
381
|
+
const field = path[path.length - 1];
|
|
382
|
+
if (Array.isArray(declaration)) {
|
|
383
|
+
const items = Array.isArray(document) ? document : [];
|
|
384
|
+
const spec = lists.get(path.join("."));
|
|
385
|
+
if (spec === "set") {
|
|
386
|
+
const present = new Set(items.map(scalarIdentity).filter((value) => value !== undefined));
|
|
387
|
+
return declaration
|
|
388
|
+
.map(scalarIdentity)
|
|
389
|
+
.filter((value) => value !== undefined && present.has(value))
|
|
390
|
+
.sort((left, right) => left.localeCompare(right));
|
|
391
|
+
}
|
|
392
|
+
if (spec === undefined || spec === "atomic") {
|
|
393
|
+
const length = Math.max(declaration.length, items.length);
|
|
394
|
+
return Array.from({ length }, (_, index) => index < declaration.length
|
|
395
|
+
? selectDeclared(declaration[index], items[index], lists, path)
|
|
396
|
+
: items[index]);
|
|
397
|
+
}
|
|
398
|
+
const match = (item) => items.find((candidate) => spec.every((key) => fieldValue(candidate, key, field) === fieldValue(item, key, field)));
|
|
399
|
+
return declaration
|
|
400
|
+
.map((item) => ({
|
|
401
|
+
key: mergeKey(item, spec, field),
|
|
402
|
+
value: selectDeclared(item, match(item), lists, path),
|
|
403
|
+
}))
|
|
404
|
+
.sort((left, right) => left.key.localeCompare(right.key))
|
|
405
|
+
.map((entry) => entry.value);
|
|
406
|
+
}
|
|
407
|
+
if (!isPlainObject(declaration)) {
|
|
408
|
+
return canonicalScalar(path[path.length - 2], field, document);
|
|
409
|
+
}
|
|
410
|
+
const source = isPlainObject(document) ? document : {};
|
|
411
|
+
const out = {};
|
|
412
|
+
for (const [key, child] of Object.entries(declaration)) {
|
|
413
|
+
out[key] = selectDeclared(child, source[key], lists, [...path, key]);
|
|
414
|
+
}
|
|
415
|
+
return out;
|
|
416
|
+
};
|
|
417
|
+
const projection = (declaration, document) => {
|
|
418
|
+
if (isPlainObject(declaration) && "$fields" in declaration && isPlainObject(declaration.$lists)) {
|
|
419
|
+
return { fields: declaration.$fields, lists: storedTopology(declaration.$lists) };
|
|
420
|
+
}
|
|
421
|
+
return { fields: declaration, lists: topologyOf(declaration, document) };
|
|
422
|
+
};
|
|
423
|
+
/** Selection of `document` through `declaration` (or a {@link driftMask}). */
|
|
424
|
+
export const selectDrift = (declaration, document) => {
|
|
425
|
+
const { fields, lists } = projection(declaration, document);
|
|
426
|
+
return selectDeclared(fields, normalizeApplied(document, fields), lists, []);
|
|
427
|
+
};
|
|
428
|
+
/** True when a live object and a baseline agree on the declared fields. */
|
|
429
|
+
export const appliedObjectsMatch = (live, preview, desired) => deepEqual(selectDrift(desired, live), selectDrift(desired, preview));
|
|
430
|
+
/** Hash of {@link selectDrift}. The apply response and a later GET share it. */
|
|
431
|
+
export const hashDriftSelection = (declaration, document) => Effect.sync(() => {
|
|
432
|
+
const viewed = selectDrift(declaration, document);
|
|
433
|
+
return isPlainObject(viewed) ? viewed : { value: viewed };
|
|
434
|
+
}).pipe(Effect.flatMap(sha256Object));
|
|
435
|
+
//# sourceMappingURL=declared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"declared.js","sourceRoot":"","sources":["../../src/internal/declared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import * as FileSystem from "effect/FileSystem";
|
|
3
|
+
import * as Path from "effect/Path";
|
|
4
|
+
import * as ChildProcessSpawner from "effect/process/ChildProcessSpawner";
|
|
5
|
+
import type { KubernetesObjectDefinition } from "../Objects.ts";
|
|
6
|
+
declare const HelmError_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: "HelmError";
|
|
8
|
+
} & Readonly<A>;
|
|
9
|
+
/** A Helm invocation or render failure (bad chart ref, template error, …). */
|
|
10
|
+
export declare class HelmError extends HelmError_base<{
|
|
11
|
+
readonly message: string;
|
|
12
|
+
}> {
|
|
13
|
+
}
|
|
14
|
+
export interface RenderHelmChartOptions {
|
|
15
|
+
/**
|
|
16
|
+
* Chart reference: a repository chart name (with `repo`), an
|
|
17
|
+
* `oci://` reference, or a local chart directory path.
|
|
18
|
+
*/
|
|
19
|
+
chart: string;
|
|
20
|
+
/** Classic chart repository URL (`--repo`). */
|
|
21
|
+
repo?: string | undefined;
|
|
22
|
+
/** Chart version (`--version`). */
|
|
23
|
+
version?: string | undefined;
|
|
24
|
+
/** Release name the chart's templates render with (`.Release.Name`). */
|
|
25
|
+
releaseName: string;
|
|
26
|
+
/** Namespace the chart renders into (`.Release.Namespace`). */
|
|
27
|
+
namespace: string;
|
|
28
|
+
/** Values passed to the chart (written to a temp values file). */
|
|
29
|
+
values?: Record<string, unknown> | undefined;
|
|
30
|
+
/**
|
|
31
|
+
* Render objects from the chart's `crds/` directory too
|
|
32
|
+
* (`--include-crds`).
|
|
33
|
+
* @default true
|
|
34
|
+
*/
|
|
35
|
+
includeCrds?: boolean | undefined;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Render a chart with `helm template --no-hooks` and parse the
|
|
39
|
+
* multi-document YAML output into object definitions. Every rendered object
|
|
40
|
+
* must carry `apiVersion`, `kind`, and `metadata.name` (server-side apply
|
|
41
|
+
* needs a name; `generateName`-only objects are rejected with a clear
|
|
42
|
+
* error). Helm lifecycle hooks are excluded from the result (see
|
|
43
|
+
* {@link isHelmHook}).
|
|
44
|
+
*/
|
|
45
|
+
export declare const renderHelmChart: (options: RenderHelmChartOptions) => Effect.Effect<KubernetesObjectDefinition[], HelmError | import("effect/PlatformError").PlatformError, ChildProcessSpawner.ChildProcessSpawner | FileSystem.FileSystem | Path.Path>;
|
|
46
|
+
/**
|
|
47
|
+
* Whether a rendered object is a Helm lifecycle hook (`helm.sh/hook`
|
|
48
|
+
* annotation). Hooks are executed by Helm at release events (pre-install,
|
|
49
|
+
* pre-delete, test, …); HelmChart has no release and no hook lifecycle, so
|
|
50
|
+
* they are filtered out rather than applied as ordinary objects.
|
|
51
|
+
*/
|
|
52
|
+
export declare const isHelmHook: (object: KubernetesObjectDefinition) => boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Parse `helm template` output (multi-document YAML) into definitions.
|
|
55
|
+
* Hook-annotated objects are dropped — `renderHelmChart` already passes
|
|
56
|
+
* `--no-hooks`, but the parser enforces the invariant independently of the
|
|
57
|
+
* helm CLI's behavior.
|
|
58
|
+
*
|
|
59
|
+
* `secrets` scrubs credentials out of parser and validation diagnostics.
|
|
60
|
+
* Parsed objects stay plain; callers pass the same list to the request
|
|
61
|
+
* scrubber.
|
|
62
|
+
*/
|
|
63
|
+
export declare const parseRenderedManifests: (chart: string, rendered: string, secrets?: readonly string[]) => Effect.Effect<Array<KubernetesObjectDefinition>, HelmError>;
|
|
64
|
+
export {};
|
|
65
|
+
//# sourceMappingURL=helm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helm.d.ts","sourceRoot":"","sources":["../../src/internal/helm.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,IAAI,MAAM,aAAa,CAAC;AAEpC,OAAO,KAAK,mBAAmB,MAAM,oCAAoC,CAAC;AAG1E,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;;;;AAEhE,8EAA8E;AAC9E,qBAAa,SAAU,SAAQ,eAA8B;IAC3D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;CAAG;AAIL,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,mCAAmC;IACnC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,wEAAwE;IACxE,WAAW,EAAE,MAAM,CAAC;IACpB,+DAA+D;IAC/D,SAAS,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAC7C;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACnC;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,yNA4F1B,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,UAAU,WAAY,0BAA0B,KAAG,OACG,CAAC;AAKpE;;;;;;;;;GASG;AACH,eAAO,MAAM,sBAAsB,UAC1B,MAAM,YACH,MAAM,YACP,SAAS,MAAM,EAAE,KACzB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,EAAE,SAAS,CAYzD,CAAC"}
|