@intentius/chant-lexicon-k8s 0.124.30 → 0.124.32

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 (270) hide show
  1. package/dist/actions/apps.js +18 -0
  2. package/dist/actions/batch.js +6 -0
  3. package/dist/actions/core.js +48 -0
  4. package/dist/actions/index.js +13 -0
  5. package/dist/actions/networking.js +11 -0
  6. package/dist/actions/rbac.js +8 -0
  7. package/dist/api/classify.js +123 -0
  8. package/dist/api/connect.js +62 -0
  9. package/dist/api/fake-cluster.js +175 -0
  10. package/dist/api/operation-surface.d.ts.map +1 -1
  11. package/dist/api/operation-surface.js +109 -0
  12. package/dist/api/owner-chain.js +100 -0
  13. package/dist/api/sweep-types.js +35 -0
  14. package/dist/behaviour-kinds.js +82 -0
  15. package/dist/codegen/docs-cli.js +2 -0
  16. package/dist/codegen/docs.js +146 -0
  17. package/dist/codegen/generate-cli.js +30 -0
  18. package/dist/codegen/generate-lexicon.js +74 -0
  19. package/dist/codegen/generate-list-map-keys.js +88 -0
  20. package/dist/codegen/generate-operations.js +53 -0
  21. package/dist/codegen/generate-typescript.js +124 -0
  22. package/dist/codegen/generate.js +173 -0
  23. package/dist/codegen/naming.js +174 -0
  24. package/dist/codegen/package.js +36 -0
  25. package/dist/codegen/patches.js +88 -0
  26. package/dist/codegen/typecheck.js +4 -0
  27. package/dist/codegen/versions.js +41 -0
  28. package/dist/components/argo-app.js +51 -0
  29. package/dist/components/builders.js +22 -0
  30. package/dist/components/capability-plugin.js +31 -0
  31. package/dist/components/flux-reconcile.js +61 -0
  32. package/dist/components/index.d.ts +1 -1
  33. package/dist/components/index.d.ts.map +1 -1
  34. package/dist/components/index.js +18 -0
  35. package/dist/components/kubectl-apply.d.ts +83 -1
  36. package/dist/components/kubectl-apply.d.ts.map +1 -1
  37. package/dist/components/kubectl-apply.js +274 -0
  38. package/dist/components/kustomize-apply.js +25 -0
  39. package/dist/composites/adot-collector.js +184 -0
  40. package/dist/composites/agic-ingress.js +85 -0
  41. package/dist/composites/aks-external-dns-agent.js +146 -0
  42. package/dist/composites/alb-ingress.js +86 -0
  43. package/dist/composites/argo-app.js +199 -0
  44. package/dist/composites/autoscaled-service.js +174 -0
  45. package/dist/composites/azure-disk-storage-class.js +47 -0
  46. package/dist/composites/azure-file-storage-class.js +48 -0
  47. package/dist/composites/azure-monitor-collector.js +176 -0
  48. package/dist/composites/batch-job.js +139 -0
  49. package/dist/composites/catalog.js +4110 -0
  50. package/dist/composites/cockroachdb-cluster.js +371 -0
  51. package/dist/composites/cockroachdb-region-stack.js +369 -0
  52. package/dist/composites/config-connector-context.js +40 -0
  53. package/dist/composites/configured-app.js +135 -0
  54. package/dist/composites/cron-schedule.js +38 -0
  55. package/dist/composites/cron-workload.js +109 -0
  56. package/dist/composites/ebs-storage-class.js +54 -0
  57. package/dist/composites/efs-storage-class.js +46 -0
  58. package/dist/composites/external-dns-agent.js +122 -0
  59. package/dist/composites/filestore-storage-class.js +49 -0
  60. package/dist/composites/fluent-bit-agent.js +157 -0
  61. package/dist/composites/flux-app.js +156 -0
  62. package/dist/composites/gce-ingress.js +83 -0
  63. package/dist/composites/gce-pd-storage-class.js +49 -0
  64. package/dist/composites/gke-external-dns-agent.js +129 -0
  65. package/dist/composites/gke-fluent-bit-agent.js +165 -0
  66. package/dist/composites/gke-gateway.js +91 -0
  67. package/dist/composites/gke-otel-collector.js +94 -0
  68. package/dist/composites/index.js +51 -0
  69. package/dist/composites/inference-service.js +76 -0
  70. package/dist/composites/irsa-service-account.js +77 -0
  71. package/dist/composites/member-defaults.js +14 -0
  72. package/dist/composites/metrics-server.js +181 -0
  73. package/dist/composites/model.js +92 -0
  74. package/dist/composites/monitored-service.js +152 -0
  75. package/dist/composites/namespace-env.js +114 -0
  76. package/dist/composites/network-isolated-app.js +124 -0
  77. package/dist/composites/node-agent.js +149 -0
  78. package/dist/composites/operator-stack.js +268 -0
  79. package/dist/composites/otel-collector-agent.js +142 -0
  80. package/dist/composites/otel-collector-gateway.js +216 -0
  81. package/dist/composites/otel-collector-node.js +176 -0
  82. package/dist/composites/otel-collector-rbac.js +115 -0
  83. package/dist/composites/otel-collector-shape.js +128 -0
  84. package/dist/composites/otel-collector.js +115 -0
  85. package/dist/composites/otel-operator-collector.js +123 -0
  86. package/dist/composites/ray-cluster.js +378 -0
  87. package/dist/composites/ray-job.js +136 -0
  88. package/dist/composites/ray-service.js +178 -0
  89. package/dist/composites/secure-ingress.js +100 -0
  90. package/dist/composites/security-context.js +1 -0
  91. package/dist/composites/sidecar-app.js +105 -0
  92. package/dist/composites/stateful-app.js +111 -0
  93. package/dist/composites/vllm-serving-runtime.js +114 -0
  94. package/dist/composites/web-app.js +157 -0
  95. package/dist/composites/worker-pool.js +167 -0
  96. package/dist/composites/workload-identity-sa.js +81 -0
  97. package/dist/composites/workload-identity-service-account.js +77 -0
  98. package/dist/config-schema.js +72 -0
  99. package/dist/config.js +59 -0
  100. package/dist/coverage.js +27 -0
  101. package/dist/crd/crd-sources.js +615 -0
  102. package/dist/crd/loader.js +181 -0
  103. package/dist/crd/oci-chart.js +144 -0
  104. package/dist/crd/parser.js +382 -0
  105. package/dist/crd/project-codegen.js +273 -0
  106. package/dist/crd/types.js +7 -0
  107. package/dist/deep-observe-hooks.js +306 -0
  108. package/dist/deep-observe.js +234 -0
  109. package/dist/default-labels.js +87 -0
  110. package/dist/describe-resources.js +699 -0
  111. package/dist/describe-stack-status.js +99 -0
  112. package/dist/detect.js +11 -0
  113. package/dist/effect-receipt-row.js +205 -0
  114. package/dist/export-resources.js +39 -0
  115. package/dist/generated/index.js +1092 -0
  116. package/dist/generated/runtime.js +4 -0
  117. package/dist/group-namespace.js +96 -0
  118. package/dist/import/embedded.js +197 -0
  119. package/dist/import/generator.js +288 -0
  120. package/dist/import/live-export.js +85 -0
  121. package/dist/import/parser.js +204 -0
  122. package/dist/import/testdata/embedded/fixtures.js +60 -0
  123. package/dist/include/entity.js +78 -0
  124. package/dist/include/resolve.js +170 -0
  125. package/dist/index.js +59 -0
  126. package/dist/integrity.json +3 -3
  127. package/dist/kube/apply.js +90 -0
  128. package/dist/kube/connect.js +46 -0
  129. package/dist/kube/delete.js +138 -0
  130. package/dist/kube/describe.js +169 -0
  131. package/dist/kube/events.js +132 -0
  132. package/dist/kube/flags.js +91 -0
  133. package/dist/kube/get.js +159 -0
  134. package/dist/kube/group.js +123 -0
  135. package/dist/kube/logs.js +82 -0
  136. package/dist/kube/project.js +94 -0
  137. package/dist/kube/render.js +227 -0
  138. package/dist/kube/source.js +122 -0
  139. package/dist/kube/target.js +63 -0
  140. package/dist/kube/testing.js +28 -0
  141. package/dist/kube/top.js +99 -0
  142. package/dist/kube/verdict.js +72 -0
  143. package/dist/kube/wait.js +129 -0
  144. package/dist/kustomize/render.js +73 -0
  145. package/dist/kustomize/rendered-entity.js +67 -0
  146. package/dist/kustomize/root.js +68 -0
  147. package/dist/lint/audit-catalog.js +61 -0
  148. package/dist/lint/audit-lineage.js +118 -0
  149. package/dist/lint/post-synth/argo-helpers.js +36 -0
  150. package/dist/lint/post-synth/argo002.js +31 -0
  151. package/dist/lint/post-synth/argo003.js +53 -0
  152. package/dist/lint/post-synth/argo005.js +54 -0
  153. package/dist/lint/post-synth/crd-schema-helpers.d.ts.map +1 -1
  154. package/dist/lint/post-synth/crd-schema-helpers.js +214 -0
  155. package/dist/lint/post-synth/flux002.js +56 -0
  156. package/dist/lint/post-synth/flux003.js +50 -0
  157. package/dist/lint/post-synth/index.js +104 -0
  158. package/dist/lint/post-synth/k8s-helpers.js +186 -0
  159. package/dist/lint/post-synth/monitoring-selection-helpers.js +163 -0
  160. package/dist/lint/post-synth/otel-placement-helpers.js +293 -0
  161. package/dist/lint/post-synth/sops-helpers.js +43 -0
  162. package/dist/lint/post-synth/wk8005.js +44 -0
  163. package/dist/lint/post-synth/wk8006.js +56 -0
  164. package/dist/lint/post-synth/wk8041.js +60 -0
  165. package/dist/lint/post-synth/wk8042.js +36 -0
  166. package/dist/lint/post-synth/wk8101.js +52 -0
  167. package/dist/lint/post-synth/wk8102.js +30 -0
  168. package/dist/lint/post-synth/wk8103.js +33 -0
  169. package/dist/lint/post-synth/wk8104.js +58 -0
  170. package/dist/lint/post-synth/wk8105.js +33 -0
  171. package/dist/lint/post-synth/wk8201.js +44 -0
  172. package/dist/lint/post-synth/wk8202.js +34 -0
  173. package/dist/lint/post-synth/wk8203.js +34 -0
  174. package/dist/lint/post-synth/wk8204.js +71 -0
  175. package/dist/lint/post-synth/wk8205.js +38 -0
  176. package/dist/lint/post-synth/wk8207.js +33 -0
  177. package/dist/lint/post-synth/wk8208.js +33 -0
  178. package/dist/lint/post-synth/wk8209.js +33 -0
  179. package/dist/lint/post-synth/wk8301.js +49 -0
  180. package/dist/lint/post-synth/wk8302.js +34 -0
  181. package/dist/lint/post-synth/wk8303.js +68 -0
  182. package/dist/lint/post-synth/wk8304.js +58 -0
  183. package/dist/lint/post-synth/wk8305.js +96 -0
  184. package/dist/lint/post-synth/wk8306.js +38 -0
  185. package/dist/lint/post-synth/wk8401.js +86 -0
  186. package/dist/lint/post-synth/wk8402.js +31 -0
  187. package/dist/lint/post-synth/wk8403.js +49 -0
  188. package/dist/lint/post-synth/wk8404.js +36 -0
  189. package/dist/lint/post-synth/wk8405.js +65 -0
  190. package/dist/lint/post-synth/wk8406.js +50 -0
  191. package/dist/lint/post-synth/wk8407.js +58 -0
  192. package/dist/lint/post-synth/wk8501.js +36 -0
  193. package/dist/lint/post-synth/wk8502.js +35 -0
  194. package/dist/lint/post-synth/wk8503.js +164 -0
  195. package/dist/lint/post-synth/wk8504.js +20 -0
  196. package/dist/lint/post-synth/wk8505.js +31 -0
  197. package/dist/lint/post-synth/wk8601.js +40 -0
  198. package/dist/lint/post-synth/wk8602.js +120 -0
  199. package/dist/lint/post-synth/wk8603.js +63 -0
  200. package/dist/lint/post-synth/wk8604.js +31 -0
  201. package/dist/lint/post-synth/wk8605.js +124 -0
  202. package/dist/lint/post-synth/wk8606.js +22 -0
  203. package/dist/lint/post-synth/wk8701.js +31 -0
  204. package/dist/lint/post-synth/wk8702.js +37 -0
  205. package/dist/lint/post-synth/wk8703.js +31 -0
  206. package/dist/lint/post-synth/wk8704.js +135 -0
  207. package/dist/lint/post-synth/wk8705.js +38 -0
  208. package/dist/lint/rules/argo-appset-single-project.js +56 -0
  209. package/dist/lint/rules/argo-ast.js +94 -0
  210. package/dist/lint/rules/argo-automated-prune.js +59 -0
  211. package/dist/lint/rules/flux-source-ref-pin.js +44 -0
  212. package/dist/lint/rules/hardcoded-namespace.js +57 -0
  213. package/dist/lint/rules/latest-image-tag.js +103 -0
  214. package/dist/lint/rules/missing-resource-limits.js +85 -0
  215. package/dist/lsp/completions.d.ts.map +1 -1
  216. package/dist/lsp/completions.js +18 -0
  217. package/dist/lsp/hover.d.ts.map +1 -1
  218. package/dist/lsp/hover.js +57 -0
  219. package/dist/manifest-entity.js +71 -0
  220. package/dist/manifest.json +1 -1
  221. package/dist/micro-time.js +49 -0
  222. package/dist/op/activities/apply-diff.d.ts +31 -0
  223. package/dist/op/activities/apply-diff.d.ts.map +1 -0
  224. package/dist/op/activities/apply-diff.js +79 -0
  225. package/dist/op/activities/argo.js +98 -0
  226. package/dist/op/activities/ensure-secret.js +38 -0
  227. package/dist/op/activities/index.js +51 -0
  228. package/dist/op/activities/kubectl.d.ts +64 -0
  229. package/dist/op/activities/kubectl.d.ts.map +1 -1
  230. package/dist/op/activities/kubectl.js +517 -0
  231. package/dist/op/activities/wait-for-ready.js +229 -0
  232. package/dist/op/builders.js +68 -0
  233. package/dist/package-cli.js +21 -0
  234. package/dist/patch/json-patch.js +187 -0
  235. package/dist/patch/rendered-patch.js +94 -0
  236. package/dist/plugin.js +741 -0
  237. package/dist/project-kinds.js +56 -0
  238. package/dist/receipt-store.js +216 -0
  239. package/dist/rules/crd-schema-helpers.ts +2 -1
  240. package/dist/secret-labels.js +33 -0
  241. package/dist/secret-store.js +116 -0
  242. package/dist/serializer.d.ts.map +1 -1
  243. package/dist/serializer.js +578 -0
  244. package/dist/sops/encrypted-secret-file.js +194 -0
  245. package/dist/sops/entity.js +32 -0
  246. package/dist/spec/fetch.js +58 -0
  247. package/dist/spec/parse.js +622 -0
  248. package/dist/subscribe-changes.js +168 -0
  249. package/dist/teardown.js +197 -0
  250. package/dist/telemetry-release.js +86 -0
  251. package/dist/validate-cli.js +17 -0
  252. package/dist/validate.js +47 -0
  253. package/dist/variables.js +34 -0
  254. package/dist/whoami.js +109 -0
  255. package/package.json +12 -12
  256. package/src/api/operation-surface.ts +2 -1
  257. package/src/codegen/package.ts +2 -2
  258. package/src/components/index.ts +3 -0
  259. package/src/components/kubectl-apply-plan.k3d.e2e.test.ts +127 -0
  260. package/src/components/kubectl-apply.test.ts +262 -0
  261. package/src/components/kubectl-apply.ts +341 -12
  262. package/src/deep-observe-hooks.ts +2 -2
  263. package/src/import/roundtrip-build.test.ts +46 -0
  264. package/src/lint/post-synth/crd-schema-helpers.ts +2 -1
  265. package/src/lsp/completions.ts +2 -1
  266. package/src/lsp/hover.ts +2 -1
  267. package/src/op/activities/apply-diff.ts +87 -0
  268. package/src/op/activities/kubectl-plan.test.ts +224 -0
  269. package/src/op/activities/kubectl.ts +204 -16
  270. package/src/serializer.ts +2 -1
