timonel 2.2.0 → 2.3.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.
@@ -1,136 +1,327 @@
1
+ /**
2
+ * @fileoverview Rutter - Main class for building Kubernetes manifests and Helm charts
3
+ * @since 1.0.0
4
+ */
1
5
  import { ApiObject } from 'cdk8s';
2
6
  import type { HelmChartMeta, HelperDefinition } from './HelmChartWriter.js';
7
+ /**
8
+ * HTTP header for health probes
9
+ *
10
+ * @interface HttpHeader
11
+ * @since 0.1.0
12
+ */
3
13
  export interface HttpHeader {
14
+ /** Header name */
4
15
  name: string;
16
+ /** Header value */
5
17
  value: string;
6
18
  }
19
+ /**
20
+ * HTTP GET action for health probes
21
+ *
22
+ * @interface HttpGetAction
23
+ * @since 0.1.0
24
+ */
7
25
  export interface HttpGetAction {
26
+ /** HTTP path to probe */
8
27
  path?: string;
28
+ /** Port number or name */
9
29
  port: number | string;
30
+ /** HTTP or HTTPS scheme */
10
31
  scheme?: 'HTTP' | 'HTTPS';
32
+ /** Additional HTTP headers */
11
33
  httpHeaders?: HttpHeader[];
12
34
  }
35
+ /**
36
+ * Exec action for health probes
37
+ *
38
+ * @interface ExecAction
39
+ * @since 0.1.0
40
+ */
13
41
  export interface ExecAction {
42
+ /** Command to execute */
14
43
  command: string[];
15
44
  }
45
+ /**
46
+ * TCP socket action for health probes
47
+ *
48
+ * @interface TcpSocketAction
49
+ * @since 0.1.0
50
+ */
16
51
  export interface TcpSocketAction {
52
+ /** Port number or name */
17
53
  port: number | string;
18
54
  }
55
+ /**
56
+ * Kubernetes probe configuration
57
+ *
58
+ * @interface Probe
59
+ * @since 0.1.0
60
+ */
19
61
  export interface Probe {
62
+ /** HTTP GET probe */
20
63
  httpGet?: HttpGetAction;
64
+ /** Exec probe */
21
65
  exec?: ExecAction;
66
+ /** TCP socket probe */
22
67
  tcpSocket?: TcpSocketAction;
68
+ /** Initial delay before probing */
23
69
  initialDelaySeconds?: number;
70
+ /** Probe frequency */
24
71
  periodSeconds?: number;
72
+ /** Probe timeout */
25
73
  timeoutSeconds?: number;
74
+ /** Success threshold */
26
75
  successThreshold?: number;
76
+ /** Failure threshold */
27
77
  failureThreshold?: number;
28
78
  }
79
+ /**
80
+ * Environment variable source from ConfigMap or Secret
81
+ *
82
+ * @interface EnvFromSource
83
+ * @since 0.1.0
84
+ */
29
85
  export interface EnvFromSource {
86
+ /** ConfigMap reference */
30
87
  configMapRef?: string;
88
+ /** Secret reference */
31
89
  secretRef?: string;
32
90
  }
91
+ /**
92
+ * Volume source specification
93
+ *
94
+ * @interface VolumeSourceSpec
95
+ * @since 0.1.0
96
+ */
33
97
  export interface VolumeSourceSpec {
98
+ /** Volume name */
34
99
  name: string;
100
+ /** ConfigMap volume source */
35
101
  configMap?: string;
102
+ /** Secret volume source */
36
103
  secret?: string;
104
+ /** PersistentVolumeClaim source */
37
105
  persistentVolumeClaim?: string;
38
106
  }
107
+ /**
108
+ * Volume mount specification
109
+ *
110
+ * @interface VolumeMountSpec
111
+ * @since 0.1.0
112
+ */
39
113
  export interface VolumeMountSpec {
114
+ /** Volume name to mount */
40
115
  name: string;
116
+ /** Mount path in container */
41
117
  mountPath: string;
118
+ /** Mount as read-only */
42
119
  readOnly?: boolean;
120
+ /** Sub-path within volume */
43
121
  subPath?: string;
44
122
  }
123
+ /**
124
+ * Kubernetes resource requirements
125
+ *
126
+ * @interface ResourceRequirements
127
+ * @since 0.1.0
128
+ */
45
129
  export interface ResourceRequirements {
130
+ /** Resource limits */
46
131
  limits?: {
47
132
  cpu?: string;
48
133
  memory?: string;
49
134
  };
135
+ /** Resource requests */
50
136
  requests?: {
51
137
  cpu?: string;
52
138
  memory?: string;
53
139
  };
54
140
  }
141
+ /**
142
+ * Kubernetes PersistentVolume access modes
143
+ *
144
+ * @typedef {string} AccessMode
145
+ * @since 1.0.0
146
+ */
55
147
  export type AccessMode = 'ReadWriteOnce' | 'ReadOnlyMany' | 'ReadWriteMany' | 'ReadWriteOncePod';
148
+ /**
149
+ * Kubernetes volume modes
150
+ *
151
+ * @typedef {string} VolumeMode
152
+ * @since 1.0.0
153
+ */
56
154
  export type VolumeMode = 'Filesystem' | 'Block';
155
+ /**
156
+ * Kubernetes PersistentVolume reclaim policies
157
+ *
158
+ * @typedef {string} ReclaimPolicy
159
+ * @since 1.0.0
160
+ */
57
161
  export type ReclaimPolicy = 'Retain' | 'Recycle' | 'Delete';
162
+ /**
163
+ * CSI volume source specification
164
+ *
165
+ * @interface CsiVolumeSource
166
+ * @since 1.0.0
167
+ */
58
168
  export interface CsiVolumeSource {
169
+ /** CSI driver name */
59
170
  driver: string;
171
+ /** Volume handle */
60
172
  volumeHandle: string;
173
+ /** Filesystem type */
61
174
  fsType?: string;
175
+ /** Read-only volume */
62
176
  readOnly?: boolean;
177
+ /** Volume attributes */
63
178
  volumeAttributes?: Record<string, string>;
179
+ /** Controller publish secret reference */
64
180
  controllerPublishSecretRef?: {
65
181
  name: string;
66
182
  namespace?: string;
67
183
  };
184
+ /** Node stage secret reference */
68
185
  nodeStageSecretRef?: {
69
186
  name: string;
70
187
  namespace?: string;
71
188
  };
189
+ /** Node publish secret reference */
72
190
  nodePublishSecretRef?: {
73
191
  name: string;
74
192
  namespace?: string;
75
193
  };
194
+ /** Controller expand secret reference */
76
195
  controllerExpandSecretRef?: {
77
196
  name: string;
78
197
  namespace?: string;
79
198
  };
80
199
  }
200
+ /**
201
+ * NFS volume source specification
202
+ *
203
+ * @interface NfsVolumeSource
204
+ * @since 1.0.0
205
+ */
81
206
  export interface NfsVolumeSource {
207
+ /** NFS server */
82
208
  server: string;
209
+ /** NFS path */
83
210
  path: string;
211
+ /** Read-only mount */
84
212
  readOnly?: boolean;
85
213
  }
214
+ /**
215
+ * AWS Elastic Block Store volume source
216
+ *
217
+ * @interface AwsElasticBlockStoreSource
218
+ * @since 1.0.0
219
+ */
86
220
  export interface AwsElasticBlockStoreSource {
221
+ /** EBS volume ID */
87
222
  volumeID: string;
223
+ /** Filesystem type */
88
224
  fsType?: string;
225
+ /** Partition number */
89
226
  partition?: number;
227
+ /** Read-only volume */
90
228
  readOnly?: boolean;
91
229
  }
230
+ /**
231
+ * Host path volume source
232
+ *
233
+ * @interface HostPathSource
234
+ * @since 1.0.0
235
+ */
92
236
  export interface HostPathSource {
237
+ /** Host path */
93
238
  path: string;
239
+ /** Path type */
94
240
  type?: string;
95
241
  }
242
+ /**
243
+ * PersistentVolume source specification
244
+ *
245
+ * @interface PersistentVolumeSourceSpec
246
+ * @since 1.0.0
247
+ */
96
248
  export interface PersistentVolumeSourceSpec {
249
+ /** CSI volume source */
97
250
  csi?: CsiVolumeSource;
251
+ /** NFS volume source */
98
252
  nfs?: NfsVolumeSource;
253
+ /** AWS EBS volume source */
99
254
  awsElasticBlockStore?: AwsElasticBlockStoreSource;
255
+ /** Host path volume source */
100
256
  hostPath?: HostPathSource;
257
+ /** Azure Disk volume source */
101
258
  azureDisk?: {
259
+ /** Disk name */
102
260
  diskName: string;
261
+ /** Disk URI */
103
262
  diskURI: string;
263
+ /** Caching mode */
104
264
  cachingMode?: 'None' | 'ReadOnly' | 'ReadWrite';
265
+ /** Filesystem type */
105
266
  fsType?: string;
267
+ /** Read-only disk */
106
268
  readOnly?: boolean;
269
+ /** Disk kind */
107
270
  kind?: 'Shared' | 'Dedicated' | 'Managed';
108
271
  };
272
+ /** Azure File volume source */
109
273
  azureFile?: {
274
+ /** Secret name */
110
275
  secretName: string;
276
+ /** Share name */
111
277
  shareName: string;
278
+ /** Read-only file */
112
279
  readOnly?: boolean;
280
+ /** Secret namespace */
113
281
  secretNamespace?: string;
114
282
  };
283
+ /** GCE Persistent Disk volume source */
115
284
  gcePersistentDisk?: {
285
+ /** Persistent disk name */
116
286
  pdName: string;
287
+ /** Filesystem type */
117
288
  fsType?: string;
289
+ /** Partition number */
118
290
  partition?: number;
291
+ /** Read-only disk */
119
292
  readOnly?: boolean;
120
293
  };
294
+ /** Custom volume sources */
121
295
  [key: string]: unknown;
122
296
  }
