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.
Files changed (156) hide show
  1. package/.jsii +101649 -0
  2. package/CODE_OF_CONDUCT.md +3 -0
  3. package/CONTRIBUTING.md +185 -0
  4. package/DCO +34 -0
  5. package/LICENSE +202 -0
  6. package/NOTICE +1 -0
  7. package/OWNERS.md +5 -0
  8. package/README.md +21 -33
  9. package/SECURITY.md +5 -0
  10. package/cdk8s.yaml +11 -0
  11. package/docs/java.md +150009 -0
  12. package/docs/plus/config-map.md +98 -0
  13. package/docs/plus/container.md +133 -0
  14. package/docs/plus/cronjob.md +67 -0
  15. package/docs/plus/deployment.md +232 -0
  16. package/docs/plus/horizontal-pod-autoscaler.md +226 -0
  17. package/docs/plus/ingress.md +68 -0
  18. package/docs/plus/job.md +48 -0
  19. package/docs/plus/namespace.md +58 -0
  20. package/docs/plus/network-policy.md +341 -0
  21. package/docs/plus/pod.md +455 -0
  22. package/docs/plus/pv.md +82 -0
  23. package/docs/plus/pvc.md +77 -0
  24. package/docs/plus/rbac.md +104 -0
  25. package/docs/plus/secret.md +32 -0
  26. package/docs/plus/service-account.md +35 -0
  27. package/docs/plus/service.md +41 -0
  28. package/docs/plus/volume.md +84 -0
  29. package/docs/python.md +161196 -0
  30. package/docs/typescript.md +139649 -0
  31. package/git-hooks/README.md +9 -0
  32. package/git-hooks/prepare-commit-msg +18 -0
  33. package/git-hooks/setup.sh +10 -0
  34. package/lib/_action.d.ts +26 -0
  35. package/lib/_action.js +39 -0
  36. package/lib/api-resource.d.ts +298 -0
  37. package/lib/api-resource.js +430 -0
  38. package/lib/base.d.ts +79 -0
  39. package/lib/base.js +92 -0
  40. package/lib/config-map.d.ts +126 -0
  41. package/lib/config-map.js +159 -0
  42. package/lib/container.d.ts +1057 -0
  43. package/lib/container.js +845 -0
  44. package/lib/cron-job.d.ts +138 -0
  45. package/lib/cron-job.js +103 -0
  46. package/lib/daemon-set.d.ts +45 -0
  47. package/lib/daemon-set.js +55 -0
  48. package/lib/deployment.d.ts +235 -0
  49. package/lib/deployment.js +216 -0
  50. package/lib/handler.d.ts +62 -0
  51. package/lib/handler.js +54 -0
  52. package/lib/horizontal-pod-autoscaler.d.ts +500 -0
  53. package/lib/horizontal-pod-autoscaler.js +569 -0
  54. package/lib/imports/k8s.d.ts +25809 -0
  55. package/lib/imports/k8s.js +19238 -0
  56. package/lib/index.d.ts +26 -0
  57. package/lib/index.js +44 -0
  58. package/lib/ingress.d.ts +230 -0
  59. package/lib/ingress.js +246 -0
  60. package/lib/job.d.ts +64 -0
  61. package/lib/job.js +54 -0
  62. package/lib/namespace.d.ts +128 -0
  63. package/lib/namespace.js +109 -0
  64. package/lib/network-policy.d.ts +311 -0
  65. package/lib/network-policy.js +344 -0
  66. package/lib/pod.d.ts +1097 -0
  67. package/lib/pod.js +1147 -0
  68. package/lib/probe.d.ts +181 -0
  69. package/lib/probe.js +88 -0
  70. package/lib/pv.d.ts +375 -0
  71. package/lib/pv.js +273 -0
  72. package/lib/pvc.d.ts +163 -0
  73. package/lib/pvc.js +154 -0
  74. package/lib/role-binding.d.ts +138 -0
  75. package/lib/role-binding.js +165 -0
  76. package/lib/role.d.ts +268 -0
  77. package/lib/role.js +401 -0
  78. package/lib/secret.d.ts +195 -0
  79. package/lib/secret.js +185 -0
  80. package/lib/service-account.d.ts +83 -0
  81. package/lib/service-account.js +105 -0
  82. package/lib/service.d.ts +289 -0
  83. package/lib/service.js +182 -0
  84. package/lib/stateful-set.d.ts +206 -0
  85. package/lib/stateful-set.js +244 -0
  86. package/lib/utils.d.ts +4 -0
  87. package/lib/utils.js +33 -0
  88. package/lib/volume.d.ts +577 -0
  89. package/lib/volume.js +377 -0
  90. package/lib/workload.d.ts +121 -0
  91. package/lib/workload.js +122 -0
  92. package/node_modules/balanced-match/.github/FUNDING.yml +2 -0
  93. package/node_modules/balanced-match/LICENSE.md +21 -0
  94. package/node_modules/balanced-match/README.md +97 -0
  95. package/node_modules/balanced-match/index.js +62 -0
  96. package/node_modules/balanced-match/package.json +48 -0
  97. package/node_modules/brace-expansion/.github/FUNDING.yml +2 -0
  98. package/node_modules/brace-expansion/LICENSE +21 -0
  99. package/node_modules/brace-expansion/README.md +135 -0
  100. package/node_modules/brace-expansion/index.js +202 -0
  101. package/node_modules/brace-expansion/package.json +49 -0
  102. package/node_modules/minimatch/LICENSE +15 -0
  103. package/node_modules/minimatch/README.md +491 -0
  104. package/node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts +2 -0
  105. package/node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts.map +1 -0
  106. package/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js +14 -0
  107. package/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js.map +1 -0
  108. package/node_modules/minimatch/dist/commonjs/ast.d.ts +20 -0
  109. package/node_modules/minimatch/dist/commonjs/ast.d.ts.map +1 -0
  110. package/node_modules/minimatch/dist/commonjs/ast.js +747 -0
  111. package/node_modules/minimatch/dist/commonjs/ast.js.map +1 -0
  112. package/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts +8 -0
  113. package/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts.map +1 -0
  114. package/node_modules/minimatch/dist/commonjs/brace-expressions.js +152 -0
  115. package/node_modules/minimatch/dist/commonjs/brace-expressions.js.map +1 -0
  116. package/node_modules/minimatch/dist/commonjs/escape.d.ts +12 -0
  117. package/node_modules/minimatch/dist/commonjs/escape.d.ts.map +1 -0
  118. package/node_modules/minimatch/dist/commonjs/escape.js +22 -0
  119. package/node_modules/minimatch/dist/commonjs/escape.js.map +1 -0
  120. package/node_modules/minimatch/dist/commonjs/index.d.ts +98 -0
  121. package/node_modules/minimatch/dist/commonjs/index.d.ts.map +1 -0
  122. package/node_modules/minimatch/dist/commonjs/index.js +1023 -0
  123. package/node_modules/minimatch/dist/commonjs/index.js.map +1 -0
  124. package/node_modules/minimatch/dist/commonjs/package.json +3 -0
  125. package/node_modules/minimatch/dist/commonjs/unescape.d.ts +17 -0
  126. package/node_modules/minimatch/dist/commonjs/unescape.d.ts.map +1 -0
  127. package/node_modules/minimatch/dist/commonjs/unescape.js +24 -0
  128. package/node_modules/minimatch/dist/commonjs/unescape.js.map +1 -0
  129. package/node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts +2 -0
  130. package/node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts.map +1 -0
  131. package/node_modules/minimatch/dist/esm/assert-valid-pattern.js +10 -0
  132. package/node_modules/minimatch/dist/esm/assert-valid-pattern.js.map +1 -0
  133. package/node_modules/minimatch/dist/esm/ast.d.ts +20 -0
  134. package/node_modules/minimatch/dist/esm/ast.d.ts.map +1 -0
  135. package/node_modules/minimatch/dist/esm/ast.js +743 -0
  136. package/node_modules/minimatch/dist/esm/ast.js.map +1 -0
  137. package/node_modules/minimatch/dist/esm/brace-expressions.d.ts +8 -0
  138. package/node_modules/minimatch/dist/esm/brace-expressions.d.ts.map +1 -0
  139. package/node_modules/minimatch/dist/esm/brace-expressions.js +148 -0
  140. package/node_modules/minimatch/dist/esm/brace-expressions.js.map +1 -0
  141. package/node_modules/minimatch/dist/esm/escape.d.ts +12 -0
  142. package/node_modules/minimatch/dist/esm/escape.d.ts.map +1 -0
  143. package/node_modules/minimatch/dist/esm/escape.js +18 -0
  144. package/node_modules/minimatch/dist/esm/escape.js.map +1 -0
  145. package/node_modules/minimatch/dist/esm/index.d.ts +98 -0
  146. package/node_modules/minimatch/dist/esm/index.d.ts.map +1 -0
  147. package/node_modules/minimatch/dist/esm/index.js +1007 -0
  148. package/node_modules/minimatch/dist/esm/index.js.map +1 -0
  149. package/node_modules/minimatch/dist/esm/package.json +3 -0
  150. package/node_modules/minimatch/dist/esm/unescape.d.ts +17 -0
  151. package/node_modules/minimatch/dist/esm/unescape.d.ts.map +1 -0
  152. package/node_modules/minimatch/dist/esm/unescape.js +20 -0
  153. package/node_modules/minimatch/dist/esm/unescape.js.map +1 -0
  154. package/node_modules/minimatch/package.json +82 -0
  155. package/package.json +176 -6
  156. 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
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5ncmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmdyZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsaUNBQXdDO0FBRXhDLCtCQUErQjtBQUMvQixxQ0FBcUM7QUFpRHJDOzs7O0dBSUc7QUFDSCxJQUFZLG1CQWVYO0FBZkQsV0FBWSxtQkFBbUI7SUFDN0I7O09BRUc7SUFDSCx3Q0FBaUIsQ0FBQTtJQUVqQjs7T0FFRztJQUNILHNDQUFlLENBQUE7SUFFZjs7T0FFRztJQUNILHlFQUFrRCxDQUFBO0FBQ3BELENBQUMsRUFmVyxtQkFBbUIsbUNBQW5CLG1CQUFtQixRQWU5QjtBQUVEOzs7OztHQUtHO0FBQ0gsTUFBYSxPQUFRLFNBQVEsSUFBSSxDQUFDLFFBQVE7SUFheEMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxRQUFzQixFQUFFO1FBQ2hFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFQSCxpQkFBWSxHQUFHLFdBQVcsQ0FBQztRQUUxQixrQkFBYSxHQUE4QyxFQUFFLENBQUM7UUFFOUQsZUFBVSxHQUFpQixFQUFFLENBQUM7UUFLN0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtZQUNyRCxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7WUFDeEIsSUFBSSxFQUFFO2dCQUNKLGNBQWMsRUFBRSxZQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQztnQkFDNUUsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLFNBQVM7Z0JBQ2pDLEtBQUssRUFBRSxZQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO2dCQUNyRCxHQUFHLEVBQUUsWUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQzthQUNuRDtTQUNGLENBQUMsQ0FBQztRQUVILElBQUksS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRXBDLElBQUksS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekIsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVPLFNBQVM7UUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDMUUsT0FBTyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7UUFDdEQsQ0FBQztRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksaUJBQWlCLENBQUMsT0FBdUI7UUFDOUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHFCQUFxQixDQUFDLElBQVksRUFBRSxPQUF1QjtRQUNoRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFBQyxNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7UUFBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSSxXQUFXLENBQUMsSUFBWSxFQUFFLElBQVksRUFBRSxPQUF1QixFQUFFLFFBQThCO1FBQ3BHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztRQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLE9BQU8sQ0FBQyxJQUFZLEVBQUUsT0FBdUIsRUFBRSxRQUE4QjtRQUNsRixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7O09BR0c7SUFDSSxRQUFRLENBQUMsR0FBRyxLQUFvQjtRQUNyQyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBRXpCLHVDQUF1QztZQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDN0IsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7b0JBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsdURBQXVELENBQUMsQ0FBQztnQkFDM0UsQ0FBQztnQkFDRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7Z0JBQ3BDLFNBQVM7WUFDWCxDQUFDO1lBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7WUFDN0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUM3QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQztZQUM5QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLG1CQUFtQixDQUFDLE1BQU0sQ0FBQztZQUU3RCxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNsRSxDQUFDO1lBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUV6RSxxREFBcUQ7WUFDckQsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUN0QyxNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxJQUFJLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUN6RSxDQUFDO1lBRUQsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDVixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRTtnQkFDMUIsSUFBSTtnQkFDSixRQUFRO2FBQ1QsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFTyxVQUFVO1FBQ2hCLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxFQUFtQixDQUFDO1FBRTNDLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1lBQy9ELEtBQUssQ0FBQyxJQUFJLENBQUM7Z0JBQ1QsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTO2dCQUM3QixJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRTthQUN4QyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDOUMsQ0FBQztJQUVNLE1BQU0sQ0FBQyxHQUFpQjtRQUM3QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFTyxTQUFTO1FBQ2YsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNoQyxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxLQUFLLEVBQWtCLENBQUM7UUFDeEMsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEMsR0FBRyxDQUFDLElBQUksQ0FBQztnQkFDUCxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7Z0JBQ2xCLFVBQVUsRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLElBQUk7YUFDL0IsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQzs7QUFwS0gsMEJBcUtDOzs7QUFtQkQ7O0dBRUc7QUFDSCxNQUFhLGNBQWM7SUFDekI7OztPQUdHO0lBQ0ksTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFxQixFQUFFLFVBQXdDLEVBQUU7UUFDekYsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUVELElBQUksV0FBVyxDQUFDO1FBQ2hCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDNUIsV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ25DLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUMvQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM1RCxJQUFJLEtBQUssRUFBRSxDQUFDO29CQUNWLFdBQVcsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO2dCQUMzQixDQUFDO3FCQUFNLENBQUM7b0JBQ04sTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyx1Q0FBdUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ3ZJLENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxJQUFJLEtBQUssQ0FBQywwRUFBMEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNySSxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksV0FBVyxLQUFLLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMvRCxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixPQUFPLENBQUMsSUFBSSw2QkFBNkIsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUNsRyxDQUFDO1FBRUQsT0FBTyxJQUFJLGNBQWMsQ0FBQztZQUN4QixPQUFPLEVBQUU7Z0JBQ1AsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO2dCQUNmLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUU7YUFDOUI7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQXdCO1FBQ2pELE9BQU8sSUFBSSxjQUFjLENBQUM7WUFDeEIsUUFBUSxFQUFFO2dCQUNSLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtnQkFDbkIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO2dCQUNuQixRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVE7YUFDNUI7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsWUFBcUMsT0FBMkI7UUFBM0IsWUFBTyxHQUFQLE9BQU8sQ0FBb0I7SUFFaEUsQ0FBQztJQUVEOztPQUVHO0lBQ0ksT0FBTyxLQUFLLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7O0FBN0QzQyx3Q0E4REM7OztBQTRFRCxTQUFTLFVBQVUsQ0FBQyxHQUF3QixFQUFFLEdBQXdCO0lBQ3BFLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQzFCLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQzFCLE9BQU8sRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXBpT2JqZWN0LCBMYXp5IH0gZnJvbSAnY2RrOHMnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgKiBhcyBiYXNlIGZyb20gJy4vYmFzZSc7XG5pbXBvcnQgKiBhcyBrOHMgZnJvbSAnLi9pbXBvcnRzL2s4cyc7XG5pbXBvcnQgKiBhcyBzZWNyZXQgZnJvbSAnLi9zZWNyZXQnO1xuaW1wb3J0ICogYXMgc2VydmljZSBmcm9tICcuL3NlcnZpY2UnO1xuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGBJbmdyZXNzYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmdyZXNzUHJvcHMgZXh0ZW5kcyBiYXNlLlJlc291cmNlUHJvcHMge1xuICAvKipcbiAgICogVGhlIGRlZmF1bHQgYmFja2VuZCBzZXJ2aWNlcyByZXF1ZXN0cyB0aGF0IGRvIG5vdCBtYXRjaCBhbnkgcnVsZS5cbiAgICpcbiAgICogVXNpbmcgdGhpcyBvcHRpb24gb3IgdGhlIGBhZGREZWZhdWx0QmFja2VuZCgpYCBtZXRob2QgaXMgZXF1aXZhbGVudCB0b1xuICAgKiBhZGRpbmcgYSBydWxlIHdpdGggYm90aCBgcGF0aGAgYW5kIGBob3N0YCB1bmRlZmluZWQuXG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0QmFja2VuZD86IEluZ3Jlc3NCYWNrZW5kO1xuXG4gIC8qKlxuICAgKiBSb3V0aW5nIHJ1bGVzIGZvciB0aGlzIGluZ3Jlc3MuXG4gICAqXG4gICAqIEVhY2ggcnVsZSBtdXN0IGRlZmluZSBhbiBgSW5ncmVzc0JhY2tlbmRgIHRoYXQgd2lsbCByZWNlaXZlIHRoZSByZXF1ZXN0c1xuICAgKiB0aGF0IG1hdGNoIHRoaXMgcnVsZS4gSWYgYm90aCBgaG9zdGAgYW5kIGBwYXRoYCBhcmUgbm90IHNwZWNpZmllYywgdGhpc1xuICAgKiBiYWNrZW5kIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBiYWNrZW5kIG9mIHRoZSBpbmdyZXNzLlxuICAgKlxuICAgKiBZb3UgY2FuIGFsc28gYWRkIHJ1bGVzIGxhdGVyIHVzaW5nIGBhZGRSdWxlKClgLCBgYWRkSG9zdFJ1bGUoKWAsXG4gICAqIGBhZGREZWZhdWx0QmFja2VuZCgpYCBhbmQgYGFkZEhvc3REZWZhdWx0QmFja2VuZCgpYC5cbiAgICovXG4gIHJlYWRvbmx5IHJ1bGVzPzogSW5ncmVzc1J1bGVbXTtcblxuXG4gIC8qKlxuICAgKiBUTFMgc2V0dGluZ3MgZm9yIHRoaXMgaW5ncmVzcy5cbiAgICpcbiAgICogVXNpbmcgdGhpcyBvcHRpb24gdGVsbHMgdGhlIGluZ3Jlc3MgY29udHJvbGxlciB0byBleHBvc2UgYSBUTFMgZW5kcG9pbnQuXG4gICAqIEN1cnJlbnRseSB0aGUgSW5ncmVzcyBvbmx5IHN1cHBvcnRzIGEgc2luZ2xlIFRMUyBwb3J0LCA0NDMuIElmIG11bHRpcGxlXG4gICAqIG1lbWJlcnMgb2YgdGhpcyBsaXN0IHNwZWNpZnkgZGlmZmVyZW50IGhvc3RzLCB0aGV5IHdpbGwgYmUgbXVsdGlwbGV4ZWQgb25cbiAgICogdGhlIHNhbWUgcG9ydCBhY2NvcmRpbmcgdG8gdGhlIGhvc3RuYW1lIHNwZWNpZmllZCB0aHJvdWdoIHRoZSBTTkkgVExTXG4gICAqIGV4dGVuc2lvbiwgaWYgdGhlIGluZ3Jlc3MgY29udHJvbGxlciBmdWxmaWxsaW5nIHRoZSBpbmdyZXNzIHN1cHBvcnRzIFNOSS5cbiAgICovXG4gIHJlYWRvbmx5IHRscz86IEluZ3Jlc3NUbHNbXTtcblxuICAvKipcbiAgICogQ2xhc3MgTmFtZSBmb3IgdGhpcyBpbmdyZXNzLlxuICAgKlxuICAgKiBUaGlzIGZpZWxkIGlzIGEgcmVmZXJlbmNlIHRvIGFuIEluZ3Jlc3NDbGFzcyByZXNvdXJjZSB0aGF0IGNvbnRhaW5zXG4gICAqIGFkZGl0aW9uYWwgSW5ncmVzcyBjb25maWd1cmF0aW9uLCBpbmNsdWRpbmcgdGhlIG5hbWUgb2YgdGhlIEluZ3Jlc3MgY29udHJvbGxlci5cbiAgICovXG4gIHJlYWRvbmx5IGNsYXNzTmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBTcGVjaWZ5IGhvdyB0aGUgcGF0aCBpcyBtYXRjaGVkIGFnYWluc3QgcmVxdWVzdCBwYXRocy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL3NlcnZpY2VzLW5ldHdvcmtpbmcvaW5ncmVzcy8jcGF0aC10eXBlc1xuICovXG5leHBvcnQgZW51bSBIdHRwSW5ncmVzc1BhdGhUeXBlIHtcbiAgLyoqXG4gICAqIE1hdGNoZXMgdGhlIFVSTCBwYXRoIGV4YWN0bHkuXG4gICAqL1xuICBQUkVGSVggPSAnUHJlZml4JyxcblxuICAvKipcbiAgICogTWF0Y2hlcyBiYXNlZCBvbiBhIFVSTCBwYXRoIHByZWZpeCBzcGxpdCBieSAnLycuXG4gICAqL1xuICBFWEFDVCA9ICdFeGFjdCcsXG5cbiAgLyoqXG4gICAqIE1hdGNoaW5nIGlzIHNwZWNpZmllZCBieSB0aGUgdW5kZXJseWluZyBJbmdyZXNzQ2xhc3MuXG4gICAqL1xuICBJTVBMRU1FTlRBVElPTl9TUEVDSUZJQyA9ICdJbXBsZW1lbnRhdGlvblNwZWNpZmljJyxcbn1cblxuLyoqXG4gKiBJbmdyZXNzIGlzIGEgY29sbGVjdGlvbiBvZiBydWxlcyB0aGF0IGFsbG93IGluYm91bmQgY29ubmVjdGlvbnMgdG8gcmVhY2ggdGhlXG4gKiBlbmRwb2ludHMgZGVmaW5lZCBieSBhIGJhY2tlbmQuIEFuIEluZ3Jlc3MgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gZ2l2ZSBzZXJ2aWNlc1xuICogZXh0ZXJuYWxseS1yZWFjaGFibGUgdXJscywgbG9hZCBiYWxhbmNlIHRyYWZmaWMsIHRlcm1pbmF0ZSBTU0wsIG9mZmVyIG5hbWVcbiAqIGJhc2VkIHZpcnR1YWwgaG9zdGluZyBldGMuXG4gKi9cbmV4cG9ydCBjbGFzcyBJbmdyZXNzIGV4dGVuZHMgYmFzZS5SZXNvdXJjZSB7XG5cbiAgLyoqXG4gICAqIEBzZWUgYmFzZS5SZXNvdXJjZS5hcGlPYmplY3RcbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBhcGlPYmplY3Q6IEFwaU9iamVjdDtcblxuICBwdWJsaWMgcmVhZG9ubHkgcmVzb3VyY2VUeXBlID0gJ2luZ3Jlc3Nlcyc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfcnVsZXNQZXJIb3N0OiB7IFtob3N0OiBzdHJpbmddOiBrOHMuSHR0cEluZ3Jlc3NQYXRoW10gfSA9IHt9O1xuICBwcml2YXRlIF9kZWZhdWx0QmFja2VuZD86IEluZ3Jlc3NCYWNrZW5kO1xuICBwcml2YXRlIHJlYWRvbmx5IF90bHNDb25maWc6IEluZ3Jlc3NUbHNbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBJbmdyZXNzUHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLmFwaU9iamVjdCA9IG5ldyBrOHMuS3ViZUluZ3Jlc3ModGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgbWV0YWRhdGE6IHByb3BzLm1ldGFkYXRhLFxuICAgICAgc3BlYzoge1xuICAgICAgICBkZWZhdWx0QmFja2VuZDogTGF6eS5hbnkoeyBwcm9kdWNlOiAoKSA9PiB0aGlzLl9kZWZhdWx0QmFja2VuZD8uX3RvS3ViZSgpIH0pLFxuICAgICAgICBpbmdyZXNzQ2xhc3NOYW1lOiBwcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHJ1bGVzOiBMYXp5LmFueSh7IHByb2R1Y2U6ICgpID0+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
+ }