typekro 0.22.0 → 0.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/core/composition/nested-status-cel.d.ts +10 -11
- package/dist/core/composition/nested-status-cel.d.ts.map +1 -1
- package/dist/core/composition/nested-status-cel.js +13 -2
- package/dist/core/composition/nested-status-cel.js.map +1 -1
- package/dist/core/expressions/analysis/cache.d.ts.map +1 -1
- package/dist/core/expressions/analysis/cache.js +4 -0
- package/dist/core/expressions/analysis/cache.js.map +1 -1
- package/dist/core/validation/cel-validator.d.ts.map +1 -1
- package/dist/core/validation/cel-validator.js +92 -52
- package/dist/core/validation/cel-validator.js.map +1 -1
- package/dist/factories/clickhouse/compositions/clickhouse-cluster.d.ts +78 -0
- package/dist/factories/clickhouse/compositions/clickhouse-cluster.d.ts.map +1 -0
- package/dist/factories/clickhouse/compositions/clickhouse-cluster.js +251 -0
- package/dist/factories/clickhouse/compositions/clickhouse-cluster.js.map +1 -0
- package/dist/factories/clickhouse/compositions/clickhouse-helm-repository.d.ts +22 -0
- package/dist/factories/clickhouse/compositions/clickhouse-helm-repository.d.ts.map +1 -0
- package/dist/factories/clickhouse/compositions/clickhouse-helm-repository.js +35 -0
- package/dist/factories/clickhouse/compositions/clickhouse-helm-repository.js.map +1 -0
- package/dist/factories/clickhouse/compositions/clickhouse-operator-bootstrap.d.ts +68 -0
- package/dist/factories/clickhouse/compositions/clickhouse-operator-bootstrap.d.ts.map +1 -0
- package/dist/factories/clickhouse/compositions/clickhouse-operator-bootstrap.js +137 -0
- package/dist/factories/clickhouse/compositions/clickhouse-operator-bootstrap.js.map +1 -0
- package/dist/factories/clickhouse/compositions/index.d.ts +4 -0
- package/dist/factories/clickhouse/compositions/index.d.ts.map +1 -0
- package/dist/factories/clickhouse/compositions/index.js +4 -0
- package/dist/factories/clickhouse/compositions/index.js.map +1 -0
- package/dist/factories/clickhouse/index.d.ts +70 -0
- package/dist/factories/clickhouse/index.d.ts.map +1 -0
- package/dist/factories/clickhouse/index.js +70 -0
- package/dist/factories/clickhouse/index.js.map +1 -0
- package/dist/factories/clickhouse/resources/helm.d.ts +62 -0
- package/dist/factories/clickhouse/resources/helm.d.ts.map +1 -0
- package/dist/factories/clickhouse/resources/helm.js +94 -0
- package/dist/factories/clickhouse/resources/helm.js.map +1 -0
- package/dist/factories/clickhouse/resources/index.d.ts +4 -0
- package/dist/factories/clickhouse/resources/index.d.ts.map +1 -0
- package/dist/factories/clickhouse/resources/index.js +4 -0
- package/dist/factories/clickhouse/resources/index.js.map +1 -0
- package/dist/factories/clickhouse/resources/installation.d.ts +83 -0
- package/dist/factories/clickhouse/resources/installation.d.ts.map +1 -0
- package/dist/factories/clickhouse/resources/installation.js +316 -0
- package/dist/factories/clickhouse/resources/installation.js.map +1 -0
- package/dist/factories/clickhouse/resources/keeper.d.ts +40 -0
- package/dist/factories/clickhouse/resources/keeper.d.ts.map +1 -0
- package/dist/factories/clickhouse/resources/keeper.js +107 -0
- package/dist/factories/clickhouse/resources/keeper.js.map +1 -0
- package/dist/factories/clickhouse/types.d.ts +532 -0
- package/dist/factories/clickhouse/types.d.ts.map +1 -0
- package/dist/factories/clickhouse/types.js +295 -0
- package/dist/factories/clickhouse/types.js.map +1 -0
- package/dist/factories/clickhouse/utils/helm-values-mapper.d.ts +65 -0
- package/dist/factories/clickhouse/utils/helm-values-mapper.d.ts.map +1 -0
- package/dist/factories/clickhouse/utils/helm-values-mapper.js +80 -0
- package/dist/factories/clickhouse/utils/helm-values-mapper.js.map +1 -0
- package/dist/factories/clickhouse/utils/index.d.ts +4 -0
- package/dist/factories/clickhouse/utils/index.d.ts.map +1 -0
- package/dist/factories/clickhouse/utils/index.js +4 -0
- package/dist/factories/clickhouse/utils/index.js.map +1 -0
- package/dist/factories/clickhouse/utils/validation.d.ts +21 -0
- package/dist/factories/clickhouse/utils/validation.d.ts.map +1 -0
- package/dist/factories/clickhouse/utils/validation.js +27 -0
- package/dist/factories/clickhouse/utils/validation.js.map +1 -0
- package/dist/factories/clickhouse/utils/zone-layout.d.ts +74 -0
- package/dist/factories/clickhouse/utils/zone-layout.d.ts.map +1 -0
- package/dist/factories/clickhouse/utils/zone-layout.js +103 -0
- package/dist/factories/clickhouse/utils/zone-layout.js.map +1 -0
- package/package.json +5 -1
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zone-pinned CHI layout compilation.
|
|
3
|
+
*
|
|
4
|
+
* WHY THIS EXISTS: the clickhouse-operator's own `podDistribution` supports
|
|
5
|
+
* ONLY the `kubernetes.io/hostname` topologyKey (Altinity/clickhouse-operator
|
|
6
|
+
* issue #772), so per-ZONE spreading cannot be expressed operator-natively.
|
|
7
|
+
* On EKS this matters operationally: EBS volumes are ZONAL, so a replica pod
|
|
8
|
+
* rescheduled into another AZ strands its PVC and the pod wedges Pending
|
|
9
|
+
* (we hit exactly this in production). The fix the operator DOES support is a
|
|
10
|
+
* per-replica `layout.replicas:` list where each replica's pod template pins
|
|
11
|
+
* one zone via nodeAffinity on `topology.kubernetes.io/zone` — this module
|
|
12
|
+
* compiles that layout deterministically.
|
|
13
|
+
*
|
|
14
|
+
* These helpers are pure (no resource construction) and unit-tested directly.
|
|
15
|
+
*/
|
|
16
|
+
/** Standard Kubernetes zone topology label. */
|
|
17
|
+
export const ZONE_TOPOLOGY_KEY = 'topology.kubernetes.io/zone';
|
|
18
|
+
/**
|
|
19
|
+
* Assign one zone per replica index, round-robin.
|
|
20
|
+
*
|
|
21
|
+
* When `replicaCount > zones.length`, zones repeat in order:
|
|
22
|
+
* replicas=5, zones=[a,b,c] → [a, b, c, a, b].
|
|
23
|
+
*
|
|
24
|
+
* @param replicaCount - Number of replicas per shard
|
|
25
|
+
* @param zones - Non-empty list of availability zones
|
|
26
|
+
* @returns Zone for each replica index (length === replicaCount)
|
|
27
|
+
*/
|
|
28
|
+
export function assignZonesRoundRobin(replicaCount, zones) {
|
|
29
|
+
if (zones.length === 0) {
|
|
30
|
+
throw new Error('assignZonesRoundRobin requires at least one zone');
|
|
31
|
+
}
|
|
32
|
+
if (!Number.isInteger(replicaCount) || replicaCount < 1) {
|
|
33
|
+
throw new Error(`assignZonesRoundRobin requires a positive integer replica count, got ${replicaCount}`);
|
|
34
|
+
}
|
|
35
|
+
return Array.from({ length: replicaCount }, (_, index) => {
|
|
36
|
+
const zone = zones[index % zones.length];
|
|
37
|
+
if (zone === undefined) {
|
|
38
|
+
throw new Error(`Zone assignment failed for replica ${index}`);
|
|
39
|
+
}
|
|
40
|
+
return zone;
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Deterministic pod template name for a zone-pinned template.
|
|
45
|
+
*
|
|
46
|
+
* Zone names are DNS-safe label values, so embedding them keeps the template
|
|
47
|
+
* name valid and self-describing (e.g. `clickhouse-us-east-2a`).
|
|
48
|
+
*/
|
|
49
|
+
export function zonePodTemplateName(baseName, zone) {
|
|
50
|
+
return `${baseName}-${zone}`;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Explicit required nodeAffinity pinning a pod to one zone.
|
|
54
|
+
*
|
|
55
|
+
* Emitted as a plain PodSpec affinity (rather than the operator's
|
|
56
|
+
* `podTemplate.zone` sugar) so the pinning is visible verbatim in the
|
|
57
|
+
* rendered CHI and doesn't depend on operator-side template expansion.
|
|
58
|
+
*/
|
|
59
|
+
export function zoneNodeAffinity(zone) {
|
|
60
|
+
return {
|
|
61
|
+
nodeAffinity: {
|
|
62
|
+
requiredDuringSchedulingIgnoredDuringExecution: {
|
|
63
|
+
nodeSelectorTerms: [
|
|
64
|
+
{
|
|
65
|
+
matchExpressions: [
|
|
66
|
+
{
|
|
67
|
+
key: ZONE_TOPOLOGY_KEY,
|
|
68
|
+
operator: 'In',
|
|
69
|
+
values: [zone],
|
|
70
|
+
},
|
|
71
|
+
],
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Compile the per-replica zone-pinned layout for a CHI cluster.
|
|
80
|
+
*
|
|
81
|
+
* @param options.replicaCount - Replicas per shard
|
|
82
|
+
* @param options.zones - Availability zones to round-robin replicas across
|
|
83
|
+
* @param options.podTemplateBaseName - Base name for generated pod templates
|
|
84
|
+
* @param options.podSpec - Shared PodSpec (containers etc.); the zone
|
|
85
|
+
* nodeAffinity is merged in per template
|
|
86
|
+
*/
|
|
87
|
+
export function compileZonePinnedLayout(options) {
|
|
88
|
+
const { replicaCount, zones, podTemplateBaseName, podSpec } = options;
|
|
89
|
+
const assignments = assignZonesRoundRobin(replicaCount, zones);
|
|
90
|
+
const distinctZones = [...new Set(assignments)];
|
|
91
|
+
const podTemplates = distinctZones.map((zone) => ({
|
|
92
|
+
name: zonePodTemplateName(podTemplateBaseName, zone),
|
|
93
|
+
spec: {
|
|
94
|
+
...podSpec,
|
|
95
|
+
affinity: zoneNodeAffinity(zone),
|
|
96
|
+
},
|
|
97
|
+
}));
|
|
98
|
+
const replicas = assignments.map((zone) => ({
|
|
99
|
+
templates: { podTemplate: zonePodTemplateName(podTemplateBaseName, zone) },
|
|
100
|
+
}));
|
|
101
|
+
return { replicas, podTemplates };
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=zone-layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zone-layout.js","sourceRoot":"","sources":["../../../../src/factories/clickhouse/utils/zone-layout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,+CAA+C;AAC/C,MAAM,CAAC,MAAM,iBAAiB,GAAG,6BAA6B,CAAC;AAE/D;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CACnC,YAAoB,EACpB,KAAwB;IAExB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CACb,wEAAwE,YAAY,EAAE,CACvF,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE;QACvD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,sCAAsC,KAAK,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,IAAY;IAChE,OAAO,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAC;AAC/B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO;QACL,YAAY,EAAE;YACZ,8CAA8C,EAAE;gBAC9C,iBAAiB,EAAE;oBACjB;wBACE,gBAAgB,EAAE;4BAChB;gCACE,GAAG,EAAE,iBAAiB;gCACtB,QAAQ,EAAE,IAAI;gCACd,MAAM,EAAE,CAAC,IAAI,CAAC;6BACf;yBACF;qBACF;iBACF;aACF;SACF;KACF,CAAC;AACJ,CAAC;AAiBD;;;;;;;;GAQG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAKvC;IACC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,mBAAmB,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACtE,MAAM,WAAW,GAAG,qBAAqB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IAC/D,MAAM,aAAa,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;IAEhD,MAAM,YAAY,GAAqB,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAClE,IAAI,EAAE,mBAAmB,CAAC,mBAAmB,EAAE,IAAI,CAAC;QACpD,IAAI,EAAE;YACJ,GAAG,OAAO;YACV,QAAQ,EAAE,gBAAgB,CAAC,IAAI,CAAC;SACjC;KACF,CAAC,CAAC,CAAC;IAEJ,MAAM,QAAQ,GAA8B,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACrE,SAAS,EAAE,EAAE,WAAW,EAAE,mBAAmB,CAAC,mBAAmB,EAAE,IAAI,CAAC,EAAE;KAC3E,CAAC,CAAC,CAAC;IAEJ,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;AACpC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "typekro",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.23.0",
|
|
4
4
|
"description": "A control plane aware framework for orchestrating kubernetes resources like a programmer.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|
|
@@ -46,6 +46,10 @@
|
|
|
46
46
|
"import": "./dist/factories/cnpg/index.js",
|
|
47
47
|
"types": "./dist/factories/cnpg/index.d.ts"
|
|
48
48
|
},
|
|
49
|
+
"./clickhouse": {
|
|
50
|
+
"import": "./dist/factories/clickhouse/index.js",
|
|
51
|
+
"types": "./dist/factories/clickhouse/index.d.ts"
|
|
52
|
+
},
|
|
49
53
|
"./flux": {
|
|
50
54
|
"import": "./dist/factories/flux/index.js",
|
|
51
55
|
"types": "./dist/factories/flux/index.d.ts"
|