297
+ /**
298
+ * Kubernetes PersistentVolume specification
299
+ *
300
+ * @interface PersistentVolumeSpec
301
+ * @since 1.0.0
302
+ */
123
303
  export interface PersistentVolumeSpec {
304
+ /** PersistentVolume name */
124
305
  name: string;
306
+ /** Storage capacity (e.g., '10Gi') */
125
307
  capacity: string;
308
+ /** Access modes */
126
309
  accessModes: AccessMode[];
310
+ /** Storage class name */
127
311
  storageClassName?: string;
312
+ /** Volume mode */
128
313
  volumeMode?: VolumeMode;
314
+ /** Reclaim policy */
129
315
  reclaimPolicy?: ReclaimPolicy;
316
+ /** Mount options */
130
317
  mountOptions?: string[];
318
+ /** Node affinity */
131
319
  nodeAffinity?: Record<string, unknown>;
320
+ /** PersistentVolume labels */
132
321
  labels?: Record<string, string>;
322
+ /** PersistentVolume annotations */
133
323
  annotations?: Record<string, string>;
324
+ /** Volume source */
134
325
  source: PersistentVolumeSourceSpec;
135
326
  /** Reference to related PVC for binding */
136
327
  claimRef?: {
@@ -140,147 +331,301 @@ export interface PersistentVolumeSpec {
140
331
  /** Cloud provider for optimized defaults */
141
332
  cloudProvider?: 'aws' | 'azure' | 'gcp';
142
333
  }
334
+ /**
335
+ * Kubernetes Deployment specification
336
+ *
337
+ * @interface DeploymentSpec
338
+ * @since 0.1.0
339
+ *
340
+ * @example
341
+ * ```typescript
342
+ * const deployment: DeploymentSpec = {
343
+ * name: 'web-app',
344
+ * image: 'nginx:1.21',
345
+ * replicas: 3,
346
+ * containerPort: 80,
347
+ * env: { NODE_ENV: 'production' }
348
+ * };
349
+ * ```
350
+ */
143
351
  export interface DeploymentSpec {
352
+ /** Deployment name */
144
353
  name: string;
354
+ /** Container image */
145
355
  image: string;
356
+ /** Number of replicas */
146
357
  replicas?: number;
358
+ /** Container port */
147
359
  containerPort?: number;
360
+ /** Environment variables */
148
361
  env?: Record<string, string>;
362
+ /** Environment from ConfigMap/Secret */
149
363
  envFrom?: EnvFromSource[];
364
+ /** Volume sources */
150
365
  volumes?: VolumeSourceSpec[];
366
+ /** Volume mounts */
151
367
  volumeMounts?: VolumeMountSpec[];
368
+ /** Resource requirements */
152
369
  resources?: ResourceRequirements;
370
+ /** Liveness probe */
153
371
  livenessProbe?: Probe;
372
+ /** Readiness probe */
154
373
  readinessProbe?: Probe;
374
+ /** Image pull policy */
155
375
  imagePullPolicy?: 'Always' | 'IfNotPresent' | 'Never';
376
+ /** Service account name */
156
377
  serviceAccountName?: string;
378
+ /** Pod selector labels */
157
379
  matchLabels?: Record<string, string>;
158
- /** Optional extra labels on the Deployment metadata */
380
+ /** Deployment metadata labels */
159
381
  labels?: Record<string, string>;
160
- /** Optional annotations on the Deployment metadata */
382
+ /** Deployment metadata annotations */
161
383
  annotations?: Record<string, string>;
162
- /** Optional extra labels on the pod template (merged with matchLabels) */
384
+ /** Pod template labels */
163
385
  podLabels?: Record<string, string>;
164
- /** Optional annotations on the pod template (useful for reloaders, etc.) */
386
+ /** Pod template annotations */
165
387
  podAnnotations?: Record<string, string>;
166
388
  }
389
+ /**
390
+ * Kubernetes ReplicaSet specification
391
+ *
392
+ * @interface ReplicaSetSpec
393
+ * @since 1.0.0
394
+ */
167
395
  export interface ReplicaSetSpec {
396
+ /** ReplicaSet name */
168
397
  name: string;
398
+ /** Container image */
169
399
  image: string;
400
+ /** Number of replicas */
170
401
  replicas?: number;
402
+ /** Container port */
171
403
  containerPort?: number;
404
+ /** Environment variables */
172
405
  env?: Record<string, string>;
406
+ /** Environment from ConfigMap/Secret */
173
407
  envFrom?: EnvFromSource[];
408
+ /** Volume sources */
174
409
  volumes?: VolumeSourceSpec[];
410
+ /** Volume mounts */
175
411
  volumeMounts?: VolumeMountSpec[];
412
+ /** Resource requirements */
176
413
  resources?: ResourceRequirements;
414
+ /** Liveness probe */
177
415
  livenessProbe?: Probe;
416
+ /** Readiness probe */
178
417
  readinessProbe?: Probe;
418
+ /** Image pull policy */
179
419
  imagePullPolicy?: 'Always' | 'IfNotPresent' | 'Never';
420
+ /** Service account name */
180
421
  serviceAccountName?: string;
422
+ /** Pod selector labels */
181
423
  matchLabels?: Record<string, string>;
182
- /** Optional extra labels on the ReplicaSet metadata */
424
+ /** ReplicaSet metadata labels */
183
425
  labels?: Record<string, string>;
184
- /** Optional annotations on the ReplicaSet metadata */
426
+ /** ReplicaSet metadata annotations */
185
427
  annotations?: Record<string, string>;
186
- /** Optional extra labels on the pod template (merged with matchLabels) */
428
+ /** Pod template labels */
187
429
  podLabels?: Record<string, string>;
188
- /** Optional annotations on the pod template (useful for reloaders, etc.) */
430
+ /** Pod template annotations */
189
431
  podAnnotations?: Record<string, string>;
190
432
  }
433
+ /**
434
+ * Kubernetes Job specification
435
+ *
436
+ * @interface JobSpec
437
+ * @since 2.1.0
438
+ */
191
439
  export interface JobSpec {
440
+ /** Job name */
192
441
  name: string;
442
+ /** Container image */
193
443
  image: string;
444
+ /** Command to run */
194
445
  command?: string[];
446
+ /** Arguments to command */
195
447
  args?: string[];
448
+ /** Environment variables */
196
449
  env?: Record<string, string>;
450
+ /** Environment from ConfigMap/Secret */
197
451
  envFrom?: EnvFromSource[];
452
+ /** Volume sources */
198
453
  volumes?: VolumeSourceSpec[];
454
+ /** Volume mounts */
199
455
  volumeMounts?: VolumeMountSpec[];
456
+ /** Resource requirements */
200
457
  resources?: ResourceRequirements;
458
+ /** Restart policy */
201
459
  restartPolicy?: 'Never' | 'OnFailure';
460
+ /** Backoff limit for retries */
202
461
  backoffLimit?: number;
462
+ /** Active deadline in seconds */
203
463
  activeDeadlineSeconds?: number;
464
+ /** TTL after finished in seconds */
204
465
  ttlSecondsAfterFinished?: number;
466
+ /** Number of completions */
205
467
  completions?: number;
468
+ /** Parallelism level */
206
469
  parallelism?: number;
470
+ /** Completion mode */
207
471
  completionMode?: 'NonIndexed' | 'Indexed';
472
+ /** Suspend job execution */
208
473
  suspend?: boolean;
474
+ /** Image pull policy */
209
475
  imagePullPolicy?: 'Always' | 'IfNotPresent' | 'Never';
476
+ /** Service account name */
210
477
  serviceAccountName?: string;
211
- /** Optional extra labels on the Job metadata */
478
+ /** Job metadata labels */
212
479
  labels?: Record<string, string>;
213
- /** Optional annotations on the Job metadata */
480
+ /** Job metadata annotations */
214
481
  annotations?: Record<string, string>;
215
- /** Optional extra labels on the pod template */
482
+ /** Pod template labels */
216
483
  podLabels?: Record<string, string>;
217
- /** Optional annotations on the pod template */
484
+ /** Pod template annotations */
218
485
  podAnnotations?: Record<string, string>;
219
486
  }
487
+ /**
488
+ * Kubernetes CronJob specification
489
+ *
490
+ * @interface CronJobSpec
491
+ * @since 2.1.0
492
+ */
220
493
  export interface CronJobSpec {
494
+ /** CronJob name */
221
495
  name: string;
496
+ /** Cron schedule expression */
222
497
  schedule: string;
498
+ /** Container image */
223
499
  image: string;
500
+ /** Command to run */
224
501
  command?: string[];
502
+ /** Arguments to command */
225
503
  args?: string[];
504
+ /** Environment variables */
226
505
  env?: Record<string, string>;
506
+ /** Environment from ConfigMap/Secret */
227
507
  envFrom?: EnvFromSource[];
508
+ /** Volume sources */
228
509
  volumes?: VolumeSourceSpec[];
510
+ /** Volume mounts */
229
511
  volumeMounts?: VolumeMountSpec[];
512
+ /** Resource requirements */
230
513
  resources?: ResourceRequirements;
514
+ /** Restart policy */
231
515
  restartPolicy?: 'Never' | 'OnFailure';
516
+ /** Backoff limit for retries */
232
517
  backoffLimit?: number;
518
+ /** Active deadline in seconds */
233
519
  activeDeadlineSeconds?: number;
520
+ /** TTL after finished in seconds */
234
521
  ttlSecondsAfterFinished?: number;
522
+ /** Number of completions */
235
523
  completions?: number;
524
+ /** Parallelism level */
236
525
  parallelism?: number;
526
+ /** Completion mode */
237
527
  completionMode?: 'NonIndexed' | 'Indexed';
528
+ /** Suspend job execution */
238
529
  suspend?: boolean;
530
+ /** Starting deadline in seconds */
239
531
  startingDeadlineSeconds?: number;
532
+ /** Concurrency policy */
240
533
  concurrencyPolicy?: 'Allow' | 'Forbid' | 'Replace';
534
+ /** Successful jobs history limit */
241
535
  successfulJobsHistoryLimit?: number;
536
+ /** Failed jobs history limit */
242
537
  failedJobsHistoryLimit?: number;
538
+ /** Time zone */
243
539
  timeZone?: string;
540
+ /** Image pull policy */
244
541
  imagePullPolicy?: 'Always' | 'IfNotPresent' | 'Never';
542
+ /** Service account name */
245
543
  serviceAccountName?: string;
246
- /** Optional extra labels on the CronJob metadata */
544
+ /** CronJob metadata labels */
247
545
  labels?: Record<string, string>;
248
- /** Optional annotations on the CronJob metadata */
546
+ /** CronJob metadata annotations */
249
547
  annotations?: Record<string, string>;
250
- /** Optional extra labels on the pod template */
548
+ /** Pod template labels */
251
549
  podLabels?: Record<string, string>;
252
- /** Optional annotations on the pod template */
550
+ /** Pod template annotations */
253
551
  podAnnotations?: Record<string, string>;
254
552
  }
553
+ /**
554
+ * Kubernetes Service specification
555
+ *
556
+ * @interface ServiceSpec
557
+ * @since 1.0.0
558
+ *
559
+ * @example
560
+ * ```typescript
561
+ * const service: ServiceSpec = {
562
+ * name: 'web-service',
563
+ * ports: [{ port: 80, targetPort: 8080 }],
564
+ * type: 'LoadBalancer'
565
+ * };
566
+ * ```
567
+ */
255
568
  export interface ServiceSpec {
569
+ /** Service name */
256
570
  name: string;
571
+ /** Service ports */
257
572
  ports: Array<{
573
+ /** Service port */
258
574
  port: number;
575
+ /** Target port on pods */
259
576
  targetPort?: number;
577
+ /** Protocol */
260
578
  protocol?: 'TCP' | 'UDP' | 'SCTP';
579
+ /** Port name */
261
580
  name?: string;
581
+ /** NodePort (for NodePort/LoadBalancer) */
262
582
  nodePort?: number;
263
583
  }>;
584
+ /** Service type */
264
585
  type?: 'ClusterIP' | 'NodePort' | 'LoadBalancer' | 'ExternalName';
586
+ /** Pod selector */
265
587
  selector?: Record<string, string>;
588
+ /** Cluster IP */
266
589
  clusterIP?: string;
590
+ /** External name (for ExternalName type) */
267
591
  externalName?: string;
592
+ /** Session affinity */
268
593
  sessionAffinity?: 'None' | 'ClientIP';
594
+ /** Load balancer IP */
269
595
  loadBalancerIP?: string;
596
+ /** Load balancer source ranges */
270
597
  loadBalancerSourceRanges?: string[];
598
+ /** Load balancer class */
271
599
  loadBalancerClass?: string;
600
+ /** External traffic policy */
272
601
  externalTrafficPolicy?: 'Cluster' | 'Local';
602
+ /** Internal traffic policy */
273
603
  internalTrafficPolicy?: 'Cluster' | 'Local';
604
+ /** IP family policy */
274
605
  ipFamilyPolicy?: 'SingleStack' | 'PreferDualStack' | 'RequireDualStack';
606
+ /** IP families */
275
607
  ipFamilies?: Array<'IPv4' | 'IPv6'>;
608
+ /** Service labels */
276
609
  labels?: Record<string, string>;
610
+ /** Service annotations */
277
611
  annotations?: Record<string, string>;
278
612
  }
613
+ /**
614
+ * Kubernetes Ingress rule specification
615
+ *
616
+ * @interface IngressRule
617
+ * @since 1.0.0
618
+ */
279
619
  export interface IngressRule {
620
+ /** Host name */
280
621
  host?: string;
622
+ /** Path rules */
281
623
  paths: Array<{
624
+ /** URL path */
282
625
  path: string;
626
+ /** Path matching type */
283
627
  pathType: 'Exact' | 'Prefix' | 'ImplementationSpecific';
628
+ /** Backend service */
284
629
  backend: {
285
630
  service: {
286
631
  name: string;
@@ -292,15 +637,34 @@ export interface IngressRule {
292
637
  };
293
638
  }>;
294
639
  }
640
+ /**
641
+ * Kubernetes Ingress TLS specification
642
+ *
643
+ * @interface IngressTLS
644
+ * @since 1.0.0
645
+ */
295
646
  export interface IngressTLS {
647
+ /** TLS hosts */
296
648
  hosts?: string[];
649
+ /** Secret name containing TLS certificate */
297
650
  secretName?: string;
298
651
  }
652
+ /**
653
+ * Kubernetes Ingress specification
654
+ *
655
+ * @interface IngressSpec
656
+ * @since 1.0.0
657
+ */
299
658
  export interface IngressSpec {
659
+ /** Ingress name */
300
660
  name: string;
661
+ /** Ingress rules */
301
662
  rules: IngressRule[];
663
+ /** TLS configuration */
302
664
  tls?: IngressTLS[];
665
+ /** Ingress class name */
303
666
  ingressClassName?: string;
667
+ /** Default backend */
304
668
  defaultBackend?: {
305
669
  service: {
306
670
  name: string;
@@ -310,29 +674,65 @@ export interface IngressSpec {
310
674
  };
311
675
  };
312
676
  };
677
+ /** Ingress labels */
313
678
  labels?: Record<string, string>;
679
+ /** Ingress annotations */
314
680
  annotations?: Record<string, string>;
315
681
  }
682
+ /**
683
+ * Kubernetes ConfigMap specification
684
+ *
685
+ * @interface ConfigMapSpec
686
+ * @since 1.0.0
687
+ */
316
688
  export interface ConfigMapSpec {
689
+ /** ConfigMap name */
317
690
  name: string;
691
+ /** String data */
318
692
  data?: Record<string, string>;
693
+ /** Binary data */
319
694
  binaryData?: Record<string, string>;
695
+ /** Immutable ConfigMap */
320
696
  immutable?: boolean;
697
+ /** ConfigMap labels */
321
698
  labels?: Record<string, string>;
699
+ /** ConfigMap annotations */
322
700
  annotations?: Record<string, string>;
323
701
  }
702
+ /**
703
+ * Kubernetes Secret specification
704
+ *
705
+ * @interface SecretSpec
706
+ * @since 1.0.0
707
+ */
324
708
  export interface SecretSpec {
709
+ /** Secret name */
325
710
  name: string;
711
+ /** Secret type */
326
712
  type?: string;
713
+ /** String data (unencoded) */
327
714
  stringData?: Record<string, string>;
715
+ /** Base64-encoded data */
328
716
  data?: Record<string, string>;
717
+ /** Immutable Secret */
329
718
  immutable?: boolean;
719
+ /** Secret labels */
330
720
  labels?: Record<string, string>;
721
+ /** Secret annotations */
331
722
  annotations?: Record<string, string>;
332
723
  }
724
+ /**
725
+ * Kubernetes PersistentVolumeClaim specification
726
+ *
727
+ * @interface PersistentVolumeClaimSpec
728
+ * @since 1.0.0
729
+ */
333
730
  export interface PersistentVolumeClaimSpec {
731
+ /** PersistentVolumeClaim name */
334
732
  name: string;
733
+ /** Access modes */
335
734
  accessModes: AccessMode[];
735
+ /** Resource requirements */
336
736
  resources: {
337
737
  requests: {
338
738
  storage: string;
@@ -341,116 +741,126 @@ export interface PersistentVolumeClaimSpec {
341
741
  storage: string;
342
742
  };
343
743
  };
744
+ /** Storage class name */
344
745
  storageClassName?: string;
746
+ /** Volume mode */
345
747
  volumeMode?: VolumeMode;
748
+ /** Volume selector */
346
749
  selector?: {
347
750
  matchLabels?: Record<string, string>;
348
751
  matchExpressions?: unknown[];
349
752
  };
753
+ /** PersistentVolumeClaim labels */
350
754
  labels?: Record<string, string>;
755
+ /** PersistentVolumeClaim annotations */
351
756
  annotations?: Record<string, string>;
352
757
  /** Reference to specific PV for static binding */
353
758
  volumeName?: string;
354
759
  /** Cloud provider for optimized defaults */
355
760
  cloudProvider?: 'aws' | 'azure' | 'gcp';
356
761
  }
762
+ /**
763
+ * Kubernetes ServiceAccount specification with multi-cloud workload identity support
764
+ *
765
+ * @interface ServiceAccountSpec
766
+ * @since 1.0.0
767
+ */
357
768
  export interface ServiceAccountSpec {
769
+ /** ServiceAccount name */
358
770
  name: string;
771
+ /** ServiceAccount annotations */
359
772
  annotations?: Record<string, string>;
773
+ /** ServiceAccount labels */
360
774
  labels?: Record<string, string>;
775
+ /** Automount service account token */
361
776
  automountServiceAccountToken?: boolean;
777
+ /** Image pull secrets */
362
778
  imagePullSecrets?: string[];
779
+ /** Secrets to mount */
363
780
  secrets?: string[];
364
- /**
365
- * EKS IRSA support: IAM role ARN for service account to assume
366
- * Example: arn:aws:iam::<account-id>:role/<role-name>
367
- * Adds annotation eks.amazonaws.com/role-arn
368
- */
781
+ /** EKS IRSA: IAM role ARN */
369
782
  awsRoleArn?: string;
370
- /**
371
- * IRSA audience for token validation (default: sts.amazonaws.com)
372
- * Adds annotation eks.amazonaws.com/audience when provided
373
- */
783
+ /** IRSA audience for token validation */
374
784
  awsAudience?: string;
375
- /**
376
- * AWS STS endpoint type for IRSA (regional recommended for better performance)
377
- * Adds annotation eks.amazonaws.com/sts-regional-endpoints when provided
378
- * @default 'regional'
379
- */
785
+ /** AWS STS endpoint type */
380
786
  awsStsEndpointType?: 'regional' | 'legacy';
381
- /**
382
- * AWS region for regional STS endpoint (auto-detected if not provided)
383
- * Used with awsStsEndpointType: 'regional'
384
- */
787
+ /** AWS region for regional STS endpoint */
385
788
  awsRegion?: string;
386
- /**
387
- * Token expiration time in seconds for IRSA tokens (3600-43200)
388
- * Adds annotation eks.amazonaws.com/token-expiration when provided
389
- * @default 3600
390
- */
789
+ /** Token expiration time in seconds */
391
790
  awsTokenExpiration?: number;
392
- /**
393
- * AKS Workload Identity: Azure application client ID
394
- * Adds annotation azure.workload.identity/client-id when provided
395
- */
791
+ /** AKS Workload Identity: Azure client ID */
396
792
  azureClientId?: string;
397
- /**
398
- * AKS Workload Identity: Azure tenant ID
399
- * Adds annotation azure.workload.identity/tenant-id when provided
400
- */
793
+ /** AKS Workload Identity: Azure tenant ID */
401
794
  azureTenantId?: string;
402
- /**
403
- * AKS Workload Identity: projected SA token expiration (seconds)
404
- * Adds annotation azure.workload.identity/service-account-token-expiration
405
- */
795
+ /** AKS Workload Identity: token expiration */
406
796
  azureServiceAccountTokenExpiration?: number;
407
- /**
408
- * GKE Workload Identity: Google service account email
409
- * Adds annotation iam.gke.io/gcp-service-account when provided
410
- */
797
+ /** GKE Workload Identity: service account email */
411
798
  gcpServiceAccountEmail?: string;
412
799
  }
800
+ /**
801
+ * HorizontalPodAutoscaler metric specification
802
+ *
803
+ * @interface HorizontalPodAutoscalerMetric
804
+ * @since 1.0.0
805
+ */
413
806
  export interface HorizontalPodAutoscalerMetric {
807
+ /** Metric type */
414
808
  type: 'Resource' | 'Pods' | 'Object' | 'External';
809
+ /** Resource metric */
415
810
  resource?: {
811
+ /** Resource name */
416
812
  name: 'cpu' | 'memory';
813
+ /** Target specification */
417
814
  target: {
815
+ /** Target type */
418
816
  type: 'Utilization' | 'AverageValue';
817
+ /** Average utilization percentage */
419
818
  averageUtilization?: number;
819
+ /** Average value */
420
820
  averageValue?: string;
421
821
  };
422
822
  };
823
+ /** Pods metric */
423
824
  pods?: {
825
+ /** Metric specification */
424
826
  metric: {
425
827
  name: string;
426
828
  selector?: Record<string, unknown>;
427
829
  };
830
+ /** Target specification */
428
831
  target: {
429
832
  type: 'AverageValue';
430
833
  averageValue: string;
431
834
  };
432
835
  };
836
+ /** Object metric */
433
837
  object?: {
838
+ /** Metric specification */
434
839
  metric: {
435
840
  name: string;
436
841
  selector?: Record<string, unknown>;
437
842
  };
843
+ /** Described object */
438
844
  describedObject: {
439
845
  apiVersion: string;
440
846
  kind: string;
441
847
  name: string;
442
848
  };
849
+ /** Target specification */
443
850
  target: {
444
851
  type: 'Value' | 'AverageValue';
445
852
  value?: string;
446
853
  averageValue?: string;
447
854
  };
448
855
  };
856
+ /** External metric */
449
857
  external?: {
858
+ /** Metric specification */
450
859
  metric: {
451
860
  name: string;
452
861
  selector?: Record<string, unknown>;
453
862
  };
863
+ /** Target specification */
454
864
  target: {
455
865
  type: 'Value' | 'AverageValue';
456
866
  value?: string;
@@ -458,38 +868,75 @@ export interface HorizontalPodAutoscalerMetric {
458
868
  };
459
869
  };
460
870
  }
871
+ /**
872
+ * HorizontalPodAutoscaler behavior specification
873
+ *
874
+ * @interface HorizontalPodAutoscalerBehavior
875
+ * @since 1.0.0
876
+ */
461
877
  export interface HorizontalPodAutoscalerBehavior {
878
+ /** Scale up behavior */
462
879
  scaleUp?: {
880
+ /** Stabilization window in seconds */
463
881
  stabilizationWindowSeconds?: number;
882
+ /** Policy selection */
464
883
  selectPolicy?: 'Max' | 'Min' | 'Disabled';
884
+ /** Scaling policies */
465
885
  policies?: Array<{
886
+ /** Policy type */
466
887
  type: 'Pods' | 'Percent';
888
+ /** Policy value */
467
889
  value: number;
890
+ /** Period in seconds */
468
891
  periodSeconds: number;
469
892
  }>;
470
893
  };
894
+ /** Scale down behavior */
471
895
  scaleDown?: {
896
+ /** Stabilization window in seconds */
472
897
  stabilizationWindowSeconds?: number;
898
+ /** Policy selection */
473
899
  selectPolicy?: 'Max' | 'Min' | 'Disabled';
900
+ /** Scaling policies */
474
901
  policies?: Array<{
902
+ /** Policy type */
475
903
  type: 'Pods' | 'Percent';
904
+ /** Policy value */
476
905
  value: number;
906
+ /** Period in seconds */
477
907
  periodSeconds: number;
478
908
  }>;
479
909
  };
480
910
  }
911
+ /**
912
+ * Kubernetes HorizontalPodAutoscaler specification
913
+ *
914
+ * @interface HorizontalPodAutoscalerSpec
915
+ * @since 1.0.0
916
+ */
481
917
  export interface HorizontalPodAutoscalerSpec {
918
+ /** HPA name */
482
919
  name: string;
920
+ /** Scale target reference */
483
921
  scaleTargetRef: {
922
+ /** API version */
484
923
  apiVersion: string;
924
+ /** Resource kind */
485
925
  kind: 'Deployment' | 'StatefulSet' | 'ReplicaSet';
926
+ /** Resource name */
486
927
  name: string;
487
928
  };
929
+ /** Minimum replicas */
488
930
  minReplicas?: number;
931
+ /** Maximum replicas */
489
932
  maxReplicas: number;
933
+ /** Scaling metrics */
490
934
  metrics?: HorizontalPodAutoscalerMetric[];
935
+ /** Scaling behavior */
491
936
  behavior?: HorizontalPodAutoscalerBehavior;
937
+ /** HPA labels */
492
938
  labels?: Record<string, string>;
939
+ /** HPA annotations */
493
940
  annotations?: Record<string, string>;
494
941
  }
495
942
  export interface VerticalPodAutoscalerResourcePolicy {
@@ -525,18 +972,37 @@ export interface PodDisruptionBudgetSpec {
525
972
  labels?: Record<string, string>;
526
973
  annotations?: Record<string, string>;
527
974
  }
975
+ /**
976
+ * AWS EBS StorageClass specification
977
+ *
978
+ * @interface AWSEBSStorageClassSpec
979
+ * @extends CloudResourceTags
980
+ * @since 1.0.0
981
+ */
528
982
  export interface AWSEBSStorageClassSpec extends CloudResourceTags {
983
+ /** StorageClass name */
529
984
  name: string;
985
+ /** EBS volume type */
530
986
  volumeType?: 'gp2' | 'gp3' | 'io1' | 'io2' | 'sc1' | 'st1';
987
+ /** Filesystem type */
531
988
  fsType?: 'ext4' | 'xfs';
989
+ /** Enable encryption */
532
990
  encrypted?: boolean;
991
+ /** KMS key ID for encryption */
533
992
  kmsKeyId?: string;
993
+ /** IOPS for io1/io2 volumes */
534
994
  iops?: number;
995
+ /** Throughput for gp3 volumes */
535
996
  throughput?: number;
997
+ /** Volume reclaim policy */
536
998
  reclaimPolicy?: 'Delete' | 'Retain';
999
+ /** Allow volume expansion */
537
1000
  allowVolumeExpansion?: boolean;
1001
+ /** Volume binding mode */
538
1002
  volumeBindingMode?: 'Immediate' | 'WaitForFirstConsumer';
1003
+ /** StorageClass labels */
539
1004
  labels?: Record<string, string>;
1005
+ /** StorageClass annotations */
540
1006
  annotations?: Record<string, string>;
541
1007
  }
542
1008
  export interface AWSEBSPersistentVolumeClaimSpec {
@@ -796,19 +1262,22 @@ export interface AzureACRServiceAccountSpec {
796
1262
  secrets?: string[];
797
1263
  }
798
1264
  /**
799
- * Configuration interface for Azure Disk StorageClass.
800
- * Defines the parameters for creating an Azure Disk StorageClass in AKS.
1265
+ * Cloud resource tags with basic validation
801
1266
  *
802
- * @see https://learn.microsoft.com/en-us/azure/aks/azure-csi-disk-storage-provision
803
- */
804
- /**
805
- * Cloud resource tags with basic validation.
806
- * Provides a consistent interface for tagging resources across cloud providers.
1267
+ * @interface CloudResourceTags
1268
+ * @since 1.0.0
807
1269
  */
808
1270
  export interface CloudResourceTags {
809
1271
  /** Resource tags as key-value pairs */
810
1272
  tags?: Record<string, string>;
811
1273
  }
1274
+ /**
1275
+ * Azure Disk StorageClass specification
1276
+ *
1277
+ * @interface AzureDiskStorageClassSpec
1278
+ * @extends CloudResourceTags
1279
+ * @since 1.0.0
1280
+ */
812
1281
  export interface AzureDiskStorageClassSpec extends CloudResourceTags {
813
1282
  /** Name of the StorageClass */
814
1283
  name: string;
@@ -851,32 +1320,58 @@ export interface AzureDiskStorageClassSpec extends CloudResourceTags {
851
1320
  /** Annotations to apply to the StorageClass */
852
1321
  annotations?: Record<string, string>;
853
1322
  }
1323
+ /**
1324
+ * AWS Application Load Balancer Ingress specification
1325
+ *
1326
+ * @interface AWSALBIngressSpec
1327
+ * @extends CloudResourceTags
1328
+ * @since 1.0.0
1329
+ */
854
1330
  export interface AWSALBIngressSpec extends CloudResourceTags {
1331
+ /** Ingress name */
855
1332
  name: string;
1333
+ /** Ingress rules */
856
1334
  rules: IngressRule[];
1335
+ /** TLS configuration */
857
1336
  tls?: IngressTLS[];
1337
+ /** Load balancer scheme */
858
1338
  scheme?: 'internet-facing' | 'internal';
1339
+ /** Target type */
859
1340
  targetType?: 'instance' | 'ip';
1341
+ /** IP address type */
860
1342
  ipAddressType?: 'ipv4' | 'dualstack';
1343
+ /** ALB group name */
861
1344
  groupName?: string;
1345
+ /** ALB group order */
862
1346
  groupOrder?: number;
1347
+ /** Subnet IDs */
863
1348
  subnets?: string[];
1349
+ /** Security group IDs */
864
1350
  securityGroups?: string[];
1351
+ /** SSL certificate ARN */
865
1352
  certificateArn?: string;
1353
+ /** Enable SSL redirect */
866
1354
  sslRedirect?: boolean;
1355
+ /** Health check path */
867
1356
  healthCheckPath?: string;
1357
+ /** Health check interval */
868
1358
  healthCheckIntervalSeconds?: number;
1359
+ /** Health check timeout */
869
1360
  healthCheckTimeoutSeconds?: number;
1361
+ /** Healthy threshold count */
870
1362
  healthyThresholdCount?: number;
1363
+ /** Unhealthy threshold count */
871
1364
  unhealthyThresholdCount?: number;
1365
+ /** Ingress labels */
872
1366
  labels?: Record<string, string>;
1367
+ /** Ingress annotations */
873
1368
  annotations?: Record<string, string>;
874
1369
  }
875
1370
  /**
876
- * Configuration interface for Azure Application Gateway Ingress Controller (AGIC).
877
- * Provides comprehensive support for AGIC annotations and features for AKS deployments.
1371
+ * Azure Application Gateway Ingress Controller specification
878
1372
  *
879
- * @see https://learn.microsoft.com/en-us/azure/application-gateway/ingress-controller-annotations
1373
+ * @interface AzureAGICIngressSpec
1374
+ * @since 1.0.0
880
1375
  */
881
1376
  export interface AzureAGICIngressSpec {
882
1377
  /** Name of the Ingress resource */
@@ -964,6 +1459,12 @@ export interface VerticalPodAutoscalerSpec {
964
1459
  labels?: Record<string, string>;
965
1460
  annotations?: Record<string, string>;
966
1461
  }
1462
+ /**
1463
+ * NetworkPolicy peer specification
1464
+ *
1465
+ * @interface NetworkPolicyPeer
1466
+ * @since 1.0.0
1467
+ */
967
1468
  export interface NetworkPolicyPeer {
968
1469
  podSelector?: {
969
1470
  matchLabels?: Record<string, string>;
@@ -986,19 +1487,43 @@ export interface NetworkPolicyPeer {
986
1487
  except?: string[];
987
1488
  };
988
1489
  }
1490
+ /**
1491
+ * NetworkPolicy port specification
1492
+ *
1493
+ * @interface NetworkPolicyPort
1494
+ * @since 1.0.0
1495
+ */
989
1496
  export interface NetworkPolicyPort {
990
1497
  protocol?: 'TCP' | 'UDP' | 'SCTP';
991
1498
  port?: number | string;
992
1499
  endPort?: number;
993
1500
  }
1501
+ /**
1502
+ * NetworkPolicy ingress rule specification
1503
+ *
1504
+ * @interface NetworkPolicyIngressRule
1505
+ * @since 1.0.0
1506
+ */
994
1507
  export interface NetworkPolicyIngressRule {
995
1508
  from?: NetworkPolicyPeer[];
996
1509
  ports?: NetworkPolicyPort[];
997
1510
  }
1511
+ /**
1512
+ * NetworkPolicy egress rule specification
1513
+ *
1514
+ * @interface NetworkPolicyEgressRule
1515
+ * @since 1.0.0
1516
+ */
998
1517
  export interface NetworkPolicyEgressRule {
999
1518
  to?: NetworkPolicyPeer[];
1000
1519
  ports?: NetworkPolicyPort[];
1001
1520
  }
1521
+ /**
1522
+ * NetworkPolicy specification
1523
+ *
1524
+ * @interface NetworkPolicySpec
1525
+ * @since 1.0.0
1526
+ */
1002
1527
  export interface NetworkPolicySpec {
1003
1528
  name: string;
1004
1529
  podSelector?: {
@@ -1015,27 +1540,445 @@ export interface NetworkPolicySpec {
1015
1540
  labels?: Record<string, string>;
1016
1541
  annotations?: Record<string, string>;
1017
1542
  }
1543
+ /**
1544
+ * Karpenter NodePool requirement for node selection
1545
+ *
1546
+ * @interface KarpenterNodeRequirement
1547
+ * @since 1.0.0
1548
+ */
1549
+ /**
1550
+ * Karpenter node requirement specification
1551
+ *
1552
+ * @interface KarpenterNodeRequirement
1553
+ * @since 2.3.0
1554
+ */
1555
+ export interface KarpenterNodeRequirement {
1556
+ /** Label key to match against */
1557
+ key: string;
1558
+ /** Operator for matching */
1559
+ operator: 'In' | 'NotIn' | 'Exists' | 'DoesNotExist' | 'Gt' | 'Lt';
1560
+ /** Values to match */
1561
+ values?: string[];
1562
+ }
1563
+ /**
1564
+ * Karpenter NodePool disruption configuration
1565
+ *
1566
+ * @interface KarpenterNodeDisruption
1567
+ * @since 1.0.0
1568
+ */
1569
+ /**
1570
+ * Karpenter node disruption configuration
1571
+ *
1572
+ * @interface KarpenterNodeDisruption
1573
+ * @since 2.3.0
1574
+ */
1575
+ export interface KarpenterNodeDisruption {
1576
+ /** Policy for node consolidation */
1577
+ consolidationPolicy?: 'WhenEmpty' | 'WhenUnderutilized';
1578
+ /** Time to wait before consolidating empty nodes */
1579
+ consolidateAfter?: string;
1580
+ /** Maximum node lifetime before replacement */
1581
+ expireAfter?: string;
1582
+ }
1583
+ /**
1584
+ * Karpenter NodePool specification
1585
+ *
1586
+ * @interface KarpenterNodePoolSpec
1587
+ * @since 1.0.0
1588
+ */
1589
+ /**
1590
+ * Karpenter NodePool specification
1591
+ *
1592
+ * @interface KarpenterNodePoolSpec
1593
+ * @since 2.3.0
1594
+ */
1595
+ export interface KarpenterNodePoolSpec {
1596
+ /** Name of the NodePool */
1597
+ name: string;
1598
+ /** Node requirements for instance selection */
1599
+ requirements?: KarpenterNodeRequirement[];
1600
+ /** Resource limits for the NodePool */
1601
+ limits?: {
1602
+ cpu?: string;
1603
+ memory?: string;
1604
+ };
1605
+ /** Node disruption configuration */
1606
+ disruption?: KarpenterNodeDisruption;
1607
+ /** Reference to NodeClass for AWS-specific configuration */
1608
+ nodeClassRef: {
1609
+ /** API group (default: eks.amazonaws.com) */
1610
+ group?: string;
1611
+ /** Resource kind (default: NodeClass) */
1612
+ kind?: string;
1613
+ /** NodeClass name */
1614
+ name: string;
1615
+ };
1616
+ /** Taints to apply to provisioned nodes */
1617
+ taints?: Array<{
1618
+ key: string;
1619
+ value?: string;
1620
+ effect: 'NoSchedule' | 'PreferNoSchedule' | 'NoExecute';
1621
+ }>;
1622
+ /** Labels to apply to the NodePool */
1623
+ labels?: Record<string, string>;
1624
+ /** Annotations to apply to the NodePool */
1625
+ annotations?: Record<string, string>;
1626
+ }
1627
+ /**
1628
+ * Karpenter block device mapping for EC2 instances
1629
+ *
1630
+ * @interface KarpenterBlockDeviceMapping
1631
+ * @since 1.0.0
1632
+ */
1633
+ /**
1634
+ * Karpenter block device mapping specification
1635
+ *
1636
+ * @interface KarpenterBlockDeviceMapping
1637
+ * @since 2.3.0
1638
+ */
1639
+ export interface KarpenterBlockDeviceMapping {
1640
+ /** Device name (e.g., /dev/xvda) */
1641
+ deviceName: string;
1642
+ /** EBS configuration */
1643
+ ebs?: {
1644
+ /** Volume size in GB */
1645
+ volumeSize?: string;
1646
+ /** Volume type */
1647
+ volumeType?: 'gp2' | 'gp3' | 'io1' | 'io2' | 'sc1' | 'st1';
1648
+ /** Enable encryption */
1649
+ encrypted?: boolean;
1650
+ /** Delete on termination */
1651
+ deleteOnTermination?: boolean;
1652
+ /** IOPS for io1/io2 volumes */
1653
+ iops?: number;
1654
+ /** Throughput for gp3 volumes */
1655
+ throughput?: number;
1656
+ };
1657
+ }
1658
+ /**
1659
+ * Karpenter subnet selector term
1660
+ *
1661
+ * @interface KarpenterSubnetSelectorTerm
1662
+ * @since 1.0.0
1663
+ */
1664
+ /**
1665
+ * Karpenter subnet selector term specification
1666
+ *
1667
+ * @interface KarpenterSubnetSelectorTerm
1668
+ * @since 2.3.0
1669
+ */
1670
+ export interface KarpenterSubnetSelectorTerm {
1671
+ /** Subnet tags for selection */
1672
+ tags?: Record<string, string>;
1673
+ /** Specific subnet ID */
1674
+ id?: string;
1675
+ }
1676
+ /**
1677
+ * Karpenter security group selector term
1678
+ *
1679
+ * @interface KarpenterSecurityGroupSelectorTerm
1680
+ * @since 1.0.0
1681
+ */
1682
+ /**
1683
+ * Karpenter security group selector term specification
1684
+ *
1685
+ * @interface KarpenterSecurityGroupSelectorTerm
1686
+ * @since 2.3.0
1687
+ */
1688
+ export interface KarpenterSecurityGroupSelectorTerm {
1689
+ /** Security group tags for selection */
1690
+ tags?: Record<string, string>;
1691
+ /** Specific security group ID */
1692
+ id?: string;
1693
+ }
1694
+ /**
1695
+ * Karpenter EC2 NodeClass specification
1696
+ *
1697
+ * @interface KarpenterEC2NodeClassSpec
1698
+ * @since 1.0.0
1699
+ */
1700
+ /**
1701
+ * Karpenter EC2 NodeClass specification
1702
+ *
1703
+ * @interface KarpenterEC2NodeClassSpec
1704
+ * @since 2.3.0
1705
+ */
1706
+ export interface KarpenterEC2NodeClassSpec {
1707
+ /** Name of the EC2 NodeClass */
1708
+ name: string;
1709
+ /** AMI family for node instances */
1710
+ amiFamily?: 'AL2' | 'AL2023' | 'Bottlerocket' | 'Ubuntu' | 'Windows2019' | 'Windows2022' | 'Custom';
1711
+ /** Instance store policy */
1712
+ instanceStorePolicy?: 'NVME' | 'RAID0';
1713
+ /** User data script for instance initialization */
1714
+ userData?: string;
1715
+ /** Subnet selection terms */
1716
+ subnetSelectorTerms?: KarpenterSubnetSelectorTerm[];
1717
+ /** Security group selection terms */
1718
+ securityGroupSelectorTerms?: KarpenterSecurityGroupSelectorTerm[];
1719
+ /** IAM role for instances */
1720
+ role?: string;
1721
+ /** Instance profile name */
1722
+ instanceProfile?: string;
1723
+ /** EC2 metadata options */
1724
+ metadataOptions?: {
1725
+ /** HTTP endpoint state */
1726
+ httpEndpoint?: 'enabled' | 'disabled';
1727
+ /** IPv6 endpoint state */
1728
+ httpProtocolIPv6?: 'enabled' | 'disabled';
1729
+ /** Hop limit for metadata requests */
1730
+ httpPutResponseHopLimit?: number;
1731
+ /** Token requirement */
1732
+ httpTokens?: 'required' | 'optional';
1733
+ };
1734
+ /** Block device mappings */
1735
+ blockDeviceMappings?: KarpenterBlockDeviceMapping[];
1736
+ /** Resource tags */
1737
+ tags?: Record<string, string>;
1738
+ /** Labels to apply to the NodeClass */
1739
+ labels?: Record<string, string>;
1740
+ /** Annotations to apply to the NodeClass */
1741
+ annotations?: Record<string, string>;
1742
+ }
1743
+ /**
1744
+ * Karpenter disruption budget for controlling disruption rate.
1745
+ */
1746
+ /**
1747
+ * Karpenter disruption budget specification
1748
+ *
1749
+ * @interface KarpenterDisruptionBudget
1750
+ * @since 2.3.0
1751
+ */
1752
+ export interface KarpenterDisruptionBudget {
1753
+ /** Schedule in cron format for when budget applies */
1754
+ schedule?: string;
1755
+ /** Duration the budget is active */
1756
+ duration?: string;
1757
+ /** Number or percentage of nodes that can be disrupted */
1758
+ nodes?: string | number;
1759
+ /** Reasons this budget applies to */
1760
+ reasons?: Array<'Underutilized' | 'Empty' | 'Drifted' | 'Expired'>;
1761
+ }
1762
+ /**
1763
+ * Advanced disruption configuration for Karpenter NodePools.
1764
+ */
1765
+ /**
1766
+ * Karpenter advanced disruption configuration
1767
+ *
1768
+ * @interface KarpenterAdvancedDisruption
1769
+ * @since 2.3.0
1770
+ */
1771
+ export interface KarpenterAdvancedDisruption {
1772
+ /** Consolidation policy */
1773
+ consolidationPolicy?: 'WhenEmpty' | 'WhenEmptyOrUnderutilized';
1774
+ /** Time to wait before consolidating */
1775
+ consolidateAfter?: string;
1776
+ /** Node expiration time */
1777
+ expireAfter?: string;
1778
+ /** Disruption budgets for rate limiting */
1779
+ budgets?: KarpenterDisruptionBudget[];
1780
+ }
1781
+ /**
1782
+ * Configuration interface for Karpenter NodeClaim.
1783
+ * Represents an individual node request that Karpenter will fulfill.
1784
+ *
1785
+ * @see https://karpenter.sh/docs/concepts/nodeclaims/
1786
+ */
1787
+ /**
1788
+ * Karpenter NodeClaim specification
1789
+ *
1790
+ * @interface KarpenterNodeClaimSpec
1791
+ * @since 2.3.0
1792
+ */
1793
+ export interface KarpenterNodeClaimSpec {
1794
+ /** Name of the NodeClaim */
1795
+ name: string;
1796
+ /** Node requirements for instance selection */
1797
+ requirements?: KarpenterNodeRequirement[];
1798
+ /** Reference to NodeClass for AWS-specific configuration */
1799
+ nodeClassRef: {
1800
+ /** API group (default: eks.amazonaws.com) */
1801
+ group?: string;
1802
+ /** Resource kind (default: NodeClass) */
1803
+ kind?: string;
1804
+ /** NodeClass name */
1805
+ name: string;
1806
+ };
1807
+ /** Taints to apply to the node */
1808
+ taints?: Array<{
1809
+ key: string;
1810
+ value?: string;
1811
+ effect: 'NoSchedule' | 'PreferNoSchedule' | 'NoExecute';
1812
+ }>;
1813
+ /** Startup taints that will be removed after node initialization */
1814
+ startupTaints?: Array<{
1815
+ key: string;
1816
+ value?: string;
1817
+ effect: 'NoSchedule' | 'PreferNoSchedule' | 'NoExecute';
1818
+ }>;
1819
+ /** Node expiration time */
1820
+ expireAfter?: string;
1821
+ /** Termination grace period */
1822
+ terminationGracePeriod?: string;
1823
+ /** Labels to apply to the NodeClaim */
1824
+ labels?: Record<string, string>;
1825
+ /** Annotations to apply to the NodeClaim */
1826
+ annotations?: Record<string, string>;
1827
+ }
1828
+ /**
1829
+ * Topology spread constraint for advanced scheduling.
1830
+ */
1831
+ /**
1832
+ * Karpenter topology spread constraint specification
1833
+ *
1834
+ * @interface KarpenterTopologySpreadConstraint
1835
+ * @since 2.3.0
1836
+ */
1837
+ export interface KarpenterTopologySpreadConstraint {
1838
+ /** Maximum skew between zones/domains */
1839
+ maxSkew: number;
1840
+ /** Topology key (e.g., topology.kubernetes.io/zone) */
1841
+ topologyKey: string;
1842
+ /** What to do when constraint cannot be satisfied */
1843
+ whenUnsatisfiable: 'DoNotSchedule' | 'ScheduleAnyway';
1844
+ /** Label selector for pods to consider */
1845
+ labelSelector?: {
1846
+ matchLabels?: Record<string, string>;
1847
+ matchExpressions?: Array<{
1848
+ key: string;
1849
+ operator: 'In' | 'NotIn' | 'Exists' | 'DoesNotExist';
1850
+ values?: string[];
1851
+ }>;
1852
+ };
1853
+ /** Minimum domains required */
1854
+ minDomains?: number;
1855
+ }
1856
+ /**
1857
+ * Node affinity for advanced scheduling constraints.
1858
+ */
1859
+ /**
1860
+ * Karpenter node affinity specification
1861
+ *
1862
+ * @interface KarpenterNodeAffinity
1863
+ * @since 2.3.0
1864
+ */
1865
+ export interface KarpenterNodeAffinity {
1866
+ /** Required node affinity */
1867
+ requiredDuringSchedulingIgnoredDuringExecution?: {
1868
+ nodeSelectorTerms: Array<{
1869
+ matchExpressions?: Array<{
1870
+ key: string;
1871
+ operator: 'In' | 'NotIn' | 'Exists' | 'DoesNotExist' | 'Gt' | 'Lt';
1872
+ values?: string[];
1873
+ }>;
1874
+ matchFields?: Array<{
1875
+ key: string;
1876
+ operator: 'In' | 'NotIn' | 'Exists' | 'DoesNotExist' | 'Gt' | 'Lt';
1877
+ values?: string[];
1878
+ }>;
1879
+ }>;
1880
+ };
1881
+ /** Preferred node affinity */
1882
+ preferredDuringSchedulingIgnoredDuringExecution?: Array<{
1883
+ weight: number;
1884
+ preference: {
1885
+ matchExpressions?: Array<{
1886
+ key: string;
1887
+ operator: 'In' | 'NotIn' | 'Exists' | 'DoesNotExist' | 'Gt' | 'Lt';
1888
+ values?: string[];
1889
+ }>;
1890
+ matchFields?: Array<{
1891
+ key: string;
1892
+ operator: 'In' | 'NotIn' | 'Exists' | 'DoesNotExist' | 'Gt' | 'Lt';
1893
+ values?: string[];
1894
+ }>;
1895
+ };
1896
+ }>;
1897
+ }
1898
+ /**
1899
+ * Configuration interface for advanced Karpenter scheduling.
1900
+ * Provides fine-grained control over pod placement and node selection.
1901
+ */
1902
+ /**
1903
+ * Karpenter scheduling specification
1904
+ *
1905
+ * @interface KarpenterSchedulingSpec
1906
+ * @since 2.3.0
1907
+ */
1908
+ export interface KarpenterSchedulingSpec {
1909
+ /** Name of the scheduling configuration */
1910
+ name: string;
1911
+ /** Node selector for basic node selection */
1912
+ nodeSelector?: Record<string, string>;
1913
+ /** Node affinity for advanced node selection */
1914
+ nodeAffinity?: KarpenterNodeAffinity;
1915
+ /** Topology spread constraints */
1916
+ topologySpreadConstraints?: KarpenterTopologySpreadConstraint[];
1917
+ /** Tolerations for taints */
1918
+ tolerations?: Array<{
1919
+ key?: string;
1920
+ operator?: 'Exists' | 'Equal';
1921
+ value?: string;
1922
+ effect?: 'NoSchedule' | 'PreferNoSchedule' | 'NoExecute';
1923
+ tolerationSeconds?: number;
1924
+ }>;
1925
+ /** Priority class for pod scheduling */
1926
+ priorityClassName?: string;
1927
+ /** Scheduler name */
1928
+ schedulerName?: string;
1929
+ /** Labels to apply to the scheduling configuration */
1930
+ labels?: Record<string, string>;
1931
+ /** Annotations to apply to the scheduling configuration */
1932
+ annotations?: Record<string, string>;
1933
+ }
1934
+ /**
1935
+ * Configuration properties for Rutter
1936
+ *
1937
+ * @interface RutterProps
1938
+ * @since 1.0.0
1939
+ */
1018
1940
  export interface RutterProps {
1941
+ /** Helm chart metadata */
1019
1942
  meta: HelmChartMeta;
1943
+ /** Default values for values.yaml */
1020
1944
  defaultValues?: Record<string, unknown>;
1945
+ /** Environment-specific values */
1021
1946
  envValues?: Record<string, Record<string, unknown>>;
1022
- /** Optional Helm helpers content for templates/_helpers.tpl */
1947
+ /** Helm helpers content for templates/_helpers.tpl */
1023
1948
  helpersTpl?: string | HelperDefinition[];
1024
- /** Optional NOTES.txt content */
1949
+ /** NOTES.txt content */
1025
1950
  notesTpl?: string;
1026
- /** Optional values.schema.json object */
1951
+ /** JSON schema for values validation */
1027
1952
  valuesSchema?: Record<string, unknown>;
1028
- /** Optional custom name for the generated manifest file (without extension) */
1953
+ /** Custom name for generated manifest file */
1029
1954
  manifestName?: string;
1030
- /**
1031
- * If true, all Kubernetes resources will be combined into a single manifest file.
1032
- * If false (default), each resource will be in its own numbered file.
1033
- * @default false
1034
- */
1955
+ /** Combine all resources into single manifest file */
1035
1956
  singleManifestFile?: boolean;
1036
1957
  }
1037
1958
  /**
1038
- * Rutter builds Kubernetes manifests using cdk8s and writes a Helm chart.
1959
+ * Rutter - Main class for building Kubernetes manifests and Helm charts
1960
+ *
1961
+ * Rutter (maritime pilot) guides the generation of Kubernetes resources
1962
+ * using cdk8s and outputs complete Helm charts with proper templating.
1963
+ *
1964
+ * @class Rutter
1965
+ * @since 1.0.0
1966
+ *
1967
+ * @example
1968
+ * ```typescript
1969
+ * const rutter = new Rutter({
1970
+ * meta: { name: 'my-app', version: '1.0.0' },
1971
+ * defaultValues: { replicas: 3 }
1972
+ * });
1973
+ *
1974
+ * rutter.addDeployment({
1975
+ * name: 'web',
1976
+ * image: 'nginx:1.21',
1977
+ * replicas: 3
1978
+ * });
1979
+ *
1980
+ * rutter.write('./charts/my-app');
1981
+ * ```
1039
1982
  */
1040
1983
  export declare class Rutter {
1041
1984
  private readonly props;
@@ -1043,9 +1986,29 @@ export declare class Rutter {
1043
1986
  private readonly chart;
1044
1987
  private readonly assets;
1045
1988
  private valueOverrides;
1989
+ /**
1990
+ * Creates a new Rutter instance
1991
+ *
1992
+ * @param {RutterProps} props - Configuration properties
1993
+ * @since 1.0.0
1994
+ */
1046
1995
  constructor(props: RutterProps);
1047
1996
  /**
1048
- * Set dynamic value overrides (from --set flags)
1997
+ * Sets dynamic value overrides for Helm values
1998
+ *
1999
+ * Used by CLI --set flags to override default values at runtime.
2000
+ *
2001
+ * @param {Record<string, string>} overrides - Key-value pairs to override
2002
+ *
2003
+ * @example
2004
+ * ```typescript
2005
+ * rutter.setValues({
2006
+ * 'image.tag': 'v2.0.0',
2007
+ * 'replicas': '5'
2008
+ * });
2009
+ * ```
2010
+ *
2011
+ * @since 1.0.0
1049
2012
  */
1050
2013
  setValues(overrides: Record<string, string>): void;
1051
2014
  /**
@@ -1062,23 +2025,195 @@ export declare class Rutter {
1062
2025
  private static readonly AZURE_DISK_CSI_DRIVER;
1063
2026
  private static readonly AZURE_DISK_PROVISIONER_ANNOTATION;
1064
2027
  private static readonly AZURE_FILES_CSI_DRIVER;
2028
+ /**
2029
+ * Adds a Kubernetes Deployment to the chart
2030
+ *
2031
+ * @param {DeploymentSpec} spec - Deployment specification
2032
+ * @returns {ApiObject} The created Deployment object
2033
+ *
2034
+ * @example
2035
+ * ```typescript
2036
+ * rutter.addDeployment({
2037
+ * name: 'web-app',
2038
+ * image: 'nginx:1.21',
2039
+ * replicas: 3,
2040
+ * containerPort: 80,
2041
+ * env: { NODE_ENV: 'production' }
2042
+ * });
2043
+ * ```
2044
+ *
2045
+ * @since 1.0.0
2046
+ */
1065
2047
  addDeployment(spec: DeploymentSpec): ApiObject;
2048
+ /**
2049
+ * Adds a Kubernetes Service to the chart
2050
+ *
2051
+ * @param {ServiceSpec} spec - Service specification
2052
+ * @returns {ApiObject} The created Service object
2053
+ *
2054
+ * @example
2055
+ * ```typescript
2056
+ * rutter.addService({
2057
+ * name: 'web-service',
2058
+ * ports: [{ port: 80, targetPort: 8080 }],
2059
+ * type: 'LoadBalancer'
2060
+ * });
2061
+ * ```
2062
+ *
2063
+ * @since 1.0.0
2064
+ */
1066
2065
  addService(spec: ServiceSpec): ApiObject;
1067
2066
  addReplicaSet(spec: ReplicaSetSpec): ApiObject;
2067
+ /**
2068
+ * Adds a Kubernetes Job to the chart
2069
+ *
2070
+ * @param {JobSpec} spec - Job specification
2071
+ * @returns {ApiObject} The created Job object
2072
+ *
2073
+ * @example
2074
+ * ```typescript
2075
+ * rutter.addJob({
2076
+ * name: 'data-migration',
2077
+ * image: 'migrate:latest',
2078
+ * command: ['./migrate.sh'],
2079
+ * backoffLimit: 3
2080
+ * });
2081
+ * ```
2082
+ *
2083
+ * @since 2.1.0
2084
+ */
1068
2085
  addJob(spec: JobSpec): ApiObject;
2086
+ /**
2087
+ * Adds a Kubernetes CronJob to the chart
2088
+ *
2089
+ * @param {CronJobSpec} spec - CronJob specification
2090
+ * @returns {ApiObject} The created CronJob object
2091
+ *
2092
+ * @example
2093
+ * ```typescript
2094
+ * rutter.addCronJob({
2095
+ * name: 'backup-job',
2096
+ * schedule: '0 2 * * *',
2097
+ * image: 'backup:latest',
2098
+ * command: ['./backup.sh']
2099
+ * });
2100
+ * ```
2101
+ *
2102
+ * @since 2.1.0
2103
+ */
1069
2104
  addCronJob(spec: CronJobSpec): ApiObject;
2105
+ /**
2106
+ * Adds a Kubernetes Ingress to the chart
2107
+ *
2108
+ * @param {IngressSpec} spec - Ingress specification
2109
+ * @returns {ApiObject} The created Ingress object
2110
+ *
2111
+ * @example
2112
+ * ```typescript
2113
+ * rutter.addIngress({
2114
+ * name: 'web-ingress',
2115
+ * rules: [{
2116
+ * host: 'example.com',
2117
+ * paths: [{
2118
+ * path: '/',
2119
+ * pathType: 'Prefix',
2120
+ * backend: { service: { name: 'web-service', port: { number: 80 } } }
2121
+ * }]
2122
+ * }]
2123
+ * });
2124
+ * ```
2125
+ *
2126
+ * @since 1.0.0
2127
+ */
1070
2128
  addIngress(spec: IngressSpec): ApiObject;
1071
2129
  addPersistentVolume(spec: PersistentVolumeSpec): ApiObject;
1072
2130
  private optimizePVForCloud;
1073
2131
  addPersistentVolumeClaim(spec: PersistentVolumeClaimSpec): ApiObject;
1074
2132
  private validatePVCAccessModes;
2133
+ /**
2134
+ * Adds a Kubernetes ConfigMap to the chart
2135
+ *
2136
+ * @param {ConfigMapSpec} spec - ConfigMap specification
2137
+ * @returns {ApiObject} The created ConfigMap object
2138
+ *
2139
+ * @example
2140
+ * ```typescript
2141
+ * rutter.addConfigMap({
2142
+ * name: 'app-config',
2143
+ * data: {
2144
+ * 'config.yaml': 'key: value',
2145
+ * 'app.properties': 'debug=true'
2146
+ * }
2147
+ * });
2148
+ * ```
2149
+ *
2150
+ * @since 1.0.0
2151
+ */
1075
2152
  addConfigMap(spec: ConfigMapSpec): ApiObject;
2153
+ /**
2154
+ * Adds a Kubernetes Secret to the chart
2155
+ *
2156
+ * @param {SecretSpec} spec - Secret specification
2157
+ * @returns {ApiObject} The created Secret object
2158
+ *
2159
+ * @example
2160
+ * ```typescript
2161
+ * rutter.addSecret({
2162
+ * name: 'app-secrets',
2163
+ * stringData: {
2164
+ * 'username': 'admin',
2165
+ * 'password': 'secret123'
2166
+ * }
2167
+ * });
2168
+ * ```
2169
+ *
2170
+ * @since 1.0.0
2171
+ */
1076
2172
  addSecret(spec: SecretSpec): ApiObject;
2173
+ /**
2174
+ * Adds a Kubernetes ServiceAccount to the chart
2175
+ *
2176
+ * @param {ServiceAccountSpec} spec - ServiceAccount specification
2177
+ * @returns {ApiObject} The created ServiceAccount object
2178
+ *
2179
+ * @example
2180
+ * ```typescript
2181
+ * rutter.addServiceAccount({
2182
+ * name: 'app-sa',
2183
+ * awsRoleArn: 'arn:aws:iam::123456789012:role/MyRole',
2184
+ * automountServiceAccountToken: true
2185
+ * });
2186
+ * ```
2187
+ *
2188
+ * @since 1.0.0
2189
+ */
1077
2190
  addServiceAccount(spec: ServiceAccountSpec): ApiObject;
1078
2191
  private buildServiceAccountAnnotations;
1079
2192
  private addAWSIRSAAnnotations;
1080
2193
  private addAzureWorkloadIdentityAnnotations;
1081
2194
  private addGCPWorkloadIdentityAnnotations;
2195
+ /**
2196
+ * Adds a Kubernetes HorizontalPodAutoscaler to the chart
2197
+ *
2198
+ * @param {HorizontalPodAutoscalerSpec} spec - HPA specification
2199
+ * @returns {ApiObject} The created HPA object
2200
+ *
2201
+ * @example
2202
+ * ```typescript
2203
+ * rutter.addHorizontalPodAutoscaler({
2204
+ * name: 'web-hpa',
2205
+ * scaleTargetRef: {
2206
+ * apiVersion: 'apps/v1',
2207
+ * kind: 'Deployment',
2208
+ * name: 'web-app'
2209
+ * },
2210
+ * minReplicas: 2,
2211
+ * maxReplicas: 10
2212
+ * });
2213
+ * ```
2214
+ *
2215
+ * @since 1.0.0
2216
+ */
1082
2217
  addHorizontalPodAutoscaler(spec: HorizontalPodAutoscalerSpec): ApiObject;
1083
2218
  addVerticalPodAutoscaler(spec: VerticalPodAutoscalerSpec): ApiObject;
1084
2219
  addPodDisruptionBudget(spec: PodDisruptionBudgetSpec): ApiObject;
@@ -1323,11 +2458,230 @@ export declare class Rutter {
1323
2458
  */
1324
2459
  private getResourceName;
1325
2460
  /**
1326
- * Add a raw CRD manifest to the chart (written under crds/).
2461
+ * Adds a raw CRD manifest to the chart
2462
+ *
2463
+ * @param {string} yaml - YAML content of the CRD
2464
+ * @param {string} [id='crd'] - Asset identifier
2465
+ *
2466
+ * @example
2467
+ * ```typescript
2468
+ * const crdYaml = `
2469
+ * apiVersion: apiextensions.k8s.io/v1
2470
+ * kind: CustomResourceDefinition
2471
+ * metadata:
2472
+ * name: myresources.example.com
2473
+ * `;
2474
+ * rutter.addCrd(crdYaml, 'myresource-crd');
2475
+ * ```
2476
+ *
2477
+ * @since 1.0.0
1327
2478
  */
1328
2479
  addCrd(yaml: string, id?: string): void;
1329
2480
  /**
1330
- * Synthesize the cdk8s app and write a Helm chart to outDir.
2481
+ * Add Karpenter NodePool for intelligent node provisioning.
2482
+ * Creates a NodePool resource that defines compute requirements and lifecycle policies.
2483
+ *
2484
+ * @param spec - Karpenter NodePool specification
2485
+ * @returns The created NodePool ApiObject
2486
+ *
2487
+ * @example
2488
+ * ```typescript
2489
+ * rutter.addKarpenterNodePool({
2490
+ * name: 'general-purpose',
2491
+ * requirements: [
2492
+ * { key: 'eks.amazonaws.com/instance-category', operator: 'In', values: ['c', 'm', 'r'] },
2493
+ * { key: 'kubernetes.io/arch', operator: 'In', values: ['amd64'] }
2494
+ * ],
2495
+ * limits: { cpu: '1000', memory: '1000Gi' },
2496
+ * nodeClassRef: { name: 'default' }
2497
+ * });
2498
+ * ```
2499
+ *
2500
+ * @since 2.3.0
2501
+ */
2502
+ addKarpenterNodePool(spec: KarpenterNodePoolSpec): ApiObject;
2503
+ /**
2504
+ * Add Karpenter EC2 NodeClass for AWS-specific node configuration.
2505
+ * Creates a NodeClass resource that defines EC2 instance settings and networking.
2506
+ *
2507
+ * @param spec - Karpenter EC2 NodeClass specification
2508
+ * @returns The created NodeClass ApiObject
2509
+ *
2510
+ * @example
2511
+ * ```typescript
2512
+ * rutter.addKarpenterEC2NodeClass({
2513
+ * name: 'default',
2514
+ * amiFamily: 'AL2023',
2515
+ * subnetSelectorTerms: [{ tags: { 'karpenter.sh/discovery': 'my-cluster' } }],
2516
+ * securityGroupSelectorTerms: [{ tags: { 'karpenter.sh/discovery': 'my-cluster' } }],
2517
+ * role: 'KarpenterNodeInstanceProfile'
2518
+ * });
2519
+ * ```
2520
+ *
2521
+ * @since 2.3.0
2522
+ */
2523
+ addKarpenterEC2NodeClass(spec: KarpenterEC2NodeClassSpec): ApiObject;
2524
+ /**
2525
+ * Validate Karpenter NodePool specification
2526
+ */
2527
+ private validateKarpenterNodePoolSpec;
2528
+ private validateNodeClassRef;
2529
+ private validateNodePoolRequirements;
2530
+ private validateNodePoolLimits;
2531
+ private validateNodePoolDisruption;
2532
+ /**
2533
+ * Validate Karpenter EC2 NodeClass specification
2534
+ */
2535
+ private validateKarpenterEC2NodeClassSpec;
2536
+ private validateNodeClassSelectors;
2537
+ private validateNodeClassBlockDevices;
2538
+ private validateNodeClassMetadataOptions;
2539
+ /**
2540
+ * Validate Kubernetes resource quantity format (e.g., "100m", "1Gi")
2541
+ */
2542
+ private isValidResourceQuantity;
2543
+ /**
2544
+ * Validate duration format (e.g., "30s", "5m", "1h")
2545
+ */
2546
+ private isValidDuration;
2547
+ /**
2548
+ * Validate storage size format (e.g., "20", "100Gi")
2549
+ */
2550
+ private isValidStorageSize;
2551
+ /**
2552
+ * Add Karpenter NodeClaim for individual node provisioning.
2553
+ * Creates a NodeClaim resource that represents a request for a single node.
2554
+ *
2555
+ * @param spec - Karpenter NodeClaim specification
2556
+ * @returns The created NodeClaim ApiObject
2557
+ *
2558
+ * @example
2559
+ * ```typescript
2560
+ * rutter.addKarpenterNodeClaim({
2561
+ * name: 'high-memory-node',
2562
+ * requirements: [
2563
+ * { key: 'eks.amazonaws.com/instance-category', operator: 'In', values: ['r'] },
2564
+ * { key: 'eks.amazonaws.com/instance-cpu', operator: 'In', values: ['16', '32'] }
2565
+ * ],
2566
+ * nodeClassRef: { name: 'memory-optimized' },
2567
+ * expireAfter: '24h'
2568
+ * });
2569
+ * ```
2570
+ *
2571
+ * @since 2.3.0
2572
+ */
2573
+ addKarpenterNodeClaim(spec: KarpenterNodeClaimSpec): ApiObject;
2574
+ /**
2575
+ * Add advanced Karpenter scheduling configuration.
2576
+ * Creates scheduling constraints for fine-grained pod placement control.
2577
+ *
2578
+ * @param spec - Karpenter scheduling specification
2579
+ * @returns Configuration object for use in pod specs
2580
+ *
2581
+ * @example
2582
+ * ```typescript
2583
+ * const schedulingConfig = rutter.addKarpenterScheduling({
2584
+ * name: 'zone-spread-scheduling',
2585
+ * topologySpreadConstraints: [{
2586
+ * maxSkew: 1,
2587
+ * topologyKey: 'topology.kubernetes.io/zone',
2588
+ * whenUnsatisfiable: 'DoNotSchedule',
2589
+ * labelSelector: { matchLabels: { app: 'web' } }
2590
+ * }],
2591
+ * nodeAffinity: {
2592
+ * requiredDuringSchedulingIgnoredDuringExecution: {
2593
+ * nodeSelectorTerms: [{
2594
+ * matchExpressions: [{
2595
+ * key: 'eks.amazonaws.com/instance-category',
2596
+ * operator: 'In',
2597
+ * values: ['c', 'm']
2598
+ * }]
2599
+ * }]
2600
+ * }
2601
+ * }
2602
+ * });
2603
+ * ```
2604
+ *
2605
+ * @since 2.3.0
2606
+ */
2607
+ addKarpenterScheduling(spec: KarpenterSchedulingSpec): {
2608
+ schedulerName?: string;
2609
+ priorityClassName?: string;
2610
+ tolerations?: {
2611
+ key?: string;
2612
+ operator?: "Exists" | "Equal";
2613
+ value?: string;
2614
+ effect?: "NoSchedule" | "PreferNoSchedule" | "NoExecute";
2615
+ tolerationSeconds?: number;
2616
+ }[];
2617
+ topologySpreadConstraints?: KarpenterTopologySpreadConstraint[];
2618
+ affinity?: {
2619
+ nodeAffinity: KarpenterNodeAffinity;
2620
+ };
2621
+ nodeSelector?: Record<string, string>;
2622
+ };
2623
+ /**
2624
+ * Create advanced disruption configuration for NodePools.
2625
+ * Provides fine-grained control over when and how nodes are disrupted.
2626
+ *
2627
+ * @param spec - Advanced disruption specification
2628
+ * @returns Disruption configuration object
2629
+ *
2630
+ * @example
2631
+ * ```typescript
2632
+ * const disruptionConfig = rutter.createKarpenterDisruption({
2633
+ * consolidationPolicy: 'WhenEmptyOrUnderutilized',
2634
+ * consolidateAfter: '30s',
2635
+ * expireAfter: '2160h', // 90 days
2636
+ * budgets: [{
2637
+ * schedule: '0 9 * * mon-fri', // Business hours
2638
+ * duration: '8h',
2639
+ * nodes: '0', // No disruption during business hours
2640
+ * reasons: ['Underutilized', 'Empty']
2641
+ * }]
2642
+ * });
2643
+ * ```
2644
+ *
2645
+ * @since 2.3.0
2646
+ */
2647
+ createKarpenterDisruption(spec: KarpenterAdvancedDisruption): {
2648
+ budgets?: KarpenterDisruptionBudget[];
2649
+ expireAfter?: string;
2650
+ consolidateAfter?: string;
2651
+ consolidationPolicy?: "WhenEmpty" | "WhenEmptyOrUnderutilized";
2652
+ };
2653
+ /**
2654
+ * Validate Karpenter NodeClaim specification
2655
+ */
2656
+ private validateKarpenterNodeClaimSpec;
2657
+ /**
2658
+ * Validate Karpenter scheduling specification
2659
+ */
2660
+ private validateKarpenterSchedulingSpec;
2661
+ private validateTopologySpreadConstraints;
2662
+ private validateSchedulingTolerations;
2663
+ /**
2664
+ * Validate Karpenter disruption specification
2665
+ */
2666
+ private validateKarpenterDisruptionSpec;
2667
+ private validateDisruptionDurations;
2668
+ private validateDisruptionBudgets;
2669
+ /**
2670
+ * Synthesizes the cdk8s app and writes a complete Helm chart
2671
+ *
2672
+ * Generates all Kubernetes manifests, applies Helm templating,
2673
+ * and writes the complete chart structure to the output directory.
2674
+ *
2675
+ * @param {string} outDir - Output directory for the Helm chart
2676
+ * @throws {Error} If synthesis or writing fails
2677
+ *
2678
+ * @example
2679
+ * ```typescript
2680
+ * rutter.write('./charts/my-app');
2681
+ * // Creates: ./charts/my-app/Chart.yaml, values.yaml, templates/, etc.
2682
+ * ```
2683
+ *
2684
+ * @since 1.0.0
1331
2685
  */
1332
2686
  write(outDir: string): void;
1333
2687
  }