@aws-cdk/aws-eks-v2-alpha
Version:
The CDK Construct Library for AWS::EKS
140 lines • 20.2 kB
JavaScript
;
var _a;
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 constructs_1 = require("constructs");
const cluster_1 = require("./cluster");
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 path = require("path");
/**
* Implementation of Kubectl Lambda
*/
class KubectlProvider extends constructs_1.Construct {
/**
* Take existing provider on cluster
*
* @param scope Construct
* @param cluster k8s cluster
*/
static getKubectlProvider(scope, cluster) {
try {
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._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 {
constructor() {
super(...arguments);
this.serviceToken = attrs.serviceToken;
this.role = attrs.role;
}
}
return new Import(scope, id);
}
constructor(scope, id, props) {
super(scope, id);
try {
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.PYTHON_3_11,
// 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: props.cluster.vpc,
vpcSubnets: privateSubnets,
securityGroups,
});
this.serviceToken = provider.serviceToken;
this.role = handlerRole;
}
}
exports.KubectlProvider = KubectlProvider;
_a = JSII_RTTI_SYMBOL_1;
KubectlProvider[_a] = { fqn: "@aws-cdk/aws-eks-v2-alpha.KubectlProvider", version: "2.208.0-alpha.0" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3ViZWN0bC1wcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImt1YmVjdGwtcHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsMkNBQW1EO0FBQ25ELHVDQUE4QztBQUU5QywyQ0FBMkM7QUFDM0MsaURBQWlEO0FBQ2pELDJDQUF5RTtBQUN6RSxtREFBbUQ7QUFDbkQseUVBQThEO0FBQzlELDZCQUE2QjtBQWdHN0I7O0dBRUc7QUFDSCxNQUFhLGVBQWdCLFNBQVEsc0JBQVM7SUFDNUM7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsa0JBQWtCLENBQUMsS0FBZ0IsRUFBRSxPQUFpQjs7Ozs7Ozs7OztRQUNsRSx5RUFBeUU7UUFDekUsaUNBQWlDO1FBQ2pDLElBQUksT0FBTyxZQUFZLGlCQUFPLEVBQUUsQ0FBQztZQUMvQixPQUFPLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUVELE9BQU8sT0FBTyxDQUFDLGVBQWUsQ0FBQztLQUNoQztJQUVEOzs7Ozs7T0FNRztJQUNJLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFnQzs7Ozs7Ozs7OztRQUN4RyxNQUFNLE1BQU8sU0FBUSxzQkFBUztZQUE5Qjs7Z0JBQ2tCLGlCQUFZLEdBQVcsS0FBSyxDQUFDLFlBQVksQ0FBQztnQkFDMUMsU0FBSSxHQUFlLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDaEQsQ0FBQztTQUFBO1FBQ0QsT0FBTyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7S0FDOUI7SUFZRCxZQUFtQixLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUEyQjtRQUMxRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDOzs7Ozs7K0NBM0NSLGVBQWU7Ozs7UUE2Q3hCLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUss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M0csVUFBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUMzQixDQUFDO1FBRUYsV0FBVyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLG1CQUFtQixFQUFFLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztRQUVwSSxNQUFNLFFBQVEsR0FBRyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtZQUNqRCxjQUFjLEVBQUUsT0FBTztZQUN2QixHQUFHLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHO1lBQ3RCLFVBQVUsRUFBRSxjQUFjO1lBQzFCLGNBQWM7U0FDZixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDMUMsSUFBSSxDQUFDLElBQUksR0FBRyxXQUFXLENBQUM7S0FDekI7O0FBdEhILDBDQXVIQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnN0cnVjdCwgSUNvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQ2x1c3RlciwgSUNsdXN0ZXIgfSBmcm9tICcuL2NsdXN0ZXInO1xuaW1wb3J0ICogYXMgZWMyIGZyb20gJ2F3cy1jZGstbGliL2F3cy1lYzInO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgRHVyYXRpb24sIENmbkNvbmRpdGlvbiwgRm4sIEF3cywgU2l6ZSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0ICogYXMgY3IgZnJvbSAnYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlcyc7XG5pbXBvcnQgeyBBd3NDbGlMYXllciB9IGZyb20gJ2F3cy1jZGstbGliL2xhbWJkYS1sYXllci1hd3NjbGknO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuZXhwb3J0IGludGVyZmFjZSBLdWJlY3RsUHJvdmlkZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFuIElBTSByb2xlIHRoYXQgY2FuIHBlcmZvcm0ga3ViZWN0bCBvcGVyYXRpb25zIGFnYWluc3QgdGhpcyBjbHVzdGVyLlxuICAgKlxuICAgKiBUaGUgcm9sZSBzaG91bGQgYmUgbWFwcGVkIHRvIHRoZSBgc3lzdGVtOm1hc3RlcnNgIEt1YmVybmV0ZXMgUkJBQyByb2xlLlxuICAgKlxuICAgKiBUaGlzIHJvbGUgaXMgZGlyZWN0bHkgcGFzc2VkIHRvIHRoZSBsYW1iZGEgaGFuZGxlciB0aGF0IHNlbmRzIEt1YmUgQ3RsIGNvbW1hbmRzIHRvIHRoZSBjbHVzdGVyLlxuICAgKiBAZGVmYXVsdCAtIGlmIG5vdCBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHJvbGUgY3JlYXRlZCBieSBhIGxhbWJkYSBmdW5jdGlvbiB3aWxsXG4gICAqIGJlIHVzZWQuXG4gICAqL1xuICByZWFkb25seSByb2xlPzogaWFtLklSb2xlO1xuXG4gIC8qKlxuICAgKiBBbiBBV1MgTGFtYmRhIGxheWVyIHRoYXQgY29udGFpbnMgdGhlIGBhd3NgIENMSS5cbiAgICpcbiAgICogSWYgbm90IGRlZmluZWQsIGEgZGVmYXVsdCBsYXllciB3aWxsIGJlIHVzZWQgY29udGFpbmluZyB0aGUgQVdTIENMSSAyLnguXG4gICAqL1xuICByZWFkb25seSBhd3NjbGlMYXllcj86IGxhbWJkYS5JTGF5ZXJWZXJzaW9uO1xuXG4gIC8qKlxuICAgKlxuICAgKiBDdXN0b20gZW52aXJvbm1lbnQgdmFyaWFibGVzIHdoZW4gcnVubmluZyBga3ViZWN0bGAgYWdhaW5zdCB0aGlzIGNsdXN0ZXIuXG4gICAqL1xuICByZWFkb25seSBlbnZpcm9ubWVudD86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIEEgc2VjdXJpdHkgZ3JvdXAgdG8gdXNlIGZvciBga3ViZWN0bGAgZXhlY3V0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBrOHMgZW5kcG9pbnQgaXMgZXhwZWN0ZWQgdG8gYmUgYWNjZXNzaWJsZVxuICAgKiBwdWJsaWNseS5cbiAgICovXG4gIHJlYWRvbmx5IHNlY3VyaXR5R3JvdXA/OiBlYzIuSVNlY3VyaXR5R3JvdXA7XG5cbiAgLyoqXG4gICAqIFRoZSBhbW91bnQgb2YgbWVtb3J5IGFsbG9jYXRlZCB0byB0aGUga3ViZWN0bCBwcm92aWRlcidzIGxhbWJkYSBmdW5jdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IG1lbW9yeT86IFNpemU7XG5cbiAgLyoqXG4gICAqIEFuIEFXUyBMYW1iZGEgbGF5ZXIgdGhhdCBpbmNsdWRlcyBga3ViZWN0bGAgYW5kIGBoZWxtYFxuICAgKi9cbiAgcmVhZG9ubHkga3ViZWN0bExheWVyOiBsYW1iZGEuSUxheWVyVmVyc2lvbjtcblxuICAvKipcbiAgICogU3VibmV0cyB0byBob3N0IHRoZSBga3ViZWN0bGAgY29tcHV0ZSByZXNvdXJjZXMuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBrOHNcbiAgICogZW5kcG9pbnQgaXMgZXhwZWN0ZWQgdG8gYmUgYWNjZXNzaWJsZSBwdWJsaWNseS5cbiAgICovXG4gIHJlYWRvbmx5IHByaXZhdGVTdWJuZXRzPzogZWMyLklTdWJuZXRbXTtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBhIEt1YmVjdGxQcm92aWRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEt1YmVjdGxQcm92aWRlclByb3BzIGV4dGVuZHMgS3ViZWN0bFByb3ZpZGVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgY2x1c3RlciB0byBjb250cm9sLlxuICAgKi9cbiAgcmVhZG9ubHkgY2x1c3RlcjogSUNsdXN0ZXI7XG59XG5cbi8qKlxuICogS3ViZWN0bCBQcm92aWRlciBBdHRyaWJ1dGVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS3ViZWN0bFByb3ZpZGVyQXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBUaGUga3ViZWN0bCBwcm92aWRlciBsYW1iZGEgYXJuXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlVG9rZW46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJvbGUgb2YgdGhlIHByb3ZpZGVyIGxhbWJkYSBmdW5jdGlvbi5cbiAgICogT25seSByZXF1aXJlZCBpZiB5b3UgZGVwbG95IGhlbG0gY2hhcnRzIHVzaW5nIHRoaXMgaW1wb3J0ZWQgcHJvdmlkZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcm9sZS5cbiAgICovXG4gIHJlYWRvbmx5IHJvbGU/OiBpYW0uSVJvbGU7XG59XG5cbi8qKlxuICogSW1wb3J0ZWQgS3ViZWN0bFByb3ZpZGVyIHRoYXQgY2FuIGJlIHVzZWQgaW4gcGxhY2Ugb2YgdGhlIGRlZmF1bHQgb25lIGNyZWF0ZWQgYnkgQ0RLXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUt1YmVjdGxQcm92aWRlciBleHRlbmRzIElDb25zdHJ1Y3Qge1xuICAvKipcbiAgICogVGhlIGN1c3RvbSByZXNvdXJjZSBwcm92aWRlcidzIHNlcnZpY2UgdG9rZW4uXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlVG9rZW46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJvbGUgb2YgdGhlIHByb3ZpZGVyIGxhbWJkYSBmdW5jdGlvbi4gSWYgdW5kZWZpbmVkLFxuICAgKiB5b3UgY2Fubm90IHVzZSB0aGlzIHByb3ZpZGVyIHRvIGRlcGxveSBoZWxtIGNoYXJ0cy5cbiAgICovXG4gIHJlYWRvbmx5IHJvbGU/OiBpYW0uSVJvbGU7XG59XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgS3ViZWN0bCBMYW1iZGFcbiAqL1xuZXhwb3J0IGNsYXNzIEt1YmVjdGxQcm92aWRlciBleHRlbmRzIENvbnN0cnVjdCBpbXBsZW1lbnRzIElLdWJlY3RsUHJvdmlkZXIge1xuICAvKipcbiAgICogVGFrZSBleGlzdGluZyBwcm92aWRlciBvbiBjbHVzdGVyXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBDb25zdHJ1Y3RcbiAgICogQHBhcmFtIGNsdXN0ZXIgazhzIGNsdXN0ZXJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0S3ViZWN0bFByb3ZpZGVyKHNjb3BlOiBDb25zdHJ1Y3QsIGNsdXN0ZXI6IElDbHVzdGVyKSB7XG4gICAgLy8gaWYgdGhpcyBpcyBhbiBcIm93bmVkXCIgY2x1c3Rlciwgd2UgbmVlZCB0byB3YWl0IGZvciB0aGUga3ViZWN0bCBiYXJyaWVyXG4gICAgLy8gYmVmb3JlIGFwcGx5aW5nIGFueSByZXNvdXJjZXMuXG4gICAgaWYgKGNsdXN0ZXIgaW5zdGFuY2VvZiBDbHVzdGVyKSB7XG4gICAgICBjbHVzdGVyLl9kZXBlbmRPbkt1YmVjdGxCYXJyaWVyKHNjb3BlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2x1c3Rlci5rdWJlY3RsUHJvdmlkZXI7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGFuIGV4aXN0aW5nIHByb3ZpZGVyXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBDb25zdHJ1Y3RcbiAgICogQHBhcmFtIGlkIGFuIGlkIG9mIHJlc291cmNlXG4gICAqIEBwYXJhbSBhdHRycyBhdHRyaWJ1dGVzIGZvciB0aGUgcHJvdmlkZXJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUt1YmVjdGxQcm92aWRlckF0dHJpYnV0ZXMoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgYXR0cnM6IEt1YmVjdGxQcm92aWRlckF0dHJpYnV0ZXMpOiBJS3ViZWN0bFByb3ZpZGVyIHtcbiAgICBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJS3ViZWN0bFByb3ZpZGVyIHtcbiAgICAgIHB1YmxpYyByZWFkb25seSBzZXJ2aWNlVG9rZW46IHN0cmluZyA9IGF0dHJzLnNlcnZpY2VUb2tlbjtcbiAgICAgIHB1YmxpYyByZWFkb25seSByb2xlPzogaWFtLklSb2xlID0gYXR0cnMucm9sZTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY3VzdG9tIHJlc291cmNlIHByb3ZpZGVyJ3Mgc2VydmljZSB0b2tlbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzZXJ2aWNlVG9rZW46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElBTSBleGVjdXRpb24gcm9sZSBvZiB0aGUgaGFuZGxlci5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByb2xlPzogaWFtLklSb2xlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogS3ViZWN0bFByb3ZpZGVyUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3QgdnBjID0gcHJvcHMucHJpdmF0ZVN1Ym5ldHMgPyBwcm9wcy5jbHVzdGVyLnZwYyA6IHVuZGVmaW5lZDtcbiAgICBsZXQgc2VjdXJpdHlHcm91cHM7XG4gICAgaWYgKHByb3BzLnByaXZhdGVTdWJuZXRzICYmIHByb3BzLmNsdXN0ZXIuY2x1c3RlclNlY3VyaXR5R3JvdXApIHtcbiAgICAgIHNlY3VyaXR5R3JvdXBzID0gW3Byb3BzLmNsdXN0ZXIuY2x1c3RlclNlY3VyaXR5R3JvdXBdO1xuICAgIH1cbiAgICBjb25zdCBwcml2YXRlU3VibmV0cyA9IHByb3BzLnByaXZhdGVTdWJuZXRzID8geyBzdWJuZXRzOiBwcm9wcy5wcml2YXRlU3VibmV0cyB9IDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgaGFuZGxlciA9IG5ldyBsYW1iZGEuRnVuY3Rpb24odGhpcywgJ0hhbmRsZXInLCB7XG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDE1KSxcbiAgICAgIGRlc2NyaXB0aW9uOiAnb25FdmVudCBoYW5kbGVyIGZvciBFS1Mga3ViZWN0bCByZXNvdXJjZSBwcm92aWRlcicsXG4gICAgICBtZW1vcnlTaXplOiBwcm9wcy5tZW1vcnk/LnRvTWViaWJ5dGVzKCkgPz8gMTAyNCxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIC8vIHJlcXVpcmVkIGFuZCByZWNvbW1lbmRlZCBmb3IgYm90bzNcbiAgICAgICAgQVdTX1NUU19SRUdJT05BTF9FTkRQT0lOVFM6ICdyZWdpb25hbCcsXG4gICAgICAgIC4uLnByb3BzLmVudmlyb25tZW50LFxuICAgICAgfSxcbiAgICAgIHJvbGU6IHByb3BzLnJvbGUsXG4gICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJ2t1YmVjdGwtaGFuZGxlcicpKSxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLlBZVEhPTl8zXzExLFxuICAgICAgLy8gZGVmaW5lZCBvbmx5IHdoZW4gdXNpbmcgcHJpdmF0ZSBhY2Nlc3NcbiAgICAgIHZwYyxcbiAgICAgIHNlY3VyaXR5R3JvdXBzLFxuICAgICAgdnBjU3VibmV0czogcHJpdmF0ZVN1Ym5ldHMsXG4gICAgfSk7XG5cbiAgICAvLyBhbGxvdyB1c2VyIHRvIGN1c3RvbWl6ZSB0aGUgbGF5ZXJzIHdpdGggdGhlIHRvb2xzIHdlIG5lZWRcbiAgICBoYW5kbGVyLmFkZExheWVycyhwcm9wcy5hd3NjbGlMYXllciA/PyBuZXcgQXdzQ2xpTGF5ZXIodGhpcywgJ0F3c0NsaUxheWVyJykpO1xuICAgIGhhbmRsZXIuYWRkTGF5ZXJzKHByb3BzLmt1YmVjdGxMYXllcik7XG5cbiAgICBjb25zdCBoYW5kbGVyUm9sZSA9IGhhbmRsZXIucm9sZSE7XG5cbiAgICBoYW5kbGVyUm9sZS5hZGRUb1ByaW5jaXBhbFBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBhY3Rpb25zOiBbJ2VrczpEZXNjcmliZUNsdXN0ZXInXSxcbiAgICAgIHJlc291cmNlczogW3Byb3BzLmNsdXN0ZXIuY2x1c3RlckFybl0sXG4gICAgfSkpO1xuXG4gICAgLy8gdGFrZW4gZnJvbSB0aGUgbGFtYmRhIGRlZmF1bHQgcm9sZSBsb2dpYy5cbiAgICAvLyBtYWtlcyBpdCBlYXNpZXIgZm9yIHJvbGVzIHRvIGJlIHBhc3NlZCBpbi5cbiAgICBpZiAoaGFuZGxlci5pc0JvdW5kVG9WcGMpIHtcbiAgICAgIGhhbmRsZXJSb2xlLmFkZE1hbmFnZWRQb2xpY3koaWFtLk1hbmFnZWRQb2xpY3kuZnJvbUF3c01hbmFnZWRQb2xpY3lOYW1lKCdzZXJ2aWNlLXJvbGUvQVdTTGFtYmRhVlBDQWNjZXNzRXhlY3V0aW9uUm9sZScpKTtcbiAgICB9XG5cbiAgICAvLyBGb3IgT0NJIGhlbG0gY2hhcnQgYXV0aG9yaXphdGlvbi5cbiAgICBoYW5kbGVyUm9sZS5hZGRNYW5hZ2VkUG9saWN5KFxuICAgICAgaWFtLk1hbmFnZWRQb2xpY3kuZnJvbUF3c01hbmFnZWRQb2xpY3lOYW1lKCdBbWF6b25FQzJDb250YWluZXJSZWdpc3RyeVJlYWRPbmx5JyksXG4gICAgKTtcblxuICAgIC8qKlxuICAgICAqIEZvciBPQ0kgaGVsbSBjaGFydCBwdWJsaWMgRUNSIGF1dGhvcml6YXRpb24uIEFzIEVDUiBwdWJsaWMgaXMgb25seSBhdmFpbGFibGUgaW4gYGF3c2AgcGFydGl0aW9uLFxuICAgICAqIHdlIGNvbmRpdGlvbmFsbHkgYXR0YWNoIHRoaXMgcG9saWN5IHdoZW4gdGhlIEFXUyBwYXJ0aXRpb24gaXMgYGF3c2AuXG4gICAgICovXG4gICAgY29uc3QgaGFzRWNyUHVibGljQ29uZGl0aW9uID0gbmV3IENmbkNvbmRpdGlvbihoYW5kbGVyUm9sZS5ub2RlLnNjb3BlISwgJ0hhc0VjclB1YmxpYycsIHtcbiAgICAgIGV4cHJlc3Npb246IEZuLmNvbmRpdGlvbkVxdWFscyhBd3MuUEFSVElUSU9OLCAnYXdzJyksXG4gICAgfSk7XG5cbiAgICBjb25zdCBjb25kaXRpb25hbFBvbGljeSA9IGlhbS5NYW5hZ2VkUG9saWN5LmZyb21NYW5hZ2VkUG9saWN5QXJuKHRoaXMsICdDb25kaXRpb25hbFBvbGljeUFybicsXG4gICAgICBGbi5jb25kaXRpb25JZihoYXNFY3JQdWJsaWNDb25kaXRpb24ubG9naWNhbElkLFxuICAgICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoJ0FtYXpvbkVsYXN0aWNDb250YWluZXJSZWdpc3RyeVB1YmxpY1JlYWRPbmx5JykubWFuYWdlZFBvbGljeUFybixcbiAgICAgICAgQXdzLk5PX1ZBTFVFKS50b1N0cmluZygpLFxuICAgICk7XG5cbiAgICBoYW5kbGVyUm9sZS5hZGRNYW5hZ2VkUG9saWN5KGlhbS5NYW5hZ2VkUG9saWN5LmZyb21NYW5hZ2VkUG9saWN5QXJuKHRoaXMsICdjb25kaXRpb25hbFBvbGljeScsIGNvbmRpdGlvbmFsUG9saWN5Lm1hbmFnZWRQb2xpY3lBcm4pKTtcblxuICAgIGNvbnN0IHByb3ZpZGVyID0gbmV3IGNyLlByb3ZpZGVyKHRoaXMsICdQcm92aWRlcicsIHtcbiAgICAgIG9uRXZlbnRIYW5kbGVyOiBoYW5kbGVyLFxuICAgICAgdnBjOiBwcm9wcy5jbHVzdGVyLnZwYyxcbiAgICAgIHZwY1N1Ym5ldHM6IHByaXZhdGVTdWJuZXRzLFxuICAgICAgc2VjdXJpdHlHcm91cHMsXG4gICAgfSk7XG5cbiAgICB0aGlzLnNlcnZpY2VUb2tlbiA9IHByb3ZpZGVyLnNlcnZpY2VUb2tlbjtcbiAgICB0aGlzLnJvbGUgPSBoYW5kbGVyUm9sZTtcbiAgfVxufVxuIl19