UNPKG

cdk8s-plus-29

Version:

cdk8s+ is a software development framework that provides high level abstractions for authoring Kubernetes applications. cdk8s-plus-29 synthesizes Kubernetes manifests for Kubernetes 1.29.0

174 lines 24.3 kB
"use strict"; var _a, _b; Object.defineProperty(exports, "__esModule", { value: true }); exports.StatefulSetUpdateStrategy = exports.StatefulSet = exports.PodManagementPolicy = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const cdk8s_1 = require("cdk8s"); const container = require("./container"); const k8s = require("./imports/k8s"); const service = require("./service"); const workload = require("./workload"); /** * Controls how pods are created during initial scale up, when replacing pods on nodes, * or when scaling down. * * The default policy is `OrderedReady`, where pods are created in increasing order * (pod-0, then pod-1, etc) and the controller will wait until each pod is ready before * continuing. When scaling down, the pods are removed in the opposite order. * * The alternative policy is `Parallel` which will create pods in parallel to match the * desired scale without waiting, and on scale down will delete all pods at once. */ var PodManagementPolicy; (function (PodManagementPolicy) { PodManagementPolicy["ORDERED_READY"] = "OrderedReady"; PodManagementPolicy["PARALLEL"] = "Parallel"; })(PodManagementPolicy || (exports.PodManagementPolicy = PodManagementPolicy = {})); /** * StatefulSet is the workload API object used to manage stateful applications. * * Manages the deployment and scaling of a set of Pods, and provides guarantees * about the ordering and uniqueness of these Pods. * * Like a Deployment, a StatefulSet manages Pods that are based on an identical * container spec. Unlike a Deployment, a StatefulSet maintains a sticky identity * for each of their Pods. These pods are created from the same spec, but are not * interchangeable: each has a persistent identifier that it maintains across any * rescheduling. * * If you want to use storage volumes to provide persistence for your workload, you * can use a StatefulSet as part of the solution. Although individual Pods in a StatefulSet * are susceptible to failure, the persistent Pod identifiers make it easier to match existing * volumes to the new Pods that replace any that have failed. * * Using StatefulSets * ------------------ * StatefulSets are valuable for applications that require one or more of the following. * * - Stable, unique network identifiers. * - Stable, persistent storage. * - Ordered, graceful deployment and scaling. * - Ordered, automated rolling updates. */ class StatefulSet extends workload.Workload { constructor(scope, id, props) { super(scope, id, props); this.resourceType = 'statefulsets'; this.hasAutoscaler = false; this.apiObject = new k8s.KubeStatefulSet(this, 'Resource', { metadata: props.metadata, spec: cdk8s_1.Lazy.any({ produce: () => this._toKube() }), }); this.service = props.service ?? this._createHeadlessService(); this.apiObject.addDependency(this.service); this.replicas = props.replicas; this.strategy = props.strategy ?? StatefulSetUpdateStrategy.rollingUpdate(), this.podManagementPolicy = props.podManagementPolicy ?? PodManagementPolicy.ORDERED_READY; this.minReady = props.minReady ?? cdk8s_1.Duration.seconds(0); this.service.select(this); if (this.isolate) { this.connections.isolate(); } } _createHeadlessService() { const myPorts = container.extractContainerPorts(this); const myPortNumbers = myPorts.map(p => p.number); const ports = myPorts.map(p => ({ port: p.number, targetPort: p.number, protocol: p.protocol, name: p.name })); if (ports.length === 0) { throw new Error(`Unable to create a service for the stateful set ${this.name}: StatefulSet ports cannot be determined.`); } // validate the ports are owned by our containers for (const port of ports) { const targetPort = port.targetPort ?? port.port; if (!myPortNumbers.includes(targetPort)) { throw new Error(`Unable to expose stateful set ${this.name} via a service: Port ${targetPort} is not exposed by any container`); } } const metadata = { namespace: this.metadata.namespace }; return new service.Service(this, 'Service', { selector: this, ports, metadata, clusterIP: 'None', type: service.ServiceType.CLUSTER_IP, }); } /** * @internal */ _toKube() { return { replicas: this.hasAutoscaler ? undefined : (this.replicas ?? 1), serviceName: this.service.name, minReadySeconds: this.minReady.toSeconds(), template: { metadata: this.podMetadata.toJson(), spec: this._toPodSpec(), }, selector: this._toLabelSelector(), podManagementPolicy: this.podManagementPolicy, updateStrategy: this.strategy._toKube(), }; } /** * @see IScalable.markHasAutoscaler() */ markHasAutoscaler() { this.hasAutoscaler = true; } /** * @see IScalable.toScalingTarget() */ toScalingTarget() { return { kind: this.apiObject.kind, apiVersion: this.apiObject.apiVersion, name: this.name, containers: this.containers, replicas: this.replicas, }; } } exports.StatefulSet = StatefulSet; _a = JSII_RTTI_SYMBOL_1; StatefulSet[_a] = { fqn: "cdk8s-plus-29.StatefulSet", version: "2.6.0" }; /** * StatefulSet update strategies. */ class StatefulSetUpdateStrategy { /** * The controller will not automatically update the Pods in a StatefulSet. * Users must manually delete Pods to cause the controller to create new Pods * that reflect modifications. */ static onDelete() { return new StatefulSetUpdateStrategy({ type: 'OnDelete', }); } /** * The controller will delete and recreate each Pod in the StatefulSet. * It will proceed in the same order as Pod termination (from the largest ordinal to the smallest), * updating each Pod one at a time. The Kubernetes control plane waits until an updated * Pod is Running and Ready prior to updating its predecessor. */ static rollingUpdate(options = {}) { return new StatefulSetUpdateStrategy({ type: 'RollingUpdate', rollingUpdate: { partition: options.partition ?? 0 }, }); } constructor(strategy) { this.strategy = strategy; } /** * @internal */ _toKube() { return this.strategy; } } exports.StatefulSetUpdateStrategy = StatefulSetUpdateStrategy; _b = JSII_RTTI_SYMBOL_1; StatefulSetUpdateStrategy[_b] = { fqn: "cdk8s-plus-29.StatefulSetUpdateStrategy", version: "2.6.0" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGVmdWwtc2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3N0YXRlZnVsLXNldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLGlDQUFrRDtBQUVsRCx5Q0FBeUM7QUFFekMscUNBQXFDO0FBQ3JDLHFDQUFxQztBQUNyQyx1Q0FBdUM7QUFFdkM7Ozs7Ozs7Ozs7R0FVRztBQUNILElBQVksbUJBR1g7QUFIRCxXQUFZLG1CQUFtQjtJQUM3QixxREFBOEIsQ0FBQTtJQUM5Qiw0Q0FBcUIsQ0FBQTtBQUN2QixDQUFDLEVBSFcsbUJBQW1CLG1DQUFuQixtQkFBbUIsUUFHOUI7QUErQ0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5Qkc7QUFDSCxNQUFhLFdBQVksU0FBUSxRQUFRLENBQUMsUUFBUTtJQWlDaEQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUF1QjtRQUMvRCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQVBWLGlCQUFZLEdBQUcsY0FBYyxDQUFDO1FBRXZDLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBTzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDekQsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO1lBQ3hCLElBQUksRUFBRSxZQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1NBQ2xELENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUU5RCxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFM0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQy9CLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsSUFBSSx5QkFBeUIsQ0FBQyxhQUFhLEVBQUU7WUFDM0UsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQyxtQkFBbUIsSUFBSSxtQkFBbUIsQ0FBQyxhQUFhLENBQUM7UUFDMUYsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxJQUFJLGdCQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXRELElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTFCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDN0IsQ0FBQztJQUVILENBQUM7SUFFTyxzQkFBc0I7UUFFNUIsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RELE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakQsTUFBTSxLQUFLLEdBQTBCLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEksSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsbURBQW1ELElBQUksQ0FBQyxJQUFJLDJDQUEyQyxDQUFDLENBQUM7UUFDM0gsQ0FBQztRQUVELGlEQUFpRDtRQUNqRCxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3pCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztZQUNoRCxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUN4QyxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxJQUFJLENBQUMsSUFBSSx3QkFBd0IsVUFBVSxrQ0FBa0MsQ0FBQyxDQUFDO1lBQ2xJLENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQVEsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM3RCxPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFO1lBQzFDLFFBQVEsRUFBRSxJQUFJO1lBQ2QsS0FBSztZQUNMLFFBQVE7WUFDUixTQUFTLEVBQUUsTUFBTTtZQUNqQixJQUFJLEVBQUUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxVQUFVO1NBQ3JDLENBQUMsQ0FBQztJQUVMLENBQUM7SUFFRDs7UUFFSTtJQUNHLE9BQU87UUFDWixPQUFPO1lBQ0wsUUFBUSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQztZQUMvRCxXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJO1lBQzlCLGVBQWUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRTtZQUMxQyxRQUFRLEVBQUU7Z0JBQ1IsUUFBUSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFO2dCQUNuQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRTthQUN4QjtZQUNELFFBQVEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDakMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLG1CQUFtQjtZQUM3QyxjQUFjLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUU7U0FDeEMsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNJLGlCQUFpQjtRQUN0QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztJQUM1QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxlQUFlO1FBQ3BCLE9BQU87WUFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJO1lBQ3pCLFVBQVUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVU7WUFDckMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzNCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtTQUN4QixDQUFDO0lBQ0osQ0FBQzs7QUF6SEgsa0NBMEhDOzs7QUF3QkQ7O0dBRUc7QUFDSCxNQUFhLHlCQUF5QjtJQUVwQzs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLFFBQVE7UUFDcEIsT0FBTyxJQUFJLHlCQUF5QixDQUFDO1lBQ25DLElBQUksRUFBRSxVQUFVO1NBQ2pCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxhQUFhLENBQUMsVUFBeUQsRUFBRTtRQUVyRixPQUFPLElBQUkseUJBQXlCLENBQUM7WUFDbkMsSUFBSSxFQUFFLGVBQWU7WUFDckIsYUFBYSxFQUFFLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTLElBQUksQ0FBQyxFQUFFO1NBQ3JELENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxZQUFxQyxRQUF1QztRQUF2QyxhQUFRLEdBQVIsUUFBUSxDQUErQjtJQUFHLENBQUM7SUFFaEY7O09BRUc7SUFDSSxPQUFPO1FBQ1osT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7O0FBbENILDhEQW9DQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwaU9iamVjdCwgTGF6eSwgRHVyYXRpb24gfSBmcm9tICdjZGs4cyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCAqIGFzIGNvbnRhaW5lciBmcm9tICcuL2NvbnRhaW5lcic7XG5pbXBvcnQgeyBJU2NhbGFibGUsIFNjYWxpbmdUYXJnZXQgfSBmcm9tICcuL2hvcml6b250YWwtcG9kLWF1dG9zY2FsZXInO1xuaW1wb3J0ICogYXMgazhzIGZyb20gJy4vaW1wb3J0cy9rOHMnO1xuaW1wb3J0ICogYXMgc2VydmljZSBmcm9tICcuL3NlcnZpY2UnO1xuaW1wb3J0ICogYXMgd29ya2xvYWQgZnJvbSAnLi93b3JrbG9hZCc7XG5cbi8qKlxuICogQ29udHJvbHMgaG93IHBvZHMgYXJlIGNyZWF0ZWQgZHVyaW5nIGluaXRpYWwgc2NhbGUgdXAsIHdoZW4gcmVwbGFjaW5nIHBvZHMgb24gbm9kZXMsXG4gKiBvciB3aGVuIHNjYWxpbmcgZG93bi5cbiAqXG4gKiBUaGUgZGVmYXVsdCBwb2xpY3kgaXMgYE9yZGVyZWRSZWFkeWAsIHdoZXJlIHBvZHMgYXJlIGNyZWF0ZWQgaW4gaW5jcmVhc2luZyBvcmRlclxuICogKHBvZC0wLCB0aGVuIHBvZC0xLCBldGMpIGFuZCB0aGUgY29udHJvbGxlciB3aWxsIHdhaXQgdW50aWwgZWFjaCBwb2QgaXMgcmVhZHkgYmVmb3JlXG4gKiBjb250aW51aW5nLiBXaGVuIHNjYWxpbmcgZG93biwgdGhlIHBvZHMgYXJlIHJlbW92ZWQgaW4gdGhlIG9wcG9zaXRlIG9yZGVyLlxuICpcbiAqIFRoZSBhbHRlcm5hdGl2ZSBwb2xpY3kgaXMgYFBhcmFsbGVsYCB3aGljaCB3aWxsIGNyZWF0ZSBwb2RzIGluIHBhcmFsbGVsIHRvIG1hdGNoIHRoZVxuICogZGVzaXJlZCBzY2FsZSB3aXRob3V0IHdhaXRpbmcsIGFuZCBvbiBzY2FsZSBkb3duIHdpbGwgZGVsZXRlIGFsbCBwb2RzIGF0IG9uY2UuXG4gKi9cbmV4cG9ydCBlbnVtIFBvZE1hbmFnZW1lbnRQb2xpY3kge1xuICBPUkRFUkVEX1JFQURZID0gJ09yZGVyZWRSZWFkeScsXG4gIFBBUkFMTEVMID0gJ1BhcmFsbGVsJyxcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBpbml0aWFsaXphdGlvbiBvZiBgU3RhdGVmdWxTZXRgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlZnVsU2V0UHJvcHMgZXh0ZW5kcyB3b3JrbG9hZC5Xb3JrbG9hZFByb3BzIHtcbiAgLyoqXG4gICAqIFNlcnZpY2UgdG8gYXNzb2NpYXRlIHdpdGggdGhlIHN0YXRlZnVsc2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEEgbmV3IGhlYWRsZXNzIHNlcnZpY2Ugd2lsbCBiZSBjcmVhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZT86IHNlcnZpY2UuU2VydmljZTtcblxuICAvKipcbiAgICAqIE51bWJlciBvZiBkZXNpcmVkIHBvZHMuXG4gICAgKlxuICAgICogQGRlZmF1bHQgMVxuICAgICovXG4gIHJlYWRvbmx5IHJlcGxpY2FzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgICogUG9kIG1hbmFnZW1lbnQgcG9saWN5IHRvIHVzZSBmb3IgdGhpcyBzdGF0ZWZ1bHNldC5cbiAgICAqXG4gICAgKiBAZGVmYXVsdCBQb2RNYW5hZ2VtZW50UG9saWN5Lk9SREVSRURfUkVBRFlcbiAgICAqL1xuICByZWFkb25seSBwb2RNYW5hZ2VtZW50UG9saWN5PzogUG9kTWFuYWdlbWVudFBvbGljeTtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHRoZSBTdGF0ZWZ1bFNldFVwZGF0ZVN0cmF0ZWd5IHRoYXQgd2lsbCBiZSBlbXBsb3llZCB0byB1cGRhdGUgUG9kcyBpbiB0aGUgU3RhdGVmdWxTZXQgd2hlbiBhIHJldmlzaW9uIGlzIG1hZGUgdG8gVGVtcGxhdGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gUm9sbGluZ1VwZGF0ZSB3aXRoIHBhcnRpdGlvbiBzZXQgdG8gMFxuICAgKi9cbiAgcmVhZG9ubHkgc3RyYXRlZ3k/OiBTdGF0ZWZ1bFNldFVwZGF0ZVN0cmF0ZWd5O1xuXG4gIC8qKlxuICAgKiBNaW5pbXVtIGR1cmF0aW9uIGZvciB3aGljaCBhIG5ld2x5IGNyZWF0ZWQgcG9kIHNob3VsZCBiZSByZWFkeSB3aXRob3V0IGFueSBvZiBpdHMgY29udGFpbmVyIGNyYXNoaW5nLFxuICAgKiBmb3IgaXQgdG8gYmUgY29uc2lkZXJlZCBhdmFpbGFibGUuIFplcm8gbWVhbnMgdGhlIHBvZCB3aWxsIGJlIGNvbnNpZGVyZWQgYXZhaWxhYmxlIGFzIHNvb24gYXMgaXQgaXMgcmVhZHkuXG4gICAqXG4gICAqIFRoaXMgaXMgYW4gYWxwaGEgZmllbGQgYW5kIHJlcXVpcmVzIGVuYWJsaW5nIFN0YXRlZnVsU2V0TWluUmVhZHlTZWNvbmRzIGZlYXR1cmUgZ2F0ZS5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy93b3JrbG9hZHMvY29udHJvbGxlcnMvZGVwbG95bWVudC8jbWluLXJlYWR5LXNlY29uZHNcbiAgICogQGRlZmF1bHQgRHVyYXRpb24uc2Vjb25kcygwKVxuICAgKi9cbiAgcmVhZG9ubHkgbWluUmVhZHk/OiBEdXJhdGlvbjtcblxufVxuXG4vKipcbiAqIFN0YXRlZnVsU2V0IGlzIHRoZSB3b3JrbG9hZCBBUEkgb2JqZWN0IHVzZWQgdG8gbWFuYWdlIHN0YXRlZnVsIGFwcGxpY2F0aW9ucy5cbiAqXG4gKiBNYW5hZ2VzIHRoZSBkZXBsb3ltZW50IGFuZCBzY2FsaW5nIG9mIGEgc2V0IG9mIFBvZHMsIGFuZCBwcm92aWRlcyBndWFyYW50ZWVzXG4gKiBhYm91dCB0aGUgb3JkZXJpbmcgYW5kIHVuaXF1ZW5lc3Mgb2YgdGhlc2UgUG9kcy5cbiAqXG4gKiBMaWtlIGEgRGVwbG95bWVudCwgYSBTdGF0ZWZ1bFNldCBtYW5hZ2VzIFBvZHMgdGhhdCBhcmUgYmFzZWQgb24gYW4gaWRlbnRpY2FsXG4gKiBjb250YWluZXIgc3BlYy4gVW5saWtlIGEgRGVwbG95bWVudCwgYSBTdGF0ZWZ1bFNldCBtYWludGFpbnMgYSBzdGlja3kgaWRlbnRpdHlcbiAqIGZvciBlYWNoIG9mIHRoZWlyIFBvZHMuIFRoZXNlIHBvZHMgYXJlIGNyZWF0ZWQgZnJvbSB0aGUgc2FtZSBzcGVjLCBidXQgYXJlIG5vdFxuICogaW50ZXJjaGFuZ2VhYmxlOiBlYWNoIGhhcyBhIHBlcnNpc3RlbnQgaWRlbnRpZmllciB0aGF0IGl0IG1haW50YWlucyBhY3Jvc3MgYW55XG4gKiByZXNjaGVkdWxpbmcuXG4gKlxuICogSWYgeW91IHdhbnQgdG8gdXNlIHN0b3JhZ2Ugdm9sdW1lcyB0byBwcm92aWRlIHBlcnNpc3RlbmNlIGZvciB5b3VyIHdvcmtsb2FkLCB5b3VcbiAqIGNhbiB1c2UgYSBTdGF0ZWZ1bFNldCBhcyBwYXJ0IG9mIHRoZSBzb2x1dGlvbi4gQWx0aG91Z2ggaW5kaXZpZHVhbCBQb2RzIGluIGEgU3RhdGVmdWxTZXRcbiAqIGFyZSBzdXNjZXB0aWJsZSB0byBmYWlsdXJlLCB0aGUgcGVyc2lzdGVudCBQb2QgaWRlbnRpZmllcnMgbWFrZSBpdCBlYXNpZXIgdG8gbWF0Y2ggZXhpc3RpbmdcbiAqIHZvbHVtZXMgdG8gdGhlIG5ldyBQb2RzIHRoYXQgcmVwbGFjZSBhbnkgdGhhdCBoYXZlIGZhaWxlZC5cbiAqXG4gKiBVc2luZyBTdGF0ZWZ1bFNldHNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLVxuICogU3RhdGVmdWxTZXRzIGFyZSB2YWx1YWJsZSBmb3IgYXBwbGljYXRpb25zIHRoYXQgcmVxdWlyZSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nLlxuICpcbiAqIC0gU3RhYmxlLCB1bmlxdWUgbmV0d29yayBpZGVudGlmaWVycy5cbiAqIC0gU3RhYmxlLCBwZXJzaXN0ZW50IHN0b3JhZ2UuXG4gKiAtIE9yZGVyZWQsIGdyYWNlZnVsIGRlcGxveW1lbnQgYW5kIHNjYWxpbmcuXG4gKiAtIE9yZGVyZWQsIGF1dG9tYXRlZCByb2xsaW5nIHVwZGF0ZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdGF0ZWZ1bFNldCBleHRlbmRzIHdvcmtsb2FkLldvcmtsb2FkIGltcGxlbWVudHMgSVNjYWxhYmxlIHtcbiAgLyoqXG4gICAgKiBOdW1iZXIgb2YgZGVzaXJlZCBwb2RzLlxuICAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXBsaWNhcz86IG51bWJlcjtcblxuICAvKipcbiAgICAqIE1hbmFnZW1lbnQgcG9saWN5IHRvIHVzZSBmb3IgdGhlIHNldC5cbiAgICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcG9kTWFuYWdlbWVudFBvbGljeTogUG9kTWFuYWdlbWVudFBvbGljeTtcblxuICAvKipcbiAgICogVGhlIHVwZGF0ZSBzdGFydGVneSBvZiB0aGlzIHN0YXRlZnVsIHNldC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzdHJhdGVneTogU3RhdGVmdWxTZXRVcGRhdGVTdHJhdGVneTtcblxuICAvKipcbiAgICogTWluaW11bSBkdXJhdGlvbiBmb3Igd2hpY2ggYSBuZXdseSBjcmVhdGVkIHBvZCBzaG91bGQgYmUgcmVhZHkgd2l0aG91dFxuICAgKiBhbnkgb2YgaXRzIGNvbnRhaW5lciBjcmFzaGluZywgZm9yIGl0IHRvIGJlIGNvbnNpZGVyZWQgYXZhaWxhYmxlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1pblJlYWR5OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICAqIEBzZWUgYmFzZS5SZXNvdXJjZS5hcGlPYmplY3RcbiAgICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXBpT2JqZWN0OiBBcGlPYmplY3Q7XG5cbiAgcHVibGljIHJlYWRvbmx5IHJlc291cmNlVHlwZSA9ICdzdGF0ZWZ1bHNldHMnO1xuXG4gIHB1YmxpYyBoYXNBdXRvc2NhbGVyID0gZmFsc2U7XG5cbiAgcHVibGljIHJlYWRvbmx5IHNlcnZpY2U6IHNlcnZpY2UuU2VydmljZTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogU3RhdGVmdWxTZXRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgdGhpcy5hcGlPYmplY3QgPSBuZXcgazhzLkt1YmVTdGF0ZWZ1bFNldCh0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICBtZXRhZGF0YTogcHJvcHMubWV0YWRhdGEsXG4gICAgICBzcGVjOiBMYXp5LmFueSh7IHByb2R1Y2U6ICgpID0+IHRoaXMuX3RvS3ViZSgpIH0pLFxuICAgIH0pO1xuICAgIHRoaXMuc2VydmljZSA9IHByb3BzLnNlcnZpY2UgPz8gdGhpcy5fY3JlYXRlSGVhZGxlc3NTZXJ2aWNlKCk7XG5cbiAgICB0aGlzLmFwaU9iamVjdC5hZGREZXBlbmRlbmN5KHRoaXMuc2VydmljZSk7XG5cbiAgICB0aGlzLnJlcGxpY2FzID0gcHJvcHMucmVwbGljYXM7XG4gICAgdGhpcy5zdHJhdGVneSA9IHByb3BzLnN0cmF0ZWd5ID8/IFN0YXRlZnVsU2V0VXBkYXRlU3RyYXRlZ3kucm9sbGluZ1VwZGF0ZSgpLFxuICAgIHRoaXMucG9kTWFuYWdlbWVudFBvbGljeSA9IHByb3BzLnBvZE1hbmFnZW1lbnRQb2xpY3kgPz8gUG9kTWFuYWdlbWVudFBvbGljeS5PUkRFUkVEX1JFQURZO1xuICAgIHRoaXMubWluUmVhZHkgPSBwcm9wcy5taW5SZWFkeSA/PyBEdXJhdGlvbi5zZWNvbmRzKDApO1xuXG4gICAgdGhpcy5zZXJ2aWNlLnNlbGVjdCh0aGlzKTtcblxuICAgIGlmICh0aGlzLmlzb2xhdGUpIHtcbiAgICAgIHRoaXMuY29ubmVjdGlvbnMuaXNvbGF0ZSgpO1xuICAgIH1cblxuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlSGVhZGxlc3NTZXJ2aWNlKCkge1xuXG4gICAgY29uc3QgbXlQb3J0cyA9IGNvbnRhaW5lci5leHRyYWN0Q29udGFpbmVyUG9ydHModGhpcyk7XG4gICAgY29uc3QgbXlQb3J0TnVtYmVycyA9IG15UG9ydHMubWFwKHAgPT4gcC5udW1iZXIpO1xuICAgIGNvbnN0IHBvcnRzOiBzZXJ2aWNlLlNlcnZpY2VQb3J0W10gPSBteVBvcnRzLm1hcChwID0+ICh7IHBvcnQ6IHAubnVtYmVyLCB0YXJnZXRQb3J0OiBwLm51bWJlciwgcHJvdG9jb2w6IHAucHJvdG9jb2wsIG5hbWU6IHAubmFtZSB9KSk7XG4gICAgaWYgKHBvcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gY3JlYXRlIGEgc2VydmljZSBmb3IgdGhlIHN0YXRlZnVsIHNldCAke3RoaXMubmFtZX06IFN0YXRlZnVsU2V0IHBvcnRzIGNhbm5vdCBiZSBkZXRlcm1pbmVkLmApO1xuICAgIH1cblxuICAgIC8vIHZhbGlkYXRlIHRoZSBwb3J0cyBhcmUgb3duZWQgYnkgb3VyIGNvbnRhaW5lcnNcbiAgICBmb3IgKGNvbnN0IHBvcnQgb2YgcG9ydHMpIHtcbiAgICAgIGNvbnN0IHRhcmdldFBvcnQgPSBwb3J0LnRhcmdldFBvcnQgPz8gcG9ydC5wb3J0O1xuICAgICAgaWYgKCFteVBvcnROdW1iZXJzLmluY2x1ZGVzKHRhcmdldFBvcnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGV4cG9zZSBzdGF0ZWZ1bCBzZXQgJHt0aGlzLm5hbWV9IHZpYSBhIHNlcnZpY2U6IFBvcnQgJHt0YXJnZXRQb3J0fSBpcyBub3QgZXhwb3NlZCBieSBhbnkgY29udGFpbmVyYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbWV0YWRhdGE6IGFueSA9IHsgbmFtZXNwYWNlOiB0aGlzLm1ldGFkYXRhLm5hbWVzcGFjZSB9O1xuICAgIHJldHVybiBuZXcgc2VydmljZS5TZXJ2aWNlKHRoaXMsICdTZXJ2aWNlJywge1xuICAgICAgc2VsZWN0b3I6IHRoaXMsXG4gICAgICBwb3J0cyxcbiAgICAgIG1ldGFkYXRhLFxuICAgICAgY2x1c3RlcklQOiAnTm9uZScsXG4gICAgICB0eXBlOiBzZXJ2aWNlLlNlcnZpY2VUeXBlLkNMVVNURVJfSVAsXG4gICAgfSk7XG5cbiAgfVxuXG4gIC8qKlxuICAgICogQGludGVybmFsXG4gICAgKi9cbiAgcHVibGljIF90b0t1YmUoKTogazhzLlN0YXRlZnVsU2V0U3BlYyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlcGxpY2FzOiB0aGlzLmhhc0F1dG9zY2FsZXIgPyB1bmRlZmluZWQgOiAodGhpcy5yZXBsaWNhcyA/PyAxKSxcbiAgICAgIHNlcnZpY2VOYW1lOiB0aGlzLnNlcnZpY2UubmFtZSxcbiAgICAgIG1pblJlYWR5U2Vjb25kczogdGhpcy5taW5SZWFkeS50b1NlY29uZHMoKSxcbiAgICAgIHRlbXBsYXRlOiB7XG4gICAgICAgIG1ldGFkYXRhOiB0aGlzLnBvZE1ldGFkYXRhLnRvSnNvbigpLFxuICAgICAgICBzcGVjOiB0aGlzLl90b1BvZFNwZWMoKSxcbiAgICAgIH0sXG4gICAgICBzZWxlY3RvcjogdGhpcy5fdG9MYWJlbFNlbGVjdG9yKCksXG4gICAgICBwb2RNYW5hZ2VtZW50UG9saWN5OiB0aGlzLnBvZE1hbmFnZW1lbnRQb2xpY3ksXG4gICAgICB1cGRhdGVTdHJhdGVneTogdGhpcy5zdHJhdGVneS5fdG9LdWJlKCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIElTY2FsYWJsZS5tYXJrSGFzQXV0b3NjYWxlcigpXG4gICAqL1xuICBwdWJsaWMgbWFya0hhc0F1dG9zY2FsZXIoKSB7XG4gICAgdGhpcy5oYXNBdXRvc2NhbGVyID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIElTY2FsYWJsZS50b1NjYWxpbmdUYXJnZXQoKVxuICAgKi9cbiAgcHVibGljIHRvU2NhbGluZ1RhcmdldCgpOiBTY2FsaW5nVGFyZ2V0IHtcbiAgICByZXR1cm4ge1xuICAgICAga2luZDogdGhpcy5hcGlPYmplY3Qua2luZCxcbiAgICAgIGFwaVZlcnNpb246IHRoaXMuYXBpT2JqZWN0LmFwaVZlcnNpb24sXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICBjb250YWluZXJzOiB0aGlzLmNvbnRhaW5lcnMsXG4gICAgICByZXBsaWNhczogdGhpcy5yZXBsaWNhcyxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYFN0YXRlZnVsU2V0VXBkYXRlU3RyYXRlZ3kucm9sbGluZ1VwZGF0ZWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVmdWxTZXRVcGRhdGVTdHJhdGVneVJvbGxpbmdVcGRhdGVPcHRpb25zIHtcblxuICAvKipcbiAgICogSWYgc3BlY2lmaWVkLCBhbGwgUG9kcyB3aXRoIGFuIG9yZGluYWwgdGhhdCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHBhcnRpdGlvbiB3aWxsXG4gICAqIGJlIHVwZGF0ZWQgd2hlbiB0aGUgU3RhdGVmdWxTZXQncyAuc3BlYy50ZW1wbGF0ZSBpcyB1cGRhdGVkLiBBbGwgUG9kcyB3aXRoIGFuIG9yZGluYWwgdGhhdFxuICAgKiBpcyBsZXNzIHRoYW4gdGhlIHBhcnRpdGlvbiB3aWxsIG5vdCBiZSB1cGRhdGVkLCBhbmQsIGV2ZW4gaWYgdGhleSBhcmUgZGVsZXRlZCwgdGhleSB3aWxsIGJlXG4gICAqIHJlY3JlYXRlZCBhdCB0aGUgcHJldmlvdXMgdmVyc2lvbi5cbiAgICpcbiAgICogSWYgdGhlIHBhcnRpdGlvbiBpcyBncmVhdGVyIHRoYW4gcmVwbGljYXMsIHVwZGF0ZXMgdG8gdGhlIHBvZCB0ZW1wbGF0ZSB3aWxsIG5vdCBiZSBwcm9wYWdhdGVkIHRvIFBvZHMuXG4gICAqIEluIG1vc3QgY2FzZXMgeW91IHdpbGwgbm90IG5lZWQgdG8gdXNlIGEgcGFydGl0aW9uLCBidXQgdGhleSBhcmUgdXNlZnVsIGlmIHlvdSB3YW50IHRvIHN0YWdlIGFuXG4gICAqIHVwZGF0ZSwgcm9sbCBvdXQgYSBjYW5hcnksIG9yIHBlcmZvcm0gYSBwaGFzZWQgcm9sbCBvdXQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvd29ya2xvYWRzL2NvbnRyb2xsZXJzL3N0YXRlZnVsc2V0LyNwYXJ0aXRpb25zXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIHJlYWRvbmx5IHBhcnRpdGlvbj86IG51bWJlcjtcblxufVxuXG4vKipcbiAqIFN0YXRlZnVsU2V0IHVwZGF0ZSBzdHJhdGVnaWVzLlxuICovXG5leHBvcnQgY2xhc3MgU3RhdGVmdWxTZXRVcGRhdGVTdHJhdGVneSB7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250cm9sbGVyIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgdXBkYXRlIHRoZSBQb2RzIGluIGEgU3RhdGVmdWxTZXQuXG4gICAqIFVzZXJzIG11c3QgbWFudWFsbHkgZGVsZXRlIFBvZHMgdG8gY2F1c2UgdGhlIGNvbnRyb2xsZXIgdG8gY3JlYXRlIG5ldyBQb2RzXG4gICAqIHRoYXQgcmVmbGVjdCBtb2RpZmljYXRpb25zLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBvbkRlbGV0ZSgpOiBTdGF0ZWZ1bFNldFVwZGF0ZVN0cmF0ZWd5IHtcbiAgICByZXR1cm4gbmV3IFN0YXRlZnVsU2V0VXBkYXRlU3RyYXRlZ3koe1xuICAgICAgdHlwZTogJ09uRGVsZXRlJyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY29udHJvbGxlciB3aWxsIGRlbGV0ZSBhbmQgcmVjcmVhdGUgZWFjaCBQb2QgaW4gdGhlIFN0YXRlZnVsU2V0LlxuICAgKiBJdCB3aWxsIHByb2NlZWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgUG9kIHRlcm1pbmF0aW9uIChmcm9tIHRoZSBsYXJnZXN0IG9yZGluYWwgdG8gdGhlIHNtYWxsZXN0KSxcbiAgICogdXBkYXRpbmcgZWFjaCBQb2Qgb25lIGF0IGEgdGltZS4gVGhlIEt1YmVybmV0ZXMgY29udHJvbCBwbGFuZSB3YWl0cyB1bnRpbCBhbiB1cGRhdGVkXG4gICAqIFBvZCBpcyBSdW5uaW5nIGFuZCBSZWFkeSBwcmlvciB0byB1cGRhdGluZyBpdHMgcHJlZGVjZXNzb3IuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJvbGxpbmdVcGRhdGUob3B0aW9uczogU3RhdGVmdWxTZXRVcGRhdGVTdHJhdGVneVJvbGxpbmdVcGRhdGVPcHRpb25zID0ge30pOiBTdGF0ZWZ1bFNldFVwZGF0ZVN0cmF0ZWd5IHtcblxuICAgIHJldHVybiBuZXcgU3RhdGVmdWxTZXRVcGRhdGVTdHJhdGVneSh7XG4gICAgICB0eXBlOiAnUm9sbGluZ1VwZGF0ZScsXG4gICAgICByb2xsaW5nVXBkYXRlOiB7IHBhcnRpdGlvbjogb3B0aW9ucy5wYXJ0aXRpb24gPz8gMCB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHN0cmF0ZWd5OiBrOHMuU3RhdGVmdWxTZXRVcGRhdGVTdHJhdGVneSkge31cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX3RvS3ViZSgpOiBrOHMuU3RhdGVmdWxTZXRVcGRhdGVTdHJhdGVneSB7XG4gICAgcmV0dXJuIHRoaXMuc3RyYXRlZ3k7XG4gIH1cblxufVxuIl19