kustodian 1.0.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 (351) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +346 -0
  3. package/dist/cli/bin.d.ts +3 -0
  4. package/dist/cli/bin.d.ts.map +1 -0
  5. package/dist/cli/bin.js +67 -0
  6. package/dist/cli/bin.js.map +1 -0
  7. package/dist/cli/command.d.ts +57 -0
  8. package/dist/cli/command.d.ts.map +1 -0
  9. package/dist/cli/command.js +26 -0
  10. package/dist/cli/command.js.map +1 -0
  11. package/dist/cli/commands/apply.d.ts +8 -0
  12. package/dist/cli/commands/apply.d.ts.map +1 -0
  13. package/dist/cli/commands/apply.js +802 -0
  14. package/dist/cli/commands/apply.js.map +1 -0
  15. package/dist/cli/commands/init.d.ts +5 -0
  16. package/dist/cli/commands/init.d.ts.map +1 -0
  17. package/dist/cli/commands/init.js +403 -0
  18. package/dist/cli/commands/init.js.map +1 -0
  19. package/dist/cli/commands/sources.d.ts +5 -0
  20. package/dist/cli/commands/sources.d.ts.map +1 -0
  21. package/dist/cli/commands/sources.js +377 -0
  22. package/dist/cli/commands/sources.js.map +1 -0
  23. package/dist/cli/commands/update.d.ts +5 -0
  24. package/dist/cli/commands/update.d.ts.map +1 -0
  25. package/dist/cli/commands/update.js +314 -0
  26. package/dist/cli/commands/update.js.map +1 -0
  27. package/dist/cli/commands/validate.d.ts +5 -0
  28. package/dist/cli/commands/validate.d.ts.map +1 -0
  29. package/dist/cli/commands/validate.js +126 -0
  30. package/dist/cli/commands/validate.js.map +1 -0
  31. package/dist/cli/container.d.ts +48 -0
  32. package/dist/cli/container.d.ts.map +1 -0
  33. package/dist/cli/container.js +49 -0
  34. package/dist/cli/container.js.map +1 -0
  35. package/dist/cli/index.d.ts +8 -0
  36. package/dist/cli/index.d.ts.map +1 -0
  37. package/dist/cli/index.js +9 -0
  38. package/dist/cli/index.js.map +1 -0
  39. package/dist/cli/middleware.d.ts +118 -0
  40. package/dist/cli/middleware.d.ts.map +1 -0
  41. package/dist/cli/middleware.js +280 -0
  42. package/dist/cli/middleware.js.map +1 -0
  43. package/dist/cli/runner.d.ts +34 -0
  44. package/dist/cli/runner.d.ts.map +1 -0
  45. package/dist/cli/runner.js +156 -0
  46. package/dist/cli/runner.js.map +1 -0
  47. package/dist/cli/utils/defaults.d.ts +23 -0
  48. package/dist/cli/utils/defaults.d.ts.map +1 -0
  49. package/dist/cli/utils/defaults.js +43 -0
  50. package/dist/cli/utils/defaults.js.map +1 -0
  51. package/dist/core/error.d.ts +117 -0
  52. package/dist/core/error.d.ts.map +1 -0
  53. package/dist/core/error.js +210 -0
  54. package/dist/core/error.js.map +1 -0
  55. package/dist/core/index.d.ts +6 -0
  56. package/dist/core/index.d.ts.map +1 -0
  57. package/dist/core/index.js +6 -0
  58. package/dist/core/index.js.map +1 -0
  59. package/dist/core/logger.d.ts +31 -0
  60. package/dist/core/logger.d.ts.map +1 -0
  61. package/dist/core/logger.js +78 -0
  62. package/dist/core/logger.js.map +1 -0
  63. package/dist/core/path.d.ts +57 -0
  64. package/dist/core/path.d.ts.map +1 -0
  65. package/dist/core/path.js +154 -0
  66. package/dist/core/path.js.map +1 -0
  67. package/dist/core/result.d.ts +80 -0
  68. package/dist/core/result.d.ts.map +1 -0
  69. package/dist/core/result.js +150 -0
  70. package/dist/core/result.js.map +1 -0
  71. package/dist/core/types.d.ts +80 -0
  72. package/dist/core/types.d.ts.map +1 -0
  73. package/dist/core/types.js +5 -0
  74. package/dist/core/types.js.map +1 -0
  75. package/dist/generator/external-substitutions.d.ts +21 -0
  76. package/dist/generator/external-substitutions.d.ts.map +1 -0
  77. package/dist/generator/external-substitutions.js +49 -0
  78. package/dist/generator/external-substitutions.js.map +1 -0
  79. package/dist/generator/flux.d.ts +61 -0
  80. package/dist/generator/flux.d.ts.map +1 -0
  81. package/dist/generator/flux.js +294 -0
  82. package/dist/generator/flux.js.map +1 -0
  83. package/dist/generator/generator.d.ts +77 -0
  84. package/dist/generator/generator.d.ts.map +1 -0
  85. package/dist/generator/generator.js +183 -0
  86. package/dist/generator/generator.js.map +1 -0
  87. package/dist/generator/index.d.ts +9 -0
  88. package/dist/generator/index.d.ts.map +1 -0
  89. package/dist/generator/index.js +9 -0
  90. package/dist/generator/index.js.map +1 -0
  91. package/dist/generator/kustomization-resolution.d.ts +40 -0
  92. package/dist/generator/kustomization-resolution.d.ts.map +1 -0
  93. package/dist/generator/kustomization-resolution.js +59 -0
  94. package/dist/generator/kustomization-resolution.js.map +1 -0
  95. package/dist/generator/namespace.d.ts +74 -0
  96. package/dist/generator/namespace.d.ts.map +1 -0
  97. package/dist/generator/namespace.js +109 -0
  98. package/dist/generator/namespace.js.map +1 -0
  99. package/dist/generator/output.d.ts +56 -0
  100. package/dist/generator/output.d.ts.map +1 -0
  101. package/dist/generator/output.js +171 -0
  102. package/dist/generator/output.js.map +1 -0
  103. package/dist/generator/preservation.d.ts +45 -0
  104. package/dist/generator/preservation.d.ts.map +1 -0
  105. package/dist/generator/preservation.js +71 -0
  106. package/dist/generator/preservation.js.map +1 -0
  107. package/dist/generator/substitution.d.ts +79 -0
  108. package/dist/generator/substitution.d.ts.map +1 -0
  109. package/dist/generator/substitution.js +210 -0
  110. package/dist/generator/substitution.js.map +1 -0
  111. package/dist/generator/types.d.ts +162 -0
  112. package/dist/generator/types.d.ts.map +1 -0
  113. package/dist/generator/types.js +2 -0
  114. package/dist/generator/types.js.map +1 -0
  115. package/dist/generator/validation/cycle-detection.d.ts +25 -0
  116. package/dist/generator/validation/cycle-detection.d.ts.map +1 -0
  117. package/dist/generator/validation/cycle-detection.js +101 -0
  118. package/dist/generator/validation/cycle-detection.js.map +1 -0
  119. package/dist/generator/validation/enablement.d.ts +24 -0
  120. package/dist/generator/validation/enablement.d.ts.map +1 -0
  121. package/dist/generator/validation/enablement.js +69 -0
  122. package/dist/generator/validation/enablement.js.map +1 -0
  123. package/dist/generator/validation/graph.d.ts +29 -0
  124. package/dist/generator/validation/graph.d.ts.map +1 -0
  125. package/dist/generator/validation/graph.js +106 -0
  126. package/dist/generator/validation/graph.js.map +1 -0
  127. package/dist/generator/validation/index.d.ts +38 -0
  128. package/dist/generator/validation/index.d.ts.map +1 -0
  129. package/dist/generator/validation/index.js +64 -0
  130. package/dist/generator/validation/index.js.map +1 -0
  131. package/dist/generator/validation/reference.d.ts +45 -0
  132. package/dist/generator/validation/reference.d.ts.map +1 -0
  133. package/dist/generator/validation/reference.js +143 -0
  134. package/dist/generator/validation/reference.js.map +1 -0
  135. package/dist/generator/validation/requirements.d.ts +25 -0
  136. package/dist/generator/validation/requirements.d.ts.map +1 -0
  137. package/dist/generator/validation/requirements.js +64 -0
  138. package/dist/generator/validation/requirements.js.map +1 -0
  139. package/dist/generator/validation/types.d.ts +116 -0
  140. package/dist/generator/validation/types.d.ts.map +1 -0
  141. package/dist/generator/validation/types.js +13 -0
  142. package/dist/generator/validation/types.js.map +1 -0
  143. package/dist/k8s/exec.d.ts +20 -0
  144. package/dist/k8s/exec.d.ts.map +1 -0
  145. package/dist/k8s/exec.js +47 -0
  146. package/dist/k8s/exec.js.map +1 -0
  147. package/dist/k8s/flux.d.ts +57 -0
  148. package/dist/k8s/flux.d.ts.map +1 -0
  149. package/dist/k8s/flux.js +202 -0
  150. package/dist/k8s/flux.js.map +1 -0
  151. package/dist/k8s/index.d.ts +6 -0
  152. package/dist/k8s/index.d.ts.map +1 -0
  153. package/dist/k8s/index.js +6 -0
  154. package/dist/k8s/index.js.map +1 -0
  155. package/dist/k8s/kubeconfig.d.ts +45 -0
  156. package/dist/k8s/kubeconfig.d.ts.map +1 -0
  157. package/dist/k8s/kubeconfig.js +152 -0
  158. package/dist/k8s/kubeconfig.js.map +1 -0
  159. package/dist/k8s/kubectl.d.ts +68 -0
  160. package/dist/k8s/kubectl.d.ts.map +1 -0
  161. package/dist/k8s/kubectl.js +187 -0
  162. package/dist/k8s/kubectl.js.map +1 -0
  163. package/dist/k8s/types.d.ts +65 -0
  164. package/dist/k8s/types.d.ts.map +1 -0
  165. package/dist/k8s/types.js +2 -0
  166. package/dist/k8s/types.js.map +1 -0
  167. package/dist/loader/file.d.ts +39 -0
  168. package/dist/loader/file.d.ts.map +1 -0
  169. package/dist/loader/file.js +121 -0
  170. package/dist/loader/file.js.map +1 -0
  171. package/dist/loader/index.d.ts +5 -0
  172. package/dist/loader/index.d.ts.map +1 -0
  173. package/dist/loader/index.js +5 -0
  174. package/dist/loader/index.js.map +1 -0
  175. package/dist/loader/profile.d.ts +23 -0
  176. package/dist/loader/profile.d.ts.map +1 -0
  177. package/dist/loader/profile.js +84 -0
  178. package/dist/loader/profile.js.map +1 -0
  179. package/dist/loader/project.d.ts +76 -0
  180. package/dist/loader/project.d.ts.map +1 -0
  181. package/dist/loader/project.js +279 -0
  182. package/dist/loader/project.js.map +1 -0
  183. package/dist/loader/yaml.d.ts +15 -0
  184. package/dist/loader/yaml.d.ts.map +1 -0
  185. package/dist/loader/yaml.js +44 -0
  186. package/dist/loader/yaml.js.map +1 -0
  187. package/dist/nodes/index.d.ts +5 -0
  188. package/dist/nodes/index.d.ts.map +1 -0
  189. package/dist/nodes/index.js +5 -0
  190. package/dist/nodes/index.js.map +1 -0
  191. package/dist/nodes/kubectl-labeler.d.ts +7 -0
  192. package/dist/nodes/kubectl-labeler.d.ts.map +1 -0
  193. package/dist/nodes/kubectl-labeler.js +89 -0
  194. package/dist/nodes/kubectl-labeler.js.map +1 -0
  195. package/dist/nodes/labeler.d.ts +74 -0
  196. package/dist/nodes/labeler.d.ts.map +1 -0
  197. package/dist/nodes/labeler.js +118 -0
  198. package/dist/nodes/labeler.js.map +1 -0
  199. package/dist/nodes/profile.d.ts +58 -0
  200. package/dist/nodes/profile.d.ts.map +1 -0
  201. package/dist/nodes/profile.js +128 -0
  202. package/dist/nodes/profile.js.map +1 -0
  203. package/dist/nodes/types.d.ts +84 -0
  204. package/dist/nodes/types.d.ts.map +1 -0
  205. package/dist/nodes/types.js +77 -0
  206. package/dist/nodes/types.js.map +1 -0
  207. package/dist/plugins/generators.d.ts +49 -0
  208. package/dist/plugins/generators.d.ts.map +1 -0
  209. package/dist/plugins/generators.js +7 -0
  210. package/dist/plugins/generators.js.map +1 -0
  211. package/dist/plugins/hooks.d.ts +120 -0
  212. package/dist/plugins/hooks.d.ts.map +1 -0
  213. package/dist/plugins/hooks.js +41 -0
  214. package/dist/plugins/hooks.js.map +1 -0
  215. package/dist/plugins/index.d.ts +8 -0
  216. package/dist/plugins/index.d.ts.map +1 -0
  217. package/dist/plugins/index.js +15 -0
  218. package/dist/plugins/index.js.map +1 -0
  219. package/dist/plugins/loader.d.ts +40 -0
  220. package/dist/plugins/loader.d.ts.map +1 -0
  221. package/dist/plugins/loader.js +236 -0
  222. package/dist/plugins/loader.js.map +1 -0
  223. package/dist/plugins/object-types.d.ts +71 -0
  224. package/dist/plugins/object-types.d.ts.map +1 -0
  225. package/dist/plugins/object-types.js +65 -0
  226. package/dist/plugins/object-types.js.map +1 -0
  227. package/dist/plugins/registry.d.ts +87 -0
  228. package/dist/plugins/registry.d.ts.map +1 -0
  229. package/dist/plugins/registry.js +158 -0
  230. package/dist/plugins/registry.js.map +1 -0
  231. package/dist/plugins/substitution-providers.d.ts +48 -0
  232. package/dist/plugins/substitution-providers.d.ts.map +1 -0
  233. package/dist/plugins/substitution-providers.js +2 -0
  234. package/dist/plugins/substitution-providers.js.map +1 -0
  235. package/dist/plugins/types.d.ts +288 -0
  236. package/dist/plugins/types.d.ts.map +1 -0
  237. package/dist/plugins/types.js +25 -0
  238. package/dist/plugins/types.js.map +1 -0
  239. package/dist/registry/auth.d.ts +14 -0
  240. package/dist/registry/auth.d.ts.map +1 -0
  241. package/dist/registry/auth.js +40 -0
  242. package/dist/registry/auth.js.map +1 -0
  243. package/dist/registry/client.d.ts +24 -0
  244. package/dist/registry/client.d.ts.map +1 -0
  245. package/dist/registry/client.js +85 -0
  246. package/dist/registry/client.js.map +1 -0
  247. package/dist/registry/dockerhub.d.ts +6 -0
  248. package/dist/registry/dockerhub.d.ts.map +1 -0
  249. package/dist/registry/dockerhub.js +91 -0
  250. package/dist/registry/dockerhub.js.map +1 -0
  251. package/dist/registry/ghcr.d.ts +6 -0
  252. package/dist/registry/ghcr.d.ts.map +1 -0
  253. package/dist/registry/ghcr.js +95 -0
  254. package/dist/registry/ghcr.js.map +1 -0
  255. package/dist/registry/helm.d.ts +11 -0
  256. package/dist/registry/helm.d.ts.map +1 -0
  257. package/dist/registry/helm.js +124 -0
  258. package/dist/registry/helm.js.map +1 -0
  259. package/dist/registry/index.d.ts +8 -0
  260. package/dist/registry/index.d.ts.map +1 -0
  261. package/dist/registry/index.js +12 -0
  262. package/dist/registry/index.js.map +1 -0
  263. package/dist/registry/types.d.ts +55 -0
  264. package/dist/registry/types.d.ts.map +1 -0
  265. package/dist/registry/types.js +2 -0
  266. package/dist/registry/types.js.map +1 -0
  267. package/dist/registry/version.d.ts +22 -0
  268. package/dist/registry/version.d.ts.map +1 -0
  269. package/dist/registry/version.js +62 -0
  270. package/dist/registry/version.js.map +1 -0
  271. package/dist/schema/cluster.d.ts +2890 -0
  272. package/dist/schema/cluster.d.ts.map +1 -0
  273. package/dist/schema/cluster.js +231 -0
  274. package/dist/schema/cluster.js.map +1 -0
  275. package/dist/schema/common.d.ts +1059 -0
  276. package/dist/schema/common.d.ts.map +1 -0
  277. package/dist/schema/common.js +340 -0
  278. package/dist/schema/common.js.map +1 -0
  279. package/dist/schema/index.d.ts +8 -0
  280. package/dist/schema/index.d.ts.map +1 -0
  281. package/dist/schema/index.js +8 -0
  282. package/dist/schema/index.js.map +1 -0
  283. package/dist/schema/node-list.d.ts +361 -0
  284. package/dist/schema/node-list.d.ts.map +1 -0
  285. package/dist/schema/node-list.js +104 -0
  286. package/dist/schema/node-list.js.map +1 -0
  287. package/dist/schema/profile.d.ts +166 -0
  288. package/dist/schema/profile.d.ts.map +1 -0
  289. package/dist/schema/profile.js +61 -0
  290. package/dist/schema/profile.js.map +1 -0
  291. package/dist/schema/project.d.ts +168 -0
  292. package/dist/schema/project.d.ts.map +1 -0
  293. package/dist/schema/project.js +40 -0
  294. package/dist/schema/project.js.map +1 -0
  295. package/dist/schema/sources.d.ts +338 -0
  296. package/dist/schema/sources.d.ts.map +1 -0
  297. package/dist/schema/sources.js +111 -0
  298. package/dist/schema/sources.js.map +1 -0
  299. package/dist/schema/template.d.ts +2711 -0
  300. package/dist/schema/template.d.ts.map +1 -0
  301. package/dist/schema/template.js +97 -0
  302. package/dist/schema/template.js.map +1 -0
  303. package/dist/sources/cache/index.d.ts +9 -0
  304. package/dist/sources/cache/index.d.ts.map +1 -0
  305. package/dist/sources/cache/index.js +278 -0
  306. package/dist/sources/cache/index.js.map +1 -0
  307. package/dist/sources/cache/metadata.d.ts +36 -0
  308. package/dist/sources/cache/metadata.d.ts.map +1 -0
  309. package/dist/sources/cache/metadata.js +21 -0
  310. package/dist/sources/cache/metadata.js.map +1 -0
  311. package/dist/sources/cache/ttl.d.ts +20 -0
  312. package/dist/sources/cache/ttl.d.ts.map +1 -0
  313. package/dist/sources/cache/ttl.js +53 -0
  314. package/dist/sources/cache/ttl.js.map +1 -0
  315. package/dist/sources/fetchers/git.d.ts +6 -0
  316. package/dist/sources/fetchers/git.d.ts.map +1 -0
  317. package/dist/sources/fetchers/git.js +165 -0
  318. package/dist/sources/fetchers/git.js.map +1 -0
  319. package/dist/sources/fetchers/http.d.ts +6 -0
  320. package/dist/sources/fetchers/http.d.ts.map +1 -0
  321. package/dist/sources/fetchers/http.js +159 -0
  322. package/dist/sources/fetchers/http.js.map +1 -0
  323. package/dist/sources/fetchers/index.d.ts +11 -0
  324. package/dist/sources/fetchers/index.d.ts.map +1 -0
  325. package/dist/sources/fetchers/index.js +24 -0
  326. package/dist/sources/fetchers/index.js.map +1 -0
  327. package/dist/sources/fetchers/oci.d.ts +6 -0
  328. package/dist/sources/fetchers/oci.d.ts.map +1 -0
  329. package/dist/sources/fetchers/oci.js +156 -0
  330. package/dist/sources/fetchers/oci.js.map +1 -0
  331. package/dist/sources/fetchers/types.d.ts +25 -0
  332. package/dist/sources/fetchers/types.d.ts.map +1 -0
  333. package/dist/sources/fetchers/types.js +2 -0
  334. package/dist/sources/fetchers/types.js.map +1 -0
  335. package/dist/sources/index.d.ts +6 -0
  336. package/dist/sources/index.d.ts.map +1 -0
  337. package/dist/sources/index.js +10 -0
  338. package/dist/sources/index.js.map +1 -0
  339. package/dist/sources/loader.d.ts +34 -0
  340. package/dist/sources/loader.d.ts.map +1 -0
  341. package/dist/sources/loader.js +89 -0
  342. package/dist/sources/loader.js.map +1 -0
  343. package/dist/sources/resolver.d.ts +17 -0
  344. package/dist/sources/resolver.d.ts.map +1 -0
  345. package/dist/sources/resolver.js +125 -0
  346. package/dist/sources/resolver.js.map +1 -0
  347. package/dist/sources/types.d.ts +151 -0
  348. package/dist/sources/types.d.ts.map +1 -0
  349. package/dist/sources/types.js +2 -0
  350. package/dist/sources/types.js.map +1 -0
  351. package/package.json +101 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yaml.d.ts","sourceRoot":"","sources":["../../src/loader/yaml.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAU,KAAK,UAAU,EAAoB,MAAM,kBAAkB,CAAC;AAE7E;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAShF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC,EAAE,EAAE,kBAAkB,CAAC,CAUxF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAajF"}
