cdk8s-plus-34 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 +101649 -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 -33
- package/SECURITY.md +5 -0
- package/cdk8s.yaml +11 -0
- package/docs/java.md +150009 -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 +161196 -0
- package/docs/typescript.md +139649 -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 +39 -0
- package/lib/api-resource.d.ts +298 -0
- package/lib/api-resource.js +430 -0
- package/lib/base.d.ts +79 -0
- package/lib/base.js +92 -0
- package/lib/config-map.d.ts +126 -0
- package/lib/config-map.js +159 -0
- package/lib/container.d.ts +1057 -0
- package/lib/container.js +845 -0
- package/lib/cron-job.d.ts +138 -0
- package/lib/cron-job.js +103 -0
- package/lib/daemon-set.d.ts +45 -0
- package/lib/daemon-set.js +55 -0
- package/lib/deployment.d.ts +235 -0
- package/lib/deployment.js +216 -0
- package/lib/handler.d.ts +62 -0
- package/lib/handler.js +54 -0
- package/lib/horizontal-pod-autoscaler.d.ts +500 -0
- package/lib/horizontal-pod-autoscaler.js +569 -0
- package/lib/imports/k8s.d.ts +25809 -0
- package/lib/imports/k8s.js +19238 -0
- package/lib/index.d.ts +26 -0
- package/lib/index.js +44 -0
- package/lib/ingress.d.ts +230 -0
- package/lib/ingress.js +246 -0
- package/lib/job.d.ts +64 -0
- package/lib/job.js +54 -0
- package/lib/namespace.d.ts +128 -0
- package/lib/namespace.js +109 -0
- package/lib/network-policy.d.ts +311 -0
- package/lib/network-policy.js +344 -0
- package/lib/pod.d.ts +1097 -0
- package/lib/pod.js +1147 -0
- package/lib/probe.d.ts +181 -0
- package/lib/probe.js +88 -0
- package/lib/pv.d.ts +375 -0
- package/lib/pv.js +273 -0
- package/lib/pvc.d.ts +163 -0
- package/lib/pvc.js +154 -0
- package/lib/role-binding.d.ts +138 -0
- package/lib/role-binding.js +165 -0
- package/lib/role.d.ts +268 -0
- package/lib/role.js +401 -0
- package/lib/secret.d.ts +195 -0
- package/lib/secret.js +185 -0
- package/lib/service-account.d.ts +83 -0
- package/lib/service-account.js +105 -0
- package/lib/service.d.ts +289 -0
- package/lib/service.js +182 -0
- package/lib/stateful-set.d.ts +206 -0
- package/lib/stateful-set.js +244 -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 +377 -0
- package/lib/workload.d.ts +121 -0
- package/lib/workload.js +122 -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 +135 -0
- package/node_modules/brace-expansion/index.js +202 -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 +176 -6
- package/rotate.md +85 -0
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export * from './base';
|
|
2
|
+
export * from './config-map';
|
|
3
|
+
export * from './container';
|
|
4
|
+
export * from './cron-job';
|
|
5
|
+
export * from './deployment';
|
|
6
|
+
export * from './job';
|
|
7
|
+
export * from './pod';
|
|
8
|
+
export * from './secret';
|
|
9
|
+
export * from './service-account';
|
|
10
|
+
export * from './service';
|
|
11
|
+
export * from './stateful-set';
|
|
12
|
+
export * from './volume';
|
|
13
|
+
export * from './ingress';
|
|
14
|
+
export * from './probe';
|
|
15
|
+
export * from './pvc';
|
|
16
|
+
export * from './pv';
|
|
17
|
+
export * from './handler';
|
|
18
|
+
export * from './horizontal-pod-autoscaler';
|
|
19
|
+
export * from './workload';
|
|
20
|
+
export * from './daemon-set';
|
|
21
|
+
export * from './role';
|
|
22
|
+
export * from './role-binding';
|
|
23
|
+
export * from './network-policy';
|
|
24
|
+
export * from './namespace';
|
|
25
|
+
export * from './api-resource';
|
|
26
|
+
export * as k8s from './imports/k8s';
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.k8s = void 0;
|
|
18
|
+
__exportStar(require("./base"), exports);
|
|
19
|
+
__exportStar(require("./config-map"), exports);
|
|
20
|
+
__exportStar(require("./container"), exports);
|
|
21
|
+
__exportStar(require("./cron-job"), exports);
|
|
22
|
+
__exportStar(require("./deployment"), exports);
|
|
23
|
+
__exportStar(require("./job"), exports);
|
|
24
|
+
__exportStar(require("./pod"), exports);
|
|
25
|
+
__exportStar(require("./secret"), exports);
|
|
26
|
+
__exportStar(require("./service-account"), exports);
|
|
27
|
+
__exportStar(require("./service"), exports);
|
|
28
|
+
__exportStar(require("./stateful-set"), exports);
|
|
29
|
+
__exportStar(require("./volume"), exports);
|
|
30
|
+
__exportStar(require("./ingress"), exports);
|
|
31
|
+
__exportStar(require("./probe"), exports);
|
|
32
|
+
__exportStar(require("./pvc"), exports);
|
|
33
|
+
__exportStar(require("./pv"), exports);
|
|
34
|
+
__exportStar(require("./handler"), exports);
|
|
35
|
+
__exportStar(require("./horizontal-pod-autoscaler"), exports);
|
|
36
|
+
__exportStar(require("./workload"), exports);
|
|
37
|
+
__exportStar(require("./daemon-set"), exports);
|
|
38
|
+
__exportStar(require("./role"), exports);
|
|
39
|
+
__exportStar(require("./role-binding"), exports);
|
|
40
|
+
__exportStar(require("./network-policy"), exports);
|
|
41
|
+
__exportStar(require("./namespace"), exports);
|
|
42
|
+
__exportStar(require("./api-resource"), exports);
|
|
43
|
+
exports.k8s = require("./imports/k8s");
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx5Q0FBdUI7QUFDdkIsK0NBQTZCO0FBQzdCLDhDQUE0QjtBQUM1Qiw2Q0FBMkI7QUFDM0IsK0NBQTZCO0FBQzdCLHdDQUFzQjtBQUN0Qix3Q0FBc0I7QUFDdEIsMkNBQXlCO0FBQ3pCLG9EQUFrQztBQUNsQyw0Q0FBMEI7QUFDMUIsaURBQStCO0FBQy9CLDJDQUF5QjtBQUN6Qiw0Q0FBMEI7QUFDMUIsMENBQXdCO0FBQ3hCLHdDQUFzQjtBQUN0Qix1Q0FBcUI7QUFDckIsNENBQTBCO0FBQzFCLDhEQUE0QztBQUM1Qyw2Q0FBMkI7QUFDM0IsK0NBQTZCO0FBQzdCLHlDQUF1QjtBQUN2QixpREFBK0I7QUFDL0IsbURBQWlDO0FBQ2pDLDhDQUE0QjtBQUU1QixpREFBK0I7QUFDL0IsdUNBQXFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9iYXNlJztcbmV4cG9ydCAqIGZyb20gJy4vY29uZmlnLW1hcCc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnRhaW5lcic7XG5leHBvcnQgKiBmcm9tICcuL2Nyb24tam9iJztcbmV4cG9ydCAqIGZyb20gJy4vZGVwbG95bWVudCc7XG5leHBvcnQgKiBmcm9tICcuL2pvYic7XG5leHBvcnQgKiBmcm9tICcuL3BvZCc7XG5leHBvcnQgKiBmcm9tICcuL3NlY3JldCc7XG5leHBvcnQgKiBmcm9tICcuL3NlcnZpY2UtYWNjb3VudCc7XG5leHBvcnQgKiBmcm9tICcuL3NlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zdGF0ZWZ1bC1zZXQnO1xuZXhwb3J0ICogZnJvbSAnLi92b2x1bWUnO1xuZXhwb3J0ICogZnJvbSAnLi9pbmdyZXNzJztcbmV4cG9ydCAqIGZyb20gJy4vcHJvYmUnO1xuZXhwb3J0ICogZnJvbSAnLi9wdmMnO1xuZXhwb3J0ICogZnJvbSAnLi9wdic7XG5leHBvcnQgKiBmcm9tICcuL2hhbmRsZXInO1xuZXhwb3J0ICogZnJvbSAnLi9ob3Jpem9udGFsLXBvZC1hdXRvc2NhbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vd29ya2xvYWQnO1xuZXhwb3J0ICogZnJvbSAnLi9kYWVtb24tc2V0JztcbmV4cG9ydCAqIGZyb20gJy4vcm9sZSc7XG5leHBvcnQgKiBmcm9tICcuL3JvbGUtYmluZGluZyc7XG5leHBvcnQgKiBmcm9tICcuL25ldHdvcmstcG9saWN5JztcbmV4cG9ydCAqIGZyb20gJy4vbmFtZXNwYWNlJztcblxuZXhwb3J0ICogZnJvbSAnLi9hcGktcmVzb3VyY2UnO1xuZXhwb3J0ICogYXMgazhzIGZyb20gJy4vaW1wb3J0cy9rOHMnO1xuIl19
|
package/lib/ingress.d.ts
ADDED
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { ApiObject } from 'cdk8s';
|
|
2
|
+
import { Construct } from 'constructs';
|
|
3
|
+
import * as base from './base';
|
|
4
|
+
import * as k8s from './imports/k8s';
|
|
5
|
+
import * as secret from './secret';
|
|
6
|
+
import * as service from './service';
|
|
7
|
+
/**
|
|
8
|
+
* Properties for `Ingress`.
|
|
9
|
+
*/
|
|
10
|
+
export interface IngressProps extends base.ResourceProps {
|
|
11
|
+
/**
|
|
12
|
+
* The default backend services requests that do not match any rule.
|
|
13
|
+
*
|
|
14
|
+
* Using this option or the `addDefaultBackend()` method is equivalent to
|
|
15
|
+
* adding a rule with both `path` and `host` undefined.
|
|
16
|
+
*/
|
|
17
|
+
readonly defaultBackend?: IngressBackend;
|
|
18
|
+
/**
|
|
19
|
+
* Routing rules for this ingress.
|
|
20
|
+
*
|
|
21
|
+
* Each rule must define an `IngressBackend` that will receive the requests
|
|
22
|
+
* that match this rule. If both `host` and `path` are not specifiec, this
|
|
23
|
+
* backend will be used as the default backend of the ingress.
|
|
24
|
+
*
|
|
25
|
+
* You can also add rules later using `addRule()`, `addHostRule()`,
|
|
26
|
+
* `addDefaultBackend()` and `addHostDefaultBackend()`.
|
|
27
|
+
*/
|
|
28
|
+
readonly rules?: IngressRule[];
|
|
29
|
+
/**
|
|
30
|
+
* TLS settings for this ingress.
|
|
31
|
+
*
|
|
32
|
+
* Using this option tells the ingress controller to expose a TLS endpoint.
|
|
33
|
+
* Currently the Ingress only supports a single TLS port, 443. If multiple
|
|
34
|
+
* members of this list specify different hosts, they will be multiplexed on
|
|
35
|
+
* the same port according to the hostname specified through the SNI TLS
|
|
36
|
+
* extension, if the ingress controller fulfilling the ingress supports SNI.
|
|
37
|
+
*/
|
|
38
|
+
readonly tls?: IngressTls[];
|
|
39
|
+
/**
|
|
40
|
+
* Class Name for this ingress.
|
|
41
|
+
*
|
|
42
|
+
* This field is a reference to an IngressClass resource that contains
|
|
43
|
+
* additional Ingress configuration, including the name of the Ingress controller.
|
|
44
|
+
*/
|
|
45
|
+
readonly className?: string;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Specify how the path is matched against request paths.
|
|
49
|
+
*
|
|
50
|
+
* @see https://kubernetes.io/docs/concepts/services-networking/ingress/#path-types
|
|
51
|
+
*/
|
|
52
|
+
export declare enum HttpIngressPathType {
|
|
53
|
+
/**
|
|
54
|
+
* Matches the URL path exactly.
|
|
55
|
+
*/
|
|
56
|
+
PREFIX = "Prefix",
|
|
57
|
+
/**
|
|
58
|
+
* Matches based on a URL path prefix split by '/'.
|
|
59
|
+
*/
|
|
60
|
+
EXACT = "Exact",
|
|
61
|
+
/**
|
|
62
|
+
* Matching is specified by the underlying IngressClass.
|
|
63
|
+
*/
|
|
64
|
+
IMPLEMENTATION_SPECIFIC = "ImplementationSpecific"
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Ingress is a collection of rules that allow inbound connections to reach the
|
|
68
|
+
* endpoints defined by a backend. An Ingress can be configured to give services
|
|
69
|
+
* externally-reachable urls, load balance traffic, terminate SSL, offer name
|
|
70
|
+
* based virtual hosting etc.
|
|
71
|
+
*/
|
|
72
|
+
export declare class Ingress extends base.Resource {
|
|
73
|
+
/**
|
|
74
|
+
* @see base.Resource.apiObject
|
|
75
|
+
*/
|
|
76
|
+
protected readonly apiObject: ApiObject;
|
|
77
|
+
readonly resourceType = "ingresses";
|
|
78
|
+
private readonly _rulesPerHost;
|
|
79
|
+
private _defaultBackend?;
|
|
80
|
+
private readonly _tlsConfig;
|
|
81
|
+
constructor(scope: Construct, id: string, props?: IngressProps);
|
|
82
|
+
private _validate;
|
|
83
|
+
/**
|
|
84
|
+
* Defines the default backend for this ingress. A default backend capable of
|
|
85
|
+
* servicing requests that don't match any rule.
|
|
86
|
+
*
|
|
87
|
+
* @param backend The backend to use for requests that do not match any rule.
|
|
88
|
+
*/
|
|
89
|
+
addDefaultBackend(backend: IngressBackend): void;
|
|
90
|
+
/**
|
|
91
|
+
* Specify a default backend for a specific host name. This backend will be used as a catch-all for requests
|
|
92
|
+
* targeted to this host name (the `Host` header matches this value).
|
|
93
|
+
*
|
|
94
|
+
* @param host The host name to match
|
|
95
|
+
* @param backend The backend to route to
|
|
96
|
+
*/
|
|
97
|
+
addHostDefaultBackend(host: string, backend: IngressBackend): void;
|
|
98
|
+
/**
|
|
99
|
+
* Adds an ingress rule applied to requests to a specific host and a specific
|
|
100
|
+
* HTTP path (the `Host` header matches this value).
|
|
101
|
+
*
|
|
102
|
+
* @param host The host name
|
|
103
|
+
* @param path The HTTP path
|
|
104
|
+
* @param backend The backend to route requests to
|
|
105
|
+
* @param pathType How the path is matched against request paths
|
|
106
|
+
*/
|
|
107
|
+
addHostRule(host: string, path: string, backend: IngressBackend, pathType?: HttpIngressPathType): void;
|
|
108
|
+
/**
|
|
109
|
+
* Adds an ingress rule applied to requests sent to a specific HTTP path.
|
|
110
|
+
*
|
|
111
|
+
* @param path The HTTP path
|
|
112
|
+
* @param backend The backend to route requests to
|
|
113
|
+
* @param pathType How the path is matched against request paths
|
|
114
|
+
*/
|
|
115
|
+
addRule(path: string, backend: IngressBackend, pathType?: HttpIngressPathType): void;
|
|
116
|
+
/**
|
|
117
|
+
* Adds rules to this ingress.
|
|
118
|
+
* @param rules The rules to add
|
|
119
|
+
*/
|
|
120
|
+
addRules(...rules: IngressRule[]): void;
|
|
121
|
+
private synthRules;
|
|
122
|
+
addTls(tls: IngressTls[]): void;
|
|
123
|
+
private tlsConfig;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Options for setting up backends for ingress rules.
|
|
127
|
+
*/
|
|
128
|
+
export interface ServiceIngressBackendOptions {
|
|
129
|
+
/**
|
|
130
|
+
* The port to use to access the service.
|
|
131
|
+
*
|
|
132
|
+
* - This option will fail if the service does not expose any ports.
|
|
133
|
+
* - If the service exposes multiple ports, this option must be specified.
|
|
134
|
+
* - If the service exposes a single port, this option is optional and if
|
|
135
|
+
* specified, it must be the same port exposed by the service.
|
|
136
|
+
*
|
|
137
|
+
* @default - if the service exposes a single port, this port will be used.
|
|
138
|
+
*/
|
|
139
|
+
readonly port?: number;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* The backend for an ingress path.
|
|
143
|
+
*/
|
|
144
|
+
export declare class IngressBackend {
|
|
145
|
+
private readonly backend;
|
|
146
|
+
/**
|
|
147
|
+
* A Kubernetes `Service` to use as the backend for this path.
|
|
148
|
+
* @param serv The service object.
|
|
149
|
+
*/
|
|
150
|
+
static fromService(serv: service.Service, options?: ServiceIngressBackendOptions): IngressBackend;
|
|
151
|
+
/**
|
|
152
|
+
* A Resource backend is an ObjectRef to another Kubernetes resource
|
|
153
|
+
* within the same namespace as the Ingress object.
|
|
154
|
+
* A common usage for a Resource backend is to ingress data to an object
|
|
155
|
+
* storage backend with static assets.
|
|
156
|
+
*/
|
|
157
|
+
static fromResource(resource: base.IResource): IngressBackend;
|
|
158
|
+
private constructor();
|
|
159
|
+
/**
|
|
160
|
+
* @internal
|
|
161
|
+
*/
|
|
162
|
+
_toKube(): k8s.IngressBackend;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Represents the rules mapping the paths under a specified host to the related
|
|
166
|
+
* backend services. Incoming requests are first evaluated for a host match,
|
|
167
|
+
* then routed to the backend associated with the matching path.
|
|
168
|
+
*/
|
|
169
|
+
export interface IngressRule {
|
|
170
|
+
/**
|
|
171
|
+
* Backend defines the referenced service endpoint to which the traffic will
|
|
172
|
+
* be forwarded to.
|
|
173
|
+
*/
|
|
174
|
+
readonly backend: IngressBackend;
|
|
175
|
+
/**
|
|
176
|
+
* Host is the fully qualified domain name of a network host, as defined by
|
|
177
|
+
* RFC 3986. Note the following deviations from the "host" part of the URI as
|
|
178
|
+
* defined in the RFC: 1. IPs are not allowed. Currently an IngressRuleValue
|
|
179
|
+
* can only apply to the IP in the Spec of the parent Ingress. 2. The `:`
|
|
180
|
+
* delimiter is not respected because ports are not allowed. Currently the
|
|
181
|
+
* port of an Ingress is implicitly :80 for http and :443 for https. Both
|
|
182
|
+
* these may change in the future. Incoming requests are matched against the
|
|
183
|
+
* host before the IngressRuleValue.
|
|
184
|
+
*
|
|
185
|
+
* @default - If the host is unspecified, the Ingress routes all traffic based
|
|
186
|
+
* on the specified IngressRuleValue.
|
|
187
|
+
*/
|
|
188
|
+
readonly host?: string;
|
|
189
|
+
/**
|
|
190
|
+
* Path is an extended POSIX regex as defined by IEEE Std 1003.1, (i.e this
|
|
191
|
+
* follows the egrep/unix syntax, not the perl syntax) matched against the
|
|
192
|
+
* path of an incoming request. Currently it can contain characters disallowed
|
|
193
|
+
* from the conventional "path" part of a URL as defined by RFC 3986. Paths
|
|
194
|
+
* must begin with a '/'.
|
|
195
|
+
*
|
|
196
|
+
* @default - If unspecified, the path defaults to a catch all sending traffic
|
|
197
|
+
* to the backend.
|
|
198
|
+
*/
|
|
199
|
+
readonly path?: string;
|
|
200
|
+
/**
|
|
201
|
+
* Specify how the path is matched against request paths. By default, path
|
|
202
|
+
* types will be matched by prefix.
|
|
203
|
+
*
|
|
204
|
+
* @see https://kubernetes.io/docs/concepts/services-networking/ingress/#path-types
|
|
205
|
+
*/
|
|
206
|
+
readonly pathType?: HttpIngressPathType;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Represents the TLS configuration mapping that is passed to the ingress
|
|
210
|
+
* controller for SSL termination.
|
|
211
|
+
*/
|
|
212
|
+
export interface IngressTls {
|
|
213
|
+
/**
|
|
214
|
+
* Hosts are a list of hosts included in the TLS certificate. The values in
|
|
215
|
+
* this list must match the name/s used in the TLS Secret.
|
|
216
|
+
*
|
|
217
|
+
* @default - If unspecified, it defaults to the wildcard host setting for
|
|
218
|
+
* the loadbalancer controller fulfilling this Ingress.
|
|
219
|
+
*/
|
|
220
|
+
readonly hosts?: string[];
|
|
221
|
+
/**
|
|
222
|
+
* Secret is the secret that contains the certificate and key used to
|
|
223
|
+
* terminate SSL traffic on 443. If the SNI host in a listener conflicts with
|
|
224
|
+
* the "Host" header field used by an IngressRule, the SNI host is used for
|
|
225
|
+
* termination and value of the Host header is used for routing.
|
|
226
|
+
*
|
|
227
|
+
* @default - If unspecified, it allows SSL routing based on SNI hostname.
|
|
228
|
+
*/
|
|
229
|
+
readonly secret?: secret.ISecret;
|
|
230
|
+
}
|
package/lib/ingress.js
ADDED
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a, _b;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.IngressBackend = exports.Ingress = exports.HttpIngressPathType = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
const cdk8s_1 = require("cdk8s");
|
|
7
|
+
const base = require("./base");
|
|
8
|
+
const k8s = require("./imports/k8s");
|
|
9
|
+
/**
|
|
10
|
+
* Specify how the path is matched against request paths.
|
|
11
|
+
*
|
|
12
|
+
* @see https://kubernetes.io/docs/concepts/services-networking/ingress/#path-types
|
|
13
|
+
*/
|
|
14
|
+
var HttpIngressPathType;
|
|
15
|
+
(function (HttpIngressPathType) {
|
|
16
|
+
/**
|
|
17
|
+
* Matches the URL path exactly.
|
|
18
|
+
*/
|
|
19
|
+
HttpIngressPathType["PREFIX"] = "Prefix";
|
|
20
|
+
/**
|
|
21
|
+
* Matches based on a URL path prefix split by '/'.
|
|
22
|
+
*/
|
|
23
|
+
HttpIngressPathType["EXACT"] = "Exact";
|
|
24
|
+
/**
|
|
25
|
+
* Matching is specified by the underlying IngressClass.
|
|
26
|
+
*/
|
|
27
|
+
HttpIngressPathType["IMPLEMENTATION_SPECIFIC"] = "ImplementationSpecific";
|
|
28
|
+
})(HttpIngressPathType || (exports.HttpIngressPathType = HttpIngressPathType = {}));
|
|
29
|
+
/**
|
|
30
|
+
* Ingress is a collection of rules that allow inbound connections to reach the
|
|
31
|
+
* endpoints defined by a backend. An Ingress can be configured to give services
|
|
32
|
+
* externally-reachable urls, load balance traffic, terminate SSL, offer name
|
|
33
|
+
* based virtual hosting etc.
|
|
34
|
+
*/
|
|
35
|
+
class Ingress extends base.Resource {
|
|
36
|
+
constructor(scope, id, props = {}) {
|
|
37
|
+
super(scope, id);
|
|
38
|
+
this.resourceType = 'ingresses';
|
|
39
|
+
this._rulesPerHost = {};
|
|
40
|
+
this._tlsConfig = [];
|
|
41
|
+
this.apiObject = new k8s.KubeIngress(this, 'Resource', {
|
|
42
|
+
metadata: props.metadata,
|
|
43
|
+
spec: {
|
|
44
|
+
defaultBackend: cdk8s_1.Lazy.any({ produce: () => this._defaultBackend?._toKube() }),
|
|
45
|
+
ingressClassName: props.className,
|
|
46
|
+
rules: cdk8s_1.Lazy.any({ produce: () => this.synthRules() }),
|
|
47
|
+
tls: cdk8s_1.Lazy.any({ produce: () => this.tlsConfig() }),
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
if (props.defaultBackend) {
|
|
51
|
+
this.addDefaultBackend(props.defaultBackend);
|
|
52
|
+
}
|
|
53
|
+
this.addRules(...props.rules ?? []);
|
|
54
|
+
if (props.tls) {
|
|
55
|
+
this.addTls(props.tls);
|
|
56
|
+
}
|
|
57
|
+
this.node.addValidation({ validate: () => this._validate() });
|
|
58
|
+
}
|
|
59
|
+
_validate() {
|
|
60
|
+
if (!this._defaultBackend && Object.keys(this._rulesPerHost).length === 0) {
|
|
61
|
+
return ['ingress with no rules or default backend'];
|
|
62
|
+
}
|
|
63
|
+
return [];
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Defines the default backend for this ingress. A default backend capable of
|
|
67
|
+
* servicing requests that don't match any rule.
|
|
68
|
+
*
|
|
69
|
+
* @param backend The backend to use for requests that do not match any rule.
|
|
70
|
+
*/
|
|
71
|
+
addDefaultBackend(backend) {
|
|
72
|
+
this.addRules({ backend });
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Specify a default backend for a specific host name. This backend will be used as a catch-all for requests
|
|
76
|
+
* targeted to this host name (the `Host` header matches this value).
|
|
77
|
+
*
|
|
78
|
+
* @param host The host name to match
|
|
79
|
+
* @param backend The backend to route to
|
|
80
|
+
*/
|
|
81
|
+
addHostDefaultBackend(host, backend) {
|
|
82
|
+
if (!host) {
|
|
83
|
+
throw new Error('host must not be an empty string');
|
|
84
|
+
}
|
|
85
|
+
this.addRules({ host, backend });
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Adds an ingress rule applied to requests to a specific host and a specific
|
|
89
|
+
* HTTP path (the `Host` header matches this value).
|
|
90
|
+
*
|
|
91
|
+
* @param host The host name
|
|
92
|
+
* @param path The HTTP path
|
|
93
|
+
* @param backend The backend to route requests to
|
|
94
|
+
* @param pathType How the path is matched against request paths
|
|
95
|
+
*/
|
|
96
|
+
addHostRule(host, path, backend, pathType) {
|
|
97
|
+
if (!host) {
|
|
98
|
+
throw new Error('host must not be an empty string');
|
|
99
|
+
}
|
|
100
|
+
this.addRules({ host, backend, path, pathType });
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Adds an ingress rule applied to requests sent to a specific HTTP path.
|
|
104
|
+
*
|
|
105
|
+
* @param path The HTTP path
|
|
106
|
+
* @param backend The backend to route requests to
|
|
107
|
+
* @param pathType How the path is matched against request paths
|
|
108
|
+
*/
|
|
109
|
+
addRule(path, backend, pathType) {
|
|
110
|
+
this.addRules({ backend, path, pathType });
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Adds rules to this ingress.
|
|
114
|
+
* @param rules The rules to add
|
|
115
|
+
*/
|
|
116
|
+
addRules(...rules) {
|
|
117
|
+
for (const rule of rules) {
|
|
118
|
+
// default backend is not really a rule
|
|
119
|
+
if (!rule.host && !rule.path) {
|
|
120
|
+
if (this._defaultBackend) {
|
|
121
|
+
throw new Error('a default backend is already defined for this ingress');
|
|
122
|
+
}
|
|
123
|
+
this._defaultBackend = rule.backend;
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
const host = rule.host ?? '';
|
|
127
|
+
const backend = rule.backend;
|
|
128
|
+
const path = rule.path ?? '/';
|
|
129
|
+
const pathType = rule.pathType ?? HttpIngressPathType.PREFIX;
|
|
130
|
+
if (path && !path.startsWith('/')) {
|
|
131
|
+
throw new Error(`ingress paths must begin with a "/": ${path}`);
|
|
132
|
+
}
|
|
133
|
+
const routes = this._rulesPerHost[host] = this._rulesPerHost[host] ?? [];
|
|
134
|
+
// check if we already have a rule for this host/path
|
|
135
|
+
if (routes.find(r => r.path === path)) {
|
|
136
|
+
throw new Error(`there is already an ingress rule for ${host}${path}`);
|
|
137
|
+
}
|
|
138
|
+
routes.push({
|
|
139
|
+
backend: backend._toKube(),
|
|
140
|
+
path,
|
|
141
|
+
pathType,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
synthRules() {
|
|
146
|
+
const rules = new Array();
|
|
147
|
+
for (const [host, paths] of Object.entries(this._rulesPerHost)) {
|
|
148
|
+
rules.push({
|
|
149
|
+
host: host ? host : undefined,
|
|
150
|
+
http: { paths: paths.sort(sortByPath) },
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
return rules.length > 0 ? rules : undefined;
|
|
154
|
+
}
|
|
155
|
+
addTls(tls) {
|
|
156
|
+
this._tlsConfig.push(...tls);
|
|
157
|
+
}
|
|
158
|
+
tlsConfig() {
|
|
159
|
+
if (this._tlsConfig.length == 0) {
|
|
160
|
+
return undefined;
|
|
161
|
+
}
|
|
162
|
+
const tls = new Array();
|
|
163
|
+
for (const entry of this._tlsConfig) {
|
|
164
|
+
tls.push({
|
|
165
|
+
hosts: entry.hosts,
|
|
166
|
+
secretName: entry.secret?.name,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
return tls;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
exports.Ingress = Ingress;
|
|
173
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
174
|
+
Ingress[_a] = { fqn: "cdk8s-plus-34.Ingress", version: "2.0.0" };
|
|
175
|
+
/**
|
|
176
|
+
* The backend for an ingress path.
|
|
177
|
+
*/
|
|
178
|
+
class IngressBackend {
|
|
179
|
+
/**
|
|
180
|
+
* A Kubernetes `Service` to use as the backend for this path.
|
|
181
|
+
* @param serv The service object.
|
|
182
|
+
*/
|
|
183
|
+
static fromService(serv, options = {}) {
|
|
184
|
+
if (serv.ports.length === 0) {
|
|
185
|
+
throw new Error('service does not expose any ports');
|
|
186
|
+
}
|
|
187
|
+
let servicePort;
|
|
188
|
+
if (serv.ports.length === 1) {
|
|
189
|
+
servicePort = serv.ports[0].port;
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
if (options.port !== undefined) {
|
|
193
|
+
const found = serv.ports.find(p => p.port === options.port);
|
|
194
|
+
if (found) {
|
|
195
|
+
servicePort = found.port;
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
throw new Error(`service exposes ports ${serv.ports.map(p => p.port).join(',')} but backend is defined to use port ${options.port}`);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
throw new Error(`unable to determine service port since service exposes multiple ports: ${serv.ports.map(x => x.port).join(',')}`);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
if (options.port !== undefined && servicePort !== options.port) {
|
|
206
|
+
throw new Error(`backend defines port ${options.port} but service exposes port ${servicePort}`);
|
|
207
|
+
}
|
|
208
|
+
return new IngressBackend({
|
|
209
|
+
service: {
|
|
210
|
+
name: serv.name,
|
|
211
|
+
port: { number: servicePort },
|
|
212
|
+
},
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* A Resource backend is an ObjectRef to another Kubernetes resource
|
|
217
|
+
* within the same namespace as the Ingress object.
|
|
218
|
+
* A common usage for a Resource backend is to ingress data to an object
|
|
219
|
+
* storage backend with static assets.
|
|
220
|
+
*/
|
|
221
|
+
static fromResource(resource) {
|
|
222
|
+
return new IngressBackend({
|
|
223
|
+
resource: {
|
|
224
|
+
kind: resource.kind,
|
|
225
|
+
name: resource.name,
|
|
226
|
+
apiGroup: resource.apiGroup,
|
|
227
|
+
},
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
constructor(backend) {
|
|
231
|
+
this.backend = backend;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* @internal
|
|
235
|
+
*/
|
|
236
|
+
_toKube() { return this.backend; }
|
|
237
|
+
}
|
|
238
|
+
exports.IngressBackend = IngressBackend;
|
|
239
|
+
_b = JSII_RTTI_SYMBOL_1;
|
|
240
|
+
IngressBackend[_b] = { fqn: "cdk8s-plus-34.IngressBackend", version: "2.0.0" };
|
|
241
|
+
function sortByPath(lhs, rhs) {
|
|
242
|
+
const p1 = lhs.path ?? '';
|
|
243
|
+
const p2 = rhs.path ?? '';
|
|
244
|
+
return p1.localeCompare(p2);
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5ncmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmdyZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsaUNBQXdDO0FBRXhDLCtCQUErQjtBQUMvQixxQ0FBcUM7QUFpRHJDOzs7O0dBSUc7QUFDSCxJQUFZLG1CQWVYO0FBZkQsV0FBWSxtQkFBbUI7SUFDN0I7O09BRUc7SUFDSCx3Q0FBaUIsQ0FBQTtJQUVqQjs7T0FFRztJQUNILHNDQUFlLENBQUE7SUFFZjs7T0FFRztJQUNILHlFQUFrRCxDQUFBO0FBQ3BELENBQUMsRUFmVyxtQkFBbUIsbUNBQW5CLG1CQUFtQixRQWU5QjtBQUVEOzs7OztHQUtHO0FBQ0gsTUFBYSxPQUFRLFNBQVEsSUFBSSxDQUFDLFFBQVE7SUFheEMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxRQUFzQixFQUFFO1FBQ2hFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFQSCxpQkFBWSxHQUFHLFdBQVcsQ0FBQztRQUUxQixrQkFBYSxHQUE4QyxFQUFFLENBQUM7UUFFOUQsZUFBVSxHQUFpQixFQUFFLENBQUM7UUFLN0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtZQUNyRCxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7WUFDeEIsSUFBSSxFQUFFO2dCQUNKLGNBQWMsRUFBRSxZQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQztnQkFDNUUsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLFNBQVM7Z0JBQ2pDLEtBQUssRUFBRSxZQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO2dCQUNyRCxH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RUFBRSxXQUFXLEVBQUU7YUFDOUI7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQXdCO1FBQ2pELE9BQU8sSUFBSSxjQUFjLENBQUM7WUFDeEIsUUFBUSxFQUFFO2dCQUNSLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtnQkFDbkIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO2dCQUNuQixRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVE7YUFDNUI7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsWUFBcUMsT0FBMkI7UUFBM0IsWUFBTyxHQUFQLE9BQU8sQ0FBb0I7SUFFaEUsQ0FBQztJQUVEOztPQUVHO0lBQ0ksT0FBTyxLQUFLLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7O0FBN0QzQyx3Q0E4REM7OztBQTRFRCxTQUFTLFVBQVUsQ0FBQyxHQUF3QixFQUFFLEdBQXdCO0lBQ3BFLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQzFCLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQzFCLE9BQU8sRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXBpT2JqZWN0LCBMYXp5IH0gZnJvbSAnY2RrOHMnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgKiBhcyBiYXNlIGZyb20gJy4vYmFzZSc7XG5pbXBvcnQgKiBhcyBrOHMgZnJvbSAnLi9pbXBvcnRzL2s4cyc7XG5pbXBvcnQgKiBhcyBzZWNyZXQgZnJvbSAnLi9zZWNyZXQnO1xuaW1wb3J0ICogYXMgc2VydmljZSBmcm9tICcuL3NlcnZpY2UnO1xuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGBJbmdyZXNzYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmdyZXNzUHJvcHMgZXh0ZW5kcyBiYXNlLlJlc291cmNlUHJvcHMge1xuICAvKipcbiAgICogVGhlIGRlZmF1bHQgYmFja2VuZCBzZXJ2aWNlcyByZXF1ZXN0cyB0aGF0IGRvIG5vdCBtYXRjaCBhbnkgcnVsZS5cbiAgICpcbiAgICogVXNpbmcgdGhpcyBvcHRpb24gb3IgdGhlIGBhZGREZWZhdWx0QmFja2VuZCgpYCBtZXRob2QgaXMgZXF1aXZhbGVudCB0b1xuICAgKiBhZGRpbmcgYSBydWxlIHdpdGggYm90aCBgcGF0aGAgYW5kIGBob3N0YCB1bmRlZmluZWQuXG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0QmFja2VuZD86IEluZ3Jlc3NCYWNrZW5kO1xuXG4gIC8qKlxuICAgKiBSb3V0aW5nIHJ1bGVzIGZvciB0aGlzIGluZ3Jlc3MuXG4gICAqXG4gICAqIEVhY2ggcnVsZSBtdXN0IGRlZmluZSBhbiBgSW5ncmVzc0JhY2tlbmRgIHRoYXQgd2lsbCByZWNlaXZlIHRoZSByZXF1ZXN0c1xuICAgKiB0aGF0IG1hdGNoIHRoaXMgcnVsZS4gSWYgYm90aCBgaG9zdGAgYW5kIGBwYXRoYCBhcmUgbm90IHNwZWNpZmllYywgdGhpc1xuICAgKiBiYWNrZW5kIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBiYWNrZW5kIG9mIHRoZSBpbmdyZXNzLlxuICAgKlxuICAgKiBZb3UgY2FuIGFsc28gYWRkIHJ1bGVzIGxhdGVyIHVzaW5nIGBhZGRSdWxlKClgLCBgYWRkSG9zdFJ1bGUoKWAsXG4gICAqIGBhZGREZWZhdWx0QmFja2VuZCgpYCBhbmQgYGFkZEhvc3REZWZhdWx0QmFja2VuZCgpYC5cbiAgICovXG4gIHJlYWRvbmx5IHJ1bGVzPzogSW5ncmVzc1J1bGVbXTtcblxuXG4gIC8qKlxuICAgKiBUTFMgc2V0dGluZ3MgZm9yIHRoaXMgaW5ncmVzcy5cbiAgICpcbiAgICogVXNpbmcgdGhpcyBvcHRpb24gdGVsbHMgdGhlIGluZ3Jlc3MgY29udHJvbGxlciB0byBleHBvc2UgYSBUTFMgZW5kcG9pbnQuXG4gICAqIEN1cnJlbnRseSB0aGUgSW5ncmVzcyBvbmx5IHN1cHBvcnRzIGEgc2luZ2xlIFRMUyBwb3J0LCA0NDMuIElmIG11bHRpcGxlXG4gICAqIG1lbWJlcnMgb2YgdGhpcyBsaXN0IHNwZWNpZnkgZGlmZmVyZW50IGhvc3RzLCB0aGV5IHdpbGwgYmUgbXVsdGlwbGV4ZWQgb25cbiAgICogdGhlIHNhbWUgcG9ydCBhY2NvcmRpbmcgdG8gdGhlIGhvc3RuYW1lIHNwZWNpZmllZCB0aHJvdWdoIHRoZSBTTkkgVExTXG4gICAqIGV4dGVuc2lvbiwgaWYgdGhlIGluZ3Jlc3MgY29udHJvbGxlciBmdWxmaWxsaW5nIHRoZSBpbmdyZXNzIHN1cHBvcnRzIFNOSS5cbiAgICovXG4gIHJlYWRvbmx5IHRscz86IEluZ3Jlc3NUbHNbXTtcblxuICAvKipcbiAgICogQ2xhc3MgTmFtZSBmb3IgdGhpcyBpbmdyZXNzLlxuICAgKlxuICAgKiBUaGlzIGZpZWxkIGlzIGEgcmVmZXJlbmNlIHRvIGFuIEluZ3Jlc3NDbGFzcyByZXNvdXJjZSB0aGF0IGNvbnRhaW5zXG4gICAqIGFkZGl0aW9uYWwgSW5ncmVzcyBjb25maWd1cmF0aW9uLCBpbmNsdWRpbmcgdGhlIG5hbWUgb2YgdGhlIEluZ3Jlc3MgY29udHJvbGxlci5cbiAgICovXG4gIHJlYWRvbmx5IGNsYXNzTmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBTcGVjaWZ5IGhvdyB0aGUgcGF0aCBpcyBtYXRjaGVkIGFnYWluc3QgcmVxdWVzdCBwYXRocy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL3NlcnZpY2VzLW5ldHdvcmtpbmcvaW5ncmVzcy8jcGF0aC10eXBlc1xuICovXG5leHBvcnQgZW51bSBIdHRwSW5ncmVzc1BhdGhUeXBlIHtcbiAgLyoqXG4gICAqIE1hdGNoZXMgdGhlIFVSTCBwYXRoIGV4YWN0bHkuXG4gICAqL1xuICBQUkVGSVggPSAnUHJlZml4JyxcblxuICAvKipcbiAgICogTWF0Y2hlcyBiYXNlZCBvbiBhIFVSTCBwYXRoIHByZWZpeCBzcGxpdCBieSAnLycuXG4gICAqL1xuICBFWEFDVCA9ICdFeGFjdCcsXG5cbiAgLyoqXG4gICAqIE1hdGNoaW5nIGlzIHNwZWNpZmllZCBieSB0aGUgdW5kZXJseWluZyBJbmdyZXNzQ2xhc3MuXG4gICAqL1xuICBJTVBMRU1FTlRBVElPTl9TUEVDSUZJQyA9ICdJbXBsZW1lbnRhdGlvblNwZWNpZmljJyxcbn1cblxuLyoqXG4gKiBJbmdyZXNzIGlzIGEgY29sbGVjdGlvbiBvZiBydWxlcyB0aGF0IGFsbG93IGluYm91bmQgY29ubmVjdGlvbnMgdG8gcmVhY2ggdGhlXG4gKiBlbmRwb2ludHMgZGVmaW5lZCBieSBhIGJhY2tlbmQuIEFuIEluZ3Jlc3MgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gZ2l2ZSBzZXJ2aWNlc1xuICogZXh0ZXJuYWxseS1yZWFjaGFibGUgdXJscywgbG9hZCBiYWxhbmNlIHRyYWZmaWMsIHRlcm1pbmF0ZSBTU0wsIG9mZmVyIG5hbWVcbiAqIGJhc2VkIHZpcnR1YWwgaG9zdGluZyBldGMuXG4gKi9cbmV4cG9ydCBjbGFzcyBJbmdyZXNzIGV4dGVuZHMgYmFzZS5SZXNvdXJjZSB7XG5cbiAgLyoqXG4gICAqIEBzZWUgYmFzZS5SZXNvdXJjZS5hcGlPYmplY3RcbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBhcGlPYmplY3Q6IEFwaU9iamVjdDtcblxuICBwdWJsaWMgcmVhZG9ubHkgcmVzb3VyY2VUeXBlID0gJ2luZ3Jlc3Nlcyc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfcnVsZXNQZXJIb3N0OiB7IFtob3N0OiBzdHJpbmddOiBrOHMuSHR0cEluZ3Jlc3NQYXRoW10gfSA9IHt9O1xuICBwcml2YXRlIF9kZWZhdWx0QmFja2VuZD86IEluZ3Jlc3NCYWNrZW5kO1xuICBwcml2YXRlIHJlYWRvbmx5IF90bHNDb25maWc6IEluZ3Jlc3NUbHNbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBJbmdyZXNzUHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLmFwaU9iamVjdCA9IG5ldyBrOHMuS3ViZUluZ3Jlc3ModGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgbWV0YWRhdGE6IHByb3BzLm1ldGFkYXRhLFxuICAgICAgc3BlYzoge1xuICAgICAgICBkZWZhdWx0QmFja2VuZDogTGF6eS5hbnkoeyBwcm9kdWNlOiAoKSA9PiB0aGlzLl9kZWZhdWx0QmFja2VuZD8uX3RvS3ViZSgpIH0pLFxuICAgICAgICBpbmdyZXNzQ2xhc3NOYW1lOiBwcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHJ1bGVzOiBMYXp5LmFueSh7IHByb2R1Y2U6ICgpID0+IHRoaXMuc3ludGhSdWxlcygpIH0pLFxuICAgICAgICB0bHM6IExhenkuYW55KHsgcHJvZHVjZTogKCkgPT4gdGhpcy50bHNDb25maWcoKSB9KSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBpZiAocHJvcHMuZGVmYXVsdEJhY2tlbmQpIHtcbiAgICAgIHRoaXMuYWRkRGVmYXVsdEJhY2tlbmQocHJvcHMuZGVmYXVsdEJhY2tlbmQpO1xuICAgIH1cblxuICAgIHRoaXMuYWRkUnVsZXMoLi4ucHJvcHMucnVsZXMgPz8gW10pO1xuXG4gICAgaWYgKHByb3BzLnRscykge1xuICAgICAgdGhpcy5hZGRUbHMocHJvcHMudGxzKTtcbiAgICB9XG5cbiAgICB0aGlzLm5vZGUuYWRkVmFsaWRhdGlvbih7IHZhbGlkYXRlOiAoKSA9PiB0aGlzLl92YWxpZGF0ZSgpIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfdmFsaWRhdGUoKSB7XG4gICAgaWYgKCF0aGlzLl9kZWZhdWx0QmFja2VuZCAmJiBPYmplY3Qua2V5cyh0aGlzLl9ydWxlc1Blckhvc3QpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFsnaW5ncmVzcyB3aXRoIG5vIHJ1bGVzIG9yIGRlZmF1bHQgYmFja2VuZCddO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lcyB0aGUgZGVmYXVsdCBiYWNrZW5kIGZvciB0aGlzIGluZ3Jlc3MuIEEgZGVmYXVsdCBiYWNrZW5kIGNhcGFibGUgb2ZcbiAgICogc2VydmljaW5nIHJlcXVlc3RzIHRoYXQgZG9uJ3QgbWF0Y2ggYW55IHJ1bGUuXG4gICAqXG4gICAqIEBwYXJhbSBiYWNrZW5kIFRoZSBiYWNrZW5kIHRvIHVzZSBmb3IgcmVxdWVzdHMgdGhhdCBkbyBub3QgbWF0Y2ggYW55IHJ1bGUuXG4gICAqL1xuICBwdWJsaWMgYWRkRGVmYXVsdEJhY2tlbmQoYmFja2VuZDogSW5ncmVzc0JhY2tlbmQpIHtcbiAgICB0aGlzLmFkZFJ1bGVzKHsgYmFja2VuZCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IGEgZGVmYXVsdCBiYWNrZW5kIGZvciBhIHNwZWNpZmljIGhvc3QgbmFtZS4gVGhpcyBiYWNrZW5kIHdpbGwgYmUgdXNlZCBhcyBhIGNhdGNoLWFsbCBmb3IgcmVxdWVzdHNcbiAgICogdGFyZ2V0ZWQgdG8gdGhpcyBob3N0IG5hbWUgKHRoZSBgSG9zdGAgaGVhZGVyIG1hdGNoZXMgdGhpcyB2YWx1ZSkuXG4gICAqXG4gICAqIEBwYXJhbSBob3N0IFRoZSBob3N0IG5hbWUgdG8gbWF0Y2hcbiAgICogQHBhcmFtIGJhY2tlbmQgVGhlIGJhY2tlbmQgdG8gcm91dGUgdG9cbiAgICovXG4gIHB1YmxpYyBhZGRIb3N0RGVmYXVsdEJhY2tlbmQoaG9zdDogc3RyaW5nLCBiYWNrZW5kOiBJbmdyZXNzQmFja2VuZCkge1xuICAgIGlmICghaG9zdCkgeyB0aHJvdyBuZXcgRXJyb3IoJ2hvc3QgbXVzdCBub3QgYmUgYW4gZW1wdHkgc3RyaW5nJyk7IH1cbiAgICB0aGlzLmFkZFJ1bGVzKHsgaG9zdCwgYmFja2VuZCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGluZ3Jlc3MgcnVsZSBhcHBsaWVkIHRvIHJlcXVlc3RzIHRvIGEgc3BlY2lmaWMgaG9zdCBhbmQgYSBzcGVjaWZpY1xuICAgKiBIVFRQIHBhdGggKHRoZSBgSG9zdGAgaGVhZGVyIG1hdGNoZXMgdGhpcyB2YWx1ZSkuXG4gICAqXG4gICAqIEBwYXJhbSBob3N0IFRoZSBob3N0IG5hbWVcbiAgICogQHBhcmFtIHBhdGggVGhlIEhUVFAgcGF0aFxuICAgKiBAcGFyYW0gYmFja2VuZCBUaGUgYmFja2VuZCB0byByb3V0ZSByZXF1ZXN0cyB0b1xuICAgKiBAcGFyYW0gcGF0aFR5cGUgSG93IHRoZSBwYXRoIGlzIG1hdGNoZWQgYWdhaW5zdCByZXF1ZXN0IHBhdGhzXG4gICAqL1xuICBwdWJsaWMgYWRkSG9zdFJ1bGUoaG9zdDogc3RyaW5nLCBwYXRoOiBzdHJpbmcsIGJhY2tlbmQ6IEluZ3Jlc3NCYWNrZW5kLCBwYXRoVHlwZT86IEh0dHBJbmdyZXNzUGF0aFR5cGUpIHtcbiAgICBpZiAoIWhvc3QpIHsgdGhyb3cgbmV3IEVycm9yKCdob3N0IG11c3Qgbm90IGJlIGFuIGVtcHR5IHN0cmluZycpOyB9XG4gICAgdGhpcy5hZGRSdWxlcyh7IGhvc3QsIGJhY2tlbmQsIHBhdGgsIHBhdGhUeXBlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gaW5ncmVzcyBydWxlIGFwcGxpZWQgdG8gcmVxdWVzdHMgc2VudCB0byBhIHNwZWNpZmljIEhUVFAgcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggVGhlIEhUVFAgcGF0aFxuICAgKiBAcGFyYW0gYmFja2VuZCBUaGUgYmFja2VuZCB0byByb3V0ZSByZXF1ZXN0cyB0b1xuICAgKiBAcGFyYW0gcGF0aFR5cGUgSG93IHRoZSBwYXRoIGlzIG1hdGNoZWQgYWdhaW5zdCByZXF1ZXN0IHBhdGhzXG4gICAqL1xuICBwdWJsaWMgYWRkUnVsZShwYXRoOiBzdHJpbmcsIGJhY2tlbmQ6IEluZ3Jlc3NCYWNrZW5kLCBwYXRoVHlwZT86IEh0dHBJbmdyZXNzUGF0aFR5cGUpIHtcbiAgICB0aGlzLmFkZFJ1bGVzKHsgYmFja2VuZCwgcGF0aCwgcGF0aFR5cGUgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBydWxlcyB0byB0aGlzIGluZ3Jlc3MuXG4gICAqIEBwYXJhbSBydWxlcyBUaGUgcnVsZXMgdG8gYWRkXG4gICAqL1xuICBwdWJsaWMgYWRkUnVsZXMoLi4ucnVsZXM6IEluZ3Jlc3NSdWxlW10pIHtcbiAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgcnVsZXMpIHtcblxuICAgICAgLy8gZGVmYXVsdCBiYWNrZW5kIGlzIG5vdCByZWFsbHkgYSBydWxlXG4gICAgICBpZiAoIXJ1bGUuaG9zdCAmJiAhcnVsZS5wYXRoKSB7XG4gICAgICAgIGlmICh0aGlzLl9kZWZhdWx0QmFja2VuZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYSBkZWZhdWx0IGJhY2tlbmQgaXMgYWxyZWFkeSBkZWZpbmVkIGZvciB0aGlzIGluZ3Jlc3MnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9kZWZhdWx0QmFja2VuZCA9IHJ1bGUuYmFja2VuZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhvc3QgPSBydWxlLmhvc3QgPz8gJyc7XG4gICAgICBjb25zdCBiYWNrZW5kID0gcnVsZS5iYWNrZW5kO1xuICAgICAgY29uc3QgcGF0aCA9IHJ1bGUucGF0aCA/PyAnLyc7XG4gICAgICBjb25zdCBwYXRoVHlwZSA9IHJ1bGUucGF0aFR5cGUgPz8gSHR0cEluZ3Jlc3NQYXRoVHlwZS5QUkVGSVg7XG5cbiAgICAgIGlmIChwYXRoICYmICFwYXRoLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGluZ3Jlc3MgcGF0aHMgbXVzdCBiZWdpbiB3aXRoIGEgXCIvXCI6ICR7cGF0aH1gKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgcm91dGVzID0gdGhpcy5fcnVsZXNQZXJIb3N0W2hvc3RdID0gdGhpcy5fcnVsZXNQZXJIb3N0W2hvc3RdID8/IFtdO1xuXG4gICAgICAvLyBjaGVjayBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBydWxlIGZvciB0aGlzIGhvc3QvcGF0aFxuICAgICAgaWYgKHJvdXRlcy5maW5kKHIgPT4gci5wYXRoID09PSBwYXRoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHRoZXJlIGlzIGFscmVhZHkgYW4gaW5ncmVzcyBydWxlIGZvciAke2hvc3R9JHtwYXRofWApO1xuICAgICAgfVxuXG4gICAgICByb3V0ZXMucHVzaCh7XG4gICAgICAgIGJhY2tlbmQ6IGJhY2tlbmQuX3RvS3ViZSgpLFxuICAgICAgICBwYXRoLFxuICAgICAgICBwYXRoVHlwZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3ludGhSdWxlcygpOiB1bmRlZmluZWQgfCBrOHMuSW5ncmVzc1J1bGVbXSB7XG4gICAgY29uc3QgcnVsZXMgPSBuZXcgQXJyYXk8azhzLkluZ3Jlc3NSdWxlPigpO1xuXG4gICAgZm9yIChjb25zdCBbaG9zdCwgcGF0aHNdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuX3J1bGVzUGVySG9zdCkpIHtcbiAgICAgIHJ1bGVzLnB1c2goe1xuICAgICAgICBob3N0OiBob3N0ID8gaG9zdCA6IHVuZGVmaW5lZCxcbiAgICAgICAgaHR0cDogeyBwYXRoczogcGF0aHMuc29ydChzb3J0QnlQYXRoKSB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJ1bGVzLmxlbmd0aCA+IDAgPyBydWxlcyA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBhZGRUbHModGxzOiBJbmdyZXNzVGxzW10pIHtcbiAgICB0aGlzLl90bHNDb25maWcucHVzaCguLi50bHMpO1xuICB9XG5cbiAgcHJpdmF0ZSB0bHNDb25maWcoKTogdW5kZWZpbmVkIHwgazhzLkluZ3Jlc3NUbHNbXSB7XG4gICAgaWYgKHRoaXMuX3Rsc0NvbmZpZy5sZW5ndGggPT0gMCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCB0bHMgPSBuZXcgQXJyYXk8azhzLkluZ3Jlc3NUbHM+KCk7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLl90bHNDb25maWcpIHtcbiAgICAgIHRscy5wdXNoKHtcbiAgICAgICAgaG9zdHM6IGVudHJ5Lmhvc3RzLFxuICAgICAgICBzZWNyZXROYW1lOiBlbnRyeS5zZWNyZXQ/Lm5hbWUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGxzO1xuICB9XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc2V0dGluZyB1cCBiYWNrZW5kcyBmb3IgaW5ncmVzcyBydWxlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlSW5ncmVzc0JhY2tlbmRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBwb3J0IHRvIHVzZSB0byBhY2Nlc3MgdGhlIHNlcnZpY2UuXG4gICAqXG4gICAqIC0gVGhpcyBvcHRpb24gd2lsbCBmYWlsIGlmIHRoZSBzZXJ2aWNlIGRvZXMgbm90IGV4cG9zZSBhbnkgcG9ydHMuXG4gICAqIC0gSWYgdGhlIHNlcnZpY2UgZXhwb3NlcyBtdWx0aXBsZSBwb3J0cywgdGhpcyBvcHRpb24gbXVzdCBiZSBzcGVjaWZpZWQuXG4gICAqIC0gSWYgdGhlIHNlcnZpY2UgZXhwb3NlcyBhIHNpbmdsZSBwb3J0LCB0aGlzIG9wdGlvbiBpcyBvcHRpb25hbCBhbmQgaWZcbiAgICogICBzcGVjaWZpZWQsIGl0IG11c3QgYmUgdGhlIHNhbWUgcG9ydCBleHBvc2VkIGJ5IHRoZSBzZXJ2aWNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGlmIHRoZSBzZXJ2aWNlIGV4cG9zZXMgYSBzaW5nbGUgcG9ydCwgdGhpcyBwb3J0IHdpbGwgYmUgdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IHBvcnQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIGJhY2tlbmQgZm9yIGFuIGluZ3Jlc3MgcGF0aC5cbiAqL1xuZXhwb3J0IGNsYXNzIEluZ3Jlc3NCYWNrZW5kIHtcbiAgLyoqXG4gICAqIEEgS3ViZXJuZXRlcyBgU2VydmljZWAgdG8gdXNlIGFzIHRoZSBiYWNrZW5kIGZvciB0aGlzIHBhdGguXG4gICAqIEBwYXJhbSBzZXJ2IFRoZSBzZXJ2aWNlIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVNlcnZpY2Uoc2Vydjogc2VydmljZS5TZXJ2aWNlLCBvcHRpb25zOiBTZXJ2aWNlSW5ncmVzc0JhY2tlbmRPcHRpb25zID0ge30pIHtcbiAgICBpZiAoc2Vydi5wb3J0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2VydmljZSBkb2VzIG5vdCBleHBvc2UgYW55IHBvcnRzJyk7XG4gICAgfVxuXG4gICAgbGV0IHNlcnZpY2VQb3J0O1xuICAgIGlmIChzZXJ2LnBvcnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgc2VydmljZVBvcnQgPSBzZXJ2LnBvcnRzWzBdLnBvcnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChvcHRpb25zLnBvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBmb3VuZCA9IHNlcnYucG9ydHMuZmluZChwID0+IHAucG9ydCA9PT0gb3B0aW9ucy5wb3J0KTtcbiAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgc2VydmljZVBvcnQgPSBmb3VuZC5wb3J0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgc2VydmljZSBleHBvc2VzIHBvcnRzICR7c2Vydi5wb3J0cy5tYXAocCA9PiBwLnBvcnQpLmpvaW4oJywnKX0gYnV0IGJhY2tlbmQgaXMgZGVmaW5lZCB0byB1c2UgcG9ydCAke29wdGlvbnMucG9ydH1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmFibGUgdG8gZGV0ZXJtaW5lIHNlcnZpY2UgcG9ydCBzaW5jZSBzZXJ2aWNlIGV4cG9zZXMgbXVsdGlwbGUgcG9ydHM6ICR7c2Vydi5wb3J0cy5tYXAoeCA9PiB4LnBvcnQpLmpvaW4oJywnKX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5wb3J0ICE9PSB1bmRlZmluZWQgJiYgc2VydmljZVBvcnQgIT09IG9wdGlvbnMucG9ydCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBiYWNrZW5kIGRlZmluZXMgcG9ydCAke29wdGlvbnMucG9ydH0gYnV0IHNlcnZpY2UgZXhwb3NlcyBwb3J0ICR7c2VydmljZVBvcnR9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbmdyZXNzQmFja2VuZCh7XG4gICAgICBzZXJ2aWNlOiB7XG4gICAgICAgIG5hbWU6IHNlcnYubmFtZSxcbiAgICAgICAgcG9ydDogeyBudW1iZXI6IHNlcnZpY2VQb3J0IH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgUmVzb3VyY2UgYmFja2VuZCBpcyBhbiBPYmplY3RSZWYgdG8gYW5vdGhlciBLdWJlcm5ldGVzIHJlc291cmNlXG4gICAqIHdpdGhpbiB0aGUgc2FtZSBuYW1lc3BhY2UgYXMgdGhlIEluZ3Jlc3Mgb2JqZWN0LlxuICAgKiBBIGNvbW1vbiB1c2FnZSBmb3IgYSBSZXNvdXJjZSBiYWNrZW5kIGlzIHRvIGluZ3Jlc3MgZGF0YSB0byBhbiBvYmplY3RcbiAgICogc3RvcmFnZSBiYWNrZW5kIHdpdGggc3RhdGljIGFzc2V0cy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVJlc291cmNlKHJlc291cmNlOiBiYXNlLklSZXNvdXJjZSkge1xuICAgIHJldHVybiBuZXcgSW5ncmVzc0JhY2tlbmQoe1xuICAgICAgcmVzb3VyY2U6IHtcbiAgICAgICAga2luZDogcmVzb3VyY2Uua2luZCxcbiAgICAgICAgbmFtZTogcmVzb3VyY2UubmFtZSxcbiAgICAgICAgYXBpR3JvdXA6IHJlc291cmNlLmFwaUdyb3VwLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBiYWNrZW5kOiBrOHMuSW5ncmVzc0JhY2tlbmQpIHtcblxuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF90b0t1YmUoKSB7IHJldHVybiB0aGlzLmJhY2tlbmQ7IH1cbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBydWxlcyBtYXBwaW5nIHRoZSBwYXRocyB1bmRlciBhIHNwZWNpZmllZCBob3N0IHRvIHRoZSByZWxhdGVkXG4gKiBiYWNrZW5kIHNlcnZpY2VzLiBJbmNvbWluZyByZXF1ZXN0cyBhcmUgZmlyc3QgZXZhbHVhdGVkIGZvciBhIGhvc3QgbWF0Y2gsXG4gKiB0aGVuIHJvdXRlZCB0byB0aGUgYmFja2VuZCBhc3NvY2lhdGVkIHdpdGggdGhlIG1hdGNoaW5nIHBhdGguXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5ncmVzc1J1bGUge1xuICAvKipcbiAgICogQmFja2VuZCBkZWZpbmVzIHRoZSByZWZlcmVuY2VkIHNlcnZpY2UgZW5kcG9pbnQgdG8gd2hpY2ggdGhlIHRyYWZmaWMgd2lsbFxuICAgKiBiZSBmb3J3YXJkZWQgdG8uXG4gICAqL1xuICByZWFkb25seSBiYWNrZW5kOiBJbmdyZXNzQmFja2VuZDtcblxuICAvKipcbiAgICogSG9zdCBpcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGRvbWFpbiBuYW1lIG9mIGEgbmV0d29yayBob3N0LCBhcyBkZWZpbmVkIGJ5XG4gICAqIFJGQyAzOTg2LiBOb3RlIHRoZSBmb2xsb3dpbmcgZGV2aWF0aW9ucyBmcm9tIHRoZSBcImhvc3RcIiBwYXJ0IG9mIHRoZSBVUkkgYXNcbiAgICogZGVmaW5lZCBpbiB0aGUgUkZDOiAxLiBJUHMgYXJlIG5vdCBhbGxvd2VkLiBDdXJyZW50bHkgYW4gSW5ncmVzc1J1bGVWYWx1ZVxuICAgKiBjYW4gb25seSBhcHBseSB0byB0aGUgSVAgaW4gdGhlIFNwZWMgb2YgdGhlIHBhcmVudCBJbmdyZXNzLiAyLiBUaGUgYDpgXG4gICAqIGRlbGltaXRlciBpcyBub3QgcmVzcGVjdGVkIGJlY2F1c2UgcG9ydHMgYXJlIG5vdCBhbGxvd2VkLiBDdXJyZW50bHkgdGhlXG4gICAqIHBvcnQgb2YgYW4gSW5ncmVzcyBpcyBpbXBsaWNpdGx5IDo4MCBmb3IgaHR0cCBhbmQgOjQ0MyBmb3IgaHR0cHMuIEJvdGhcbiAgICogdGhlc2UgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlLiBJbmNvbWluZyByZXF1ZXN0cyBhcmUgbWF0Y2hlZCBhZ2FpbnN0IHRoZVxuICAgKiBob3N0IGJlZm9yZSB0aGUgSW5ncmVzc1J1bGVWYWx1ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBJZiB0aGUgaG9zdCBpcyB1bnNwZWNpZmllZCwgdGhlIEluZ3Jlc3Mgcm91dGVzIGFsbCB0cmFmZmljIGJhc2VkXG4gICAqIG9uIHRoZSBzcGVjaWZpZWQgSW5ncmVzc1J1bGVWYWx1ZS5cbiAgICovXG4gIHJlYWRvbmx5IGhvc3Q/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhdGggaXMgYW4gZXh0ZW5kZWQgUE9TSVggcmVnZXggYXMgZGVmaW5lZCBieSBJRUVFIFN0ZCAxMDAzLjEsIChpLmUgdGhpc1xuICAgKiBmb2xsb3dzIHRoZSBlZ3JlcC91bml4IHN5bnRheCwgbm90IHRoZSBwZXJsIHN5bnRheCkgbWF0Y2hlZCBhZ2FpbnN0IHRoZVxuICAgKiBwYXRoIG9mIGFuIGluY29taW5nIHJlcXVlc3QuIEN1cnJlbnRseSBpdCBjYW4gY29udGFpbiBjaGFyYWN0ZXJzIGRpc2FsbG93ZWRcbiAgICogZnJvbSB0aGUgY29udmVudGlvbmFsIFwicGF0aFwiIHBhcnQgb2YgYSBVUkwgYXMgZGVmaW5lZCBieSBSRkMgMzk4Ni4gUGF0aHNcbiAgICogbXVzdCBiZWdpbiB3aXRoIGEgJy8nLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIElmIHVuc3BlY2lmaWVkLCB0aGUgcGF0aCBkZWZhdWx0cyB0byBhIGNhdGNoIGFsbCBzZW5kaW5nIHRyYWZmaWNcbiAgICogdG8gdGhlIGJhY2tlbmQuXG4gICAqL1xuICByZWFkb25seSBwYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IGhvdyB0aGUgcGF0aCBpcyBtYXRjaGVkIGFnYWluc3QgcmVxdWVzdCBwYXRocy4gQnkgZGVmYXVsdCwgcGF0aFxuICAgKiB0eXBlcyB3aWxsIGJlIG1hdGNoZWQgYnkgcHJlZml4LlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL3NlcnZpY2VzLW5ldHdvcmtpbmcvaW5ncmVzcy8jcGF0aC10eXBlc1xuICAgKi9cbiAgcmVhZG9ubHkgcGF0aFR5cGU/OiBIdHRwSW5ncmVzc1BhdGhUeXBlO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIFRMUyBjb25maWd1cmF0aW9uIG1hcHBpbmcgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIGluZ3Jlc3NcbiAqIGNvbnRyb2xsZXIgZm9yIFNTTCB0ZXJtaW5hdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmdyZXNzVGxzIHtcblxuICAvKipcbiAgICogSG9zdHMgYXJlIGEgbGlzdCBvZiBob3N0cyBpbmNsdWRlZCBpbiB0aGUgVExTIGNlcnRpZmljYXRlLiBUaGUgdmFsdWVzIGluXG4gICAqIHRoaXMgbGlzdCBtdXN0IG1hdGNoIHRoZSBuYW1lL3MgdXNlZCBpbiB0aGUgVExTIFNlY3JldC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBJZiB1bnNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gdGhlIHdpbGRjYXJkIGhvc3Qgc2V0dGluZyBmb3JcbiAgICogdGhlIGxvYWRiYWxhbmNlciBjb250cm9sbGVyIGZ1bGZpbGxpbmcgdGhpcyBJbmdyZXNzLlxuICAgKi9cbiAgcmVhZG9ubHkgaG9zdHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogU2VjcmV0IGlzIHRoZSBzZWNyZXQgdGhhdCBjb250YWlucyB0aGUgY2VydGlmaWNhdGUgYW5kIGtleSB1c2VkIHRvXG4gICAqIHRlcm1pbmF0ZSBTU0wgdHJhZmZpYyBvbiA0NDMuIElmIHRoZSBTTkkgaG9zdCBpbiBhIGxpc3RlbmVyIGNvbmZsaWN0cyB3aXRoXG4gICAqIHRoZSBcIkhvc3RcIiBoZWFkZXIgZmllbGQgdXNlZCBieSBhbiBJbmdyZXNzUnVsZSwgdGhlIFNOSSBob3N0IGlzIHVzZWQgZm9yXG4gICAqIHRlcm1pbmF0aW9uIGFuZCB2YWx1ZSBvZiB0aGUgSG9zdCBoZWFkZXIgaXMgdXNlZCBmb3Igcm91dGluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBJZiB1bnNwZWNpZmllZCwgaXQgYWxsb3dzIFNTTCByb3V0aW5nIGJhc2VkIG9uIFNOSSBob3N0bmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IHNlY3JldD86IHNlY3JldC5JU2VjcmV0O1xufVxuXG5mdW5jdGlvbiBzb3J0QnlQYXRoKGxoczogazhzLkh0dHBJbmdyZXNzUGF0aCwgcmhzOiBrOHMuSHR0cEluZ3Jlc3NQYXRoKSB7XG4gIGNvbnN0IHAxID0gbGhzLnBhdGggPz8gJyc7XG4gIGNvbnN0IHAyID0gcmhzLnBhdGggPz8gJyc7XG4gIHJldHVybiBwMS5sb2NhbGVDb21wYXJlKHAyKTtcbn1cbiJdfQ==
|
package/lib/job.d.ts
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { ApiObject, Duration } from 'cdk8s';
|
|
2
|
+
import { Construct } from 'constructs';
|
|
3
|
+
import * as k8s from './imports/k8s';
|
|
4
|
+
import * as workload from './workload';
|
|
5
|
+
/**
|
|
6
|
+
* Properties for `Job`.
|
|
7
|
+
*/
|
|
8
|
+
export interface JobProps extends workload.WorkloadProps {
|
|
9
|
+
/**
|
|
10
|
+
* Specifies the duration the job may be active before the system tries to terminate it.
|
|
11
|
+
*
|
|
12
|
+
* @default - If unset, then there is no deadline.
|
|
13
|
+
*/
|
|
14
|
+
readonly activeDeadline?: Duration;
|
|
15
|
+
/**
|
|
16
|
+
* Specifies the number of retries before marking this job failed.
|
|
17
|
+
*
|
|
18
|
+
* @default - If not set, system defaults to 6.
|
|
19
|
+
*/
|
|
20
|
+
readonly backoffLimit?: number;
|
|
21
|
+
/**
|
|
22
|
+
* Limits the lifetime of a Job that has finished execution (either Complete
|
|
23
|
+
* or Failed). If this field is set, after the Job finishes, it is eligible to
|
|
24
|
+
* be automatically deleted. When the Job is being deleted, its lifecycle
|
|
25
|
+
* guarantees (e.g. finalizers) will be honored. If this field is set to zero,
|
|
26
|
+
* the Job becomes eligible to be deleted immediately after it finishes. This
|
|
27
|
+
* field is alpha-level and is only honored by servers that enable the
|
|
28
|
+
* `TTLAfterFinished` feature.
|
|
29
|
+
*
|
|
30
|
+
* @default - If this field is unset, the Job won't be automatically deleted.
|
|
31
|
+
*/
|
|
32
|
+
readonly ttlAfterFinished?: Duration;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* A Job creates one or more Pods and ensures that a specified number of them successfully terminate. As pods successfully complete,
|
|
36
|
+
* the Job tracks the successful completions. When a specified number of successful completions is reached, the task (ie, Job) is complete.
|
|
37
|
+
* Deleting a Job will clean up the Pods it created. A simple case is to create one Job object in order to reliably run one Pod to completion.
|
|
38
|
+
* The Job object will start a new Pod if the first Pod fails or is deleted (for example due to a node hardware failure or a node reboot).
|
|
39
|
+
* You can also use a Job to run multiple Pods in parallel.
|
|
40
|
+
*/
|
|
41
|
+
export declare class Job extends workload.Workload {
|
|
42
|
+
/**
|
|
43
|
+
* Duration before job is terminated. If undefined, there is no deadline.
|
|
44
|
+
*/
|
|
45
|
+
readonly activeDeadline?: Duration;
|
|
46
|
+
/**
|
|
47
|
+
* Number of retries before marking failed.
|
|
48
|
+
*/
|
|
49
|
+
readonly backoffLimit?: number;
|
|
50
|
+
/**
|
|
51
|
+
* TTL before the job is deleted after it is finished.
|
|
52
|
+
*/
|
|
53
|
+
readonly ttlAfterFinished?: Duration;
|
|
54
|
+
/**
|
|
55
|
+
* @see base.Resource.apiObject
|
|
56
|
+
*/
|
|
57
|
+
protected readonly apiObject: ApiObject;
|
|
58
|
+
readonly resourceType = "jobs";
|
|
59
|
+
constructor(scope: Construct, id: string, props?: JobProps);
|
|
60
|
+
/**
|
|
61
|
+
* @internal
|
|
62
|
+
*/
|
|
63
|
+
_toKube(): k8s.JobSpec;
|
|
64
|
+
}
|