@aws-cdk/aws-eks-v2-alpha
Version:
This module is deprecated. All constructs are now available under aws-cdk-lib/aws-eks-v2
149 lines • 22.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.KubectlProvider = void 0;
const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const path = require("path");
const iam = require("aws-cdk-lib/aws-iam");
const lambda = require("aws-cdk-lib/aws-lambda");
const core_1 = require("aws-cdk-lib/core");
const cr = require("aws-cdk-lib/custom-resources");
const lambda_layer_awscli_1 = require("aws-cdk-lib/lambda-layer-awscli");
const constructs_1 = require("constructs");
const cluster_1 = require("./cluster");
/**
* Implementation of Kubectl Lambda
*/
class KubectlProvider extends constructs_1.Construct {
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-eks-v2-alpha.KubectlProvider", version: "2.240.0-alpha.0" };
/**
* Take existing provider on cluster
*
* @param scope Construct
* @param cluster k8s cluster
*/
static getKubectlProvider(scope, cluster) {
try {
jsiiDeprecationWarnings.print("@aws-cdk/aws-eks-v2-alpha.KubectlProvider#getKubectlProvider", "");
jsiiDeprecationWarnings._aws_cdk_aws_eks_v2_alpha_ICluster(cluster);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, this.getKubectlProvider);
}
throw error;
}
// if this is an "owned" cluster, we need to wait for the kubectl barrier
// before applying any resources.
if (cluster instanceof cluster_1.Cluster) {
cluster._dependOnKubectlBarrier(scope);
}
return cluster.kubectlProvider;
}
/**
* Import an existing provider
*
* @param scope Construct
* @param id an id of resource
* @param attrs attributes for the provider
*/
static fromKubectlProviderAttributes(scope, id, attrs) {
try {
jsiiDeprecationWarnings.print("@aws-cdk/aws-eks-v2-alpha.KubectlProvider#fromKubectlProviderAttributes", "");
jsiiDeprecationWarnings._aws_cdk_aws_eks_v2_alpha_KubectlProviderAttributes(attrs);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, this.fromKubectlProviderAttributes);
}
throw error;
}
class Import extends constructs_1.Construct {
serviceToken = attrs.serviceToken;
role = attrs.role;
}
return new Import(scope, id);
}
/**
* The custom resource provider's service token.
*/
serviceToken;
/**
* The IAM execution role of the handler.
*/
role;
constructor(scope, id, props) {
super(scope, id);
try {
jsiiDeprecationWarnings.print("@aws-cdk/aws-eks-v2-alpha.KubectlProvider", "");
jsiiDeprecationWarnings._aws_cdk_aws_eks_v2_alpha_KubectlProviderProps(props);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, KubectlProvider);
}
throw error;
}
const vpc = props.privateSubnets ? props.cluster.vpc : undefined;
let securityGroups;
if (props.privateSubnets && props.cluster.clusterSecurityGroup) {
securityGroups = [props.cluster.clusterSecurityGroup];
}
const privateSubnets = props.privateSubnets ? { subnets: props.privateSubnets } : undefined;
const handler = new lambda.Function(this, 'Handler', {
timeout: core_1.Duration.minutes(15),
description: 'onEvent handler for EKS kubectl resource provider',
memorySize: props.memory?.toMebibytes() ?? 1024,
environment: {
// required and recommended for boto3
AWS_STS_REGIONAL_ENDPOINTS: 'regional',
...props.environment,
},
role: props.role,
code: lambda.Code.fromAsset(path.join(__dirname, 'kubectl-handler')),
handler: 'index.handler',
runtime: lambda.Runtime.determineLatestPythonRuntime(this),
// defined only when using private access
vpc,
securityGroups,
vpcSubnets: privateSubnets,
});
// allow user to customize the layers with the tools we need
handler.addLayers(props.awscliLayer ?? new lambda_layer_awscli_1.AwsCliLayer(this, 'AwsCliLayer'));
handler.addLayers(props.kubectlLayer);
const handlerRole = handler.role;
handlerRole.addToPrincipalPolicy(new iam.PolicyStatement({
actions: ['eks:DescribeCluster'],
resources: [props.cluster.clusterArn],
}));
// taken from the lambda default role logic.
// makes it easier for roles to be passed in.
if (handler.isBoundToVpc) {
handlerRole.addManagedPolicy(iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSLambdaVPCAccessExecutionRole'));
}
// For OCI helm chart authorization.
handlerRole.addManagedPolicy(iam.ManagedPolicy.fromAwsManagedPolicyName('AmazonEC2ContainerRegistryReadOnly'));
/**
* For OCI helm chart public ECR authorization. As ECR public is only available in `aws` partition,
* we conditionally attach this policy when the AWS partition is `aws`.
*/
const hasEcrPublicCondition = new core_1.CfnCondition(handlerRole.node.scope, 'HasEcrPublic', {
expression: core_1.Fn.conditionEquals(core_1.Aws.PARTITION, 'aws'),
});
const conditionalPolicy = iam.ManagedPolicy.fromManagedPolicyArn(this, 'ConditionalPolicyArn', core_1.Fn.conditionIf(hasEcrPublicCondition.logicalId, iam.ManagedPolicy.fromAwsManagedPolicyName('AmazonElasticContainerRegistryPublicReadOnly').managedPolicyArn, core_1.Aws.NO_VALUE).toString());
handlerRole.addManagedPolicy(iam.ManagedPolicy.fromManagedPolicyArn(this, 'conditionalPolicy', conditionalPolicy.managedPolicyArn));
const provider = new cr.Provider(this, 'Provider', {
onEventHandler: handler,
vpc: vpc,
vpcSubnets: privateSubnets,
securityGroups,
});
this.serviceToken = provider.serviceToken;
this.role = handlerRole;
if (props.removalPolicy) {
core_1.RemovalPolicies.of(this).apply(props.removalPolicy);
}
}
}
exports.KubectlProvider = KubectlProvider;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3ViZWN0bC1wcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImt1YmVjdGwtcHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2QkFBNkI7QUFFN0IsMkNBQTJDO0FBQzNDLGlEQUFpRDtBQUVqRCwyQ0FBb0Y7QUFDcEYsbURBQW1EO0FBQ25ELHlFQUE4RDtBQUU5RCwyQ0FBdUM7QUFFdkMsdUNBQW9DO0FBOEdwQzs7R0FFRztBQUNILE1BQWEsZUFBZ0IsU0FBUSxzQkFBUzs7SUFDNUM7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsa0JBQWtCLENBQUMsS0FBZ0IsRUFBRSxPQUFpQjs7Ozs7Ozs7Ozs7UUFDbEUseUVBQXlFO1FBQ3pFLGlDQUFpQztRQUNqQyxJQUFJLE9BQU8sWUFBWSxpQkFBTyxFQUFFLENBQUM7WUFDL0IsT0FBTyxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQyxlQUFlLENBQUM7S0FDaEM7SUFFRDs7Ozs7O09BTUc7SUFDSSxNQUFNLENBQUMsNkJBQTZCLENBQUMsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBZ0M7Ozs7Ozs7Ozs7O1FBQ3hHLE1BQU0sTUFBTyxTQUFRLHNCQUFTO1lBQ1osWUFBWSxHQUFXLEtBQUssQ0FBQyxZQUFZLENBQUM7WUFDMUMsSUFBSSxHQUFlLEtBQUssQ0FBQyxJQUFJLENBQUM7U0FDL0M7UUFDRCxPQUFPLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztLQUM5QjtJQUVEOztPQUVHO0lBQ2EsWUFBWSxDQUFTO0lBRXJDOztPQUVHO0lBQ2EsSUFBSSxDQUFhO0lBRWpDLFlBQW1CLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTJCO1FBQzFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7Ozs7Ozs7K0NBM0NSLGVBQWU7Ozs7UUE2Q3hCLE1BQU0sR0FBRyxHQUFH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QUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDLGdCQUFnQixFQUMzRyxVQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQzNCLENBQUM7UUFFRixXQUFXLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1FBRXBJLE1BQU0sUUFBUSxHQUFHLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQ2pELGNBQWMsRUFBRSxPQUFPO1lBQ3ZCLEdBQUcsRUFBRSxHQUFHO1lBQ1IsVUFBVSxFQUFFLGNBQWM7WUFDMUIsY0FBYztTQUNmLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUMxQyxJQUFJLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQztRQUV4QixJQUFJLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN4QixzQkFBZSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3RELENBQUM7S0FDRjs7QUExSEgsMENBMkhDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB0eXBlICogYXMgZWMyIGZyb20gJ2F3cy1jZGstbGliL2F3cy1lYzInO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHR5cGUgeyBSZW1vdmFsUG9saWN5LCBTaXplIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZSc7XG5pbXBvcnQgeyBEdXJhdGlvbiwgQ2ZuQ29uZGl0aW9uLCBGbiwgQXdzLCBSZW1vdmFsUG9saWNpZXMgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCAqIGFzIGNyIGZyb20gJ2F3cy1jZGstbGliL2N1c3RvbS1yZXNvdXJjZXMnO1xuaW1wb3J0IHsgQXdzQ2xpTGF5ZXIgfSBmcm9tICdhd3MtY2RrLWxpYi9sYW1iZGEtbGF5ZXItYXdzY2xpJztcbmltcG9ydCB0eXBlIHsgSUNvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgdHlwZSB7IElDbHVzdGVyIH0gZnJvbSAnLi9jbHVzdGVyJztcbmltcG9ydCB7IENsdXN0ZXIgfSBmcm9tICcuL2NsdXN0ZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIEt1YmVjdGxQcm92aWRlck9wdGlvbnMge1xuICAvKipcbiAgICogQW4gSUFNIHJvbGUgdGhhdCBjYW4gcGVyZm9ybSBrdWJlY3RsIG9wZXJhdGlvbnMgYWdhaW5zdCB0aGlzIGNsdXN0ZXIuXG4gICAqXG4gICAqIFRoZSByb2xlIHNob3VsZCBiZSBtYXBwZWQgdG8gdGhlIGBzeXN0ZW06bWFzdGVyc2AgS3ViZXJuZXRlcyBSQkFDIHJvbGUuXG4gICAqXG4gICAqIFRoaXMgcm9sZSBpcyBkaXJlY3RseSBwYXNzZWQgdG8gdGhlIGxhbWJkYSBoYW5kbGVyIHRoYXQgc2VuZHMgS3ViZSBDdGwgY29tbWFuZHMgdG8gdGhlIGNsdXN0ZXIuXG4gICAqIEBkZWZhdWx0IC0gaWYgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgcm9sZSBjcmVhdGVkIGJ5IGEgbGFtYmRhIGZ1bmN0aW9uIHdpbGxcbiAgICogYmUgdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IHJvbGU/OiBpYW0uSVJvbGU7XG5cbiAgLyoqXG4gICAqIEFuIEFXUyBMYW1iZGEgbGF5ZXIgdGhhdCBjb250YWlucyB0aGUgYGF3c2AgQ0xJLlxuICAgKlxuICAgKiBJZiBub3QgZGVmaW5lZCwgYSBkZWZhdWx0IGxheWVyIHdpbGwgYmUgdXNlZCBjb250YWluaW5nIHRoZSBBV1MgQ0xJIDIueC5cbiAgICovXG4gIHJlYWRvbmx5IGF3c2NsaUxheWVyPzogbGFtYmRhLklMYXllclZlcnNpb247XG5cbiAgLyoqXG4gICAqXG4gICAqIEN1c3RvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgd2hlbiBydW5uaW5nIGBrdWJlY3RsYCBhZ2FpbnN0IHRoaXMgY2x1c3Rlci5cbiAgICovXG4gIHJlYWRvbmx5IGVudmlyb25tZW50PzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogQSBzZWN1cml0eSBncm91cCB0byB1c2UgZm9yIGBrdWJlY3RsYCBleGVjdXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gSWYgbm90IHNwZWNpZmllZCwgdGhlIGs4cyBlbmRwb2ludCBpcyBleHBlY3RlZCB0byBiZSBhY2Nlc3NpYmxlXG4gICAqIHB1YmxpY2x5LlxuICAgKi9cbiAgcmVhZG9ubHkgc2VjdXJpdHlHcm91cD86IGVjMi5JU2VjdXJpdHlHcm91cDtcblxuICAvKipcbiAgICogVGhlIGFtb3VudCBvZiBtZW1vcnkgYWxsb2NhdGVkIHRvIHRoZSBrdWJlY3RsIHByb3ZpZGVyJ3MgbGFtYmRhIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgbWVtb3J5PzogU2l6ZTtcblxuICAvKipcbiAgICogQW4gQVdTIExhbWJkYSBsYXllciB0aGF0IGluY2x1ZGVzIGBrdWJlY3RsYCBhbmQgYGhlbG1gXG4gICAqL1xuICByZWFkb25seSBrdWJlY3RsTGF5ZXI6IGxhbWJkYS5JTGF5ZXJWZXJzaW9uO1xuXG4gIC8qKlxuICAgKiBTdWJuZXRzIHRvIGhvc3QgdGhlIGBrdWJlY3RsYCBjb21wdXRlIHJlc291cmNlcy4gSWYgbm90IHNwZWNpZmllZCwgdGhlIGs4c1xuICAgKiBlbmRwb2ludCBpcyBleHBlY3RlZCB0byBiZSBhY2Nlc3NpYmxlIHB1YmxpY2x5LlxuICAgKi9cbiAgcmVhZG9ubHkgcHJpdmF0ZVN1Ym5ldHM/OiBlYzIuSVN1Ym5ldFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVtb3ZhbCBwb2xpY3kgYXBwbGllZCB0byB0aGUgY3VzdG9tIHJlc291cmNlIHRoYXQgcHJvdmlkZXMga3ViZWN0bC5cbiAgICpcbiAgICogVGhlIHJlbW92YWwgcG9saWN5IGNvbnRyb2xzIHdoYXQgaGFwcGVucyB0byB0aGUgcmVzb3VyY2UgaWYgaXQgc3RvcHMgYmVpbmcgbWFuYWdlZCBieSBDbG91ZEZvcm1hdGlvbi5cbiAgICogVGhpcyBjYW4gaGFwcGVuIGluIG9uZSBvZiB0aHJlZSBzaXR1YXRpb25zOlxuICAgKlxuICAgKiAtIFRoZSByZXNvdXJjZSBpcyByZW1vdmVkIGZyb20gdGhlIHRlbXBsYXRlLCBzbyBDbG91ZEZvcm1hdGlvbiBzdG9wcyBtYW5hZ2luZyBpdFxuICAgKiAtIEEgY2hhbmdlIHRvIHRoZSByZXNvdXJjZSBpcyBtYWRlIHRoYXQgcmVxdWlyZXMgaXQgdG8gYmUgcmVwbGFjZWQsIHNvIENsb3VkRm9ybWF0aW9uIHN0b3BzIG1hbmFnaW5nIGl0XG4gICAqIC0gVGhlIHN0YWNrIGlzIGRlbGV0ZWQsIHNvIENsb3VkRm9ybWF0aW9uIHN0b3BzIG1hbmFnaW5nIGFsbCByZXNvdXJjZXMgaW4gaXRcbiAgICpcbiAgICogQGRlZmF1bHQgUmVtb3ZhbFBvbGljeS5ERVNUUk9ZXG4gICAqL1xuICByZWFkb25seSByZW1vdmFsUG9saWN5PzogUmVtb3ZhbFBvbGljeTtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBhIEt1YmVjdGxQcm92aWRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEt1YmVjdGxQcm92aWRlclByb3BzIGV4dGVuZHMgS3ViZWN0bFByb3ZpZGVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgY2x1c3RlciB0byBjb250cm9sLlxuICAgKi9cbiAgcmVhZG9ubHkgY2x1c3RlcjogSUNsdXN0ZXI7XG59XG5cbi8qKlxuICogS3ViZWN0bCBQcm92aWRlciBBdHRyaWJ1dGVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS3ViZWN0bFByb3ZpZGVyQXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBUaGUga3ViZWN0bCBwcm92aWRlciBsYW1iZGEgYXJuXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlVG9rZW46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJvbGUgb2YgdGhlIHByb3ZpZGVyIGxhbWJkYSBmdW5jdGlvbi5cbiAgICogT25seSByZXF1aXJlZCBpZiB5b3UgZGVwbG95IGhlbG0gY2hhcnRzIHVzaW5nIHRoaXMgaW1wb3J0ZWQgcHJvdmlkZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcm9sZS5cbiAgICovXG4gIHJlYWRvbmx5IHJvbGU/OiBpYW0uSVJvbGU7XG59XG5cbi8qKlxuICogSW1wb3J0ZWQgS3ViZWN0bFByb3ZpZGVyIHRoYXQgY2FuIGJlIHVzZWQgaW4gcGxhY2Ugb2YgdGhlIGRlZmF1bHQgb25lIGNyZWF0ZWQgYnkgQ0RLXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUt1YmVjdGxQcm92aWRlciBleHRlbmRzIElDb25zdHJ1Y3Qge1xuICAvKipcbiAgICogVGhlIGN1c3RvbSByZXNvdXJjZSBwcm92aWRlcidzIHNlcnZpY2UgdG9rZW4uXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlVG9rZW46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJvbGUgb2YgdGhlIHByb3ZpZGVyIGxhbWJkYSBmdW5jdGlvbi4gSWYgdW5kZWZpbmVkLFxuICAgKiB5b3UgY2Fubm90IHVzZSB0aGlzIHByb3ZpZGVyIHRvIGRlcGxveSBoZWxtIGNoYXJ0cy5cbiAgICovXG4gIHJlYWRvbmx5IHJvbGU/OiBpYW0uSVJvbGU7XG59XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgS3ViZWN0bCBMYW1iZGFcbiAqL1xuZXhwb3J0IGNsYXNzIEt1YmVjdGxQcm92aWRlciBleHRlbmRzIENvbnN0cnVjdCBpbXBsZW1lbnRzIElLdWJlY3RsUHJvdmlkZXIge1xuICAvKipcbiAgICogVGFrZSBleGlzdGluZyBwcm92aWRlciBvbiBjbHVzdGVyXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBDb25zdHJ1Y3RcbiAgICogQHBhcmFtIGNsdXN0ZXIgazhzIGNsdXN0ZXJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0S3ViZWN0bFByb3ZpZGVyKHNjb3BlOiBDb25zdHJ1Y3QsIGNsdXN0ZXI6IElDbHVzdGVyKSB7XG4gICAgLy8gaWYgdGhpcyBpcyBhbiBcIm93bmVkXCIgY2x1c3Rlciwgd2UgbmVlZCB0byB3YWl0IGZvciB0aGUga3ViZWN0bCBiYXJyaWVyXG4gICAgLy8gYmVmb3JlIGFwcGx5aW5nIGFueSByZXNvdXJjZXMuXG4gICAgaWYgKGNsdXN0ZXIgaW5zdGFuY2VvZiBDbHVzdGVyKSB7XG4gICAgICBjbHVzdGVyLl9kZXBlbmRPbkt1YmVjdGxCYXJyaWVyKHNjb3BlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2x1c3Rlci5rdWJlY3RsUHJvdmlkZXI7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGFuIGV4aXN0aW5nIHByb3ZpZGVyXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBDb25zdHJ1Y3RcbiAgICogQHBhcmFtIGlkIGFuIGlkIG9mIHJlc291cmNlXG4gICAqIEBwYXJhbSBhdHRycyBhdHRyaWJ1dGVzIGZvciB0aGUgcHJvdmlkZXJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUt1YmVjdGxQcm92aWRlckF0dHJpYnV0ZXMoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgYXR0cnM6IEt1YmVjdGxQcm92aWRlckF0dHJpYnV0ZXMpOiBJS3ViZWN0bFByb3ZpZGVyIHtcbiAgICBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJS3ViZWN0bFByb3ZpZGVyIHtcbiAgICAgIHB1YmxpYyByZWFkb25seSBzZXJ2aWNlVG9rZW46IHN0cmluZyA9IGF0dHJzLnNlcnZpY2VUb2tlbjtcbiAgICAgIHB1YmxpYyByZWFkb25seSByb2xlPzogaWFtLklSb2xlID0gYXR0cnMucm9sZTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY3VzdG9tIHJlc291cmNlIHByb3ZpZGVyJ3Mgc2VydmljZSB0b2tlbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzZXJ2aWNlVG9rZW46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElBTSBleGVjdXRpb24gcm9sZSBvZiB0aGUgaGFuZGxlci5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByb2xlPzogaWFtLklSb2xlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogS3ViZWN0bFByb3ZpZGVyUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3QgdnBjID0gcHJvcHMucHJpdmF0ZVN1Ym5ldHMgPyBwcm9wcy5jbHVzdGVyLnZwYyA6IHVuZGVmaW5lZDtcbiAgICBsZXQgc2VjdXJpdHlHcm91cHM7XG4gICAgaWYgKHByb3BzLnByaXZhdGVTdWJuZXRzICYmIHByb3BzLmNsdXN0ZXIuY2x1c3RlclNlY3VyaXR5R3JvdXApIHtcbiAgICAgIHNlY3VyaXR5R3JvdXBzID0gW3Byb3BzLmNsdXN0ZXIuY2x1c3RlclNlY3VyaXR5R3JvdXBdO1xuICAgIH1cbiAgICBjb25zdCBwcml2YXRlU3VibmV0cyA9IHByb3BzLnByaXZhdGVTdWJuZXRzID8geyBzdWJuZXRzOiBwcm9wcy5wcml2YXRlU3VibmV0cyB9IDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgaGFuZGxlciA9IG5ldyBsYW1iZGEuRnVuY3Rpb24odGhpcywgJ0hhbmRsZXInLCB7XG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDE1KSxcbiAgICAgIGRlc2NyaXB0aW9uOiAnb25FdmVudCBoYW5kbGVyIGZvciBFS1Mga3ViZWN0bCByZXNvdXJjZSBwcm92aWRlcicsXG4gICAgICBtZW1vcnlTaXplOiBwcm9wcy5tZW1vcnk/LnRvTWViaWJ5dGVzKCkgPz8gMTAyNCxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIC8vIHJlcXVpcmVkIGFuZCByZWNvbW1lbmRlZCBmb3IgYm90bzNcbiAgICAgICAgQVdTX1NUU19SRUdJT05BTF9FTkRQT0lOVFM6ICdyZWdpb25hbCcsXG4gICAgICAgIC4uLnByb3BzLmVudmlyb25tZW50LFxuICAgICAgfSxcbiAgICAgIHJvbGU6IHByb3BzLnJvbGUsXG4gICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJ2t1YmVjdGwtaGFuZGxlcicpKSxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLmRldGVybWluZUxhdGVzdFB5dGhvblJ1bnRpbWUodGhpcyksXG4gICAgICAvLyBkZWZpbmVkIG9ubHkgd2hlbiB1c2luZyBwcml2YXRlIGFjY2Vzc1xuICAgICAgdnBjLFxuICAgICAgc2VjdXJpdHlHcm91cHMsXG4gICAgICB2cGNTdWJuZXRzOiBwcml2YXRlU3VibmV0cyxcbiAgICB9KTtcblxuICAgIC8vIGFsbG93IHVzZXIgdG8gY3VzdG9taXplIHRoZSBsYXllcnMgd2l0aCB0aGUgdG9vbHMgd2UgbmVlZFxuICAgIGhhbmRsZXIuYWRkTGF5ZXJzKHByb3BzLmF3c2NsaUxheWVyID8/IG5ldyBBd3NDbGlMYXllcih0aGlzLCAnQXdzQ2xpTGF5ZXInKSk7XG4gICAgaGFuZGxlci5hZGRMYXllcnMocHJvcHMua3ViZWN0bExheWVyKTtcblxuICAgIGNvbnN0IGhhbmRsZXJSb2xlID0gaGFuZGxlci5yb2xlITtcblxuICAgIGhhbmRsZXJSb2xlLmFkZFRvUHJpbmNpcGFsUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGFjdGlvbnM6IFsnZWtzOkRlc2NyaWJlQ2x1c3RlciddLFxuICAgICAgcmVzb3VyY2VzOiBbcHJvcHMuY2x1c3Rlci5jbHVzdGVyQXJuXSxcbiAgICB9KSk7XG5cbiAgICAvLyB0YWtlbiBmcm9tIHRoZSBsYW1iZGEgZGVmYXVsdCByb2xlIGxvZ2ljLlxuICAgIC8vIG1ha2VzIGl0IGVhc2llciBmb3Igcm9sZXMgdG8gYmUgcGFzc2VkIGluLlxuICAgIGlmIChoYW5kbGVyLmlzQm91bmRUb1ZwYykge1xuICAgICAgaGFuZGxlclJvbGUuYWRkTWFuYWdlZFBvbGljeShpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoJ3NlcnZpY2Utcm9sZS9BV1NMYW1iZGFWUENBY2Nlc3NFeGVjdXRpb25Sb2xlJykpO1xuICAgIH1cblxuICAgIC8vIEZvciBPQ0kgaGVsbSBjaGFydCBhdXRob3JpemF0aW9uLlxuICAgIGhhbmRsZXJSb2xlLmFkZE1hbmFnZWRQb2xpY3koXG4gICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoJ0FtYXpvbkVDMkNvbnRhaW5lclJlZ2lzdHJ5UmVhZE9ubHknKSxcbiAgICApO1xuXG4gICAgLyoqXG4gICAgICogRm9yIE9DSSBoZWxtIGNoYXJ0IHB1YmxpYyBFQ1IgYXV0aG9yaXphdGlvbi4gQXMgRUNSIHB1YmxpYyBpcyBvbmx5IGF2YWlsYWJsZSBpbiBgYXdzYCBwYXJ0aXRpb24sXG4gICAgICogd2UgY29uZGl0aW9uYWxseSBhdHRhY2ggdGhpcyBwb2xpY3kgd2hlbiB0aGUgQVdTIHBhcnRpdGlvbiBpcyBgYXdzYC5cbiAgICAgKi9cbiAgICBjb25zdCBoYXNFY3JQdWJsaWNDb25kaXRpb24gPSBuZXcgQ2ZuQ29uZGl0aW9uKGhhbmRsZXJSb2xlLm5vZGUuc2NvcGUhLCAnSGFzRWNyUHVibGljJywge1xuICAgICAgZXhwcmVzc2lvbjogRm4uY29uZGl0aW9uRXF1YWxzKEF3cy5QQVJUSVRJT04sICdhd3MnKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbmRpdGlvbmFsUG9saWN5ID0gaWFtLk1hbmFnZWRQb2xpY3kuZnJvbU1hbmFnZWRQb2xpY3lBcm4odGhpcywgJ0NvbmRpdGlvbmFsUG9saWN5QXJuJyxcbiAgICAgIEZuLmNvbmRpdGlvbklmKGhhc0VjclB1YmxpY0NvbmRpdGlvbi5sb2dpY2FsSWQsXG4gICAgICAgIGlhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZSgnQW1hem9uRWxhc3RpY0NvbnRhaW5lclJlZ2lzdHJ5UHVibGljUmVhZE9ubHknKS5tYW5hZ2VkUG9saWN5QXJuLFxuICAgICAgICBBd3MuTk9fVkFMVUUpLnRvU3RyaW5nKCksXG4gICAgKTtcblxuICAgIGhhbmRsZXJSb2xlLmFkZE1hbmFnZWRQb2xpY3koaWFtLk1hbmFnZWRQb2xpY3kuZnJvbU1hbmFnZWRQb2xpY3lBcm4odGhpcywgJ2NvbmRpdGlvbmFsUG9saWN5JywgY29uZGl0aW9uYWxQb2xpY3kubWFuYWdlZFBvbGljeUFybikpO1xuXG4gICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgY3IuUHJvdmlkZXIodGhpcywgJ1Byb3ZpZGVyJywge1xuICAgICAgb25FdmVudEhhbmRsZXI6IGhhbmRsZXIsXG4gICAgICB2cGM6IHZwYyxcbiAgICAgIHZwY1N1Ym5ldHM6IHByaXZhdGVTdWJuZXRzLFxuICAgICAgc2VjdXJpdHlHcm91cHMsXG4gICAgfSk7XG5cbiAgICB0aGlzLnNlcnZpY2VUb2tlbiA9IHByb3ZpZGVyLnNlcnZpY2VUb2tlbjtcbiAgICB0aGlzLnJvbGUgPSBoYW5kbGVyUm9sZTtcblxuICAgIGlmIChwcm9wcy5yZW1vdmFsUG9saWN5KSB7XG4gICAgICBSZW1vdmFsUG9saWNpZXMub2YodGhpcykuYXBwbHkocHJvcHMucmVtb3ZhbFBvbGljeSk7XG4gICAgfVxuICB9XG59XG4iXX0=