@@ -0,0 +1,44 @@
1
+ import { parse, parseAllDocuments, stringify } from 'yaml';
2
+ import { Errors, failure, success } from '../core/index.js';
3
+ /**
4
+ * Parses a YAML string into an object.
5
+ */
6
+ export function parse_yaml(content) {
7
+ try {
8
+ const result = parse(content);
9
+ return success(result);
10
+ }
11
+ catch (error) {
12
+ return failure(Errors.yaml_parse_error(error instanceof Error ? error.message : String(error), error));
13
+ }
14
+ }
15
+ /**
16
+ * Parses a multi-document YAML string (separated by ---) into an array of objects.
17
+ */
18
+ export function parse_multi_yaml(content) {
19
+ try {
20
+ const docs = parseAllDocuments(content);
21
+ const results = docs.map((doc) => doc.toJSON());
22
+ return success(results);
23
+ }
24
+ catch (error) {
25
+ return failure(Errors.yaml_parse_error(error instanceof Error ? error.message : String(error), error));
26
+ }
27
+ }
28
+ /**
29
+ * Converts an object to a YAML string.
30
+ */
31
+ export function stringify_yaml(data) {
32
+ try {
33
+ const result = stringify(data, {
34
+ indent: 2,
35
+ lineWidth: 0,
36
+ singleQuote: false,
37
+ });
38
+ return success(result);
39
+ }
40
+ catch (error) {
41
+ return failure(Errors.parse_error('YAML', error instanceof Error ? error.message : String(error), error));
42
+ }
43
+ }
44
+ //# sourceMappingURL=yaml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yaml.js","sourceRoot":"","sources":["../../src/loader/yaml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAE3D,OAAO,EAAE,MAAM,EAAmB,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE7E;;GAEG;AACH,MAAM,UAAU,UAAU,CAAI,OAAe;IAC3C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAM,CAAC;QACnC,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,OAAO,CACZ,MAAM,CAAC,gBAAgB,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CACvF,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAI,OAAe;IACjD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAO,CAAC,CAAC;QACrD,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,OAAO,CACZ,MAAM,CAAC,gBAAgB,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CACvF,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAI,IAAO;IACvC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE;YAC7B,MAAM,EAAE,CAAC;YACT,SAAS,EAAE,CAAC;YACZ,WAAW,EAAE,KAAK;SACnB,CAAC,CAAC;QACH,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,OAAO,CACZ,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAC1F,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from './kubectl-labeler.js';
2
+ export * from './labeler.js';
3
+ export * from './profile.js';
4
+ export * from './types.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/nodes/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from './kubectl-labeler.js';
2
+ export * from './labeler.js';
3
+ export * from './profile.js';
4
+ export * from './types.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/nodes/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { KubectlClientType } from '../k8s/index.js';
2
+ import { type NodeLabelerType } from './labeler.js';
3
+ /**
4
+ * Creates a node labeler that uses kubectl to manage node labels.
5
+ */
6
+ export declare function create_kubectl_labeler(kubectl: KubectlClientType): NodeLabelerType;
7
+ //# sourceMappingURL=kubectl-labeler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kubectl-labeler.d.ts","sourceRoot":"","sources":["../../src/nodes/kubectl-labeler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,OAAO,EACL,KAAK,eAAe,EAIrB,MAAM,cAAc,CAAC;AAEtB;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,iBAAiB,GAAG,eAAe,CA2GlF"}
@@ -0,0 +1,89 @@
1
+ import { Errors, failure, is_success, success } from '../core/index.js';
2
+ import { calculate_all_label_changes, create_dry_run_result, group_changes_by_node, } from './labeler.js';
3
+ /**
4
+ * Creates a node labeler that uses kubectl to manage node labels.
5
+ */
6
+ export function create_kubectl_labeler(kubectl) {
7
+ return {
8
+ async get_labels(node_name) {
9
+ const get_result = await kubectl.get({ kind: 'Node', name: node_name });
10
+ if (!is_success(get_result)) {
11
+ return get_result;
12
+ }
13
+ const nodes = get_result.value;
14
+ if (nodes.length === 0) {
15
+ return failure(Errors.not_found('Node', node_name));
16
+ }
17
+ const node = nodes[0];
18
+ if (!node) {
19
+ return failure(Errors.not_found('Node', node_name));
20
+ }
21
+ const labels = node.metadata.labels ?? {};
22
+ return success(labels);
23
+ },
24
+ async apply_change(change) {
25
+ if (change.operation === 'remove') {
26
+ const remove_key = `${change.key}-`;
27
+ const label_result = await kubectl.label(change.node, { [remove_key]: '' });
28
+ if (!is_success(label_result)) {
29
+ return failure({
30
+ code: 'KUBECTL_LABEL_ERROR',
31
+ message: `Failed to remove label ${change.key} from node ${change.node}: ${label_result.error.message}`,
32
+ });
33
+ }
34
+ return success(undefined);
35
+ }
36
+ if (!change.value) {
37
+ return failure(Errors.validation_error(`Label change for ${change.key} requires a value for ${change.operation} operation`));
38
+ }
39
+ const label_result = await kubectl.label(change.node, {
40
+ [change.key]: change.value,
41
+ });
42
+ if (!is_success(label_result)) {
43
+ return failure({
44
+ code: 'KUBECTL_LABEL_ERROR',
45
+ message: `Failed to ${change.operation} label ${change.key}=${change.value} on node ${change.node}: ${label_result.error.message}`,
46
+ });
47
+ }
48
+ return success(undefined);
49
+ },
50
+ async sync_labels(node_list, options = {}) {
51
+ const current_labels_by_node = new Map();
52
+ for (const node of node_list.nodes) {
53
+ const labels_result = await this.get_labels(node.name);
54
+ if (!is_success(labels_result)) {
55
+ return failure({
56
+ code: 'KUBECTL_LABEL_ERROR',
57
+ message: `Failed to get labels for node ${node.name}: ${labels_result.error.message}`,
58
+ });
59
+ }
60
+ current_labels_by_node.set(node.name, labels_result.value);
61
+ }
62
+ const changes = calculate_all_label_changes(node_list, current_labels_by_node);
63
+ if (options.dry_run) {
64
+ return success(create_dry_run_result(changes));
65
+ }
66
+ const grouped_changes = group_changes_by_node(changes);
67
+ let applied = 0;
68
+ let failed = 0;
69
+ for (const [node_name, node_changes] of grouped_changes) {
70
+ for (const change of node_changes) {
71
+ const apply_result = await this.apply_change(change);
72
+ if (is_success(apply_result)) {
73
+ applied++;
74
+ }
75
+ else {
76
+ failed++;
77
+ console.warn(` ⚠ Failed to apply change on ${node_name}: ${apply_result.error.message}`);
78
+ }
79
+ }
80
+ }
81
+ return success({
82
+ changes,
83
+ applied,
84
+ skipped: failed,
85
+ });
86
+ },
87
+ };
88
+ }
89
+ //# sourceMappingURL=kubectl-labeler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kubectl-labeler.js","sourceRoot":"","sources":["../../src/nodes/kubectl-labeler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAGxE,OAAO,EAEL,2BAA2B,EAC3B,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,cAAc,CAAC;AAEtB;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAA0B;IAC/D,OAAO;QACL,KAAK,CAAC,UAAU,CAAC,SAAS;YACxB,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YAExE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC5B,OAAO,UAAU,CAAC;YACpB,CAAC;YAED,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC;YAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,OAAO,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;YACtD,CAAC;YAED,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;YACtD,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC;YAE1C,OAAO,OAAO,CAAC,MAAgC,CAAC,CAAC;QACnD,CAAC;QAED,KAAK,CAAC,YAAY,CAAC,MAAM;YACvB,IAAI,MAAM,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;gBAClC,MAAM,UAAU,GAAG,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC;gBACpC,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC5E,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC9B,OAAO,OAAO,CAAC;wBACb,IAAI,EAAE,qBAAqB;wBAC3B,OAAO,EAAE,0BAA0B,MAAM,CAAC,GAAG,cAAc,MAAM,CAAC,IAAI,KAAK,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE;qBACxG,CAAC,CAAC;gBACL,CAAC;gBACD,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC;YAC5B,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBAClB,OAAO,OAAO,CACZ,MAAM,CAAC,gBAAgB,CACrB,oBAAoB,MAAM,CAAC,GAAG,yBAAyB,MAAM,CAAC,SAAS,YAAY,CACpF,CACF,CAAC;YACJ,CAAC;YAED,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE;gBACpD,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,KAAK;aAC3B,CAAC,CAAC;YAEH,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC9B,OAAO,OAAO,CAAC;oBACb,IAAI,EAAE,qBAAqB;oBAC3B,OAAO,EAAE,aAAa,MAAM,CAAC,SAAS,UAAU,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,KAAK,YAAY,MAAM,CAAC,IAAI,KAAK,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE;iBACnI,CAAC,CAAC;YACL,CAAC;YAED,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC;QAC5B,CAAC;QAED,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,GAAG,EAAE;YACvC,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAAkC,CAAC;YAEzE,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;gBACnC,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEvD,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;oBAC/B,OAAO,OAAO,CAAC;wBACb,IAAI,EAAE,qBAAqB;wBAC3B,OAAO,EAAE,iCAAiC,IAAI,CAAC,IAAI,KAAK,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE;qBACtF,CAAC,CAAC;gBACL,CAAC;gBAED,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;YAC7D,CAAC;YAED,MAAM,OAAO,GAAG,2BAA2B,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAAC;YAE/E,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,OAAO,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC;YACjD,CAAC;YAED,MAAM,eAAe,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;YACvD,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,IAAI,MAAM,GAAG,CAAC,CAAC;YAEf,KAAK,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,IAAI,eAAe,EAAE,CAAC;gBACxD,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;oBAClC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;oBAErD,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;wBAC7B,OAAO,EAAE,CAAC;oBACZ,CAAC;yBAAM,CAAC;wBACN,MAAM,EAAE,CAAC;wBACT,OAAO,CAAC,IAAI,CACV,iCAAiC,SAAS,KAAK,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,CAC5E,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO,OAAO,CAAC;gBACb,OAAO;gBACP,OAAO;gBACP,OAAO,EAAE,MAAM;aAChB,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,74 @@
1
+ import type { KustodianErrorType } from '../core/index.js';
2
+ import { type ResultType } from '../core/index.js';
3
+ import { type NodeListType, type NodeType } from './types.js';
4
+ /**
5
+ * Label operation types.
6
+ */
7
+ export type LabelOperationType = 'add' | 'update' | 'remove';
8
+ /**
9
+ * A single label change to be applied.
10
+ */
11
+ export interface LabelChangeType {
12
+ node: string;
13
+ key: string;
14
+ value?: string;
15
+ operation: LabelOperationType;
16
+ }
17
+ /**
18
+ * Options for the label sync operation.
19
+ */
20
+ export interface LabelSyncOptionsType {
21
+ dry_run?: boolean;
22
+ verify?: boolean;
23
+ }
24
+ /**
25
+ * Result of a label sync operation.
26
+ */
27
+ export interface LabelSyncResultType {
28
+ changes: LabelChangeType[];
29
+ applied: number;
30
+ skipped: number;
31
+ }
32
+ /**
33
+ * Calculates the label changes needed for a node.
34
+ */
35
+ export declare function calculate_label_changes(node: NodeType, current_labels: Record<string, string>, prefix: string): LabelChangeType[];
36
+ /**
37
+ * Calculates all label changes for a node list.
38
+ */
39
+ export declare function calculate_all_label_changes(node_list: NodeListType, current_labels_by_node: Map<string, Record<string, string>>): LabelChangeType[];
40
+ /**
41
+ * Formats a label change for display.
42
+ */
43
+ export declare function format_label_change(change: LabelChangeType): string;
44
+ /**
45
+ * Groups label changes by node.
46
+ */
47
+ export declare function group_changes_by_node(changes: LabelChangeType[]): Map<string, LabelChangeType[]>;
48
+ /**
49
+ * Creates a dry-run result from label changes.
50
+ */
51
+ export declare function create_dry_run_result(changes: LabelChangeType[]): LabelSyncResultType;
52
+ /**
53
+ * Node labeler service interface.
54
+ * This is implemented by the actual Kubernetes client.
55
+ */
56
+ export interface NodeLabelerType {
57
+ /**
58
+ * Gets the current labels for a node.
59
+ */
60
+ get_labels(node_name: string): Promise<ResultType<Record<string, string>, KustodianErrorType>>;
61
+ /**
62
+ * Applies a label change to a node.
63
+ */
64
+ apply_change(change: LabelChangeType): Promise<ResultType<void, KustodianErrorType>>;
65
+ /**
66
+ * Syncs labels for all nodes in the list.
67
+ */
68
+ sync_labels(node_list: NodeListType, options?: LabelSyncOptionsType): Promise<ResultType<LabelSyncResultType, KustodianErrorType>>;
69
+ }
70
+ /**
71
+ * Creates a mock labeler for testing.
72
+ */
73
+ export declare function create_mock_labeler(labels_by_node: Map<string, Record<string, string>>): NodeLabelerType;
74
+ //# sourceMappingURL=labeler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labeler.d.ts","sourceRoot":"","sources":["../../src/nodes/labeler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,KAAK,UAAU,EAAW,MAAM,kBAAkB,CAAC;AAE5D,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,QAAQ,EAAsB,MAAM,YAAY,CAAC;AAElF;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,kBAAkB,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,QAAQ,EACd,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACtC,MAAM,EAAE,MAAM,GACb,eAAe,EAAE,CAqCnB;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,YAAY,EACvB,sBAAsB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAC1D,eAAe,EAAE,CAWnB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CASnE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CAUhG;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,mBAAmB,CAMrF;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAE/F;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAErF;;OAEG;IACH,WAAW,CACT,SAAS,EAAE,YAAY,EACvB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,kBAAkB,CAAC,CAAC,CAAC;CACjE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAClD,eAAe,CA6BjB"}
@@ -0,0 +1,118 @@
1
+ import { success } from '../core/index.js';
2
+ import { format_node_labels } from './types.js';
3
+ /**
4
+ * Calculates the label changes needed for a node.
5
+ */
6
+ export function calculate_label_changes(node, current_labels, prefix) {
7
+ const changes = [];
8
+ const desired_labels = format_node_labels(node.labels, prefix);
9
+ // Find labels to add or update
10
+ for (const [key, value] of Object.entries(desired_labels)) {
11
+ const current_value = current_labels[key];
12
+ if (current_value === undefined) {
13
+ changes.push({
14
+ node: node.name,
15
+ key,
16
+ value,
17
+ operation: 'add',
18
+ });
19
+ }
20
+ else if (current_value !== value) {
21
+ changes.push({
22
+ node: node.name,
23
+ key,
24
+ value,
25
+ operation: 'update',
26
+ });
27
+ }
28
+ }
29
+ // Find labels to remove (labels with prefix that aren't in desired)
30
+ for (const key of Object.keys(current_labels)) {
31
+ if (key.startsWith(`${prefix}/`) && !(key in desired_labels)) {
32
+ changes.push({
33
+ node: node.name,
34
+ key,
35
+ operation: 'remove',
36
+ });
37
+ }
38
+ }
39
+ return changes;
40
+ }
41
+ /**
42
+ * Calculates all label changes for a node list.
43
+ */
44
+ export function calculate_all_label_changes(node_list, current_labels_by_node) {
45
+ const prefix = node_list.label_prefix ?? 'kustodian.io';
46
+ const all_changes = [];
47
+ for (const node of node_list.nodes) {
48
+ const current_labels = current_labels_by_node.get(node.name) ?? {};
49
+ const changes = calculate_label_changes(node, current_labels, prefix);
50
+ all_changes.push(...changes);
51
+ }
52
+ return all_changes;
53
+ }
54
+ /**
55
+ * Formats a label change for display.
56
+ */
57
+ export function format_label_change(change) {
58
+ switch (change.operation) {
59
+ case 'add':
60
+ return `[+] ${change.node}: ${change.key}=${change.value}`;
61
+ case 'update':
62
+ return `[~] ${change.node}: ${change.key}=${change.value}`;
63
+ case 'remove':
64
+ return `[-] ${change.node}: ${change.key}`;
65
+ }
66
+ }
67
+ /**
68
+ * Groups label changes by node.
69
+ */
70
+ export function group_changes_by_node(changes) {
71
+ const grouped = new Map();
72
+ for (const change of changes) {
73
+ const node_changes = grouped.get(change.node) ?? [];
74
+ node_changes.push(change);
75
+ grouped.set(change.node, node_changes);
76
+ }
77
+ return grouped;
78
+ }
79
+ /**
80
+ * Creates a dry-run result from label changes.
81
+ */
82
+ export function create_dry_run_result(changes) {
83
+ return {
84
+ changes,
85
+ applied: 0,
86
+ skipped: changes.length,
87
+ };
88
+ }
89
+ /**
90
+ * Creates a mock labeler for testing.
91
+ */
92
+ export function create_mock_labeler(labels_by_node) {
93
+ return {
94
+ async get_labels(node_name) {
95
+ const labels = labels_by_node.get(node_name);
96
+ if (!labels) {
97
+ return success({});
98
+ }
99
+ return success(labels);
100
+ },
101
+ async apply_change(_change) {
102
+ return success(undefined);
103
+ },
104
+ async sync_labels(node_list, options) {
105
+ const changes = calculate_all_label_changes(node_list, labels_by_node);
106
+ if (options?.dry_run) {
107
+ return success(create_dry_run_result(changes));
108
+ }
109
+ // In mock, all changes are "applied"
110
+ return success({
111
+ changes,
112
+ applied: changes.length,
113
+ skipped: 0,
114
+ });
115
+ },
116
+ };
117
+ }
118
+ //# sourceMappingURL=labeler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labeler.js","sourceRoot":"","sources":["../../src/nodes/labeler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import type { NodeType, TaintType } from './types.js';
2
+ /**
3
+ * Node profile type for profile resolution.
4
+ * This mirrors the NodeProfileType from @kustodian/schema but is defined here
5
+ * to avoid circular dependencies.
6
+ */
7
+ export interface NodeProfileType {
8
+ name: string;
9
+ display_name?: string;
10
+ description?: string;
11
+ labels?: Record<string, string | boolean | number>;
12
+ taints?: TaintType[];
13
+ annotations?: Record<string, string>;
14
+ }
15
+ /**
16
+ * Resolved node type with profile values merged.
17
+ * The profile field is removed after resolution.
18
+ */
19
+ export type ResolvedNodeType = Omit<NodeType, 'profile'>;
20
+ /**
21
+ * Resolves a node with its profile configuration.
22
+ * Profile values are merged with node values, where node values take precedence.
23
+ *
24
+ * Merge strategy:
25
+ * - labels: Profile labels are base, node labels override/extend
26
+ * - taints: Node taints override profile taints with same key+effect, others are combined
27
+ * - annotations: Profile annotations are base, node annotations override/extend
28
+ * - ssh: Not inherited from profile (kept as node-specific)
29
+ *
30
+ * @param node - The node to resolve
31
+ * @param profile - The profile to apply, or undefined if no profile
32
+ * @returns The resolved node with profile values merged
33
+ */
34
+ export declare function resolve_node_profile(node: NodeType, profile: NodeProfileType | undefined): ResolvedNodeType;
35
+ /**
36
+ * Resolves all nodes in a list with their profiles.
37
+ *
38
+ * @param nodes - The nodes to resolve
39
+ * @param profiles - Map of profile name to profile
40
+ * @returns Object with resolved nodes and any missing profile errors
41
+ */
42
+ export declare function resolve_all_node_profiles(nodes: NodeType[], profiles: Map<string, NodeProfileType>): {
43
+ resolved: ResolvedNodeType[];
44
+ errors: string[];
45
+ };
46
+ /**
47
+ * Collects all unique profile names referenced by nodes.
48
+ */
49
+ export declare function get_referenced_profiles(nodes: NodeType[]): Set<string>;
50
+ /**
51
+ * Validates that all referenced profiles exist.
52
+ *
53
+ * @param nodes - The nodes to check
54
+ * @param profiles - Map of available profiles
55
+ * @returns Array of error messages for missing profiles
56
+ */
57
+ export declare function validate_profile_references(nodes: NodeType[], profiles: Map<string, NodeProfileType>): string[];
58
+ //# sourceMappingURL=profile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../src/nodes/profile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEtD;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC,CAAC;IACnD,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAED;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AAkCzD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,QAAQ,EACd,OAAO,EAAE,eAAe,GAAG,SAAS,GACnC,gBAAgB,CAwClB;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,QAAQ,EAAE,EACjB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,GACrC;IAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAqBpD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAQtE;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,QAAQ,EAAE,EACjB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,GACrC,MAAM,EAAE,CAcV"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Merges taints from profile and node.
3
+ * Node taints are appended after profile taints.
4
+ * Duplicate taints (same key+effect) from node override profile taints.
5
+ */
6
+ function merge_taints(profile_taints, node_taints) {
7
+ if (!profile_taints && !node_taints) {
8
+ return undefined;
9
+ }
10
+ if (!profile_taints) {
11
+ return node_taints;
12
+ }
13
+ if (!node_taints) {
14
+ return profile_taints;
15
+ }
16
+ // Create a map of node taints keyed by key+effect for deduplication
17
+ const node_taint_keys = new Set(node_taints.map((t) => `${t.key}:${t.effect}`));
18
+ // Filter out profile taints that are overridden by node taints
19
+ const filtered_profile_taints = profile_taints.filter((t) => !node_taint_keys.has(`${t.key}:${t.effect}`));
20
+ return [...filtered_profile_taints, ...node_taints];
21
+ }
22
+ /**
23
+ * Resolves a node with its profile configuration.
24
+ * Profile values are merged with node values, where node values take precedence.
25
+ *
26
+ * Merge strategy:
27
+ * - labels: Profile labels are base, node labels override/extend
28
+ * - taints: Node taints override profile taints with same key+effect, others are combined
29
+ * - annotations: Profile annotations are base, node annotations override/extend
30
+ * - ssh: Not inherited from profile (kept as node-specific)
31
+ *
32
+ * @param node - The node to resolve
33
+ * @param profile - The profile to apply, or undefined if no profile
34
+ * @returns The resolved node with profile values merged
35
+ */
36
+ export function resolve_node_profile(node, profile) {
37
+ if (!profile) {
38
+ // No profile to apply, return node without profile field
39
+ const { profile: _, ...resolved } = node;
40
+ return resolved;
41
+ }
42
+ // Merge labels: profile as base, node overrides
43
+ const merged_labels = profile.labels || node.labels ? { ...profile.labels, ...node.labels } : undefined;
44
+ // Merge taints: deduplicate by key+effect, node wins
45
+ const merged_taints = merge_taints(profile.taints, node.taints);
46
+ // Merge annotations: profile as base, node overrides
47
+ const merged_annotations = profile.annotations || node.annotations
48
+ ? { ...profile.annotations, ...node.annotations }
49
+ : undefined;
50
+ const resolved = {
51
+ name: node.name,
52
+ role: node.role,
53
+ address: node.address,
54
+ };
55
+ if (node.ssh !== undefined) {
56
+ resolved.ssh = node.ssh;
57
+ }
58
+ if (merged_labels !== undefined) {
59
+ resolved.labels = merged_labels;
60
+ }
61
+ if (merged_taints !== undefined) {
62
+ resolved.taints = merged_taints;
63
+ }
64
+ if (merged_annotations !== undefined) {
65
+ resolved.annotations = merged_annotations;
66
+ }
67
+ return resolved;
68
+ }
69
+ /**
70
+ * Resolves all nodes in a list with their profiles.
71
+ *
72
+ * @param nodes - The nodes to resolve
73
+ * @param profiles - Map of profile name to profile
74
+ * @returns Object with resolved nodes and any missing profile errors
75
+ */
76
+ export function resolve_all_node_profiles(nodes, profiles) {
77
+ const resolved = [];
78
+ const errors = [];
79
+ for (const node of nodes) {
80
+ if (node.profile) {
81
+ const profile = profiles.get(node.profile);
82
+ if (!profile) {
83
+ errors.push(`Node '${node.name}' references unknown profile '${node.profile}'`);
84
+ // Still resolve the node without the profile
85
+ const { profile: _, ...node_without_profile } = node;
86
+ resolved.push(node_without_profile);
87
+ }
88
+ else {
89
+ resolved.push(resolve_node_profile(node, profile));
90
+ }
91
+ }
92
+ else {
93
+ resolved.push(resolve_node_profile(node, undefined));
94
+ }
95
+ }
96
+ return { resolved, errors };
97
+ }
98
+ /**
99
+ * Collects all unique profile names referenced by nodes.
100
+ */
101
+ export function get_referenced_profiles(nodes) {
102
+ const profiles = new Set();
103
+ for (const node of nodes) {
104
+ if (node.profile) {
105
+ profiles.add(node.profile);
106
+ }
107
+ }
108
+ return profiles;
109
+ }
110
+ /**
111
+ * Validates that all referenced profiles exist.
112
+ *
113
+ * @param nodes - The nodes to check
114
+ * @param profiles - Map of available profiles
115
+ * @returns Array of error messages for missing profiles
116
+ */
117
+ export function validate_profile_references(nodes, profiles) {
118
+ const errors = [];
119
+ const referenced = get_referenced_profiles(nodes);
120
+ for (const profile_name of referenced) {
121
+ if (!profiles.has(profile_name)) {
122
+ const nodes_using = nodes.filter((n) => n.profile === profile_name).map((n) => n.name);
123
+ errors.push(`Profile '${profile_name}' not found, referenced by nodes: ${nodes_using.join(', ')}`);
124
+ }
125
+ }
126
+ return errors;
127
+ }
128
+ //# sourceMappingURL=profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/nodes/profile.ts"],"names":[],"mappings":"AAsBA;;;;GAIG;AACH,SAAS,YAAY,CACnB,cAAuC,EACvC,WAAoC;IAEpC,IAAI,CAAC,cAAc,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,oEAAoE;IACpE,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAEhF,+DAA+D;IAC/D,MAAM,uBAAuB,GAAG,cAAc,CAAC,MAAM,CACnD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CACpD,CAAC;IAEF,OAAO,CAAC,GAAG,uBAAuB,EAAE,GAAG,WAAW,CAAC,CAAC;AACtD,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAc,EACd,OAAoC;IAEpC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,yDAAyD;QACzD,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,QAAQ,EAAE,GAAG,IAAI,CAAC;QACzC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,gDAAgD;IAChD,MAAM,aAAa,GACjB,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAEpF,qDAAqD;IACrD,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAEhE,qDAAqD;IACrD,MAAM,kBAAkB,GACtB,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW;QACrC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE;QACjD,CAAC,CAAC,SAAS,CAAC;IAEhB,MAAM,QAAQ,GAAqB;QACjC,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC;IAEF,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC3B,QAAQ,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;IAC1B,CAAC;IACD,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,QAAQ,CAAC,MAAM,GAAG,aAAa,CAAC;IAClC,CAAC;IACD,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,QAAQ,CAAC,MAAM,GAAG,aAAa,CAAC;IAClC,CAAC;IACD,IAAI,kBAAkB,KAAK,SAAS,EAAE,CAAC;QACrC,QAAQ,CAAC,WAAW,GAAG,kBAAkB,CAAC;IAC5C,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,yBAAyB,CACvC,KAAiB,EACjB,QAAsC;IAEtC,MAAM,QAAQ,GAAuB,EAAE,CAAC;IACxC,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,iCAAiC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;gBAChF,6CAA6C;gBAC7C,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,oBAAoB,EAAE,GAAG,IAAI,CAAC;gBACrD,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACtC,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAiB;IACvD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,2BAA2B,CACzC,KAAiB,EACjB,QAAsC;IAEtC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,UAAU,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAElD,KAAK,MAAM,YAAY,IAAI,UAAU,EAAE,CAAC;QACtC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;YAChC,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACvF,MAAM,CAAC,IAAI,CACT,YAAY,YAAY,qCAAqC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACtF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}