cdk-dms-replication 0.0.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/.jsii +13491 -0
- package/API.md +8606 -0
- package/LICENSE +202 -0
- package/README.md +883 -0
- package/cdk.context.json +1 -0
- package/integ/sample-app.ts +229 -0
- package/lib/dms-roles.d.ts +14 -0
- package/lib/dms-roles.js +42 -0
- package/lib/endpoint-settings.d.ts +419 -0
- package/lib/endpoint-settings.js +3 -0
- package/lib/endpoint.d.ts +143 -0
- package/lib/endpoint.js +402 -0
- package/lib/enums.d.ts +231 -0
- package/lib/enums.js +266 -0
- package/lib/index.d.ts +9 -0
- package/lib/index.js +49 -0
- package/lib/migration-pipeline.d.ts +253 -0
- package/lib/migration-pipeline.js +218 -0
- package/lib/replication-instance.d.ts +99 -0
- package/lib/replication-instance.js +93 -0
- package/lib/replication-task.d.ts +72 -0
- package/lib/replication-task.js +46 -0
- package/lib/serverless-pipeline.d.ts +196 -0
- package/lib/serverless-pipeline.js +271 -0
- package/lib/table-mappings.d.ts +178 -0
- package/lib/table-mappings.js +283 -0
- package/lib/task-settings.d.ts +228 -0
- package/lib/task-settings.js +291 -0
- package/package.json +170 -0
- package/scripts/sync-instance-classes.js +213 -0
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.TableMappings = exports.ColumnDataType = exports.RuleObjectLocator = exports.TransformationAction = exports.SelectionAction = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
/**
|
|
7
|
+
* Table mappings define which schemas/tables DMS migrates and how they are
|
|
8
|
+
* transformed. This builder produces the JSON string that DMS expects for
|
|
9
|
+
* the `tableMappings` property of a replication task.
|
|
10
|
+
*
|
|
11
|
+
* @see https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Tasks.CustomizingTasks.TableMapping.html
|
|
12
|
+
*/
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Enums
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
/** Whether the rule selects or excludes objects. */
|
|
17
|
+
var SelectionAction;
|
|
18
|
+
(function (SelectionAction) {
|
|
19
|
+
SelectionAction["INCLUDE"] = "include";
|
|
20
|
+
SelectionAction["EXCLUDE"] = "exclude";
|
|
21
|
+
SelectionAction["EXPLICIT"] = "explicit";
|
|
22
|
+
})(SelectionAction || (exports.SelectionAction = SelectionAction = {}));
|
|
23
|
+
/** Table-level transformation actions. */
|
|
24
|
+
var TransformationAction;
|
|
25
|
+
(function (TransformationAction) {
|
|
26
|
+
/** Convert the name to lowercase. */
|
|
27
|
+
TransformationAction["CONVERT_LOWERCASE"] = "convert-lowercase";
|
|
28
|
+
/** Convert the name to uppercase. */
|
|
29
|
+
TransformationAction["CONVERT_UPPERCASE"] = "convert-uppercase";
|
|
30
|
+
/** Add a prefix to the name. */
|
|
31
|
+
TransformationAction["ADD_PREFIX"] = "add-prefix";
|
|
32
|
+
/** Remove a prefix from the name. */
|
|
33
|
+
TransformationAction["REMOVE_PREFIX"] = "remove-prefix";
|
|
34
|
+
/** Add a suffix to the name. */
|
|
35
|
+
TransformationAction["ADD_SUFFIX"] = "add-suffix";
|
|
36
|
+
/** Remove a suffix from the name. */
|
|
37
|
+
TransformationAction["REMOVE_SUFFIX"] = "remove-suffix";
|
|
38
|
+
/** Rename the object. */
|
|
39
|
+
TransformationAction["RENAME"] = "rename";
|
|
40
|
+
/** Remove the column. */
|
|
41
|
+
TransformationAction["REMOVE_COLUMN"] = "remove-column";
|
|
42
|
+
/** Add a column. */
|
|
43
|
+
TransformationAction["ADD_COLUMN"] = "add-column";
|
|
44
|
+
/** Include the column. */
|
|
45
|
+
TransformationAction["INCLUDE_COLUMN"] = "include-column";
|
|
46
|
+
})(TransformationAction || (exports.TransformationAction = TransformationAction = {}));
|
|
47
|
+
/** The object type a rule targets. */
|
|
48
|
+
var RuleObjectLocator;
|
|
49
|
+
(function (RuleObjectLocator) {
|
|
50
|
+
RuleObjectLocator["SCHEMA"] = "schema";
|
|
51
|
+
RuleObjectLocator["TABLE"] = "table";
|
|
52
|
+
RuleObjectLocator["COLUMN"] = "column";
|
|
53
|
+
RuleObjectLocator["TABLE_TABLESPACE"] = "table-tablespace";
|
|
54
|
+
RuleObjectLocator["INDEX_TABLESPACE"] = "index-tablespace";
|
|
55
|
+
})(RuleObjectLocator || (exports.RuleObjectLocator = RuleObjectLocator = {}));
|
|
56
|
+
/** Data type for added columns. */
|
|
57
|
+
var ColumnDataType;
|
|
58
|
+
(function (ColumnDataType) {
|
|
59
|
+
ColumnDataType["STRING"] = "string";
|
|
60
|
+
ColumnDataType["INT4"] = "int4";
|
|
61
|
+
ColumnDataType["INT8"] = "int8";
|
|
62
|
+
ColumnDataType["FLOAT4"] = "float4";
|
|
63
|
+
ColumnDataType["FLOAT8"] = "float8";
|
|
64
|
+
ColumnDataType["NUMERIC"] = "numeric";
|
|
65
|
+
ColumnDataType["DATETIME"] = "datetime";
|
|
66
|
+
ColumnDataType["BYTES"] = "bytes";
|
|
67
|
+
ColumnDataType["BLOB"] = "blob";
|
|
68
|
+
})(ColumnDataType || (exports.ColumnDataType = ColumnDataType = {}));
|
|
69
|
+
// ---------------------------------------------------------------------------
|
|
70
|
+
// Builder
|
|
71
|
+
// ---------------------------------------------------------------------------
|
|
72
|
+
/**
|
|
73
|
+
* Fluent builder for DMS table mappings.
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* const mappings = new TableMappings()
|
|
77
|
+
* .includeSchema('public')
|
|
78
|
+
* .includeTable('public', 'orders')
|
|
79
|
+
* .excludeTable('public', 'audit_log')
|
|
80
|
+
* .renameSchema('public', 'prod')
|
|
81
|
+
* .toLowerCaseTable('public', '%')
|
|
82
|
+
* .toJson();
|
|
83
|
+
*/
|
|
84
|
+
class TableMappings {
|
|
85
|
+
constructor() {
|
|
86
|
+
this.rules = [];
|
|
87
|
+
this.nextId = 1;
|
|
88
|
+
}
|
|
89
|
+
// -------------------------------------------------------------------------
|
|
90
|
+
// Selection rules
|
|
91
|
+
// -------------------------------------------------------------------------
|
|
92
|
+
/**
|
|
93
|
+
* Include all tables in a schema.
|
|
94
|
+
* Use `%` as a wildcard for `schemaName` to include all schemas.
|
|
95
|
+
*/
|
|
96
|
+
includeSchema(schemaName) {
|
|
97
|
+
return this.addSelectionRule(schemaName, '%', SelectionAction.INCLUDE);
|
|
98
|
+
}
|
|
99
|
+
/** Exclude all tables in a schema. */
|
|
100
|
+
excludeSchema(schemaName) {
|
|
101
|
+
return this.addSelectionRule(schemaName, '%', SelectionAction.EXCLUDE);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Include a specific table (or a wildcard pattern) within a schema.
|
|
105
|
+
* Use `%` for `tableName` to match all tables in the schema.
|
|
106
|
+
*/
|
|
107
|
+
includeTable(schemaName, tableName) {
|
|
108
|
+
return this.addSelectionRule(schemaName, tableName, SelectionAction.INCLUDE);
|
|
109
|
+
}
|
|
110
|
+
/** Exclude a specific table (or wildcard) within a schema. */
|
|
111
|
+
excludeTable(schemaName, tableName) {
|
|
112
|
+
return this.addSelectionRule(schemaName, tableName, SelectionAction.EXCLUDE);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Explicitly include a single table. Unlike `include`, `explicit` means DMS
|
|
116
|
+
* only migrates this one table regardless of other `include` rules.
|
|
117
|
+
*/
|
|
118
|
+
explicitTable(schemaName, tableName) {
|
|
119
|
+
return this.addSelectionRule(schemaName, tableName, SelectionAction.EXPLICIT);
|
|
120
|
+
}
|
|
121
|
+
addSelectionRule(schemaName, tableName, action) {
|
|
122
|
+
const id = this.nextId++;
|
|
123
|
+
this.rules.push({
|
|
124
|
+
'rule-type': 'selection',
|
|
125
|
+
'rule-id': String(id),
|
|
126
|
+
'rule-name': `${id}`,
|
|
127
|
+
'object-locator': {
|
|
128
|
+
'schema-name': schemaName,
|
|
129
|
+
'table-name': tableName,
|
|
130
|
+
},
|
|
131
|
+
'rule-action': action,
|
|
132
|
+
});
|
|
133
|
+
return this;
|
|
134
|
+
}
|
|
135
|
+
// -------------------------------------------------------------------------
|
|
136
|
+
// Transformation rules — schema
|
|
137
|
+
// -------------------------------------------------------------------------
|
|
138
|
+
/** Rename a schema. */
|
|
139
|
+
renameSchema(schemaName, newName) {
|
|
140
|
+
return this.addTransformationRule(schemaName, '%', undefined, RuleObjectLocator.SCHEMA, TransformationAction.RENAME, newName);
|
|
141
|
+
}
|
|
142
|
+
/** Convert all schema names to lowercase. */
|
|
143
|
+
toLowerCaseSchema(schemaName) {
|
|
144
|
+
return this.addTransformationRule(schemaName, '%', undefined, RuleObjectLocator.SCHEMA, TransformationAction.CONVERT_LOWERCASE);
|
|
145
|
+
}
|
|
146
|
+
/** Convert all schema names to uppercase. */
|
|
147
|
+
toUpperCaseSchema(schemaName) {
|
|
148
|
+
return this.addTransformationRule(schemaName, '%', undefined, RuleObjectLocator.SCHEMA, TransformationAction.CONVERT_UPPERCASE);
|
|
149
|
+
}
|
|
150
|
+
/** Add a prefix to schema names. */
|
|
151
|
+
addPrefixToSchema(schemaName, prefix) {
|
|
152
|
+
return this.addTransformationRule(schemaName, '%', undefined, RuleObjectLocator.SCHEMA, TransformationAction.ADD_PREFIX, prefix);
|
|
153
|
+
}
|
|
154
|
+
/** Add a suffix to schema names. */
|
|
155
|
+
addSuffixToSchema(schemaName, suffix) {
|
|
156
|
+
return this.addTransformationRule(schemaName, '%', undefined, RuleObjectLocator.SCHEMA, TransformationAction.ADD_SUFFIX, suffix);
|
|
157
|
+
}
|
|
158
|
+
// -------------------------------------------------------------------------
|
|
159
|
+
// Transformation rules — table
|
|
160
|
+
// -------------------------------------------------------------------------
|
|
161
|
+
/** Rename a table. */
|
|
162
|
+
renameTable(schemaName, tableName, newName) {
|
|
163
|
+
return this.addTransformationRule(schemaName, tableName, undefined, RuleObjectLocator.TABLE, TransformationAction.RENAME, newName);
|
|
164
|
+
}
|
|
165
|
+
/** Convert matching table names to lowercase. Use `%` to match all tables. */
|
|
166
|
+
toLowerCaseTable(schemaName, tableName) {
|
|
167
|
+
return this.addTransformationRule(schemaName, tableName, undefined, RuleObjectLocator.TABLE, TransformationAction.CONVERT_LOWERCASE);
|
|
168
|
+
}
|
|
169
|
+
/** Convert matching table names to uppercase. */
|
|
170
|
+
toUpperCaseTable(schemaName, tableName) {
|
|
171
|
+
return this.addTransformationRule(schemaName, tableName, undefined, RuleObjectLocator.TABLE, TransformationAction.CONVERT_UPPERCASE);
|
|
172
|
+
}
|
|
173
|
+
/** Add a prefix to table names. */
|
|
174
|
+
addPrefixToTable(schemaName, tableName, prefix) {
|
|
175
|
+
return this.addTransformationRule(schemaName, tableName, undefined, RuleObjectLocator.TABLE, TransformationAction.ADD_PREFIX, prefix);
|
|
176
|
+
}
|
|
177
|
+
/** Add a suffix to table names. */
|
|
178
|
+
addSuffixToTable(schemaName, tableName, suffix) {
|
|
179
|
+
return this.addTransformationRule(schemaName, tableName, undefined, RuleObjectLocator.TABLE, TransformationAction.ADD_SUFFIX, suffix);
|
|
180
|
+
}
|
|
181
|
+
// -------------------------------------------------------------------------
|
|
182
|
+
// Transformation rules — column
|
|
183
|
+
// -------------------------------------------------------------------------
|
|
184
|
+
/** Rename a column in a table. */
|
|
185
|
+
renameColumn(schemaName, tableName, columnName, newName) {
|
|
186
|
+
return this.addTransformationRule(schemaName, tableName, columnName, RuleObjectLocator.COLUMN, TransformationAction.RENAME, newName);
|
|
187
|
+
}
|
|
188
|
+
/** Convert matching column names to lowercase. */
|
|
189
|
+
toLowerCaseColumn(schemaName, tableName, columnName) {
|
|
190
|
+
return this.addTransformationRule(schemaName, tableName, columnName, RuleObjectLocator.COLUMN, TransformationAction.CONVERT_LOWERCASE);
|
|
191
|
+
}
|
|
192
|
+
/** Convert matching column names to uppercase. */
|
|
193
|
+
toUpperCaseColumn(schemaName, tableName, columnName) {
|
|
194
|
+
return this.addTransformationRule(schemaName, tableName, columnName, RuleObjectLocator.COLUMN, TransformationAction.CONVERT_UPPERCASE);
|
|
195
|
+
}
|
|
196
|
+
/** Remove a column from a table. */
|
|
197
|
+
removeColumn(schemaName, tableName, columnName) {
|
|
198
|
+
return this.addTransformationRule(schemaName, tableName, columnName, RuleObjectLocator.COLUMN, TransformationAction.REMOVE_COLUMN);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Add a new column to a table.
|
|
202
|
+
*
|
|
203
|
+
* @example
|
|
204
|
+
* mappings.addColumn('public', 'orders', {
|
|
205
|
+
* columnName: 'migration_ts',
|
|
206
|
+
* columnType: ColumnDataType.DATETIME,
|
|
207
|
+
* expression: '$timestamp',
|
|
208
|
+
* });
|
|
209
|
+
*/
|
|
210
|
+
addColumn(schemaName, tableName, column) {
|
|
211
|
+
const id = this.nextId++;
|
|
212
|
+
const objectLocator = {
|
|
213
|
+
'schema-name': schemaName,
|
|
214
|
+
'table-name': tableName,
|
|
215
|
+
};
|
|
216
|
+
const rule = {
|
|
217
|
+
'rule-type': 'transformation',
|
|
218
|
+
'rule-id': String(id),
|
|
219
|
+
'rule-name': `${id}`,
|
|
220
|
+
'object-locator': objectLocator,
|
|
221
|
+
'rule-action': TransformationAction.ADD_COLUMN,
|
|
222
|
+
'rule-target': 'column',
|
|
223
|
+
'value': column.columnName,
|
|
224
|
+
'data-type': this.buildDataType(column),
|
|
225
|
+
};
|
|
226
|
+
if (column.expression) {
|
|
227
|
+
rule.expression = column.expression;
|
|
228
|
+
}
|
|
229
|
+
else if (column.columnValue !== undefined) {
|
|
230
|
+
rule.value = column.columnValue;
|
|
231
|
+
}
|
|
232
|
+
this.rules.push(rule);
|
|
233
|
+
return this;
|
|
234
|
+
}
|
|
235
|
+
buildDataType(column) {
|
|
236
|
+
const dt = { type: column.columnType };
|
|
237
|
+
if (column.columnLength !== undefined)
|
|
238
|
+
dt.length = column.columnLength;
|
|
239
|
+
if (column.columnPrecision !== undefined)
|
|
240
|
+
dt.precision = column.columnPrecision;
|
|
241
|
+
if (column.columnScale !== undefined)
|
|
242
|
+
dt.scale = column.columnScale;
|
|
243
|
+
return dt;
|
|
244
|
+
}
|
|
245
|
+
addTransformationRule(schemaName, tableName, columnName, ruleTarget, action, value) {
|
|
246
|
+
const id = this.nextId++;
|
|
247
|
+
const objectLocator = {
|
|
248
|
+
'schema-name': schemaName,
|
|
249
|
+
'table-name': tableName,
|
|
250
|
+
};
|
|
251
|
+
if (columnName !== undefined) {
|
|
252
|
+
objectLocator['column-name'] = columnName;
|
|
253
|
+
}
|
|
254
|
+
const rule = {
|
|
255
|
+
'rule-type': 'transformation',
|
|
256
|
+
'rule-id': String(id),
|
|
257
|
+
'rule-name': `${id}`,
|
|
258
|
+
'rule-target': ruleTarget,
|
|
259
|
+
'object-locator': objectLocator,
|
|
260
|
+
'rule-action': action,
|
|
261
|
+
};
|
|
262
|
+
if (value !== undefined) {
|
|
263
|
+
rule.value = value;
|
|
264
|
+
}
|
|
265
|
+
this.rules.push(rule);
|
|
266
|
+
return this;
|
|
267
|
+
}
|
|
268
|
+
// -------------------------------------------------------------------------
|
|
269
|
+
// Output
|
|
270
|
+
// -------------------------------------------------------------------------
|
|
271
|
+
/**
|
|
272
|
+
* Serialise the accumulated rules to the JSON string expected by DMS.
|
|
273
|
+
* Passes the result directly to `replicationTaskSettings` or
|
|
274
|
+
* `DmsReplicationTask.tableMappings`.
|
|
275
|
+
*/
|
|
276
|
+
toJson() {
|
|
277
|
+
return JSON.stringify({ rules: this.rules }, null, 2);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
exports.TableMappings = TableMappings;
|
|
281
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
282
|
+
TableMappings[_a] = { fqn: "cdk-dms-replication.TableMappings", version: "0.0.0" };
|
|
283
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtbWFwcGluZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdGFibGUtbWFwcGluZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTs7Ozs7O0dBTUc7QUFFSCw4RUFBOEU7QUFDOUUsUUFBUTtBQUNSLDhFQUE4RTtBQUU5RSxvREFBb0Q7QUFDcEQsSUFBWSxlQUlYO0FBSkQsV0FBWSxlQUFlO0lBQ3pCLHNDQUFtQixDQUFBO0lBQ25CLHNDQUFtQixDQUFBO0lBQ25CLHdDQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFKVyxlQUFlLCtCQUFmLGVBQWUsUUFJMUI7QUFFRCwwQ0FBMEM7QUFDMUMsSUFBWSxvQkFxQlg7QUFyQkQsV0FBWSxvQkFBb0I7SUFDOUIscUNBQXFDO0lBQ3JDLCtEQUF1QyxDQUFBO0lBQ3ZDLHFDQUFxQztJQUNyQywrREFBdUMsQ0FBQTtJQUN2QyxnQ0FBZ0M7SUFDaEMsaURBQXlCLENBQUE7SUFDekIscUNBQXFDO0lBQ3JDLHVEQUErQixDQUFBO0lBQy9CLGdDQUFnQztJQUNoQyxpREFBeUIsQ0FBQTtJQUN6QixxQ0FBcUM7SUFDckMsdURBQStCLENBQUE7SUFDL0IseUJBQXlCO0lBQ3pCLHlDQUFpQixDQUFBO0lBQ2pCLHlCQUF5QjtJQUN6Qix1REFBK0IsQ0FBQTtJQUMvQixvQkFBb0I7SUFDcEIsaURBQXlCLENBQUE7SUFDekIsMEJBQTBCO0lBQzFCLHlEQUFpQyxDQUFBO0FBQ25DLENBQUMsRUFyQlcsb0JBQW9CLG9DQUFwQixvQkFBb0IsUUFxQi9CO0FBRUQsc0NBQXNDO0FBQ3RDLElBQVksaUJBTVg7QUFORCxXQUFZLGlCQUFpQjtJQUMzQixzQ0FBaUIsQ0FBQTtJQUNqQixvQ0FBZSxDQUFBO0lBQ2Ysc0NBQWlCLENBQUE7SUFDakIsMERBQXFDLENBQUE7SUFDckMsMERBQXFDLENBQUE7QUFDdkMsQ0FBQyxFQU5XLGlCQUFpQixpQ0FBakIsaUJBQWlCLFFBTTVCO0FBRUQsbUNBQW1D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YUFBYSxDQUFDLGFBQWEsQ0FBQyxHQUFHLFVBQVUsQ0FBQztRQUM1QyxDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQTRCO1lBQ3BDLFdBQVcsRUFBRSxnQkFBZ0I7WUFDN0IsU0FBUyxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDckIsV0FBVyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQ3BCLGFBQWEsRUFBRSxVQUFVO1lBQ3pCLGdCQUFnQixFQUFFLGFBQWE7WUFDL0IsYUFBYSxFQUFFLE1BQU07U0FDdEIsQ0FBQztRQUNGLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLENBQUM7UUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCw0RUFBNEU7SUFDNUUsU0FBUztJQUNULDRFQUE0RTtJQUU1RTs7OztPQUlHO0lBQ0gsTUFBTTtRQUNKLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7O0FBelZILHNDQTBWQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGFibGUgbWFwcGluZ3MgZGVmaW5lIHdoaWNoIHNjaGVtYXMvdGFibGVzIERNUyBtaWdyYXRlcyBhbmQgaG93IHRoZXkgYXJlXG4gKiB0cmFuc2Zvcm1lZC4gVGhpcyBidWlsZGVyIHByb2R1Y2VzIHRoZSBKU09OIHN0cmluZyB0aGF0IERNUyBleHBlY3RzIGZvclxuICogdGhlIGB0YWJsZU1hcHBpbmdzYCBwcm9wZXJ0eSBvZiBhIHJlcGxpY2F0aW9uIHRhc2suXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZG1zL2xhdGVzdC91c2VyZ3VpZGUvQ0hBUF9UYXNrcy5DdXN0b21pemluZ1Rhc2tzLlRhYmxlTWFwcGluZy5odG1sXG4gKi9cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFbnVtc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBXaGV0aGVyIHRoZSBydWxlIHNlbGVjdHMgb3IgZXhjbHVkZXMgb2JqZWN0cy4gKi9cbmV4cG9ydCBlbnVtIFNlbGVjdGlvbkFjdGlvbiB7XG4gIElOQ0xVREUgPSAnaW5jbHVkZScsXG4gIEVYQ0xVREUgPSAnZXhjbHVkZScsXG4gIEVYUExJQ0lUID0gJ2V4cGxpY2l0Jyxcbn1cblxuLyoqIFRhYmxlLWxldmVsIHRyYW5zZm9ybWF0aW9uIGFjdGlvbnMuICovXG5leHBvcnQgZW51bSBUcmFuc2Zvcm1hdGlvbkFjdGlvbiB7XG4gIC8qKiBDb252ZXJ0IHRoZSBuYW1lIHRvIGxvd2VyY2FzZS4gKi9cbiAgQ09OVkVSVF9MT1dFUkNBU0UgPSAnY29udmVydC1sb3dlcmNhc2UnLFxuICAvKiogQ29udmVydCB0aGUgbmFtZSB0byB1cHBlcmNhc2UuICovXG4gIENPTlZFUlRfVVBQRVJDQVNFID0gJ2NvbnZlcnQtdXBwZXJjYXNlJyxcbiAgLyoqIEFkZCBhIHByZWZpeCB0byB0aGUgbmFtZS4gKi9cbiAgQUREX1BSRUZJWCA9ICdhZGQtcHJlZml4JyxcbiAgLyoqIFJlbW92ZSBhIHByZWZpeCBmcm9tIHRoZSBuYW1lLiAqL1xuICBSRU1PVkVfUFJFRklYID0gJ3JlbW92ZS1wcmVmaXgnLFxuICAvKiogQWRkIGEgc3VmZml4IHRvIHRoZSBuYW1lLiAqL1xuICBBRERfU1VGRklYID0gJ2FkZC1zdWZmaXgnLFxuICAvKiogUmVtb3ZlIGEgc3VmZml4IGZyb20gdGhlIG5hbWUuICovXG4gIFJFTU9WRV9TVUZGSVggPSAncmVtb3ZlLXN1ZmZpeCcsXG4gIC8qKiBSZW5hbWUgdGhlIG9iamVjdC4gKi9cbiAgUkVOQU1FID0gJ3JlbmFtZScsXG4gIC8qKiBSZW1vdmUgdGhlIGNvbHVtbi4gKi9cbiAgUkVNT1ZFX0NPTFVNTiA9ICdyZW1vdmUtY29sdW1uJyxcbiAgLyoqIEFkZCBhIGNvbHVtbi4gKi9cbiAgQUREX0NPTFVNTiA9ICdhZGQtY29sdW1uJyxcbiAgLyoqIEluY2x1ZGUgdGhlIGNvbHVtbi4gKi9cbiAgSU5DTFVERV9DT0xVTU4gPSAnaW5jbHVkZS1jb2x1bW4nLFxufVxuXG4vKiogVGhlIG9iamVjdCB0eXBlIGEgcnVsZSB0YXJnZXRzLiAqL1xuZXhwb3J0IGVudW0gUnVsZU9iamVjdExvY2F0b3Ige1xuICBTQ0hFTUEgPSAnc2NoZW1hJyxcbiAgVEFCTEUgPSAndGFibGUnLFxuICBDT0xVTU4gPSAnY29sdW1uJyxcbiAgVEFCTEVfVEFCTEVTUEFDRSA9ICd0YWJsZS10YWJsZXNwYWNlJyxcbiAgSU5ERVhfVEFCTEVTUEFDRSA9ICdpbmRleC10YWJsZXNwYWNlJyxcbn1cblxuLyoqIERhdGEgdHlwZSBmb3IgYWRkZWQgY29sdW1ucy4gKi9cbmV4cG9ydCBlbnVtIENvbHVtbkRhdGFUeXBlIHtcbiAgU1RSSU5HID0gJ3N0cmluZycsXG4gIElOVDQgPSAnaW50NCcsXG4gIElOVDggPSAnaW50OCcsXG4gIEZMT0FUNCA9ICdmbG9hdDQnLFxuICBGTE9BVDggPSAnZmxvYXQ4JyxcbiAgTlVNRVJJQyA9ICdudW1lcmljJyxcbiAgREFURVRJTUUgPSAnZGF0ZXRpbWUnLFxuICBCWVRFUyA9ICdieXRlcycsXG4gIEJMT0IgPSAnYmxvYicsXG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSW50ZXJmYWNlc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBBIGNvbHVtbiBhZGRlZCB2aWEgYW4gQUREX0NPTFVNTiB0cmFuc2Zvcm1hdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkQ29sdW1uRGVmaW5pdGlvbiB7XG4gIC8qKiBOYW1lIG9mIHRoZSBuZXcgY29sdW1uLiAqL1xuICByZWFkb25seSBjb2x1bW5OYW1lOiBzdHJpbmc7XG4gIC8qKiBEYXRhIHR5cGUgb2YgdGhlIG5ldyBjb2x1bW4uICovXG4gIHJlYWRvbmx5IGNvbHVtblR5cGU6IENvbHVtbkRhdGFUeXBlO1xuICAvKiogQ2hhcmFjdGVyIGxlbmd0aCBmb3Igc3RyaW5nIGNvbHVtbnMuICovXG4gIHJlYWRvbmx5IGNvbHVtbkxlbmd0aD86IG51bWJlcjtcbiAgLyoqIFByZWNpc2lvbiBmb3IgbnVtZXJpYyBjb2x1bW5zLiAqL1xuICByZWFkb25seSBjb2x1bW5QcmVjaXNpb24/OiBudW1iZXI7XG4gIC8qKiBTY2FsZSBmb3IgbnVtZXJpYyBjb2x1bW5zLiAqL1xuICByZWFkb25seSBjb2x1bW5TY2FsZT86IG51bWJlcjtcbiAgLyoqXG4gICAqIENvbnN0YW50IHZhbHVlIHRvIHBvcHVsYXRlIHRoZSBjb2x1bW4gd2l0aC5cbiAgICogRXhhY3RseSBvbmUgb2YgYGNvbHVtblZhbHVlYCBvciBgZXhwcmVzc2lvbmAgbXVzdCBiZSBzZXQuXG4gICAqL1xuICByZWFkb25seSBjb2x1bW5WYWx1ZT86IHN0cmluZztcbiAgLyoqXG4gICAqIEV4cHJlc3Npb24gKGUuZy4gYCR0aW1lc3RhbXBgKSB0byBwb3B1bGF0ZSB0aGUgY29sdW1uLlxuICAgKiBFeGFjdGx5IG9uZSBvZiBgY29sdW1uVmFsdWVgIG9yIGBleHByZXNzaW9uYCBtdXN0IGJlIHNldC5cbiAgICovXG4gIHJlYWRvbmx5IGV4cHJlc3Npb24/OiBzdHJpbmc7XG59XG5cbi8qKiBPYmplY3QgbG9jYXRvciBpZGVudGlmeWluZyB0aGUgc2NoZW1hLCB0YWJsZSwgYW5kIG9wdGlvbmFsIGNvbHVtbiBhIHJ1bGUgdGFyZ2V0cy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVsZU9iamVjdExvY2F0b3JWYWx1ZSB7XG4gIHJlYWRvbmx5IHNjaGVtYU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgdGFibGVOYW1lPzogc3RyaW5nO1xuICByZWFkb25seSBjb2x1bW5OYW1lPzogc3RyaW5nO1xufVxuXG4vKiogUmVwcmVzZW50cyBhIHNpbmdsZSwgZnVsbHkgYnVpbHQgcnVsZSBpbiB0aGUgdGFibGUtbWFwcGluZ3MgSlNPTi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVNYXBwaW5nUnVsZSB7XG4gIHJlYWRvbmx5IHJ1bGVUeXBlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJ1bGVJZDogc3RyaW5nO1xuICByZWFkb25seSBydWxlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBvYmplY3RMb2NhdG9yOiBSdWxlT2JqZWN0TG9jYXRvclZhbHVlO1xuICByZWFkb25seSBydWxlQWN0aW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHZhbHVlPzogc3RyaW5nO1xuICByZWFkb25seSBvbGRWYWx1ZT86IHN0cmluZztcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBCdWlsZGVyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBGbHVlbnQgYnVpbGRlciBmb3IgRE1TIHRhYmxlIG1hcHBpbmdzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBtYXBwaW5ncyA9IG5ldyBUYWJsZU1hcHBpbmdzKClcbiAqICAgLmluY2x1ZGVTY2hlbWEoJ3B1YmxpYycpXG4gKiAgIC5pbmNsdWRlVGFibGUoJ3B1YmxpYycsICdvcmRlcnMnKVxuICogICAuZXhjbHVkZVRhYmxlKCdwdWJsaWMnLCAnYXVkaXRfbG9nJylcbiAqICAgLnJlbmFtZVNjaGVtYSgncHVibGljJywgJ3Byb2QnKVxuICogICAudG9Mb3dlckNhc2VUYWJsZSgncHVibGljJywgJyUnKVxuICogICAudG9Kc29uKCk7XG4gKi9cbmV4cG9ydCBjbGFzcyBUYWJsZU1hcHBpbmdzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBydWxlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdO1xuICBwcml2YXRlIG5leHRJZDogbnVtYmVyID0gMTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFNlbGVjdGlvbiBydWxlc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIEluY2x1ZGUgYWxsIHRhYmxlcyBpbiBhIHNjaGVtYS5cbiAgICogVXNlIGAlYCBhcyBhIHdpbGRjYXJkIGZvciBgc2NoZW1hTmFtZWAgdG8gaW5jbHVkZSBhbGwgc2NoZW1hcy5cbiAgICovXG4gIGluY2x1ZGVTY2hlbWEoc2NoZW1hTmFtZTogc3RyaW5nKTogVGFibGVNYXBwaW5ncyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkU2VsZWN0aW9uUnVsZShzY2hlbWFOYW1lLCAnJScsIFNlbGVjdGlvbkFjdGlvbi5JTkNMVURFKTtcbiAgfVxuXG4gIC8qKiBFeGNsdWRlIGFsbCB0YWJsZXMgaW4gYSBzY2hlbWEuICovXG4gIGV4Y2x1ZGVTY2hlbWEoc2NoZW1hTmFtZTogc3RyaW5nKTogVGFibGVNYXBwaW5ncyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkU2VsZWN0aW9uUnVsZShzY2hlbWFOYW1lLCAnJScsIFNlbGVjdGlvbkFjdGlvbi5FWENMVURFKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmNsdWRlIGEgc3BlY2lmaWMgdGFibGUgKG9yIGEgd2lsZGNhcmQgcGF0dGVybikgd2l0aGluIGEgc2NoZW1hLlxuICAgKiBVc2UgYCVgIGZvciBgdGFibGVOYW1lYCB0byBtYXRjaCBhbGwgdGFibGVzIGluIHRoZSBzY2hlbWEuXG4gICAqL1xuICBpbmNsdWRlVGFibGUoc2NoZW1hTmFtZTogc3RyaW5nLCB0YWJsZU5hbWU6IHN0cmluZyk6IFRhYmxlTWFwcGluZ3Mge1xuICAgIHJldHVybiB0aGlzLmFkZFNlbGVjdGlvblJ1bGUoc2NoZW1hTmFtZSwgdGFibGVOYW1lLCBTZWxlY3Rpb25BY3Rpb24uSU5DTFVERSk7XG4gIH1cblxuICAvKiogRXhjbHVkZSBhIHNwZWNpZmljIHRhYmxlIChvciB3aWxkY2FyZCkgd2l0aGluIGEgc2NoZW1hLiAqL1xuICBleGNsdWRlVGFibGUoc2NoZW1hTmFtZTogc3RyaW5nLCB0YWJsZU5hbWU6IHN0cmluZyk6IFRhYmxlTWFwcGluZ3Mge1xuICAgIHJldHVybiB0aGlzLmFkZFNlbGVjdGlvblJ1bGUoc2NoZW1hTmFtZSwgdGFibGVOYW1lLCBTZWxlY3Rpb25BY3Rpb24uRVhDTFVERSk7XG4gIH1cblxuICAvKipcbiAgICogRXhwbGljaXRseSBpbmNsdWRlIGEgc2luZ2xlIHRhYmxlLiBVbmxpa2UgYGluY2x1ZGVgLCBgZXhwbGljaXRgIG1lYW5zIERNU1xuICAgKiBvbmx5IG1pZ3JhdGVzIHRoaXMgb25lIHRhYmxlIHJlZ2FyZGxlc3Mgb2Ygb3RoZXIgYGluY2x1ZGVgIHJ1bGVzLlxuICAgKi9cbiAgZXhwbGljaXRUYWJsZShzY2hlbWFOYW1lOiBzdHJpbmcsIHRhYmxlTmFtZTogc3RyaW5nKTogVGFibGVNYXBwaW5ncyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkU2VsZWN0aW9uUnVsZShzY2hlbWFOYW1lLCB0YWJsZU5hbWUsIFNlbGVjdGlvbkFjdGlvbi5FWFBMSUNJVCk7XG4gIH1cblxuICBwcml2YXRlIGFkZFNlbGVjdGlvblJ1bGUoXG4gICAgc2NoZW1hTmFtZTogc3RyaW5nLFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGFjdGlvbjogU2VsZWN0aW9uQWN0aW9uLFxuICApOiBUYWJsZU1hcHBpbmdzIHtcbiAgICBjb25zdCBpZCA9IHRoaXMubmV4dElkKys7XG4gICAgdGhpcy5ydWxlcy5wdXNoKHtcbiAgICAgICdydWxlLXR5cGUnOiAnc2VsZWN0aW9uJyxcbiAgICAgICdydWxlLWlkJzogU3RyaW5nKGlkKSxcbiAgICAgICdydWxlLW5hbWUnOiBgJHtpZH1gLFxuICAgICAgJ29iamVjdC1sb2NhdG9yJzoge1xuICAgICAgICAnc2NoZW1hLW5hbWUnOiBzY2hlbWFOYW1lLFxuICAgICAgICAndGFibGUtbmFtZSc6IHRhYmxlTmFtZSxcbiAgICAgIH0sXG4gICAgICAncnVsZS1hY3Rpb24nOiBhY3Rpb24sXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFRyYW5zZm9ybWF0aW9uIHJ1bGVzIOKAlCBzY2hlbWFcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKiBSZW5hbWUgYSBzY2hlbWEuICovXG4gIHJlbmFtZVNjaGVtYShzY2hlbWFOYW1lOiBzdHJpbmcsIG5ld05hbWU6IHN0cmluZyk6IFRhYmxlTWFwcGluZ3Mge1xuICAgIHJldHVybiB0aGlzLmFkZFRyYW5zZm9ybWF0aW9uUnVsZShcbiAgICAgIHNjaGVtYU5hbWUsXG4gICAgICAnJScsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBSdWxlT2JqZWN0TG9jYXRvci5TQ0hFTUEsXG4gICAgICBUcmFuc2Zvcm1hdGlvbkFjdGlvbi5SRU5BTUUsXG4gICAgICBuZXdOYW1lLFxuICAgICk7XG4gIH1cblxuICAvKiogQ29udmVydCBhbGwgc2NoZW1hIG5hbWVzIHRvIGxvd2VyY2FzZS4gKi9cbiAgdG9Mb3dlckNhc2VTY2hlbWEoc2NoZW1hTmFtZTogc3RyaW5nKTogVGFibGVNYXBwaW5ncyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkVHJhbnNmb3JtYXRpb25SdWxlKFxuICAgICAgc2NoZW1hTmFtZSxcbiAgICAgICclJyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIFJ1bGVPYmplY3RMb2NhdG9yLlNDSEVNQSxcbiAgICAgIFRyYW5zZm9ybWF0aW9uQWN0aW9uLkNPTlZFUlRfTE9XRVJDQVNFLFxuICAgICk7XG4gIH1cblxuICAvKiogQ29udmVydCBhbGwgc2NoZW1hIG5hbWVzIHRvIHVwcGVyY2FzZS4gKi9cbiAgdG9VcHBlckNhc2VTY2hlbWEoc2NoZW1hTmFtZTogc3RyaW5nKTogVGFibGVNYXBwaW5ncyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkVHJhbnNmb3JtYXRpb25SdWxlKFxuICAgICAgc2NoZW1hTmFtZSxcbiAgICAgICclJyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIFJ1bGVPYmplY3RMb2NhdG9yLlNDSEVNQSxcbiAgICAgIFRyYW5zZm9ybWF0aW9uQWN0aW9uLkNPTlZFUlRfVVBQRVJDQVNFLFxuICAgICk7XG4gIH1cblxuICAvKiogQWRkIGEgcHJlZml4IHRvIHNjaGVtYSBuYW1lcy4gKi9cbiAgYWRkUHJlZml4VG9TY2hlbWEoc2NoZW1hTmFtZTogc3RyaW5nLCBwcmVmaXg6IHN0cmluZyk6IFRhYmxlTWFwcGluZ3Mge1xuICAgIHJldHVybiB0aGlzLmFkZFRyYW5zZm9ybWF0aW9uUnVsZShcbiAgICAgIHNjaGVtYU5hbWUsXG4gICAgICAnJScsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBSdWxlT2JqZWN0TG9jYXRvci5TQ0hFTUEsXG4gICAgICBUcmFuc2Zvcm1hdGlvbkFjdGlvbi5BRERfUFJFRklYLFxuICAgICAgcHJlZml4LFxuICAgICk7XG4gIH1cblxuICAvKiogQWRkIGEgc3VmZml4IHRvIHNjaGVtYSBuYW1lcy4gKi9cbiAgYWRkU3VmZml4VG9TY2hlbWEoc2NoZW1hTmFtZTogc3RyaW5nLCBzdWZmaXg6IHN0cmluZyk6IFRhYmxlTWFwcGluZ3Mge1xuICAgIHJldHVybiB0aGlzLmFkZFRyYW5zZm9ybWF0aW9uUnVsZShcbiAgICAgIHNjaGVtYU5hbWUsXG4gICAgICAnJScsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBSdWxlT2JqZWN0TG9jYXRvci5TQ0hFTUEsXG4gICAgICBUcmFuc2Zvcm1hdGlvbkFjdGlvbi5BRERfU1VGRklYLFxuICAgICAgc3VmZml4LFxuICAgICk7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFRyYW5zZm9ybWF0aW9uIHJ1bGVzIOKAlCB0YWJsZVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqIFJlbmFtZSBhIHRhYmxlLiAqL1xuICByZW5hbWVUYWJsZShzY2hlbWFOYW1lOiBzdHJpbmcsIHRhYmxlTmFtZTogc3RyaW5nLCBuZXdOYW1lOiBzdHJpbmcpOiBUYWJsZU1hcHBpbmdzIHtcbiAgICByZXR1cm4gdGhpcy5hZGRUcmFuc2Zvcm1hdGlvblJ1bGUoXG4gICAgICBzY2hlbWFOYW1lLFxuICAgICAgdGFibGVOYW1lLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgUnVsZU9iamVjdExvY2F0b3IuVEFCTEUsXG4gICAgICBUcmFuc2Zvcm1hdGlvbkFjdGlvbi5SRU5BTUUsXG4gICAgICBuZXdOYW1lLFxuICAgICk7XG4gIH1cblxuICAvKiogQ29udmVydCBtYXRjaGluZyB0YWJsZSBuYW1lcyB0byBsb3dlcmNhc2UuIFVzZSBgJWAgdG8gbWF0Y2ggYWxsIHRhYmxlcy4gKi9cbiAgdG9Mb3dlckNhc2VUYWJsZShzY2hlbWFOYW1lOiBzdHJpbmcsIHRhYmxlTmFtZTogc3RyaW5nKTogVGFibGVNYXBwaW5ncyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkVHJhbnNmb3JtYXRpb25SdWxlKFxuICAgICAgc2NoZW1hTmFtZSxcbiAgICAgIHRhYmxlTmFtZSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIFJ1bGVPYmplY3RMb2NhdG9yLlRBQkxFLFxuICAgICAgVHJhbnNmb3JtYXRpb25BY3Rpb24uQ09OVkVSVF9MT1dFUkNBU0UsXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBDb252ZXJ0IG1hdGNoaW5nIHRhYmxlIG5hbWVzIHRvIHVwcGVyY2FzZS4gKi9cbiAgdG9VcHBlckNhc2VUYWJsZShzY2hlbWFOYW1lOiBzdHJpbmcsIHRhYmxlTmFtZTogc3RyaW5nKTogVGFibGVNYXBwaW5ncyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkVHJhbnNmb3JtYXRpb25SdWxlKFxuICAgICAgc2NoZW1hTmFtZSxcbiAgICAgIHRhYmxlTmFtZSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIFJ1bGVPYmplY3RMb2NhdG9yLlRBQkxFLFxuICAgICAgVHJhbnNmb3JtYXRpb25BY3Rpb24uQ09OVkVSVF9VUFBFUkNBU0UsXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBBZGQgYSBwcmVmaXggdG8gdGFibGUgbmFtZXMuICovXG4gIGFkZFByZWZpeFRvVGFibGUoc2NoZW1hTmFtZTogc3RyaW5nLCB0YWJsZU5hbWU6IHN0cmluZywgcHJlZml4OiBzdHJpbmcpOiBUYWJsZU1hcHBpbmdzIHtcbiAgICByZXR1cm4gdGhpcy5hZGRUcmFuc2Zvcm1hdGlvblJ1bGUoXG4gICAgICBzY2hlbWFOYW1lLFxuICAgICAgdGFibGVOYW1lLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgUnVsZU9iamVjdExvY2F0b3IuVEFCTEUsXG4gICAgICBUcmFuc2Zvcm1hdGlvbkFjdGlvbi5BRERfUFJFRklYLFxuICAgICAgcHJlZml4LFxuICAgICk7XG4gIH1cblxuICAvKiogQWRkIGEgc3VmZml4IHRvIHRhYmxlIG5hbWVzLiAqL1xuICBhZGRTdWZmaXhUb1RhYmxlKHNjaGVtYU5hbWU6IHN0cmluZywgdGFibGVOYW1lOiBzdHJpbmcsIHN1ZmZpeDogc3RyaW5nKTogVGFibGVNYXBwaW5ncyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkVHJhbnNmb3JtYXRpb25SdWxlKFxuICAgICAgc2NoZW1hTmFtZSxcbiAgICAgIHRhYmxlTmFtZSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIFJ1bGVPYmplY3RMb2NhdG9yLlRBQkxFLFxuICAgICAgVHJhbnNmb3JtYXRpb25BY3Rpb24uQUREX1NVRkZJWCxcbiAgICAgIHN1ZmZpeCxcbiAgICApO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBUcmFuc2Zvcm1hdGlvbiBydWxlcyDigJQgY29sdW1uXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKiogUmVuYW1lIGEgY29sdW1uIGluIGEgdGFibGUuICovXG4gIHJlbmFtZUNvbHVtbihcbiAgICBzY2hlbWFOYW1lOiBzdHJpbmcsXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgY29sdW1uTmFtZTogc3RyaW5nLFxuICAgIG5ld05hbWU6IHN0cmluZyxcbiAgKTogVGFibGVNYXBwaW5ncyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkVHJhbnNmb3JtYXRpb25SdWxlKFxuICAgICAgc2NoZW1hTmFtZSxcbiAgICAgIHRhYmxlTmFtZSxcbiAgICAgIGNvbHVtbk5hbWUsXG4gICAgICBSdWxlT2JqZWN0TG9jYXRvci5DT0xVTU4sXG4gICAgICBUcmFuc2Zvcm1hdGlvbkFjdGlvbi5SRU5BTUUsXG4gICAgICBuZXdOYW1lLFxuICAgICk7XG4gIH1cblxuICAvKiogQ29udmVydCBtYXRjaGluZyBjb2x1bW4gbmFtZXMgdG8gbG93ZXJjYXNlLiAqL1xuICB0b0xvd2VyQ2FzZUNvbHVtbihcbiAgICBzY2hlbWFOYW1lOiBzdHJpbmcsXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgY29sdW1uTmFtZTogc3RyaW5nLFxuICApOiBUYWJsZU1hcHBpbmdzIHtcbiAgICByZXR1cm4gdGhpcy5hZGRUcmFuc2Zvcm1hdGlvblJ1bGUoXG4gICAgICBzY2hlbWFOYW1lLFxuICAgICAgdGFibGVOYW1lLFxuICAgICAgY29sdW1uTmFtZSxcbiAgICAgIFJ1bGVPYmplY3RMb2NhdG9yLkNPTFVNTixcbiAgICAgIFRyYW5zZm9ybWF0aW9uQWN0aW9uLkNPTlZFUlRfTE9XRVJDQVNFLFxuICAgICk7XG4gIH1cblxuICAvKiogQ29udmVydCBtYXRjaGluZyBjb2x1bW4gbmFtZXMgdG8gdXBwZXJjYXNlLiAqL1xuICB0b1VwcGVyQ2FzZUNvbHVtbihcbiAgICBzY2hlbWFOYW1lOiBzdHJpbmcsXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgY29sdW1uTmFtZTogc3RyaW5nLFxuICApOiBUYWJsZU1hcHBpbmdzIHtcbiAgICByZXR1cm4gdGhpcy5hZGRUcmFuc2Zvcm1hdGlvblJ1bGUoXG4gICAgICBzY2hlbWFOYW1lLFxuICAgICAgdGFibGVOYW1lLFxuICAgICAgY29sdW1uTmFtZSxcbiAgICAgIFJ1bGVPYmplY3RMb2NhdG9yLkNPTFVNTixcbiAgICAgIFRyYW5zZm9ybWF0aW9uQWN0aW9uLkNPTlZFUlRfVVBQRVJDQVNFLFxuICAgICk7XG4gIH1cblxuICAvKiogUmVtb3ZlIGEgY29sdW1uIGZyb20gYSB0YWJsZS4gKi9cbiAgcmVtb3ZlQ29sdW1uKFxuICAgIHNjaGVtYU5hbWU6IHN0cmluZyxcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBjb2x1bW5OYW1lOiBzdHJpbmcsXG4gICk6IFRhYmxlTWFwcGluZ3Mge1xuICAgIHJldHVybiB0aGlzLmFkZFRyYW5zZm9ybWF0aW9uUnVsZShcbiAgICAgIHNjaGVtYU5hbWUsXG4gICAgICB0YWJsZU5hbWUsXG4gICAgICBjb2x1bW5OYW1lLFxuICAgICAgUnVsZU9iamVjdExvY2F0b3IuQ09MVU1OLFxuICAgICAgVHJhbnNmb3JtYXRpb25BY3Rpb24uUkVNT1ZFX0NPTFVNTixcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIG5ldyBjb2x1bW4gdG8gYSB0YWJsZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogbWFwcGluZ3MuYWRkQ29sdW1uKCdwdWJsaWMnLCAnb3JkZXJzJywge1xuICAgKiAgIGNvbHVtbk5hbWU6ICdtaWdyYXRpb25fdHMnLFxuICAgKiAgIGNvbHVtblR5cGU6IENvbHVtbkRhdGFUeXBlLkRBVEVUSU1FLFxuICAgKiAgIGV4cHJlc3Npb246ICckdGltZXN0YW1wJyxcbiAgICogfSk7XG4gICAqL1xuICBhZGRDb2x1bW4oXG4gICAgc2NoZW1hTmFtZTogc3RyaW5nLFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGNvbHVtbjogQWRkQ29sdW1uRGVmaW5pdGlvbixcbiAgKTogVGFibGVNYXBwaW5ncyB7XG4gICAgY29uc3QgaWQgPSB0aGlzLm5leHRJZCsrO1xuICAgIGNvbnN0IG9iamVjdExvY2F0b3I6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnc2NoZW1hLW5hbWUnOiBzY2hlbWFOYW1lLFxuICAgICAgJ3RhYmxlLW5hbWUnOiB0YWJsZU5hbWUsXG4gICAgfTtcblxuICAgIGNvbnN0IHJ1bGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgJ3J1bGUtdHlwZSc6ICd0cmFuc2Zvcm1hdGlvbicsXG4gICAgICAncnVsZS1pZCc6IFN0cmluZyhpZCksXG4gICAgICAncnVsZS1uYW1lJzogYCR7aWR9YCxcbiAgICAgICdvYmplY3QtbG9jYXRvcic6IG9iamVjdExvY2F0b3IsXG4gICAgICAncnVsZS1hY3Rpb24nOiBUcmFuc2Zvcm1hdGlvbkFjdGlvbi5BRERfQ09MVU1OLFxuICAgICAgJ3J1bGUtdGFyZ2V0JzogJ2NvbHVtbicsXG4gICAgICAndmFsdWUnOiBjb2x1bW4uY29sdW1uTmFtZSxcbiAgICAgICdkYXRhLXR5cGUnOiB0aGlzLmJ1aWxkRGF0YVR5cGUoY29sdW1uKSxcbiAgICB9O1xuXG4gICAgaWYgKGNvbHVtbi5leHByZXNzaW9uKSB7XG4gICAgICBydWxlLmV4cHJlc3Npb24gPSBjb2x1bW4uZXhwcmVzc2lvbjtcbiAgICB9IGVsc2UgaWYgKGNvbHVtbi5jb2x1bW5WYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBydWxlLnZhbHVlID0gY29sdW1uLmNvbHVtblZhbHVlO1xuICAgIH1cblxuICAgIHRoaXMucnVsZXMucHVzaChydWxlKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGREYXRhVHlwZShjb2x1bW46IEFkZENvbHVtbkRlZmluaXRpb24pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgY29uc3QgZHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyB0eXBlOiBjb2x1bW4uY29sdW1uVHlwZSB9O1xuICAgIGlmIChjb2x1bW4uY29sdW1uTGVuZ3RoICE9PSB1bmRlZmluZWQpIGR0Lmxlbmd0aCA9IGNvbHVtbi5jb2x1bW5MZW5ndGg7XG4gICAgaWYgKGNvbHVtbi5jb2x1bW5QcmVjaXNpb24gIT09IHVuZGVmaW5lZCkgZHQucHJlY2lzaW9uID0gY29sdW1uLmNvbHVtblByZWNpc2lvbjtcbiAgICBpZiAoY29sdW1uLmNvbHVtblNjYWxlICE9PSB1bmRlZmluZWQpIGR0LnNjYWxlID0gY29sdW1uLmNvbHVtblNjYWxlO1xuICAgIHJldHVybiBkdDtcbiAgfVxuXG4gIHByaXZhdGUgYWRkVHJhbnNmb3JtYXRpb25SdWxlKFxuICAgIHNjaGVtYU5hbWU6IHN0cmluZyxcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBjb2x1bW5OYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcnVsZVRhcmdldDogUnVsZU9iamVjdExvY2F0b3IsXG4gICAgYWN0aW9uOiBUcmFuc2Zvcm1hdGlvbkFjdGlvbixcbiAgICB2YWx1ZT86IHN0cmluZyxcbiAgKTogVGFibGVNYXBwaW5ncyB7XG4gICAgY29uc3QgaWQgPSB0aGlzLm5leHRJZCsrO1xuICAgIGNvbnN0IG9iamVjdExvY2F0b3I6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnc2NoZW1hLW5hbWUnOiBzY2hlbWFOYW1lLFxuICAgICAgJ3RhYmxlLW5hbWUnOiB0YWJsZU5hbWUsXG4gICAgfTtcbiAgICBpZiAoY29sdW1uTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBvYmplY3RMb2NhdG9yWydjb2x1bW4tbmFtZSddID0gY29sdW1uTmFtZTtcbiAgICB9XG5cbiAgICBjb25zdCBydWxlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAgICdydWxlLXR5cGUnOiAndHJhbnNmb3JtYXRpb24nLFxuICAgICAgJ3J1bGUtaWQnOiBTdHJpbmcoaWQpLFxuICAgICAgJ3J1bGUtbmFtZSc6IGAke2lkfWAsXG4gICAgICAncnVsZS10YXJnZXQnOiBydWxlVGFyZ2V0LFxuICAgICAgJ29iamVjdC1sb2NhdG9yJzogb2JqZWN0TG9jYXRvcixcbiAgICAgICdydWxlLWFjdGlvbic6IGFjdGlvbixcbiAgICB9O1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBydWxlLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgdGhpcy5ydWxlcy5wdXNoKHJ1bGUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBPdXRwdXRcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpc2UgdGhlIGFjY3VtdWxhdGVkIHJ1bGVzIHRvIHRoZSBKU09OIHN0cmluZyBleHBlY3RlZCBieSBETVMuXG4gICAqIFBhc3NlcyB0aGUgcmVzdWx0IGRpcmVjdGx5IHRvIGByZXBsaWNhdGlvblRhc2tTZXR0aW5nc2Agb3JcbiAgICogYERtc1JlcGxpY2F0aW9uVGFzay50YWJsZU1hcHBpbmdzYC5cbiAgICovXG4gIHRvSnNvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IHJ1bGVzOiB0aGlzLnJ1bGVzIH0sIG51bGwsIDIpO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builder for DMS replication task settings.
|
|
3
|
+
*
|
|
4
|
+
* The DMS task settings JSON controls logging, LOB handling, error handling,
|
|
5
|
+
* full-load tuning, and CDC tuning. This builder exposes the most commonly
|
|
6
|
+
* tuned knobs and produces the JSON string expected by a replication task.
|
|
7
|
+
*
|
|
8
|
+
* @see https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Tasks.CustomizingTasks.TaskSettings.html
|
|
9
|
+
*/
|
|
10
|
+
/** LOB (Large Object) handling mode. */
|
|
11
|
+
export declare enum LobMode {
|
|
12
|
+
/** No LOB support. */
|
|
13
|
+
NONE = "none",
|
|
14
|
+
/** All LOBs are migrated as inline data (full LOB mode). */
|
|
15
|
+
FULL_LOB = "full-lob",
|
|
16
|
+
/** LOBs are truncated at a configurable size. */
|
|
17
|
+
LIMITED_LOB = "limited-lob"
|
|
18
|
+
}
|
|
19
|
+
/** Logging verbosity for DMS task log components. */
|
|
20
|
+
export declare enum LoggingLevel {
|
|
21
|
+
LOGGER_SEVERITY_DEFAULT = "LOGGER_SEVERITY_DEFAULT",
|
|
22
|
+
LOGGER_SEVERITY_DEBUG = "LOGGER_SEVERITY_DEBUG",
|
|
23
|
+
LOGGER_SEVERITY_DETAILED_DEBUG = "LOGGER_SEVERITY_DETAILED_DEBUG",
|
|
24
|
+
LOGGER_SEVERITY_ERROR = "LOGGER_SEVERITY_ERROR",
|
|
25
|
+
LOGGER_SEVERITY_WARNING = "LOGGER_SEVERITY_WARNING"
|
|
26
|
+
}
|
|
27
|
+
/** Action to take on a recoverable error. */
|
|
28
|
+
export declare enum ErrorAction {
|
|
29
|
+
/** Ignore the error and continue. */
|
|
30
|
+
IGNORE = "IGNORE",
|
|
31
|
+
/** Ignore the row, continue with the next. */
|
|
32
|
+
IGNORE_RECORD = "IGNORE_RECORD",
|
|
33
|
+
/** Stop the task. */
|
|
34
|
+
STOP_TASK = "STOP_TASK"
|
|
35
|
+
}
|
|
36
|
+
/** Logging configuration for a single DMS log component. */
|
|
37
|
+
export interface LogComponentSettings {
|
|
38
|
+
/** Logging level for this component. */
|
|
39
|
+
readonly loggingLevel?: LoggingLevel;
|
|
40
|
+
}
|
|
41
|
+
/** Controls how the task handles full-load data. */
|
|
42
|
+
export interface FullLoadSettings {
|
|
43
|
+
/**
|
|
44
|
+
* Maximum number of tables to load in parallel.
|
|
45
|
+
* @default 8
|
|
46
|
+
*/
|
|
47
|
+
readonly maxFullLoadSubTasks?: number;
|
|
48
|
+
/**
|
|
49
|
+
* Number of rows to load before a commit.
|
|
50
|
+
* @default 10000
|
|
51
|
+
*/
|
|
52
|
+
readonly transactionConsistencyTimeout?: number;
|
|
53
|
+
/**
|
|
54
|
+
* Whether to create target tables if they don't exist.
|
|
55
|
+
* @default true
|
|
56
|
+
*/
|
|
57
|
+
readonly targetTablePrepMode?: string;
|
|
58
|
+
/**
|
|
59
|
+
* Whether to stop the task after the full load completes (only relevant for
|
|
60
|
+
* full-load tasks without CDC).
|
|
61
|
+
* @default false
|
|
62
|
+
*/
|
|
63
|
+
readonly stopTaskCachedChangesApplied?: boolean;
|
|
64
|
+
/** Whether DMS commits the full load in a single transaction. */
|
|
65
|
+
readonly commitRate?: number;
|
|
66
|
+
}
|
|
67
|
+
/** Controls CDC behaviour. */
|
|
68
|
+
export interface CdcSettings {
|
|
69
|
+
/**
|
|
70
|
+
* Offset in seconds from current time to use as the CDC start position.
|
|
71
|
+
* Ignored when `cdcStartPosition` is set on the task.
|
|
72
|
+
*/
|
|
73
|
+
readonly enableTestMode?: boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Whether DMS applies changes immediately (false) or batches them (true).
|
|
76
|
+
* @default false
|
|
77
|
+
*/
|
|
78
|
+
readonly batchApplyEnabled?: boolean;
|
|
79
|
+
/**
|
|
80
|
+
* Number of seconds DMS waits before applying batched changes.
|
|
81
|
+
* Only relevant when `batchApplyEnabled` is true.
|
|
82
|
+
* @default 1
|
|
83
|
+
*/
|
|
84
|
+
readonly batchApplyTimeoutMin?: number;
|
|
85
|
+
/**
|
|
86
|
+
* Maximum number of seconds DMS waits before applying batched changes.
|
|
87
|
+
* @default 30
|
|
88
|
+
*/
|
|
89
|
+
readonly batchApplyTimeoutMax?: number;
|
|
90
|
+
/** Memory limit (in MB) for the apply task. @default 500 */
|
|
91
|
+
readonly batchApplyMemoryLimit?: number;
|
|
92
|
+
/** Whether to preserve transactions during CDC. @default true */
|
|
93
|
+
readonly failOnNoTablesCaptured?: boolean;
|
|
94
|
+
}
|
|
95
|
+
/** Controls error handling behaviour. */
|
|
96
|
+
export interface ErrorHandlingSettings {
|
|
97
|
+
/**
|
|
98
|
+
* Action to take when DMS encounters a data error (e.g. duplicate key).
|
|
99
|
+
* @default ErrorAction.STOP_TASK
|
|
100
|
+
*/
|
|
101
|
+
readonly dataErrorPolicy?: ErrorAction;
|
|
102
|
+
/**
|
|
103
|
+
* Maximum number of data errors before stopping.
|
|
104
|
+
* @default 0 (unlimited)
|
|
105
|
+
*/
|
|
106
|
+
readonly dataErrorEscalationCount?: number;
|
|
107
|
+
/**
|
|
108
|
+
* Action to take after `dataErrorEscalationCount` errors are hit.
|
|
109
|
+
* @default ErrorAction.STOP_TASK
|
|
110
|
+
*/
|
|
111
|
+
readonly dataErrorEscalationPolicy?: ErrorAction;
|
|
112
|
+
/**
|
|
113
|
+
* Action when DMS encounters a table error.
|
|
114
|
+
* @default ErrorAction.STOP_TASK
|
|
115
|
+
*/
|
|
116
|
+
readonly tableErrorPolicy?: ErrorAction;
|
|
117
|
+
/**
|
|
118
|
+
* Maximum number of table errors before escalation.
|
|
119
|
+
* @default 0
|
|
120
|
+
*/
|
|
121
|
+
readonly tableErrorEscalationCount?: number;
|
|
122
|
+
/**
|
|
123
|
+
* Action after `tableErrorEscalationCount` table errors.
|
|
124
|
+
* @default ErrorAction.STOP_TASK
|
|
125
|
+
*/
|
|
126
|
+
readonly tableErrorEscalationPolicy?: ErrorAction;
|
|
127
|
+
/**
|
|
128
|
+
* Whether to recover from recoverable errors.
|
|
129
|
+
* @default true
|
|
130
|
+
*/
|
|
131
|
+
readonly recoverableErrorCount?: number;
|
|
132
|
+
/**
|
|
133
|
+
* Interval in seconds between recovery attempts.
|
|
134
|
+
* @default 5
|
|
135
|
+
*/
|
|
136
|
+
readonly recoverableErrorInterval?: number;
|
|
137
|
+
/**
|
|
138
|
+
* Throttle factor applied to recovery intervals.
|
|
139
|
+
* @default 2
|
|
140
|
+
*/
|
|
141
|
+
readonly recoverableErrorThrottling?: boolean;
|
|
142
|
+
/**
|
|
143
|
+
* Maximum interval (seconds) between recovery attempts.
|
|
144
|
+
* @default 360
|
|
145
|
+
*/
|
|
146
|
+
readonly recoverableErrorThrottlingMax?: number;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Fluent builder for DMS task settings.
|
|
150
|
+
*
|
|
151
|
+
* @example
|
|
152
|
+
* const settings = new TaskSettings()
|
|
153
|
+
* .withLobMode(LobMode.LIMITED_LOB, 32)
|
|
154
|
+
* .withFullLoadSubTasks(16)
|
|
155
|
+
* .withBatchApply(true, 5, 60)
|
|
156
|
+
* .withDataErrorPolicy(ErrorAction.IGNORE_RECORD, 100)
|
|
157
|
+
* .withLogging('SOURCE_UNLOAD', LoggingLevel.LOGGER_SEVERITY_DEFAULT)
|
|
158
|
+
* .toJson();
|
|
159
|
+
*/
|
|
160
|
+
export declare class TaskSettings {
|
|
161
|
+
private lobMode;
|
|
162
|
+
private lobMaxSize;
|
|
163
|
+
private fullLoadSettings;
|
|
164
|
+
private cdcSettings;
|
|
165
|
+
private errorHandlingSettings;
|
|
166
|
+
private loggingEnabled;
|
|
167
|
+
private logComponents;
|
|
168
|
+
/**
|
|
169
|
+
* Configure LOB handling.
|
|
170
|
+
*
|
|
171
|
+
* @param mode How LOBs are handled.
|
|
172
|
+
* @param maxSizeKb Maximum LOB size in KB when mode is LIMITED_LOB. Ignored otherwise.
|
|
173
|
+
*/
|
|
174
|
+
withLobMode(mode: LobMode, maxSizeKb?: number): TaskSettings;
|
|
175
|
+
/**
|
|
176
|
+
* Set the maximum number of tables loaded in parallel.
|
|
177
|
+
* @param count Default 8.
|
|
178
|
+
*/
|
|
179
|
+
withFullLoadSubTasks(count: number): TaskSettings;
|
|
180
|
+
/**
|
|
181
|
+
* Set the full-load target table prepare mode.
|
|
182
|
+
* Common values: "DROP_AND_CREATE", "TRUNCATE_BEFORE_LOAD", "DO_NOTHING".
|
|
183
|
+
*/
|
|
184
|
+
withTargetTablePrepMode(mode: string): TaskSettings;
|
|
185
|
+
/**
|
|
186
|
+
* Set the commit rate (number of rows per commit) during full load.
|
|
187
|
+
*/
|
|
188
|
+
withCommitRate(rows: number): TaskSettings;
|
|
189
|
+
/**
|
|
190
|
+
* Enable or disable CDC batch apply mode and configure its timeouts.
|
|
191
|
+
*
|
|
192
|
+
* @param enabled Whether batch apply is on.
|
|
193
|
+
* @param minSeconds Minimum seconds before applying a batch (default 1).
|
|
194
|
+
* @param maxSeconds Maximum seconds before applying a batch (default 30).
|
|
195
|
+
*/
|
|
196
|
+
withBatchApply(enabled: boolean, minSeconds?: number, maxSeconds?: number): TaskSettings;
|
|
197
|
+
/**
|
|
198
|
+
* Configure the action taken on data errors.
|
|
199
|
+
*
|
|
200
|
+
* @param policy Action when a data error is encountered.
|
|
201
|
+
* @param escalationCount After this many errors, apply the escalation policy (0 = immediate).
|
|
202
|
+
* @param escalationPolicy Action after `escalationCount` errors.
|
|
203
|
+
*/
|
|
204
|
+
withDataErrorPolicy(policy: ErrorAction, escalationCount?: number, escalationPolicy?: ErrorAction): TaskSettings;
|
|
205
|
+
/**
|
|
206
|
+
* Configure recovery from transient errors.
|
|
207
|
+
*
|
|
208
|
+
* @param count Maximum recovery attempts (-1 = unlimited).
|
|
209
|
+
* @param interval Seconds between attempts.
|
|
210
|
+
*/
|
|
211
|
+
withRecovery(count: number, interval?: number): TaskSettings;
|
|
212
|
+
/**
|
|
213
|
+
* Enable or disable CloudWatch logging for the task.
|
|
214
|
+
* @default true
|
|
215
|
+
*/
|
|
216
|
+
withLoggingEnabled(enabled: boolean): TaskSettings;
|
|
217
|
+
/**
|
|
218
|
+
* Set the logging level for a named DMS log component.
|
|
219
|
+
*
|
|
220
|
+
* Common component names: SOURCE_UNLOAD, TARGET_LOAD, TASK_MANAGER,
|
|
221
|
+
* SOURCE_CAPTURE, TARGET_APPLY, REST_SERVER, TRANSFORMATION.
|
|
222
|
+
*/
|
|
223
|
+
withLogging(component: string, level: LoggingLevel): TaskSettings;
|
|
224
|
+
/**
|
|
225
|
+
* Produce the JSON string that DMS expects for `replicationTaskSettings`.
|
|
226
|
+
*/
|
|
227
|
+
toJson(): string;
|
|
228
|
+
}
|