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.
Files changed (68) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/core/composition/nested-status-cel.d.ts +10 -11
  3. package/dist/core/composition/nested-status-cel.d.ts.map +1 -1
  4. package/dist/core/composition/nested-status-cel.js +13 -2
  5. package/dist/core/composition/nested-status-cel.js.map +1 -1
  6. package/dist/core/expressions/analysis/cache.d.ts.map +1 -1
  7. package/dist/core/expressions/analysis/cache.js +4 -0
  8. package/dist/core/expressions/analysis/cache.js.map +1 -1
  9. package/dist/core/validation/cel-validator.d.ts.map +1 -1
  10. package/dist/core/validation/cel-validator.js +92 -52
  11. package/dist/core/validation/cel-validator.js.map +1 -1
  12. package/dist/factories/clickhouse/compositions/clickhouse-cluster.d.ts +78 -0
  13. package/dist/factories/clickhouse/compositions/clickhouse-cluster.d.ts.map +1 -0
  14. package/dist/factories/clickhouse/compositions/clickhouse-cluster.js +251 -0
  15. package/dist/factories/clickhouse/compositions/clickhouse-cluster.js.map +1 -0
  16. package/dist/factories/clickhouse/compositions/clickhouse-helm-repository.d.ts +22 -0
  17. package/dist/factories/clickhouse/compositions/clickhouse-helm-repository.d.ts.map +1 -0
  18. package/dist/factories/clickhouse/compositions/clickhouse-helm-repository.js +35 -0
  19. package/dist/factories/clickhouse/compositions/clickhouse-helm-repository.js.map +1 -0
  20. package/dist/factories/clickhouse/compositions/clickhouse-operator-bootstrap.d.ts +68 -0
  21. package/dist/factories/clickhouse/compositions/clickhouse-operator-bootstrap.d.ts.map +1 -0
  22. package/dist/factories/clickhouse/compositions/clickhouse-operator-bootstrap.js +137 -0
  23. package/dist/factories/clickhouse/compositions/clickhouse-operator-bootstrap.js.map +1 -0
  24. package/dist/factories/clickhouse/compositions/index.d.ts +4 -0
  25. package/dist/factories/clickhouse/compositions/index.d.ts.map +1 -0
  26. package/dist/factories/clickhouse/compositions/index.js +4 -0
  27. package/dist/factories/clickhouse/compositions/index.js.map +1 -0
  28. package/dist/factories/clickhouse/index.d.ts +70 -0
  29. package/dist/factories/clickhouse/index.d.ts.map +1 -0
  30. package/dist/factories/clickhouse/index.js +70 -0
  31. package/dist/factories/clickhouse/index.js.map +1 -0
  32. package/dist/factories/clickhouse/resources/helm.d.ts +62 -0
  33. package/dist/factories/clickhouse/resources/helm.d.ts.map +1 -0
  34. package/dist/factories/clickhouse/resources/helm.js +94 -0
  35. package/dist/factories/clickhouse/resources/helm.js.map +1 -0
  36. package/dist/factories/clickhouse/resources/index.d.ts +4 -0
  37. package/dist/factories/clickhouse/resources/index.d.ts.map +1 -0
  38. package/dist/factories/clickhouse/resources/index.js +4 -0
  39. package/dist/factories/clickhouse/resources/index.js.map +1 -0
  40. package/dist/factories/clickhouse/resources/installation.d.ts +83 -0
  41. package/dist/factories/clickhouse/resources/installation.d.ts.map +1 -0
  42. package/dist/factories/clickhouse/resources/installation.js +316 -0
  43. package/dist/factories/clickhouse/resources/installation.js.map +1 -0
  44. package/dist/factories/clickhouse/resources/keeper.d.ts +40 -0
  45. package/dist/factories/clickhouse/resources/keeper.d.ts.map +1 -0
  46. package/dist/factories/clickhouse/resources/keeper.js +107 -0
  47. package/dist/factories/clickhouse/resources/keeper.js.map +1 -0
  48. package/dist/factories/clickhouse/types.d.ts +532 -0
  49. package/dist/factories/clickhouse/types.d.ts.map +1 -0
  50. package/dist/factories/clickhouse/types.js +295 -0
  51. package/dist/factories/clickhouse/types.js.map +1 -0
  52. package/dist/factories/clickhouse/utils/helm-values-mapper.d.ts +65 -0
  53. package/dist/factories/clickhouse/utils/helm-values-mapper.d.ts.map +1 -0
  54. package/dist/factories/clickhouse/utils/helm-values-mapper.js +80 -0
  55. package/dist/factories/clickhouse/utils/helm-values-mapper.js.map +1 -0
  56. package/dist/factories/clickhouse/utils/index.d.ts +4 -0
  57. package/dist/factories/clickhouse/utils/index.d.ts.map +1 -0
  58. package/dist/factories/clickhouse/utils/index.js +4 -0
  59. package/dist/factories/clickhouse/utils/index.js.map +1 -0
  60. package/dist/factories/clickhouse/utils/validation.d.ts +21 -0
  61. package/dist/factories/clickhouse/utils/validation.d.ts.map +1 -0
  62. package/dist/factories/clickhouse/utils/validation.js +27 -0
  63. package/dist/factories/clickhouse/utils/validation.js.map +1 -0
  64. package/dist/factories/clickhouse/utils/zone-layout.d.ts +74 -0
  65. package/dist/factories/clickhouse/utils/zone-layout.d.ts.map +1 -0
  66. package/dist/factories/clickhouse/utils/zone-layout.js +103 -0
  67. package/dist/factories/clickhouse/utils/zone-layout.js.map +1 -0
  68. 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.22.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"