@aws-cdk/aws-redshift-alpha 2.0.0-alpha.1

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.
Files changed (45) hide show
  1. package/.jsii +6985 -0
  2. package/LICENSE +201 -0
  3. package/NOTICE +2 -0
  4. package/README.md +247 -0
  5. package/lib/cluster.d.ts +454 -0
  6. package/lib/cluster.js +231 -0
  7. package/lib/database-options.d.ts +30 -0
  8. package/lib/database-options.js +3 -0
  9. package/lib/database-secret.d.ts +35 -0
  10. package/lib/database-secret.js +32 -0
  11. package/lib/endpoint.d.ts +31 -0
  12. package/lib/endpoint.js +28 -0
  13. package/lib/index.d.ts +8 -0
  14. package/lib/index.js +22 -0
  15. package/lib/parameter-group.d.ts +72 -0
  16. package/lib/parameter-group.js +52 -0
  17. package/lib/private/database-query-provider/handler-name.d.ts +5 -0
  18. package/lib/private/database-query-provider/handler-name.js +10 -0
  19. package/lib/private/database-query-provider/index.d.ts +2 -0
  20. package/lib/private/database-query-provider/index.js +21 -0
  21. package/lib/private/database-query-provider/privileges.d.ts +6 -0
  22. package/lib/private/database-query-provider/privileges.js +57 -0
  23. package/lib/private/database-query-provider/table.d.ts +6 -0
  24. package/lib/private/database-query-provider/table.js +56 -0
  25. package/lib/private/database-query-provider/user.d.ts +9 -0
  26. package/lib/private/database-query-provider/user.js +69 -0
  27. package/lib/private/database-query-provider/util.d.ts +4 -0
  28. package/lib/private/database-query-provider/util.js +41 -0
  29. package/lib/private/database-query.d.ts +24 -0
  30. package/lib/private/database-query.js +78 -0
  31. package/lib/private/handler-props.d.ts +26 -0
  32. package/lib/private/handler-props.js +3 -0
  33. package/lib/private/privileges.d.ts +48 -0
  34. package/lib/private/privileges.js +64 -0
  35. package/lib/redshift-canned-metrics.generated.d.ts +192 -0
  36. package/lib/redshift-canned-metrics.generated.js +161 -0
  37. package/lib/subnet-group.d.ts +74 -0
  38. package/lib/subnet-group.js +49 -0
  39. package/lib/table.d.ts +241 -0
  40. package/lib/table.js +104 -0
  41. package/lib/user.d.ts +174 -0
  42. package/lib/user.js +102 -0
  43. package/package.json +124 -0
  44. package/rosetta/cluster.ts-fixture +21 -0
  45. package/rosetta/default.ts-fixture +12 -0