@@ -0,0 +1,109 @@
1
+ /**
2
+ * CronWorkload composite — CronJob + ServiceAccount + Role + RoleBinding.
3
+ *
4
+ * A higher-level construct for deploying scheduled workloads with
5
+ * proper RBAC permissions.
6
+ */
7
+ import { Composite, mergeDefaults } from "@intentius/chant";
8
+ import { CronJob, ServiceAccount, Role, RoleBinding } from "../generated/index.js";
9
+ import { validateCronJobSchedule } from "./cron-schedule.js";
10
+ /**
11
+ * Create a CronWorkload composite — returns prop objects for
12
+ * a CronJob, ServiceAccount, Role, and RoleBinding.
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * import { CronWorkload } from "@intentius/chant-lexicon-k8s";
17
+ *
18
+ * const { cronJob, serviceAccount, role, roleBinding } = CronWorkload({
19
+ * name: "db-backup",
20
+ * image: "postgres:16",
21
+ * schedule: "0 2 * * *",
22
+ * command: ["pg_dump", "-h", "postgres", "mydb"],
23
+ * rbacRules: [
24
+ * { apiGroups: [""], resources: ["secrets"], verbs: ["get"] },
25
+ * ],
26
+ * });
27
+ * ```
28
+ */
29
+ export const CronWorkload = Composite((props) => {
30
+ const { name, image, schedule, command, args, rbacRules = [], successfulJobsHistoryLimit = 3, failedJobsHistoryLimit = 1, restartPolicy = "OnFailure", labels: extraLabels = {}, namespace, env, securityContext, defaults: defs, } = props;
31
+ validateCronJobSchedule(`CronWorkload "${name}"`, schedule);
32
+ const saName = `${name}-sa`;
33
+ const roleName = `${name}-role`;
34
+ const bindingName = `${name}-binding`;
35
+ const commonLabels = {
36
+ "app.kubernetes.io/name": name,
37
+ "app.kubernetes.io/managed-by": "chant",
38
+ ...extraLabels,
39
+ };
40
+ const cronJob = new CronJob(mergeDefaults({
41
+ metadata: {
42
+ name,
43
+ ...(namespace && { namespace }),
44
+ labels: { ...commonLabels, "app.kubernetes.io/component": "worker" },
45
+ },
46
+ spec: {
47
+ schedule,
48
+ successfulJobsHistoryLimit,
49
+ failedJobsHistoryLimit,
50
+ jobTemplate: {
51
+ spec: {
52
+ template: {
53
+ spec: {
54
+ serviceAccountName: saName,
55
+ restartPolicy,
56
+ containers: [
57
+ {
58
+ name,
59
+ image,
60
+ ...(command && { command }),
61
+ ...(args && { args }),
62
+ ...(env && { env }),
63
+ ...(securityContext && { securityContext }),
64
+ },
65
+ ],
66
+ },
67
+ },
68
+ },
69
+ },
70
+ },
71
+ }, defs?.cronJob));
72
+ const serviceAccount = new ServiceAccount(mergeDefaults({
73
+ metadata: {
74
+ name: saName,
75
+ ...(namespace && { namespace }),
76
+ labels: { ...commonLabels, "app.kubernetes.io/component": "worker" },
77
+ },
78
+ }, defs?.serviceAccount));
79
+ const role = new Role(mergeDefaults({
80
+ metadata: {
81
+ name: roleName,
82
+ ...(namespace && { namespace }),
83
+ labels: { ...commonLabels, "app.kubernetes.io/component": "rbac" },
84
+ },
85
+ rules: rbacRules.length > 0 ? rbacRules : [
86
+ { apiGroups: [""], resources: ["pods"], verbs: ["get", "list"] },
87
+ ],
88
+ }, defs?.role));
89
+ const roleBinding = new RoleBinding(mergeDefaults({
90
+ metadata: {
91
+ name: bindingName,
92
+ ...(namespace && { namespace }),
93
+ labels: { ...commonLabels, "app.kubernetes.io/component": "rbac" },
94
+ },
95
+ roleRef: {
96
+ apiGroup: "rbac.authorization.k8s.io",
97
+ kind: "Role",
98
+ name: roleName,
99
+ },
100
+ subjects: [
101
+ {
102
+ kind: "ServiceAccount",
103
+ name: saName,
104
+ ...(namespace && { namespace }),
105
+ },
106
+ ],
107
+ }, defs?.roleBinding));
108
+ return { cronJob, serviceAccount, role, roleBinding };
109
+ }, "CronWorkload");
@@ -0,0 +1,54 @@
1
+ /**
2
+ * EbsStorageClass composite — StorageClass for AWS EBS CSI driver.
3
+ *
4
+ * @eks Creates a StorageClass with the `ebs.csi.aws.com` provisioner.
5
+ */
6
+ import { Composite, mergeDefaults } from "@intentius/chant";
7
+ import { StorageClass } from "../generated/index.js";
8
+ /**
9
+ * Create an EbsStorageClass composite — returns prop objects for
10
+ * a StorageClass with the EBS CSI provisioner.
11
+ *
12
+ * @eks
13
+ * @example
14
+ * ```ts
15
+ * import { EbsStorageClass } from "@intentius/chant-lexicon-k8s";
16
+ *
17
+ * const { storageClass } = EbsStorageClass({
18
+ * name: "gp3-encrypted",
19
+ * type: "gp3",
20
+ * encrypted: true,
21
+ * });
22
+ * ```
23
+ */
24
+ export const EbsStorageClass = Composite((props) => {
25
+ const { name, type = "gp3", iops, throughput, encrypted = true, kmsKeyId, fsType = "ext4", reclaimPolicy = "Delete", volumeBindingMode = "WaitForFirstConsumer", allowVolumeExpansion = true, labels: extraLabels = {}, defaults: defs, } = props;
26
+ const commonLabels = {
27
+ "app.kubernetes.io/name": name,
28
+ "app.kubernetes.io/managed-by": "chant",
29
+ ...extraLabels,
30
+ };
31
+ const parameters = {
32
+ type,
33
+ fsType,
34
+ encrypted: String(encrypted),
35
+ };
36
+ if (iops !== undefined)
37
+ parameters.iops = String(iops);
38
+ if (throughput !== undefined)
39
+ parameters.throughput = String(throughput);
40
+ if (kmsKeyId)
41
+ parameters.kmsKeyId = kmsKeyId;
42
+ const storageClass = new StorageClass(mergeDefaults({
43
+ metadata: {
44
+ name,
45
+ labels: { ...commonLabels, "app.kubernetes.io/component": "storage" },
46
+ },
47
+ provisioner: "ebs.csi.aws.com",
48
+ parameters,
49
+ reclaimPolicy,
50
+ volumeBindingMode,
51
+ allowVolumeExpansion,
52
+ }, defs?.storageClass));
53
+ return { storageClass };
54
+ }, "EbsStorageClass");
@@ -0,0 +1,46 @@
1
+ /**
2
+ * EfsStorageClass composite — StorageClass for AWS EFS CSI driver.
3
+ *
4
+ * @eks Creates a StorageClass with the `efs.csi.aws.com` provisioner.
5
+ * EFS provides ReadWriteMany access mode (shared across pods/nodes).
6
+ */
7
+ import { Composite, mergeDefaults } from "@intentius/chant";
8
+ import { StorageClass } from "../generated/index.js";
9
+ /**
10
+ * Create an EfsStorageClass composite — returns prop objects for
11
+ * a StorageClass with the EFS CSI provisioner.
12
+ *
13
+ * @eks
14
+ * @example
15
+ * ```ts
16
+ * import { EfsStorageClass } from "@intentius/chant-lexicon-k8s";
17
+ *
18
+ * const { storageClass } = EfsStorageClass({
19
+ * name: "efs-shared",
20
+ * fileSystemId: "fs-12345678",
21
+ * });
22
+ * ```
23
+ */
24
+ export const EfsStorageClass = Composite((props) => {
25
+ const { name, fileSystemId, directoryPerms = "700", basePath = "/dynamic_provisioning", reclaimPolicy = "Delete", provisioningMode = "efs-ap", labels: extraLabels = {}, defaults: defs, } = props;
26
+ const commonLabels = {
27
+ "app.kubernetes.io/name": name,
28
+ "app.kubernetes.io/managed-by": "chant",
29
+ ...extraLabels,
30
+ };
31
+ const storageClass = new StorageClass(mergeDefaults({
32
+ metadata: {
33
+ name,
34
+ labels: { ...commonLabels, "app.kubernetes.io/component": "storage" },
35
+ },
36
+ provisioner: "efs.csi.aws.com",
37
+ parameters: {
38
+ provisioningMode,
39
+ fileSystemId,
40
+ directoryPerms,
41
+ basePath,
42
+ },
43
+ reclaimPolicy,
44
+ }, defs?.storageClass));
45
+ return { storageClass };
46
+ }, "EfsStorageClass");
@@ -0,0 +1,122 @@
1
+ /**
2
+ * ExternalDnsAgent composite — Deployment + IRSA ServiceAccount + ClusterRole + ClusterRoleBinding.
3
+ *
4
+ * @eks ExternalDNS for Route53 DNS management. Common in production EKS setups
5
+ * where Ingress/Service hostnames should automatically create DNS records.
6
+ */
7
+ import { Composite, mergeDefaults } from "@intentius/chant";
8
+ import { Deployment, ServiceAccount, ClusterRole, ClusterRoleBinding } from "../generated/index.js";
9
+ /**
10
+ * Create an ExternalDnsAgent composite — returns prop objects for
11
+ * a Deployment, ServiceAccount (with IRSA), ClusterRole, and ClusterRoleBinding.
12
+ *
13
+ * @eks
14
+ * @example
15
+ * ```ts
16
+ * import { ExternalDnsAgent } from "@intentius/chant-lexicon-k8s";
17
+ *
18
+ * const { deployment, serviceAccount, clusterRole, clusterRoleBinding } = ExternalDnsAgent({
19
+ * iamRoleArn: "arn:aws:iam::123456789012:role/external-dns-role",
20
+ * domainFilters: ["example.com"],
21
+ * txtOwnerId: "my-cluster",
22
+ * });
23
+ * ```
24
+ */
25
+ export const ExternalDnsAgent = Composite((props) => {
26
+ const { iamRoleArn, domainFilters, provider = "aws", source = "ingress", txtOwnerId, name = "external-dns", image = "registry.k8s.io/external-dns/external-dns:v0.14.0", namespace = "kube-system", labels: extraLabels = {}, defaults: defs, } = props;
27
+ const saName = `${name}-sa`;
28
+ const clusterRoleName = `${name}-role`;
29
+ const bindingName = `${name}-binding`;
30
+ const commonLabels = {
31
+ "app.kubernetes.io/name": name,
32
+ "app.kubernetes.io/managed-by": "chant",
33
+ ...extraLabels,
34
+ };
35
+ // Build args for external-dns
36
+ const args = [
37
+ `--source=${source}`,
38
+ `--provider=${provider}`,
39
+ "--policy=upsert-only",
40
+ "--registry=txt",
41
+ ];
42
+ for (const domain of domainFilters) {
43
+ args.push(`--domain-filter=${domain}`);
44
+ }
45
+ if (txtOwnerId) {
46
+ args.push(`--txt-owner-id=${txtOwnerId}`);
47
+ }
48
+ const deployment = new Deployment(mergeDefaults({
49
+ metadata: {
50
+ name,
51
+ namespace,
52
+ labels: { ...commonLabels, "app.kubernetes.io/component": "dns" },
53
+ },
54
+ spec: {
55
+ replicas: 1,
56
+ selector: { matchLabels: { "app.kubernetes.io/name": name } },
57
+ template: {
58
+ metadata: { labels: { "app.kubernetes.io/name": name, ...extraLabels } },
59
+ spec: {
60
+ serviceAccountName: saName,
61
+ containers: [
62
+ {
63
+ name,
64
+ image,
65
+ args,
66
+ resources: {
67
+ requests: { cpu: "50m", memory: "64Mi" },
68
+ limits: { cpu: "100m", memory: "128Mi" },
69
+ },
70
+ securityContext: {
71
+ runAsNonRoot: true,
72
+ runAsUser: 65534,
73
+ readOnlyRootFilesystem: true,
74
+ allowPrivilegeEscalation: false,
75
+ },
76
+ },
77
+ ],
78
+ },
79
+ },
80
+ },
81
+ }, defs?.deployment));
82
+ const serviceAccount = new ServiceAccount(mergeDefaults({
83
+ metadata: {
84
+ name: saName,
85
+ namespace,
86
+ labels: { ...commonLabels, "app.kubernetes.io/component": "dns" },
87
+ annotations: {
88
+ "eks.amazonaws.com/role-arn": iamRoleArn,
89
+ },
90
+ },
91
+ }, defs?.serviceAccount));
92
+ const clusterRole = new ClusterRole(mergeDefaults({
93
+ metadata: {
94
+ name: clusterRoleName,
95
+ labels: { ...commonLabels, "app.kubernetes.io/component": "rbac" },
96
+ },
97
+ rules: [
98
+ { apiGroups: [""], resources: ["services", "endpoints", "pods"], verbs: ["get", "watch", "list"] },
99
+ { apiGroups: ["extensions", "networking.k8s.io"], resources: ["ingresses"], verbs: ["get", "watch", "list"] },
100
+ { apiGroups: [""], resources: ["nodes"], verbs: ["list", "watch"] },
101
+ ],
102
+ }, defs?.clusterRole));
103
+ const clusterRoleBinding = new ClusterRoleBinding(mergeDefaults({
104
+ metadata: {
105
+ name: bindingName,
106
+ labels: { ...commonLabels, "app.kubernetes.io/component": "rbac" },
107
+ },
108
+ roleRef: {
109
+ apiGroup: "rbac.authorization.k8s.io",
110
+ kind: "ClusterRole",
111
+ name: clusterRoleName,
112
+ },
113
+ subjects: [
114
+ {
115
+ kind: "ServiceAccount",
116
+ name: saName,
117
+ namespace,
118
+ },
119
+ ],
120
+ }, defs?.clusterRoleBinding));
121
+ return { deployment, serviceAccount, clusterRole, clusterRoleBinding };
122
+ }, "ExternalDnsAgent");
@@ -0,0 +1,49 @@
1
+ /**
2
+ * FilestoreStorageClass composite — StorageClass for GCP Filestore CSI driver.
3
+ *
4
+ * @gke Creates a StorageClass with the `filestore.csi.storage.gke.io` provisioner.
5
+ * Filestore provides ReadWriteMany access mode (shared across pods/nodes).
6
+ */
7
+ import { Composite, mergeDefaults } from "@intentius/chant";
8
+ import { StorageClass } from "../generated/index.js";
9
+ /**
10
+ * Create a FilestoreStorageClass composite — returns prop objects for
11
+ * a StorageClass with the GCP Filestore CSI provisioner.
12
+ *
13
+ * @gke
14
+ * @example
15
+ * ```ts
16
+ * import { FilestoreStorageClass } from "@intentius/chant-lexicon-k8s";
17
+ *
18
+ * const { storageClass } = FilestoreStorageClass({
19
+ * name: "filestore-standard",
20
+ * tier: "standard",
21
+ * network: "default",
22
+ * });
23
+ * ```
24
+ */
25
+ export const FilestoreStorageClass = Composite((props) => {
26
+ const { name, tier = "standard", network, reclaimPolicy = "Delete", volumeBindingMode = "WaitForFirstConsumer", labels: extraLabels = {}, defaults: defs, } = props;
27
+ const commonLabels = {
28
+ "app.kubernetes.io/name": name,
29
+ "app.kubernetes.io/managed-by": "chant",
30
+ ...extraLabels,
31
+ };
32
+ const parameters = {
33
+ tier,
34
+ };
35
+ if (network) {
36
+ parameters.network = network;
37
+ }
38
+ const storageClass = new StorageClass(mergeDefaults({
39
+ metadata: {
40
+ name,
41
+ labels: { ...commonLabels, "app.kubernetes.io/component": "storage" },
42
+ },
43
+ provisioner: "filestore.csi.storage.gke.io",
44
+ parameters,
45
+ reclaimPolicy,
46
+ volumeBindingMode,
47
+ }, defs?.storageClass));
48
+ return { storageClass };
49
+ }, "FilestoreStorageClass");
@@ -0,0 +1,157 @@
1
+ /**
2
+ * FluentBitAgent composite — DaemonSet + RBAC + ConfigMap for Fluent Bit.
3
+ *
4
+ * @eks Thin wrapper around the NodeAgent pattern with Fluent Bit defaults
5
+ * (image, RBAC, CloudWatch output config).
6
+ */
7
+ import { Composite, mergeDefaults } from "@intentius/chant";
8
+ import { DaemonSet, ServiceAccount, ClusterRole, ClusterRoleBinding, ConfigMap } from "../generated/index.js";
9
+ /**
10
+ * Create a FluentBitAgent composite — returns prop objects for
11
+ * a DaemonSet, ServiceAccount, ClusterRole, ClusterRoleBinding, and ConfigMap.
12
+ *
13
+ * @eks
14
+ * @example
15
+ * ```ts
16
+ * import { FluentBitAgent } from "@intentius/chant-lexicon-k8s";
17
+ *
18
+ * const { daemonSet, serviceAccount, clusterRole, clusterRoleBinding, configMap } = FluentBitAgent({
19
+ * logGroup: "/aws/eks/my-cluster/containers",
20
+ * region: "us-east-1",
21
+ * clusterName: "my-cluster",
22
+ * });
23
+ * ```
24
+ */
25
+ export const FluentBitAgent = Composite((props) => {
26
+ const { name = "fluent-bit", image = "public.ecr.aws/aws-observability/aws-for-fluent-bit:stable", logGroup, region, clusterName, namespace = "amazon-cloudwatch", labels: extraLabels = {}, cpuRequest = "50m", memoryRequest = "64Mi", cpuLimit = "200m", memoryLimit = "128Mi", iamRoleArn, defaults: defs, } = props;
27
+ const saName = `${name}-sa`;
28
+ const clusterRoleName = `${name}-role`;
29
+ const bindingName = `${name}-binding`;
30
+ const configMapName = `${name}-config`;
31
+ const commonLabels = {
32
+ "app.kubernetes.io/name": name,
33
+ "app.kubernetes.io/managed-by": "chant",
34
+ ...extraLabels,
35
+ };
36
+ const fluentBitConfig = `[SERVICE]
37
+ Flush 5
38
+ Log_Level info
39
+ Daemon off
40
+ Parsers_File parsers.conf
41
+
42
+ [INPUT]
43
+ Name tail
44
+ Tag kube.*
45
+ Path /var/log/containers/*.log
46
+ Parser docker
47
+ DB /var/fluent-bit/state/flb_container.db
48
+ Mem_Buf_Limit 5MB
49
+ Skip_Long_Lines On
50
+ Refresh_Interval 10
51
+
52
+ [FILTER]
53
+ Name kubernetes
54
+ Match kube.*
55
+ Kube_URL https://kubernetes.default.svc:443
56
+ Kube_CA_File /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
57
+ Kube_Token_File /var/run/secrets/kubernetes.io/serviceaccount/token
58
+ Merge_Log On
59
+ K8S-Logging.Parser On
60
+ K8S-Logging.Exclude Off
61
+
62
+ [OUTPUT]
63
+ Name cloudwatch_logs
64
+ Match *
65
+ region ${region}
66
+ log_group_name ${logGroup}
67
+ log_stream_prefix ${clusterName}/
68
+ auto_create_group true
69
+ `;
70
+ const container = {
71
+ name,
72
+ image,
73
+ resources: {
74
+ requests: { cpu: cpuRequest, memory: memoryRequest },
75
+ limits: { cpu: cpuLimit, memory: memoryLimit },
76
+ },
77
+ volumeMounts: [
78
+ { name: "varlog", mountPath: "/var/log", readOnly: true },
79
+ { name: "config", mountPath: `/etc/${name}`, readOnly: true },
80
+ { name: "state", mountPath: "/var/fluent-bit/state" },
81
+ ],
82
+ securityContext: {
83
+ runAsUser: 0,
84
+ readOnlyRootFilesystem: true,
85
+ allowPrivilegeEscalation: false,
86
+ },
87
+ };
88
+ const daemonSet = new DaemonSet(mergeDefaults({
89
+ metadata: {
90
+ name,
91
+ namespace,
92
+ labels: { ...commonLabels, "app.kubernetes.io/component": "agent" },
93
+ },
94
+ spec: {
95
+ selector: { matchLabels: { "app.kubernetes.io/name": name } },
96
+ template: {
97
+ metadata: { labels: { "app.kubernetes.io/name": name, ...extraLabels } },
98
+ spec: {
99
+ serviceAccountName: saName,
100
+ containers: [container],
101
+ volumes: [
102
+ { name: "varlog", hostPath: { path: "/var/log" } },
103
+ { name: "config", configMap: { name: configMapName } },
104
+ { name: "state", hostPath: { path: `/var/fluent-bit/state/${name}` } },
105
+ ],
106
+ tolerations: [{ operator: "Exists" }],
107
+ },
108
+ },
109
+ },
110
+ }, defs?.daemonSet));
111
+ const serviceAccount = new ServiceAccount(mergeDefaults({
112
+ metadata: {
113
+ name: saName,
114
+ namespace,
115
+ labels: { ...commonLabels, "app.kubernetes.io/component": "agent" },
116
+ ...(iamRoleArn ? { annotations: { "eks.amazonaws.com/role-arn": iamRoleArn } } : {}),
117
+ },
118
+ }, defs?.serviceAccount));
119
+ const clusterRole = new ClusterRole(mergeDefaults({
120
+ metadata: {
121
+ name: clusterRoleName,
122
+ labels: { ...commonLabels, "app.kubernetes.io/component": "rbac" },
123
+ },
124
+ rules: [
125
+ { apiGroups: [""], resources: ["namespaces", "pods"], verbs: ["get", "list", "watch"] },
126
+ ],
127
+ }, defs?.clusterRole));
128
+ const clusterRoleBinding = new ClusterRoleBinding(mergeDefaults({
129
+ metadata: {
130
+ name: bindingName,
131
+ labels: { ...commonLabels, "app.kubernetes.io/component": "rbac" },
132
+ },
133
+ roleRef: {
134
+ apiGroup: "rbac.authorization.k8s.io",
135
+ kind: "ClusterRole",
136
+ name: clusterRoleName,
137
+ },
138
+ subjects: [
139
+ {
140
+ kind: "ServiceAccount",
141
+ name: saName,
142
+ namespace,
143
+ },
144
+ ],
145
+ }, defs?.clusterRoleBinding));
146
+ const configMap = new ConfigMap(mergeDefaults({
147
+ metadata: {
148
+ name: configMapName,
149
+ namespace,
150
+ labels: { ...commonLabels, "app.kubernetes.io/component": "config" },
151
+ },
152
+ data: {
153
+ "fluent-bit.conf": fluentBitConfig,
154
+ },
155
+ }, defs?.configMap));
156
+ return { daemonSet, serviceAccount, clusterRole, clusterRoleBinding, configMap };
157
+ }, "FluentBitAgent");