-
Notifications
You must be signed in to change notification settings - Fork 3.9k
/
k8s-patch.ts
90 lines (80 loc) · 2.33 KB
/
k8s-patch.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import { Construct, CustomResource, Stack } from '@aws-cdk/core';
import { ICluster } from './cluster';
import { KubectlProvider } from './kubectl-provider';
/**
* Properties for KubernetesPatch
*/
export interface KubernetesPatchProps {
/**
* The cluster to apply the patch to.
* [disable-awslint:ref-via-interface]
*/
readonly cluster: ICluster;
/**
* The JSON object to pass to `kubectl patch` when the resource is created/updated.
*/
readonly applyPatch: { [key: string]: any };
/**
* The JSON object to pass to `kubectl patch` when the resource is removed.
*/
readonly restorePatch: { [key: string]: any };
/**
* The full name of the resource to patch (e.g. `deployment/coredns`).
*/
readonly resourceName: string;
/**
* The kubernetes API namespace
*
* @default "default"
*/
readonly resourceNamespace?: string;
/**
* The patch type to pass to `kubectl patch`.
* The default type used by `kubectl patch` is "strategic".
*
* @default PatchType.STRATEGIC
*/
readonly patchType?: PatchType;
}
/**
* Values for `kubectl patch` --type argument
*/
export enum PatchType {
/**
* JSON Patch, RFC 6902
*/
JSON = 'json',
/**
* JSON Merge patch
*/
MERGE = 'merge',
/**
* Strategic merge patch
*/
STRATEGIC = 'strategic'
}
/**
* A CloudFormation resource which applies/restores a JSON patch into a
* Kubernetes resource.
* @see https://kubernetes.io/docs/tasks/run-application/update-api-object-kubectl-patch/
*/
export class KubernetesPatch extends Construct {
constructor(scope: Construct, id: string, props: KubernetesPatchProps) {
super(scope, id);
const stack = Stack.of(this);
const provider = KubectlProvider.getOrCreate(scope, props.cluster);
new CustomResource(this, 'Resource', {
serviceToken: provider.serviceToken,
resourceType: 'Custom::AWSCDK-EKS-KubernetesPatch',
properties: {
ResourceName: props.resourceName,
ResourceNamespace: props.resourceNamespace ?? 'default',
ApplyPatchJson: stack.toJsonString(props.applyPatch),
RestorePatchJson: stack.toJsonString(props.restorePatch),
ClusterName: props.cluster.clusterName,
RoleArn: provider.roleArn, // TODO: bake into provider's environment
PatchType: props.patchType ?? PatchType.STRATEGIC,
},
});
}
}