@aws-cdk/integ-tests-alpha
Version:
CDK Integration Testing Constructs
239 lines • 30.8 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.LambdaInvokeFunction = exports.InvocationType = exports.LogType = exports.AwsApiCall = void 0;
const jsiiDeprecationWarnings = require("../../.warnings.jsii.js");
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const core_1 = require("aws-cdk-lib/core");
const api_call_base_1 = require("./api-call-base");
const providers_1 = require("./providers");
const waiter_state_machine_1 = require("./waiter-state-machine");
/**
* Construct that creates a custom resource that will perform
* a query using the AWS SDK
*/
class AwsApiCall extends api_call_base_1.ApiCallBase {
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/integ-tests-alpha.AwsApiCall", version: "2.260.0-alpha.0" };
provider;
/**
* access the AssertionsProvider for the waiter state machine.
* This can be used to add additional IAM policies
* the provider role policy
*
* @example
* declare const apiCall: AwsApiCall;
* apiCall.waiterProvider?.addToRolePolicy({
* Effect: 'Allow',
* Action: ['s3:GetObject'],
* Resource: ['*'],
* });
*/
waiterProvider;
apiCallResource;
name;
_assertAtPath;
api;
service;
providerLogLevel;
constructor(scope, id, props) {
super(scope, id);
try {
jsiiDeprecationWarnings._aws_cdk_integ_tests_alpha_AwsApiCallProps(props);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, AwsApiCall);
}
throw error;
}
this.providerLogLevel = props.providerLogLevel;
this.provider = new providers_1.AssertionsProvider(this, 'SdkProvider', {
logRetention: props.parameters?.RetentionDays,
providerLogLevel: props.providerLogLevel,
});
this.provider.addPolicyStatementFromSdkCall(props.service, props.api);
this.name = `${props.service}${props.api}`;
this.api = props.api;
this.service = props.service;
if (props.outputPaths) {
this.outputPaths = [...props.outputPaths];
}
this.apiCallResource = new core_1.CustomResource(this, 'Default', {
serviceToken: this.provider.serviceToken,
properties: {
service: props.service,
api: props.api,
expected: core_1.Lazy.any({ produce: () => this.expectedResult }),
actualPath: core_1.Lazy.string({ produce: () => this._assertAtPath }),
stateMachineArn: core_1.Lazy.string({ produce: () => this.stateMachineArn }),
parameters: this.provider.encode(props.parameters),
flattenResponse: core_1.Lazy.string({ produce: () => this.flattenResponse }),
outputPaths: core_1.Lazy.list({ produce: () => this.outputPaths }),
salt: Date.now().toString(),
},
// Remove the slash from the resource type because when using the v3 package name as the service name,
// the `service` props includes the slash, but the resource type name cannot contain the slash
// See https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-customresource.html#aws-resource-cloudformation-customresource--remarks
resourceType: `${providers_1.SDK_RESOURCE_TYPE_PREFIX}${this.name}`.substring(0, 60).replace(/[\/]/g, ''),
});
// Needed so that all the policies set up by the provider should be available before the custom resource is provisioned.
this.apiCallResource.node.addDependency(this.provider);
// if expectedResult has been configured then that means
// we are making assertions and we should output the results
core_1.Aspects.of(this).add({
visit(node) {
if (node instanceof AwsApiCall) {
if (node.expectedResult) {
const result = node.apiCallResource.getAttString('assertion');
new core_1.CfnOutput(node, 'AssertionResults', {
value: result,
// Remove the at sign, slash, and hyphen because when using the v3 package name or client name as the service name,
// the `id` includes them, but they are not allowed in the `CfnOutput` logical id
// See https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html#outputs-section-syntax
}).overrideLogicalId(`AssertionResults${id}`.replace(/[\@\/\-]/g, ''));
}
}
},
}, { priority: core_1.AspectPriority.MUTATING });
}
assertAtPath(path, expected) {
try {
jsiiDeprecationWarnings._aws_cdk_integ_tests_alpha_ExpectedResult(expected);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, this.assertAtPath);
}
throw error;
}
this._assertAtPath = path;
(this.outputPaths ??= []).push(path);
this.expectedResult = expected.result;
this.flattenResponse = 'true';
return this;
}
waitForAssertions(options) {
try {
jsiiDeprecationWarnings._aws_cdk_integ_tests_alpha_WaiterStateMachineOptions(options);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, this.waitForAssertions);
}
throw error;
}
const waiter = new waiter_state_machine_1.WaiterStateMachine(this, 'WaitFor', {
...options,
providerLogLevel: this.providerLogLevel,
});
this.stateMachineArn = waiter.stateMachineArn;
this.provider.addPolicyStatementFromSdkCall('states', 'StartExecution');
waiter.isCompleteProvider.addPolicyStatementFromSdkCall(this.service, this.api);
this.waiterProvider = waiter.isCompleteProvider;
return this;
}
}
exports.AwsApiCall = AwsApiCall;
/**
* Set to Tail to include the execution log in the response.
* Applies to synchronously invoked functions only.
*/
var LogType;
(function (LogType) {
/**
* The log messages are not returned in the response
*/
LogType["NONE"] = "None";
/**
* The log messages are returned in the response
*/
LogType["TAIL"] = "Tail";
})(LogType || (exports.LogType = LogType = {}));
/**
* The type of invocation. Default is REQUEST_RESPONSE
*/
var InvocationType;
(function (InvocationType) {
/**
* Invoke the function asynchronously.
* Send events that fail multiple times to the function's
* dead-letter queue (if it's configured).
* The API response only includes a status code.
*/
InvocationType["EVENT"] = "Event";
/**
* Invoke the function synchronously.
* Keep the connection open until the function returns a response or times out.
* The API response includes the function response and additional data.
*/
InvocationType["REQUEST_RESPONSE"] = "RequestResponse";
/**
* Validate parameter values and verify that the user
* or role has permission to invoke the function.
*/
InvocationType["DRY_RUN"] = "DryRun";
})(InvocationType || (exports.InvocationType = InvocationType = {}));
/**
* An AWS Lambda Invoke function API call.
* Use this instead of the generic AwsApiCall in order to
* invoke a lambda function. This will automatically create
* the correct permissions to invoke the function
*/
class LambdaInvokeFunction extends AwsApiCall {
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/integ-tests-alpha.LambdaInvokeFunction", version: "2.260.0-alpha.0" };
constructor(scope, id, props) {
super(scope, id, {
api: 'invoke',
service: 'Lambda',
parameters: {
FunctionName: props.functionName,
InvocationType: props.invocationType,
LogType: props.logType,
Payload: props.payload,
RetentionDays: props.logRetention,
},
});
try {
jsiiDeprecationWarnings._aws_cdk_integ_tests_alpha_LambdaInvokeFunctionProps(props);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, LambdaInvokeFunction);
}
throw error;
}
const stack = core_1.Stack.of(this);
// need to give the assertion lambda permission to invoke
new core_1.CfnResource(this, 'Invoke', {
type: 'AWS::Lambda::Permission',
properties: {
Action: 'lambda:InvokeFunction',
FunctionName: props.functionName,
Principal: this.provider.handlerRoleArn,
},
});
// the api call is 'invoke', but the permission is 'invokeFunction'
// so need to handle it specially
this.provider.addPolicyStatementFromSdkCall('Lambda', 'invokeFunction', [stack.formatArn({
service: 'lambda',
resource: 'function',
arnFormat: core_1.ArnFormat.COLON_RESOURCE_NAME,
resourceName: props.functionName,
})]);
// If using `waitForAssertions`, do the same for `waiterProvider` as above.
// Aspects are used here because we do not know if the user is using `waitForAssertions` at this point.
core_1.Aspects.of(this).add({
visit(node) {
if (node instanceof AwsApiCall && node.waiterProvider) {
node.waiterProvider.addPolicyStatementFromSdkCall('Lambda', 'invokeFunction', [stack.formatArn({
service: 'lambda',
resource: 'function',
arnFormat: core_1.ArnFormat.COLON_RESOURCE_NAME,
resourceName: props.functionName,
})]);
}
},
}, { priority: core_1.AspectPriority.MUTATING });
}
}
exports.LambdaInvokeFunction = LambdaInvokeFunction;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2RrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2RrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBRUEsMkNBQTJIO0FBRzNILG1EQUE4QztBQUU5QywyQ0FBMkU7QUFHM0UsaUVBQTREO0FBd0M1RDs7O0dBR0c7QUFDSCxNQUFhLFVBQVcsU0FBUSwyQkFBVzs7SUFDekIsUUFBUSxDQUFxQjtJQUU3Qzs7Ozs7Ozs7Ozs7O09BWUc7SUFDSSxjQUFjLENBQXNCO0lBRXhCLGVBQWUsQ0FBaUI7SUFDbEMsSUFBSSxDQUFTO0lBRXRCLGFBQWEsQ0FBVTtJQUNkLEdBQUcsQ0FBUztJQUNaLE9BQU8sQ0FBUztJQUNoQixnQkFBZ0IsQ0FBdUI7SUFFeEQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFzQjtRQUM5RCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDOzs7Ozs7K0NBM0JSLFVBQVU7Ozs7UUE2Qm5CLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLENBQUM7UUFFL0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLDhCQUFrQixDQUFDLElBQUksRUFBRSxhQUFhLEVBQUU7WUFDMUQsWUFBWSxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsYUFBYTtZQUM3QyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsZ0JBQWdCO1NBQ3pDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxRQUFRLENBQUMsNkJBQTZCLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQztRQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDN0Is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QUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQ25CLEtBQUssQ0FBQyxJQUFnQjtnQkFDcEIsSUFBSSxJQUFJLFlBQVksVUFBVSxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFDdEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyw2QkFBNkIsQ0FBQyxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDOzRCQUM3RixPQUFPLEVBQUUsUUFBUTs0QkFDakIsUUFBUSxFQUFFLFVBQVU7NEJBQ3BCLFNBQVMsRUFBRSxnQkFBUyxDQUFDLG1CQUFtQjs0QkFDeEMsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO3lCQUNqQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNQLENBQUM7WUFDSCxDQUFDO1NBQ0YsRUFBRSxFQUFFLFFBQVEsRUFBRSxxQkFBYyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7S0FDM0M7O0FBaERILG9EQWlEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQXBwbGljYXRpb25Mb2dMZXZlbCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHR5cGUgeyBSZXRlbnRpb25EYXlzIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxvZ3MnO1xuaW1wb3J0IHsgQXJuRm9ybWF0LCBDZm5SZXNvdXJjZSwgQ3VzdG9tUmVzb3VyY2UsIExhenksIFN0YWNrLCBBc3BlY3RzLCBDZm5PdXRwdXQsIEFzcGVjdFByaW9yaXR5IH0gZnJvbSAnYXdzLWNkay1saWIvY29yZSc7XG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdCwgSUNvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHR5cGUgeyBJQXBpQ2FsbCB9IGZyb20gJy4vYXBpLWNhbGwtYmFzZSc7XG5pbXBvcnQgeyBBcGlDYWxsQmFzZSB9IGZyb20gJy4vYXBpLWNhbGwtYmFzZSc7XG5pbXBvcnQgdHlwZSB7IEV4cGVjdGVkUmVzdWx0IH0gZnJvbSAnLi9jb21tb24nO1xuaW1wb3J0IHsgQXNzZXJ0aW9uc1Byb3ZpZGVyLCBTREtfUkVTT1VSQ0VfVFlQRV9QUkVGSVggfSBmcm9tICcuL3Byb3ZpZGVycyc7XG5pbXBvcnQgdHlwZSB7IFByb3ZpZGVyT3B0aW9ucyB9IGZyb20gJy4vcHJvdmlkZXJzJztcbmltcG9ydCB0eXBlIHsgV2FpdGVyU3RhdGVNYWNoaW5lT3B0aW9ucyB9IGZyb20gJy4vd2FpdGVyLXN0YXRlLW1hY2hpbmUnO1xuaW1wb3J0IHsgV2FpdGVyU3RhdGVNYWNoaW5lIH0gZnJvbSAnLi93YWl0ZXItc3RhdGUtbWFjaGluZSc7XG5cbi8qKlxuICogT3B0aW9ucyB0byBwZXJmb3JtIGFuIEFXUyBKYXZhU2NyaXB0IFYyIEFQSSBjYWxsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXdzQXBpQ2FsbE9wdGlvbnMgZXh0ZW5kcyBQcm92aWRlck9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIEFXUyBzZXJ2aWNlLCBpLmUuIFMzXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBhcGkgY2FsbCB0byBtYWtlLCBpLmUuIGdldEJ1Y2tldExpZmVjeWNsZVxuICAgKi9cbiAgcmVhZG9ubHkgYXBpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFueSBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIGFwaSBjYWxsXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcGFyYW1ldGVyc1xuICAgKi9cbiAgcmVhZG9ubHkgcGFyYW1ldGVycz86IGFueTtcblxuICAvKipcbiAgICogUmVzdHJpY3QgdGhlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIEFQSSBjYWxsIHRvIHNwZWNpZmljIHBhdGhzIGluXG4gICAqIHRoZSBBUEkgcmVzcG9uc2UuIFVzZSB0aGlzIHRvIGxpbWl0IHRoZSBkYXRhIHJldHVybmVkIGJ5IHRoZSBjdXN0b21cbiAgICogcmVzb3VyY2UgaWYgd29ya2luZyB3aXRoIEFQSSBjYWxscyB0aGF0IGNvdWxkIHBvdGVudGlhbGx5IHJlc3VsdCBpbiBjdXN0b21cbiAgICogcmVzcG9uc2Ugb2JqZWN0cyBleGNlZWRpbmcgdGhlIGhhcmQgbGltaXQgb2YgNDA5NiBieXRlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSByZXR1cm4gYWxsIGRhdGFcbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dFBhdGhzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29uc3RydWN0IHRoYXQgY3JlYXRlcyBhIGN1c3RvbSByZXNvdXJjZSB0aGF0IHdpbGwgcGVyZm9ybVxuICogYSBxdWVyeSB1c2luZyB0aGUgQVdTIFNES1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEF3c0FwaUNhbGxQcm9wcyBleHRlbmRzIEF3c0FwaUNhbGxPcHRpb25zIHsgfVxuXG4vKipcbiAqIENvbnN0cnVjdCB0aGF0IGNyZWF0ZXMgYSBjdXN0b20gcmVzb3VyY2UgdGhhdCB3aWxsIHBlcmZvcm1cbiAqIGEgcXVlcnkgdXNpbmcgdGhlIEFXUyBTREtcbiAqL1xuZXhwb3J0IGNsYXNzIEF3c0FwaUNhbGwgZXh0ZW5kcyBBcGlDYWxsQmFzZSB7XG4gIHB1YmxpYyByZWFkb25seSBwcm92aWRlcjogQXNzZXJ0aW9uc1Byb3ZpZGVyO1xuXG4gIC8qKlxuICAgKiBhY2Nlc3MgdGhlIEFzc2VydGlvbnNQcm92aWRlciBmb3IgdGhlIHdhaXRlciBzdGF0ZSBtYWNoaW5lLlxuICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGFkZCBhZGRpdGlvbmFsIElBTSBwb2xpY2llc1xuICAgKiB0aGUgcHJvdmlkZXIgcm9sZSBwb2xpY3lcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogZGVjbGFyZSBjb25zdCBhcGlDYWxsOiBBd3NBcGlDYWxsO1xuICAgKiBhcGlDYWxsLndhaXRlclByb3ZpZGVyPy5hZGRUb1JvbGVQb2xpY3koe1xuICAgKiAgIEVmZmVjdDogJ0FsbG93JyxcbiAgICogICBBY3Rpb246IFsnczM6R2V0T2JqZWN0J10sXG4gICAqICAgUmVzb3VyY2U6IFsnKiddLFxuICAgKiB9KTtcbiAgICovXG4gIHB1YmxpYyB3YWl0ZXJQcm92aWRlcj86IEFzc2VydGlvbnNQcm92aWRlcjtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXBpQ2FsbFJlc291cmNlOiBDdXN0b21SZXNvdXJjZTtcbiAgcHJpdmF0ZSByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBfYXNzZXJ0QXRQYXRoPzogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGFwaTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHNlcnZpY2U6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBwcm92aWRlckxvZ0xldmVsPzogQXBwbGljYXRpb25Mb2dMZXZlbDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQXdzQXBpQ2FsbFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMucHJvdmlkZXJMb2dMZXZlbCA9IHByb3BzLnByb3ZpZGVyTG9nTGV2ZWw7XG5cbiAgICB0aGlzLnByb3ZpZGVyID0gbmV3IEFzc2VydGlvbnNQcm92aWRlcih0aGlzLCAnU2RrUHJvdmlkZXInLCB7XG4gICAgICBsb2dSZXRlbnRpb246IHByb3BzLnBhcmFtZXRlcnM/LlJldGVudGlvbkRheXMsXG4gICAgICBwcm92aWRlckxvZ0xldmVsOiBwcm9wcy5wcm92aWRlckxvZ0xldmVsLFxuICAgIH0pO1xuICAgIHRoaXMucHJvdmlkZXIuYWRkUG9saWN5U3RhdGVtZW50RnJvbVNka0NhbGwocHJvcHMuc2VydmljZSwgcHJvcHMuYXBpKTtcbiAgICB0aGlzLm5hbWUgPSBgJHtwcm9wcy5zZXJ2aWNlfSR7cHJvcHMuYXBpfWA7XG4gICAgdGhpcy5hcGkgPSBwcm9wcy5hcGk7XG4gICAgdGhpcy5zZXJ2aWNlID0gcHJvcHMuc2VydmljZTtcbiAgICBpZiAocHJvcHMub3V0cHV0UGF0aHMpIHtcbiAgICAgIHRoaXMub3V0cHV0UGF0aHMgPSBbLi4ucHJvcHMub3V0cHV0UGF0aHNdO1xuICAgIH1cblxuICAgIHRoaXMuYXBpQ2FsbFJlc291cmNlID0gbmV3IEN1c3RvbVJlc291cmNlKHRoaXMsICdEZWZhdWx0Jywge1xuICAgICAgc2VydmljZVRva2VuOiB0aGlzLnByb3ZpZGVyLnNlcnZpY2VUb2tlbixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgc2VydmljZTogcHJvcHMuc2VydmljZSxcbiAgICAgICAgYXBpOiBwcm9wcy5hcGksXG4gICAgICAgIGV4cGVjdGVkOiBMYXp5LmFueSh7IHByb2R1Y2U6ICgpID0+IHRoaXMuZXhwZWN0ZWRSZXN1bHQgfSksXG4gICAgICAgIGFjdHVhbFBhdGg6IExhenkuc3RyaW5nKHsgcHJvZHVjZTogKCkgPT4gdGhpcy5fYXNzZXJ0QXRQYXRoIH0pLFxuICAgICAgICBzdGF0ZU1hY2hpbmVBcm46IExhenkuc3RyaW5nKHsgcHJvZHVjZTogKCkgPT4gdGhpcy5zdGF0ZU1hY2hpbmVBcm4gfSksXG4gICAgICAgIHBhcmFtZXRlcnM6IHRoaXMucHJvdmlkZXIuZW5jb2RlKHByb3BzLnBhcmFtZXRlcnMpLFxuICAgICAgICBmbGF0dGVuUmVzcG9uc2U6IExhenkuc3RyaW5nKHsgcHJvZHVjZTogKCkgPT4gdGhpcy5mbGF0dGVuUmVzcG9uc2UgfSksXG4gICAgICAgIG91dHB1dFBhdGhzOiBMYXp5Lmxpc3QoeyBwcm9kdWNlOiAoKSA9PiB0aGlzLm91dHB1dFBhdGhzIH0pLFxuICAgICAgICBzYWx0OiBEYXRlLm5vdygpLnRvU3RyaW5nKCksXG4gICAgICB9LFxuICAgICAgLy8gUmVtb3ZlIHRoZSBzbGFzaCBmcm9tIHRoZSByZXNvdXJjZSB0eXBlIGJlY2F1c2Ugd2hlbiB1c2luZyB0aGUgdjMgcGFja2FnZSBuYW1lIGFzIHRoZSBzZXJ2aWNlIG5hbWUsXG4gICAgICAvLyB0aGUgYHNlcnZpY2VgIHByb3BzIGluY2x1ZGVzIHRoZSBzbGFzaCwgYnV0IHRoZSByZXNvdXJjZSB0eXBlIG5hbWUgY2Fubm90IGNvbnRhaW4gdGhlIHNsYXNoXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXJlc291cmNlLWNsb3VkZm9ybWF0aW9uLWN1c3RvbXJlc291cmNlLmh0bWwjYXdzLXJlc291cmNlLWNsb3VkZm9ybWF0aW9uLWN1c3RvbXJlc291cmNlLS1yZW1hcmtzXG4gICAgICByZXNvdXJjZVR5cGU6IGAke1NES19SRVNPVVJDRV9UWVBFX1BSRUZJWH0ke3RoaXMubmFtZX1gLnN1YnN0cmluZygwLCA2MCkucmVwbGFjZSgvW1xcL10vZywgJycpLFxuICAgIH0pO1xuICAgIC8vIE5lZWRlZCBzbyB0aGF0IGFsbCB0aGUgcG9saWNpZXMgc2V0IHVwIGJ5IHRoZSBwcm92aWRlciBzaG91bGQgYmUgYXZhaWxhYmxlIGJlZm9yZSB0aGUgY3VzdG9tIHJlc291cmNlIGlzIHByb3Zpc2lvbmVkLlxuICAgIHRoaXMuYXBpQ2FsbFJlc291cmNlLm5vZGUuYWRkRGVwZW5kZW5jeSh0aGlzLnByb3ZpZGVyKTtcblxuICAgIC8vIGlmIGV4cGVjdGVkUmVzdWx0IGhhcyBiZWVuIGNvbmZpZ3VyZWQgdGhlbiB0aGF0IG1lYW5zXG4gICAgLy8gd2UgYXJlIG1ha2luZyBhc3NlcnRpb25zIGFuZCB3ZSBzaG91bGQgb3V0cHV0IHRoZSByZXN1bHRzXG4gICAgQXNwZWN0cy5vZih0aGlzKS5hZGQoe1xuICAgICAgdmlzaXQobm9kZTogSUNvbnN0cnVjdCkge1xuICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEF3c0FwaUNhbGwpIHtcbiAgICAgICAgICBpZiAobm9kZS5leHBlY3RlZFJlc3VsdCkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gbm9kZS5hcGlDYWxsUmVzb3VyY2UuZ2V0QXR0U3RyaW5nKCdhc3NlcnRpb24nKTtcblxuICAgICAgICAgICAgbmV3IENmbk91dHB1dChub2RlLCAnQXNzZXJ0aW9uUmVzdWx0cycsIHtcbiAgICAgICAgICAgICAgdmFsdWU6IHJlc3VsdCxcbiAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBhdCBzaWduLCBzbGFzaCwgYW5kIGh5cGhlbiBiZWNhdXNlIHdoZW4gdXNpbmcgdGhlIHYzIHBhY2thZ2UgbmFtZSBvciBjbGllbnQgbmFtZSBhcyB0aGUgc2VydmljZSBuYW1lLFxuICAgICAgICAgICAgICAvLyB0aGUgYGlkYCBpbmNsdWRlcyB0aGVtLCBidXQgdGhleSBhcmUgbm90IGFsbG93ZWQgaW4gdGhlIGBDZm5PdXRwdXRgIGxvZ2ljYWwgaWRcbiAgICAgICAgICAgICAgLy8gU2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL291dHB1dHMtc2VjdGlvbi1zdHJ1Y3R1cmUuaHRtbCNvdXRwdXRzLXNlY3Rpb24tc3ludGF4XG4gICAgICAgICAgICB9KS5vdmVycmlkZUxvZ2ljYWxJZChgQXNzZXJ0aW9uUmVzdWx0cyR7aWR9YC5yZXBsYWNlKC9bXFxAXFwvXFwtXS9nLCAnJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9LCB7IHByaW9yaXR5OiBBc3BlY3RQcmlvcml0eS5NVVRBVElORyB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3NlcnRBdFBhdGgocGF0aDogc3RyaW5nLCBleHBlY3RlZDogRXhwZWN0ZWRSZXN1bHQpOiBJQXBpQ2FsbCB7XG4gICAgdGhpcy5fYXNzZXJ0QXRQYXRoID0gcGF0aDtcbiAgICAodGhpcy5vdXRwdXRQYXRocyA/Pz0gW10pLnB1c2gocGF0aCk7XG4gICAgdGhpcy5leHBlY3RlZFJlc3VsdCA9IGV4cGVjdGVkLnJlc3VsdDtcbiAgICB0aGlzLmZsYXR0ZW5SZXNwb25zZSA9ICd0cnVlJztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyB3YWl0Rm9yQXNzZXJ0aW9ucyhvcHRpb25zPzogV2FpdGVyU3RhdGVNYWNoaW5lT3B0aW9ucyk6IElBcGlDYWxsIHtcbiAgICBjb25zdCB3YWl0ZXIgPSBuZXcgV2FpdGVyU3RhdGVNYWNoaW5lKHRoaXMsICdXYWl0Rm9yJywge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHByb3ZpZGVyTG9nTGV2ZWw6IHRoaXMucHJvdmlkZXJMb2dMZXZlbCxcbiAgICB9KTtcbiAgICB0aGlzLnN0YXRlTWFjaGluZUFybiA9IHdhaXRlci5zdGF0ZU1hY2hpbmVBcm47XG4gICAgdGhpcy5wcm92aWRlci5hZGRQb2xpY3lTdGF0ZW1lbnRGcm9tU2RrQ2FsbCgnc3RhdGVzJywgJ1N0YXJ0RXhlY3V0aW9uJyk7XG4gICAgd2FpdGVyLmlzQ29tcGxldGVQcm92aWRlci5hZGRQb2xpY3lTdGF0ZW1lbnRGcm9tU2RrQ2FsbCh0aGlzLnNlcnZpY2UsIHRoaXMuYXBpKTtcbiAgICB0aGlzLndhaXRlclByb3ZpZGVyID0gd2FpdGVyLmlzQ29tcGxldGVQcm92aWRlcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG4vKipcbiAqIFNldCB0byBUYWlsIHRvIGluY2x1ZGUgdGhlIGV4ZWN1dGlvbiBsb2cgaW4gdGhlIHJlc3BvbnNlLlxuICogQXBwbGllcyB0byBzeW5jaHJvbm91c2x5IGludm9rZWQgZnVuY3Rpb25zIG9ubHkuXG4gKi9cbmV4cG9ydCBlbnVtIExvZ1R5cGUge1xuICAvKipcbiAgICogVGhlIGxvZyBtZXNzYWdlcyBhcmUgbm90IHJldHVybmVkIGluIHRoZSByZXNwb25zZVxuICAgKi9cbiAgTk9ORSA9ICdOb25lJyxcblxuICAvKipcbiAgICogVGhlIGxvZyBtZXNzYWdlcyBhcmUgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlXG4gICAqL1xuICBUQUlMID0gJ1RhaWwnLFxufVxuXG4vKipcbiAqIFRoZSB0eXBlIG9mIGludm9jYXRpb24uIERlZmF1bHQgaXMgUkVRVUVTVF9SRVNQT05TRVxuICovXG5leHBvcnQgZW51bSBJbnZvY2F0aW9uVHlwZSB7XG4gIC8qKlxuICAgKiBJbnZva2UgdGhlIGZ1bmN0aW9uIGFzeW5jaHJvbm91c2x5LlxuICAgKiBTZW5kIGV2ZW50cyB0aGF0IGZhaWwgbXVsdGlwbGUgdGltZXMgdG8gdGhlIGZ1bmN0aW9uJ3NcbiAgICogZGVhZC1sZXR0ZXIgcXVldWUgKGlmIGl0J3MgY29uZmlndXJlZCkuXG4gICAqIFRoZSBBUEkgcmVzcG9uc2Ugb25seSBpbmNsdWRlcyBhIHN0YXR1cyBjb2RlLlxuICAgKi9cbiAgRVZFTlQgPSAnRXZlbnQnLFxuXG4gIC8qKlxuICAgKiBJbnZva2UgdGhlIGZ1bmN0aW9uIHN5bmNocm9ub3VzbHkuXG4gICAqIEtlZXAgdGhlIGNvbm5lY3Rpb24gb3BlbiB1bnRpbCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIHJlc3BvbnNlIG9yIHRpbWVzIG91dC5cbiAgICogVGhlIEFQSSByZXNwb25zZSBpbmNsdWRlcyB0aGUgZnVuY3Rpb24gcmVzcG9uc2UgYW5kIGFkZGl0aW9uYWwgZGF0YS5cbiAgICovXG4gIFJFUVVFU1RfUkVTUE9OU0UgPSAnUmVxdWVzdFJlc3BvbnNlJyxcblxuICAvKipcbiAgICogVmFsaWRhdGUgcGFyYW1ldGVyIHZhbHVlcyBhbmQgdmVyaWZ5IHRoYXQgdGhlIHVzZXJcbiAgICogb3Igcm9sZSBoYXMgcGVybWlzc2lvbiB0byBpbnZva2UgdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgRFJZX1JVTiA9ICdEcnlSdW4nLFxufVxuXG4vKipcbiAqIE9wdGlvbnMgdG8gcGFzcyB0byB0aGUgTGFtYmRhIGludm9rZUZ1bmN0aW9uIEFQSSBjYWxsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGFtYmRhSW52b2tlRnVuY3Rpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gaW52b2tlXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgaW52b2NhdGlvbiB0byB1c2VcbiAgICpcbiAgICogQGRlZmF1bHQgSW52b2NhdGlvblR5cGUuUkVRVUVTVF9SRVNQT05TRVxuICAgKi9cbiAgcmVhZG9ubHkgaW52b2NhdGlvblR5cGU/OiBJbnZvY2F0aW9uVHlwZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZXR1cm4gdGhlIGxvZ3MgYXMgcGFydCBvZiB0aGUgcmVzcG9uc2VcbiAgICpcbiAgICogQGRlZmF1bHQgTG9nVHlwZS5OT05FXG4gICAqL1xuICByZWFkb25seSBsb2dUeXBlPzogTG9nVHlwZTtcblxuICAvKipcbiAgICogSG93IGxvbmcsIGluIGRheXMsIHRoZSBsb2cgY29udGVudHMgd2lsbCBiZSByZXRhaW5lZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyByZXRlbnRpb24gZGF5cyBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IGxvZ1JldGVudGlvbj86IFJldGVudGlvbkRheXM7XG5cbiAgLyoqXG4gICAqIFBheWxvYWQgdG8gc2VuZCBhcyBwYXJ0IG9mIHRoZSBpbnZva2VcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBwYXlsb2FkXG4gICAqL1xuICByZWFkb25seSBwYXlsb2FkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFuIEFXUyBMYW1iZGEgSW52b2tlIGZ1bmN0aW9uIEFQSSBjYWxsLlxuICogVXNlIHRoaXMgaW5zdGVhZCBvZiB0aGUgZ2VuZXJpYyBBd3NBcGlDYWxsIGluIG9yZGVyIHRvXG4gKiBpbnZva2UgYSBsYW1iZGEgZnVuY3Rpb24uIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGNyZWF0ZVxuICogdGhlIGNvcnJlY3QgcGVybWlzc2lvbnMgdG8gaW52b2tlIHRoZSBmdW5jdGlvblxuICovXG5leHBvcnQgY2xhc3MgTGFtYmRhSW52b2tlRnVuY3Rpb24gZXh0ZW5kcyBBd3NBcGlDYWxsIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IExhbWJkYUludm9rZUZ1bmN0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIGFwaTogJ2ludm9rZScsXG4gICAgICBzZXJ2aWNlOiAnTGFtYmRhJyxcbiAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgRnVuY3Rpb25OYW1lOiBwcm9wcy5mdW5jdGlvbk5hbWUsXG4gICAgICAgIEludm9jYXRpb25UeXBlOiBwcm9wcy5pbnZvY2F0aW9uVHlwZSxcbiAgICAgICAgTG9nVHlwZTogcHJvcHMubG9nVHlwZSxcbiAgICAgICAgUGF5bG9hZDogcHJvcHMucGF5bG9hZCxcbiAgICAgICAgUmV0ZW50aW9uRGF5czogcHJvcHMubG9nUmV0ZW50aW9uLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHN0YWNrID0gU3RhY2sub2YodGhpcyk7XG4gICAgLy8gbmVlZCB0byBnaXZlIHRoZSBhc3NlcnRpb24gbGFtYmRhIHBlcm1pc3Npb24gdG8gaW52b2tlXG4gICAgbmV3IENmblJlc291cmNlKHRoaXMsICdJbnZva2UnLCB7XG4gICAgICB0eXBlOiAnQVdTOjpMYW1iZGE6OlBlcm1pc3Npb24nLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBBY3Rpb246ICdsYW1iZGE6SW52b2tlRnVuY3Rpb24nLFxuICAgICAgICBGdW5jdGlvbk5hbWU6IHByb3BzLmZ1bmN0aW9uTmFtZSxcbiAgICAgICAgUHJpbmNpcGFsOiB0aGlzLnByb3ZpZGVyLmhhbmRsZXJSb2xlQXJuLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIHRoZSBhcGkgY2FsbCBpcyAnaW52b2tlJywgYnV0IHRoZSBwZXJtaXNzaW9uIGlzICdpbnZva2VGdW5jdGlvbidcbiAgICAvLyBzbyBuZWVkIHRvIGhhbmRsZSBpdCBzcGVjaWFsbHlcbiAgICB0aGlzLnByb3ZpZGVyLmFkZFBvbGljeVN0YXRlbWVudEZyb21TZGtDYWxsKCdMYW1iZGEnLCAnaW52b2tlRnVuY3Rpb24nLCBbc3RhY2suZm9ybWF0QXJuKHtcbiAgICAgIHNlcnZpY2U6ICdsYW1iZGEnLFxuICAgICAgcmVzb3VyY2U6ICdmdW5jdGlvbicsXG4gICAgICBhcm5Gb3JtYXQ6IEFybkZvcm1hdC5DT0xPTl9SRVNPVVJDRV9OQU1FLFxuICAgICAgcmVzb3VyY2VOYW1lOiBwcm9wcy5mdW5jdGlvbk5hbWUsXG4gICAgfSldKTtcblxuICAgIC8vIElmIHVzaW5nIGB3YWl0Rm9yQXNzZXJ0aW9uc2AsIGRvIHRoZSBzYW1lIGZvciBgd2FpdGVyUHJvdmlkZXJgIGFzIGFib3ZlLlxuICAgIC8vIEFzcGVjdHMgYXJlIHVzZWQgaGVyZSBiZWNhdXNlIHdlIGRvIG5vdCBrbm93IGlmIHRoZSB1c2VyIGlzIHVzaW5nIGB3YWl0Rm9yQXNzZXJ0aW9uc2AgYXQgdGhpcyBwb2ludC5cbiAgICBBc3BlY3RzLm9mKHRoaXMpLmFkZCh7XG4gICAgICB2aXNpdChub2RlOiBJQ29uc3RydWN0KSB7XG4gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgQXdzQXBpQ2FsbCAmJiBub2RlLndhaXRlclByb3ZpZGVyKSB7XG4gICAgICAgICAgbm9kZS53YWl0ZXJQcm92aWRlci5hZGRQb2xpY3lTdGF0ZW1lbnRGcm9tU2RrQ2FsbCgnTGFtYmRhJywgJ2ludm9rZUZ1bmN0aW9uJywgW3N0YWNrLmZvcm1hdEFybih7XG4gICAgICAgICAgICBzZXJ2aWNlOiAnbGFtYmRhJyxcbiAgICAgICAgICAgIHJlc291cmNlOiAnZnVuY3Rpb24nLFxuICAgICAgICAgICAgYXJuRm9ybWF0OiBBcm5Gb3JtYXQuQ09MT05fUkVTT1VSQ0VfTkFNRSxcbiAgICAgICAgICAgIHJlc291cmNlTmFtZTogcHJvcHMuZnVuY3Rpb25OYW1lLFxuICAgICAgICAgIH0pXSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSwgeyBwcmlvcml0eTogQXNwZWN0UHJpb3JpdHkuTVVUQVRJTkcgfSk7XG4gIH1cbn1cbiJdfQ==