package/lib/table.d.ts ADDED
@@ -0,0 +1,241 @@
1
+ import * as cdk from 'aws-cdk-lib';
2
+ import { ICluster } from './cluster';
3
+ import { DatabaseOptions } from './database-options';
4
+ import { IUser } from './user';
5
+ import { Construct, IConstruct } from 'constructs';
6
+ /**
7
+ * (experimental) An action that a Redshift user can be granted privilege to perform on a table.
8
+ *
9
+ * @experimental
10
+ */
11
+ export declare enum TableAction {
12
+ /**
13
+ * (experimental) Grants privilege to select data from a table or view using a SELECT statement.
14
+ *
15
+ * @experimental
16
+ */
17
+ SELECT = 0,
18
+ /**
19
+ * (experimental) Grants privilege to load data into a table using an INSERT statement or a COPY statement.
20
+ *
21
+ * @experimental
22
+ */
23
+ INSERT = 1,
24
+ /**
25
+ * (experimental) Grants privilege to update a table column using an UPDATE statement.
26
+ *
27
+ * @experimental
28
+ */
29
+ UPDATE = 2,
30
+ /**
31
+ * (experimental) Grants privilege to delete a data row from a table.
32
+ *
33
+ * @experimental
34
+ */
35
+ DELETE = 3,
36
+ /**
37
+ * (experimental) Grants privilege to drop a table.
38
+ *
39
+ * @experimental
40
+ */
41
+ DROP = 4,
42
+ /**
43
+ * (experimental) Grants privilege to create a foreign key constraint.
44
+ *
45
+ * You need to grant this privilege on both the referenced table and the referencing table; otherwise, the user can't create the constraint.
46
+ *
47
+ * @experimental
48
+ */
49
+ REFERENCES = 5,
50
+ /**
51
+ * (experimental) Grants all available privileges at once to the specified user or user group.
52
+ *
53
+ * @experimental
54
+ */
55
+ ALL = 6
56
+ }
57
+ /**
58
+ * (experimental) A column in a Redshift table.
59
+ *
60
+ * @experimental
61
+ */
62
+ export interface Column {
63
+ /**
64
+ * (experimental) The name of the column.
65
+ *
66
+ * @experimental
67
+ */
68
+ readonly name: string;
69
+ /**
70
+ * (experimental) The data type of the column.
71
+ *
72
+ * @experimental
73
+ */
74
+ readonly dataType: string;
75
+ }
76
+ /**
77
+ * (experimental) Properties for configuring a Redshift table.
78
+ *
79
+ * @experimental
80
+ */
81
+ export interface TableProps extends DatabaseOptions {
82
+ /**
83
+ * (experimental) The name of the table.
84
+ *
85
+ * @default - a name is generated
86
+ * @experimental
87
+ */
88
+ readonly tableName?: string;
89
+ /**
90
+ * (experimental) The columns of the table.
91
+ *
92
+ * @experimental
93
+ */
94
+ readonly tableColumns: Column[];
95
+ /**
96
+ * (experimental) The policy to apply when this resource is removed from the application.
97
+ *
98
+ * @default cdk.RemovalPolicy.Retain
99
+ * @experimental
100
+ */
101
+ readonly removalPolicy?: cdk.RemovalPolicy;
102
+ }
103
+ /**
104
+ * (experimental) Represents a table in a Redshift database.
105
+ *
106
+ * @experimental
107
+ */
108
+ export interface ITable extends IConstruct {
109
+ /**
110
+ * (experimental) Name of the table.
111
+ *
112
+ * @experimental
113
+ */
114
+ readonly tableName: string;
115
+ /**
116
+ * (experimental) The columns of the table.
117
+ *
118
+ * @experimental
119
+ */
120
+ readonly tableColumns: Column[];
121
+ /**
122
+ * (experimental) The cluster where the table is located.
123
+ *
124
+ * @experimental
125
+ */
126
+ readonly cluster: ICluster;
127
+ /**
128
+ * (experimental) The name of the database where the table is located.
129
+ *
130
+ * @experimental
131
+ */
132
+ readonly databaseName: string;
133
+ /**
134
+ * (experimental) Grant a user privilege to access this table.
135
+ *
136
+ * @experimental
137
+ */
138
+ grant(user: IUser, ...actions: TableAction[]): void;
139
+ }
140
+ /**
141
+ * (experimental) A full specification of a Redshift table that can be used to import it fluently into the CDK application.
142
+ *
143
+ * @experimental
144
+ */
145
+ export interface TableAttributes {
146
+ /**
147
+ * (experimental) Name of the table.
148
+ *
149
+ * @experimental
150
+ */
151
+ readonly tableName: string;
152
+ /**
153
+ * (experimental) The columns of the table.
154
+ *
155
+ * @experimental
156
+ */
157
+ readonly tableColumns: Column[];
158
+ /**
159
+ * (experimental) The cluster where the table is located.
160
+ *
161
+ * @experimental
162
+ */
163
+ readonly cluster: ICluster;
164
+ /**
165
+ * (experimental) The name of the database where the table is located.
166
+ *
167
+ * @experimental
168
+ */
169
+ readonly databaseName: string;
170
+ }
171
+ declare abstract class TableBase extends Construct implements ITable {
172
+ abstract readonly tableName: string;
173
+ abstract readonly tableColumns: Column[];
174
+ abstract readonly cluster: ICluster;
175
+ abstract readonly databaseName: string;
176
+ /**
177
+ * (experimental) Grant a user privilege to access this table.
178
+ *
179
+ * @experimental
180
+ */
181
+ grant(user: IUser, ...actions: TableAction[]): void;
182
+ }
183
+ /**
184
+ * (experimental) A table in a Redshift cluster.
185
+ *
186
+ * @experimental
187
+ */
188
+ export declare class Table extends TableBase {
189
+ /**
190
+ * (experimental) Specify a Redshift table using a table name and schema that already exists.
191
+ *
192
+ * @experimental
193
+ */
194
+ static fromTableAttributes(scope: Construct, id: string, attrs: TableAttributes): ITable;
195
+ /**
196
+ * (experimental) Name of the table.
197
+ *
198
+ * @experimental
199
+ */
200
+ readonly tableName: string;
201
+ /**
202
+ * (experimental) The columns of the table.
203
+ *
204
+ * @experimental
205
+ */
206
+ readonly tableColumns: Column[];
207
+ /**
208
+ * (experimental) The cluster where the table is located.
209
+ *
210
+ * @experimental
211
+ */
212
+ readonly cluster: ICluster;
213
+ /**
214
+ * (experimental) The name of the database where the table is located.
215
+ *
216
+ * @experimental
217
+ */
218
+ readonly databaseName: string;
219
+ private resource;
220
+ /**
221
+ * @experimental
222
+ */
223
+ constructor(scope: Construct, id: string, props: TableProps);
224
+ /**
225
+ * (experimental) Apply the given removal policy to this resource.
226
+ *
227
+ * The Removal Policy controls what happens to this resource when it stops
228
+ * being managed by CloudFormation, either because you've removed it from the
229
+ * CDK application or because you've made a change that requires the resource
230
+ * to be replaced.
231
+ *
232
+ * The resource can be destroyed (`RemovalPolicy.DESTROY`), or left in your AWS
233
+ * account for data recovery and cleanup later (`RemovalPolicy.RETAIN`).
234
+ *
235
+ * This resource is retained by default.
236
+ *
237
+ * @experimental
238
+ */
239
+ applyRemovalPolicy(policy: cdk.RemovalPolicy): void;
240
+ }
241
+ export {};
package/lib/table.js ADDED
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.Table = exports.TableAction = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ const cdk = require("aws-cdk-lib");
7
+ const database_query_1 = require("./private/database-query");
8
+ const handler_name_1 = require("./private/database-query-provider/handler-name");
9
+ // keep this import separate from other imports to reduce chance for merge conflicts with v2-main
10
+ // eslint-disable-next-line no-duplicate-imports, import/order
11
+ const constructs_1 = require("constructs");
12
+ /**
13
+ * (experimental) An action that a Redshift user can be granted privilege to perform on a table.
14
+ *
15
+ * @experimental
16
+ */
17
+ var TableAction;
18
+ (function (TableAction) {
19
+ TableAction[TableAction["SELECT"] = 0] = "SELECT";
20
+ TableAction[TableAction["INSERT"] = 1] = "INSERT";
21
+ TableAction[TableAction["UPDATE"] = 2] = "UPDATE";
22
+ TableAction[TableAction["DELETE"] = 3] = "DELETE";
23
+ TableAction[TableAction["DROP"] = 4] = "DROP";
24
+ TableAction[TableAction["REFERENCES"] = 5] = "REFERENCES";
25
+ TableAction[TableAction["ALL"] = 6] = "ALL";
26
+ })(TableAction = exports.TableAction || (exports.TableAction = {}));
27
+ class TableBase extends constructs_1.Construct {
28
+ /**
29
+ * (experimental) Grant a user privilege to access this table.
30
+ *
31
+ * @experimental
32
+ */
33
+ grant(user, ...actions) {
34
+ user.addTablePrivileges(this, ...actions);
35
+ }
36
+ }
37
+ /**
38
+ * (experimental) A table in a Redshift cluster.
39
+ *
40
+ * @experimental
41
+ */
42
+ class Table extends TableBase {
43
+ /**
44
+ * @experimental
45
+ */
46
+ constructor(scope, id, props) {
47
+ var _b;
48
+ super(scope, id);
49
+ this.tableColumns = props.tableColumns;
50
+ this.cluster = props.cluster;
51
+ this.databaseName = props.databaseName;
52
+ this.resource = new database_query_1.DatabaseQuery(this, 'Resource', {
53
+ removalPolicy: cdk.RemovalPolicy.RETAIN,
54
+ ...props,
55
+ handler: handler_name_1.HandlerName.Table,
56
+ properties: {
57
+ tableName: {
58
+ prefix: (_b = props.tableName) !== null && _b !== void 0 ? _b : cdk.Names.uniqueId(this),
59
+ generateSuffix: !props.tableName,
60
+ },
61
+ tableColumns: this.tableColumns,
62
+ },
63
+ });
64
+ this.tableName = this.resource.ref;
65
+ }
66
+ /**
67
+ * (experimental) Specify a Redshift table using a table name and schema that already exists.
68
+ *
69
+ * @experimental
70
+ */
71
+ static fromTableAttributes(scope, id, attrs) {
72
+ return new class extends TableBase {
73
+ constructor() {
74
+ super(...arguments);
75
+ this.tableName = attrs.tableName;
76
+ this.tableColumns = attrs.tableColumns;
77
+ this.cluster = attrs.cluster;
78
+ this.databaseName = attrs.databaseName;
79
+ }
80
+ }(scope, id);
81
+ }
82
+ /**
83
+ * (experimental) Apply the given removal policy to this resource.
84
+ *
85
+ * The Removal Policy controls what happens to this resource when it stops
86
+ * being managed by CloudFormation, either because you've removed it from the
87
+ * CDK application or because you've made a change that requires the resource
88
+ * to be replaced.
89
+ *
90
+ * The resource can be destroyed (`RemovalPolicy.DESTROY`), or left in your AWS
91
+ * account for data recovery and cleanup later (`RemovalPolicy.RETAIN`).
92
+ *
93
+ * This resource is retained by default.
94
+ *
95
+ * @experimental
96
+ */
97
+ applyRemovalPolicy(policy) {
98
+ this.resource.applyRemovalPolicy(policy);
99
+ }
100
+ }
101
+ exports.Table = Table;
102
+ _a = JSII_RTTI_SYMBOL_1;
103
+ Table[_a] = { fqn: "@aws-cdk/aws-redshift-alpha.Table", version: "2.0.0-alpha.1" };
104
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0YWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1DQUFtQztBQUduQyw2REFBeUQ7QUFDekQsaUZBQTZFO0FBSTdFLGlHQUFpRztBQUNqRyw4REFBOEQ7QUFDOUQsMkNBQW1EOzs7Ozs7QUFHbkQsSUFBWSxXQXFCWDtBQXJCRCxXQUFZLFdBQVc7SUFFckIsaURBQU0sQ0FBQTtJQUdOLGlEQUFNLENBQUE7SUFHTixpREFBTSxDQUFBO0lBR04saURBQU0sQ0FBQTtJQUdOLDZDQUFJLENBQUE7SUFHSix5REFBVSxDQUFBO0lBR1YsMkNBQUcsQ0FBQTtBQUNMLENBQUMsRUFyQlcsV0FBVyxHQUFYLG1CQUFXLEtBQVgsbUJBQVcsUUFxQnRCO0FBd0RELE1BQWUsU0FBVSxTQUFRLHNCQUFTOzs7Ozs7SUFLeEMsS0FBSyxDQUFDLElBQVcsRUFBRSxHQUFHLE9BQXNCO1FBQzFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQztJQUM1QyxDQUFDO0NBQ0Y7Ozs7OztBQUdELE1BQWEsS0FBTSxTQUFRLFNBQVM7Ozs7SUFrQmxDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBaUI7O1FBQ3pELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUM3QixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7UUFFdkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLDhCQUFhLENBQW9CLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDckUsYUFBYSxFQUFFLEdBQUcsQ0FBQyxhQUFhLENBQUMsTUFBTTtZQUN2QyxHQUFHLEtBQUs7WUFDUixPQUFPLEVBQUUsMEJBQVcsQ0FBQyxLQUFLO1lBQzFCLFVBQVUsRUFBRTtnQkFDVixTQUFTLEVBQUU7b0JBQ1QsTUFBTSxRQUFFLEtBQUssQ0FBQyxTQUFTLG1DQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztvQkFDbkQsY0FBYyxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVM7aUJBQ2pDO2dCQUNELFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTthQUNoQztTQUNGLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7SUFDckMsQ0FBQzs7Ozs7O0lBckNELE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFzQjtRQUM3RSxPQUFPLElBQUksS0FBTSxTQUFRLFNBQVM7WUFBdkI7O2dCQUNBLGNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO2dCQUM1QixpQkFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7Z0JBQ2xDLFlBQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO2dCQUN4QixpQkFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7WUFDN0MsQ0FBQztTQUFBLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2YsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztJQWlDTSxrQkFBa0IsQ0FBQyxNQUF5QjtRQUNqRCxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNDLENBQUM7O0FBNUNILHNCQTZDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBJQ2x1c3RlciB9IGZyb20gJy4vY2x1c3Rlcic7XG5pbXBvcnQgeyBEYXRhYmFzZU9wdGlvbnMgfSBmcm9tICcuL2RhdGFiYXNlLW9wdGlvbnMnO1xuaW1wb3J0IHsgRGF0YWJhc2VRdWVyeSB9IGZyb20gJy4vcHJpdmF0ZS9kYXRhYmFzZS1xdWVyeSc7XG5pbXBvcnQgeyBIYW5kbGVyTmFtZSB9IGZyb20gJy4vcHJpdmF0ZS9kYXRhYmFzZS1xdWVyeS1wcm92aWRlci9oYW5kbGVyLW5hbWUnO1xuaW1wb3J0IHsgVGFibGVIYW5kbGVyUHJvcHMgfSBmcm9tICcuL3ByaXZhdGUvaGFuZGxlci1wcm9wcyc7XG5pbXBvcnQgeyBJVXNlciB9IGZyb20gJy4vdXNlcic7XG5cbi8vIGtlZXAgdGhpcyBpbXBvcnQgc2VwYXJhdGUgZnJvbSBvdGhlciBpbXBvcnRzIHRvIHJlZHVjZSBjaGFuY2UgZm9yIG1lcmdlIGNvbmZsaWN0cyB3aXRoIHYyLW1haW5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kdXBsaWNhdGUtaW1wb3J0cywgaW1wb3J0L29yZGVyXG5pbXBvcnQgeyBDb25zdHJ1Y3QsIElDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbmV4cG9ydCBlbnVtIFRhYmxlQWN0aW9uIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIFNFTEVDVCxcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBJTlNFUlQsXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgVVBEQVRFLFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBERUxFVEUsXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIERST1AsXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgUkVGRVJFTkNFUyxcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIEFMTFxufVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5leHBvcnQgaW50ZXJmYWNlIENvbHVtbiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGRhdGFUeXBlOiBzdHJpbmc7XG59XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVQcm9wcyBleHRlbmRzIERhdGFiYXNlT3B0aW9ucyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSB0YWJsZU5hbWU/OiBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSB0YWJsZUNvbHVtbnM6IENvbHVtbltdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgcmVtb3ZhbFBvbGljeT86IGNkay5SZW1vdmFsUG9saWN5O1xufVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuZXhwb3J0IGludGVyZmFjZSBJVGFibGUgZXh0ZW5kcyBJQ29uc3RydWN0IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IHRhYmxlTmFtZTogc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgdGFibGVDb2x1bW5zOiBDb2x1bW5bXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgY2x1c3RlcjogSUNsdXN0ZXI7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBkYXRhYmFzZU5hbWU6IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBncmFudCh1c2VyOiBJVXNlciwgLi4uYWN0aW9uczogVGFibGVBY3Rpb25bXSk6IHZvaWQ7XG59XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlQXR0cmlidXRlcyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSB0YWJsZU5hbWU6IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IHRhYmxlQ29sdW1uczogQ29sdW1uW107XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGNsdXN0ZXI6IElDbHVzdGVyO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgZGF0YWJhc2VOYW1lOiBzdHJpbmc7XG59XG5cbmFic3RyYWN0IGNsYXNzIFRhYmxlQmFzZSBleHRlbmRzIENvbnN0cnVjdCBpbXBsZW1lbnRzIElUYWJsZSB7XG4gIGFic3RyYWN0IHJlYWRvbmx5IHRhYmxlTmFtZTogc3RyaW5nO1xuICBhYnN0cmFjdCByZWFkb25seSB0YWJsZUNvbHVtbnM6IENvbHVtbltdO1xuICBhYnN0cmFjdCByZWFkb25seSBjbHVzdGVyOiBJQ2x1c3RlcjtcbiAgYWJzdHJhY3QgcmVhZG9ubHkgZGF0YWJhc2VOYW1lOiBzdHJpbmc7XG4gIGdyYW50KHVzZXI6IElVc2VyLCAuLi5hY3Rpb25zOiBUYWJsZUFjdGlvbltdKSB7XG4gICAgdXNlci5hZGRUYWJsZVByaXZpbGVnZXModGhpcywgLi4uYWN0aW9ucyk7XG4gIH1cbn1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbmV4cG9ydCBjbGFzcyBUYWJsZSBleHRlbmRzIFRhYmxlQmFzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBzdGF0aWMgZnJvbVRhYmxlQXR0cmlidXRlcyhzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBhdHRyczogVGFibGVBdHRyaWJ1dGVzKTogSVRhYmxlIHtcbiAgICByZXR1cm4gbmV3IGNsYXNzIGV4dGVuZHMgVGFibGVCYXNlIHtcbiAgICAgIHJlYWRvbmx5IHRhYmxlTmFtZSA9IGF0dHJzLnRhYmxlTmFtZTtcbiAgICAgIHJlYWRvbmx5IHRhYmxlQ29sdW1ucyA9IGF0dHJzLnRhYmxlQ29sdW1ucztcbiAgICAgIHJlYWRvbmx5IGNsdXN0ZXIgPSBhdHRycy5jbHVzdGVyO1xuICAgICAgcmVhZG9ubHkgZGF0YWJhc2VOYW1lID0gYXR0cnMuZGF0YWJhc2VOYW1lO1xuICAgIH0oc2NvcGUsIGlkKTtcbiAgfVxuXG4gIHJlYWRvbmx5IHRhYmxlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSB0YWJsZUNvbHVtbnM6IENvbHVtbltdO1xuICByZWFkb25seSBjbHVzdGVyOiBJQ2x1c3RlcjtcbiAgcmVhZG9ubHkgZGF0YWJhc2VOYW1lOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZXNvdXJjZTogRGF0YWJhc2VRdWVyeTxUYWJsZUhhbmRsZXJQcm9wcz47XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFRhYmxlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy50YWJsZUNvbHVtbnMgPSBwcm9wcy50YWJsZUNvbHVtbnM7XG4gICAgdGhpcy5jbHVzdGVyID0gcHJvcHMuY2x1c3RlcjtcbiAgICB0aGlzLmRhdGFiYXNlTmFtZSA9IHByb3BzLmRhdGFiYXNlTmFtZTtcblxuICAgIHRoaXMucmVzb3VyY2UgPSBuZXcgRGF0YWJhc2VRdWVyeTxUYWJsZUhhbmRsZXJQcm9wcz4odGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgcmVtb3ZhbFBvbGljeTogY2RrLlJlbW92YWxQb2xpY3kuUkVUQUlOLFxuICAgICAgLi4ucHJvcHMsXG4gICAgICBoYW5kbGVyOiBIYW5kbGVyTmFtZS5UYWJsZSxcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgdGFibGVOYW1lOiB7XG4gICAgICAgICAgcHJlZml4OiBwcm9wcy50YWJsZU5hbWUgPz8gY2RrLk5hbWVzLnVuaXF1ZUlkKHRoaXMpLFxuICAgICAgICAgIGdlbmVyYXRlU3VmZml4OiAhcHJvcHMudGFibGVOYW1lLFxuICAgICAgICB9LFxuICAgICAgICB0YWJsZUNvbHVtbnM6IHRoaXMudGFibGVDb2x1bW5zLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMudGFibGVOYW1lID0gdGhpcy5yZXNvdXJjZS5yZWY7XG4gIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHB1YmxpYyBhcHBseVJlbW92YWxQb2xpY3kocG9saWN5OiBjZGsuUmVtb3ZhbFBvbGljeSk6IHZvaWQge1xuICAgIHRoaXMucmVzb3VyY2UuYXBwbHlSZW1vdmFsUG9saWN5KHBvbGljeSk7XG4gIH1cbn1cbiJdfQ==
package/lib/user.d.ts ADDED
@@ -0,0 +1,174 @@
1
+ import * as kms from 'aws-cdk-lib/aws-kms';
2
+ import * as cdk from 'aws-cdk-lib';
3
+ import { ICluster } from './cluster';
4
+ import { DatabaseOptions } from './database-options';
5
+ import { ITable, TableAction } from './table';
6
+ import { Construct, IConstruct } from 'constructs';
7
+ /**
8
+ * (experimental) Properties for configuring a Redshift user.
9
+ *
10
+ * @experimental
11
+ */
12
+ export interface UserProps extends DatabaseOptions {
13
+ /**
14
+ * (experimental) The name of the user.
15
+ *
16
+ * For valid values, see: https://docs.aws.amazon.com/redshift/latest/dg/r_names.html
17
+ *
18
+ * @default - a name is generated
19
+ * @experimental
20
+ */
21
+ readonly username?: string;
22
+ /**
23
+ * (experimental) KMS key to encrypt the generated secret.
24
+ *
25
+ * @default - the default AWS managed key is used
26
+ * @experimental
27
+ */
28
+ readonly encryptionKey?: kms.IKey;
29
+ /**
30
+ * (experimental) The policy to apply when this resource is removed from the application.
31
+ *
32
+ * @default cdk.RemovalPolicy.Destroy
33
+ * @experimental
34
+ */
35
+ readonly removalPolicy?: cdk.RemovalPolicy;
36
+ }
37
+ /**
38
+ * (experimental) Represents a user in a Redshift database.
39
+ *
40
+ * @experimental
41
+ */
42
+ export interface IUser extends IConstruct {
43
+ /**
44
+ * (experimental) The name of the user.
45
+ *
46
+ * @experimental
47
+ */
48
+ readonly username: string;
49
+ /**
50
+ * (experimental) The password of the user.
51
+ *
52
+ * @experimental
53
+ */
54
+ readonly password: cdk.SecretValue;
55
+ /**
56
+ * (experimental) The cluster where the table is located.
57
+ *
58
+ * @experimental
59
+ */
60
+ readonly cluster: ICluster;
61
+ /**
62
+ * (experimental) The name of the database where the table is located.
63
+ *
64
+ * @experimental
65
+ */
66
+ readonly databaseName: string;
67
+ /**
68
+ * (experimental) Grant this user privilege to access a table.
69
+ *
70
+ * @experimental
71
+ */
72
+ addTablePrivileges(table: ITable, ...actions: TableAction[]): void;
73
+ }
74
+ /**
75
+ * (experimental) A full specification of a Redshift user that can be used to import it fluently into the CDK application.
76
+ *
77
+ * @experimental
78
+ */
79
+ export interface UserAttributes extends DatabaseOptions {
80
+ /**
81
+ * (experimental) The name of the user.
82
+ *
83
+ * @experimental
84
+ */
85
+ readonly username: string;
86
+ /**
87
+ * (experimental) The password of the user.
88
+ *
89
+ * Do not put passwords in CDK code directly.
90
+ *
91
+ * @experimental
92
+ */
93
+ readonly password: cdk.SecretValue;
94
+ }
95
+ declare abstract class UserBase extends Construct implements IUser {
96
+ abstract readonly username: string;
97
+ abstract readonly password: cdk.SecretValue;
98
+ abstract readonly cluster: ICluster;
99
+ abstract readonly databaseName: string;
100
+ /**
101
+ * The tables that user will have access to
102
+ */
103
+ private privileges?;
104
+ protected abstract readonly databaseProps: DatabaseOptions;
105
+ /**
106
+ * (experimental) Grant this user privilege to access a table.
107
+ *
108
+ * @experimental
109
+ */
110
+ addTablePrivileges(table: ITable, ...actions: TableAction[]): void;
111
+ }
112
+ /**
113
+ * (experimental) A user in a Redshift cluster.
114
+ *
115
+ * @experimental
116
+ */
117
+ export declare class User extends UserBase {
118
+ /**
119
+ * (experimental) Specify a Redshift user using credentials that already exist.
120
+ *
121
+ * @experimental
122
+ */
123
+ static fromUserAttributes(scope: Construct, id: string, attrs: UserAttributes): IUser;
124
+ /**
125
+ * (experimental) The name of the user.
126
+ *
127
+ * @experimental
128
+ */
129
+ readonly username: string;
130
+ /**
131
+ * (experimental) The password of the user.
132
+ *
133
+ * @experimental
134
+ */
135
+ readonly password: cdk.SecretValue;
136
+ /**
137
+ * (experimental) The cluster where the table is located.
138
+ *
139
+ * @experimental
140
+ */
141
+ readonly cluster: ICluster;
142
+ /**
143
+ * (experimental) The name of the database where the table is located.
144
+ *
145
+ * @experimental
146
+ */
147
+ readonly databaseName: string;
148
+ /**
149
+ * @experimental
150
+ */
151
+ protected databaseProps: DatabaseOptions;
152
+ private resource;
153
+ /**
154
+ * @experimental
155
+ */
156
+ constructor(scope: Construct, id: string, props: UserProps);
157
+ /**
158
+ * (experimental) Apply the given removal policy to this resource.
159
+ *
160
+ * The Removal Policy controls what happens to this resource when it stops
161
+ * being managed by CloudFormation, either because you've removed it from the
162
+ * CDK application or because you've made a change that requires the resource
163
+ * to be replaced.
164
+ *
165
+ * The resource can be destroyed (`RemovalPolicy.DESTROY`), or left in your AWS
166
+ * account for data recovery and cleanup later (`RemovalPolicy.RETAIN`).
167
+ *
168
+ * This resource is destroyed by default.
169
+ *
170
+ * @experimental
171
+ */
172
+ applyRemovalPolicy(policy: cdk.RemovalPolicy): void;
173
+ }
174
+ export {};
package/lib/user.js ADDED
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.User = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ const cdk = require("aws-cdk-lib");
7
+ const database_secret_1 = require("./database-secret");
8
+ const database_query_1 = require("./private/database-query");
9
+ const handler_name_1 = require("./private/database-query-provider/handler-name");
10
+ const privileges_1 = require("./private/privileges");
11
+ // keep this import separate from other imports to reduce chance for merge conflicts with v2-main
12
+ // eslint-disable-next-line no-duplicate-imports, import/order
13
+ const constructs_1 = require("constructs");
14
+ class UserBase extends constructs_1.Construct {
15
+ /**
16
+ * (experimental) Grant this user privilege to access a table.
17
+ *
18
+ * @experimental
19
+ */
20
+ addTablePrivileges(table, ...actions) {
21
+ if (!this.privileges) {
22
+ this.privileges = new privileges_1.UserTablePrivileges(this, 'TablePrivileges', {
23
+ ...this.databaseProps,
24
+ user: this,
25
+ });
26
+ }
27
+ this.privileges.addPrivileges(table, ...actions);
28
+ }
29
+ }
30
+ /**
31
+ * (experimental) A user in a Redshift cluster.
32
+ *
33
+ * @experimental
34
+ */
35
+ class User extends UserBase {
36
+ /**
37
+ * @experimental
38
+ */
39
+ constructor(scope, id, props) {
40
+ var _b;
41
+ super(scope, id);
42
+ this.databaseProps = props;
43
+ this.cluster = props.cluster;
44
+ this.databaseName = props.databaseName;
45
+ const username = (_b = props.username) !== null && _b !== void 0 ? _b : cdk.Names.uniqueId(this).toLowerCase();
46
+ const secret = new database_secret_1.DatabaseSecret(this, 'Secret', {
47
+ username,
48
+ encryptionKey: props.encryptionKey,
49
+ });
50
+ const attachedSecret = secret.attach(props.cluster);
51
+ this.password = attachedSecret.secretValueFromJson('password');
52
+ this.resource = new database_query_1.DatabaseQuery(this, 'Resource', {
53
+ ...this.databaseProps,
54
+ handler: handler_name_1.HandlerName.User,
55
+ properties: {
56
+ username,
57
+ passwordSecretArn: attachedSecret.secretArn,
58
+ },
59
+ });
60
+ attachedSecret.grantRead(this.resource);
61
+ this.username = this.resource.getAttString('username');
62
+ }
63
+ /**
64
+ * (experimental) Specify a Redshift user using credentials that already exist.
65
+ *
66
+ * @experimental
67
+ */
68
+ static fromUserAttributes(scope, id, attrs) {
69
+ return new class extends UserBase {
70
+ constructor() {
71
+ super(...arguments);
72
+ this.username = attrs.username;
73
+ this.password = attrs.password;
74
+ this.cluster = attrs.cluster;
75
+ this.databaseName = attrs.databaseName;
76
+ this.databaseProps = attrs;
77
+ }
78
+ }(scope, id);
79
+ }
80
+ /**
81
+ * (experimental) Apply the given removal policy to this resource.
82
+ *
83
+ * The Removal Policy controls what happens to this resource when it stops
84
+ * being managed by CloudFormation, either because you've removed it from the
85
+ * CDK application or because you've made a change that requires the resource
86
+ * to be replaced.
87
+ *
88
+ * The resource can be destroyed (`RemovalPolicy.DESTROY`), or left in your AWS
89
+ * account for data recovery and cleanup later (`RemovalPolicy.RETAIN`).
90
+ *
91
+ * This resource is destroyed by default.
92
+ *
93
+ * @experimental
94
+ */
95
+ applyRemovalPolicy(policy) {
96
+ this.resource.applyRemovalPolicy(policy);
97
+ }
98
+ }
99
+ exports.User = User;
100
+ _a = JSII_RTTI_SYMBOL_1;
101
+ User[_a] = { fqn: "@aws-cdk/aws-redshift-alpha.User", version: "2.0.0-alpha.1" };
102
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInVzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSxtQ0FBbUM7QUFHbkMsdURBQW1EO0FBQ25ELDZEQUF5RDtBQUN6RCxpRkFBNkU7QUFFN0UscURBQTJEO0FBRzNELGlHQUFpRztBQUNqRyw4REFBOEQ7QUFDOUQsMkNBQW1EO0FBeUNuRCxNQUFlLFFBQVMsU0FBUSxzQkFBUzs7Ozs7O0lBYXZDLGtCQUFrQixDQUFDLEtBQWEsRUFBRSxHQUFHLE9BQXNCO1FBQ3pELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3BCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxnQ0FBbUIsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLEVBQUU7Z0JBQ2pFLEdBQUcsSUFBSSxDQUFDLGFBQWE7Z0JBQ3JCLElBQUksRUFBRSxJQUFJO2FBQ1gsQ0FBQyxDQUFDO1NBQ0o7UUFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQztJQUNuRCxDQUFDO0NBQ0Y7Ozs7OztBQUdELE1BQWEsSUFBSyxTQUFRLFFBQVE7Ozs7SUFvQmhDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBZ0I7O1FBQ3hELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDM0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQzdCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQztRQUV2QyxNQUFNLFFBQVEsU0FBRyxLQUFLLENBQUMsUUFBUSxtQ0FBSSxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMxRSxNQUFNLE1BQU0sR0FBRyxJQUFJLGdDQUFjLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRTtZQUNoRCxRQUFRO1lBQ1IsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhO1NBQ25DLENBQUMsQ0FBQztRQUNILE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxRQUFRLEdBQUcsY0FBYyxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRS9ELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSw4QkFBYSxDQUFtQixJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQ3BFLEdBQUcsSUFBSSxDQUFDLGFBQWE7WUFDckIsT0FBTyxFQUFFLDBCQUFXLENBQUMsSUFBSTtZQUN6QixVQUFVLEVBQUU7Z0JBQ1YsUUFBUTtnQkFDUixpQkFBaUIsRUFBRSxjQUFjLENBQUMsU0FBUzthQUM1QztTQUNGLENBQUMsQ0FBQztRQUNILGNBQWMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXhDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDekQsQ0FBQzs7Ozs7O0lBNUNELE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFxQjtRQUMzRSxPQUFPLElBQUksS0FBTSxTQUFRLFFBQVE7WUFBdEI7O2dCQUNBLGFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO2dCQUMxQixhQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztnQkFDMUIsWUFBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7Z0JBQ3hCLGlCQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQztnQkFDeEIsa0JBQWEsR0FBRyxLQUFLLENBQUM7WUFDM0MsQ0FBQztTQUFBLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2YsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztJQXVDTSxrQkFBa0IsQ0FBQyxNQUF5QjtRQUNqRCxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNDLENBQUM7O0FBbkRILG9CQW9EQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGttcyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mta21zJztcbmltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBJQ2x1c3RlciB9IGZyb20gJy4vY2x1c3Rlcic7XG5pbXBvcnQgeyBEYXRhYmFzZU9wdGlvbnMgfSBmcm9tICcuL2RhdGFiYXNlLW9wdGlvbnMnO1xuaW1wb3J0IHsgRGF0YWJhc2VTZWNyZXQgfSBmcm9tICcuL2RhdGFiYXNlLXNlY3JldCc7XG5pbXBvcnQgeyBEYXRhYmFzZVF1ZXJ5IH0gZnJvbSAnLi9wcml2YXRlL2RhdGFiYXNlLXF1ZXJ5JztcbmltcG9ydCB7IEhhbmRsZXJOYW1lIH0gZnJvbSAnLi9wcml2YXRlL2RhdGFiYXNlLXF1ZXJ5LXByb3ZpZGVyL2hhbmRsZXItbmFtZSc7XG5pbXBvcnQgeyBVc2VySGFuZGxlclByb3BzIH0gZnJvbSAnLi9wcml2YXRlL2hhbmRsZXItcHJvcHMnO1xuaW1wb3J0IHsgVXNlclRhYmxlUHJpdmlsZWdlcyB9IGZyb20gJy4vcHJpdmF0ZS9wcml2aWxlZ2VzJztcbmltcG9ydCB7IElUYWJsZSwgVGFibGVBY3Rpb24gfSBmcm9tICcuL3RhYmxlJztcblxuLy8ga2VlcCB0aGlzIGltcG9ydCBzZXBhcmF0ZSBmcm9tIG90aGVyIGltcG9ydHMgdG8gcmVkdWNlIGNoYW5jZSBmb3IgbWVyZ2UgY29uZmxpY3RzIHdpdGggdjItbWFpblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWR1cGxpY2F0ZS1pbXBvcnRzLCBpbXBvcnQvb3JkZXJcbmltcG9ydCB7IENvbnN0cnVjdCwgSUNvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbmV4cG9ydCBpbnRlcmZhY2UgVXNlclByb3BzIGV4dGVuZHMgRGF0YWJhc2VPcHRpb25zIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgdXNlcm5hbWU/OiBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBlbmNyeXB0aW9uS2V5Pzoga21zLklLZXk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgcmVtb3ZhbFBvbGljeT86IGNkay5SZW1vdmFsUG9saWN5O1xufVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5leHBvcnQgaW50ZXJmYWNlIElVc2VyIGV4dGVuZHMgSUNvbnN0cnVjdCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSB1c2VybmFtZTogc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgcGFzc3dvcmQ6IGNkay5TZWNyZXRWYWx1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgY2x1c3RlcjogSUNsdXN0ZXI7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBkYXRhYmFzZU5hbWU6IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBhZGRUYWJsZVByaXZpbGVnZXModGFibGU6IElUYWJsZSwgLi4uYWN0aW9uczogVGFibGVBY3Rpb25bXSk6IHZvaWQ7XG59XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbmV4cG9ydCBpbnRlcmZhY2UgVXNlckF0dHJpYnV0ZXMgZXh0ZW5kcyBEYXRhYmFzZU9wdGlvbnMge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgdXNlcm5hbWU6IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgcGFzc3dvcmQ6IGNkay5TZWNyZXRWYWx1ZTtcbn1cblxuYWJzdHJhY3QgY2xhc3MgVXNlckJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJVXNlciB7XG4gIGFic3RyYWN0IHJlYWRvbmx5IHVzZXJuYW1lOiBzdHJpbmc7XG4gIGFic3RyYWN0IHJlYWRvbmx5IHBhc3N3b3JkOiBjZGsuU2VjcmV0VmFsdWU7XG4gIGFic3RyYWN0IHJlYWRvbmx5IGNsdXN0ZXI6IElDbHVzdGVyO1xuICBhYnN0cmFjdCByZWFkb25seSBkYXRhYmFzZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHRhYmxlcyB0aGF0IHVzZXIgd2lsbCBoYXZlIGFjY2VzcyB0b1xuICAgKi9cbiAgcHJpdmF0ZSBwcml2aWxlZ2VzPzogVXNlclRhYmxlUHJpdmlsZWdlcztcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVhZG9ubHkgZGF0YWJhc2VQcm9wczogRGF0YWJhc2VPcHRpb25zO1xuXG4gIGFkZFRhYmxlUHJpdmlsZWdlcyh0YWJsZTogSVRhYmxlLCAuLi5hY3Rpb25zOiBUYWJsZUFjdGlvbltdKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnByaXZpbGVnZXMpIHtcbiAgICAgIHRoaXMucHJpdmlsZWdlcyA9IG5ldyBVc2VyVGFibGVQcml2aWxlZ2VzKHRoaXMsICdUYWJsZVByaXZpbGVnZXMnLCB7XG4gICAgICAgIC4uLnRoaXMuZGF0YWJhc2VQcm9wcyxcbiAgICAgICAgdXNlcjogdGhpcyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMucHJpdmlsZWdlcy5hZGRQcml2aWxlZ2VzKHRhYmxlLCAuLi5hY3Rpb25zKTtcbiAgfVxufVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5leHBvcnQgY2xhc3MgVXNlciBleHRlbmRzIFVzZXJCYXNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBzdGF0aWMgZnJvbVVzZXJBdHRyaWJ1dGVzKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGF0dHJzOiBVc2VyQXR0cmlidXRlcyk6IElVc2VyIHtcbiAgICByZXR1cm4gbmV3IGNsYXNzIGV4dGVuZHMgVXNlckJhc2Uge1xuICAgICAgcmVhZG9ubHkgdXNlcm5hbWUgPSBhdHRycy51c2VybmFtZTtcbiAgICAgIHJlYWRvbmx5IHBhc3N3b3JkID0gYXR0cnMucGFzc3dvcmQ7XG4gICAgICByZWFkb25seSBjbHVzdGVyID0gYXR0cnMuY2x1c3RlcjtcbiAgICAgIHJlYWRvbmx5IGRhdGFiYXNlTmFtZSA9IGF0dHJzLmRhdGFiYXNlTmFtZTtcbiAgICAgIHByb3RlY3RlZCByZWFkb25seSBkYXRhYmFzZVByb3BzID0gYXR0cnM7XG4gICAgfShzY29wZSwgaWQpO1xuICB9XG5cbiAgcmVhZG9ubHkgdXNlcm5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgcGFzc3dvcmQ6IGNkay5TZWNyZXRWYWx1ZTtcbiAgcmVhZG9ubHkgY2x1c3RlcjogSUNsdXN0ZXI7XG4gIHJlYWRvbmx5IGRhdGFiYXNlTmFtZTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgZGF0YWJhc2VQcm9wczogRGF0YWJhc2VPcHRpb25zO1xuXG4gIHByaXZhdGUgcmVzb3VyY2U6IERhdGFiYXNlUXVlcnk8VXNlckhhbmRsZXJQcm9wcz47XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFVzZXJQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLmRhdGFiYXNlUHJvcHMgPSBwcm9wcztcbiAgICB0aGlzLmNsdXN0ZXIgPSBwcm9wcy5jbHVzdGVyO1xuICAgIHRoaXMuZGF0YWJhc2VOYW1lID0gcHJvcHMuZGF0YWJhc2VOYW1lO1xuXG4gICAgY29uc3QgdXNlcm5hbWUgPSBwcm9wcy51c2VybmFtZSA/PyBjZGsuTmFtZXMudW5pcXVlSWQodGhpcykudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBzZWNyZXQgPSBuZXcgRGF0YWJhc2VTZWNyZXQodGhpcywgJ1NlY3JldCcsIHtcbiAgICAgIHVzZXJuYW1lLFxuICAgICAgZW5jcnlwdGlvbktleTogcHJvcHMuZW5jcnlwdGlvbktleSxcbiAgICB9KTtcbiAgICBjb25zdCBhdHRhY2hlZFNlY3JldCA9IHNlY3JldC5hdHRhY2gocHJvcHMuY2x1c3Rlcik7XG4gICAgdGhpcy5wYXNzd29yZCA9IGF0dGFjaGVkU2VjcmV0LnNlY3JldFZhbHVlRnJvbUpzb24oJ3Bhc3N3b3JkJyk7XG5cbiAgICB0aGlzLnJlc291cmNlID0gbmV3IERhdGFiYXNlUXVlcnk8VXNlckhhbmRsZXJQcm9wcz4odGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgLi4udGhpcy5kYXRhYmFzZVByb3BzLFxuICAgICAgaGFuZGxlcjogSGFuZGxlck5hbWUuVXNlcixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgdXNlcm5hbWUsXG4gICAgICAgIHBhc3N3b3JkU2VjcmV0QXJuOiBhdHRhY2hlZFNlY3JldC5zZWNyZXRBcm4sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGF0dGFjaGVkU2VjcmV0LmdyYW50UmVhZCh0aGlzLnJlc291cmNlKTtcblxuICAgIHRoaXMudXNlcm5hbWUgPSB0aGlzLnJlc291cmNlLmdldEF0dFN0cmluZygndXNlcm5hbWUnKTtcbiAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHB1YmxpYyBhcHBseVJlbW92YWxQb2xpY3kocG9saWN5OiBjZGsuUmVtb3ZhbFBvbGljeSk6IHZvaWQge1xuICAgIHRoaXMucmVzb3VyY2UuYXBwbHlSZW1vdmFsUG9saWN5KHBvbGljeSk7XG4gIH1cbn1cbiJdfQ==