aws-cdk 2.6.0 → 2.10.0
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/README.md +8 -1
- package/bin/cdk.js +22 -6
- package/build-info.json +2 -2
- package/lib/api/aws-auth/sdk-provider.d.ts +26 -1
- package/lib/api/aws-auth/sdk-provider.js +4 -4
- package/lib/api/aws-auth/sdk.d.ts +2 -0
- package/lib/api/aws-auth/sdk.js +4 -1
- package/lib/api/bootstrap/deploy-bootstrap.js +14 -3
- package/lib/api/cloudformation-deployments.d.ts +63 -1
- package/lib/api/cloudformation-deployments.js +74 -4
- package/lib/api/cxapp/cloud-assembly.js +5 -5
- package/lib/api/deploy-stack.d.ts +0 -1
- package/lib/api/deploy-stack.js +8 -9
- package/lib/api/{hotswap/evaluate-cloudformation-template.d.ts → evaluate-cloudformation-template.d.ts} +14 -1
- package/lib/api/evaluate-cloudformation-template.js +289 -0
- package/lib/api/hotswap/code-build-projects.d.ts +1 -1
- package/lib/api/hotswap/code-build-projects.js +2 -2
- package/lib/api/hotswap/common.d.ts +0 -6
- package/lib/api/hotswap/common.js +2 -19
- package/lib/api/hotswap/ecs-services.d.ts +1 -1
- package/lib/api/hotswap/ecs-services.js +2 -2
- package/lib/api/hotswap/lambda-functions.d.ts +1 -1
- package/lib/api/hotswap/lambda-functions.js +116 -15
- package/lib/api/hotswap/s3-bucket-deployments.d.ts +1 -1
- package/lib/api/hotswap/s3-bucket-deployments.js +1 -1
- package/lib/api/hotswap/stepfunctions-state-machines.d.ts +1 -1
- package/lib/api/hotswap/stepfunctions-state-machines.js +1 -1
- package/lib/api/hotswap-deployments.js +9 -35
- package/lib/api/logs/find-cloudwatch-logs.d.ts +24 -0
- package/lib/api/logs/find-cloudwatch-logs.js +84 -0
- package/lib/api/logs/logs-monitor.d.ts +53 -0
- package/lib/api/logs/logs-monitor.js +163 -0
- package/lib/api/toolkit-info.d.ts +5 -5
- package/lib/api/toolkit-info.js +10 -10
- package/lib/api/util/cloudformation/stack-activity-monitor.js +22 -22
- package/lib/assets.js +3 -3
- package/lib/cdk-toolkit.d.ts +15 -0
- package/lib/cdk-toolkit.js +30 -20
- package/lib/commands/context.js +7 -7
- package/lib/commands/docs.js +4 -4
- package/lib/commands/doctor.js +6 -6
- package/lib/context-providers/ami.js +2 -2
- package/lib/context-providers/availability-zones.js +2 -2
- package/lib/context-providers/endpoint-service-availability-zones.js +2 -2
- package/lib/context-providers/hosted-zones.js +2 -2
- package/lib/context-providers/keys.js +2 -2
- package/lib/context-providers/load-balancers.js +3 -3
- package/lib/context-providers/security-groups.js +2 -2
- package/lib/context-providers/ssm-parameters.js +2 -2
- package/lib/context-providers/vpcs.js +2 -2
- package/lib/diff.js +3 -3
- package/lib/init-templates/v1/app/csharp/cdk.template.json +1 -1
- package/lib/init-templates/v1/app/fsharp/cdk.template.json +1 -1
- package/lib/init-templates/v1/sample-app/csharp/cdk.template.json +1 -1
- package/lib/init-templates/v1/sample-app/fsharp/cdk.template.json +1 -1
- package/lib/init-templates/v2/app/csharp/cdk.template.json +1 -1
- package/lib/init-templates/v2/app/fsharp/cdk.template.json +1 -1
- package/lib/init-templates/v2/sample-app/csharp/cdk.template.json +1 -1
- package/lib/init-templates/v2/sample-app/fsharp/cdk.template.json +1 -1
- package/lib/init.js +14 -14
- package/lib/logging.js +7 -7
- package/lib/os.js +3 -3
- package/lib/plugin.js +4 -4
- package/lib/util/asset-publishing.js +3 -3
- package/lib/util/console-formatters.js +4 -3
- package/lib/version.js +3 -3
- package/npm-shrinkwrap.json +101 -106
- package/package.json +22 -21
- package/test/api/bootstrap2.test.js +2 -3
- package/test/api/cloudformation-deployments.test.js +2 -2
- package/test/api/hotswap/hotswap-deployments.test.js +2 -2
- package/test/api/hotswap/hotswap-test-setup.d.ts +6 -1
- package/test/api/hotswap/hotswap-test-setup.js +19 -3
- package/test/api/hotswap/lambda-functions-docker-hotswap-deployments.test.d.ts +1 -0
- package/test/api/hotswap/lambda-functions-docker-hotswap-deployments.test.js +121 -0
- package/test/api/hotswap/lambda-functions-hotswap-deployments.test.js +175 -2
- package/test/api/hotswap/lambda-functions-inline-hotswap-deployments.test.d.ts +1 -0
- package/test/api/hotswap/lambda-functions-inline-hotswap-deployments.test.js +139 -0
- package/test/api/hotswap/lambda-versions-aliases-hotswap-deployments.test.js +2 -2
- package/test/api/logs/find-cloudwatch-logs.test.d.ts +1 -0
- package/test/api/logs/find-cloudwatch-logs.test.js +264 -0
- package/test/api/logs/logs-monitor.test.d.ts +1 -0
- package/test/api/logs/logs-monitor.test.js +55 -0
- package/test/api/sdk-provider.test.js +11 -11
- package/test/api/stack-activity-monitor.test.js +13 -13
- package/test/cdk-toolkit.test.js +271 -10
- package/test/context-providers/load-balancers.test.js +4 -4
- package/test/util/cloudformation.test.js +2 -2
- package/test/util/console-formatters.test.js +6 -6
- package/test/util/mock-sdk.d.ts +11 -3
- package/test/util/mock-sdk.js +14 -4
- package/test/util/mock-toolkitinfo.js +2 -2
- package/lib/api/hotswap/evaluate-cloudformation-template.js +0 -247
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const find_cloudwatch_logs_1 = require("../../../lib/api/logs/find-cloudwatch-logs");
|
|
4
|
+
const util_1 = require("../../util");
|
|
5
|
+
const mock_sdk_1 = require("../../util/mock-sdk");
|
|
6
|
+
let logsMockSdkProvider;
|
|
7
|
+
let mockGetEndpointSuffix;
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
logsMockSdkProvider = new LogsMockSdkProvider();
|
|
10
|
+
mockGetEndpointSuffix = jest.fn(() => 'amazonaws.com');
|
|
11
|
+
logsMockSdkProvider.stubGetEndpointSuffix(mockGetEndpointSuffix);
|
|
12
|
+
// clear the array
|
|
13
|
+
currentCfnStackResources.splice(0);
|
|
14
|
+
});
|
|
15
|
+
test('add log groups from lambda function', async () => {
|
|
16
|
+
// GIVEN
|
|
17
|
+
const cdkStackArtifact = cdkStackArtifactOf({
|
|
18
|
+
template: {
|
|
19
|
+
Resources: {
|
|
20
|
+
Func: {
|
|
21
|
+
Type: 'AWS::Lambda::Function',
|
|
22
|
+
Properties: {
|
|
23
|
+
FunctionName: 'my-function',
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
pushStackResourceSummaries(stackSummaryOf('Func', 'AWS::Lambda::Function', 'my-function'));
|
|
30
|
+
// WHEN
|
|
31
|
+
const result = await find_cloudwatch_logs_1.findCloudWatchLogGroups(logsMockSdkProvider.mockSdkProvider, cdkStackArtifact);
|
|
32
|
+
// THEN
|
|
33
|
+
expect(result.logGroupNames).toEqual(['/aws/lambda/my-function']);
|
|
34
|
+
});
|
|
35
|
+
test('add log groups from lambda function without physical name', async () => {
|
|
36
|
+
// GIVEN
|
|
37
|
+
const cdkStackArtifact = cdkStackArtifactOf({
|
|
38
|
+
template: {
|
|
39
|
+
Resources: {
|
|
40
|
+
Func: {
|
|
41
|
+
Type: 'AWS::Lambda::Function',
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
pushStackResourceSummaries(stackSummaryOf('Func', 'AWS::Lambda::Function', 'my-function'));
|
|
47
|
+
// WHEN
|
|
48
|
+
const result = await find_cloudwatch_logs_1.findCloudWatchLogGroups(logsMockSdkProvider.mockSdkProvider, cdkStackArtifact);
|
|
49
|
+
// THEN
|
|
50
|
+
expect(result.logGroupNames).toEqual(['/aws/lambda/my-function']);
|
|
51
|
+
});
|
|
52
|
+
test('empty template', async () => {
|
|
53
|
+
// GIVEN
|
|
54
|
+
const cdkStackArtifact = cdkStackArtifactOf({
|
|
55
|
+
template: {},
|
|
56
|
+
});
|
|
57
|
+
// WHEN
|
|
58
|
+
const result = await find_cloudwatch_logs_1.findCloudWatchLogGroups(logsMockSdkProvider.mockSdkProvider, cdkStackArtifact);
|
|
59
|
+
// THEN
|
|
60
|
+
expect(result.logGroupNames).toEqual([]);
|
|
61
|
+
});
|
|
62
|
+
test('add log groups from ECS Task Definitions', async () => {
|
|
63
|
+
// GIVEN
|
|
64
|
+
const cdkStackArtifact = cdkStackArtifactOf({
|
|
65
|
+
template: {
|
|
66
|
+
Resources: {
|
|
67
|
+
LogGroup: {
|
|
68
|
+
Type: 'AWS::Logs::LogGroup',
|
|
69
|
+
Properties: {
|
|
70
|
+
LogGroupName: 'log_group',
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
Def: {
|
|
74
|
+
Type: 'AWS::ECS::TaskDefinition',
|
|
75
|
+
Properties: {
|
|
76
|
+
Family: 'app',
|
|
77
|
+
ContainerDefinitions: [
|
|
78
|
+
{
|
|
79
|
+
LogConfiguration: {
|
|
80
|
+
LogDriver: 'awslogs',
|
|
81
|
+
Options: {
|
|
82
|
+
'awslogs-group': { Ref: 'LogGroup' },
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
],
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
pushStackResourceSummaries(stackSummaryOf('LogGroup', 'AWS::Logs::LogGroup', 'log_group'));
|
|
93
|
+
// WHEN
|
|
94
|
+
const result = await find_cloudwatch_logs_1.findCloudWatchLogGroups(logsMockSdkProvider.mockSdkProvider, cdkStackArtifact);
|
|
95
|
+
// THEN
|
|
96
|
+
expect(result.logGroupNames).toEqual(['log_group']);
|
|
97
|
+
});
|
|
98
|
+
test('add log groups from State Machines', async () => {
|
|
99
|
+
// GIVEN
|
|
100
|
+
const cdkStackArtifact = cdkStackArtifactOf({
|
|
101
|
+
template: {
|
|
102
|
+
Resources: {
|
|
103
|
+
LogGroup: {
|
|
104
|
+
Type: 'AWS::Logs::LogGroup',
|
|
105
|
+
Properties: {
|
|
106
|
+
LogGroupName: 'log_group',
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
Def: {
|
|
110
|
+
Type: 'AWS::StepFunctions::StateMachine',
|
|
111
|
+
Properties: {
|
|
112
|
+
LoggingConfiguration: {
|
|
113
|
+
Destinations: [
|
|
114
|
+
{
|
|
115
|
+
CloudWatchLogsLogGroup: {
|
|
116
|
+
LogGroupArn: {
|
|
117
|
+
'Fn::GetAtt': ['LogGroup', 'Arn'],
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
],
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
pushStackResourceSummaries(stackSummaryOf('LogGroup', 'AWS::Logs::LogGroup', 'log_group'));
|
|
129
|
+
// WHEN
|
|
130
|
+
const result = await find_cloudwatch_logs_1.findCloudWatchLogGroups(logsMockSdkProvider.mockSdkProvider, cdkStackArtifact);
|
|
131
|
+
// THEN
|
|
132
|
+
expect(result.logGroupNames).toEqual(['log_group']);
|
|
133
|
+
});
|
|
134
|
+
test('excluded log groups are not added', async () => {
|
|
135
|
+
// GIVEN
|
|
136
|
+
const cdkStackArtifact = cdkStackArtifactOf({
|
|
137
|
+
template: {
|
|
138
|
+
Resources: {
|
|
139
|
+
LogGroup: {
|
|
140
|
+
Type: 'AWS::Logs::LogGroup',
|
|
141
|
+
Properties: {
|
|
142
|
+
LogGroupName: 'log_group',
|
|
143
|
+
},
|
|
144
|
+
},
|
|
145
|
+
LogGroup2: {
|
|
146
|
+
Type: 'AWS::Logs::LogGroup',
|
|
147
|
+
Properties: {
|
|
148
|
+
LogGroupName: 'log_group2',
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
Def: {
|
|
152
|
+
Type: 'AWS::CodeBuild::Project',
|
|
153
|
+
Properties: {
|
|
154
|
+
PojectName: 'project',
|
|
155
|
+
LogsConfig: {
|
|
156
|
+
CloudWatchLogs: {
|
|
157
|
+
GroupName: { Ref: 'LogGroup' },
|
|
158
|
+
},
|
|
159
|
+
},
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
FlowLog: {
|
|
163
|
+
Type: 'AWS::EC2::FlowLog',
|
|
164
|
+
Properties: {
|
|
165
|
+
LogDestination: { Ref: 'LogGroup' },
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
FlowLog2: {
|
|
169
|
+
Type: 'AWS::EC2::FlowLog',
|
|
170
|
+
Properties: {
|
|
171
|
+
LogDestination: {
|
|
172
|
+
'Fn::GetAtt': ['LogGroup2', 'Arn'],
|
|
173
|
+
},
|
|
174
|
+
},
|
|
175
|
+
},
|
|
176
|
+
},
|
|
177
|
+
},
|
|
178
|
+
});
|
|
179
|
+
pushStackResourceSummaries(stackSummaryOf('LogGroup', 'AWS::Logs::LogGroup', 'log_group'));
|
|
180
|
+
pushStackResourceSummaries(stackSummaryOf('LogGroup2', 'AWS::Logs::LogGroup', 'log_group2'));
|
|
181
|
+
pushStackResourceSummaries(stackSummaryOf('FlowLog', 'AWS::EC2::FlowLog', 'flow_log'));
|
|
182
|
+
pushStackResourceSummaries(stackSummaryOf('FlowLog2', 'AWS::EC2::FlowLog', 'flow_log2'));
|
|
183
|
+
pushStackResourceSummaries(stackSummaryOf('Def', 'AWS::CodeBuild:Project', 'project'));
|
|
184
|
+
// WHEN
|
|
185
|
+
const result = await find_cloudwatch_logs_1.findCloudWatchLogGroups(logsMockSdkProvider.mockSdkProvider, cdkStackArtifact);
|
|
186
|
+
// THEN
|
|
187
|
+
expect(result.logGroupNames).toEqual([]);
|
|
188
|
+
});
|
|
189
|
+
test('unassociated log groups are added', async () => {
|
|
190
|
+
// GIVEN
|
|
191
|
+
const cdkStackArtifact = cdkStackArtifactOf({
|
|
192
|
+
template: {
|
|
193
|
+
Resources: {
|
|
194
|
+
LogGroup: {
|
|
195
|
+
Type: 'AWS::Logs::LogGroup',
|
|
196
|
+
Properties: {
|
|
197
|
+
LogGroupName: 'log_group',
|
|
198
|
+
},
|
|
199
|
+
},
|
|
200
|
+
},
|
|
201
|
+
},
|
|
202
|
+
});
|
|
203
|
+
pushStackResourceSummaries(stackSummaryOf('LogGroup', 'AWS::Logs::LogGroup', 'log_group'));
|
|
204
|
+
// WHEN
|
|
205
|
+
const result = await find_cloudwatch_logs_1.findCloudWatchLogGroups(logsMockSdkProvider.mockSdkProvider, cdkStackArtifact);
|
|
206
|
+
// THEN
|
|
207
|
+
expect(result.logGroupNames).toEqual(['log_group']);
|
|
208
|
+
});
|
|
209
|
+
test('log groups without physical names are added', async () => {
|
|
210
|
+
// GIVEN
|
|
211
|
+
const cdkStackArtifact = cdkStackArtifactOf({
|
|
212
|
+
template: {
|
|
213
|
+
Resources: {
|
|
214
|
+
LogGroup: {
|
|
215
|
+
Type: 'AWS::Logs::LogGroup',
|
|
216
|
+
},
|
|
217
|
+
},
|
|
218
|
+
},
|
|
219
|
+
});
|
|
220
|
+
pushStackResourceSummaries(stackSummaryOf('LogGroup', 'AWS::Logs::LogGroup', 'log_group'));
|
|
221
|
+
// WHEN
|
|
222
|
+
const result = await find_cloudwatch_logs_1.findCloudWatchLogGroups(logsMockSdkProvider.mockSdkProvider, cdkStackArtifact);
|
|
223
|
+
// THEN
|
|
224
|
+
expect(result.logGroupNames).toEqual(['log_group']);
|
|
225
|
+
});
|
|
226
|
+
const STACK_NAME = 'withouterrors';
|
|
227
|
+
const currentCfnStackResources = [];
|
|
228
|
+
function pushStackResourceSummaries(...items) {
|
|
229
|
+
currentCfnStackResources.push(...items);
|
|
230
|
+
}
|
|
231
|
+
function stackSummaryOf(logicalId, resourceType, physicalResourceId) {
|
|
232
|
+
return {
|
|
233
|
+
LogicalResourceId: logicalId,
|
|
234
|
+
PhysicalResourceId: physicalResourceId,
|
|
235
|
+
ResourceType: resourceType,
|
|
236
|
+
ResourceStatus: 'CREATE_COMPLETE',
|
|
237
|
+
LastUpdatedTimestamp: new Date(),
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
function cdkStackArtifactOf(testStackArtifact = {}) {
|
|
241
|
+
return util_1.testStack({
|
|
242
|
+
stackName: STACK_NAME,
|
|
243
|
+
...testStackArtifact,
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
class LogsMockSdkProvider {
|
|
247
|
+
constructor() {
|
|
248
|
+
this.mockSdkProvider = new mock_sdk_1.MockSdkProvider({ realSdk: false });
|
|
249
|
+
this.mockSdkProvider.stubCloudFormation({
|
|
250
|
+
listStackResources: ({ StackName: stackName }) => {
|
|
251
|
+
if (stackName !== STACK_NAME) {
|
|
252
|
+
throw new Error(`Expected Stack name in listStackResources() call to be: '${STACK_NAME}', but received: ${stackName}'`);
|
|
253
|
+
}
|
|
254
|
+
return {
|
|
255
|
+
StackResourceSummaries: currentCfnStackResources,
|
|
256
|
+
};
|
|
257
|
+
},
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
stubGetEndpointSuffix(stub) {
|
|
261
|
+
this.mockSdkProvider.stubGetEndpointSuffix(stub);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmluZC1jbG91ZHdhdGNoLWxvZ3MudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImZpbmQtY2xvdWR3YXRjaC1sb2dzLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQSxxRkFBcUY7QUFDckYscUNBQTBEO0FBQzFELGtEQUFzRDtBQUV0RCxJQUFJLG1CQUF3QyxDQUFDO0FBQzdDLElBQUkscUJBQW1DLENBQUM7QUFFeEMsVUFBVSxDQUFDLEdBQUcsRUFBRTtJQUNkLG1CQUFtQixHQUFHLElBQUksbUJBQW1CLEVBQUUsQ0FBQztJQUNoRCxxQkFBcUIsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3ZELG1CQUFtQixDQUFDLHFCQUFxQixDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDakUsa0JBQWtCO0lBQ2xCLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQyxDQUFDLENBQUMsQ0FBQztBQUVILElBQUksQ0FBQyxxQ0FBcUMsRUFBRSxLQUFLLElBQUksRUFBRTtJQUNyRCxRQUFRO0lBQ1IsTUFBTSxnQkFBZ0IsR0FBRyxrQkFBa0IsQ0FBQztRQUMxQyxRQUFRLEVBQUU7WUFDUixTQUFTLEVBQUU7Z0JBQ1QsSUFBSSxFQUFFO29CQUNKLElBQUksRUFBRSx1QkFBdUI7b0JBQzdCLFVBQVUsRUFBRTt3QkFDVixZQUFZLEVBQUUsYUFBYTtxQkFDNUI7aUJBQ0Y7YUFDRjtTQUNGO0tBQ0YsQ0FBQyxDQUFDO0lBQ0gsMEJBQTBCLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSx1QkFBdUIsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBRTNGLE9BQU87SUFDUCxNQUFNLE1BQU0sR0FBRyxNQUFNLDhDQUF1QixDQUFDLG1CQUFtQixDQUFDLGVBQWUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBRXBHLE9BQU87SUFDUCxNQUFNLENBQUMsTUFBTSxDQUFD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Q0FBQyxlQUFlLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY3hhcGkgZnJvbSAnQGF3cy1jZGsvY3gtYXBpJztcbmltcG9ydCB7IENsb3VkRm9ybWF0aW9uIH0gZnJvbSAnYXdzLXNkayc7XG5pbXBvcnQgeyBmaW5kQ2xvdWRXYXRjaExvZ0dyb3VwcyB9IGZyb20gJy4uLy4uLy4uL2xpYi9hcGkvbG9ncy9maW5kLWNsb3Vkd2F0Y2gtbG9ncyc7XG5pbXBvcnQgeyB0ZXN0U3RhY2ssIFRlc3RTdGFja0FydGlmYWN0IH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgeyBNb2NrU2RrUHJvdmlkZXIgfSBmcm9tICcuLi8uLi91dGlsL21vY2stc2RrJztcblxubGV0IGxvZ3NNb2NrU2RrUHJvdmlkZXI6IExvZ3NNb2NrU2RrUHJvdmlkZXI7XG5sZXQgbW9ja0dldEVuZHBvaW50U3VmZml4OiAoKSA9PiBzdHJpbmc7XG5cbmJlZm9yZUVhY2goKCkgPT4ge1xuICBsb2dzTW9ja1Nka1Byb3ZpZGVyID0gbmV3IExvZ3NNb2NrU2RrUHJvdmlkZXIoKTtcbiAgbW9ja0dldEVuZHBvaW50U3VmZml4ID0gamVzdC5mbigoKSA9PiAnYW1hem9uYXdzLmNvbScpO1xuICBsb2dzTW9ja1Nka1Byb3ZpZGVyLnN0dWJHZXRFbmRwb2ludFN1ZmZpeChtb2NrR2V0RW5kcG9pbnRTdWZmaXgpO1xuICAvLyBjbGVhciB0aGUgYXJyYXlcbiAgY3VycmVudENmblN0YWNrUmVzb3VyY2VzLnNwbGljZSgwKTtcbn0pO1xuXG50ZXN0KCdhZGQgbG9nIGdyb3VwcyBmcm9tIGxhbWJkYSBmdW5jdGlvbicsIGFzeW5jICgpID0+IHtcbiAgLy8gR0lWRU5cbiAgY29uc3QgY2RrU3RhY2tBcnRpZmFjdCA9IGNka1N0YWNrQXJ0aWZhY3RPZih7XG4gICAgdGVtcGxhdGU6IHtcbiAgICAgIFJlc291cmNlczoge1xuICAgICAgICBGdW5jOiB7XG4gICAgICAgICAgVHlwZTogJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicsXG4gICAgICAgICAgUHJvcGVydGllczoge1xuICAgICAgICAgICAgRnVuY3Rpb25OYW1lOiAnbXktZnVuY3Rpb24nLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0pO1xuICBwdXNoU3RhY2tSZXNvdXJjZVN1bW1hcmllcyhzdGFja1N1bW1hcnlPZignRnVuYycsICdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLCAnbXktZnVuY3Rpb24nKSk7XG5cbiAgLy8gV0hFTlxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBmaW5kQ2xvdWRXYXRjaExvZ0dyb3Vwcyhsb2dzTW9ja1Nka1Byb3ZpZGVyLm1vY2tTZGtQcm92aWRlciwgY2RrU3RhY2tBcnRpZmFjdCk7XG5cbiAgLy8gVEhFTlxuICBleHBlY3QocmVzdWx0LmxvZ0dyb3VwTmFtZXMpLnRvRXF1YWwoWycvYXdzL2xhbWJkYS9teS1mdW5jdGlvbiddKTtcbn0pO1xuXG50ZXN0KCdhZGQgbG9nIGdyb3VwcyBmcm9tIGxhbWJkYSBmdW5jdGlvbiB3aXRob3V0IHBoeXNpY2FsIG5hbWUnLCBhc3luYyAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IGNka1N0YWNrQXJ0aWZhY3QgPSBjZGtTdGFja0FydGlmYWN0T2Yoe1xuICAgIHRlbXBsYXRlOiB7XG4gICAgICBSZXNvdXJjZXM6IHtcbiAgICAgICAgRnVuYzoge1xuICAgICAgICAgIFR5cGU6ICdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9KTtcbiAgcHVzaFN0YWNrUmVzb3VyY2VTdW1tYXJpZXMoc3RhY2tTdW1tYXJ5T2YoJ0Z1bmMnLCAnQVdTOjpMYW1iZGE6OkZ1bmN0aW9uJywgJ215LWZ1bmN0aW9uJykpO1xuXG4gIC8vIFdIRU5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmluZENsb3VkV2F0Y2hMb2dHcm91cHMobG9nc01vY2tTZGtQcm92aWRlci5tb2NrU2RrUHJvdmlkZXIsIGNka1N0YWNrQXJ0aWZhY3QpO1xuXG4gIC8vIFRIRU5cbiAgZXhwZWN0KHJlc3VsdC5sb2dHcm91cE5hbWVzKS50b0VxdWFsKFsnL2F3cy9sYW1iZGEvbXktZnVuY3Rpb24nXSk7XG59KTtcblxudGVzdCgnZW1wdHkgdGVtcGxhdGUnLCBhc3luYyAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IGNka1N0YWNrQXJ0aWZhY3QgPSBjZGtTdGFja0FydGlmYWN0T2Yoe1xuICAgIHRlbXBsYXRlOiB7fSxcbiAgfSk7XG5cbiAgLy8gV0hFTlxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBmaW5kQ2xvdWRXYXRjaExvZ0dyb3Vwcyhsb2dzTW9ja1Nka1Byb3ZpZGVyLm1vY2tTZGtQcm92aWRlciwgY2RrU3RhY2tBcnRpZmFjdCk7XG5cbiAgLy8gVEhFTlxuICBleHBlY3QocmVzdWx0LmxvZ0dyb3VwTmFtZXMpLnRvRXF1YWwoW10pO1xufSk7XG5cbnRlc3QoJ2FkZCBsb2cgZ3JvdXBzIGZyb20gRUNTIFRhc2sgRGVmaW5pdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IGNka1N0YWNrQXJ0aWZhY3QgPSBjZGtTdGFja0FydGlmYWN0T2Yoe1xuICAgIHRlbXBsYXRlOiB7XG4gICAgICBSZXNvdXJjZXM6IHtcbiAgICAgICAgTG9nR3JvdXA6IHtcbiAgICAgICAgICBUeXBlOiAnQVdTOjpMb2dzOjpMb2dHcm91cCcsXG4gICAgICAgICAgUHJvcGVydGllczoge1xuICAgICAgICAgICAgTG9nR3JvdXBOYW1lOiAnbG9nX2dyb3VwJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBEZWY6IHtcbiAgICAgICAgICBUeXBlOiAnQVdTOjpFQ1M6OlRhc2tEZWZpbml0aW9uJyxcbiAgICAgICAgICBQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBGYW1pbHk6ICdhcHAnLFxuICAgICAgICAgICAgQ29udGFpbmVyRGVmaW5pdGlvbnM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIExvZ0NvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICAgICAgICAgIExvZ0RyaXZlcjogJ2F3c2xvZ3MnLFxuICAgICAgICAgICAgICAgICAgT3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICAnYXdzbG9ncy1ncm91cCc6IHsgUmVmOiAnTG9nR3JvdXAnIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0pO1xuICBwdXNoU3RhY2tSZXNvdXJjZVN1bW1hcmllcyhzdGFja1N1bW1hcnlPZignTG9nR3JvdXAnLCAnQVdTOjpMb2dzOjpMb2dHcm91cCcsICdsb2dfZ3JvdXAnKSk7XG5cbiAgLy8gV0hFTlxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBmaW5kQ2xvdWRXYXRjaExvZ0dyb3Vwcyhsb2dzTW9ja1Nka1Byb3ZpZGVyLm1vY2tTZGtQcm92aWRlciwgY2RrU3RhY2tBcnRpZmFjdCk7XG5cbiAgLy8gVEhFTlxuICBleHBlY3QocmVzdWx0LmxvZ0dyb3VwTmFtZXMpLnRvRXF1YWwoWydsb2dfZ3JvdXAnXSk7XG59KTtcblxudGVzdCgnYWRkIGxvZyBncm91cHMgZnJvbSBTdGF0ZSBNYWNoaW5lcycsIGFzeW5jICgpID0+IHtcbiAgLy8gR0lWRU5cbiAgY29uc3QgY2RrU3RhY2tBcnRpZmFjdCA9IGNka1N0YWNrQXJ0aWZhY3RPZih7XG4gICAgdGVtcGxhdGU6IHtcbiAgICAgIFJlc291cmNlczoge1xuICAgICAgICBMb2dHcm91cDoge1xuICAgICAgICAgIFR5cGU6ICdBV1M6OkxvZ3M6OkxvZ0dyb3VwJyxcbiAgICAgICAgICBQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBMb2dHcm91cE5hbWU6ICdsb2dfZ3JvdXAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIERlZjoge1xuICAgICAgICAgIFR5cGU6ICdBV1M6OlN0ZXBGdW5jdGlvbnM6OlN0YXRlTWFjaGluZScsXG4gICAgICAgICAgUHJvcGVydGllczoge1xuICAgICAgICAgICAgTG9nZ2luZ0NvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICAgICAgRGVzdGluYXRpb25zOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgQ2xvdWRXYXRjaExvZ3NMb2dHcm91cDoge1xuICAgICAgICAgICAgICAgICAgICBMb2dHcm91cEFybjoge1xuICAgICAgICAgICAgICAgICAgICAgICdGbjo6R2V0QXR0JzogWydMb2dHcm91cCcsICdBcm4nXSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG4gIHB1c2hTdGFja1Jlc291cmNlU3VtbWFyaWVzKHN0YWNrU3VtbWFyeU9mKCdMb2dHcm91cCcsICdBV1M6OkxvZ3M6OkxvZ0dyb3VwJywgJ2xvZ19ncm91cCcpKTtcblxuICAvLyBXSEVOXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZpbmRDbG91ZFdhdGNoTG9nR3JvdXBzKGxvZ3NNb2NrU2RrUHJvdmlkZXIubW9ja1Nka1Byb3ZpZGVyLCBjZGtTdGFja0FydGlmYWN0KTtcblxuICAvLyBUSEVOXG4gIGV4cGVjdChyZXN1bHQubG9nR3JvdXBOYW1lcykudG9FcXVhbChbJ2xvZ19ncm91cCddKTtcbn0pO1xuXG50ZXN0KCdleGNsdWRlZCBsb2cgZ3JvdXBzIGFyZSBub3QgYWRkZWQnLCBhc3luYyAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IGNka1N0YWNrQXJ0aWZhY3QgPSBjZGtTdGFja0FydGlmYWN0T2Yoe1xuICAgIHRlbXBsYXRlOiB7XG4gICAgICBSZXNvdXJjZXM6IHtcbiAgICAgICAgTG9nR3JvdXA6IHtcbiAgICAgICAgICBUeXBlOiAnQVdTOjpMb2dzOjpMb2dHcm91cCcsXG4gICAgICAgICAgUHJvcGVydGllczoge1xuICAgICAgICAgICAgTG9nR3JvdXBOYW1lOiAnbG9nX2dyb3VwJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBMb2dHcm91cDI6IHtcbiAgICAgICAgICBUeXBlOiAnQVdTOjpMb2dzOjpMb2dHcm91cCcsXG4gICAgICAgICAgUHJvcGVydGllczoge1xuICAgICAgICAgICAgTG9nR3JvdXBOYW1lOiAnbG9nX2dyb3VwMicsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgRGVmOiB7XG4gICAgICAgICAgVHlwZTogJ0FXUzo6Q29kZUJ1aWxkOjpQcm9qZWN0JyxcbiAgICAgICAgICBQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBQb2plY3ROYW1lOiAncHJvamVjdCcsXG4gICAgICAgICAgICBMb2dzQ29uZmlnOiB7XG4gICAgICAgICAgICAgIENsb3VkV2F0Y2hMb2dzOiB7XG4gICAgICAgICAgICAgICAgR3JvdXBOYW1lOiB7IFJlZjogJ0xvZ0dyb3VwJyB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBGbG93TG9nOiB7XG4gICAgICAgICAgVHlwZTogJ0FXUzo6RUMyOjpGbG93TG9nJyxcbiAgICAgICAgICBQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBMb2dEZXN0aW5hdGlvbjogeyBSZWY6ICdMb2dHcm91cCcgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBGbG93TG9nMjoge1xuICAgICAgICAgIFR5cGU6ICdBV1M6OkVDMjo6Rmxvd0xvZycsXG4gICAgICAgICAgUHJvcGVydGllczoge1xuICAgICAgICAgICAgTG9nRGVzdGluYXRpb246IHtcbiAgICAgICAgICAgICAgJ0ZuOjpHZXRBdHQnOiBbJ0xvZ0dyb3VwMicsICdBcm4nXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG4gIHB1c2hTdGFja1Jlc291cmNlU3VtbWFyaWVzKHN0YWNrU3VtbWFyeU9mKCdMb2dHcm91cCcsICdBV1M6OkxvZ3M6OkxvZ0dyb3VwJywgJ2xvZ19ncm91cCcpKTtcbiAgcHVzaFN0YWNrUmVzb3VyY2VTdW1tYXJpZXMoc3RhY2tTdW1tYXJ5T2YoJ0xvZ0dyb3VwMicsICdBV1M6OkxvZ3M6OkxvZ0dyb3VwJywgJ2xvZ19ncm91cDInKSk7XG4gIHB1c2hTdGFja1Jlc291cmNlU3VtbWFyaWVzKHN0YWNrU3VtbWFyeU9mKCdGbG93TG9nJywgJ0FXUzo6RUMyOjpGbG93TG9nJywgJ2Zsb3dfbG9nJykpO1xuICBwdXNoU3RhY2tSZXNvdXJjZVN1bW1hcmllcyhzdGFja1N1bW1hcnlPZignRmxvd0xvZzInLCAnQVdTOjpFQzI6OkZsb3dMb2cnLCAnZmxvd19sb2cyJykpO1xuICBwdXNoU3RhY2tSZXNvdXJjZVN1bW1hcmllcyhzdGFja1N1bW1hcnlPZignRGVmJywgJ0FXUzo6Q29kZUJ1aWxkOlByb2plY3QnLCAncHJvamVjdCcpKTtcblxuICAvLyBXSEVOXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZpbmRDbG91ZFdhdGNoTG9nR3JvdXBzKGxvZ3NNb2NrU2RrUHJvdmlkZXIubW9ja1Nka1Byb3ZpZGVyLCBjZGtTdGFja0FydGlmYWN0KTtcblxuICAvLyBUSEVOXG4gIGV4cGVjdChyZXN1bHQubG9nR3JvdXBOYW1lcykudG9FcXVhbChbXSk7XG59KTtcblxudGVzdCgndW5hc3NvY2lhdGVkIGxvZyBncm91cHMgYXJlIGFkZGVkJywgYXN5bmMgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBjb25zdCBjZGtTdGFja0FydGlmYWN0ID0gY2RrU3RhY2tBcnRpZmFjdE9mKHtcbiAgICB0ZW1wbGF0ZToge1xuICAgICAgUmVzb3VyY2VzOiB7XG4gICAgICAgIExvZ0dyb3VwOiB7XG4gICAgICAgICAgVHlwZTogJ0FXUzo6TG9nczo6TG9nR3JvdXAnLFxuICAgICAgICAgIFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIExvZ0dyb3VwTmFtZTogJ2xvZ19ncm91cCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG4gIHB1c2hTdGFja1Jlc291cmNlU3VtbWFyaWVzKHN0YWNrU3VtbWFyeU9mKCdMb2dHcm91cCcsICdBV1M6OkxvZ3M6OkxvZ0dyb3VwJywgJ2xvZ19ncm91cCcpKTtcblxuICAvLyBXSEVOXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZpbmRDbG91ZFdhdGNoTG9nR3JvdXBzKGxvZ3NNb2NrU2RrUHJvdmlkZXIubW9ja1Nka1Byb3ZpZGVyLCBjZGtTdGFja0FydGlmYWN0KTtcblxuICAvLyBUSEVOXG4gIGV4cGVjdChyZXN1bHQubG9nR3JvdXBOYW1lcykudG9FcXVhbChbJ2xvZ19ncm91cCddKTtcbn0pO1xuXG50ZXN0KCdsb2cgZ3JvdXBzIHdpdGhvdXQgcGh5c2ljYWwgbmFtZXMgYXJlIGFkZGVkJywgYXN5bmMgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBjb25zdCBjZGtTdGFja0FydGlmYWN0ID0gY2RrU3RhY2tBcnRpZmFjdE9mKHtcbiAgICB0ZW1wbGF0ZToge1xuICAgICAgUmVzb3VyY2VzOiB7XG4gICAgICAgIExvZ0dyb3VwOiB7XG4gICAgICAgICAgVHlwZTogJ0FXUzo6TG9nczo6TG9nR3JvdXAnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9KTtcbiAgcHVzaFN0YWNrUmVzb3VyY2VTdW1tYXJpZXMoc3RhY2tTdW1tYXJ5T2YoJ0xvZ0dyb3VwJywgJ0FXUzo6TG9nczo6TG9nR3JvdXAnLCAnbG9nX2dyb3VwJykpO1xuXG4gIC8vIFdIRU5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmluZENsb3VkV2F0Y2hMb2dHcm91cHMobG9nc01vY2tTZGtQcm92aWRlci5tb2NrU2RrUHJvdmlkZXIsIGNka1N0YWNrQXJ0aWZhY3QpO1xuXG4gIC8vIFRIRU5cbiAgZXhwZWN0KHJlc3VsdC5sb2dHcm91cE5hbWVzKS50b0VxdWFsKFsnbG9nX2dyb3VwJ10pO1xufSk7XG5cbmNvbnN0IFNUQUNLX05BTUUgPSAnd2l0aG91dGVycm9ycyc7XG5jb25zdCBjdXJyZW50Q2ZuU3RhY2tSZXNvdXJjZXM6IENsb3VkRm9ybWF0aW9uLlN0YWNrUmVzb3VyY2VTdW1tYXJ5W10gPSBbXTtcblxuZnVuY3Rpb24gcHVzaFN0YWNrUmVzb3VyY2VTdW1tYXJpZXMoLi4uaXRlbXM6IENsb3VkRm9ybWF0aW9uLlN0YWNrUmVzb3VyY2VTdW1tYXJ5W10pIHtcbiAgY3VycmVudENmblN0YWNrUmVzb3VyY2VzLnB1c2goLi4uaXRlbXMpO1xufVxuXG5mdW5jdGlvbiBzdGFja1N1bW1hcnlPZihsb2dpY2FsSWQ6IHN0cmluZywgcmVzb3VyY2VUeXBlOiBzdHJpbmcsIHBoeXNpY2FsUmVzb3VyY2VJZDogc3RyaW5nKTogQ2xvdWRGb3JtYXRpb24uU3RhY2tSZXNvdXJjZVN1bW1hcnkge1xuICByZXR1cm4ge1xuICAgIExvZ2ljYWxSZXNvdXJjZUlkOiBsb2dpY2FsSWQsXG4gICAgUGh5c2ljYWxSZXNvdXJjZUlkOiBwaHlzaWNhbFJlc291cmNlSWQsXG4gICAgUmVzb3VyY2VUeXBlOiByZXNvdXJjZVR5cGUsXG4gICAgUmVzb3VyY2VTdGF0dXM6ICdDUkVBVEVfQ09NUExFVEUnLFxuICAgIExhc3RVcGRhdGVkVGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBjZGtTdGFja0FydGlmYWN0T2YodGVzdFN0YWNrQXJ0aWZhY3Q6IFBhcnRpYWw8VGVzdFN0YWNrQXJ0aWZhY3Q+ID0ge30pOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3Qge1xuICByZXR1cm4gdGVzdFN0YWNrKHtcbiAgICBzdGFja05hbWU6IFNUQUNLX05BTUUsXG4gICAgLi4udGVzdFN0YWNrQXJ0aWZhY3QsXG4gIH0pO1xufVxuXG5jbGFzcyBMb2dzTW9ja1Nka1Byb3ZpZGVyIHtcbiAgcHVibGljIHJlYWRvbmx5IG1vY2tTZGtQcm92aWRlcjogTW9ja1Nka1Byb3ZpZGVyO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMubW9ja1Nka1Byb3ZpZGVyID0gbmV3IE1vY2tTZGtQcm92aWRlcih7IHJlYWxTZGs6IGZhbHNlIH0pO1xuXG4gICAgdGhpcy5tb2NrU2RrUHJvdmlkZXIuc3R1YkNsb3VkRm9ybWF0aW9uKHtcbiAgICAgIGxpc3RTdGFja1Jlc291cmNlczogKHsgU3RhY2tOYW1lOiBzdGFja05hbWUgfSkgPT4ge1xuICAgICAgICBpZiAoc3RhY2tOYW1lICE9PSBTVEFDS19OQU1FKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBTdGFjayBuYW1lIGluIGxpc3RTdGFja1Jlc291cmNlcygpIGNhbGwgdG8gYmU6ICcke1NUQUNLX05BTUV9JywgYnV0IHJlY2VpdmVkOiAke3N0YWNrTmFtZX0nYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBTdGFja1Jlc291cmNlU3VtbWFyaWVzOiBjdXJyZW50Q2ZuU3RhY2tSZXNvdXJjZXMsXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHN0dWJHZXRFbmRwb2ludFN1ZmZpeChzdHViOiAoKSA9PiBzdHJpbmcpIHtcbiAgICB0aGlzLm1vY2tTZGtQcm92aWRlci5zdHViR2V0RW5kcG9pbnRTdWZmaXgoc3R1Yik7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const chalk_1 = require("chalk");
|
|
4
|
+
const logs_monitor_1 = require("../../../lib/api/logs/logs-monitor");
|
|
5
|
+
const aws_1 = require("../../integ/helpers/aws");
|
|
6
|
+
const mock_sdk_1 = require("../../util/mock-sdk");
|
|
7
|
+
let sdk;
|
|
8
|
+
let stderrMock;
|
|
9
|
+
let monitor;
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
monitor = new logs_monitor_1.CloudWatchLogEventMonitor(new Date(T100));
|
|
12
|
+
stderrMock = jest.spyOn(process.stderr, 'write').mockImplementation(() => { return true; });
|
|
13
|
+
sdk = new mock_sdk_1.MockSdk();
|
|
14
|
+
});
|
|
15
|
+
afterAll(() => {
|
|
16
|
+
stderrMock.mockRestore();
|
|
17
|
+
monitor.deactivate();
|
|
18
|
+
});
|
|
19
|
+
test('continue to the next page if it exists', async () => {
|
|
20
|
+
// GIVEN
|
|
21
|
+
const eventDate = new Date(T0 + 102 * 1000);
|
|
22
|
+
sdk.stubCloudWatchLogs({
|
|
23
|
+
filterLogEvents() {
|
|
24
|
+
return {
|
|
25
|
+
events: [event(102, 'message', eventDate)],
|
|
26
|
+
nextToken: 'some-token',
|
|
27
|
+
};
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
monitor.addLogGroups({
|
|
31
|
+
name: 'name',
|
|
32
|
+
account: '11111111111',
|
|
33
|
+
region: 'us-east-1',
|
|
34
|
+
}, sdk, ['loggroup']);
|
|
35
|
+
// WHEN
|
|
36
|
+
monitor.activate();
|
|
37
|
+
// need time for the log processing to occur
|
|
38
|
+
await aws_1.sleep(1000);
|
|
39
|
+
// THEN
|
|
40
|
+
const expectedLocaleTimeString = eventDate.toLocaleTimeString();
|
|
41
|
+
expect(stderrMock).toHaveBeenCalledTimes(2);
|
|
42
|
+
expect(stderrMock.mock.calls[0][0]).toContain(`[${chalk_1.blue('loggroup')}] ${chalk_1.yellow(expectedLocaleTimeString)} message`);
|
|
43
|
+
expect(stderrMock.mock.calls[1][0]).toContain(`[${chalk_1.blue('loggroup')}] ${chalk_1.yellow(expectedLocaleTimeString)} >>> \`watch\` shows only the first 100 log messages - the rest have been truncated...`);
|
|
44
|
+
});
|
|
45
|
+
const T0 = 1597837230504;
|
|
46
|
+
const T100 = T0 + 100 * 1000;
|
|
47
|
+
function event(nr, message, timestamp) {
|
|
48
|
+
return {
|
|
49
|
+
eventId: `${nr}`,
|
|
50
|
+
message,
|
|
51
|
+
timestamp: timestamp.getTime(),
|
|
52
|
+
ingestionTime: timestamp.getTime(),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9ncy1tb25pdG9yLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJsb2dzLW1vbml0b3IudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGlDQUFxQztBQUNyQyxxRUFBK0U7QUFDL0UsaURBQWdEO0FBQ2hELGtEQUE4QztBQUU5QyxJQUFJLEdBQVksQ0FBQztBQUNqQixJQUFJLFVBQTRCLENBQUM7QUFDakMsSUFBSSxPQUFrQyxDQUFDO0FBQ3ZDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7SUFDZCxPQUFPLEdBQUcsSUFBSSx3Q0FBeUIsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3hELFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLEdBQUcsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RixHQUFHLEdBQUcsSUFBSSxrQkFBTyxFQUFFLENBQUM7QUFDdEIsQ0FBQyxDQUFDLENBQUM7QUFFSCxRQUFRLENBQUMsR0FBRyxFQUFFO0lBQ1osVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3pCLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUN2QixDQUFDLENBQUMsQ0FBQztBQUVILElBQUksQ0FBQyx3Q0FBd0MsRUFBRSxLQUFLLElBQUksRUFBRTtJQUN4RCxRQUFRO0lBQ1IsTUFBTSxTQUFTLEdBQUcsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUM1QyxHQUFHLENBQUMsa0JBQWtCLENBQUM7UUFDckIsZUFBZTtZQUNiLE9BQU87Z0JBQ0wsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQzFDLFNBQVMsRUFBRSxZQUFZO2FBQ3hCLENBQUM7UUFDSixDQUFDO0tBQ0YsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxDQUFDLFlBQVksQ0FDbEI7UUFDRSxJQUFJLEVBQUUsTUFBTTtRQUNaLE9BQU8sRUFBRSxhQUFhO1FBQ3RCLE1BQU0sRUFBRSxXQUFXO0tBQ3BCLEVBQ0QsR0FBRyxFQUNILENBQUMsVUFBVSxDQUFDLENBQ2IsQ0FBQztJQUNGLE9BQU87SUFDUCxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbkIsNENBQTRDO0lBQzVDLE1BQU0sV0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRWxCLE9BQU87SUFDUCxNQUFNLHdCQUF3QixHQUFHLFNBQVMsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQ2hFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQzNDLElBQUksWUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLGNBQU0sQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLENBQ3BFLENBQUM7SUFDRixNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQzNDLElBQUksWUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLGNBQU0sQ0FBQyx3QkFBd0IsQ0FBQyx3RkFBd0YsQ0FDbEosQ0FBQztBQUNKLENBQUMsQ0FBQyxDQUFDO0FBRUgsTUFBTSxFQUFFLEdBQUcsYUFBYSxDQUFDO0FBQ3pCLE1BQU0sSUFBSSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDO0FBQzdCLFNBQVMsS0FBSyxDQUFDLEVBQVUsRUFBRSxPQUFlLEVBQUUsU0FBZTtJQUN6RCxPQUFPO1FBQ0wsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQ2hCLE9BQU87UUFDUCxTQUFTLEVBQUUsU0FBUyxDQUFDLE9BQU8sRUFBRTtRQUM5QixhQUFhLEVBQUUsU0FBUyxDQUFDLE9BQU8sRUFBRTtLQUNuQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGJsdWUsIHllbGxvdyB9IGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IENsb3VkV2F0Y2hMb2dFdmVudE1vbml0b3IgfSBmcm9tICcuLi8uLi8uLi9saWIvYXBpL2xvZ3MvbG9ncy1tb25pdG9yJztcbmltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi4vLi4vaW50ZWcvaGVscGVycy9hd3MnO1xuaW1wb3J0IHsgTW9ja1NkayB9IGZyb20gJy4uLy4uL3V0aWwvbW9jay1zZGsnO1xuXG5sZXQgc2RrOiBNb2NrU2RrO1xubGV0IHN0ZGVyck1vY2s6IGplc3QuU3B5SW5zdGFuY2U7XG5sZXQgbW9uaXRvcjogQ2xvdWRXYXRjaExvZ0V2ZW50TW9uaXRvcjtcbmJlZm9yZUVhY2goKCkgPT4ge1xuICBtb25pdG9yID0gbmV3IENsb3VkV2F0Y2hMb2dFdmVudE1vbml0b3IobmV3IERhdGUoVDEwMCkpO1xuICBzdGRlcnJNb2NrID0gamVzdC5zcHlPbihwcm9jZXNzLnN0ZGVyciwgJ3dyaXRlJykubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHsgcmV0dXJuIHRydWU7IH0pO1xuICBzZGsgPSBuZXcgTW9ja1NkaygpO1xufSk7XG5cbmFmdGVyQWxsKCgpID0+IHtcbiAgc3RkZXJyTW9jay5tb2NrUmVzdG9yZSgpO1xuICBtb25pdG9yLmRlYWN0aXZhdGUoKTtcbn0pO1xuXG50ZXN0KCdjb250aW51ZSB0byB0aGUgbmV4dCBwYWdlIGlmIGl0IGV4aXN0cycsIGFzeW5jICgpID0+IHtcbiAgLy8gR0lWRU5cbiAgY29uc3QgZXZlbnREYXRlID0gbmV3IERhdGUoVDAgKyAxMDIgKiAxMDAwKTtcbiAgc2RrLnN0dWJDbG91ZFdhdGNoTG9ncyh7XG4gICAgZmlsdGVyTG9nRXZlbnRzKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXZlbnRzOiBbZXZlbnQoMTAyLCAnbWVzc2FnZScsIGV2ZW50RGF0ZSldLFxuICAgICAgICBuZXh0VG9rZW46ICdzb21lLXRva2VuJyxcbiAgICAgIH07XG4gICAgfSxcbiAgfSk7XG4gIG1vbml0b3IuYWRkTG9nR3JvdXBzKFxuICAgIHtcbiAgICAgIG5hbWU6ICduYW1lJyxcbiAgICAgIGFjY291bnQ6ICcxMTExMTExMTExMScsXG4gICAgICByZWdpb246ICd1cy1lYXN0LTEnLFxuICAgIH0sXG4gICAgc2RrLFxuICAgIFsnbG9nZ3JvdXAnXSxcbiAgKTtcbiAgLy8gV0hFTlxuICBtb25pdG9yLmFjdGl2YXRlKCk7XG4gIC8vIG5lZWQgdGltZSBmb3IgdGhlIGxvZyBwcm9jZXNzaW5nIHRvIG9jY3VyXG4gIGF3YWl0IHNsZWVwKDEwMDApO1xuXG4gIC8vIFRIRU5cbiAgY29uc3QgZXhwZWN0ZWRMb2NhbGVUaW1lU3RyaW5nID0gZXZlbnREYXRlLnRvTG9jYWxlVGltZVN0cmluZygpO1xuICBleHBlY3Qoc3RkZXJyTW9jaykudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDIpO1xuICBleHBlY3Qoc3RkZXJyTW9jay5tb2NrLmNhbGxzWzBdWzBdKS50b0NvbnRhaW4oXG4gICAgYFske2JsdWUoJ2xvZ2dyb3VwJyl9XSAke3llbGxvdyhleHBlY3RlZExvY2FsZVRpbWVTdHJpbmcpfSBtZXNzYWdlYCxcbiAgKTtcbiAgZXhwZWN0KHN0ZGVyck1vY2subW9jay5jYWxsc1sxXVswXSkudG9Db250YWluKFxuICAgIGBbJHtibHVlKCdsb2dncm91cCcpfV0gJHt5ZWxsb3coZXhwZWN0ZWRMb2NhbGVUaW1lU3RyaW5nKX0gPj4+IFxcYHdhdGNoXFxgIHNob3dzIG9ubHkgdGhlIGZpcnN0IDEwMCBsb2cgbWVzc2FnZXMgLSB0aGUgcmVzdCBoYXZlIGJlZW4gdHJ1bmNhdGVkLi4uYCxcbiAgKTtcbn0pO1xuXG5jb25zdCBUMCA9IDE1OTc4MzcyMzA1MDQ7XG5jb25zdCBUMTAwID0gVDAgKyAxMDAgKiAxMDAwO1xuZnVuY3Rpb24gZXZlbnQobnI6IG51bWJlciwgbWVzc2FnZTogc3RyaW5nLCB0aW1lc3RhbXA6IERhdGUpOiBBV1MuQ2xvdWRXYXRjaExvZ3MuRmlsdGVyZWRMb2dFdmVudCB7XG4gIHJldHVybiB7XG4gICAgZXZlbnRJZDogYCR7bnJ9YCxcbiAgICBtZXNzYWdlLFxuICAgIHRpbWVzdGFtcDogdGltZXN0YW1wLmdldFRpbWUoKSxcbiAgICBpbmdlc3Rpb25UaW1lOiB0aW1lc3RhbXAuZ2V0VGltZSgpLFxuICB9O1xufVxuIl19
|