@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.
- package/.jsii +6985 -0
- package/LICENSE +201 -0
- package/NOTICE +2 -0
- package/README.md +247 -0
- package/lib/cluster.d.ts +454 -0
- package/lib/cluster.js +231 -0
- package/lib/database-options.d.ts +30 -0
- package/lib/database-options.js +3 -0
- package/lib/database-secret.d.ts +35 -0
- package/lib/database-secret.js +32 -0
- package/lib/endpoint.d.ts +31 -0
- package/lib/endpoint.js +28 -0
- package/lib/index.d.ts +8 -0
- package/lib/index.js +22 -0
- package/lib/parameter-group.d.ts +72 -0
- package/lib/parameter-group.js +52 -0
- package/lib/private/database-query-provider/handler-name.d.ts +5 -0
- package/lib/private/database-query-provider/handler-name.js +10 -0
- package/lib/private/database-query-provider/index.d.ts +2 -0
- package/lib/private/database-query-provider/index.js +21 -0
- package/lib/private/database-query-provider/privileges.d.ts +6 -0
- package/lib/private/database-query-provider/privileges.js +57 -0
- package/lib/private/database-query-provider/table.d.ts +6 -0
- package/lib/private/database-query-provider/table.js +56 -0
- package/lib/private/database-query-provider/user.d.ts +9 -0
- package/lib/private/database-query-provider/user.js +69 -0
- package/lib/private/database-query-provider/util.d.ts +4 -0
- package/lib/private/database-query-provider/util.js +41 -0
- package/lib/private/database-query.d.ts +24 -0
- package/lib/private/database-query.js +78 -0
- package/lib/private/handler-props.d.ts +26 -0
- package/lib/private/handler-props.js +3 -0
- package/lib/private/privileges.d.ts +48 -0
- package/lib/private/privileges.js +64 -0
- package/lib/redshift-canned-metrics.generated.d.ts +192 -0
- package/lib/redshift-canned-metrics.generated.js +161 -0
- package/lib/subnet-group.d.ts +74 -0
- package/lib/subnet-group.js +49 -0
- package/lib/table.d.ts +241 -0
- package/lib/table.js +104 -0
- package/lib/user.d.ts +174 -0
- package/lib/user.js +102 -0
- package/package.json +124 -0
- package/rosetta/cluster.ts-fixture +21 -0
- 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==
|