cdk8s-plus-36 0.0.1 → 2.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.
- package/.jsii +105714 -0
- package/CODE_OF_CONDUCT.md +3 -0
- package/CONTRIBUTING.md +185 -0
- package/DCO +34 -0
- package/LICENSE +202 -0
- package/NOTICE +1 -0
- package/OWNERS.md +5 -0
- package/README.md +21 -34
- package/SECURITY.md +5 -0
- package/cdk8s.yaml +13 -0
- package/docs/java.md +156096 -0
- package/docs/plus/config-map.md +98 -0
- package/docs/plus/container.md +133 -0
- package/docs/plus/cronjob.md +67 -0
- package/docs/plus/deployment.md +232 -0
- package/docs/plus/horizontal-pod-autoscaler.md +226 -0
- package/docs/plus/ingress.md +68 -0
- package/docs/plus/job.md +48 -0
- package/docs/plus/namespace.md +58 -0
- package/docs/plus/network-policy.md +341 -0
- package/docs/plus/pod.md +455 -0
- package/docs/plus/pv.md +82 -0
- package/docs/plus/pvc.md +77 -0
- package/docs/plus/rbac.md +104 -0
- package/docs/plus/secret.md +32 -0
- package/docs/plus/service-account.md +35 -0
- package/docs/plus/service.md +41 -0
- package/docs/plus/volume.md +84 -0
- package/docs/python.md +167536 -0
- package/docs/typescript.md +145485 -0
- package/git-hooks/README.md +9 -0
- package/git-hooks/prepare-commit-msg +18 -0
- package/git-hooks/setup.sh +10 -0
- package/lib/_action.d.ts +26 -0
- package/lib/_action.js +72 -0
- package/lib/api-resource.d.ts +298 -0
- package/lib/api-resource.js +438 -0
- package/lib/base.d.ts +79 -0
- package/lib/base.js +124 -0
- package/lib/config-map.d.ts +126 -0
- package/lib/config-map.js +199 -0
- package/lib/container.d.ts +1057 -0
- package/lib/container.js +944 -0
- package/lib/cron-job.d.ts +138 -0
- package/lib/cron-job.js +170 -0
- package/lib/daemon-set.d.ts +45 -0
- package/lib/daemon-set.js +91 -0
- package/lib/deployment.d.ts +235 -0
- package/lib/deployment.js +274 -0
- package/lib/handler.d.ts +62 -0
- package/lib/handler.js +88 -0
- package/lib/horizontal-pod-autoscaler.d.ts +500 -0
- package/lib/horizontal-pod-autoscaler.js +629 -0
- package/lib/imports/k8s.d.ts +27283 -0
- package/lib/imports/k8s.js +20112 -0
- package/lib/index.d.ts +26 -0
- package/lib/index.js +66 -0
- package/lib/ingress.d.ts +230 -0
- package/lib/ingress.js +282 -0
- package/lib/job.d.ts +64 -0
- package/lib/job.js +101 -0
- package/lib/namespace.d.ts +128 -0
- package/lib/namespace.js +148 -0
- package/lib/network-policy.d.ts +311 -0
- package/lib/network-policy.js +383 -0
- package/lib/pod.d.ts +1097 -0
- package/lib/pod.js +1227 -0
- package/lib/probe.d.ts +181 -0
- package/lib/probe.js +124 -0
- package/lib/pv.d.ts +375 -0
- package/lib/pv.js +387 -0
- package/lib/pvc.d.ts +163 -0
- package/lib/pvc.js +204 -0
- package/lib/role-binding.d.ts +138 -0
- package/lib/role-binding.js +207 -0
- package/lib/role.d.ts +268 -0
- package/lib/role.js +441 -0
- package/lib/secret.d.ts +195 -0
- package/lib/secret.js +221 -0
- package/lib/service-account.d.ts +83 -0
- package/lib/service-account.js +148 -0
- package/lib/service.d.ts +289 -0
- package/lib/service.js +235 -0
- package/lib/stateful-set.d.ts +206 -0
- package/lib/stateful-set.js +291 -0
- package/lib/utils.d.ts +4 -0
- package/lib/utils.js +33 -0
- package/lib/volume.d.ts +577 -0
- package/lib/volume.js +410 -0
- package/lib/workload.d.ts +121 -0
- package/lib/workload.js +158 -0
- package/node_modules/balanced-match/.github/FUNDING.yml +2 -0
- package/node_modules/balanced-match/LICENSE.md +21 -0
- package/node_modules/balanced-match/README.md +97 -0
- package/node_modules/balanced-match/index.js +62 -0
- package/node_modules/balanced-match/package.json +48 -0
- package/node_modules/brace-expansion/.github/FUNDING.yml +2 -0
- package/node_modules/brace-expansion/LICENSE +21 -0
- package/node_modules/brace-expansion/README.md +157 -0
- package/node_modules/brace-expansion/index.js +394 -0
- package/node_modules/brace-expansion/package.json +49 -0
- package/node_modules/minimatch/LICENSE +15 -0
- package/node_modules/minimatch/README.md +491 -0
- package/node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts +2 -0
- package/node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts.map +1 -0
- package/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js +14 -0
- package/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js.map +1 -0
- package/node_modules/minimatch/dist/commonjs/ast.d.ts +20 -0
- package/node_modules/minimatch/dist/commonjs/ast.d.ts.map +1 -0
- package/node_modules/minimatch/dist/commonjs/ast.js +747 -0
- package/node_modules/minimatch/dist/commonjs/ast.js.map +1 -0
- package/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts +8 -0
- package/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts.map +1 -0
- package/node_modules/minimatch/dist/commonjs/brace-expressions.js +152 -0
- package/node_modules/minimatch/dist/commonjs/brace-expressions.js.map +1 -0
- package/node_modules/minimatch/dist/commonjs/escape.d.ts +12 -0
- package/node_modules/minimatch/dist/commonjs/escape.d.ts.map +1 -0
- package/node_modules/minimatch/dist/commonjs/escape.js +22 -0
- package/node_modules/minimatch/dist/commonjs/escape.js.map +1 -0
- package/node_modules/minimatch/dist/commonjs/index.d.ts +98 -0
- package/node_modules/minimatch/dist/commonjs/index.d.ts.map +1 -0
- package/node_modules/minimatch/dist/commonjs/index.js +1023 -0
- package/node_modules/minimatch/dist/commonjs/index.js.map +1 -0
- package/node_modules/minimatch/dist/commonjs/package.json +3 -0
- package/node_modules/minimatch/dist/commonjs/unescape.d.ts +17 -0
- package/node_modules/minimatch/dist/commonjs/unescape.d.ts.map +1 -0
- package/node_modules/minimatch/dist/commonjs/unescape.js +24 -0
- package/node_modules/minimatch/dist/commonjs/unescape.js.map +1 -0
- package/node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts +2 -0
- package/node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts.map +1 -0
- package/node_modules/minimatch/dist/esm/assert-valid-pattern.js +10 -0
- package/node_modules/minimatch/dist/esm/assert-valid-pattern.js.map +1 -0
- package/node_modules/minimatch/dist/esm/ast.d.ts +20 -0
- package/node_modules/minimatch/dist/esm/ast.d.ts.map +1 -0
- package/node_modules/minimatch/dist/esm/ast.js +743 -0
- package/node_modules/minimatch/dist/esm/ast.js.map +1 -0
- package/node_modules/minimatch/dist/esm/brace-expressions.d.ts +8 -0
- package/node_modules/minimatch/dist/esm/brace-expressions.d.ts.map +1 -0
- package/node_modules/minimatch/dist/esm/brace-expressions.js +148 -0
- package/node_modules/minimatch/dist/esm/brace-expressions.js.map +1 -0
- package/node_modules/minimatch/dist/esm/escape.d.ts +12 -0
- package/node_modules/minimatch/dist/esm/escape.d.ts.map +1 -0
- package/node_modules/minimatch/dist/esm/escape.js +18 -0
- package/node_modules/minimatch/dist/esm/escape.js.map +1 -0
- package/node_modules/minimatch/dist/esm/index.d.ts +98 -0
- package/node_modules/minimatch/dist/esm/index.d.ts.map +1 -0
- package/node_modules/minimatch/dist/esm/index.js +1007 -0
- package/node_modules/minimatch/dist/esm/index.js.map +1 -0
- package/node_modules/minimatch/dist/esm/package.json +3 -0
- package/node_modules/minimatch/dist/esm/unescape.d.ts +17 -0
- package/node_modules/minimatch/dist/esm/unescape.d.ts.map +1 -0
- package/node_modules/minimatch/dist/esm/unescape.js +20 -0
- package/node_modules/minimatch/dist/esm/unescape.js.map +1 -0
- package/node_modules/minimatch/package.json +82 -0
- package/package.json +172 -6
- package/rotate.md +82 -0
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { ApiObject, Duration } from 'cdk8s';
|
|
2
|
+
import { Construct } from 'constructs';
|
|
3
|
+
import { IScalable, ScalingTarget } from './horizontal-pod-autoscaler';
|
|
4
|
+
import * as k8s from './imports/k8s';
|
|
5
|
+
import * as ingress from './ingress';
|
|
6
|
+
import * as service from './service';
|
|
7
|
+
import * as workload from './workload';
|
|
8
|
+
/**
|
|
9
|
+
* Properties for `Deployment`.
|
|
10
|
+
*/
|
|
11
|
+
export interface DeploymentProps extends workload.WorkloadProps {
|
|
12
|
+
/**
|
|
13
|
+
* Number of desired pods.
|
|
14
|
+
*
|
|
15
|
+
* @default 2
|
|
16
|
+
*/
|
|
17
|
+
readonly replicas?: number;
|
|
18
|
+
/**
|
|
19
|
+
* Specifies the strategy used to replace old Pods by new ones.
|
|
20
|
+
*
|
|
21
|
+
* @default - RollingUpdate with maxSurge and maxUnavailable set to 25%.
|
|
22
|
+
*/
|
|
23
|
+
readonly strategy?: DeploymentStrategy;
|
|
24
|
+
/**
|
|
25
|
+
* Minimum duration for which a newly created pod should be ready without
|
|
26
|
+
* any of its container crashing, for it to be considered available.
|
|
27
|
+
*
|
|
28
|
+
* Zero means the pod will be considered available as soon as it is ready.
|
|
29
|
+
*
|
|
30
|
+
* @see https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#min-ready-seconds
|
|
31
|
+
* @default Duration.seconds(0)
|
|
32
|
+
*/
|
|
33
|
+
readonly minReady?: Duration;
|
|
34
|
+
/**
|
|
35
|
+
* The maximum duration for a deployment to make progress before it
|
|
36
|
+
* is considered to be failed. The deployment controller will continue
|
|
37
|
+
* to process failed deployments and a condition with a ProgressDeadlineExceeded
|
|
38
|
+
* reason will be surfaced in the deployment status.
|
|
39
|
+
*
|
|
40
|
+
* Note that progress will not be estimated during the time a deployment is paused.
|
|
41
|
+
*
|
|
42
|
+
* @see https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#progress-deadline-seconds
|
|
43
|
+
* @default Duration.seconds(600)
|
|
44
|
+
*/
|
|
45
|
+
readonly progressDeadline?: Duration;
|
|
46
|
+
/**
|
|
47
|
+
* Specify how many old ReplicaSets for this Deployment you want to retain. The rest will be garbage-collected in the background. By default, it is 10.
|
|
48
|
+
*
|
|
49
|
+
* @default 10
|
|
50
|
+
*/
|
|
51
|
+
readonly revisionHistoryLimit?: number;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Options for `Deployment.exposeViaService`.
|
|
55
|
+
*/
|
|
56
|
+
export interface DeploymentExposeViaServiceOptions {
|
|
57
|
+
/**
|
|
58
|
+
* The ports that the service should bind to.
|
|
59
|
+
*
|
|
60
|
+
* @default - extracted from the deployment.
|
|
61
|
+
*/
|
|
62
|
+
readonly ports?: service.ServicePort[];
|
|
63
|
+
/**
|
|
64
|
+
* The type of the exposed service.
|
|
65
|
+
*
|
|
66
|
+
* @default - ClusterIP.
|
|
67
|
+
*/
|
|
68
|
+
readonly serviceType?: service.ServiceType;
|
|
69
|
+
/**
|
|
70
|
+
* The name of the service to expose.
|
|
71
|
+
* If you'd like to expose the deployment multiple times,
|
|
72
|
+
* you must explicitly set a name starting from the second expose call.
|
|
73
|
+
*
|
|
74
|
+
* @default - auto generated.
|
|
75
|
+
*/
|
|
76
|
+
readonly name?: string;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Options for exposing a deployment via an ingress.
|
|
80
|
+
*/
|
|
81
|
+
export interface ExposeDeploymentViaIngressOptions extends DeploymentExposeViaServiceOptions, service.ExposeServiceViaIngressOptions {
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
*
|
|
85
|
+
* A Deployment provides declarative updates for Pods and ReplicaSets.
|
|
86
|
+
*
|
|
87
|
+
* You describe a desired state in a Deployment, and the Deployment Controller changes the actual
|
|
88
|
+
* state to the desired state at a controlled rate. You can define Deployments to create new ReplicaSets, or to remove
|
|
89
|
+
* existing Deployments and adopt all their resources with new Deployments.
|
|
90
|
+
*
|
|
91
|
+
* > Note: Do not manage ReplicaSets owned by a Deployment. Consider opening an issue in the main Kubernetes repository if your use case is not covered below.
|
|
92
|
+
*
|
|
93
|
+
* Use Case
|
|
94
|
+
*
|
|
95
|
+
* The following are typical use cases for Deployments:
|
|
96
|
+
*
|
|
97
|
+
* - Create a Deployment to rollout a ReplicaSet. The ReplicaSet creates Pods in the background.
|
|
98
|
+
* Check the status of the rollout to see if it succeeds or not.
|
|
99
|
+
* - Declare the new state of the Pods by updating the PodTemplateSpec of the Deployment.
|
|
100
|
+
* A new ReplicaSet is created and the Deployment manages moving the Pods from the old ReplicaSet to the new one at a controlled rate.
|
|
101
|
+
* Each new ReplicaSet updates the revision of the Deployment.
|
|
102
|
+
* - Rollback to an earlier Deployment revision if the current state of the Deployment is not stable.
|
|
103
|
+
* Each rollback updates the revision of the Deployment.
|
|
104
|
+
* - Scale up the Deployment to facilitate more load.
|
|
105
|
+
* - Pause the Deployment to apply multiple fixes to its PodTemplateSpec and then resume it to start a new rollout.
|
|
106
|
+
* - Use the status of the Deployment as an indicator that a rollout has stuck.
|
|
107
|
+
* - Clean up older ReplicaSets that you don't need anymore.
|
|
108
|
+
*
|
|
109
|
+
**/
|
|
110
|
+
export declare class Deployment extends workload.Workload implements IScalable {
|
|
111
|
+
/**
|
|
112
|
+
* Number of desired pods.
|
|
113
|
+
*/
|
|
114
|
+
readonly replicas?: number;
|
|
115
|
+
/**
|
|
116
|
+
* Minimum duration for which a newly created pod should be ready without
|
|
117
|
+
* any of its container crashing, for it to be considered available.
|
|
118
|
+
*/
|
|
119
|
+
readonly minReady: Duration;
|
|
120
|
+
/**
|
|
121
|
+
* The maximum duration for a deployment to make progress before it is considered to be failed.
|
|
122
|
+
*/
|
|
123
|
+
readonly progressDeadline: Duration;
|
|
124
|
+
readonly strategy: DeploymentStrategy;
|
|
125
|
+
/**
|
|
126
|
+
* Number of desired replicasets history.
|
|
127
|
+
*
|
|
128
|
+
* @default 10
|
|
129
|
+
*/
|
|
130
|
+
readonly revisionHistoryLimit: number;
|
|
131
|
+
/**
|
|
132
|
+
* @see base.Resource.apiObject
|
|
133
|
+
*/
|
|
134
|
+
protected readonly apiObject: ApiObject;
|
|
135
|
+
readonly resourceType = "deployments";
|
|
136
|
+
hasAutoscaler: boolean;
|
|
137
|
+
constructor(scope: Construct, id: string, props?: DeploymentProps);
|
|
138
|
+
/**
|
|
139
|
+
* Expose a deployment via a service.
|
|
140
|
+
*
|
|
141
|
+
* This is equivalent to running `kubectl expose deployment <deployment-name>`.
|
|
142
|
+
*
|
|
143
|
+
* @param options Options to determine details of the service and port exposed.
|
|
144
|
+
*/
|
|
145
|
+
exposeViaService(options?: DeploymentExposeViaServiceOptions): service.Service;
|
|
146
|
+
/**
|
|
147
|
+
* Expose a deployment via an ingress.
|
|
148
|
+
*
|
|
149
|
+
* This will first expose the deployment with a service, and then expose the service via an ingress.
|
|
150
|
+
*
|
|
151
|
+
* @param path The ingress path to register under.
|
|
152
|
+
* @param options Additional options.
|
|
153
|
+
*/
|
|
154
|
+
exposeViaIngress(path: string, options?: ExposeDeploymentViaIngressOptions): ingress.Ingress;
|
|
155
|
+
/**
|
|
156
|
+
* @internal
|
|
157
|
+
*/
|
|
158
|
+
_toKube(): k8s.DeploymentSpec;
|
|
159
|
+
/**
|
|
160
|
+
* @see IScalable.markHasAutoscaler()
|
|
161
|
+
*/
|
|
162
|
+
markHasAutoscaler(): void;
|
|
163
|
+
/**
|
|
164
|
+
* @see IScalable.toScalingTarget()
|
|
165
|
+
*/
|
|
166
|
+
toScalingTarget(): ScalingTarget;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Options for `DeploymentStrategy.rollingUpdate`.
|
|
170
|
+
*/
|
|
171
|
+
export interface DeploymentStrategyRollingUpdateOptions {
|
|
172
|
+
/**
|
|
173
|
+
* The maximum number of pods that can be scheduled above the desired number of pods.
|
|
174
|
+
* Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%).
|
|
175
|
+
* Absolute number is calculated from percentage by rounding up.
|
|
176
|
+
* This can not be 0 if `maxUnavailable` is 0.
|
|
177
|
+
*
|
|
178
|
+
* Example: when this is set to 30%, the new ReplicaSet can be scaled up immediately when the rolling update
|
|
179
|
+
* starts, such that the total number of old and new pods do not exceed 130% of desired pods.
|
|
180
|
+
* Once old pods have been killed, new ReplicaSet can be scaled up further, ensuring that
|
|
181
|
+
* total number of pods running at any time during the update is at most 130% of desired pods.
|
|
182
|
+
*
|
|
183
|
+
* @default '25%'
|
|
184
|
+
*/
|
|
185
|
+
readonly maxSurge?: PercentOrAbsolute;
|
|
186
|
+
/**
|
|
187
|
+
* The maximum number of pods that can be unavailable during the update.
|
|
188
|
+
* Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%).
|
|
189
|
+
* Absolute number is calculated from percentage by rounding down.
|
|
190
|
+
* This can not be 0 if `maxSurge` is 0.
|
|
191
|
+
*
|
|
192
|
+
* Example: when this is set to 30%, the old ReplicaSet can be scaled down to 70% of desired
|
|
193
|
+
* pods immediately when the rolling update starts. Once new pods are ready, old ReplicaSet can
|
|
194
|
+
* be scaled down further, followed by scaling up the new ReplicaSet, ensuring that the total
|
|
195
|
+
* number of pods available at all times during the update is at least 70% of desired pods.
|
|
196
|
+
*
|
|
197
|
+
* @default '25%'
|
|
198
|
+
*/
|
|
199
|
+
readonly maxUnavailable?: PercentOrAbsolute;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Union like class repsenting either a ration in
|
|
203
|
+
* percents or an absolute number.
|
|
204
|
+
*/
|
|
205
|
+
export declare class PercentOrAbsolute {
|
|
206
|
+
readonly value: any;
|
|
207
|
+
/**
|
|
208
|
+
* Percent ratio.
|
|
209
|
+
*/
|
|
210
|
+
static percent(percent: number): PercentOrAbsolute;
|
|
211
|
+
/**
|
|
212
|
+
* Absolute number.
|
|
213
|
+
*/
|
|
214
|
+
static absolute(num: number): PercentOrAbsolute;
|
|
215
|
+
private constructor();
|
|
216
|
+
isZero(): boolean;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Deployment strategies.
|
|
220
|
+
*/
|
|
221
|
+
export declare class DeploymentStrategy {
|
|
222
|
+
private readonly strategy;
|
|
223
|
+
/**
|
|
224
|
+
* All existing Pods are killed before new ones are created.
|
|
225
|
+
*
|
|
226
|
+
* @see https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#recreate-deployment
|
|
227
|
+
*/
|
|
228
|
+
static recreate(): DeploymentStrategy;
|
|
229
|
+
static rollingUpdate(options?: DeploymentStrategyRollingUpdateOptions): DeploymentStrategy;
|
|
230
|
+
private constructor();
|
|
231
|
+
/**
|
|
232
|
+
* @internal
|
|
233
|
+
*/
|
|
234
|
+
_toKube(): k8s.DeploymentStrategy;
|
|
235
|
+
}
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.DeploymentStrategy = exports.PercentOrAbsolute = exports.Deployment = void 0;
|
|
37
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
38
|
+
const cdk8s_1 = require("cdk8s");
|
|
39
|
+
const container = __importStar(require("./container"));
|
|
40
|
+
const k8s = __importStar(require("./imports/k8s"));
|
|
41
|
+
const service = __importStar(require("./service"));
|
|
42
|
+
const workload = __importStar(require("./workload"));
|
|
43
|
+
/**
|
|
44
|
+
*
|
|
45
|
+
* A Deployment provides declarative updates for Pods and ReplicaSets.
|
|
46
|
+
*
|
|
47
|
+
* You describe a desired state in a Deployment, and the Deployment Controller changes the actual
|
|
48
|
+
* state to the desired state at a controlled rate. You can define Deployments to create new ReplicaSets, or to remove
|
|
49
|
+
* existing Deployments and adopt all their resources with new Deployments.
|
|
50
|
+
*
|
|
51
|
+
* > Note: Do not manage ReplicaSets owned by a Deployment. Consider opening an issue in the main Kubernetes repository if your use case is not covered below.
|
|
52
|
+
*
|
|
53
|
+
* Use Case
|
|
54
|
+
*
|
|
55
|
+
* The following are typical use cases for Deployments:
|
|
56
|
+
*
|
|
57
|
+
* - Create a Deployment to rollout a ReplicaSet. The ReplicaSet creates Pods in the background.
|
|
58
|
+
* Check the status of the rollout to see if it succeeds or not.
|
|
59
|
+
* - Declare the new state of the Pods by updating the PodTemplateSpec of the Deployment.
|
|
60
|
+
* A new ReplicaSet is created and the Deployment manages moving the Pods from the old ReplicaSet to the new one at a controlled rate.
|
|
61
|
+
* Each new ReplicaSet updates the revision of the Deployment.
|
|
62
|
+
* - Rollback to an earlier Deployment revision if the current state of the Deployment is not stable.
|
|
63
|
+
* Each rollback updates the revision of the Deployment.
|
|
64
|
+
* - Scale up the Deployment to facilitate more load.
|
|
65
|
+
* - Pause the Deployment to apply multiple fixes to its PodTemplateSpec and then resume it to start a new rollout.
|
|
66
|
+
* - Use the status of the Deployment as an indicator that a rollout has stuck.
|
|
67
|
+
* - Clean up older ReplicaSets that you don't need anymore.
|
|
68
|
+
*
|
|
69
|
+
**/
|
|
70
|
+
class Deployment extends workload.Workload {
|
|
71
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk8s-plus-36.Deployment", version: "2.0.0" };
|
|
72
|
+
/**
|
|
73
|
+
* Number of desired pods.
|
|
74
|
+
*/
|
|
75
|
+
replicas;
|
|
76
|
+
/**
|
|
77
|
+
* Minimum duration for which a newly created pod should be ready without
|
|
78
|
+
* any of its container crashing, for it to be considered available.
|
|
79
|
+
*/
|
|
80
|
+
minReady;
|
|
81
|
+
/**
|
|
82
|
+
* The maximum duration for a deployment to make progress before it is considered to be failed.
|
|
83
|
+
*/
|
|
84
|
+
progressDeadline;
|
|
85
|
+
/*
|
|
86
|
+
* The upgrade strategy of this deployment.
|
|
87
|
+
*/
|
|
88
|
+
strategy;
|
|
89
|
+
/**
|
|
90
|
+
* Number of desired replicasets history.
|
|
91
|
+
*
|
|
92
|
+
* @default 10
|
|
93
|
+
*/
|
|
94
|
+
revisionHistoryLimit;
|
|
95
|
+
/**
|
|
96
|
+
* @see base.Resource.apiObject
|
|
97
|
+
*/
|
|
98
|
+
apiObject;
|
|
99
|
+
resourceType = 'deployments';
|
|
100
|
+
hasAutoscaler = false;
|
|
101
|
+
constructor(scope, id, props = {}) {
|
|
102
|
+
super(scope, id, props);
|
|
103
|
+
this.apiObject = new k8s.KubeDeployment(this, 'Resource', {
|
|
104
|
+
metadata: props.metadata,
|
|
105
|
+
spec: cdk8s_1.Lazy.any({ produce: () => this._toKube() }),
|
|
106
|
+
});
|
|
107
|
+
this.minReady = props.minReady ?? cdk8s_1.Duration.seconds(0);
|
|
108
|
+
this.progressDeadline = props.progressDeadline ?? cdk8s_1.Duration.seconds(600);
|
|
109
|
+
if (this.progressDeadline.toSeconds() <= this.minReady.toSeconds()) {
|
|
110
|
+
throw new Error(`'progressDeadline' (${this.progressDeadline.toSeconds()}s) must be greater than 'minReady' (${this.minReady.toSeconds()}s)`);
|
|
111
|
+
}
|
|
112
|
+
this.replicas = props.replicas;
|
|
113
|
+
this.strategy = props.strategy ?? DeploymentStrategy.rollingUpdate();
|
|
114
|
+
this.revisionHistoryLimit = props.revisionHistoryLimit ?? 10;
|
|
115
|
+
if (this.isolate) {
|
|
116
|
+
this.connections.isolate();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Expose a deployment via a service.
|
|
121
|
+
*
|
|
122
|
+
* This is equivalent to running `kubectl expose deployment <deployment-name>`.
|
|
123
|
+
*
|
|
124
|
+
* @param options Options to determine details of the service and port exposed.
|
|
125
|
+
*/
|
|
126
|
+
exposeViaService(options = {}) {
|
|
127
|
+
const myPorts = container.extractContainerPorts(this);
|
|
128
|
+
const myPortNumbers = myPorts.map(p => p.number);
|
|
129
|
+
const ports = options.ports ?? myPorts.map(p => ({
|
|
130
|
+
port: p.number, targetPort: p.number, protocol: p.protocol, name: p.name,
|
|
131
|
+
}));
|
|
132
|
+
if (ports.length === 0) {
|
|
133
|
+
throw new Error(`Unable to expose deployment ${this.name} via a service: `
|
|
134
|
+
+ 'Deployment port cannot be determined.'
|
|
135
|
+
+ 'Either pass \'ports\', or configure ports on the containers of the deployment');
|
|
136
|
+
}
|
|
137
|
+
const portNames = ports.map(p => p.name);
|
|
138
|
+
if (ports.length > 1 && portNames.includes(undefined)) {
|
|
139
|
+
throw new Error(`Unable to expose deployment ${this.name} via a service: `
|
|
140
|
+
+ 'When using multiple ports for a service, all ports must have port names so they are unambiguous.');
|
|
141
|
+
}
|
|
142
|
+
// validate the ports are owned by our containers
|
|
143
|
+
for (const port of ports) {
|
|
144
|
+
const targetPort = port.targetPort ?? port.port;
|
|
145
|
+
if (!myPortNumbers.includes(targetPort)) {
|
|
146
|
+
throw new Error(`Unable to expose deployment ${this.name} via a service: Port ${targetPort} is not exposed by any container`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const metadata = { namespace: this.metadata.namespace };
|
|
150
|
+
if (options.name) {
|
|
151
|
+
metadata.name = options.name;
|
|
152
|
+
}
|
|
153
|
+
return new service.Service(this, `${options.name ?? ''}Service`, {
|
|
154
|
+
selector: this,
|
|
155
|
+
ports,
|
|
156
|
+
metadata,
|
|
157
|
+
type: options.serviceType ?? service.ServiceType.CLUSTER_IP,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Expose a deployment via an ingress.
|
|
162
|
+
*
|
|
163
|
+
* This will first expose the deployment with a service, and then expose the service via an ingress.
|
|
164
|
+
*
|
|
165
|
+
* @param path The ingress path to register under.
|
|
166
|
+
* @param options Additional options.
|
|
167
|
+
*/
|
|
168
|
+
exposeViaIngress(path, options = {}) {
|
|
169
|
+
const ser = this.exposeViaService(options);
|
|
170
|
+
return ser.exposeViaIngress(path, options);
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* @internal
|
|
174
|
+
*/
|
|
175
|
+
_toKube() {
|
|
176
|
+
return {
|
|
177
|
+
replicas: this.hasAutoscaler ? undefined : (this.replicas ?? 2),
|
|
178
|
+
minReadySeconds: this.minReady.toSeconds(),
|
|
179
|
+
progressDeadlineSeconds: this.progressDeadline.toSeconds(),
|
|
180
|
+
template: {
|
|
181
|
+
metadata: this.podMetadata.toJson(),
|
|
182
|
+
spec: this._toPodSpec(),
|
|
183
|
+
},
|
|
184
|
+
selector: this._toLabelSelector(),
|
|
185
|
+
strategy: this.strategy._toKube(),
|
|
186
|
+
revisionHistoryLimit: this.revisionHistoryLimit,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* @see IScalable.markHasAutoscaler()
|
|
191
|
+
*/
|
|
192
|
+
markHasAutoscaler() {
|
|
193
|
+
this.hasAutoscaler = true;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* @see IScalable.toScalingTarget()
|
|
197
|
+
*/
|
|
198
|
+
toScalingTarget() {
|
|
199
|
+
return {
|
|
200
|
+
kind: this.apiObject.kind,
|
|
201
|
+
apiVersion: this.apiObject.apiVersion,
|
|
202
|
+
name: this.name,
|
|
203
|
+
containers: this.containers,
|
|
204
|
+
replicas: this.replicas,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
exports.Deployment = Deployment;
|
|
209
|
+
/**
|
|
210
|
+
* Union like class repsenting either a ration in
|
|
211
|
+
* percents or an absolute number.
|
|
212
|
+
*/
|
|
213
|
+
class PercentOrAbsolute {
|
|
214
|
+
value;
|
|
215
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk8s-plus-36.PercentOrAbsolute", version: "2.0.0" };
|
|
216
|
+
/**
|
|
217
|
+
* Percent ratio.
|
|
218
|
+
*/
|
|
219
|
+
static percent(percent) {
|
|
220
|
+
return new PercentOrAbsolute(`${percent}%`);
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Absolute number.
|
|
224
|
+
*/
|
|
225
|
+
static absolute(num) {
|
|
226
|
+
return new PercentOrAbsolute(num);
|
|
227
|
+
}
|
|
228
|
+
constructor(value) {
|
|
229
|
+
this.value = value;
|
|
230
|
+
}
|
|
231
|
+
isZero() {
|
|
232
|
+
return this.value === PercentOrAbsolute.absolute(0).value || this.value === PercentOrAbsolute.percent(0).value;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
exports.PercentOrAbsolute = PercentOrAbsolute;
|
|
236
|
+
/**
|
|
237
|
+
* Deployment strategies.
|
|
238
|
+
*/
|
|
239
|
+
class DeploymentStrategy {
|
|
240
|
+
strategy;
|
|
241
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk8s-plus-36.DeploymentStrategy", version: "2.0.0" };
|
|
242
|
+
/**
|
|
243
|
+
* All existing Pods are killed before new ones are created.
|
|
244
|
+
*
|
|
245
|
+
* @see https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#recreate-deployment
|
|
246
|
+
*/
|
|
247
|
+
static recreate() {
|
|
248
|
+
return new DeploymentStrategy({
|
|
249
|
+
type: 'Recreate',
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
static rollingUpdate(options = {}) {
|
|
253
|
+
const maxSurge = options.maxSurge ?? PercentOrAbsolute.percent(25);
|
|
254
|
+
const maxUnavailable = options.maxUnavailable ?? PercentOrAbsolute.percent(25);
|
|
255
|
+
if (maxSurge.isZero() && maxUnavailable.isZero()) {
|
|
256
|
+
throw new Error('\'maxSurge\' and \'maxUnavailable\' cannot be both zero');
|
|
257
|
+
}
|
|
258
|
+
return new DeploymentStrategy({
|
|
259
|
+
type: 'RollingUpdate',
|
|
260
|
+
rollingUpdate: { maxSurge, maxUnavailable },
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
constructor(strategy) {
|
|
264
|
+
this.strategy = strategy;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* @internal
|
|
268
|
+
*/
|
|
269
|
+
_toKube() {
|
|
270
|
+
return this.strategy;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
exports.DeploymentStrategy = DeploymentStrategy;
|
|
274
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95bWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9kZXBsb3ltZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpQ0FBa0Q7QUFFbEQsdURBQXlDO0FBRXpDLG1EQUFxQztBQUVyQyxtREFBcUM7QUFDckMscURBQXVDO0FBc0Z2Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUFDSCxNQUFhLFVBQVcsU0FBUSxRQUFRLENBQUMsUUFBUTs7SUFFL0M7O09BRUc7SUFDYSxRQUFRLENBQVU7SUFFbEM7OztPQUdHO0lBQ2EsUUFBUSxDQUFXO0lBRW5DOztPQUVHO0lBQ2EsZ0JBQWdCLENBQVc7SUFFM0M7O09BRUc7SUFDYSxRQUFRLENBQXFCO0lBRTdDOzs7O09BSUc7SUFFTSxvQkFBb0IsQ0FBUztJQUN0Qzs7T0FFRztJQUNnQixTQUFTLENBQVk7SUFFeEIsWUFBWSxHQUFHLGFBQWEsQ0FBQztJQUV0QyxhQUFhLEdBQUcsS0FBSyxDQUFDO0lBRTdCLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsUUFBeUIsRUFBRTtRQUNuRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV4QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQ3hELFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtZQUN4QixJQUFJLEVBQUUsWUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztTQUNsRCxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLElBQUksZ0JBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFD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LENBQUM7SUFDTCxDQUFDO0lBRU0sTUFBTSxDQUFDLGFBQWEsQ0FBQyxVQUFrRCxFQUFFO1FBRTlFLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLElBQUksaUJBQWlCLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxjQUFjLElBQUksaUJBQWlCLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRS9FLElBQUksUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLGNBQWMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1lBQ2pELE1BQU0sSUFBSSxLQUFLLENBQUMseURBQXlELENBQUMsQ0FBQztRQUM3RSxDQUFDO1FBRUQsT0FBTyxJQUFJLGtCQUFrQixDQUFDO1lBQzVCLElBQUksRUFBRSxlQUFlO1lBQ3JCLGFBQWEsRUFBRSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUU7U0FDNUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFlBQXFDLFFBQWdDO1FBQWhDLGFBQVEsR0FBUixRQUFRLENBQXdCO0lBQUcsQ0FBQztJQUV6RTs7T0FFRztJQUNJLE9BQU87UUFDWixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQzs7QUFuQ0gsZ0RBcUNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXBpT2JqZWN0LCBMYXp5LCBEdXJhdGlvbiB9IGZyb20gJ2NkazhzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0ICogYXMgY29udGFpbmVyIGZyb20gJy4vY29udGFpbmVyJztcbmltcG9ydCB7IElTY2FsYWJsZSwgU2NhbGluZ1RhcmdldCB9IGZyb20gJy4vaG9yaXpvbnRhbC1wb2QtYXV0b3NjYWxlcic7XG5pbXBvcnQgKiBhcyBrOHMgZnJvbSAnLi9pbXBvcnRzL2s4cyc7XG5pbXBvcnQgKiBhcyBpbmdyZXNzIGZyb20gJy4vaW5ncmVzcyc7XG5pbXBvcnQgKiBhcyBzZXJ2aWNlIGZyb20gJy4vc2VydmljZSc7XG5pbXBvcnQgKiBhcyB3b3JrbG9hZCBmcm9tICcuL3dvcmtsb2FkJztcblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBgRGVwbG95bWVudGAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVwbG95bWVudFByb3BzIGV4dGVuZHMgd29ya2xvYWQuV29ya2xvYWRQcm9wcyB7XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiBkZXNpcmVkIHBvZHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IDJcbiAgICovXG4gIHJlYWRvbmx5IHJlcGxpY2FzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIHN0cmF0ZWd5IHVzZWQgdG8gcmVwbGFjZSBvbGQgUG9kcyBieSBuZXcgb25lcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBSb2xsaW5nVXBkYXRlIHdpdGggbWF4U3VyZ2UgYW5kIG1heFVuYXZhaWxhYmxlIHNldCB0byAyNSUuXG4gICAqL1xuICByZWFkb25seSBzdHJhdGVneT86IERlcGxveW1lbnRTdHJhdGVneTtcblxuICAvKipcbiAgICogTWluaW11bSBkdXJhdGlvbiBmb3Igd2hpY2ggYSBuZXdseSBjcmVhdGVkIHBvZCBzaG91bGQgYmUgcmVhZHkgd2l0aG91dFxuICAgKiBhbnkgb2YgaXRzIGNvbnRhaW5lciBjcmFzaGluZywgZm9yIGl0IHRvIGJlIGNvbnNpZGVyZWQgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBaZXJvIG1lYW5zIHRoZSBwb2Qgd2lsbCBiZSBjb25zaWRlcmVkIGF2YWlsYWJsZSBhcyBzb29uIGFzIGl0IGlzIHJlYWR5LlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL3dvcmtsb2Fkcy9jb250cm9sbGVycy9kZXBsb3ltZW50LyNtaW4tcmVhZHktc2Vjb25kc1xuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5zZWNvbmRzKDApXG4gICAqL1xuICByZWFkb25seSBtaW5SZWFkeT86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBkdXJhdGlvbiBmb3IgYSBkZXBsb3ltZW50IHRvIG1ha2UgcHJvZ3Jlc3MgYmVmb3JlIGl0XG4gICAqIGlzIGNvbnNpZGVyZWQgdG8gYmUgZmFpbGVkLiBUaGUgZGVwbG95bWVudCBjb250cm9sbGVyIHdpbGwgY29udGludWVcbiAgICogdG8gcHJvY2VzcyBmYWlsZWQgZGVwbG95bWVudHMgYW5kIGEgY29uZGl0aW9uIHdpdGggYSBQcm9ncmVzc0RlYWRsaW5lRXhjZWVkZWRcbiAgICogcmVhc29uIHdpbGwgYmUgc3VyZmFjZWQgaW4gdGhlIGRlcGxveW1lbnQgc3RhdHVzLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgcHJvZ3Jlc3Mgd2lsbCBub3QgYmUgZXN0aW1hdGVkIGR1cmluZyB0aGUgdGltZSBhIGRlcGxveW1lbnQgaXMgcGF1c2VkLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL3dvcmtsb2Fkcy9jb250cm9sbGVycy9kZXBsb3ltZW50LyNwcm9ncmVzcy1kZWFkbGluZS1zZWNvbmRzXG4gICAqIEBkZWZhdWx0IER1cmF0aW9uLnNlY29uZHMoNjAwKVxuICAgKi9cbiAgcmVhZG9ubHkgcHJvZ3Jlc3NEZWFkbGluZT86IER1cmF0aW9uO1xuICAvKipcbiAgICogU3BlY2lmeSBob3cgbWFueSBvbGQgUmVwbGljYVNldHMgZm9yIHRoaXMgRGVwbG95bWVudCB5b3Ugd2FudCB0byByZXRhaW4uIFRoZSByZXN0IHdpbGwgYmUgZ2FyYmFnZS1jb2xsZWN0ZWQgaW4gdGhlIGJhY2tncm91bmQuIEJ5IGRlZmF1bHQsIGl0IGlzIDEwLlxuICAgKlxuICAgKiBAZGVmYXVsdCAxMFxuICAgKi9cbiAgcmVhZG9ubHkgcmV2aXNpb25IaXN0b3J5TGltaXQ/OiBudW1iZXI7XG5cbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBgRGVwbG95bWVudC5leHBvc2VWaWFTZXJ2aWNlYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBsb3ltZW50RXhwb3NlVmlhU2VydmljZU9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHBvcnRzIHRoYXQgdGhlIHNlcnZpY2Ugc2hvdWxkIGJpbmQgdG8uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZXh0cmFjdGVkIGZyb20gdGhlIGRlcGxveW1lbnQuXG4gICAqL1xuICByZWFkb25seSBwb3J0cz86IHNlcnZpY2UuU2VydmljZVBvcnRbXTtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIGV4cG9zZWQgc2VydmljZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBDbHVzdGVySVAuXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlVHlwZT86IHNlcnZpY2UuU2VydmljZVR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIHRvIGV4cG9zZS5cbiAgICogSWYgeW91J2QgbGlrZSB0byBleHBvc2UgdGhlIGRlcGxveW1lbnQgbXVsdGlwbGUgdGltZXMsXG4gICAqIHlvdSBtdXN0IGV4cGxpY2l0bHkgc2V0IGEgbmFtZSBzdGFydGluZyBmcm9tIHRoZSBzZWNvbmQgZXhwb3NlIGNhbGwuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYXV0byBnZW5lcmF0ZWQuXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGV4cG9zaW5nIGEgZGVwbG95bWVudCB2aWEgYW4gaW5ncmVzcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHBvc2VEZXBsb3ltZW50VmlhSW5ncmVzc09wdGlvbnMgZXh0ZW5kcyBEZXBsb3ltZW50RXhwb3NlVmlhU2VydmljZU9wdGlvbnMsIHNlcnZpY2UuRXhwb3NlU2VydmljZVZpYUluZ3Jlc3NPcHRpb25zIHt9XG5cbi8qKlxuKlxuKiBBIERlcGxveW1lbnQgcHJvdmlkZXMgZGVjbGFyYXRpdmUgdXBkYXRlcyBmb3IgUG9kcyBhbmQgUmVwbGljYVNldHMuXG4qXG4qIFlvdSBkZXNjcmliZSBhIGRlc2lyZWQgc3RhdGUgaW4gYSBEZXBsb3ltZW50LCBhbmQgdGhlIERlcGxveW1lbnQgQ29udHJvbGxlciBjaGFuZ2VzIHRoZSBhY3R1YWxcbiogc3RhdGUgdG8gdGhlIGRlc2lyZWQgc3RhdGUgYXQgYSBjb250cm9sbGVkIHJhdGUuIFlvdSBjYW4gZGVmaW5lIERlcGxveW1lbnRzIHRvIGNyZWF0ZSBuZXcgUmVwbGljYVNldHMsIG9yIHRvIHJlbW92ZVxuKiBleGlzdGluZyBEZXBsb3ltZW50cyBhbmQgYWRvcHQgYWxsIHRoZWlyIHJlc291cmNlcyB3aXRoIG5ldyBEZXBsb3ltZW50cy5cbipcbiogPiBOb3RlOiBEbyBub3QgbWFuYWdlIFJlcGxpY2FTZXRzIG93bmVkIGJ5IGEgRGVwbG95bWVudC4gQ29uc2lkZXIgb3BlbmluZyBhbiBpc3N1ZSBpbiB0aGUgbWFpbiBLdWJlcm5ldGVzIHJlcG9zaXRvcnkgaWYgeW91ciB1c2UgY2FzZSBpcyBub3QgY292ZXJlZCBiZWxvdy5cbipcbiogVXNlIENhc2VcbipcbiogVGhlIGZvbGxvd2luZyBhcmUgdHlwaWNhbCB1c2UgY2FzZXMgZm9yIERlcGxveW1lbnRzOlxuKlxuKiAtIENyZWF0ZSBhIERlcGxveW1lbnQgdG8gcm9sbG91dCBhIFJlcGxpY2FTZXQuIFRoZSBSZXBsaWNhU2V0IGNyZWF0ZXMgUG9kcyBpbiB0aGUgYmFja2dyb3VuZC5cbiogICBDaGVjayB0aGUgc3RhdHVzIG9mIHRoZSByb2xsb3V0IHRvIHNlZSBpZiBpdCBzdWNjZWVkcyBvciBub3QuXG4qIC0gRGVjbGFyZSB0aGUgbmV3IHN0YXRlIG9mIHRoZSBQb2RzIGJ5IHVwZGF0aW5nIHRoZSBQb2RUZW1wbGF0ZVNwZWMgb2YgdGhlIERlcGxveW1lbnQuXG4qICAgQSBuZXcgUmVwbGljYVNldCBpcyBjcmVhdGVkIGFuZCB0aGUgRGVwbG95bWVudCBtYW5hZ2VzIG1vdmluZyB0aGUgUG9kcyBmcm9tIHRoZSBvbGQgUmVwbGljYVNldCB0byB0aGUgbmV3IG9uZSBhdCBhIGNvbnRyb2xsZWQgcmF0ZS5cbiogICBFYWNoIG5ldyBSZXBsaWNhU2V0IHVwZGF0ZXMgdGhlIHJldmlzaW9uIG9mIHRoZSBEZXBsb3ltZW50LlxuKiAtIFJvbGxiYWNrIHRvIGFuIGVhcmxpZXIgRGVwbG95bWVudCByZXZpc2lvbiBpZiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgRGVwbG95bWVudCBpcyBub3Qgc3RhYmxlLlxuKiAgIEVhY2ggcm9sbGJhY2sgdXBkYXRlcyB0aGUgcmV2aXNpb24gb2YgdGhlIERlcGxveW1lbnQuXG4qIC0gU2NhbGUgdXAgdGhlIERlcGxveW1lbnQgdG8gZmFjaWxpdGF0ZSBtb3JlIGxvYWQuXG4qIC0gUGF1c2UgdGhlIERlcGxveW1lbnQgdG8gYXBwbHkgbXVsdGlwbGUgZml4ZXMgdG8gaXRzIFBvZFRlbXBsYXRlU3BlYyBhbmQgdGhlbiByZXN1bWUgaXQgdG8gc3RhcnQgYSBuZXcgcm9sbG91dC5cbiogLSBVc2UgdGhlIHN0YXR1cyBvZiB0aGUgRGVwbG95bWVudCBhcyBhbiBpbmRpY2F0b3IgdGhhdCBhIHJvbGxvdXQgaGFzIHN0dWNrLlxuKiAtIENsZWFuIHVwIG9sZGVyIFJlcGxpY2FTZXRzIHRoYXQgeW91IGRvbid0IG5lZWQgYW55bW9yZS5cbipcbioqL1xuZXhwb3J0IGNsYXNzIERlcGxveW1lbnQgZXh0ZW5kcyB3b3JrbG9hZC5Xb3JrbG9hZCBpbXBsZW1lbnRzIElTY2FsYWJsZSB7XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiBkZXNpcmVkIHBvZHMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVwbGljYXM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE1pbmltdW0gZHVyYXRpb24gZm9yIHdoaWNoIGEgbmV3bHkgY3JlYXRlZCBwb2Qgc2hvdWxkIGJlIHJlYWR5IHdpdGhvdXRcbiAgICogYW55IG9mIGl0cyBjb250YWluZXIgY3Jhc2hpbmcsIGZvciBpdCB0byBiZSBjb25zaWRlcmVkIGF2YWlsYWJsZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtaW5SZWFkeTogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIGR1cmF0aW9uIGZvciBhIGRlcGxveW1lbnQgdG8gbWFrZSBwcm9ncmVzcyBiZWZvcmUgaXQgaXMgY29uc2lkZXJlZCB0byBiZSBmYWlsZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHJvZ3Jlc3NEZWFkbGluZTogRHVyYXRpb247XG5cbiAgLypcbiAgICogVGhlIHVwZ3JhZGUgc3RyYXRlZ3kgb2YgdGhpcyBkZXBsb3ltZW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN0cmF0ZWd5OiBEZXBsb3ltZW50U3RyYXRlZ3k7XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiBkZXNpcmVkIHJlcGxpY2FzZXRzIGhpc3RvcnkuXG4gICAqXG4gICAqIEBkZWZhdWx0IDEwXG4gICAqL1xuXG4gIHJlYWRvbmx5IHJldmlzaW9uSGlzdG9yeUxpbWl0OiBudW1iZXI7XG4gIC8qKlxuICAgKiBAc2VlIGJhc2UuUmVzb3VyY2UuYXBpT2JqZWN0XG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXBpT2JqZWN0OiBBcGlPYmplY3Q7XG5cbiAgcHVibGljIHJlYWRvbmx5IHJlc291cmNlVHlwZSA9ICdkZXBsb3ltZW50cyc7XG5cbiAgcHVibGljIGhhc0F1dG9zY2FsZXIgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogRGVwbG95bWVudFByb3BzID0ge30pIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIHRoaXMuYXBpT2JqZWN0ID0gbmV3IGs4cy5LdWJlRGVwbG95bWVudCh0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICBtZXRhZGF0YTogcHJvcHMubWV0YWRhdGEsXG4gICAgICBzcGVjOiBMYXp5LmFueSh7IHByb2R1Y2U6ICgpID0+IHRoaXMuX3RvS3ViZSgpIH0pLFxuICAgIH0pO1xuXG4gICAgdGhpcy5taW5SZWFkeSA9IHByb3BzLm1pblJlYWR5ID8/IER1cmF0aW9uLnNlY29uZHMoMCk7XG4gICAgdGhpcy5wcm9ncmVzc0RlYWRsaW5lID0gcHJvcHMucHJvZ3Jlc3NEZWFkbGluZSA/PyBEdXJhdGlvbi5zZWNvbmRzKDYwMCk7XG5cbiAgICBpZiAodGhpcy5wcm9ncmVzc0RlYWRsaW5lLnRvU2Vjb25kcygpIDw9IHRoaXMubWluUmVhZHkudG9TZWNvbmRzKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJ3Byb2dyZXNzRGVhZGxpbmUnICgke3RoaXMucHJvZ3Jlc3NEZWFkbGluZS50b1NlY29uZHMoKX1zKSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAnbWluUmVhZHknICgke3RoaXMubWluUmVhZHkudG9TZWNvbmRzKCl9cylgKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlcGxpY2FzID0gcHJvcHMucmVwbGljYXM7XG4gICAgdGhpcy5zdHJhdGVneSA9IHByb3BzLnN0cmF0ZWd5ID8/IERlcGxveW1lbnRTdHJhdGVneS5yb2xsaW5nVXBkYXRlKCk7XG4gICAgdGhpcy5yZXZpc2lvbkhpc3RvcnlMaW1pdCA9IHByb3BzLnJldmlzaW9uSGlzdG9yeUxpbWl0ID8/IDEwO1xuXG4gICAgaWYgKHRoaXMuaXNvbGF0ZSkge1xuICAgICAgdGhpcy5jb25uZWN0aW9ucy5pc29sYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9zZSBhIGRlcGxveW1lbnQgdmlhIGEgc2VydmljZS5cbiAgICpcbiAgICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIHJ1bm5pbmcgYGt1YmVjdGwgZXhwb3NlIGRlcGxveW1lbnQgPGRlcGxveW1lbnQtbmFtZT5gLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIHRvIGRldGVybWluZSBkZXRhaWxzIG9mIHRoZSBzZXJ2aWNlIGFuZCBwb3J0IGV4cG9zZWQuXG4gICAqL1xuICBwdWJsaWMgZXhwb3NlVmlhU2VydmljZShvcHRpb25zOiBEZXBsb3ltZW50RXhwb3NlVmlhU2VydmljZU9wdGlvbnMgPSB7fSk6IHNlcnZpY2UuU2VydmljZSB7XG4gICAgY29uc3QgbXlQb3J0cyA9IGNvbnRhaW5lci5leHRyYWN0Q29udGFpbmVyUG9ydHModGhpcyk7XG4gICAgY29uc3QgbXlQb3J0TnVtYmVycyA9IG15UG9ydHMubWFwKHAgPT4gcC5udW1iZXIpO1xuICAgIGNvbnN0IHBvcnRzOiBzZXJ2aWNlLlNlcnZpY2VQb3J0W10gPSBvcHRpb25zLnBvcnRzID8/IG15UG9ydHMubWFwKHAgPT4gKHtcbiAgICAgIHBvcnQ6IHAubnVtYmVyLCB0YXJnZXRQb3J0OiBwLm51bWJlciwgcHJvdG9jb2w6IHAucHJvdG9jb2wsIG5hbWU6IHAubmFtZSxcbiAgICB9KSk7XG4gICAgaWYgKHBvcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gZXhwb3NlIGRlcGxveW1lbnQgJHt0aGlzLm5hbWV9IHZpYSBhIHNlcnZpY2U6IGBcbiAgICAgICAgKyAnRGVwbG95bWVudCBwb3J0IGNhbm5vdCBiZSBkZXRlcm1pbmVkLidcbiAgICAgICAgKyAnRWl0aGVyIHBhc3MgXFwncG9ydHNcXCcsIG9yIGNvbmZpZ3VyZSBwb3J0cyBvbiB0aGUgY29udGFpbmVycyBvZiB0aGUgZGVwbG95bWVudCcpO1xuICAgIH1cbiAgICBjb25zdCBwb3J0TmFtZXMgPSBwb3J0cy5tYXAocCA9PiBwLm5hbWUpO1xuICAgIGlmIChwb3J0cy5sZW5ndGggPiAxICYmIHBvcnROYW1lcy5pbmNsdWRlcyh1bmRlZmluZWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBleHBvc2UgZGVwbG95bWVudCAke3RoaXMubmFtZX0gdmlhIGEgc2VydmljZTogYFxuICAgICAgICArICdXaGVuIHVzaW5nIG11bHRpcGxlIHBvcnRzIGZvciBhIHNlcnZpY2UsIGFsbCBwb3J0cyBtdXN0IGhhdmUgcG9ydCBuYW1lcyBzbyB0aGV5IGFyZSB1bmFtYmlndW91cy4nKTtcbiAgICB9XG5cbiAgICAvLyB2YWxpZGF0ZSB0aGUgcG9ydHMgYXJlIG93bmVkIGJ5IG91ciBjb250YWluZXJzXG4gICAgZm9yIChjb25zdCBwb3J0IG9mIHBvcnRzKSB7XG4gICAgICBjb25zdCB0YXJnZXRQb3J0ID0gcG9ydC50YXJnZXRQb3J0ID8/IHBvcnQucG9ydDtcbiAgICAgIGlmICghbXlQb3J0TnVtYmVycy5pbmNsdWRlcyh0YXJnZXRQb3J0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBleHBvc2UgZGVwbG95bWVudCAke3RoaXMubmFtZX0gdmlhIGEgc2VydmljZTogUG9ydCAke3RhcmdldFBvcnR9IGlzIG5vdCBleHBvc2VkIGJ5IGFueSBjb250YWluZXJgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtZXRhZGF0YTogYW55ID0geyBuYW1lc3BhY2U6IHRoaXMubWV0YWRhdGEubmFtZXNwYWNlIH07XG4gICAgaWYgKG9wdGlvbnMubmFtZSkge1xuICAgICAgbWV0YWRhdGEubmFtZSA9IG9wdGlvbnMubmFtZTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBzZXJ2aWNlLlNlcnZpY2UodGhpcywgYCR7b3B0aW9ucy5uYW1lID8/ICcnfVNlcnZpY2VgLCB7XG4gICAgICBzZWxlY3RvcjogdGhpcyxcbiAgICAgIHBvcnRzLFxuICAgICAgbWV0YWRhdGEsXG4gICAgICB0eXBlOiBvcHRpb25zLnNlcnZpY2VUeXBlID8/IHNlcnZpY2UuU2VydmljZVR5cGUuQ0xVU1RFUl9JUCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvc2UgYSBkZXBsb3ltZW50IHZpYSBhbiBpbmdyZXNzLlxuICAgKlxuICAgKiBUaGlzIHdpbGwgZmlyc3QgZXhwb3NlIHRoZSBkZXBsb3ltZW50IHdpdGggYSBzZXJ2aWNlLCBhbmQgdGhlbiBleHBvc2UgdGhlIHNlcnZpY2UgdmlhIGFuIGluZ3Jlc3MuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIFRoZSBpbmdyZXNzIHBhdGggdG8gcmVnaXN0ZXIgdW5kZXIuXG4gICAqIEBwYXJhbSBvcHRpb25zIEFkZGl0aW9uYWwgb3B0aW9ucy5cbiAgICovXG4gIHB1YmxpYyBleHBvc2VWaWFJbmdyZXNzKHBhdGg6IHN0cmluZywgb3B0aW9uczogRXhwb3NlRGVwbG95bWVudFZpYUluZ3Jlc3NPcHRpb25zID0ge30pOiBpbmdyZXNzLkluZ3Jlc3Mge1xuICAgIGNvbnN0IHNlciA9IHRoaXMuZXhwb3NlVmlhU2VydmljZShvcHRpb25zKTtcbiAgICByZXR1cm4gc2VyLmV4cG9zZVZpYUluZ3Jlc3MocGF0aCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX3RvS3ViZSgpOiBrOHMuRGVwbG95bWVudFNwZWMge1xuICAgIHJldHVybiB7XG4gICAgICByZXBsaWNhczogdGhpcy5oYXNBdXRvc2NhbGVyID8gdW5kZWZpbmVkIDogKHRoaXMucmVwbGljYXMgPz8gMiksXG4gICAgICBtaW5SZWFkeVNlY29uZHM6IHRoaXMubWluUmVhZHkudG9TZWNvbmRzKCksXG4gICAgICBwcm9ncmVzc0RlYWRsaW5lU2Vjb25kczogdGhpcy5wcm9ncmVzc0RlYWRsaW5lLnRvU2Vjb25kcygpLFxuICAgICAgdGVtcGxhdGU6IHtcbiAgICAgICAgbWV0YWRhdGE6IHRoaXMucG9kTWV0YWRhdGEudG9Kc29uKCksXG4gICAgICAgIHNwZWM6IHRoaXMuX3RvUG9kU3BlYygpLFxuICAgICAgfSxcbiAgICAgIHNlbGVjdG9yOiB0aGlzLl90b0xhYmVsU2VsZWN0b3IoKSxcbiAgICAgIHN0cmF0ZWd5OiB0aGlzLnN0cmF0ZWd5Ll90b0t1YmUoKSxcbiAgICAgIHJldmlzaW9uSGlzdG9yeUxpbWl0OiB0aGlzLnJldmlzaW9uSGlzdG9yeUxpbWl0LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQHNlZSBJU2NhbGFibGUubWFya0hhc0F1dG9zY2FsZXIoKVxuICAgKi9cbiAgcHVibGljIG1hcmtIYXNBdXRvc2NhbGVyKCkge1xuICAgIHRoaXMuaGFzQXV0b3NjYWxlciA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQHNlZSBJU2NhbGFibGUudG9TY2FsaW5nVGFyZ2V0KClcbiAgICovXG4gIHB1YmxpYyB0b1NjYWxpbmdUYXJnZXQoKTogU2NhbGluZ1RhcmdldCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6IHRoaXMuYXBpT2JqZWN0LmtpbmQsXG4gICAgICBhcGlWZXJzaW9uOiB0aGlzLmFwaU9iamVjdC5hcGlWZXJzaW9uLFxuICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgY29udGFpbmVyczogdGhpcy5jb250YWluZXJzLFxuICAgICAgcmVwbGljYXM6IHRoaXMucmVwbGljYXMsXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGBEZXBsb3ltZW50U3RyYXRlZ3kucm9sbGluZ1VwZGF0ZWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVwbG95bWVudFN0cmF0ZWd5Um9sbGluZ1VwZGF0ZU9wdGlvbnMge1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcG9kcyB0aGF0IGNhbiBiZSBzY2hlZHVsZWQgYWJvdmUgdGhlIGRlc2lyZWQgbnVtYmVyIG9mIHBvZHMuXG4gICAqIFZhbHVlIGNhbiBiZSBhbiBhYnNvbHV0ZSBudW1iZXIgKGV4OiA1KSBvciBhIHBlcmNlbnRhZ2Ugb2YgZGVzaXJlZCBwb2RzIChleDogMTAlKS5cbiAgICogQWJzb2x1dGUgbnVtYmVyIGlzIGNhbGN1bGF0ZWQgZnJvbSBwZXJjZW50YWdlIGJ5IHJvdW5kaW5nIHVwLlxuICAgKiBUaGlzIGNhbiBub3QgYmUgMCBpZiBgbWF4VW5hdmFpbGFibGVgIGlzIDAuXG4gICAqXG4gICAqIEV4YW1wbGU6IHdoZW4gdGhpcyBpcyBzZXQgdG8gMzAlLCB0aGUgbmV3IFJlcGxpY2FTZXQgY2FuIGJlIHNjYWxlZCB1cCBpbW1lZGlhdGVseSB3aGVuIHRoZSByb2xsaW5nIHVwZGF0ZVxuICAgKiBzdGFydHMsIHN1Y2ggdGhhdCB0aGUgdG90YWwgbnVtYmVyIG9mIG9sZCBhbmQgbmV3IHBvZHMgZG8gbm90IGV4Y2VlZCAxMzAlIG9mIGRlc2lyZWQgcG9kcy5cbiAgICogT25jZSBvbGQgcG9kcyBoYXZlIGJlZW4ga2lsbGVkLCBuZXcgUmVwbGljYVNldCBjYW4gYmUgc2NhbGVkIHVwIGZ1cnRoZXIsIGVuc3VyaW5nIHRoYXRcbiAgICogdG90YWwgbnVtYmVyIG9mIHBvZHMgcnVubmluZyBhdCBhbnkgdGltZSBkdXJpbmcgdGhlIHVwZGF0ZSBpcyBhdCBtb3N0IDEzMCUgb2YgZGVzaXJlZCBwb2RzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAnMjUlJ1xuICAgKi9cbiAgcmVhZG9ubHkgbWF4U3VyZ2U/OiBQZXJjZW50T3JBYnNvbHV0ZTtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHBvZHMgdGhhdCBjYW4gYmUgdW5hdmFpbGFibGUgZHVyaW5nIHRoZSB1cGRhdGUuXG4gICAqIFZhbHVlIGNhbiBiZSBhbiBhYnNvbHV0ZSBudW1iZXIgKGV4OiA1KSBvciBhIHBlcmNlbnRhZ2Ugb2YgZGVzaXJlZCBwb2RzIChleDogMTAlKS5cbiAgICogQWJzb2x1dGUgbnVtYmVyIGlzIGNhbGN1bGF0ZWQgZnJvbSBwZXJjZW50YWdlIGJ5IHJvdW5kaW5nIGRvd24uXG4gICAqIFRoaXMgY2FuIG5vdCBiZSAwIGlmIGBtYXhTdXJnZWAgaXMgMC5cbiAgICpcbiAgICogRXhhbXBsZTogd2hlbiB0aGlzIGlzIHNldCB0byAzMCUsIHRoZSBvbGQgUmVwbGljYVNldCBjYW4gYmUgc2NhbGVkIGRvd24gdG8gNzAlIG9mIGRlc2lyZWRcbiAgICogcG9kcyBpbW1lZGlhdGVseSB3aGVuIHRoZSByb2xsaW5nIHVwZGF0ZSBzdGFydHMuIE9uY2UgbmV3IHBvZHMgYXJlIHJlYWR5LCBvbGQgUmVwbGljYVNldCBjYW5cbiAgICogYmUgc2NhbGVkIGRvd24gZnVydGhlciwgZm9sbG93ZWQgYnkgc2NhbGluZyB1cCB0aGUgbmV3IFJlcGxpY2FTZXQsIGVuc3VyaW5nIHRoYXQgdGhlIHRvdGFsXG4gICAqIG51bWJlciBvZiBwb2RzIGF2YWlsYWJsZSBhdCBhbGwgdGltZXMgZHVyaW5nIHRoZSB1cGRhdGUgaXMgYXQgbGVhc3QgNzAlIG9mIGRlc2lyZWQgcG9kcy5cbiAgICpcbiAgICogQGRlZmF1bHQgJzI1JSdcbiAgICovXG4gIHJlYWRvbmx5IG1heFVuYXZhaWxhYmxlPzogUGVyY2VudE9yQWJzb2x1dGU7XG5cbn1cblxuLyoqXG4gKiBVbmlvbiBsaWtlIGNsYXNzIHJlcHNlbnRpbmcgZWl0aGVyIGEgcmF0aW9uIGluXG4gKiBwZXJjZW50cyBvciBhbiBhYnNvbHV0ZSBudW1iZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBQZXJjZW50T3JBYnNvbHV0ZSB7XG5cbiAgLyoqXG4gICAqIFBlcmNlbnQgcmF0aW8uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHBlcmNlbnQocGVyY2VudDogbnVtYmVyKTogUGVyY2VudE9yQWJzb2x1dGUge1xuICAgIHJldHVybiBuZXcgUGVyY2VudE9yQWJzb2x1dGUoYCR7cGVyY2VudH0lYCk7XG4gIH1cblxuICAvKipcbiAgICogQWJzb2x1dGUgbnVtYmVyLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhYnNvbHV0ZShudW06IG51bWJlcik6IFBlcmNlbnRPckFic29sdXRlIHtcbiAgICByZXR1cm4gbmV3IFBlcmNlbnRPckFic29sdXRlKG51bSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2YWx1ZTogYW55KSB7fVxuXG4gIHB1YmxpYyBpc1plcm8oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWUgPT09IFBlcmNlbnRPckFic29sdXRlLmFic29sdXRlKDApLnZhbHVlIHx8IHRoaXMudmFsdWUgPT09IFBlcmNlbnRPckFic29sdXRlLnBlcmNlbnQoMCkudmFsdWU7XG4gIH1cblxufVxuXG4vKipcbiAqIERlcGxveW1lbnQgc3RyYXRlZ2llcy5cbiAqL1xuZXhwb3J0IGNsYXNzIERlcGxveW1lbnRTdHJhdGVneSB7XG5cbiAgLyoqXG4gICAqIEFsbCBleGlzdGluZyBQb2RzIGFyZSBraWxsZWQgYmVmb3JlIG5ldyBvbmVzIGFyZSBjcmVhdGVkLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL3dvcmtsb2Fkcy9jb250cm9sbGVycy9kZXBsb3ltZW50LyNyZWNyZWF0ZS1kZXBsb3ltZW50XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlY3JlYXRlKCk6IERlcGxveW1lbnRTdHJhdGVneSB7XG4gICAgcmV0dXJuIG5ldyBEZXBsb3ltZW50U3RyYXRlZ3koe1xuICAgICAgdHlwZTogJ1JlY3JlYXRlJyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgcm9sbGluZ1VwZGF0ZShvcHRpb25zOiBEZXBsb3ltZW50U3RyYXRlZ3lSb2xsaW5nVXBkYXRlT3B0aW9ucyA9IHt9KTogRGVwbG95bWVudFN0cmF0ZWd5IHtcblxuICAgIGNvbnN0IG1heFN1cmdlID0gb3B0aW9ucy5tYXhTdXJnZSA/PyBQZXJjZW50T3JBYnNvbHV0ZS5wZXJjZW50KDI1KTtcbiAgICBjb25zdCBtYXhVbmF2YWlsYWJsZSA9IG9wdGlvbnMubWF4VW5hdmFpbGFibGUgPz8gUGVyY2VudE9yQWJzb2x1dGUucGVyY2VudCgyNSk7XG5cbiAgICBpZiAobWF4U3VyZ2UuaXNaZXJvKCkgJiYgbWF4VW5hdmFpbGFibGUuaXNaZXJvKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignXFwnbWF4U3VyZ2VcXCcgYW5kIFxcJ21heFVuYXZhaWxhYmxlXFwnIGNhbm5vdCBiZSBib3RoIHplcm8nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IERlcGxveW1lbnRTdHJhdGVneSh7XG4gICAgICB0eXBlOiAnUm9sbGluZ1VwZGF0ZScsXG4gICAgICByb2xsaW5nVXBkYXRlOiB7IG1heFN1cmdlLCBtYXhVbmF2YWlsYWJsZSB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHN0cmF0ZWd5OiBrOHMuRGVwbG95bWVudFN0cmF0ZWd5KSB7fVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfdG9LdWJlKCk6IGs4cy5EZXBsb3ltZW50U3RyYXRlZ3kge1xuICAgIHJldHVybiB0aGlzLnN0cmF0ZWd5O1xuICB9XG5cbn1cbiJdfQ==
|
package/lib/handler.d.ts
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import * as container from './container';
|
|
2
|
+
import * as k8s from './imports/k8s';
|
|
3
|
+
/**
|
|
4
|
+
* Options for `Handler.fromTcpSocket`.
|
|
5
|
+
*/
|
|
6
|
+
export interface HandlerFromTcpSocketOptions {
|
|
7
|
+
/**
|
|
8
|
+
* The TCP port to connect to on the container.
|
|
9
|
+
*
|
|
10
|
+
* @default - defaults to `container.port`.
|
|
11
|
+
*/
|
|
12
|
+
readonly port?: number;
|
|
13
|
+
/**
|
|
14
|
+
* The host name to connect to on the container.
|
|
15
|
+
*
|
|
16
|
+
* @default - defaults to the pod IP
|
|
17
|
+
*/
|
|
18
|
+
readonly host?: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Options for `Handler.fromHttpGet`.
|
|
22
|
+
*/
|
|
23
|
+
export interface HandlerFromHttpGetOptions {
|
|
24
|
+
/**
|
|
25
|
+
* The TCP port to use when sending the GET request.
|
|
26
|
+
*
|
|
27
|
+
* @default - defaults to `container.port`.
|
|
28
|
+
*/
|
|
29
|
+
readonly port?: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Defines a specific action that should be taken.
|
|
33
|
+
*/
|
|
34
|
+
export declare class Handler {
|
|
35
|
+
private readonly tcpSocketOptions?;
|
|
36
|
+
private readonly commandOptions?;
|
|
37
|
+
private readonly httpGetOptions?;
|
|
38
|
+
/**
|
|
39
|
+
* Defines a handler based on an HTTP GET request to the IP address of the container.
|
|
40
|
+
*
|
|
41
|
+
* @param path The URL path to hit
|
|
42
|
+
* @param options Options
|
|
43
|
+
*/
|
|
44
|
+
static fromHttpGet(path: string, options?: HandlerFromHttpGetOptions): Handler;
|
|
45
|
+
/**
|
|
46
|
+
* Defines a handler based on a command which is executed within the container.
|
|
47
|
+
*
|
|
48
|
+
* @param command The command to execute
|
|
49
|
+
*/
|
|
50
|
+
static fromCommand(command: string[]): Handler;
|
|
51
|
+
/**
|
|
52
|
+
* Defines a handler based opening a connection to a TCP socket on the container.
|
|
53
|
+
*
|
|
54
|
+
* @param options Options
|
|
55
|
+
*/
|
|
56
|
+
static fromTcpSocket(options?: HandlerFromTcpSocketOptions): Handler;
|
|
57
|
+
private constructor();
|
|
58
|
+
/**
|
|
59
|
+
* @internal
|
|
60
|
+
*/
|
|
61
|
+
_toKube(cont: container.Container): k8s.LifecycleHandler;
|
|
62
|
+
}
|