@aws-solutions-constructs/core 1.124.0 → 2.0.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +3785 -1435
- package/index.d.ts +2 -0
- package/index.js +3 -1
- package/lib/alb-defaults.d.ts +14 -0
- package/lib/alb-defaults.js +24 -0
- package/lib/alb-helper.d.ts +21 -0
- package/lib/alb-helper.js +106 -0
- package/lib/apigateway-defaults.d.ts +3 -3
- package/lib/apigateway-defaults.js +2 -2
- package/lib/apigateway-helper.d.ts +10 -10
- package/lib/apigateway-helper.js +14 -8
- package/lib/cloudfront-distribution-defaults.d.ts +4 -4
- package/lib/cloudfront-distribution-defaults.js +5 -5
- package/lib/cloudfront-distribution-helper.d.ts +8 -8
- package/lib/cloudfront-distribution-helper.js +15 -11
- package/lib/cloudwatch-log-group-defaults.d.ts +1 -1
- package/lib/cloudwatch-log-group-defaults.js +2 -2
- package/lib/cloudwatch-log-group-helper.d.ts +2 -2
- package/lib/cloudwatch-log-group-helper.js +2 -2
- package/lib/cognito-defaults.d.ts +1 -1
- package/lib/cognito-defaults.js +1 -1
- package/lib/cognito-helper.d.ts +3 -3
- package/lib/cognito-helper.js +4 -4
- package/lib/dynamodb-table-defaults.d.ts +1 -1
- package/lib/dynamodb-table-defaults.js +2 -2
- package/lib/dynamodb-table-helper.d.ts +2 -2
- package/lib/dynamodb-table-helper.js +2 -2
- package/lib/elasticsearch-defaults.d.ts +3 -3
- package/lib/elasticsearch-defaults.js +3 -3
- package/lib/elasticsearch-helper.d.ts +4 -4
- package/lib/elasticsearch-helper.js +5 -5
- package/lib/eventbridge-helper.d.ts +2 -2
- package/lib/eventbridge-helper.js +2 -2
- package/lib/events-rule-defaults.d.ts +1 -1
- package/lib/events-rule-defaults.js +1 -1
- package/lib/glue-database-defaults.d.ts +1 -1
- package/lib/glue-database-defaults.js +3 -3
- package/lib/glue-database-helper.d.ts +2 -2
- package/lib/glue-database-helper.js +2 -2
- package/lib/glue-job-defaults.d.ts +2 -2
- package/lib/glue-job-defaults.js +1 -1
- package/lib/glue-job-helper.d.ts +6 -6
- package/lib/glue-job-helper.js +9 -9
- package/lib/glue-table-defaults.d.ts +1 -1
- package/lib/glue-table-defaults.js +3 -3
- package/lib/glue-table-helper.d.ts +2 -2
- package/lib/glue-table-helper.js +2 -2
- package/lib/input-validation.d.ts +17 -12
- package/lib/input-validation.js +9 -2
- package/lib/iot-topic-rule-defaults.d.ts +1 -1
- package/lib/iot-topic-rule-defaults.js +1 -1
- package/lib/kinesis-analytics-defaults.d.ts +1 -1
- package/lib/kinesis-analytics-defaults.js +1 -1
- package/lib/kinesis-analytics-helper.d.ts +3 -3
- package/lib/kinesis-analytics-helper.js +3 -3
- package/lib/kinesis-firehose-s3-defaults.d.ts +2 -2
- package/lib/kinesis-firehose-s3-defaults.js +1 -1
- package/lib/kinesis-streams-defaults.d.ts +1 -1
- package/lib/kinesis-streams-defaults.js +2 -2
- package/lib/kinesis-streams-helper.d.ts +3 -3
- package/lib/kinesis-streams-helper.js +4 -4
- package/lib/kms-defaults.d.ts +1 -1
- package/lib/kms-defaults.js +1 -1
- package/lib/kms-helper.d.ts +2 -2
- package/lib/kms-helper.js +2 -2
- package/lib/lambda-defaults.d.ts +2 -2
- package/lib/lambda-defaults.js +2 -2
- package/lib/lambda-event-source-mapping-defaults.d.ts +3 -3
- package/lib/lambda-event-source-mapping-defaults.js +7 -7
- package/lib/lambda-helper.d.ts +3 -3
- package/lib/lambda-helper.js +4 -4
- package/lib/mediastore-defaults.d.ts +1 -1
- package/lib/mediastore-defaults.js +2 -2
- package/lib/mediastore-helper.d.ts +2 -2
- package/lib/mediastore-helper.js +3 -3
- package/lib/s3-bucket-defaults.d.ts +3 -2
- package/lib/s3-bucket-defaults.js +14 -5
- package/lib/s3-bucket-helper.d.ts +11 -5
- package/lib/s3-bucket-helper.js +36 -23
- package/lib/sagemaker-defaults.d.ts +1 -1
- package/lib/sagemaker-defaults.js +1 -1
- package/lib/sagemaker-helper.d.ts +4 -4
- package/lib/sagemaker-helper.js +7 -7
- package/lib/secretsmanager-defaults.d.ts +1 -1
- package/lib/secretsmanager-defaults.js +3 -3
- package/lib/secretsmanager-helper.d.ts +2 -2
- package/lib/secretsmanager-helper.js +2 -2
- package/lib/security-group-helper.d.ts +2 -2
- package/lib/security-group-helper.js +2 -2
- package/lib/sns-defaults.d.ts +1 -1
- package/lib/sns-defaults.js +1 -1
- package/lib/sns-helper.d.ts +3 -3
- package/lib/sns-helper.js +7 -7
- package/lib/sqs-defaults.d.ts +1 -1
- package/lib/sqs-defaults.js +2 -2
- package/lib/sqs-helper.d.ts +3 -3
- package/lib/sqs-helper.js +5 -5
- package/lib/ssm-string-parameter-helper.d.ts +2 -2
- package/lib/ssm-string-parameter-helper.js +2 -2
- package/lib/step-function-defaults.d.ts +2 -2
- package/lib/step-function-defaults.js +2 -2
- package/lib/step-function-helper.d.ts +4 -4
- package/lib/step-function-helper.js +5 -5
- package/lib/utils.d.ts +1 -1
- package/lib/utils.js +2 -2
- package/lib/vpc-defaults.d.ts +1 -1
- package/lib/vpc-defaults.js +3 -3
- package/lib/vpc-helper.d.ts +2 -2
- package/lib/vpc-helper.js +2 -2
- package/lib/waf-defaults.d.ts +1 -1
- package/lib/waf-defaults.js +1 -1
- package/lib/waf-helper.d.ts +2 -2
- package/lib/waf-helper.js +2 -2
- package/node_modules/emoji-regex/LICENSE-MIT.txt +20 -0
- package/node_modules/emoji-regex/README.md +73 -0
- package/node_modules/emoji-regex/es2015/index.js +6 -0
- package/node_modules/emoji-regex/es2015/text.js +6 -0
- package/node_modules/emoji-regex/index.d.ts +23 -0
- package/node_modules/emoji-regex/index.js +6 -0
- package/node_modules/emoji-regex/package.json +50 -0
- package/node_modules/emoji-regex/text.js +6 -0
- package/node_modules/wide-align/LICENSE +0 -0
- package/node_modules/wide-align/README.md +0 -0
- package/node_modules/wide-align/align.js +0 -0
- package/node_modules/wide-align/node_modules/ansi-regex/index.d.ts +37 -0
- package/node_modules/wide-align/node_modules/ansi-regex/index.js +4 -4
- package/node_modules/wide-align/node_modules/ansi-regex/package.json +53 -51
- package/node_modules/wide-align/node_modules/ansi-regex/readme.md +35 -3
- package/node_modules/wide-align/node_modules/is-fullwidth-code-point/index.d.ts +17 -0
- package/node_modules/wide-align/node_modules/is-fullwidth-code-point/index.js +25 -21
- package/node_modules/wide-align/node_modules/is-fullwidth-code-point/license +4 -16
- package/node_modules/wide-align/node_modules/is-fullwidth-code-point/package.json +40 -43
- package/node_modules/wide-align/node_modules/is-fullwidth-code-point/readme.md +6 -6
- package/node_modules/wide-align/node_modules/string-width/index.d.ts +29 -0
- package/node_modules/wide-align/node_modules/string-width/index.js +16 -5
- package/node_modules/wide-align/node_modules/string-width/package.json +11 -10
- package/node_modules/wide-align/node_modules/string-width/readme.md +15 -7
- package/node_modules/wide-align/node_modules/strip-ansi/index.d.ts +17 -0
- package/node_modules/wide-align/node_modules/strip-ansi/index.js +1 -1
- package/node_modules/wide-align/node_modules/strip-ansi/package.json +52 -50
- package/node_modules/wide-align/node_modules/strip-ansi/readme.md +12 -5
- package/node_modules/wide-align/package.json +5 -5
- package/package.json +9 -69
- package/test/alb-helper.test.d.ts +13 -0
- package/test/alb-helper.test.js +321 -0
- package/test/apigateway-helper.test.js +27 -20
- package/test/cloudfront-distribution-api-gateway-helper.test.js +12 -12
- package/test/cloudfront-distribution-mediastore-helper.test.js +12 -12
- package/test/cloudfront-distribution-s3-helper.test.js +33 -91
- package/test/cloudwatch-log-group-helper.test.js +6 -6
- package/test/congnito-helper.test.js +6 -6
- package/test/dynamo-table.test.js +13 -13
- package/test/elasticsearch-helper.test.js +6 -6
- package/test/eventbridge-helper.test.js +6 -6
- package/test/events-rule.test.js +9 -9
- package/test/glue-job-helper.test.js +25 -21
- package/test/glue-table-helper.test.js +6 -6
- package/test/input-validation.test.js +26 -26
- package/test/iot-rule.test.js +5 -5
- package/test/kinesis-analytics.test.js +4 -4
- package/test/kinesis-firehose-s3-defaults.test.js +5 -5
- package/test/kinesis-streams-defaults.test.js +5 -5
- package/test/kinesis-streams-helper.test.js +9 -9
- package/test/kms-helper.test.js +4 -4
- package/test/lambda-event-source.test.js +19 -19
- package/test/lambda-helper.test.js +24 -24
- package/test/mediastore-helper.test.js +3 -3
- package/test/s3-bucket-helper.test.js +65 -18
- package/test/s3-bucket.test.js +19 -10
- package/test/sagemaker-helper.test.js +13 -13
- package/test/secretsmanager-helper.test.js +5 -5
- package/test/security-group-helper.test.js +6 -6
- package/test/sns-helper.test.js +6 -6
- package/test/sqs-helper.test.js +4 -4
- package/test/ssm-string-parameter-helper.test.js +5 -5
- package/test/step-function-helper.test.js +7 -7
- package/test/test-helper.d.ts +2 -2
- package/test/test-helper.js +4 -4
- package/test/vpc-helper.test.js +16 -16
- package/test/waf-helper.test.js +5 -5
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance
|
|
6
|
+
* with the License. A copy of the License is located at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES
|
|
11
|
+
* OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions
|
|
12
|
+
* and limitations under the License.
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
16
|
+
const elb = require("aws-cdk-lib/aws-elasticloadbalancingv2");
|
|
17
|
+
const acm = require("aws-cdk-lib/aws-certificatemanager");
|
|
18
|
+
const lambda = require("aws-cdk-lib/aws-lambda");
|
|
19
|
+
const defaults = require("../index");
|
|
20
|
+
require("@aws-cdk/assert/jest");
|
|
21
|
+
test('Test ObtainAlb with existing ALB', () => {
|
|
22
|
+
const stack = new aws_cdk_lib_1.Stack();
|
|
23
|
+
// Build VPC
|
|
24
|
+
const vpc = defaults.buildVpc(stack, {
|
|
25
|
+
defaultVpcProps: defaults.DefaultPublicPrivateVpcProps(),
|
|
26
|
+
});
|
|
27
|
+
const existingLoadBalancer = new elb.ApplicationLoadBalancer(stack, 'load-balancer', {
|
|
28
|
+
vpc,
|
|
29
|
+
internetFacing: true,
|
|
30
|
+
loadBalancerName: 'unique-name'
|
|
31
|
+
});
|
|
32
|
+
defaults.ObtainAlb(stack, 'test', vpc, true, existingLoadBalancer);
|
|
33
|
+
expect(stack).toHaveResourceLike('AWS::ElasticLoadBalancingV2::LoadBalancer', {
|
|
34
|
+
Name: "unique-name",
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
test('Test ObtainAlb for new ALB with provided props', () => {
|
|
38
|
+
const stack = new aws_cdk_lib_1.Stack(undefined, undefined, {
|
|
39
|
+
env: { account: "123456789012", region: 'us-east-1' },
|
|
40
|
+
});
|
|
41
|
+
// Build VPC
|
|
42
|
+
const vpc = defaults.buildVpc(stack, {
|
|
43
|
+
defaultVpcProps: defaults.DefaultPublicPrivateVpcProps(),
|
|
44
|
+
});
|
|
45
|
+
defaults.ObtainAlb(stack, 'test', vpc, true, undefined, {
|
|
46
|
+
loadBalancerName: 'new-loadbalancer',
|
|
47
|
+
vpc,
|
|
48
|
+
internetFacing: true
|
|
49
|
+
});
|
|
50
|
+
expect(stack).toHaveResourceLike('AWS::ElasticLoadBalancingV2::LoadBalancer', {
|
|
51
|
+
Name: "new-loadbalancer",
|
|
52
|
+
Scheme: "internet-facing",
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
test('Test ObtainAlb for new ALB with default props', () => {
|
|
56
|
+
const stack = new aws_cdk_lib_1.Stack(undefined, undefined, {
|
|
57
|
+
env: { account: "123456789012", region: 'us-east-1' },
|
|
58
|
+
});
|
|
59
|
+
// Build VPC
|
|
60
|
+
const vpc = defaults.buildVpc(stack, {
|
|
61
|
+
defaultVpcProps: defaults.DefaultPublicPrivateVpcProps(),
|
|
62
|
+
});
|
|
63
|
+
defaults.ObtainAlb(stack, 'test', vpc, false);
|
|
64
|
+
expect(stack).toHaveResourceLike('AWS::ElasticLoadBalancingV2::LoadBalancer', {
|
|
65
|
+
Scheme: "internal",
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
test('Test ObtainAlb for new ALB with default props', () => {
|
|
69
|
+
const stack = new aws_cdk_lib_1.Stack();
|
|
70
|
+
const testFunction = new lambda.Function(stack, 'test-function', {
|
|
71
|
+
code: lambda.Code.fromAsset(`${__dirname}/lambda`),
|
|
72
|
+
runtime: lambda.Runtime.NODEJS_14_X,
|
|
73
|
+
handler: "index.handler",
|
|
74
|
+
});
|
|
75
|
+
defaults.CreateLambdaTargetGroup(stack, 'test-target', testFunction);
|
|
76
|
+
expect(stack).toHaveResourceLike('AWS::ElasticLoadBalancingV2::TargetGroup', {
|
|
77
|
+
TargetType: "lambda"
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
test('Test ObtainAlb for new ALB with custom props', () => {
|
|
81
|
+
const stack = new aws_cdk_lib_1.Stack();
|
|
82
|
+
const testFunction = new lambda.Function(stack, 'test-function', {
|
|
83
|
+
code: lambda.Code.fromAsset(`${__dirname}/lambda`),
|
|
84
|
+
runtime: lambda.Runtime.NODEJS_14_X,
|
|
85
|
+
handler: "index.handler",
|
|
86
|
+
});
|
|
87
|
+
defaults.CreateLambdaTargetGroup(stack, 'test-target', testFunction, {
|
|
88
|
+
targetGroupName: 'test-target-group'
|
|
89
|
+
});
|
|
90
|
+
expect(stack).toHaveResourceLike('AWS::ElasticLoadBalancingV2::TargetGroup', {
|
|
91
|
+
TargetType: "lambda",
|
|
92
|
+
Name: 'test-target-group'
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
test('Test Add Target without ruleProps', () => {
|
|
96
|
+
const stack = new aws_cdk_lib_1.Stack();
|
|
97
|
+
const testFunction = new lambda.Function(stack, 'test-function', {
|
|
98
|
+
code: lambda.Code.fromAsset(`${__dirname}/lambda`),
|
|
99
|
+
runtime: lambda.Runtime.NODEJS_14_X,
|
|
100
|
+
handler: "index.handler",
|
|
101
|
+
});
|
|
102
|
+
const targetGroup = defaults.CreateLambdaTargetGroup(stack, 'test-target', testFunction, {
|
|
103
|
+
targetGroupName: 'test-target-group'
|
|
104
|
+
});
|
|
105
|
+
// Build VPC
|
|
106
|
+
const vpc = defaults.buildVpc(stack, {
|
|
107
|
+
defaultVpcProps: defaults.DefaultPublicPrivateVpcProps(),
|
|
108
|
+
});
|
|
109
|
+
const existingLoadBalancer = new elb.ApplicationLoadBalancer(stack, 'load-balancer', {
|
|
110
|
+
vpc,
|
|
111
|
+
internetFacing: true,
|
|
112
|
+
loadBalancerName: 'unique-name'
|
|
113
|
+
});
|
|
114
|
+
const testListener = new elb.ApplicationListener(stack, 'test-listener', {
|
|
115
|
+
loadBalancer: existingLoadBalancer,
|
|
116
|
+
protocol: elb.ApplicationProtocol.HTTP
|
|
117
|
+
});
|
|
118
|
+
defaults.AddTarget(stack, targetGroup, testListener);
|
|
119
|
+
expect(stack).toHaveResourceLike('AWS::ElasticLoadBalancingV2::Listener', {
|
|
120
|
+
DefaultActions: [
|
|
121
|
+
{
|
|
122
|
+
TargetGroupArn: {
|
|
123
|
+
Ref: "testtargettgB2EE41CA"
|
|
124
|
+
},
|
|
125
|
+
Type: "forward"
|
|
126
|
+
}
|
|
127
|
+
],
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
test('Test Add Target with ruleProps', () => {
|
|
131
|
+
const stack = new aws_cdk_lib_1.Stack();
|
|
132
|
+
const testFunction = new lambda.Function(stack, 'test-function', {
|
|
133
|
+
code: lambda.Code.fromAsset(`${__dirname}/lambda`),
|
|
134
|
+
runtime: lambda.Runtime.NODEJS_14_X,
|
|
135
|
+
handler: "index.handler",
|
|
136
|
+
});
|
|
137
|
+
const targetGroup = defaults.CreateLambdaTargetGroup(stack, 'test-target', testFunction, {
|
|
138
|
+
targetGroupName: 'test-target-group'
|
|
139
|
+
});
|
|
140
|
+
const secondTargetGroup = defaults.CreateLambdaTargetGroup(stack, 'second-target', testFunction, {
|
|
141
|
+
targetGroupName: 'second-target-group'
|
|
142
|
+
});
|
|
143
|
+
// Build VPC
|
|
144
|
+
const vpc = defaults.buildVpc(stack, {
|
|
145
|
+
defaultVpcProps: defaults.DefaultPublicPrivateVpcProps(),
|
|
146
|
+
});
|
|
147
|
+
const existingLoadBalancer = new elb.ApplicationLoadBalancer(stack, 'load-balancer', {
|
|
148
|
+
vpc,
|
|
149
|
+
internetFacing: true,
|
|
150
|
+
loadBalancerName: 'unique-name'
|
|
151
|
+
});
|
|
152
|
+
const testListener = new elb.ApplicationListener(stack, 'test-listener', {
|
|
153
|
+
loadBalancer: existingLoadBalancer,
|
|
154
|
+
protocol: elb.ApplicationProtocol.HTTP
|
|
155
|
+
});
|
|
156
|
+
// The first target is default and can't have rules, so
|
|
157
|
+
// we need to add 2 targets
|
|
158
|
+
defaults.AddTarget(stack, targetGroup, testListener);
|
|
159
|
+
defaults.AddTarget(stack, secondTargetGroup, testListener, {
|
|
160
|
+
conditions: [elb.ListenerCondition.pathPatterns(["*admin*"])],
|
|
161
|
+
priority: 10
|
|
162
|
+
});
|
|
163
|
+
expect(stack).toHaveResourceLike('AWS::ElasticLoadBalancingV2::ListenerRule', {
|
|
164
|
+
Actions: [
|
|
165
|
+
{
|
|
166
|
+
TargetGroupArn: {
|
|
167
|
+
Ref: "secondtargettg0CE37E1F"
|
|
168
|
+
},
|
|
169
|
+
Type: "forward"
|
|
170
|
+
}
|
|
171
|
+
],
|
|
172
|
+
Conditions: [
|
|
173
|
+
{
|
|
174
|
+
Field: "path-pattern",
|
|
175
|
+
PathPatternConfig: {
|
|
176
|
+
Values: [
|
|
177
|
+
"*admin*"
|
|
178
|
+
]
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
]
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
test('Test AddListener with defaults', () => {
|
|
185
|
+
const stack = new aws_cdk_lib_1.Stack();
|
|
186
|
+
const testFunction = new lambda.Function(stack, 'test-function', {
|
|
187
|
+
code: lambda.Code.fromAsset(`${__dirname}/lambda`),
|
|
188
|
+
runtime: lambda.Runtime.NODEJS_14_X,
|
|
189
|
+
handler: "index.handler",
|
|
190
|
+
});
|
|
191
|
+
const targetGroup = defaults.CreateLambdaTargetGroup(stack, 'test-target', testFunction, {
|
|
192
|
+
targetGroupName: 'test-target-group'
|
|
193
|
+
});
|
|
194
|
+
// Build VPC
|
|
195
|
+
const vpc = defaults.buildVpc(stack, {
|
|
196
|
+
defaultVpcProps: defaults.DefaultPublicPrivateVpcProps(),
|
|
197
|
+
});
|
|
198
|
+
const existingLoadBalancer = new elb.ApplicationLoadBalancer(stack, 'load-balancer', {
|
|
199
|
+
vpc,
|
|
200
|
+
internetFacing: true,
|
|
201
|
+
loadBalancerName: 'unique-name'
|
|
202
|
+
});
|
|
203
|
+
const cert = acm.Certificate.fromCertificateArn(stack, 'not-really-a-cert', "arn:aws:acm:us-east-1:123456789012:certificate/85c52dc8-1b37-4afd-a7aa-f03aac2db0cc");
|
|
204
|
+
defaults.AddListener(stack, existingLoadBalancer, targetGroup, {
|
|
205
|
+
certificates: [cert],
|
|
206
|
+
});
|
|
207
|
+
// This should create 2 listeners, HTTPS plus redirect of HTTP
|
|
208
|
+
expect(stack).toHaveResourceLike('AWS::ElasticLoadBalancingV2::Listener', {
|
|
209
|
+
Protocol: 'HTTPS',
|
|
210
|
+
});
|
|
211
|
+
expect(stack).toHaveResourceLike('AWS::ElasticLoadBalancingV2::Listener', {
|
|
212
|
+
Protocol: 'HTTP',
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
test('Test AddListener with no cert for an HTTPS listener', () => {
|
|
216
|
+
const stack = new aws_cdk_lib_1.Stack();
|
|
217
|
+
const testFunction = new lambda.Function(stack, 'test-function', {
|
|
218
|
+
code: lambda.Code.fromAsset(`${__dirname}/lambda`),
|
|
219
|
+
runtime: lambda.Runtime.NODEJS_14_X,
|
|
220
|
+
handler: "index.handler",
|
|
221
|
+
});
|
|
222
|
+
const targetGroup = defaults.CreateLambdaTargetGroup(stack, 'test-target', testFunction, {
|
|
223
|
+
targetGroupName: 'test-target-group'
|
|
224
|
+
});
|
|
225
|
+
// Build VPC
|
|
226
|
+
const vpc = defaults.buildVpc(stack, {
|
|
227
|
+
defaultVpcProps: defaults.DefaultPublicPrivateVpcProps(),
|
|
228
|
+
});
|
|
229
|
+
const existingLoadBalancer = new elb.ApplicationLoadBalancer(stack, 'load-balancer', {
|
|
230
|
+
vpc,
|
|
231
|
+
internetFacing: true,
|
|
232
|
+
loadBalancerName: 'unique-name'
|
|
233
|
+
});
|
|
234
|
+
const app = () => {
|
|
235
|
+
defaults.AddListener(stack, existingLoadBalancer, targetGroup, {});
|
|
236
|
+
};
|
|
237
|
+
expect(app).toThrowError();
|
|
238
|
+
});
|
|
239
|
+
test('Test AddListener error for HTTP with a cert', () => {
|
|
240
|
+
const stack = new aws_cdk_lib_1.Stack();
|
|
241
|
+
const testFunction = new lambda.Function(stack, 'test-function', {
|
|
242
|
+
code: lambda.Code.fromAsset(`${__dirname}/lambda`),
|
|
243
|
+
runtime: lambda.Runtime.NODEJS_14_X,
|
|
244
|
+
handler: "index.handler",
|
|
245
|
+
});
|
|
246
|
+
const targetGroup = defaults.CreateLambdaTargetGroup(stack, 'test-target', testFunction, {
|
|
247
|
+
targetGroupName: 'test-target-group'
|
|
248
|
+
});
|
|
249
|
+
// Build VPC
|
|
250
|
+
const vpc = defaults.buildVpc(stack, {
|
|
251
|
+
defaultVpcProps: defaults.DefaultPublicPrivateVpcProps(),
|
|
252
|
+
});
|
|
253
|
+
const existingLoadBalancer = new elb.ApplicationLoadBalancer(stack, 'load-balancer', {
|
|
254
|
+
vpc,
|
|
255
|
+
internetFacing: true,
|
|
256
|
+
loadBalancerName: 'unique-name'
|
|
257
|
+
});
|
|
258
|
+
const cert = acm.Certificate.fromCertificateArn(stack, 'not-really-a-cert', "arn:aws:acm:us-east-1:123456789012:certificate/85c52dc8-1b37-4afd-a7aa-f03aac2db0cc");
|
|
259
|
+
const app = () => {
|
|
260
|
+
defaults.AddListener(stack, existingLoadBalancer, targetGroup, {
|
|
261
|
+
certificates: [cert],
|
|
262
|
+
protocol: elb.ApplicationProtocol.HTTP,
|
|
263
|
+
});
|
|
264
|
+
};
|
|
265
|
+
expect(app).toThrowError();
|
|
266
|
+
});
|
|
267
|
+
test('Test AddListener for HTTP Listener', () => {
|
|
268
|
+
const stack = new aws_cdk_lib_1.Stack();
|
|
269
|
+
const testFunction = new lambda.Function(stack, 'test-function', {
|
|
270
|
+
code: lambda.Code.fromAsset(`${__dirname}/lambda`),
|
|
271
|
+
runtime: lambda.Runtime.NODEJS_14_X,
|
|
272
|
+
handler: "index.handler",
|
|
273
|
+
});
|
|
274
|
+
const targetGroup = defaults.CreateLambdaTargetGroup(stack, 'test-target', testFunction, {
|
|
275
|
+
targetGroupName: 'test-target-group'
|
|
276
|
+
});
|
|
277
|
+
// Build VPC
|
|
278
|
+
const vpc = defaults.buildVpc(stack, {
|
|
279
|
+
defaultVpcProps: defaults.DefaultPublicPrivateVpcProps(),
|
|
280
|
+
});
|
|
281
|
+
const existingLoadBalancer = new elb.ApplicationLoadBalancer(stack, 'load-balancer', {
|
|
282
|
+
vpc,
|
|
283
|
+
internetFacing: true,
|
|
284
|
+
loadBalancerName: 'unique-name'
|
|
285
|
+
});
|
|
286
|
+
defaults.AddListener(stack, existingLoadBalancer, targetGroup, {
|
|
287
|
+
protocol: elb.ApplicationProtocol.HTTP,
|
|
288
|
+
});
|
|
289
|
+
expect(stack).toHaveResourceLike('AWS::ElasticLoadBalancingV2::Listener', {
|
|
290
|
+
Protocol: 'HTTP',
|
|
291
|
+
});
|
|
292
|
+
expect(stack).not.toHaveResourceLike('AWS::ElasticLoadBalancingV2::Listener', {
|
|
293
|
+
Protocol: 'HTTPS',
|
|
294
|
+
});
|
|
295
|
+
});
|
|
296
|
+
test('Test with custom logging bucket props', () => {
|
|
297
|
+
// Creating ALB logging requires a region and account (but
|
|
298
|
+
// these can be fake in unit tests)
|
|
299
|
+
const stack = new aws_cdk_lib_1.Stack(undefined, undefined, {
|
|
300
|
+
env: { account: "123456789012", region: 'us-east-1' },
|
|
301
|
+
});
|
|
302
|
+
// Build VPC
|
|
303
|
+
const vpc = defaults.buildVpc(stack, {
|
|
304
|
+
defaultVpcProps: defaults.DefaultPublicPrivateVpcProps(),
|
|
305
|
+
});
|
|
306
|
+
const testName = 'test-name';
|
|
307
|
+
defaults.ObtainAlb(stack, 'test', vpc, false, undefined, undefined, true, { bucketName: testName });
|
|
308
|
+
expect(stack).toHaveResourceLike('AWS::S3::Bucket', {
|
|
309
|
+
BucketName: testName
|
|
310
|
+
});
|
|
311
|
+
});
|
|
312
|
+
test('Test with no logging', () => {
|
|
313
|
+
const stack = new aws_cdk_lib_1.Stack();
|
|
314
|
+
// Build VPC
|
|
315
|
+
const vpc = defaults.buildVpc(stack, {
|
|
316
|
+
defaultVpcProps: defaults.DefaultPublicPrivateVpcProps(),
|
|
317
|
+
});
|
|
318
|
+
defaults.ObtainAlb(stack, 'test', vpc, false, undefined, undefined, false);
|
|
319
|
+
expect(stack).not.toHaveResourceLike('AWS::S3::Bucket', {});
|
|
320
|
+
});
|
|
321
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxiLWhlbHBlci50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYWxiLWhlbHBlci50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7R0FXRzs7QUFFSCw2Q0FBb0M7QUFDcEMsOERBQThEO0FBQzlELDBEQUEwRDtBQUMxRCxpREFBaUQ7QUFDakQscUNBQXFDO0FBQ3JDLGdDQUE4QjtBQUU5QixJQUFJLENBQUMsa0NBQWtDLEVBQUUsR0FBRyxFQUFFO0lBQzVDLE1BQU0sS0FBSyxHQUFHLElBQUksbUJBQUssRUFBRSxDQUFDO0lBQzFCLFlBQVk7SUFDWixNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRTtRQUNuQyxlQUFlLEVBQUUsUUFBUSxDQUFDLDRCQUE0QixFQUFFO0tBQ3pELENBQUMsQ0FBQztJQUVILE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxHQUFHLENBQUMsdUJBQXVCLENBQUMsS0FBSyxFQUFFLGVBQWUsRUFBRTtRQUNuRixHQUFHO1FBQ0gsY0FBYyxFQUFFLElBQUk7UUFDcEIsZ0JBQWdCLEVBQUUsYUFBYTtLQUNoQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0lBQ25FLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQywyQ0FBMkMsRUFBRTtRQUM1RSxJQUFJLEVBQUUsYUFBYTtLQUNwQixDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQztBQUVILElBQUksQ0FBQyxnREFBZ0QsRUFBRSxHQUFHLEVBQUU7SUFDMUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxtQkFBSyxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUU7UUFDNUMsR0FBRyxFQUFFLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFO0tBQ3RE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QWUsRUFBRSxRQUFRLENBQUMsNEJBQTRCLEVBQUU7S0FDekQsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMzRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzlELENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiAgQ29weXJpZ2h0IDIwMjEgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKS4gWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogIHdpdGggdGhlIExpY2Vuc2UuIEEgY29weSBvZiB0aGUgTGljZW5zZSBpcyBsb2NhdGVkIGF0XG4gKlxuICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiAgb3IgaW4gdGhlICdsaWNlbnNlJyBmaWxlIGFjY29tcGFueWluZyB0aGlzIGZpbGUuIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVNcbiAqICBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xuICogIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGVsYiBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVsYXN0aWNsb2FkYmFsYW5jaW5ndjJcIjtcbmltcG9ydCAqIGFzIGFjbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNlcnRpZmljYXRlbWFuYWdlclwiO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgKiBhcyBkZWZhdWx0cyBmcm9tICcuLi9pbmRleCc7XG5pbXBvcnQgJ0Bhd3MtY2RrL2Fzc2VydC9qZXN0JztcblxudGVzdCgnVGVzdCBPYnRhaW5BbGIgd2l0aCBleGlzdGluZyBBTEInLCAoKSA9PiB7XG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG4gIC8vIEJ1aWxkIFZQQ1xuICBjb25zdCB2cGMgPSBkZWZhdWx0cy5idWlsZFZwYyhzdGFjaywge1xuICAgIGRlZmF1bHRWcGNQcm9wczogZGVmYXVsdHMuRGVmYXVsdFB1YmxpY1ByaXZhdGVWcGNQcm9wcygpLFxuICB9KTtcblxuICBjb25zdCBleGlzdGluZ0xvYWRCYWxhbmNlciA9IG5ldyBlbGIuQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIoc3RhY2ssICdsb2FkLWJhbGFuY2VyJywge1xuICAgIHZwYyxcbiAgICBpbnRlcm5ldEZhY2luZzogdHJ1ZSxcbiAgICBsb2FkQmFsYW5jZXJOYW1lOiAndW5pcXVlLW5hbWUnXG4gIH0pO1xuXG4gIGRlZmF1bHRzLk9idGFpbkFsYihzdGFjaywgJ3Rlc3QnLCB2cGMsIHRydWUsIGV4aXN0aW5nTG9hZEJhbGFuY2VyKTtcbiAgZXhwZWN0KHN0YWNrKS50b0hhdmVSZXNvdXJjZUxpa2UoJ0FXUzo6RWxhc3RpY0xvYWRCYWxhbmNpbmdWMjo6TG9hZEJhbGFuY2VyJywge1xuICAgIE5hbWU6IFwidW5pcXVlLW5hbWVcIixcbiAgfSk7XG59KTtcblxudGVzdCgnVGVzdCBPYnRhaW5BbGIgZm9yIG5ldyBBTEIgd2l0aCBwcm92aWRlZCBwcm9wcycsICgpID0+IHtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2sodW5kZWZpbmVkLCB1bmRlZmluZWQsIHtcbiAgICBlbnY6IHsgYWNjb3VudDogXCIxMjM0NTY3ODkwMTJcIiwgcmVnaW9uOiAndXMtZWFzdC0xJyB9LFxuICB9KTtcbiAgLy8gQnVpbGQgVlBDXG4gIGNvbnN0IHZwYyA9IGRlZmF1bHRzLmJ1aWxkVnBjKHN0YWNrLCB7XG4gICAgZGVmYXVsdFZwY1Byb3BzOiBkZWZhdWx0cy5EZWZhdWx0UHVibGljUHJpdmF0ZVZwY1Byb3BzKCksXG4gIH0pO1xuXG4gIGRlZmF1bHRzLk9idGFpbkFsYihzdGFjaywgJ3Rlc3QnLCB2cGMsIHRydWUsIHVuZGVmaW5lZCwge1xuICAgIGxvYWRCYWxhbmNlck5hbWU6ICduZXctbG9hZGJhbGFuY2VyJyxcbiAgICB2cGMsXG4gICAgaW50ZXJuZXRGYWNpbmc6IHRydWVcbiAgfSk7XG4gIGV4cGVjdChzdGFjaykudG9IYXZlUmVzb3VyY2VMaWtlKCdBV1M6OkVsYXN0aWNMb2FkQmFsYW5jaW5nVjI6OkxvYWRCYWxhbmNlcicsIHtcbiAgICBOYW1lOiBcIm5ldy1sb2FkYmFsYW5jZXJcIixcbiAgICBTY2hlbWU6IFwiaW50ZXJuZXQtZmFjaW5nXCIsXG4gIH0pO1xufSk7XG5cbnRlc3QoJ1Rlc3QgT2J0YWluQWxiIGZvciBuZXcgQUxCIHdpdGggZGVmYXVsdCBwcm9wcycsICgpID0+IHtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2sodW5kZWZpbmVkLCB1bmRlZmluZWQsIHtcbiAgICBlbnY6IHsgYWNjb3VudDogXCIxMjM0NTY3ODkwMTJcIiwgcmVnaW9uOiAndXMtZWFzdC0xJyB9LFxuICB9KTtcbiAgLy8gQnVpbGQgVlBDXG4gIGNvbnN0IHZwYyA9IGRlZmF1bHRzLmJ1aWxkVnBjKHN0YWNrLCB7XG4gICAgZGVmYXVsdFZwY1Byb3BzOiBkZWZhdWx0cy5EZWZhdWx0UHVibGljUHJpdmF0ZVZwY1Byb3BzKCksXG4gIH0pO1xuXG4gIGRlZmF1bHRzLk9idGFpbkFsYihzdGFjaywgJ3Rlc3QnLCB2cGMsIGZhbHNlKTtcbiAgZXhwZWN0KHN0YWNrKS50b0hhdmVSZXNvdXJjZUxpa2UoJ0FXUzo6RWxhc3RpY0xvYWRCYWxhbmNpbmdWMjo6TG9hZEJhbGFuY2VyJywge1xuICAgIFNjaGVtZTogXCJpbnRlcm5hbFwiLFxuICB9KTtcbn0pO1xuXG50ZXN0KCdUZXN0IE9idGFpbkFsYiBmb3IgbmV3IEFMQiB3aXRoIGRlZmF1bHQgcHJvcHMnLCAoKSA9PiB7XG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG5cbiAgY29uc3QgdGVzdEZ1bmN0aW9uID0gbmV3IGxhbWJkYS5GdW5jdGlvbihzdGFjaywgJ3Rlc3QtZnVuY3Rpb24nLCB7XG4gICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbUFzc2V0KGAke19fZGlybmFtZX0vbGFtYmRhYCksXG4gICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzE0X1gsXG4gICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gIH0pO1xuXG4gIGRlZmF1bHRzLkNyZWF0ZUxhbWJkYVRhcmdldEdyb3VwKHN0YWNrLCAndGVzdC10YXJnZXQnLCB0ZXN0RnVuY3Rpb24pO1xuXG4gIGV4cGVjdChzdGFjaykudG9IYXZlUmVzb3VyY2VMaWtlKCdBV1M6OkVsYXN0aWNMb2FkQmFsYW5jaW5nVjI6OlRhcmdldEdyb3VwJywge1xuICAgIFRhcmdldFR5cGU6IFwibGFtYmRhXCJcbiAgfSk7XG59KTtcblxudGVzdCgnVGVzdCBPYnRhaW5BbGIgZm9yIG5ldyBBTEIgd2l0aCBjdXN0b20gcHJvcHMnLCAoKSA9PiB7XG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG5cbiAgY29uc3QgdGVzdEZ1bmN0aW9uID0gbmV3IGxhbWJkYS5GdW5jdGlvbihzdGFjaywgJ3Rlc3QtZnVuY3Rpb24nLCB7XG4gICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbUFzc2V0KGAke19fZGlybmFtZX0vbGFtYmRhYCksXG4gICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzE0X1gsXG4gICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gIH0pO1xuXG4gIGRlZmF1bHRzLkNyZWF0ZUxhbWJkYVRhcmdldEdyb3VwKHN0YWNrLCAndGVzdC10YXJnZXQnLCB0ZXN0RnVuY3Rpb24sIHtcbiAgICB0YXJnZXRHcm91cE5hbWU6ICd0ZXN0LXRhcmdldC1ncm91cCdcbiAgfSk7XG5cbiAgZXhwZWN0KHN0YWNrKS50b0hhdmVSZXNvdXJjZUxpa2UoJ0FXUzo6RWxhc3RpY0xvYWRCYWxhbmNpbmdWMjo6VGFyZ2V0R3JvdXAnLCB7XG4gICAgVGFyZ2V0VHlwZTogXCJsYW1iZGFcIixcbiAgICBOYW1lOiAndGVzdC10YXJnZXQtZ3JvdXAnXG4gIH0pO1xufSk7XG5cbnRlc3QoJ1Rlc3QgQWRkIFRhcmdldCB3aXRob3V0IHJ1bGVQcm9wcycsICgpID0+IHtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soKTtcblxuICBjb25zdCB0ZXN0RnVuY3Rpb24gPSBuZXcgbGFtYmRhLkZ1bmN0aW9uKHN0YWNrLCAndGVzdC1mdW5jdGlvbicsIHtcbiAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQoYCR7X19kaXJuYW1lfS9sYW1iZGFgKSxcbiAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5OT0RFSlNfMTRfWCxcbiAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgfSk7XG5cbiAgY29uc3QgdGFyZ2V0R3JvdXAgPSBkZWZhdWx0cy5DcmVhdGVMYW1iZGFUYXJnZXRHcm91cChzdGFjaywgJ3Rlc3QtdGFyZ2V0JywgdGVzdEZ1bmN0aW9uLCB7XG4gICAgdGFyZ2V0R3JvdXBOYW1lOiAndGVzdC10YXJnZXQtZ3JvdXAnXG4gIH0pO1xuXG4gIC8vIEJ1aWxkIFZQQ1xuICBjb25zdCB2cGMgPSBkZWZhdWx0cy5idWlsZFZwYyhzdGFjaywge1xuICAgIGRlZmF1bHRWcGNQcm9wczogZGVmYXVsdHMuRGVmYXVsdFB1YmxpY1ByaXZhdGVWcGNQcm9wcygpLFxuICB9KTtcblxuICBjb25zdCBleGlzdGluZ0xvYWRCYWxhbmNlciA9IG5ldyBlbGIuQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIoc3RhY2ssICdsb2FkLWJhbGFuY2VyJywge1xuICAgIHZwYyxcbiAgICBpbnRlcm5ldEZhY2luZzogdHJ1ZSxcbiAgICBsb2FkQmFsYW5jZXJOYW1lOiAndW5pcXVlLW5hbWUnXG4gIH0pO1xuXG4gIGNvbnN0IHRlc3RMaXN0ZW5lciA9IG5ldyBlbGIuQXBwbGljYXRpb25MaXN0ZW5lcihzdGFjaywgJ3Rlc3QtbGlzdGVuZXInLCB7XG4gICAgbG9hZEJhbGFuY2VyOiBleGlzdGluZ0xvYWRCYWxhbmNlcixcbiAgICBwcm90b2NvbDogZWxiLkFwcGxpY2F0aW9uUHJvdG9jb2wuSFRUUFxuICB9KTtcblxuICBkZWZhdWx0cy5BZGRUYXJnZXQoc3RhY2ssIHRhcmdldEdyb3VwLCB0ZXN0TGlzdGVuZXIpO1xuXG4gIGV4cGVjdChzdGFjaykudG9IYXZlUmVzb3VyY2VMaWtlKCdBV1M6OkVsYXN0aWNMb2FkQmFsYW5jaW5nVjI6Okxpc3RlbmVyJywge1xuICAgIERlZmF1bHRBY3Rpb25zOiBbXG4gICAgICB7XG4gICAgICAgIFRhcmdldEdyb3VwQXJuOiB7XG4gICAgICAgICAgUmVmOiBcInRlc3R0YXJnZXR0Z0IyRUU0MUNBXCJcbiAgICAgICAgfSxcbiAgICAgICAgVHlwZTogXCJmb3J3YXJkXCJcbiAgICAgIH1cbiAgICBdLFxuICB9KTtcbn0pO1xuXG50ZXN0KCdUZXN0IEFkZCBUYXJnZXQgd2l0aCBydWxlUHJvcHMnLCAoKSA9PiB7XG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG5cbiAgY29uc3QgdGVzdEZ1bmN0aW9uID0gbmV3IGxhbWJkYS5GdW5jdGlvbihzdGFjaywgJ3Rlc3QtZnVuY3Rpb24nLCB7XG4gICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbUFzc2V0KGAke19fZGlybmFtZX0vbGFtYmRhYCksXG4gICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzE0X1gsXG4gICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gIH0pO1xuXG4gIGNvbnN0IHRhcmdldEdyb3VwID0gZGVmYXVsdHMuQ3JlYXRlTGFtYmRhVGFyZ2V0R3JvdXAoc3RhY2ssICd0ZXN0LXRhcmdldCcsIHRlc3RGdW5jdGlvbiwge1xuICAgIHRhcmdldEdyb3VwTmFtZTogJ3Rlc3QtdGFyZ2V0LWdyb3VwJ1xuICB9KTtcblxuICBjb25zdCBzZWNvbmRUYXJnZXRHcm91cCA9IGRlZmF1bHRzLkNyZWF0ZUxhbWJkYVRhcmdldEdyb3VwKHN0YWNrLCAnc2Vjb25kLXRhcmdldCcsIHRlc3RGdW5jdGlvbiwge1xuICAgIHRhcmdldEdyb3VwTmFtZTogJ3NlY29uZC10YXJnZXQtZ3JvdXAnXG4gIH0pO1xuXG4gIC8vIEJ1aWxkIFZQQ1xuICBjb25zdCB2cGMgPSBkZWZhdWx0cy5idWlsZFZwYyhzdGFjaywge1xuICAgIGRlZmF1bHRWcGNQcm9wczogZGVmYXVsdHMuRGVmYXVsdFB1YmxpY1ByaXZhdGVWcGNQcm9wcygpLFxuICB9KTtcblxuICBjb25zdCBleGlzdGluZ0xvYWRCYWxhbmNlciA9IG5ldyBlbGIuQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIoc3RhY2ssICdsb2FkLWJhbGFuY2VyJywge1xuICAgIHZwYyxcbiAgICBpbnRlcm5ldEZhY2luZzogdHJ1ZSxcbiAgICBsb2FkQmFsYW5jZXJOYW1lOiAndW5pcXVlLW5hbWUnXG4gIH0pO1xuXG4gIGNvbnN0IHRlc3RMaXN0ZW5lciA9IG5ldyBlbGIuQXBwbGljYXRpb25MaXN0ZW5lcihzdGFjaywgJ3Rlc3QtbGlzdGVuZXInLCB7XG4gICAgbG9hZEJhbGFuY2VyOiBleGlzdGluZ0xvYWRCYWxhbmNlcixcbiAgICBwcm90b2NvbDogZWxiLkFwcGxpY2F0aW9uUHJvdG9jb2wuSFRUUFxuICB9KTtcblxuICAvLyBUaGUgZmlyc3QgdGFyZ2V0IGlzIGRlZmF1bHQgYW5kIGNhbid0IGhhdmUgcnVsZXMsIHNvXG4gIC8vIHdlIG5lZWQgdG8gYWRkIDIgdGFyZ2V0c1xuICBkZWZhdWx0cy5BZGRUYXJnZXQoc3RhY2ssIHRhcmdldEdyb3VwLCB0ZXN0TGlzdGVuZXIpO1xuICBkZWZhdWx0cy5BZGRUYXJnZXQoc3RhY2ssIHNlY29uZFRhcmdldEdyb3VwLCB0ZXN0TGlzdGVuZXIsIHtcbiAgICBjb25kaXRpb25zOiBbZWxiLkxpc3RlbmVyQ29uZGl0aW9uLnBhdGhQYXR0ZXJucyhbXCIqYWRtaW4qXCJdKV0sXG4gICAgcHJpb3JpdHk6IDEwXG4gIH0pO1xuXG4gIGV4cGVjdChzdGFjaykudG9IYXZlUmVzb3VyY2VMaWtlKCdBV1M6OkVsYXN0aWNMb2FkQmFsYW5jaW5nVjI6Okxpc3RlbmVyUnVsZScsIHtcbiAgICBBY3Rpb25zOiBbXG4gICAgICB7XG4gICAgICAgIFRhcmdldEdyb3VwQXJuOiB7XG4gICAgICAgICAgUmVmOiBcInNlY29uZHRhcmdldHRnMENFMzdFMUZcIlxuICAgICAgICB9LFxuICAgICAgICBUeXBlOiBcImZvcndhcmRcIlxuICAgICAgfVxuICAgIF0sXG4gICAgQ29uZGl0aW9uczogW1xuICAgICAge1xuICAgICAgICBGaWVsZDogXCJwYXRoLXBhdHRlcm5cIixcbiAgICAgICAgUGF0aFBhdHRlcm5Db25maWc6IHtcbiAgICAgICAgICBWYWx1ZXM6IFtcbiAgICAgICAgICAgIFwiKmFkbWluKlwiXG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgXVxuICB9KTtcbn0pO1xuXG50ZXN0KCdUZXN0IEFkZExpc3RlbmVyIHdpdGggZGVmYXVsdHMnLCAoKSA9PiB7XG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG4gIGNvbnN0IHRlc3RGdW5jdGlvbiA9IG5ldyBsYW1iZGEuRnVuY3Rpb24oc3RhY2ssICd0ZXN0LWZ1bmN0aW9uJywge1xuICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChgJHtfX2Rpcm5hbWV9L2xhbWJkYWApLFxuICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18xNF9YLFxuICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICB9KTtcblxuICBjb25zdCB0YXJnZXRHcm91cCA9IGRlZmF1bHRzLkNyZWF0ZUxhbWJkYVRhcmdldEdyb3VwKHN0YWNrLCAndGVzdC10YXJnZXQnLCB0ZXN0RnVuY3Rpb24sIHtcbiAgICB0YXJnZXRHcm91cE5hbWU6ICd0ZXN0LXRhcmdldC1ncm91cCdcbiAgfSk7XG5cbiAgLy8gQnVpbGQgVlBDXG4gIGNvbnN0IHZwYyA9IGRlZmF1bHRzLmJ1aWxkVnBjKHN0YWNrLCB7XG4gICAgZGVmYXVsdFZwY1Byb3BzOiBkZWZhdWx0cy5EZWZhdWx0UHVibGljUHJpdmF0ZVZwY1Byb3BzKCksXG4gIH0pO1xuXG4gIGNvbnN0IGV4aXN0aW5nTG9hZEJhbGFuY2VyID0gbmV3IGVsYi5BcHBsaWNhdGlvbkxvYWRCYWxhbmNlcihzdGFjaywgJ2xvYWQtYmFsYW5jZXInLCB7XG4gICAgdnBjLFxuICAgIGludGVybmV0RmFjaW5nOiB0cnVlLFxuICAgIGxvYWRCYWxhbmNlck5hbWU6ICd1bmlxdWUtbmFtZSdcbiAgfSk7XG5cbiAgY29uc3QgY2VydCA9IGFjbS5DZXJ0aWZpY2F0ZS5mcm9tQ2VydGlmaWNhdGVBcm4oXG4gICAgc3RhY2ssXG4gICAgJ25vdC1yZWFsbHktYS1jZXJ0JyxcbiAgICBcImFybjphd3M6YWNtOnVzLWVhc3QtMToxMjM0NTY3ODkwMTI6Y2VydGlmaWNhdGUvODVjNTJkYzgtMWIzNy00YWZkLWE3YWEtZjAzYWFjMmRiMGNjXCJcbiAgKTtcblxuICBkZWZhdWx0cy5BZGRMaXN0ZW5lcihzdGFjaywgZXhpc3RpbmdMb2FkQmFsYW5jZXIsIHRhcmdldEdyb3VwLCB7XG4gICAgY2VydGlmaWNhdGVzOiBbIGNlcnQgXSxcbiAgfSk7XG5cbiAgLy8gVGhpcyBzaG91bGQgY3JlYXRlIDIgbGlzdGVuZXJzLCBIVFRQUyBwbHVzIHJlZGlyZWN0IG9mIEhUVFBcbiAgZXhwZWN0KHN0YWNrKS50b0hhdmVSZXNvdXJjZUxpa2UoJ0FXUzo6RWxhc3RpY0xvYWRCYWxhbmNpbmdWMjo6TGlzdGVuZXInLCB7XG4gICAgUHJvdG9jb2w6ICdIVFRQUycsXG4gIH0pO1xuXG4gIGV4cGVjdChzdGFjaykudG9IYXZlUmVzb3VyY2VMaWtlKCdBV1M6OkVsYXN0aWNMb2FkQmFsYW5jaW5nVjI6Okxpc3RlbmVyJywge1xuICAgIFByb3RvY29sOiAnSFRUUCcsXG4gIH0pO1xufSk7XG5cbnRlc3QoJ1Rlc3QgQWRkTGlzdGVuZXIgd2l0aCBubyBjZXJ0IGZvciBhbiBIVFRQUyBsaXN0ZW5lcicsICgpID0+IHtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soKTtcbiAgY29uc3QgdGVzdEZ1bmN0aW9uID0gbmV3IGxhbWJkYS5GdW5jdGlvbihzdGFjaywgJ3Rlc3QtZnVuY3Rpb24nLCB7XG4gICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbUFzc2V0KGAke19fZGlybmFtZX0vbGFtYmRhYCksXG4gICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzE0X1gsXG4gICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gIH0pO1xuXG4gIGNvbnN0IHRhcmdldEdyb3VwID0gZGVmYXVsdHMuQ3JlYXRlTGFtYmRhVGFyZ2V0R3JvdXAoc3RhY2ssICd0ZXN0LXRhcmdldCcsIHRlc3RGdW5jdGlvbiwge1xuICAgIHRhcmdldEdyb3VwTmFtZTogJ3Rlc3QtdGFyZ2V0LWdyb3VwJ1xuICB9KTtcblxuICAvLyBCdWlsZCBWUENcbiAgY29uc3QgdnBjID0gZGVmYXVsdHMuYnVpbGRWcGMoc3RhY2ssIHtcbiAgICBkZWZhdWx0VnBjUHJvcHM6IGRlZmF1bHRzLkRlZmF1bHRQdWJsaWNQcml2YXRlVnBjUHJvcHMoKSxcbiAgfSk7XG5cbiAgY29uc3QgZXhpc3RpbmdMb2FkQmFsYW5jZXIgPSBuZXcgZWxiLkFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyKHN0YWNrLCAnbG9hZC1iYWxhbmNlcicsIHtcbiAgICB2cGMsXG4gICAgaW50ZXJuZXRGYWNpbmc6IHRydWUsXG4gICAgbG9hZEJhbGFuY2VyTmFtZTogJ3VuaXF1ZS1uYW1lJ1xuICB9KTtcblxuICBjb25zdCBhcHAgPSAoKSA9PiB7XG4gICAgZGVmYXVsdHMuQWRkTGlzdGVuZXIoc3RhY2ssIGV4aXN0aW5nTG9hZEJhbGFuY2VyLCB0YXJnZXRHcm91cCwge30pO1xuICB9O1xuICBleHBlY3QoYXBwKS50b1Rocm93RXJyb3IoKTtcbn0pO1xuXG50ZXN0KCdUZXN0IEFkZExpc3RlbmVyIGVycm9yIGZvciBIVFRQIHdpdGggYSBjZXJ0JywgKCkgPT4ge1xuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuICBjb25zdCB0ZXN0RnVuY3Rpb24gPSBuZXcgbGFtYmRhLkZ1bmN0aW9uKHN0YWNrLCAndGVzdC1mdW5jdGlvbicsIHtcbiAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQoYCR7X19kaXJuYW1lfS9sYW1iZGFgKSxcbiAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5OT0RFSlNfMTRfWCxcbiAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgfSk7XG5cbiAgY29uc3QgdGFyZ2V0R3JvdXAgPSBkZWZhdWx0cy5DcmVhdGVMYW1iZGFUYXJnZXRHcm91cChzdGFjaywgJ3Rlc3QtdGFyZ2V0JywgdGVzdEZ1bmN0aW9uLCB7XG4gICAgdGFyZ2V0R3JvdXBOYW1lOiAndGVzdC10YXJnZXQtZ3JvdXAnXG4gIH0pO1xuXG4gIC8vIEJ1aWxkIFZQQ1xuICBjb25zdCB2cGMgPSBkZWZhdWx0cy5idWlsZFZwYyhzdGFjaywge1xuICAgIGRlZmF1bHRWcGNQcm9wczogZGVmYXVsdHMuRGVmYXVsdFB1YmxpY1ByaXZhdGVWcGNQcm9wcygpLFxuICB9KTtcblxuICBjb25zdCBleGlzdGluZ0xvYWRCYWxhbmNlciA9IG5ldyBlbGIuQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIoc3RhY2ssICdsb2FkLWJhbGFuY2VyJywge1xuICAgIHZwYyxcbiAgICBpbnRlcm5ldEZhY2luZzogdHJ1ZSxcbiAgICBsb2FkQmFsYW5jZXJOYW1lOiAndW5pcXVlLW5hbWUnXG4gIH0pO1xuXG4gIGNvbnN0IGNlcnQgPSBhY20uQ2VydGlmaWNhdGUuZnJvbUNlcnRpZmljYXRlQXJuKFxuICAgIHN0YWNrLFxuICAgICdub3QtcmVhbGx5LWEtY2VydCcsXG4gICAgXCJhcm46YXdzOmFjbTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmNlcnRpZmljYXRlLzg1YzUyZGM4LTFiMzctNGFmZC1hN2FhLWYwM2FhYzJkYjBjY1wiXG4gICk7XG5cbiAgY29uc3QgYXBwID0gKCkgPT4ge1xuICAgIGRlZmF1bHRzLkFkZExpc3RlbmVyKHN0YWNrLCBleGlzdGluZ0xvYWRCYWxhbmNlciwgdGFyZ2V0R3JvdXAsIHtcbiAgICAgIGNlcnRpZmljYXRlczogWyBjZXJ0IF0sXG4gICAgICBwcm90b2NvbDogZWxiLkFwcGxpY2F0aW9uUHJvdG9jb2wuSFRUUCxcbiAgICB9KTtcbiAgfTtcbiAgZXhwZWN0KGFwcCkudG9UaHJvd0Vycm9yKCk7XG5cbn0pO1xuXG50ZXN0KCdUZXN0IEFkZExpc3RlbmVyIGZvciBIVFRQIExpc3RlbmVyJywgKCkgPT4ge1xuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuICBjb25zdCB0ZXN0RnVuY3Rpb24gPSBuZXcgbGFtYmRhLkZ1bmN0aW9uKHN0YWNrLCAndGVzdC1mdW5jdGlvbicsIHtcbiAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQoYCR7X19kaXJuYW1lfS9sYW1iZGFgKSxcbiAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5OT0RFSlNfMTRfWCxcbiAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgfSk7XG5cbiAgY29uc3QgdGFyZ2V0R3JvdXAgPSBkZWZhdWx0cy5DcmVhdGVMYW1iZGFUYXJnZXRHcm91cChzdGFjaywgJ3Rlc3QtdGFyZ2V0JywgdGVzdEZ1bmN0aW9uLCB7XG4gICAgdGFyZ2V0R3JvdXBOYW1lOiAndGVzdC10YXJnZXQtZ3JvdXAnXG4gIH0pO1xuXG4gIC8vIEJ1aWxkIFZQQ1xuICBjb25zdCB2cGMgPSBkZWZhdWx0cy5idWlsZFZwYyhzdGFjaywge1xuICAgIGRlZmF1bHRWcGNQcm9wczogZGVmYXVsdHMuRGVmYXVsdFB1YmxpY1ByaXZhdGVWcGNQcm9wcygpLFxuICB9KTtcblxuICBjb25zdCBleGlzdGluZ0xvYWRCYWxhbmNlciA9IG5ldyBlbGIuQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIoc3RhY2ssICdsb2FkLWJhbGFuY2VyJywge1xuICAgIHZwYyxcbiAgICBpbnRlcm5ldEZhY2luZzogdHJ1ZSxcbiAgICBsb2FkQmFsYW5jZXJOYW1lOiAndW5pcXVlLW5hbWUnXG4gIH0pO1xuXG4gIGRlZmF1bHRzLkFkZExpc3RlbmVyKHN0YWNrLCBleGlzdGluZ0xvYWRCYWxhbmNlciwgdGFyZ2V0R3JvdXAsIHtcbiAgICBwcm90b2NvbDogZWxiLkFwcGxpY2F0aW9uUHJvdG9jb2wuSFRUUCxcbiAgfSk7XG5cbiAgZXhwZWN0KHN0YWNrKS50b0hhdmVSZXNvdXJjZUxpa2UoJ0FXUzo6RWxhc3RpY0xvYWRCYWxhbmNpbmdWMjo6TGlzdGVuZXInLCB7XG4gICAgUHJvdG9jb2w6ICdIVFRQJyxcbiAgfSk7XG4gIGV4cGVjdChzdGFjaykubm90LnRvSGF2ZVJlc291cmNlTGlrZSgnQVdTOjpFbGFzdGljTG9hZEJhbGFuY2luZ1YyOjpMaXN0ZW5lcicsIHtcbiAgICBQcm90b2NvbDogJ0hUVFBTJyxcbiAgfSk7XG59KTtcblxudGVzdCgnVGVzdCB3aXRoIGN1c3RvbSBsb2dnaW5nIGJ1Y2tldCBwcm9wcycsICgpID0+IHtcbiAgLy8gQ3JlYXRpbmcgQUxCIGxvZ2dpbmcgcmVxdWlyZXMgYSByZWdpb24gYW5kIGFjY291bnQgKGJ1dFxuICAvLyB0aGVzZSBjYW4gYmUgZmFrZSBpbiB1bml0IHRlc3RzKVxuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjayh1bmRlZmluZWQsIHVuZGVmaW5lZCwge1xuICAgIGVudjogeyBhY2NvdW50OiBcIjEyMzQ1Njc4OTAxMlwiLCByZWdpb246ICd1cy1lYXN0LTEnIH0sXG4gIH0pO1xuICAvLyBCdWlsZCBWUENcbiAgY29uc3QgdnBjID0gZGVmYXVsdHMuYnVpbGRWcGMoc3RhY2ssIHtcbiAgICBkZWZhdWx0VnBjUHJvcHM6IGRlZmF1bHRzLkRlZmF1bHRQdWJsaWNQcml2YXRlVnBjUHJvcHMoKSxcbiAgfSk7XG5cbiAgY29uc3QgdGVzdE5hbWUgPSAndGVzdC1uYW1lJztcblxuICBkZWZhdWx0cy5PYnRhaW5BbGIoc3RhY2ssICd0ZXN0JywgdnBjLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHRydWUsIHsgYnVja2V0TmFtZTogdGVzdE5hbWUgfSk7XG4gIGV4cGVjdChzdGFjaykudG9IYXZlUmVzb3VyY2VMaWtlKCdBV1M6OlMzOjpCdWNrZXQnLCB7XG4gICAgQnVja2V0TmFtZTogdGVzdE5hbWVcbiAgfSk7XG59KTtcblxudGVzdCgnVGVzdCB3aXRoIG5vIGxvZ2dpbmcnLCAoKSA9PiB7XG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG4gIC8vIEJ1aWxkIFZQQ1xuICBjb25zdCB2cGMgPSBkZWZhdWx0cy5idWlsZFZwYyhzdGFjaywge1xuICAgIGRlZmF1bHRWcGNQcm9wczogZGVmYXVsdHMuRGVmYXVsdFB1YmxpY1ByaXZhdGVWcGNQcm9wcygpLFxuICB9KTtcblxuICBkZWZhdWx0cy5PYnRhaW5BbGIoc3RhY2ssICd0ZXN0JywgdnBjLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGZhbHNlKTtcbiAgZXhwZWN0KHN0YWNrKS5ub3QudG9IYXZlUmVzb3VyY2VMaWtlKCdBV1M6OlMzOjpCdWNrZXQnLCB7fSk7XG59KTtcbiJdfQ==
|