@project-lakechain/opensearch-collection
Version:
Creates an OpenSearch Serverless collection in a VPC.
173 lines • 23.3 kB
JavaScript
;
/*
* Copyright (C) 2023 Amazon.com, Inc. or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Collection = exports.formatName = void 0;
const cdk = __importStar(require("aws-cdk-lib"));
const ec2 = __importStar(require("aws-cdk-lib/aws-ec2"));
const opensearchserverless = __importStar(require("aws-cdk-lib/aws-opensearchserverless"));
/**
* A helper function to format the name of a resource.
* @param text the text to format
* @param maxLength the maximum length of the text
* @returns the formatted name
*/
const formatName = (text, maxLength = 32) => {
return (text
.toLowerCase()
.replace(/[^a-z0-9-]/g, '-')
.slice(0, maxLength));
};
exports.formatName = formatName;
class CollectionBase extends cdk.Resource {
}
/**
* The OpenSearch collection construct allows to create
* a serverless OpenSearch collection within a VPC.
*/
class Collection extends CollectionBase {
collectionName;
collectionArn;
collectionId;
collectionEndpoint;
dashboardEndpoint;
cfnCollection;
/**
* Creates a collection construct that represents an external collection.
* @param scope The parent creating construct (usually `this`).
* @param id The construct's name.
* @param attrs A `CollectionAttributes` object.
*/
static fromCollectionAttributes(scope, id, attrs) {
return new class extends CollectionBase {
collectionName = attrs.collectionName;
collectionArn = attrs.collectionArn;
collectionId = attrs.collectionId;
collectionEndpoint = attrs.collectionEndpoint;
dashboardEndpoint = attrs.dashboardEndpoint;
constructor() { super(scope, id); }
};
}
/**
* OpenSearch collection constructor.
* @param scope the scope of the construct
* @param id the id of the construct
* @param props the collection properties
*/
constructor(scope, id, props) {
super(scope, id);
this.collectionName = props.name;
// The security group associated with the domain.
const securityGroup = new ec2.SecurityGroup(this, 'SecurityGroup', {
vpc: props.vpc
});
// Allow VPC instances to communicate with the domain.
securityGroup.addIngressRule(ec2.Peer.ipv4(props.vpc.vpcCidrBlock), ec2.Port.tcp(443));
// Create the VPC endpoint.
const vpcEndpoint = new opensearchserverless.CfnVpcEndpoint(this, 'VpcEndpoint', {
name: (0, exports.formatName)(`vpc-endpoint-${props.name}`),
subnetIds: props.vpc.privateSubnets.map((subnet) => subnet.subnetId),
vpcId: props.vpc.vpcId,
securityGroupIds: [securityGroup.securityGroupId]
});
// The network security policy.
const networkSecurityPolicy = new opensearchserverless.CfnSecurityPolicy(this, 'NetworkSecurityPolicy', {
name: (0, exports.formatName)(`network-security-policy-${props.name}`),
type: 'network',
description: 'The collection network security policy.',
policy: JSON.stringify([{
Rules: [{
ResourceType: 'collection',
Resource: [`collection/${this.collectionName}`],
}],
AllowFromPublic: false,
SourceVPCEs: [vpcEndpoint.attrId]
}])
});
networkSecurityPolicy.addDependency(vpcEndpoint);
// The encryption security policy.
const encryptionSecurityPolicy = new opensearchserverless.CfnSecurityPolicy(this, 'EncryptionSecurityPolicy', {
name: (0, exports.formatName)(`encryption-security-policy-${props.name}`),
type: 'encryption',
description: 'The collection security encryption policy.',
policy: JSON.stringify({
Rules: [{
ResourceType: 'collection',
Resource: [`collection/${this.collectionName}`]
}],
AWSOwnedKey: true
})
});
encryptionSecurityPolicy.addDependency(networkSecurityPolicy);
// Create the OpenSearch collection.
this.cfnCollection = new opensearchserverless.CfnCollection(this, 'Resource', {
name: props.name,
description: props.description,
type: props.type
});
this.cfnCollection.addDependency(networkSecurityPolicy);
this.cfnCollection.addDependency(encryptionSecurityPolicy);
this.collectionArn = this.cfnCollection.attrArn;
this.collectionId = this.cfnCollection.attrId;
this.collectionEndpoint = this.cfnCollection.attrCollectionEndpoint;
this.dashboardEndpoint = this.cfnCollection.attrDashboardEndpoint;
}
/**
* Creates a new access policy for the collection.
* @param name the name of the access policy.
* @param principal the principal to grant access to.
* @param permissions the permissions to grant.
*/
addAccessPolicy(name, principal, permissions) {
new opensearchserverless.CfnAccessPolicy(this, `AccessPolicy-${name}`, {
name: (0, exports.formatName)(`access-policy-${name}`),
type: 'data',
policy: JSON.stringify([{
Rules: [{
ResourceType: 'index',
Resource: [`index/${this.collectionName}/*`],
Permission: permissions
}],
Principal: principal
}])
});
}
}
exports.Collection = Collection;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILGlEQUFtQztBQUNuQyx5REFBMkM7QUFDM0MsMkZBQTZFO0FBSTdFOzs7OztHQUtHO0FBQ0ksTUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFZLEVBQUUsU0FBUyxHQUFHLEVBQUUsRUFBRSxFQUFFO0lBQ3pELE9BQU8sQ0FBQyxJQUFJO1NBQ1QsV0FBVyxFQUFFO1NBQ2IsT0FBTyxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUM7U0FDM0IsS0FBSyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQzFCLENBQUMsQ0FBQztBQUxXLFFBQUEsVUFBVSxjQUtyQjtBQTJDRixNQUFlLGNBQWUsU0FBUSxHQUFHLENBQUMsUUFBUTtDQU1qRDtBQTJERDs7O0dBR0c7QUFDSCxNQUFhLFVBQVcsU0FBUSxjQUFjO0lBQzVCLGNBQWMsQ0FBUztJQUN2QixhQUFhLENBQVM7SUFDdEIsWUFBWSxDQUFTO0lBQ3JCLGtCQUFrQixDQUFTO0lBQzNCLGlCQUFpQixDQUFTO0lBQzFCLGFBQWEsQ0FBcUM7SUFFbEU7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsd0JBQXdCLENBQUMsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMkI7UUFDOUYsT0FBTyxJQUFJLEtBQU0sU0FBUSxjQUFjO1lBQ3JCLGNBQWMsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDO1lBQ3RDLGFBQWEsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDO1lBQ3BDLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO1lBQ2xDLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQztZQUM5QyxpQkFBaUIsR0FBRyxLQUFLLENBQUMsaUJBQWlCLENBQUM7WUFFNUQsZ0JBQWdCLEtB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Q0wsQ0FBQztDQUNGO0FBaklELGdDQWlJQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjMgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBlYzIgZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5pbXBvcnQgKiBhcyBvcGVuc2VhcmNoc2VydmVybGVzcyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtb3BlbnNlYXJjaHNlcnZlcmxlc3MnO1xuXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuLyoqXG4gKiBBIGhlbHBlciBmdW5jdGlvbiB0byBmb3JtYXQgdGhlIG5hbWUgb2YgYSByZXNvdXJjZS5cbiAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0IHRvIGZvcm1hdFxuICogQHBhcmFtIG1heExlbmd0aCB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIHRleHRcbiAqIEByZXR1cm5zIHRoZSBmb3JtYXR0ZWQgbmFtZVxuICovXG5leHBvcnQgY29uc3QgZm9ybWF0TmFtZSA9ICh0ZXh0OiBzdHJpbmcsIG1heExlbmd0aCA9IDMyKSA9PiB7XG4gIHJldHVybiAodGV4dFxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnJlcGxhY2UoL1teYS16MC05LV0vZywgJy0nKVxuICAgIC5zbGljZSgwLCBtYXhMZW5ndGgpKTtcbn07XG5cbi8qKlxuICogVGhlIHBvc3NpYmxlIGNvbGxlY3Rpb24gdHlwZXMuXG4gKi9cbmV4cG9ydCB0eXBlIENvbGxlY3Rpb25UeXBlID0gJ1NFQVJDSCcgfCAnVElNRVNFUklFUycgfCAnVkVDVE9SU0VBUkNIJztcblxuLyoqXG4gKiBUaGUgT3BlblNlYXJjaCBjb2xsZWN0aW9uIGludGVyZmFjZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQ29sbGVjdGlvbiBleHRlbmRzIGNkay5JUmVzb3VyY2Uge1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgY29sbGVjdGlvbi5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgY29sbGVjdGlvbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgY29sbGVjdGlvbi5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgY29sbGVjdGlvbkFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgY29sbGVjdGlvbi5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgY29sbGVjdGlvbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBlbmRwb2ludCBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbGxlY3Rpb24uXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGNvbGxlY3Rpb25FbmRwb2ludDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZW5kcG9pbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb2xsZWN0aW9uIGRhc2hib2FyZC5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgZGFzaGJvYXJkRW5kcG9pbnQ6IHN0cmluZztcbn1cblxuYWJzdHJhY3QgY2xhc3MgQ29sbGVjdGlvbkJhc2UgZXh0ZW5kcyBjZGsuUmVzb3VyY2UgaW1wbGVtZW50cyBJQ29sbGVjdGlvbiB7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBjb2xsZWN0aW9uTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgY29sbGVjdGlvbkFybjogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgY29sbGVjdGlvbklkOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBjb2xsZWN0aW9uRW5kcG9pbnQ6IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGRhc2hib2FyZEVuZHBvaW50OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHByb3BlcnRpZXMgZm9yIGNyZWF0aW5nIGFuIE9wZW5TZWFyY2ggY29sbGVjdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0aW9uUHJvcHMge1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgY29sbGVjdGlvbi5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBjb2xsZWN0aW9uLlxuICAgKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBWUEMgaW4gd2hpY2ggdGhlIE9wZW5TZWFyY2ggY29sbGVjdGlvbiBpcyBkZXBsb3llZC5cbiAgICovXG4gIHZwYzogZWMyLklWcGM7XG5cbiAgLyoqXG4gICAqIFRoZSBjb2xsZWN0aW9uIHR5cGUuXG4gICAqL1xuICB0eXBlOiBDb2xsZWN0aW9uVHlwZTtcbn1cblxuLyoqXG4gKiBUaGUgcHJvcGVydGllcyBvZiBhbiBleGlzdGluZyBPcGVuU2VhcmNoIGNvbGxlY3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdGlvbkF0dHJpYnV0ZXMge1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgT3BlblNlYXJjaCBjb2xsZWN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgY29sbGVjdGlvbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgT3BlblNlYXJjaCBjb2xsZWN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgY29sbGVjdGlvbkFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgT3BlblNlYXJjaCBjb2xsZWN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgY29sbGVjdGlvbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBlbmRwb2ludCBvZiB0aGUgT3BlblNlYXJjaCBjb2xsZWN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgY29sbGVjdGlvbkVuZHBvaW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkYXNoYm9hcmQgZW5kcG9pbnQgb2YgdGhlIE9wZW5TZWFyY2ggY29sbGVjdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGRhc2hib2FyZEVuZHBvaW50OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIE9wZW5TZWFyY2ggY29sbGVjdGlvbiBjb25zdHJ1Y3QgYWxsb3dzIHRvIGNyZWF0ZVxuICogYSBzZXJ2ZXJsZXNzIE9wZW5TZWFyY2ggY29sbGVjdGlvbiB3aXRoaW4gYSBWUEMuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uIGV4dGVuZHMgQ29sbGVjdGlvbkJhc2UgaW1wbGVtZW50cyBJQ29sbGVjdGlvbiB7XG4gIHB1YmxpYyByZWFkb25seSBjb2xsZWN0aW9uTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgY29sbGVjdGlvbkFybjogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgY29sbGVjdGlvbklkOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBjb2xsZWN0aW9uRW5kcG9pbnQ6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGRhc2hib2FyZEVuZHBvaW50OiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBjZm5Db2xsZWN0aW9uOiBvcGVuc2VhcmNoc2VydmVybGVzcy5DZm5Db2xsZWN0aW9uO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY29sbGVjdGlvbiBjb25zdHJ1Y3QgdGhhdCByZXByZXNlbnRzIGFuIGV4dGVybmFsIGNvbGxlY3Rpb24uXG4gICAqIEBwYXJhbSBzY29wZSBUaGUgcGFyZW50IGNyZWF0aW5nIGNvbnN0cnVjdCAodXN1YWxseSBgdGhpc2ApLlxuICAgKiBAcGFyYW0gaWQgVGhlIGNvbnN0cnVjdCdzIG5hbWUuXG4gICAqIEBwYXJhbSBhdHRycyBBIGBDb2xsZWN0aW9uQXR0cmlidXRlc2Agb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tQ29sbGVjdGlvbkF0dHJpYnV0ZXMoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgYXR0cnM6IENvbGxlY3Rpb25BdHRyaWJ1dGVzKTogSUNvbGxlY3Rpb24ge1xuICAgIHJldHVybiBuZXcgY2xhc3MgZXh0ZW5kcyBDb2xsZWN0aW9uQmFzZSB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgY29sbGVjdGlvbk5hbWUgPSBhdHRycy5jb2xsZWN0aW9uTmFtZTtcbiAgICAgIHB1YmxpYyByZWFkb25seSBjb2xsZWN0aW9uQXJuID0gYXR0cnMuY29sbGVjdGlvbkFybjtcbiAgICAgIHB1YmxpYyByZWFkb25seSBjb2xsZWN0aW9uSWQgPSBhdHRycy5jb2xsZWN0aW9uSWQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgY29sbGVjdGlvbkVuZHBvaW50ID0gYXR0cnMuY29sbGVjdGlvbkVuZHBvaW50O1xuICAgICAgcHVibGljIHJlYWRvbmx5IGRhc2hib2FyZEVuZHBvaW50ID0gYXR0cnMuZGFzaGJvYXJkRW5kcG9pbnQ7XG5cbiAgICAgIGNvbnN0cnVjdG9yKCkgeyBzdXBlcihzY29wZSwgaWQpOyB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuU2VhcmNoIGNvbGxlY3Rpb24gY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSBzY29wZSB0aGUgc2NvcGUgb2YgdGhlIGNvbnN0cnVjdFxuICAgKiBAcGFyYW0gaWQgdGhlIGlkIG9mIHRoZSBjb25zdHJ1Y3RcbiAgICogQHBhcmFtIHByb3BzIHRoZSBjb2xsZWN0aW9uIHByb3BlcnRpZXNcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBDb2xsZWN0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5jb2xsZWN0aW9uTmFtZSA9IHByb3BzLm5hbWU7XG5cbiAgICAvLyBUaGUgc2VjdXJpdHkgZ3JvdXAgYXNzb2NpYXRlZCB3aXRoIHRoZSBkb21haW4uXG4gICAgY29uc3Qgc2VjdXJpdHlHcm91cCA9IG5ldyBlYzIuU2VjdXJpdHlHcm91cCh0aGlzLCAnU2VjdXJpdHlHcm91cCcsIHtcbiAgICAgIHZwYzogcHJvcHMudnBjXG4gICAgfSk7XG5cbiAgICAvLyBBbGxvdyBWUEMgaW5zdGFuY2VzIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIGRvbWFpbi5cbiAgICBzZWN1cml0eUdyb3VwLmFkZEluZ3Jlc3NSdWxlKFxuICAgICAgZWMyLlBlZXIuaXB2NChwcm9wcy52cGMudnBjQ2lkckJsb2NrKSxcbiAgICAgIGVjMi5Qb3J0LnRjcCg0NDMpXG4gICAgKTtcblxuICAgIC8vIENyZWF0ZSB0aGUgVlBDIGVuZHBvaW50LlxuICAgIGNvbnN0IHZwY0VuZHBvaW50ID0gbmV3IG9wZW5zZWFyY2hzZXJ2ZXJsZXNzLkNmblZwY0VuZHBvaW50KHRoaXMsICdWcGNFbmRwb2ludCcsIHtcbiAgICAgIG5hbWU6IGZvcm1hdE5hbWUoYHZwYy1lbmRwb2ludC0ke3Byb3BzLm5hbWV9YCksXG4gICAgICBzdWJuZXRJZHM6IHByb3BzLnZwYy5wcml2YXRlU3VibmV0cy5tYXAoKHN1Ym5ldCkgPT4gc3VibmV0LnN1Ym5ldElkKSxcbiAgICAgIHZwY0lkOiBwcm9wcy52cGMudnBjSWQsXG4gICAgICBzZWN1cml0eUdyb3VwSWRzOiBbc2VjdXJpdHlHcm91cC5zZWN1cml0eUdyb3VwSWRdXG4gICAgfSk7XG5cbiAgICAvLyBUaGUgbmV0d29yayBzZWN1cml0eSBwb2xpY3kuXG4gICAgY29uc3QgbmV0d29ya1NlY3VyaXR5UG9saWN5ID0gbmV3IG9wZW5zZWFyY2hzZXJ2ZXJsZXNzLkNmblNlY3VyaXR5UG9saWN5KHRoaXMsICdOZXR3b3JrU2VjdXJpdHlQb2xpY3knLCB7XG4gICAgICBuYW1lOiBmb3JtYXROYW1lKGBuZXR3b3JrLXNlY3VyaXR5LXBvbGljeS0ke3Byb3BzLm5hbWV9YCksXG4gICAgICB0eXBlOiAnbmV0d29yaycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1RoZSBjb2xsZWN0aW9uIG5ldHdvcmsgc2VjdXJpdHkgcG9saWN5LicsXG4gICAgICBwb2xpY3k6IEpTT04uc3RyaW5naWZ5KFt7XG4gICAgICAgIFJ1bGVzOiBbe1xuICAgICAgICAgIFJlc291cmNlVHlwZTogJ2NvbGxlY3Rpb24nLFxuICAgICAgICAgIFJlc291cmNlOiBbYGNvbGxlY3Rpb24vJHt0aGlzLmNvbGxlY3Rpb25OYW1lfWBdLFxuICAgICAgICB9XSxcbiAgICAgICAgQWxsb3dGcm9tUHVibGljOiBmYWxzZSxcbiAgICAgICAgU291cmNlVlBDRXM6IFt2cGNFbmRwb2ludC5hdHRySWRdXG4gICAgICB9XSlcbiAgICB9KTtcblxuICAgIG5ldHdvcmtTZWN1cml0eVBvbGljeS5hZGREZXBlbmRlbmN5KHZwY0VuZHBvaW50KTtcblxuICAgIC8vIFRoZSBlbmNyeXB0aW9uIHNlY3VyaXR5IHBvbGljeS5cbiAgICBjb25zdCBlbmNyeXB0aW9uU2VjdXJpdHlQb2xpY3kgPSBuZXcgb3BlbnNlYXJjaHNlcnZlcmxlc3MuQ2ZuU2VjdXJpdHlQb2xpY3kodGhpcywgJ0VuY3J5cHRpb25TZWN1cml0eVBvbGljeScsIHtcbiAgICAgIG5hbWU6IGZvcm1hdE5hbWUoYGVuY3J5cHRpb24tc2VjdXJpdHktcG9saWN5LSR7cHJvcHMubmFtZX1gKSxcbiAgICAgIHR5cGU6ICdlbmNyeXB0aW9uJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGNvbGxlY3Rpb24gc2VjdXJpdHkgZW5jcnlwdGlvbiBwb2xpY3kuJyxcbiAgICAgIHBvbGljeTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBSdWxlczogW3tcbiAgICAgICAgICBSZXNvdXJjZVR5cGU6ICdjb2xsZWN0aW9uJyxcbiAgICAgICAgICBSZXNvdXJjZTogW2Bjb2xsZWN0aW9uLyR7dGhpcy5jb2xsZWN0aW9uTmFtZX1gXVxuICAgICAgICB9XSxcbiAgICAgICAgQVdTT3duZWRLZXk6IHRydWVcbiAgICAgIH0pXG4gICAgfSk7XG5cbiAgICBlbmNyeXB0aW9uU2VjdXJpdHlQb2xpY3kuYWRkRGVwZW5kZW5jeShuZXR3b3JrU2VjdXJpdHlQb2xpY3kpO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBPcGVuU2VhcmNoIGNvbGxlY3Rpb24uXG4gICAgdGhpcy5jZm5Db2xsZWN0aW9uID0gbmV3IG9wZW5zZWFyY2hzZXJ2ZXJsZXNzLkNmbkNvbGxlY3Rpb24odGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgbmFtZTogcHJvcHMubmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgIHR5cGU6IHByb3BzLnR5cGVcbiAgICB9KTtcblxuICAgIHRoaXMuY2ZuQ29sbGVjdGlvbi5hZGREZXBlbmRlbmN5KG5ldHdvcmtTZWN1cml0eVBvbGljeSk7XG4gICAgdGhpcy5jZm5Db2xsZWN0aW9uLmFkZERlcGVuZGVuY3koZW5jcnlwdGlvblNlY3VyaXR5UG9saWN5KTtcblxuICAgIHRoaXMuY29sbGVjdGlvbkFybiA9IHRoaXMuY2ZuQ29sbGVjdGlvbi5hdHRyQXJuO1xuICAgIHRoaXMuY29sbGVjdGlvbklkID0gdGhpcy5jZm5Db2xsZWN0aW9uLmF0dHJJZDtcbiAgICB0aGlzLmNvbGxlY3Rpb25FbmRwb2ludCA9IHRoaXMuY2ZuQ29sbGVjdGlvbi5hdHRyQ29sbGVjdGlvbkVuZHBvaW50O1xuICAgIHRoaXMuZGFzaGJvYXJkRW5kcG9pbnQgPSB0aGlzLmNmbkNvbGxlY3Rpb24uYXR0ckRhc2hib2FyZEVuZHBvaW50O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgYWNjZXNzIHBvbGljeSBmb3IgdGhlIGNvbGxlY3Rpb24uXG4gICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBhY2Nlc3MgcG9saWN5LlxuICAgKiBAcGFyYW0gcHJpbmNpcGFsIHRoZSBwcmluY2lwYWwgdG8gZ3JhbnQgYWNjZXNzIHRvLlxuICAgKiBAcGFyYW0gcGVybWlzc2lvbnMgdGhlIHBlcm1pc3Npb25zIHRvIGdyYW50LlxuICAgKi9cbiAgcHVibGljIGFkZEFjY2Vzc1BvbGljeShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcHJpbmNpcGFsOiAoc3RyaW5nIHwgdW5kZWZpbmVkKVtdLFxuICAgIHBlcm1pc3Npb25zOiBzdHJpbmdbXVxuICApIHtcbiAgICBuZXcgb3BlbnNlYXJjaHNlcnZlcmxlc3MuQ2ZuQWNjZXNzUG9saWN5KHRoaXMsIGBBY2Nlc3NQb2xpY3ktJHtuYW1lfWAsIHtcbiAgICAgIG5hbWU6IGZvcm1hdE5hbWUoYGFjY2Vzcy1wb2xpY3ktJHtuYW1lfWApLFxuICAgICAgdHlwZTogJ2RhdGEnLFxuICAgICAgcG9saWN5OiBKU09OLnN0cmluZ2lmeShbe1xuICAgICAgICBSdWxlczogW3tcbiAgICAgICAgICBSZXNvdXJjZVR5cGU6ICdpbmRleCcsXG4gICAgICAgICAgUmVzb3VyY2U6IFtgaW5kZXgvJHt0aGlzLmNvbGxlY3Rpb25OYW1lfS8qYF0sXG4gICAgICAgICAgUGVybWlzc2lvbjogcGVybWlzc2lvbnNcbiAgICAgICAgfV0sXG4gICAgICAgIFByaW5jaXBhbDogcHJpbmNpcGFsXG4gICAgICB9XSlcbiAgICB9KTtcbiAgfVxufVxuIl19