UNPKG

@aws-cdk/aws-eks-v2-alpha

Version:

The CDK Construct Library for AWS::EKS

140 lines 20.2 kB
"use strict"; 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3ViZWN0bC1wcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImt1YmVjdGwtcHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsMkNBQW1EO0FBQ25ELHVDQUE4QztBQUU5QywyQ0FBMkM7QUFDM0MsaURBQWlEO0FBQ2pELDJDQUF5RTtBQUN6RSxtREFBbUQ7QUFDbkQseUVBQThEO0FBQzlELDZCQUE2QjtBQWdHN0I7O0dBRUc7QUFDSCxNQUFhLGVBQWdCLFNBQVEsc0JBQVM7SUFDNUM7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsa0JBQWtCLENBQUMsS0FBZ0IsRUFBRSxPQUFpQjs7Ozs7Ozs7OztRQUNsRSx5RUFBeUU7UUFDekUsaUNBQWlDO1FBQ2pDLElBQUksT0FBTyxZQUFZLGlCQUFPLEVBQUUsQ0FBQztZQUMvQixPQUFPLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUVELE9BQU8sT0FBTyxDQUFDLGVBQWUsQ0FBQztLQUNoQztJQUVEOzs7Ozs7T0FNRztJQUNJLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFnQzs7Ozs7Ozs7OztRQUN4RyxNQUFNLE1BQU8sU0FBUSxzQkFBUztZQUE5Qjs7Z0JBQ2tCLGlCQUFZLEdBQVcsS0FBSyxDQUFDLFlBQVksQ0FBQztnQkFDMUMsU0FBSSxHQUFlLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDaEQsQ0FBQztTQUFBO1FBQ0QsT0FBTyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7S0FDOUI7SUFZRCxZQUFtQixLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUEyQjtRQUMxRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDOzs7Ozs7K0NBM0NSLGVBQWU7Ozs7UUE2Q3hCLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDakUsSUFBSSxjQUFjLENBQUM7UUFDbkIsSUFBSSxLQUFLLENBQUMsY0FBYyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUMvRCxjQUFjLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUNELE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTVGLE1BQU0sT0FBTyxHQUFHLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFO1lBQ25ELE9BQU8sRUFBRSxlQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUM3QixXQUFXLEVBQUUsbURBQW1EO1lBQ2hFLFVBQVUsRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxJQUFJLElBQUk7WUFDL0MsV0FBVyxFQUFFO2dCQUNYLHFDQUFxQztnQkFDckMsMEJBQTBCLEVBQUUsVUFBVTtnQkFDdEMsR0FBRyxLQUFLLENBQUMsV0FBVzthQUNyQjtZQUNELElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtZQUNoQixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUNwRSxPQUFPLEVBQUUsZUFBZTtZQUN4QixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXO1lBQ25DLHlDQUF5QztZQUN6QyxHQUFHO1lBQ0gsY0FBYztZQUNkLFVBQVUsRUFBRSxjQUFjO1NBQzNCLENBQUMsQ0FBQztRQUVILDREQUE0RDtRQUM1RCxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxXQUFXLElBQUksSUFBSSxpQ0FBVyxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBQzdFLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRXRDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFLLENBQUM7UUFFbEMsV0FBVyxDQUFDLG9CQUFvQixDQUFDLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQztZQUN2RCxPQUFPLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztZQUNoQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztTQUN0QyxDQUFDLENBQUMsQ0FBQztRQUVKLDRDQUE0QztRQUM1Qyw2Q0FBNkM7UUFDN0MsSUFBSSxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDekIsV0FBVyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQUMsOENBQThDLENBQUMsQ0FBQyxDQUFDO1FBQzNILENBQUM7UUFFRCxvQ0FBb0M7UUFDcEMsV0FBVyxDQUFDLGdCQUFnQixDQUMxQixHQUFHLENBQUMsYUFBYSxDQUFDLHdCQUF3QixDQUFDLG9DQUFvQyxDQUFDLENBQ2pGLENBQUM7UUFFRjs7O1dBR0c7UUFDSCxNQUFNLHFCQUFxQixHQUFHLElBQUksbUJBQVksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQU0sRUFBRSxjQUFjLEVBQUU7WUFDdEYsVUFBVSxFQUFFLFNBQUUsQ0FBQyxlQUFlLENBQUMsVUFBRyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUM7U0FDckQsQ0FBQyxDQUFDO1FBRUgsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxzQkFBc0IsRUFDM0YsU0FBRSxDQUFDLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLEVBQzVDLEdBQUcsQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQUMsOENBQThDLENBQUMsQ0FBQyxnQkFBZ0IsRUFDM0csVUFBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUMzQixDQUFDO1FBRUYsV0FBVyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLG1CQUFtQixFQUFFLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztRQUVwSSxNQUFNLFFBQVEsR0FBRyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtZQUNqRCxjQUFjLEVBQUUsT0FBTztZQUN2QixHQUFHLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHO1lBQ3RCLFVBQVUsRUFBRSxjQUFjO1lBQzFCLGNBQWM7U0FDZixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDMUMsSUFBSSxDQUFDLElBQUksR0FBRyxXQUFXLENBQUM7S0FDekI7O0FBdEhILDBDQXVIQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnN0cnVjdCwgSUNvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQ2x1c3RlciwgSUNsdXN0ZXIgfSBmcm9tICcuL2NsdXN0ZXInO1xuaW1wb3J0ICogYXMgZWMyIGZyb20gJ2F3cy1jZGstbGliL2F3cy1lYzInO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgRHVyYXRpb24sIENmbkNvbmRpdGlvbiwgRm4sIEF3cywgU2l6ZSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0ICogYXMgY3IgZnJvbSAnYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlcyc7XG5pbXBvcnQgeyBBd3NDbGlMYXllciB9IGZyb20gJ2F3cy1jZGstbGliL2xhbWJkYS1sYXllci1hd3NjbGknO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuZXhwb3J0IGludGVyZmFjZSBLdWJlY3RsUHJvdmlkZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFuIElBTSByb2xlIHRoYXQgY2FuIHBlcmZvcm0ga3ViZWN0bCBvcGVyYXRpb25zIGFnYWluc3QgdGhpcyBjbHVzdGVyLlxuICAgKlxuICAgKiBUaGUgcm9sZSBzaG91bGQgYmUgbWFwcGVkIHRvIHRoZSBgc3lzdGVtOm1hc3RlcnNgIEt1YmVybmV0ZXMgUkJBQyByb2xlLlxuICAgKlxuICAgKiBUaGlzIHJvbGUgaXMgZGlyZWN0bHkgcGFzc2VkIHRvIHRoZSBsYW1iZGEgaGFuZGxlciB0aGF0IHNlbmRzIEt1YmUgQ3RsIGNvbW1hbmRzIHRvIHRoZSBjbHVzdGVyLlxuICAgKiBAZGVmYXVsdCAtIGlmIG5vdCBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHJvbGUgY3JlYXRlZCBieSBhIGxhbWJkYSBmdW5jdGlvbiB3aWxsXG4gICAqIGJlIHVzZWQuXG4gICAqL1xuICByZWFkb25seSByb2xlPzogaWFtLklSb2xlO1xuXG4gIC8qKlxuICAgKiBBbiBBV1MgTGFtYmRhIGxheWVyIHRoYXQgY29udGFpbnMgdGhlIGBhd3NgIENMSS5cbiAgICpcbiAgICogSWYgbm90IGRlZmluZWQsIGEgZGVmYXVsdCBsYXllciB3aWxsIGJlIHVzZWQgY29udGFpbmluZyB0aGUgQVdTIENMSSAyLnguXG4gICAqL1xuICByZWFkb25seSBhd3NjbGlMYXllcj86IGxhbWJkYS5JTGF5ZXJWZXJzaW9uO1xuXG4gIC8qKlxuICAgKlxuICAgKiBDdXN0b20gZW52aXJvbm1lbnQgdmFyaWFibGVzIHdoZW4gcnVubmluZyBga3ViZWN0bGAgYWdhaW5zdCB0aGlzIGNsdXN0ZXIuXG4gICAqL1xuICByZWFkb25seSBlbnZpcm9ubWVudD86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIEEgc2VjdXJpdHkgZ3JvdXAgdG8gdXNlIGZvciBga3ViZWN0bGAgZXhlY3V0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBrOHMgZW5kcG9pbnQgaXMgZXhwZWN0ZWQgdG8gYmUgYWNjZXNzaWJsZVxuICAgKiBwdWJsaWNseS5cbiAgICovXG4gIHJlYWRvbmx5IHNlY3VyaXR5R3JvdXA/OiBlYzIuSVNlY3VyaXR5R3JvdXA7XG5cbiAgLyoqXG4gICAqIFRoZSBhbW91bnQgb2YgbWVtb3J5IGFsbG9jYXRlZCB0byB0aGUga3ViZWN0bCBwcm92aWRlcidzIGxhbWJkYSBmdW5jdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IG1lbW9yeT86IFNpemU7XG5cbiAgLyoqXG4gICAqIEFuIEFXUyBMYW1iZGEgbGF5ZXIgdGhhdCBpbmNsdWRlcyBga3ViZWN0bGAgYW5kIGBoZWxtYFxuICAgKi9cbiAgcmVhZG9ubHkga3ViZWN0bExheWVyOiBsYW1iZGEuSUxheWVyVmVyc2lvbjtcblxuICAvKipcbiAgICogU3VibmV0cyB0byBob3N0IHRoZSBga3ViZWN0bGAgY29tcHV0ZSByZXNvdXJjZXMuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBrOHNcbiAgICogZW5kcG9pbnQgaXMgZXhwZWN0ZWQgdG8gYmUgYWNjZXNzaWJsZSBwdWJsaWNseS5cbiAgICovXG4gIHJlYWRvbmx5IHByaXZhdGVTdWJuZXRzPzogZWMyLklTdWJuZXRbXTtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBhIEt1YmVjdGxQcm92aWRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEt1YmVjdGxQcm92aWRlclByb3BzIGV4dGVuZHMgS3ViZWN0bFByb3ZpZGVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgY2x1c3RlciB0byBjb250cm9sLlxuICAgKi9cbiAgcmVhZG9ubHkgY2x1c3RlcjogSUNsdXN0ZXI7XG59XG5cbi8qKlxuICogS3ViZWN0bCBQcm92aWRlciBBdHRyaWJ1dGVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS3ViZWN0bFByb3ZpZGVyQXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBUaGUga3ViZWN0bCBwcm92aWRlciBsYW1iZGEgYXJuXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlVG9rZW46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJvbGUgb2YgdGhlIHByb3ZpZGVyIGxhbWJkYSBmdW5jdGlvbi5cbiAgICogT25seSByZXF1aXJlZCBpZiB5b3UgZGVwbG95IGhlbG0gY2hhcnRzIHVzaW5nIHRoaXMgaW1wb3J0ZWQgcHJvdmlkZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcm9sZS5cbiAgICovXG4gIHJlYWRvbmx5IHJvbGU/OiBpYW0uSVJvbGU7XG59XG5cbi8qKlxuICogSW1wb3J0ZWQgS3ViZWN0bFByb3ZpZGVyIHRoYXQgY2FuIGJlIHVzZWQgaW4gcGxhY2Ugb2YgdGhlIGRlZmF1bHQgb25lIGNyZWF0ZWQgYnkgQ0RLXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUt1YmVjdGxQcm92aWRlciBleHRlbmRzIElDb25zdHJ1Y3Qge1xuICAvKipcbiAgICogVGhlIGN1c3RvbSByZXNvdXJjZSBwcm92aWRlcidzIHNlcnZpY2UgdG9rZW4uXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlVG9rZW46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJvbGUgb2YgdGhlIHByb3ZpZGVyIGxhbWJkYSBmdW5jdGlvbi4gSWYgdW5kZWZpbmVkLFxuICAgKiB5b3UgY2Fubm90IHVzZSB0aGlzIHByb3ZpZGVyIHRvIGRlcGxveSBoZWxtIGNoYXJ0cy5cbiAgICovXG4gIHJlYWRvbmx5IHJvbGU/OiBpYW0uSVJvbGU7XG59XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgS3ViZWN0bCBMYW1iZGFcbiAqL1xuZXhwb3J0IGNsYXNzIEt1YmVjdGxQcm92aWRlciBleHRlbmRzIENvbnN0cnVjdCBpbXBsZW1lbnRzIElLdWJlY3RsUHJvdmlkZXIge1xuICAvKipcbiAgICogVGFrZSBleGlzdGluZyBwcm92aWRlciBvbiBjbHVzdGVyXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBDb25zdHJ1Y3RcbiAgICogQHBhcmFtIGNsdXN0ZXIgazhzIGNsdXN0ZXJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0S3ViZWN0bFByb3ZpZGVyKHNjb3BlOiBDb25zdHJ1Y3QsIGNsdXN0ZXI6IElDbHVzdGVyKSB7XG4gICAgLy8gaWYgdGhpcyBpcyBhbiBcIm93bmVkXCIgY2x1c3Rlciwgd2UgbmVlZCB0byB3YWl0IGZvciB0aGUga3ViZWN0bCBiYXJyaWVyXG4gICAgLy8gYmVmb3JlIGFwcGx5aW5nIGFueSByZXNvdXJjZXMuXG4gICAgaWYgKGNsdXN0ZXIgaW5zdGFuY2VvZiBDbHVzdGVyKSB7XG4gICAgICBjbHVzdGVyLl9kZXBlbmRPbkt1YmVjdGxCYXJyaWVyKHNjb3BlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2x1c3Rlci5rdWJlY3RsUHJvdmlkZXI7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGFuIGV4aXN0aW5nIHByb3ZpZGVyXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBDb25zdHJ1Y3RcbiAgICogQHBhcmFtIGlkIGFuIGlkIG9mIHJlc291cmNlXG4gICAqIEBwYXJhbSBhdHRycyBhdHRyaWJ1dGVzIGZvciB0aGUgcHJvdmlkZXJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUt1YmVjdGxQcm92aWRlckF0dHJpYnV0ZXMoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgYXR0cnM6IEt1YmVjdGxQcm92aWRlckF0dHJpYnV0ZXMpOiBJS3ViZWN0bFByb3ZpZGVyIHtcbiAgICBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJS3ViZWN0bFByb3ZpZGVyIHtcbiAgICAgIHB1YmxpYyByZWFkb25seSBzZXJ2aWNlVG9rZW46IHN0cmluZyA9IGF0dHJzLnNlcnZpY2VUb2tlbjtcbiAgICAgIHB1YmxpYyByZWFkb25seSByb2xlPzogaWFtLklSb2xlID0gYXR0cnMucm9sZTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY3VzdG9tIHJlc291cmNlIHByb3ZpZGVyJ3Mgc2VydmljZSB0b2tlbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzZXJ2aWNlVG9rZW46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElBTSBleGVjdXRpb24gcm9sZSBvZiB0aGUgaGFuZGxlci5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByb2xlPzogaWFtLklSb2xlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogS3ViZWN0bFByb3ZpZGVyUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3QgdnBjID0gcHJvcHMucHJpdmF0ZVN1Ym5ldHMgPyBwcm9wcy5jbHVzdGVyLnZwYyA6IHVuZGVmaW5lZDtcbiAgICBsZXQgc2VjdXJpdHlHcm91cHM7XG4gICAgaWYgKHByb3BzLnByaXZhdGVTdWJuZXRzICYmIHByb3BzLmNsdXN0ZXIuY2x1c3RlclNlY3VyaXR5R3JvdXApIHtcbiAgICAgIHNlY3VyaXR5R3JvdXBzID0gW3Byb3BzLmNsdXN0ZXIuY2x1c3RlclNlY3VyaXR5R3JvdXBdO1xuICAgIH1cbiAgICBjb25zdCBwcml2YXRlU3VibmV0cyA9IHByb3BzLnByaXZhdGVTdWJuZXRzID8geyBzdWJuZXRzOiBwcm9wcy5wcml2YXRlU3VibmV0cyB9IDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgaGFuZGxlciA9IG5ldyBsYW1iZGEuRnVuY3Rpb24odGhpcywgJ0hhbmRsZXInLCB7XG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDE1KSxcbiAgICAgIGRlc2NyaXB0aW9uOiAnb25FdmVudCBoYW5kbGVyIGZvciBFS1Mga3ViZWN0bCByZXNvdXJjZSBwcm92aWRlcicsXG4gICAgICBtZW1vcnlTaXplOiBwcm9wcy5tZW1vcnk/LnRvTWViaWJ5dGVzKCkgPz8gMTAyNCxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIC8vIHJlcXVpcmVkIGFuZCByZWNvbW1lbmRlZCBmb3IgYm90bzNcbiAgICAgICAgQVdTX1NUU19SRUdJT05BTF9FTkRQT0lOVFM6ICdyZWdpb25hbCcsXG4gICAgICAgIC4uLnByb3BzLmVudmlyb25tZW50LFxuICAgICAgfSxcbiAgICAgIHJvbGU6IHByb3BzLnJvbGUsXG4gICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJ2t1YmVjdGwtaGFuZGxlcicpKSxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLlBZVEhPTl8zXzExLFxuICAgICAgLy8gZGVmaW5lZCBvbmx5IHdoZW4gdXNpbmcgcHJpdmF0ZSBhY2Nlc3NcbiAgICAgIHZwYyxcbiAgICAgIHNlY3VyaXR5R3JvdXBzLFxuICAgICAgdnBjU3VibmV0czogcHJpdmF0ZVN1Ym5ldHMsXG4gICAgfSk7XG5cbiAgICAvLyBhbGxvdyB1c2VyIHRvIGN1c3RvbWl6ZSB0aGUgbGF5ZXJzIHdpdGggdGhlIHRvb2xzIHdlIG5lZWRcbiAgICBoYW5kbGVyLmFkZExheWVycyhwcm9wcy5hd3NjbGlMYXllciA/PyBuZXcgQXdzQ2xpTGF5ZXIodGhpcywgJ0F3c0NsaUxheWVyJykpO1xuICAgIGhhbmRsZXIuYWRkTGF5ZXJzKHByb3BzLmt1YmVjdGxMYXllcik7XG5cbiAgICBjb25zdCBoYW5kbGVyUm9sZSA9IGhhbmRsZXIucm9sZSE7XG5cbiAgICBoYW5kbGVyUm9sZS5hZGRUb1ByaW5jaXBhbFBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBhY3Rpb25zOiBbJ2VrczpEZXNjcmliZUNsdXN0ZXInXSxcbiAgICAgIHJlc291cmNlczogW3Byb3BzLmNsdXN0ZXIuY2x1c3RlckFybl0sXG4gICAgfSkpO1xuXG4gICAgLy8gdGFrZW4gZnJvbSB0aGUgbGFtYmRhIGRlZmF1bHQgcm9sZSBsb2dpYy5cbiAgICAvLyBtYWtlcyBpdCBlYXNpZXIgZm9yIHJvbGVzIHRvIGJlIHBhc3NlZCBpbi5cbiAgICBpZiAoaGFuZGxlci5pc0JvdW5kVG9WcGMpIHtcbiAgICAgIGhhbmRsZXJSb2xlLmFkZE1hbmFnZWRQb2xpY3koaWFtLk1hbmFnZWRQb2xpY3kuZnJvbUF3c01hbmFnZWRQb2xpY3lOYW1lKCdzZXJ2aWNlLXJvbGUvQVdTTGFtYmRhVlBDQWNjZXNzRXhlY3V0aW9uUm9sZScpKTtcbiAgICB9XG5cbiAgICAvLyBGb3IgT0NJIGhlbG0gY2hhcnQgYXV0aG9yaXphdGlvbi5cbiAgICBoYW5kbGVyUm9sZS5hZGRNYW5hZ2VkUG9saWN5KFxuICAgICAgaWFtLk1hbmFnZWRQb2xpY3kuZnJvbUF3c01hbmFnZWRQb2xpY3lOYW1lKCdBbWF6b25FQzJDb250YWluZXJSZWdpc3RyeVJlYWRPbmx5JyksXG4gICAgKTtcblxuICAgIC8qKlxuICAgICAqIEZvciBPQ0kgaGVsbSBjaGFydCBwdWJsaWMgRUNSIGF1dGhvcml6YXRpb24uIEFzIEVDUiBwdWJsaWMgaXMgb25seSBhdmFpbGFibGUgaW4gYGF3c2AgcGFydGl0aW9uLFxuICAgICAqIHdlIGNvbmRpdGlvbmFsbHkgYXR0YWNoIHRoaXMgcG9saWN5IHdoZW4gdGhlIEFXUyBwYXJ0aXRpb24gaXMgYGF3c2AuXG4gICAgICovXG4gICAgY29uc3QgaGFzRWNyUHVibGljQ29uZGl0aW9uID0gbmV3IENmbkNvbmRpdGlvbihoYW5kbGVyUm9sZS5ub2RlLnNjb3BlISwgJ0hhc0VjclB1YmxpYycsIHtcbiAgICAgIGV4cHJlc3Npb246IEZuLmNvbmRpdGlvbkVxdWFscyhBd3MuUEFSVElUSU9OLCAnYXdzJyksXG4gICAgfSk7XG5cbiAgICBjb25zdCBjb25kaXRpb25hbFBvbGljeSA9IGlhbS5NYW5hZ2VkUG9saWN5LmZyb21NYW5hZ2VkUG9saWN5QXJuKHRoaXMsICdDb25kaXRpb25hbFBvbGljeUFybicsXG4gICAgICBGbi5jb25kaXRpb25JZihoYXNFY3JQdWJsaWNDb25kaXRpb24ubG9naWNhbElkLFxuICAgICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoJ0FtYXpvbkVsYXN0aWNDb250YWluZXJSZWdpc3RyeVB1YmxpY1JlYWRPbmx5JykubWFuYWdlZFBvbGljeUFybixcbiAgICAgICAgQXdzLk5PX1ZBTFVFKS50b1N0cmluZygpLFxuICAgICk7XG5cbiAgICBoYW5kbGVyUm9sZS5hZGRNYW5hZ2VkUG9saWN5KGlhbS5NYW5hZ2VkUG9saWN5LmZyb21NYW5hZ2VkUG9saWN5QXJuKHRoaXMsICdjb25kaXRpb25hbFBvbGljeScsIGNvbmRpdGlvbmFsUG9saWN5Lm1hbmFnZWRQb2xpY3lBcm4pKTtcblxuICAgIGNvbnN0IHByb3ZpZGVyID0gbmV3IGNyLlByb3ZpZGVyKHRoaXMsICdQcm92aWRlcicsIHtcbiAgICAgIG9uRXZlbnRIYW5kbGVyOiBoYW5kbGVyLFxuICAgICAgdnBjOiBwcm9wcy5jbHVzdGVyLnZwYyxcbiAgICAgIHZwY1N1Ym5ldHM6IHByaXZhdGVTdWJuZXRzLFxuICAgICAgc2VjdXJpdHlHcm91cHMsXG4gICAgfSk7XG5cbiAgICB0aGlzLnNlcnZpY2VUb2tlbiA9IHByb3ZpZGVyLnNlcnZpY2VUb2tlbjtcbiAgICB0aGlzLnJvbGUgPSBoYW5kbGVyUm9sZTtcbiAgfVxufVxuIl19