cdk-rds-sql 7.0.2 → 7.2.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/.claude/settings.json +25 -0
- package/.jsii +590 -74
- package/.pre-commit-config.yaml +4 -0
- package/.prettierignore +6 -0
- package/README.md +107 -16
- package/lambda/engine.abstract.ts +16 -0
- package/lambda/engine.dsql.ts +302 -0
- package/lambda/engine.factory.ts +3 -0
- package/lambda/engine.mysql.ts +24 -0
- package/lambda/engine.postgresql.ts +24 -0
- package/lambda/handler.ts +83 -27
- package/lambda/types.ts +10 -0
- package/lib/database.d.ts +2 -2
- package/lib/database.js +8 -3
- package/lib/enum.d.ts +2 -1
- package/lib/enum.js +2 -1
- package/lib/handler/handler.js +24064 -23774
- package/lib/iam-grant.d.ts +20 -0
- package/lib/iam-grant.js +29 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.js +2 -1
- package/lib/provider.d.ts +57 -7
- package/lib/provider.js +128 -27
- package/lib/role.custom-resource.d.ts +2 -2
- package/lib/role.custom-resource.js +2 -2
- package/lib/role.d.ts +7 -3
- package/lib/role.js +82 -65
- package/lib/schema.d.ts +5 -3
- package/lib/schema.js +3 -3
- package/lib/sql.d.ts +2 -2
- package/lib/sql.js +3 -3
- package/package.json +13 -9
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { CustomResource } from "aws-cdk-lib";
|
|
2
|
+
import { Construct } from "constructs";
|
|
3
|
+
import { IProvider } from "./provider";
|
|
4
|
+
export interface IamGrantProps {
|
|
5
|
+
/**
|
|
6
|
+
* Provider.
|
|
7
|
+
*/
|
|
8
|
+
readonly provider: IProvider;
|
|
9
|
+
/**
|
|
10
|
+
* Database role name to grant IAM access to.
|
|
11
|
+
*/
|
|
12
|
+
readonly roleName: string;
|
|
13
|
+
/**
|
|
14
|
+
* IAM resource ARN (role, user, or other IAM principal).
|
|
15
|
+
*/
|
|
16
|
+
readonly resourceArn: string;
|
|
17
|
+
}
|
|
18
|
+
export declare class IamGrant extends CustomResource {
|
|
19
|
+
constructor(scope: Construct, id: string, props: IamGrantProps);
|
|
20
|
+
}
|
package/lib/iam-grant.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.IamGrant = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
7
|
+
const enum_1 = require("./enum");
|
|
8
|
+
const provider_1 = require("./provider");
|
|
9
|
+
class IamGrant extends aws_cdk_lib_1.CustomResource {
|
|
10
|
+
constructor(scope, id, props) {
|
|
11
|
+
// IAM grants are only supported on DSQL
|
|
12
|
+
if (props.provider.engine !== provider_1.DatabaseEngine.DSQL) {
|
|
13
|
+
throw new Error("IAM grants are only supported with DSQL clusters. Use regular database authentication for RDS/Aurora clusters.");
|
|
14
|
+
}
|
|
15
|
+
super(scope, id, {
|
|
16
|
+
serviceToken: props.provider.serviceToken,
|
|
17
|
+
properties: {
|
|
18
|
+
Resource: enum_1.RdsSqlResource.IAM_GRANT,
|
|
19
|
+
ResourceId: props.roleName,
|
|
20
|
+
ResourceArn: props.resourceArn,
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
this.node.addDependency(props.provider);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
exports.IamGrant = IamGrant;
|
|
27
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
28
|
+
IamGrant[_a] = { fqn: "cdk-rds-sql.IamGrant", version: "7.2.0" };
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWFtLWdyYW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2lhbS1ncmFudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUE0QztBQUU1QyxpQ0FBdUM7QUFDdkMseUNBQXNEO0FBbUJ0RCxNQUFhLFFBQVMsU0FBUSw0QkFBYztJQUMxQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQW9CO1FBQzVELHdDQUF3QztRQUN4QyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLHlCQUFjLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbEQsTUFBTSxJQUFJLEtBQUssQ0FDYixnSEFBZ0gsQ0FDakgsQ0FBQTtRQUNILENBQUM7UUFFRCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNmLFlBQVksRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLFlBQVk7WUFDekMsVUFBVSxFQUFFO2dCQUNWLFFBQVEsRUFBRSxxQkFBYyxDQUFDLFNBQVM7Z0JBQ2xDLFVBQVUsRUFBRSxLQUFLLENBQUMsUUFBUTtnQkFDMUIsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO2FBQy9CO1NBQ0YsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3pDLENBQUM7O0FBbEJILDRCQW1CQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEN1c3RvbVJlc291cmNlIH0gZnJvbSBcImF3cy1jZGstbGliXCJcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCJcbmltcG9ydCB7IFJkc1NxbFJlc291cmNlIH0gZnJvbSBcIi4vZW51bVwiXG5pbXBvcnQgeyBJUHJvdmlkZXIsIERhdGFiYXNlRW5naW5lIH0gZnJvbSBcIi4vcHJvdmlkZXJcIlxuXG5leHBvcnQgaW50ZXJmYWNlIElhbUdyYW50UHJvcHMge1xuICAvKipcbiAgICogUHJvdmlkZXIuXG4gICAqL1xuICByZWFkb25seSBwcm92aWRlcjogSVByb3ZpZGVyXG5cbiAgLyoqXG4gICAqIERhdGFiYXNlIHJvbGUgbmFtZSB0byBncmFudCBJQU0gYWNjZXNzIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZU5hbWU6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBJQU0gcmVzb3VyY2UgQVJOIChyb2xlLCB1c2VyLCBvciBvdGhlciBJQU0gcHJpbmNpcGFsKS5cbiAgICovXG4gIHJlYWRvbmx5IHJlc291cmNlQXJuOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIElhbUdyYW50IGV4dGVuZHMgQ3VzdG9tUmVzb3VyY2Uge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogSWFtR3JhbnRQcm9wcykge1xuICAgIC8vIElBTSBncmFudHMgYXJlIG9ubHkgc3VwcG9ydGVkIG9uIERTUUxcbiAgICBpZiAocHJvcHMucHJvdmlkZXIuZW5naW5lICE9PSBEYXRhYmFzZUVuZ2luZS5EU1FMKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiSUFNIGdyYW50cyBhcmUgb25seSBzdXBwb3J0ZWQgd2l0aCBEU1FMIGNsdXN0ZXJzLiBVc2UgcmVndWxhciBkYXRhYmFzZSBhdXRoZW50aWNhdGlvbiBmb3IgUkRTL0F1cm9yYSBjbHVzdGVycy5cIlxuICAgICAgKVxuICAgIH1cblxuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgc2VydmljZVRva2VuOiBwcm9wcy5wcm92aWRlci5zZXJ2aWNlVG9rZW4sXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIFJlc291cmNlOiBSZHNTcWxSZXNvdXJjZS5JQU1fR1JBTlQsXG4gICAgICAgIFJlc291cmNlSWQ6IHByb3BzLnJvbGVOYW1lLFxuICAgICAgICBSZXNvdXJjZUFybjogcHJvcHMucmVzb3VyY2VBcm4sXG4gICAgICB9LFxuICAgIH0pXG4gICAgdGhpcy5ub2RlLmFkZERlcGVuZGVuY3kocHJvcHMucHJvdmlkZXIpXG4gIH1cbn1cbiJdfQ==
|
package/lib/index.d.ts
CHANGED
package/lib/index.js
CHANGED
|
@@ -20,4 +20,5 @@ __exportStar(require("./sql"), exports);
|
|
|
20
20
|
__exportStar(require("./schema"), exports);
|
|
21
21
|
__exportStar(require("./role"), exports);
|
|
22
22
|
__exportStar(require("./database"), exports);
|
|
23
|
-
|
|
23
|
+
__exportStar(require("./iam-grant"), exports);
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHlDQUFzQjtBQUN0Qiw2Q0FBMEI7QUFDMUIsd0NBQXFCO0FBQ3JCLDJDQUF3QjtBQUN4Qix5Q0FBc0I7QUFDdEIsNkNBQTBCO0FBQzFCLDhDQUEyQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2VudW1cIlxuZXhwb3J0ICogZnJvbSBcIi4vcHJvdmlkZXJcIlxuZXhwb3J0ICogZnJvbSBcIi4vc3FsXCJcbmV4cG9ydCAqIGZyb20gXCIuL3NjaGVtYVwiXG5leHBvcnQgKiBmcm9tIFwiLi9yb2xlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2RhdGFiYXNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2lhbS1ncmFudFwiXG4iXX0=
|
package/lib/provider.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Duration } from "aws-cdk-lib";
|
|
2
|
+
import * as dsql from "aws-cdk-lib/aws-dsql";
|
|
2
3
|
import { IVpc, SubnetSelection } from "aws-cdk-lib/aws-ec2";
|
|
3
4
|
import { IFunction } from "aws-cdk-lib/aws-lambda";
|
|
4
5
|
import * as lambda from "aws-cdk-lib/aws-lambda-nodejs";
|
|
@@ -11,10 +12,12 @@ export interface RdsSqlProps {
|
|
|
11
12
|
* VPC network to place the provider lambda.
|
|
12
13
|
*
|
|
13
14
|
* Normally this is the VPC of your database.
|
|
15
|
+
* Required when your database is only accessible in a VPC.
|
|
16
|
+
* Not required for DSQL as it uses public endpoints with IAM authentication.
|
|
14
17
|
*
|
|
15
18
|
* @default - Function is not placed within a VPC.
|
|
16
19
|
*/
|
|
17
|
-
readonly vpc
|
|
20
|
+
readonly vpc?: IVpc;
|
|
18
21
|
/**
|
|
19
22
|
* Where to place the network provider lambda within the VPC.
|
|
20
23
|
*
|
|
@@ -22,15 +25,21 @@ export interface RdsSqlProps {
|
|
|
22
25
|
*/
|
|
23
26
|
readonly vpcSubnets?: SubnetSelection;
|
|
24
27
|
/**
|
|
25
|
-
* Your database.
|
|
28
|
+
* Your database cluster or instance.
|
|
29
|
+
* Supports both traditional RDS/Aurora clusters and DSQL clusters.
|
|
30
|
+
* - For RDS/Aurora: security groups will be configured to allow access
|
|
31
|
+
* - For DSQL: IAM authentication will be used instead of secrets
|
|
26
32
|
*/
|
|
27
|
-
readonly cluster: IDatabaseCluster | IDatabaseInstance;
|
|
33
|
+
readonly cluster: IDatabaseCluster | IDatabaseInstance | dsql.CfnCluster;
|
|
28
34
|
/**
|
|
29
35
|
* Secret that grants access to your database.
|
|
30
36
|
*
|
|
31
37
|
* Usually this is your cluster's master secret.
|
|
38
|
+
* Not required when relying on IAM authentication (such as DSQL).
|
|
39
|
+
*
|
|
40
|
+
* @default - undefined for DSQL clusters using IAM authentication
|
|
32
41
|
*/
|
|
33
|
-
readonly secret
|
|
42
|
+
readonly secret?: ISecret;
|
|
34
43
|
/**
|
|
35
44
|
* Timeout for lambda to do its work.
|
|
36
45
|
*
|
|
@@ -60,11 +69,52 @@ export interface RdsSqlProps {
|
|
|
60
69
|
*/
|
|
61
70
|
readonly ssl?: boolean;
|
|
62
71
|
}
|
|
63
|
-
|
|
72
|
+
/**
|
|
73
|
+
* Supported database engines
|
|
74
|
+
*/
|
|
75
|
+
export declare enum DatabaseEngine {
|
|
76
|
+
POSTGRES = "postgres",
|
|
77
|
+
MYSQL = "mysql",
|
|
78
|
+
DSQL = "dsql"
|
|
79
|
+
}
|
|
80
|
+
export interface IProvider {
|
|
81
|
+
readonly serviceToken: string;
|
|
82
|
+
readonly handler: IFunction;
|
|
83
|
+
readonly secret?: ISecret;
|
|
84
|
+
readonly engine: string;
|
|
85
|
+
readonly cluster?: IDatabaseCluster | IDatabaseInstance | dsql.CfnCluster;
|
|
86
|
+
}
|
|
87
|
+
export interface ProviderAttributes {
|
|
88
|
+
/**
|
|
89
|
+
* Either the ARN or name of the Lambda function.
|
|
90
|
+
* Use functionArn for cross-account or cross-region scenarios.
|
|
91
|
+
* Use functionName for same-account, same-region scenarios.
|
|
92
|
+
*/
|
|
93
|
+
readonly functionArn?: string;
|
|
94
|
+
readonly functionName?: string;
|
|
95
|
+
readonly engine: DatabaseEngine;
|
|
96
|
+
/**
|
|
97
|
+
* Optional cluster information for role creation.
|
|
98
|
+
*
|
|
99
|
+
* When importing a provider, cluster details are often not available.
|
|
100
|
+
* However, some operations like role creation require cluster endpoint
|
|
101
|
+
* information to build connection secrets.
|
|
102
|
+
*
|
|
103
|
+
* If you plan to create roles with the imported provider, you must
|
|
104
|
+
* provide the cluster reference. If you only plan to use existing
|
|
105
|
+
* roles, databases, schemas, or SQL operations, this can be omitted.
|
|
106
|
+
*/
|
|
107
|
+
readonly cluster?: IDatabaseCluster | IDatabaseInstance | dsql.CfnCluster;
|
|
108
|
+
}
|
|
109
|
+
export declare class Provider extends Construct implements IProvider {
|
|
110
|
+
/**
|
|
111
|
+
* Import an existing provider Lambda function
|
|
112
|
+
*/
|
|
113
|
+
static fromProviderAttributes(scope: Construct, id: string, attrs: ProviderAttributes): IProvider;
|
|
64
114
|
readonly serviceToken: string;
|
|
65
|
-
readonly secret
|
|
115
|
+
readonly secret?: ISecret;
|
|
66
116
|
readonly handler: IFunction;
|
|
67
|
-
readonly cluster
|
|
117
|
+
readonly cluster?: IDatabaseCluster | IDatabaseInstance | dsql.CfnCluster;
|
|
68
118
|
/**
|
|
69
119
|
* The engine like "postgres" or "mysql"
|
|
70
120
|
*
|
package/lib/provider.js
CHANGED
|
@@ -1,38 +1,79 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var _a;
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.Provider = void 0;
|
|
4
|
+
exports.Provider = exports.DatabaseEngine = void 0;
|
|
5
5
|
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
6
|
const fs_1 = require("fs");
|
|
7
7
|
const path = require("path");
|
|
8
8
|
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
9
|
+
const dsql = require("aws-cdk-lib/aws-dsql");
|
|
9
10
|
const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
|
|
10
11
|
const iam = require("aws-cdk-lib/aws-iam");
|
|
11
12
|
const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
|
|
12
13
|
const lambda = require("aws-cdk-lib/aws-lambda-nodejs");
|
|
13
14
|
const customResources = require("aws-cdk-lib/custom-resources");
|
|
14
15
|
const constructs_1 = require("constructs");
|
|
16
|
+
/**
|
|
17
|
+
* Helper function to determine if a cluster is a DSQL cluster
|
|
18
|
+
*/
|
|
19
|
+
function isDsqlCluster(cluster) {
|
|
20
|
+
return cluster instanceof dsql.CfnCluster;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Supported database engines
|
|
24
|
+
*/
|
|
25
|
+
var DatabaseEngine;
|
|
26
|
+
(function (DatabaseEngine) {
|
|
27
|
+
DatabaseEngine["POSTGRES"] = "postgres";
|
|
28
|
+
DatabaseEngine["MYSQL"] = "mysql";
|
|
29
|
+
DatabaseEngine["DSQL"] = "dsql";
|
|
30
|
+
})(DatabaseEngine || (exports.DatabaseEngine = DatabaseEngine = {}));
|
|
15
31
|
class Provider extends constructs_1.Construct {
|
|
32
|
+
/**
|
|
33
|
+
* Import an existing provider Lambda function
|
|
34
|
+
*/
|
|
35
|
+
static fromProviderAttributes(scope, id, attrs) {
|
|
36
|
+
return new ImportedProvider(scope, id, attrs);
|
|
37
|
+
}
|
|
16
38
|
constructor(scope, id, props) {
|
|
17
39
|
super(scope, id);
|
|
40
|
+
// Validate configuration
|
|
41
|
+
const isDsql = isDsqlCluster(props.cluster);
|
|
42
|
+
if (!isDsql && !props.secret) {
|
|
43
|
+
throw new Error("Either secret (for traditional RDS) or cluster with DSQL must be provided");
|
|
44
|
+
}
|
|
45
|
+
if (!isDsql && !props.vpc) {
|
|
46
|
+
throw new Error("VPC is required for traditional RDS databases");
|
|
47
|
+
}
|
|
48
|
+
if (isDsql && props.secret) {
|
|
49
|
+
throw new Error("secret should not be provided when using DSQL cluster (uses IAM authentication)");
|
|
50
|
+
}
|
|
18
51
|
this.secret = props.secret;
|
|
19
52
|
this.cluster = props.cluster;
|
|
20
53
|
// Determine engine from cluster/instance instead of hardcoding
|
|
21
|
-
if (
|
|
54
|
+
if (isDsql) {
|
|
55
|
+
// DSQL is always PostgreSQL-compatible
|
|
56
|
+
this.engine = DatabaseEngine.DSQL;
|
|
57
|
+
}
|
|
58
|
+
else if ("clusterIdentifier" in props.cluster) {
|
|
22
59
|
// It's a DatabaseCluster
|
|
23
60
|
const clusterEngine = props.cluster.engine;
|
|
24
61
|
this.engine =
|
|
25
|
-
clusterEngine && clusterEngine.engineFamily === "MYSQL"
|
|
62
|
+
clusterEngine && clusterEngine.engineFamily === "MYSQL"
|
|
63
|
+
? DatabaseEngine.MYSQL
|
|
64
|
+
: DatabaseEngine.POSTGRES;
|
|
26
65
|
}
|
|
27
66
|
else if ("instanceIdentifier" in props.cluster) {
|
|
28
67
|
// It's a DatabaseInstance
|
|
29
68
|
const instanceEngine = props.cluster.engine;
|
|
30
69
|
this.engine =
|
|
31
|
-
instanceEngine && instanceEngine.engineFamily === "MYSQL"
|
|
70
|
+
instanceEngine && instanceEngine.engineFamily === "MYSQL"
|
|
71
|
+
? DatabaseEngine.MYSQL
|
|
72
|
+
: DatabaseEngine.POSTGRES;
|
|
32
73
|
}
|
|
33
74
|
else {
|
|
34
75
|
// Fallback to postgres if engine hasn't been provided
|
|
35
|
-
this.engine =
|
|
76
|
+
this.engine = DatabaseEngine.POSTGRES;
|
|
36
77
|
}
|
|
37
78
|
const functionName = "RdsSql" + slugify("28b9e791-af60-4a33-bca8-ffb6f30ef8c5");
|
|
38
79
|
this.handler =
|
|
@@ -42,21 +83,35 @@ class Provider extends constructs_1.Construct {
|
|
|
42
83
|
onEventHandler: this.handler,
|
|
43
84
|
});
|
|
44
85
|
this.serviceToken = provider.serviceToken;
|
|
45
|
-
|
|
46
|
-
if (
|
|
47
|
-
//
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
86
|
+
// Handle database connection setup
|
|
87
|
+
if (isDsql) {
|
|
88
|
+
// For DSQL, grant IAM permissions instead of VPC security groups
|
|
89
|
+
const dsqlCluster = props.cluster;
|
|
90
|
+
this.handler.addToRolePolicy(new iam.PolicyStatement({
|
|
91
|
+
effect: iam.Effect.ALLOW,
|
|
92
|
+
actions: ["dsql:DbConnectAdmin"],
|
|
93
|
+
resources: [dsqlCluster.attrResourceArn],
|
|
94
|
+
}));
|
|
52
95
|
}
|
|
53
96
|
else {
|
|
54
|
-
|
|
55
|
-
this.
|
|
97
|
+
// Traditional RDS setup with security groups and secrets
|
|
98
|
+
this.secret.grantRead(this.handler);
|
|
99
|
+
if (this.secret.encryptionKey) {
|
|
100
|
+
// It seems we need to grant explicit permission
|
|
101
|
+
this.secret.encryptionKey.grantDecrypt(this.handler);
|
|
102
|
+
}
|
|
103
|
+
if (props.cluster.connections.securityGroups.length === 0) {
|
|
104
|
+
throw new Error("Cluster does not have a security group.");
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
const securityGroup = props.cluster.connections.securityGroups[0];
|
|
108
|
+
this.handler.node.defaultChild?.node.addDependency(securityGroup);
|
|
109
|
+
}
|
|
56
110
|
}
|
|
57
111
|
this.node.addDependency(props.cluster);
|
|
58
112
|
}
|
|
59
113
|
newCustomResourceHandler(scope, id, props) {
|
|
114
|
+
const isDsql = isDsqlCluster(props.cluster);
|
|
60
115
|
const handlerDir = path.join(__dirname, "handler");
|
|
61
116
|
const index_ts = path.join(handlerDir, "index.ts");
|
|
62
117
|
const index_js = path.join(handlerDir, "index.js");
|
|
@@ -78,6 +133,23 @@ class Provider extends constructs_1.Construct {
|
|
|
78
133
|
};
|
|
79
134
|
}
|
|
80
135
|
const logger = props.logger ?? false;
|
|
136
|
+
// Build environment variables
|
|
137
|
+
const environment = {
|
|
138
|
+
LOGGER: logger.toString(),
|
|
139
|
+
...ssl_options,
|
|
140
|
+
};
|
|
141
|
+
// Add DSQL-specific environment variables
|
|
142
|
+
if (isDsql) {
|
|
143
|
+
const dsqlCluster = props.cluster;
|
|
144
|
+
const clusterId = dsqlCluster.attrIdentifier;
|
|
145
|
+
const region = aws_cdk_lib_1.Stack.of(scope).region;
|
|
146
|
+
environment.DSQL_ENDPOINT = `${clusterId}.dsql.${region}.on.aws`;
|
|
147
|
+
environment.DSQL_PORT = "5432";
|
|
148
|
+
}
|
|
149
|
+
else if (props.secret) {
|
|
150
|
+
// Add secret ARN to environment for traditional RDS
|
|
151
|
+
environment.SECRET_ARN = props.secret.secretArn;
|
|
152
|
+
}
|
|
81
153
|
const deleteParameterPolicy = new iam.PolicyStatement({
|
|
82
154
|
actions: ["ssm:DeleteParameter"],
|
|
83
155
|
resources: [
|
|
@@ -91,10 +163,15 @@ class Provider extends constructs_1.Construct {
|
|
|
91
163
|
});
|
|
92
164
|
const fn = new lambda.NodejsFunction(scope, id, {
|
|
93
165
|
...props.functionProps,
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
166
|
+
// Only configure VPC for traditional RDS
|
|
167
|
+
...(isDsql
|
|
168
|
+
? {}
|
|
169
|
+
: {
|
|
170
|
+
vpc: props.vpc,
|
|
171
|
+
vpcSubnets: props.vpcSubnets ?? {
|
|
172
|
+
subnetType: aws_ec2_1.SubnetType.PRIVATE_ISOLATED,
|
|
173
|
+
},
|
|
174
|
+
}),
|
|
98
175
|
entry: entry,
|
|
99
176
|
runtime: aws_lambda_1.Runtime.NODEJS_22_X,
|
|
100
177
|
timeout: props.timeout ?? props.functionProps?.timeout ?? aws_cdk_lib_1.Duration.seconds(300),
|
|
@@ -114,26 +191,50 @@ class Provider extends constructs_1.Construct {
|
|
|
114
191
|
},
|
|
115
192
|
},
|
|
116
193
|
},
|
|
117
|
-
environment
|
|
118
|
-
LOGGER: logger.toString(),
|
|
119
|
-
...ssl_options,
|
|
120
|
-
},
|
|
194
|
+
environment,
|
|
121
195
|
initialPolicy: [
|
|
122
196
|
deleteParameterPolicy,
|
|
123
197
|
...(props.functionProps?.initialPolicy ?? []),
|
|
124
198
|
],
|
|
125
199
|
});
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
props.
|
|
200
|
+
// Only configure security groups for traditional RDS (not DSQL)
|
|
201
|
+
if (!isDsql &&
|
|
202
|
+
(!props.functionProps?.securityGroups ||
|
|
203
|
+
props.functionProps?.securityGroups.length === 0)) {
|
|
204
|
+
const rdsCluster = props.cluster;
|
|
205
|
+
rdsCluster.connections.allowDefaultPortFrom(fn, "Allow the rds sql handler to connect to db");
|
|
129
206
|
}
|
|
130
207
|
return fn;
|
|
131
208
|
}
|
|
132
209
|
}
|
|
133
210
|
exports.Provider = Provider;
|
|
134
211
|
_a = JSII_RTTI_SYMBOL_1;
|
|
135
|
-
Provider[_a] = { fqn: "cdk-rds-sql.Provider", version: "7.0
|
|
212
|
+
Provider[_a] = { fqn: "cdk-rds-sql.Provider", version: "7.2.0" };
|
|
213
|
+
class ImportedProvider extends constructs_1.Construct {
|
|
214
|
+
constructor(scope, id, attrs) {
|
|
215
|
+
super(scope, id);
|
|
216
|
+
// Validate that either functionArn or functionName is provided
|
|
217
|
+
if (!attrs.functionArn && !attrs.functionName) {
|
|
218
|
+
throw new Error("Either functionArn or functionName must be provided");
|
|
219
|
+
}
|
|
220
|
+
if (attrs.functionArn && attrs.functionName) {
|
|
221
|
+
throw new Error("Provide either functionArn or functionName, not both");
|
|
222
|
+
}
|
|
223
|
+
// Import the existing Lambda function
|
|
224
|
+
this.handler = attrs.functionArn
|
|
225
|
+
? aws_lambda_1.Function.fromFunctionArn(this, "Handler", attrs.functionArn)
|
|
226
|
+
: aws_lambda_1.Function.fromFunctionName(this, "Handler", attrs.functionName);
|
|
227
|
+
// Derive serviceToken by wrapping in custom resource provider
|
|
228
|
+
const provider = new customResources.Provider(this, "Provider", {
|
|
229
|
+
onEventHandler: this.handler,
|
|
230
|
+
});
|
|
231
|
+
this.serviceToken = provider.serviceToken;
|
|
232
|
+
this.engine = attrs.engine;
|
|
233
|
+
this.secret = undefined; // Imported providers get secret from environment
|
|
234
|
+
this.cluster = attrs.cluster; // Optional cluster for role creation
|
|
235
|
+
}
|
|
236
|
+
}
|
|
136
237
|
function slugify(x) {
|
|
137
238
|
return x.replace(/[^a-zA-Z0-9]/g, "");
|
|
138
239
|
}
|
|
139
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwyQkFBK0I7QUFDL0IsNkJBQTRCO0FBQzVCLDZDQUE2QztBQUM3QyxpREFBdUU7QUFDdkUsMkNBQTBDO0FBQzFDLHVEQUEyRDtBQUMzRCx3REFBdUQ7QUFJdkQsZ0VBQStEO0FBQy9ELDJDQUFzQztBQWdFdEMsTUFBYSxRQUFTLFNBQVEsc0JBQVM7SUFhckMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFrQjtRQUMxRCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBQ2hCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQTtRQUMxQixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUE7UUFFNUIsK0RBQStEO1FBQy9ELElBQUksbUJBQW1CLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3pDLHlCQUF5QjtZQUN6QixNQUFNLGFBQWEsR0FBSSxLQUFLLENBQUMsT0FBNEIsQ0FBQyxNQUFNLENBQUE7WUFDaEUsSUFBSSxDQUFDLE1BQU07Z0JBQ1QsYUFBYSxJQUFJLGFBQWEsQ0FBQyxZQUFZLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQTtRQUNsRixDQUFDO2FBQU0sSUFBSSxvQkFBb0IsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakQsMEJBQTBCO1lBQzFCLE1BQU0sY0FBYyxHQUFJLEtBQUssQ0FBQyxPQUE2QixDQUFDLE1BQU0sQ0FBQTtZQUNsRSxJQUFJLENBQUMsTUFBTTtnQkFDVCxjQUFjLElBQUksY0FBYyxDQUFDLFlBQVksS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFBO1FBQ3BGLENBQUM7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QUM7b0JBQ0QsYUFBYTt3QkFDWCxPQUFPLEVBQUUsQ0FBQTtvQkFDWCxDQUFDO2lCQUNGO2FBQ0Y7WUFDRCxXQUFXLEVBQUU7Z0JBQ1gsTUFBTSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUU7Z0JBQ3pCLEdBQUcsV0FBVzthQUNmO1lBQ0QsYUFBYSxFQUFFO2dCQUNiLHFCQUFxQjtnQkFDckIsR0FBRyxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsYUFBYSxJQUFJLEVBQUUsQ0FBQzthQUM5QztTQUNGLENBQUMsQ0FBQTtRQUVGLElBQ0UsQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLGNBQWM7WUFDcEMsS0FBSyxDQUFDLGFBQWEsRUFBRSxjQUFjLENBQUMsTUFBTSxLQUFLLENBQUMsRUFDaEQsQ0FBQztZQUNELEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUM1QyxFQUFFLEVBQ0YsNENBQTRDLENBQzdDLENBQUE7UUFDSCxDQUFDO1FBRUQsT0FBTyxFQUFFLENBQUE7SUFDWCxDQUFDOztBQW5KSCw0QkFvSkM7OztBQUVELFNBQVMsT0FBTyxDQUFDLENBQVM7SUFDeEIsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUMsQ0FBQTtBQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gXCJmc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCB7IER1cmF0aW9uLCBTdGFjayB9IGZyb20gXCJhd3MtY2RrLWxpYlwiXG5pbXBvcnQgeyBJVnBjLCBTdWJuZXRUeXBlLCBTdWJuZXRTZWxlY3Rpb24gfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiXG5pbXBvcnQgKiBhcyBpYW0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIlxuaW1wb3J0IHsgSUZ1bmN0aW9uLCBSdW50aW1lIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIlxuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhLW5vZGVqc1wiXG5pbXBvcnQgeyBOb2RlanNGdW5jdGlvblByb3BzIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGEtbm9kZWpzXCJcbmltcG9ydCB7IElEYXRhYmFzZUNsdXN0ZXIsIElEYXRhYmFzZUluc3RhbmNlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yZHNcIlxuaW1wb3J0IHsgSVNlY3JldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXJcIlxuaW1wb3J0ICogYXMgY3VzdG9tUmVzb3VyY2VzIGZyb20gXCJhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzXCJcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCJcblxuZXhwb3J0IGludGVyZmFjZSBSZHNTcWxQcm9wcyB7XG4gIC8qKlxuICAgKiBWUEMgbmV0d29yayB0byBwbGFjZSB0aGUgcHJvdmlkZXIgbGFtYmRhLlxuICAgKlxuICAgKiBOb3JtYWxseSB0aGlzIGlzIHRoZSBWUEMgb2YgeW91ciBkYXRhYmFzZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBGdW5jdGlvbiBpcyBub3QgcGxhY2VkIHdpdGhpbiBhIFZQQy5cbiAgICovXG4gIHJlYWRvbmx5IHZwYzogSVZwY1xuXG4gIC8qKlxuICAgKiBXaGVyZSB0byBwbGFjZSB0aGUgbmV0d29yayBwcm92aWRlciBsYW1iZGEgd2l0aGluIHRoZSBWUEMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIGlzb2xhdGVkIHN1Ym5ldCBpZiBub3Qgc3BlY2lmaWVkXG4gICAqL1xuICByZWFkb25seSB2cGNTdWJuZXRzPzogU3VibmV0U2VsZWN0aW9uXG5cbiAgLyoqXG4gICAqIFlvdXIgZGF0YWJhc2UuXG4gICAqL1xuICByZWFkb25seSBjbHVzdGVyOiBJRGF0YWJhc2VDbHVzdGVyIHwgSURhdGFiYXNlSW5zdGFuY2VcblxuICAvKipcbiAgICogU2VjcmV0IHRoYXQgZ3JhbnRzIGFjY2VzcyB0byB5b3VyIGRhdGFiYXNlLlxuICAgKlxuICAgKiBVc3VhbGx5IHRoaXMgaXMgeW91ciBjbHVzdGVyJ3MgbWFzdGVyIHNlY3JldC5cbiAgICovXG4gIHJlYWRvbmx5IHNlY3JldDogSVNlY3JldFxuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGZvciBsYW1iZGEgdG8gZG8gaXRzIHdvcmsuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gNSBtaW51dGVzXG4gICAqL1xuICByZWFkb25seSB0aW1lb3V0PzogRHVyYXRpb25cblxuICAvKipcbiAgICogTG9nIFNRTCBzdGF0ZW1lbnRzLiBUaGlzIGluY2x1ZGVzIHBhc3N3b3Jkcy4gVXNlIG9ubHkgZm9yIGRlYnVnZ2luZy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgbG9nZ2VyPzogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGZ1bmN0aW9uIGN1c3RvbWl6YXRpb24uXG4gICAqXG4gICAqIFRoaXMgZW5hYmxlcyBhZGRpdGlvbmFsIGZ1bmN0aW9uIGN1c3RvbWl6YXRpb24gc3VjaCBhcyB0aGUgbG9nIGdyb3VwLiBIb3dldmVyLFxuICAgKiBsYW1iZGEgZnVuY3Rpb24gcHJvcGVydGllcyBjb250cm9sbGVkIGJ5IG90aGVyIHtSZHNTcWxQcm9wc30gcGFyYW1ldGVycyB3aWxsIHRydW1wXG4gICAqIG9waW9ucyBzZXQgdmlhIHRoaXMgcGFyYW1ldGVyLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGVtcHR5XG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvblByb3BzPzogTm9kZWpzRnVuY3Rpb25Qcm9wc1xuXG4gIC8qKlxuICAgKiBVc2UgU1NMP1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHNzbD86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGNsYXNzIFByb3ZpZGVyIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IHNlcnZpY2VUb2tlbjogc3RyaW5nXG4gIHB1YmxpYyByZWFkb25seSBzZWNyZXQ6IElTZWNyZXRcbiAgcHVibGljIHJlYWRvbmx5IGhhbmRsZXI6IElGdW5jdGlvblxuICBwdWJsaWMgcmVhZG9ubHkgY2x1c3RlcjogSURhdGFiYXNlQ2x1c3RlciB8IElEYXRhYmFzZUluc3RhbmNlXG5cbiAgLyoqXG4gICAqIFRoZSBlbmdpbmUgbGlrZSBcInBvc3RncmVzXCIgb3IgXCJteXNxbFwiXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gaWYgd2UgY2Fubm90IGRldGVybWluZSB0aGlzIFwicG9zdGdyZXNcIlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVuZ2luZTogc3RyaW5nXG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFJkc1NxbFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuICAgIHRoaXMuc2VjcmV0ID0gcHJvcHMuc2VjcmV0XG4gICAgdGhpcy5jbHVzdGVyID0gcHJvcHMuY2x1c3RlclxuXG4gICAgLy8gRGV0ZXJtaW5lIGVuZ2luZSBmcm9tIGNsdXN0ZXIvaW5zdGFuY2UgaW5zdGVhZCBvZiBoYXJkY29kaW5nXG4gICAgaWYgKFwiY2x1c3RlcklkZW50aWZpZXJcIiBpbiBwcm9wcy5jbHVzdGVyKSB7XG4gICAgICAvLyBJdCdzIGEgRGF0YWJhc2VDbHVzdGVyXG4gICAgICBjb25zdCBjbHVzdGVyRW5naW5lID0gKHByb3BzLmNsdXN0ZXIgYXMgSURhdGFiYXNlQ2x1c3RlcikuZW5naW5lXG4gICAgICB0aGlzLmVuZ2luZSA9XG4gICAgICAgIGNsdXN0ZXJFbmdpbmUgJiYgY2x1c3RlckVuZ2luZS5lbmdpbmVGYW1pbHkgPT09IFwiTVlTUUxcIiA/IFwibXlzcWxcIiA6IFwicG9zdGdyZXNcIlxuICAgIH0gZWxzZSBpZiAoXCJpbnN0YW5jZUlkZW50aWZpZXJcIiBpbiBwcm9wcy5jbHVzdGVyKSB7XG4gICAgICAvLyBJdCdzIGEgRGF0YWJhc2VJbnN0YW5jZVxuICAgICAgY29uc3QgaW5zdGFuY2VFbmdpbmUgPSAocHJvcHMuY2x1c3RlciBhcyBJRGF0YWJhc2VJbnN0YW5jZSkuZW5naW5lXG4gICAgICB0aGlzLmVuZ2luZSA9XG4gICAgICAgIGluc3RhbmNlRW5naW5lICYmIGluc3RhbmNlRW5naW5lLmVuZ2luZUZhbWlseSA9PT0gXCJNWVNRTFwiID8gXCJteXNxbFwiIDogXCJwb3N0Z3Jlc1wiXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZhbGxiYWNrIHRvIHBvc3RncmVzIGlmIGVuZ2luZSBoYXNuJ3QgYmVlbiBwcm92aWRlZFxuICAgICAgdGhpcy5lbmdpbmUgPSBcInBvc3RncmVzXCJcbiAgICB9XG5cbiAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBcIlJkc1NxbFwiICsgc2x1Z2lmeShcIjI4YjllNzkxLWFmNjAtNGEzMy1iY2E4LWZmYjZmMzBlZjhjNVwiKVxuICAgIHRoaXMuaGFuZGxlciA9XG4gICAgICAoU3RhY2sub2YodGhpcykubm9kZS50cnlGaW5kQ2hpbGQoZnVuY3Rpb25OYW1lKSBhcyBJRnVuY3Rpb24pID8/XG4gICAgICB0aGlzLm5ld0N1c3RvbVJlc291cmNlSGFuZGxlcihzY29wZSwgZnVuY3Rpb25OYW1lLCBwcm9wcylcblxuICAgIGNvbnN0IHByb3ZpZGVyID0gbmV3IGN1c3RvbVJlc291cmNlcy5Qcm92aWRlcih0aGlzLCBcIlJkc1NxbFwiLCB7XG4gICAgICBvbkV2ZW50SGFuZGxlcjogdGhpcy5oYW5kbGVyLFxuICAgIH0pXG4gICAgdGhpcy5zZXJ2aWNlVG9rZW4gPSBwcm92aWRlci5zZXJ2aWNlVG9rZW5cbiAgICB0aGlzLnNlY3JldC5ncmFudFJlYWQodGhpcy5oYW5kbGVyKVxuICAgIGlmICh0aGlzLnNlY3JldC5lbmNyeXB0aW9uS2V5KSB7XG4gICAgICAvLyBJdCBzZWVtcyB3ZSBuZWVkIHRvIGdyYW50IGV4cGxpY2l0IHBlcm1pc3Npb25cbiAgICAgIHRoaXMuc2VjcmV0LmVuY3J5cHRpb25LZXkuZ3JhbnREZWNyeXB0KHRoaXMuaGFuZGxlcilcbiAgICB9XG4gICAgaWYgKHByb3BzLmNsdXN0ZXIuY29ubmVjdGlvbnMuc2VjdXJpdHlHcm91cHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDbHVzdGVyIGRvZXMgbm90IGhhdmUgYSBzZWN1cml0eSBncm91cC5cIilcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc2VjdXJpdHlHcm91cCA9IHByb3BzLmNsdXN0ZXIuY29ubmVjdGlvbnMuc2VjdXJpdHlHcm91cHNbMF0hXG4gICAgICB0aGlzLmhhbmRsZXIubm9kZS5kZWZhdWx0Q2hpbGQ/Lm5vZGUuYWRkRGVwZW5kZW5jeShzZWN1cml0eUdyb3VwKVxuICAgIH1cbiAgICB0aGlzLm5vZGUuYWRkRGVwZW5kZW5jeShwcm9wcy5jbHVzdGVyKVxuICB9XG5cbiAgcHJvdGVjdGVkIG5ld0N1c3RvbVJlc291cmNlSGFuZGxlcihcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IFJkc1NxbFByb3BzXG4gICk6IGxhbWJkYS5Ob2RlanNGdW5jdGlvbiB7XG4gICAgY29uc3QgaGFuZGxlckRpciA9IHBhdGguam9pbihfX2Rpcm5hbWUsIFwiaGFuZGxlclwiKVxuICAgIGNvbnN0IGluZGV4X3RzID0gcGF0aC5qb2luKGhhbmRsZXJEaXIsIFwiaW5kZXgudHNcIilcbiAgICBjb25zdCBpbmRleF9qcyA9IHBhdGguam9pbihoYW5kbGVyRGlyLCBcImluZGV4LmpzXCIpXG4gICAgbGV0IGVudHJ5OiBzdHJpbmdcblxuICAgIGlmIChleGlzdHNTeW5jKGluZGV4X3RzKSkge1xuICAgICAgZW50cnkgPSBpbmRleF90c1xuICAgIH0gZWxzZSBpZiAoZXhpc3RzU3luYyhpbmRleF9qcykpIHtcbiAgICAgIGVudHJ5ID0gaW5kZXhfanNcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVWdseSBoYWNrIHRvIHN1cHBvcnQgU1NUIChwb3NzaWJseSBjYXVzZWQgYnkgbXkgaGFjayB0byBtYWtlIFNTVCB3b3JrIHdpdGggQ29tbW9uSlMgbGlicmFyaWVzKVxuICAgICAgZW50cnkgPSBwYXRoLmpvaW4oXG4gICAgICAgIHBhdGguZGlybmFtZShwcm9jZXNzLmVudi5ucG1fcGFja2FnZV9qc29uIHx8IHByb2Nlc3MuY3dkKCkpLFxuICAgICAgICBcIm5vZGVfbW9kdWxlcy9jZGstcmRzLXNxbC9saWIvaGFuZGxlci9pbmRleC5qc1wiXG4gICAgICApXG4gICAgfVxuICAgIGxldCBzc2xfb3B0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZFxuICAgIGlmIChwcm9wcy5zc2wgIT09IHVuZGVmaW5lZCAmJiAhcHJvcHMuc3NsKSB7XG4gICAgICBzc2xfb3B0aW9ucyA9IHtcbiAgICAgICAgU1NMOiBKU09OLnN0cmluZ2lmeShwcm9wcy5zc2wpLFxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBsb2dnZXIgPSBwcm9wcy5sb2dnZXIgPz8gZmFsc2VcblxuICAgIGNvbnN0IGRlbGV0ZVBhcmFtZXRlclBvbGljeSA9IG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGFjdGlvbnM6IFtcInNzbTpEZWxldGVQYXJhbWV0ZXJcIl0sXG4gICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgYGFybjphd3M6c3NtOiR7U3RhY2sub2Yoc2NvcGUpLnJlZ2lvbn06JHtTdGFjay5vZihzY29wZSkuYWNjb3VudH06cGFyYW1ldGVyLypgLFxuICAgICAgXSxcbiAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgU3RyaW5nRXF1YWxzOiB7XG4gICAgICAgICAgXCJzc206UmVzb3VyY2VUYWcvY3JlYXRlZC1ieVwiOiBcImNkay1yZHMtc3FsXCIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICBjb25zdCBmbiA9IG5ldyBsYW1iZGEuTm9kZWpzRnVuY3Rpb24oc2NvcGUsIGlkLCB7XG4gICAgICAuLi5wcm9wcy5mdW5jdGlvblByb3BzLFxuICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICB2cGNTdWJuZXRzOiBwcm9wcy52cGNTdWJuZXRzID8/IHtcbiAgICAgICAgc3VibmV0VHlwZTogU3VibmV0VHlwZS5QUklWQVRFX0lTT0xBVEVELFxuICAgICAgfSxcbiAgICAgIGVudHJ5OiBlbnRyeSxcbiAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICB0aW1lb3V0OiBwcm9wcy50aW1lb3V0ID8/IHByb3BzLmZ1bmN0aW9uUHJvcHM/LnRpbWVvdXQgPz8gRHVyYXRpb24uc2Vjb25kcygzMDApLFxuICAgICAgYnVuZGxpbmc6IHtcbiAgICAgICAgLy8gSW5jbHVkZSB0aGUgbWlncmF0aW9ucyBkaXJlY3RvcnkgaW4gdGhlIGJ1bmRsZVxuICAgICAgICBjb21tYW5kSG9va3M6IHtcbiAgICAgICAgICBiZWZvcmVCdW5kbGluZyhfOiBzdHJpbmcsIG91dHB1dERpcjogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgYGN1cmwgLS1zaWxlbnQgLWZMIGh0dHBzOi8vdHJ1c3RzdG9yZS5wa2kucmRzLmFtYXpvbmF3cy5jb20vZ2xvYmFsL2dsb2JhbC1idW5kbGUucGVtIC1vICR7cGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIG91dHB1dERpcixcbiAgICAgICAgICAgICAgICBcImdsb2JhbC1idW5kbGUucGVtXCJcbiAgICAgICAgICAgICAgKX1gLFxuICAgICAgICAgICAgXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgYWZ0ZXJCdW5kbGluZygpOiBzdHJpbmdbXSB7XG4gICAgICAgICAgICByZXR1cm4gW11cbiAgICAgICAgICB9LFxuICAgICAgICAgIGJlZm9yZUluc3RhbGwoKTogc3RyaW5nW10ge1xuICAgICAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBMT0dHRVI6IGxvZ2dlci50b1N0cmluZygpLFxuICAgICAgICAuLi5zc2xfb3B0aW9ucyxcbiAgICAgIH0sXG4gICAgICBpbml0aWFsUG9saWN5OiBbXG4gICAgICAgIGRlbGV0ZVBhcmFtZXRlclBvbGljeSxcbiAgICAgICAgLi4uKHByb3BzLmZ1bmN0aW9uUHJvcHM/LmluaXRpYWxQb2xpY3kgPz8gW10pLFxuICAgICAgXSxcbiAgICB9KVxuXG4gICAgaWYgKFxuICAgICAgIXByb3BzLmZ1bmN0aW9uUHJvcHM/LnNlY3VyaXR5R3JvdXBzIHx8XG4gICAgICBwcm9wcy5mdW5jdGlvblByb3BzPy5zZWN1cml0eUdyb3Vwcy5sZW5ndGggPT09IDBcbiAgICApIHtcbiAgICAgIHByb3BzLmNsdXN0ZXIuY29ubmVjdGlvbnMuYWxsb3dEZWZhdWx0UG9ydEZyb20oXG4gICAgICAgIGZuLFxuICAgICAgICBcIkFsbG93IHRoZSByZHMgc3FsIGhhbmRsZXIgdG8gY29ubmVjdCB0byBkYlwiXG4gICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIGZuXG4gIH1cbn1cblxuZnVuY3Rpb24gc2x1Z2lmeSh4OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4geC5yZXBsYWNlKC9bXmEtekEtWjAtOV0vZywgXCJcIilcbn1cbiJdfQ==
|
|
240
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwyQkFBK0I7QUFDL0IsNkJBQTRCO0FBQzVCLDZDQUE2QztBQUM3Qyw2Q0FBNEM7QUFDNUMsaURBQXVFO0FBQ3ZFLDJDQUEwQztBQUMxQyx1REFBcUU7QUFDckUsd0RBQXVEO0FBSXZELGdFQUErRDtBQUMvRCwyQ0FBc0M7QUFFdEM7O0dBRUc7QUFDSCxTQUFTLGFBQWEsQ0FDcEIsT0FBK0Q7SUFFL0QsT0FBTyxPQUFPLFlBQVksSUFBSSxDQUFDLFVBQVUsQ0FBQTtBQUMzQyxDQUFDO0FBd0VEOztHQUVHO0FBQ0gsSUFBWSxjQUlYO0FBSkQsV0FBWSxjQUFjO0lBQ3hCLHVDQUFxQixDQUFBO0lBQ3JCLGlDQUFlLENBQUE7SUFDZiwrQkFBYSxDQUFBO0FBQ2YsQ0FBQyxFQUpXLGNBQWMsOEJBQWQsY0FBYyxRQUl6QjtBQWlDRCxNQUFhLFFBQVMsU0FBUSxzQkFBUztJQUNyQzs7T0FFRztJQUNILE1BQU0sQ0FBQyxzQkFBc0IsQ0FDM0IsS0FBZ0IsRUFDaEIsRUFBVSxFQUNWLEtBQXlCO1FBRXpCLE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQy9DLENBQUM7SUFjRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQWtCO1FBQzFELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFFaEIseUJBQXlCO1FBQ3pCLE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDM0MsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM3QixNQUFNLElBQUksS0FBSyxDQUNiLDJFQUEyRSxDQUM1RSxDQUFBO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FB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LENBQUMsQ0FBQTtRQUN6RSxDQUFDO1FBRUQsc0NBQXNDO1FBQ3RDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLFdBQVc7WUFDOUIsQ0FBQyxDQUFDLHFCQUFRLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQztZQUM5RCxDQUFDLENBQUMscUJBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxZQUFhLENBQUMsQ0FBQTtRQUVuRSw4REFBOEQ7UUFDOUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxlQUFlLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDOUQsY0FBYyxFQUFFLElBQUksQ0FBQyxPQUFPO1NBQzdCLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQTtRQUV6QyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUE7UUFDMUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUEsQ0FBQyxpREFBaUQ7UUFDekUsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFBLENBQUMscUNBQXFDO0lBQ3BFLENBQUM7Q0FDRjtBQUVELFNBQVMsT0FBTyxDQUFDLENBQVM7SUFDeEIsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUMsQ0FBQTtBQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gXCJmc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCB7IER1cmF0aW9uLCBTdGFjayB9IGZyb20gXCJhd3MtY2RrLWxpYlwiXG5pbXBvcnQgKiBhcyBkc3FsIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZHNxbFwiXG5pbXBvcnQgeyBJVnBjLCBTdWJuZXRUeXBlLCBTdWJuZXRTZWxlY3Rpb24gfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiXG5pbXBvcnQgKiBhcyBpYW0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIlxuaW1wb3J0IHsgRnVuY3Rpb24sIElGdW5jdGlvbiwgUnVudGltZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCJcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYS1ub2RlanNcIlxuaW1wb3J0IHsgTm9kZWpzRnVuY3Rpb25Qcm9wcyB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhLW5vZGVqc1wiXG5pbXBvcnQgeyBJRGF0YWJhc2VDbHVzdGVyLCBJRGF0YWJhc2VJbnN0YW5jZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtcmRzXCJcbmltcG9ydCB7IElTZWNyZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNlY3JldHNtYW5hZ2VyXCJcbmltcG9ydCAqIGFzIGN1c3RvbVJlc291cmNlcyBmcm9tIFwiYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlc1wiXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiXG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBhIGNsdXN0ZXIgaXMgYSBEU1FMIGNsdXN0ZXJcbiAqL1xuZnVuY3Rpb24gaXNEc3FsQ2x1c3RlcihcbiAgY2x1c3RlcjogSURhdGFiYXNlQ2x1c3RlciB8IElEYXRhYmFzZUluc3RhbmNlIHwgZHNxbC5DZm5DbHVzdGVyXG4pOiBjbHVzdGVyIGlzIGRzcWwuQ2ZuQ2x1c3RlciB7XG4gIHJldHVybiBjbHVzdGVyIGluc3RhbmNlb2YgZHNxbC5DZm5DbHVzdGVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmRzU3FsUHJvcHMge1xuICAvKipcbiAgICogVlBDIG5ldHdvcmsgdG8gcGxhY2UgdGhlIHByb3ZpZGVyIGxhbWJkYS5cbiAgICpcbiAgICogTm9ybWFsbHkgdGhpcyBpcyB0aGUgVlBDIG9mIHlvdXIgZGF0YWJhc2UuXG4gICAqIFJlcXVpcmVkIHdoZW4geW91ciBkYXRhYmFzZSBpcyBvbmx5IGFjY2Vzc2libGUgaW4gYSBWUEMuXG4gICAqIE5vdCByZXF1aXJlZCBmb3IgRFNRTCBhcyBpdCB1c2VzIHB1YmxpYyBlbmRwb2ludHMgd2l0aCBJQU0gYXV0aGVudGljYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gRnVuY3Rpb24gaXMgbm90IHBsYWNlZCB3aXRoaW4gYSBWUEMuXG4gICAqL1xuICByZWFkb25seSB2cGM/OiBJVnBjXG5cbiAgLyoqXG4gICAqIFdoZXJlIHRvIHBsYWNlIHRoZSBuZXR3b3JrIHByb3ZpZGVyIGxhbWJkYSB3aXRoaW4gdGhlIFZQQy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgaXNvbGF0ZWQgc3VibmV0IGlmIG5vdCBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IHZwY1N1Ym5ldHM/OiBTdWJuZXRTZWxlY3Rpb25cblxuICAvKipcbiAgICogWW91ciBkYXRhYmFzZSBjbHVzdGVyIG9yIGluc3RhbmNlLlxuICAgKiBTdXBwb3J0cyBib3RoIHRyYWRpdGlvbmFsIFJEUy9BdXJvcmEgY2x1c3RlcnMgYW5kIERTUUwgY2x1c3RlcnMuXG4gICAqIC0gRm9yIFJEUy9BdXJvcmE6IHNlY3VyaXR5IGdyb3VwcyB3aWxsIGJlIGNvbmZpZ3VyZWQgdG8gYWxsb3cgYWNjZXNzXG4gICAqIC0gRm9yIERTUUw6IElBTSBhdXRoZW50aWNhdGlvbiB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZiBzZWNyZXRzXG4gICAqL1xuICByZWFkb25seSBjbHVzdGVyOiBJRGF0YWJhc2VDbHVzdGVyIHwgSURhdGFiYXNlSW5zdGFuY2UgfCBkc3FsLkNmbkNsdXN0ZXJcblxuICAvKipcbiAgICogU2VjcmV0IHRoYXQgZ3JhbnRzIGFjY2VzcyB0byB5b3VyIGRhdGFiYXNlLlxuICAgKlxuICAgKiBVc3VhbGx5IHRoaXMgaXMgeW91ciBjbHVzdGVyJ3MgbWFzdGVyIHNlY3JldC5cbiAgICogTm90IHJlcXVpcmVkIHdoZW4gcmVseWluZyBvbiBJQU0gYXV0aGVudGljYXRpb24gKHN1Y2ggYXMgRFNRTCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdW5kZWZpbmVkIGZvciBEU1FMIGNsdXN0ZXJzIHVzaW5nIElBTSBhdXRoZW50aWNhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgc2VjcmV0PzogSVNlY3JldFxuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGZvciBsYW1iZGEgdG8gZG8gaXRzIHdvcmsuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gNSBtaW51dGVzXG4gICAqL1xuICByZWFkb25seSB0aW1lb3V0PzogRHVyYXRpb25cblxuICAvKipcbiAgICogTG9nIFNRTCBzdGF0ZW1lbnRzLiBUaGlzIGluY2x1ZGVzIHBhc3N3b3Jkcy4gVXNlIG9ubHkgZm9yIGRlYnVnZ2luZy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgbG9nZ2VyPzogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGZ1bmN0aW9uIGN1c3RvbWl6YXRpb24uXG4gICAqXG4gICAqIFRoaXMgZW5hYmxlcyBhZGRpdGlvbmFsIGZ1bmN0aW9uIGN1c3RvbWl6YXRpb24gc3VjaCBhcyB0aGUgbG9nIGdyb3VwLiBIb3dldmVyLFxuICAgKiBsYW1iZGEgZnVuY3Rpb24gcHJvcGVydGllcyBjb250cm9sbGVkIGJ5IG90aGVyIHtSZHNTcWxQcm9wc30gcGFyYW1ldGVycyB3aWxsIHRydW1wXG4gICAqIG9waW9ucyBzZXQgdmlhIHRoaXMgcGFyYW1ldGVyLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGVtcHR5XG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvblByb3BzPzogTm9kZWpzRnVuY3Rpb25Qcm9wc1xuXG4gIC8qKlxuICAgKiBVc2UgU1NMP1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHNzbD86IGJvb2xlYW5cbn1cblxuLyoqXG4gKiBTdXBwb3J0ZWQgZGF0YWJhc2UgZW5naW5lc1xuICovXG5leHBvcnQgZW51bSBEYXRhYmFzZUVuZ2luZSB7XG4gIFBPU1RHUkVTID0gXCJwb3N0Z3Jlc1wiLFxuICBNWVNRTCA9IFwibXlzcWxcIixcbiAgRFNRTCA9IFwiZHNxbFwiLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm92aWRlciB7XG4gIHJlYWRvbmx5IHNlcnZpY2VUb2tlbjogc3RyaW5nXG4gIHJlYWRvbmx5IGhhbmRsZXI6IElGdW5jdGlvblxuICByZWFkb25seSBzZWNyZXQ/OiBJU2VjcmV0XG4gIHJlYWRvbmx5IGVuZ2luZTogc3RyaW5nXG4gIHJlYWRvbmx5IGNsdXN0ZXI/OiBJRGF0YWJhc2VDbHVzdGVyIHwgSURhdGFiYXNlSW5zdGFuY2UgfCBkc3FsLkNmbkNsdXN0ZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm92aWRlckF0dHJpYnV0ZXMge1xuICAvKipcbiAgICogRWl0aGVyIHRoZSBBUk4gb3IgbmFtZSBvZiB0aGUgTGFtYmRhIGZ1bmN0aW9uLlxuICAgKiBVc2UgZnVuY3Rpb25Bcm4gZm9yIGNyb3NzLWFjY291bnQgb3IgY3Jvc3MtcmVnaW9uIHNjZW5hcmlvcy5cbiAgICogVXNlIGZ1bmN0aW9uTmFtZSBmb3Igc2FtZS1hY2NvdW50LCBzYW1lLXJlZ2lvbiBzY2VuYXJpb3MuXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbkFybj86IHN0cmluZ1xuICByZWFkb25seSBmdW5jdGlvbk5hbWU/OiBzdHJpbmdcbiAgcmVhZG9ubHkgZW5naW5lOiBEYXRhYmFzZUVuZ2luZVxuICAvKipcbiAgICogT3B0aW9uYWwgY2x1c3RlciBpbmZvcm1hdGlvbiBmb3Igcm9sZSBjcmVhdGlvbi5cbiAgICpcbiAgICogV2hlbiBpbXBvcnRpbmcgYSBwcm92aWRlciwgY2x1c3RlciBkZXRhaWxzIGFyZSBvZnRlbiBub3QgYXZhaWxhYmxlLlxuICAgKiBIb3dldmVyLCBzb21lIG9wZXJhdGlvbnMgbGlrZSByb2xlIGNyZWF0aW9uIHJlcXVpcmUgY2x1c3RlciBlbmRwb2ludFxuICAgKiBpbmZvcm1hdGlvbiB0byBidWlsZCBjb25uZWN0aW9uIHNlY3JldHMuXG4gICAqXG4gICAqIElmIHlvdSBwbGFuIHRvIGNyZWF0ZSByb2xlcyB3aXRoIHRoZSBpbXBvcnRlZCBwcm92aWRlciwgeW91IG11c3RcbiAgICogcHJvdmlkZSB0aGUgY2x1c3RlciByZWZlcmVuY2UuIElmIHlvdSBvbmx5IHBsYW4gdG8gdXNlIGV4aXN0aW5nXG4gICAqIHJvbGVzLCBkYXRhYmFzZXMsIHNjaGVtYXMsIG9yIFNRTCBvcGVyYXRpb25zLCB0aGlzIGNhbiBiZSBvbWl0dGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgY2x1c3Rlcj86IElEYXRhYmFzZUNsdXN0ZXIgfCBJRGF0YWJhc2VJbnN0YW5jZSB8IGRzcWwuQ2ZuQ2x1c3RlclxufVxuXG5leHBvcnQgY2xhc3MgUHJvdmlkZXIgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJUHJvdmlkZXIge1xuICAvKipcbiAgICogSW1wb3J0IGFuIGV4aXN0aW5nIHByb3ZpZGVyIExhbWJkYSBmdW5jdGlvblxuICAgKi9cbiAgc3RhdGljIGZyb21Qcm92aWRlckF0dHJpYnV0ZXMoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIGF0dHJzOiBQcm92aWRlckF0dHJpYnV0ZXNcbiAgKTogSVByb3ZpZGVyIHtcbiAgICByZXR1cm4gbmV3IEltcG9ydGVkUHJvdmlkZXIoc2NvcGUsIGlkLCBhdHRycylcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBzZXJ2aWNlVG9rZW46IHN0cmluZ1xuICBwdWJsaWMgcmVhZG9ubHkgc2VjcmV0PzogSVNlY3JldFxuICBwdWJsaWMgcmVhZG9ubHkgaGFuZGxlcjogSUZ1bmN0aW9uXG4gIHB1YmxpYyByZWFkb25seSBjbHVzdGVyPzogSURhdGFiYXNlQ2x1c3RlciB8IElEYXRhYmFzZUluc3RhbmNlIHwgZHNxbC5DZm5DbHVzdGVyXG5cbiAgLyoqXG4gICAqIFRoZSBlbmdpbmUgbGlrZSBcInBvc3RncmVzXCIgb3IgXCJteXNxbFwiXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gaWYgd2UgY2Fubm90IGRldGVybWluZSB0aGlzIFwicG9zdGdyZXNcIlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVuZ2luZTogc3RyaW5nXG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFJkc1NxbFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuXG4gICAgLy8gVmFsaWRhdGUgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IGlzRHNxbCA9IGlzRHNxbENsdXN0ZXIocHJvcHMuY2x1c3RlcilcbiAgICBpZiAoIWlzRHNxbCAmJiAhcHJvcHMuc2VjcmV0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiRWl0aGVyIHNlY3JldCAoZm9yIHRyYWRpdGlvbmFsIFJEUykgb3IgY2x1c3RlciB3aXRoIERTUUwgbXVzdCBiZSBwcm92aWRlZFwiXG4gICAgICApXG4gICAgfVxuICAgIGlmICghaXNEc3FsICYmICFwcm9wcy52cGMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlZQQyBpcyByZXF1aXJlZCBmb3IgdHJhZGl0aW9uYWwgUkRTIGRhdGFiYXNlc1wiKVxuICAgIH1cbiAgICBpZiAoaXNEc3FsICYmIHByb3BzLnNlY3JldCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcInNlY3JldCBzaG91bGQgbm90IGJlIHByb3ZpZGVkIHdoZW4gdXNpbmcgRFNRTCBjbHVzdGVyICh1c2VzIElBTSBhdXRoZW50aWNhdGlvbilcIlxuICAgICAgKVxuICAgIH1cblxuICAgIHRoaXMuc2VjcmV0ID0gcHJvcHMuc2VjcmV0XG4gICAgdGhpcy5jbHVzdGVyID0gcHJvcHMuY2x1c3RlclxuXG4gICAgLy8gRGV0ZXJtaW5lIGVuZ2luZSBmcm9tIGNsdXN0ZXIvaW5zdGFuY2UgaW5zdGVhZCBvZiBoYXJkY29kaW5nXG4gICAgaWYgKGlzRHNxbCkge1xuICAgICAgLy8gRFNRTCBpcyBhbHdheXMgUG9zdGdyZVNRTC1jb21wYXRpYmxlXG4gICAgICB0aGlzLmVuZ2luZSA9IERhdGFiYXNlRW5naW5lLkRTUUxcbiAgICB9IGVsc2UgaWYgKFwiY2x1c3RlcklkZW50aWZpZXJcIiBpbiBwcm9wcy5jbHVzdGVyKSB7XG4gICAgICAvLyBJdCdzIGEgRGF0YWJhc2VDbHVzdGVyXG4gICAgICBjb25zdCBjbHVzdGVyRW5naW5lID0gKHByb3BzLmNsdXN0ZXIgYXMgSURhdGFiYXNlQ2x1c3RlcikuZW5naW5lXG4gICAgICB0aGlzLmVuZ2luZSA9XG4gICAgICAgIGNsdXN0ZXJFbmdpbmUgJiYgY2x1c3RlckVuZ2luZS5lbmdpbmVGYW1pbHkgPT09IFwiTVlTUUxcIlxuICAgICAgICAgID8gRGF0YWJhc2VFbmdpbmUuTVlTUUxcbiAgICAgICAgICA6IERhdGFiYXNlRW5naW5lLlBPU1RHUkVTXG4gICAgfSBlbHNlIGlmIChcImluc3RhbmNlSWRlbnRpZmllclwiIGluIHByb3BzLmNsdXN0ZXIpIHtcbiAgICAgIC8vIEl0J3MgYSBEYXRhYmFzZUluc3RhbmNlXG4gICAgICBjb25zdCBpbnN0YW5jZUVuZ2luZSA9IChwcm9wcy5jbHVzdGVyIGFzIElEYXRhYmFzZUluc3RhbmNlKS5lbmdpbmVcbiAgICAgIHRoaXMuZW5naW5lID1cbiAgICAgICAgaW5zdGFuY2VFbmdpbmUgJiYgaW5zdGFuY2VFbmdpbmUuZW5naW5lRmFtaWx5ID09PSBcIk1ZU1FMXCJcbiAgICAgICAgICA/IERhdGFiYXNlRW5naW5lLk1ZU1FMXG4gICAgICAgICAgOiBEYXRhYmFzZUVuZ2luZS5QT1NUR1JFU1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGYWxsYmFjayB0byBwb3N0Z3JlcyBpZiBlbmdpbmUgaGFzbid0IGJlZW4gcHJvdmlkZWRcbiAgICAgIHRoaXMuZW5naW5lID0gRGF0YWJhc2VFbmdpbmUuUE9TVEdSRVNcbiAgICB9XG5cbiAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBcIlJkc1NxbFwiICsgc2x1Z2lmeShcIjI4YjllNzkxLWFmNjAtNGEzMy1iY2E4LWZmYjZmMzBlZjhjNVwiKVxuICAgIHRoaXMuaGFuZGxlciA9XG4gICAgICAoU3RhY2sub2YodGhpcykubm9kZS50cnlGaW5kQ2hpbGQoZnVuY3Rpb25OYW1lKSBhcyBJRnVuY3Rpb24pID8/XG4gICAgICB0aGlzLm5ld0N1c3RvbVJlc291cmNlSGFuZGxlcihzY29wZSwgZnVuY3Rpb25OYW1lLCBwcm9wcylcblxuICAgIGNvbnN0IHByb3ZpZGVyID0gbmV3IGN1c3RvbVJlc291cmNlcy5Qcm92aWRlcih0aGlzLCBcIlJkc1NxbFwiLCB7XG4gICAgICBvbkV2ZW50SGFuZGxlcjogdGhpcy5oYW5kbGVyLFxuICAgIH0pXG4gICAgdGhpcy5zZXJ2aWNlVG9rZW4gPSBwcm92aWRlci5zZXJ2aWNlVG9rZW5cblxuICAgIC8vIEhhbmRsZSBkYXRhYmFzZSBjb25uZWN0aW9uIHNldHVwXG4gICAgaWYgKGlzRHNxbCkge1xuICAgICAgLy8gRm9yIERTUUwsIGdyYW50IElBTSBwZXJtaXNzaW9ucyBpbnN0ZWFkIG9mIFZQQyBzZWN1cml0eSBncm91cHNcbiAgICAgIGNvbnN0IGRzcWxDbHVzdGVyID0gcHJvcHMuY2x1c3RlciBhcyBkc3FsLkNmbkNsdXN0ZXJcbiAgICAgIHRoaXMuaGFuZGxlci5hZGRUb1JvbGVQb2xpY3koXG4gICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgICAgYWN0aW9uczogW1wiZHNxbDpEYkNvbm5lY3RBZG1pblwiXSxcbiAgICAgICAgICByZXNvdXJjZXM6IFtkc3FsQ2x1c3Rlci5hdHRyUmVzb3VyY2VBcm5dLFxuICAgICAgICB9KVxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUcmFkaXRpb25hbCBSRFMgc2V0dXAgd2l0aCBzZWN1cml0eSBncm91cHMgYW5kIHNlY3JldHNcbiAgICAgIHRoaXMuc2VjcmV0IS5ncmFudFJlYWQodGhpcy5oYW5kbGVyKVxuICAgICAgaWYgKHRoaXMuc2VjcmV0IS5lbmNyeXB0aW9uS2V5KSB7XG4gICAgICAgIC8vIEl0IHNlZW1zIHdlIG5lZWQgdG8gZ3JhbnQgZXhwbGljaXQgcGVybWlzc2lvblxuICAgICAgICB0aGlzLnNlY3JldCEuZW5jcnlwdGlvbktleS5ncmFudERlY3J5cHQodGhpcy5oYW5kbGVyKVxuICAgICAgfVxuICAgICAgaWYgKHByb3BzLmNsdXN0ZXIuY29ubmVjdGlvbnMuc2VjdXJpdHlHcm91cHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNsdXN0ZXIgZG9lcyBub3QgaGF2ZSBhIHNlY3VyaXR5IGdyb3VwLlwiKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc2VjdXJpdHlHcm91cCA9IHByb3BzLmNsdXN0ZXIuY29ubmVjdGlvbnMuc2VjdXJpdHlHcm91cHNbMF0hXG4gICAgICAgIHRoaXMuaGFuZGxlci5ub2RlLmRlZmF1bHRDaGlsZD8ubm9kZS5hZGREZXBlbmRlbmN5KHNlY3VyaXR5R3JvdXApXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubm9kZS5hZGREZXBlbmRlbmN5KHByb3BzLmNsdXN0ZXIpXG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3Q3VzdG9tUmVzb3VyY2VIYW5kbGVyKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogUmRzU3FsUHJvcHNcbiAgKTogbGFtYmRhLk5vZGVqc0Z1bmN0aW9uIHtcbiAgICBjb25zdCBpc0RzcWwgPSBpc0RzcWxDbHVzdGVyKHByb3BzLmNsdXN0ZXIpXG4gICAgY29uc3QgaGFuZGxlckRpciA9IHBhdGguam9pbihfX2Rpcm5hbWUsIFwiaGFuZGxlclwiKVxuICAgIGNvbnN0IGluZGV4X3RzID0gcGF0aC5qb2luKGhhbmRsZXJEaXIsIFwiaW5kZXgudHNcIilcbiAgICBjb25zdCBpbmRleF9qcyA9IHBhdGguam9pbihoYW5kbGVyRGlyLCBcImluZGV4LmpzXCIpXG4gICAgbGV0IGVudHJ5OiBzdHJpbmdcblxuICAgIGlmIChleGlzdHNTeW5jKGluZGV4X3RzKSkge1xuICAgICAgZW50cnkgPSBpbmRleF90c1xuICAgIH0gZWxzZSBpZiAoZXhpc3RzU3luYyhpbmRleF9qcykpIHtcbiAgICAgIGVudHJ5ID0gaW5kZXhfanNcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVWdseSBoYWNrIHRvIHN1cHBvcnQgU1NUIChwb3NzaWJseSBjYXVzZWQgYnkgbXkgaGFjayB0byBtYWtlIFNTVCB3b3JrIHdpdGggQ29tbW9uSlMgbGlicmFyaWVzKVxuICAgICAgZW50cnkgPSBwYXRoLmpvaW4oXG4gICAgICAgIHBhdGguZGlybmFtZShwcm9jZXNzLmVudi5ucG1fcGFja2FnZV9qc29uIHx8IHByb2Nlc3MuY3dkKCkpLFxuICAgICAgICBcIm5vZGVfbW9kdWxlcy9jZGstcmRzLXNxbC9saWIvaGFuZGxlci9pbmRleC5qc1wiXG4gICAgICApXG4gICAgfVxuICAgIGxldCBzc2xfb3B0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZFxuICAgIGlmIChwcm9wcy5zc2wgIT09IHVuZGVmaW5lZCAmJiAhcHJvcHMuc3NsKSB7XG4gICAgICBzc2xfb3B0aW9ucyA9IHtcbiAgICAgICAgU1NMOiBKU09OLnN0cmluZ2lmeShwcm9wcy5zc2wpLFxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBsb2dnZXIgPSBwcm9wcy5sb2dnZXIgPz8gZmFsc2VcblxuICAgIC8vIEJ1aWxkIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICAgIGNvbnN0IGVudmlyb25tZW50OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgTE9HR0VSOiBsb2dnZXIudG9TdHJpbmcoKSxcbiAgICAgIC4uLnNzbF9vcHRpb25zLFxuICAgIH1cblxuICAgIC8vIEFkZCBEU1FMLXNwZWNpZmljIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICAgIGlmIChpc0RzcWwpIHtcbiAgICAgIGNvbnN0IGRzcWxDbHVzdGVyID0gcHJvcHMuY2x1c3RlciBhcyBkc3FsLkNmbkNsdXN0ZXJcbiAgICAgIGNvbnN0IGNsdXN0ZXJJZCA9IGRzcWxDbHVzdGVyLmF0dHJJZGVudGlmaWVyXG4gICAgICBjb25zdCByZWdpb24gPSBTdGFjay5vZihzY29wZSkucmVnaW9uXG4gICAgICBlbnZpcm9ubWVudC5EU1FMX0VORFBPSU5UID0gYCR7Y2x1c3RlcklkfS5kc3FsLiR7cmVnaW9ufS5vbi5hd3NgXG4gICAgICBlbnZpcm9ubWVudC5EU1FMX1BPUlQgPSBcIjU0MzJcIlxuICAgIH0gZWxzZSBpZiAocHJvcHMuc2VjcmV0KSB7XG4gICAgICAvLyBBZGQgc2VjcmV0IEFSTiB0byBlbnZpcm9ubWVudCBmb3IgdHJhZGl0aW9uYWwgUkRTXG4gICAgICBlbnZpcm9ubWVudC5TRUNSRVRfQVJOID0gcHJvcHMuc2VjcmV0LnNlY3JldEFyblxuICAgIH1cblxuICAgIGNvbnN0IGRlbGV0ZVBhcmFtZXRlclBvbGljeSA9IG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGFjdGlvbnM6IFtcInNzbTpEZWxldGVQYXJhbWV0ZXJcIl0sXG4gICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgYGFybjphd3M6c3NtOiR7U3RhY2sub2Yoc2NvcGUpLnJlZ2lvbn06JHtTdGFjay5vZihzY29wZSkuYWNjb3VudH06cGFyYW1ldGVyLypgLFxuICAgICAgXSxcbiAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgU3RyaW5nRXF1YWxzOiB7XG4gICAgICAgICAgXCJzc206UmVzb3VyY2VUYWcvY3JlYXRlZC1ieVwiOiBcImNkay1yZHMtc3FsXCIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICBjb25zdCBmbiA9IG5ldyBsYW1iZGEuTm9kZWpzRnVuY3Rpb24oc2NvcGUsIGlkLCB7XG4gICAgICAuLi5wcm9wcy5mdW5jdGlvblByb3BzLFxuICAgICAgLy8gT25seSBjb25maWd1cmUgVlBDIGZvciB0cmFkaXRpb25hbCBSRFNcbiAgICAgIC4uLihpc0RzcWxcbiAgICAgICAgPyB7fVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgICAgICAgdnBjU3VibmV0czogcHJvcHMudnBjU3VibmV0cyA/PyB7XG4gICAgICAgICAgICAgIHN1Ym5ldFR5cGU6IFN1Ym5ldFR5cGUuUFJJVkFURV9JU09MQVRFRCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSksXG4gICAgICBlbnRyeTogZW50cnksXG4gICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgdGltZW91dDogcHJvcHMudGltZW91dCA/PyBwcm9wcy5mdW5jdGlvblByb3BzPy50aW1lb3V0ID8/IER1cmF0aW9uLnNlY29uZHMoMzAwKSxcbiAgICAgIGJ1bmRsaW5nOiB7XG4gICAgICAgIC8vIEluY2x1ZGUgdGhlIG1pZ3JhdGlvbnMgZGlyZWN0b3J5IGluIHRoZSBidW5kbGVcbiAgICAgICAgY29tbWFuZEhvb2tzOiB7XG4gICAgICAgICAgYmVmb3JlQnVuZGxpbmcoXzogc3RyaW5nLCBvdXRwdXREaXI6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgIGBjdXJsIC0tc2lsZW50IC1mTCBodHRwczovL3RydXN0c3RvcmUucGtpLnJkcy5hbWF6b25hd3MuY29tL2dsb2JhbC9nbG9iYWwtYnVuZGxlLnBlbSAtbyAke3BhdGguam9pbihcbiAgICAgICAgICAgICAgICBvdXRwdXREaXIsXG4gICAgICAgICAgICAgICAgXCJnbG9iYWwtYnVuZGxlLnBlbVwiXG4gICAgICAgICAgICAgICl9YCxcbiAgICAgICAgICAgIF1cbiAgICAgICAgICB9LFxuICAgICAgICAgIGFmdGVyQnVuZGxpbmcoKTogc3RyaW5nW10ge1xuICAgICAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBiZWZvcmVJbnN0YWxsKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgICAgIHJldHVybiBbXVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgZW52aXJvbm1lbnQsXG4gICAgICBpbml0aWFsUG9saWN5OiBbXG4gICAgICAgIGRlbGV0ZVBhcmFtZXRlclBvbGljeSxcbiAgICAgICAgLi4uKHByb3BzLmZ1bmN0aW9uUHJvcHM/LmluaXRpYWxQb2xpY3kgPz8gW10pLFxuICAgICAgXSxcbiAgICB9KVxuXG4gICAgLy8gT25seSBjb25maWd1cmUgc2VjdXJpdHkgZ3JvdXBzIGZvciB0cmFkaXRpb25hbCBSRFMgKG5vdCBEU1FMKVxuICAgIGlmIChcbiAgICAgICFpc0RzcWwgJiZcbiAgICAgICghcHJvcHMuZnVuY3Rpb25Qcm9wcz8uc2VjdXJpdHlHcm91cHMgfHxcbiAgICAgICAgcHJvcHMuZnVuY3Rpb25Qcm9wcz8uc2VjdXJpdHlHcm91cHMubGVuZ3RoID09PSAwKVxuICAgICkge1xuICAgICAgY29uc3QgcmRzQ2x1c3RlciA9IHByb3BzLmNsdXN0ZXIgYXMgSURhdGFiYXNlQ2x1c3RlciB8IElEYXRhYmFzZUluc3RhbmNlXG4gICAgICByZHNDbHVzdGVyLmNvbm5lY3Rpb25zLmFsbG93RGVmYXVsdFBvcnRGcm9tKFxuICAgICAgICBmbixcbiAgICAgICAgXCJBbGxvdyB0aGUgcmRzIHNxbCBoYW5kbGVyIHRvIGNvbm5lY3QgdG8gZGJcIlxuICAgICAgKVxuICAgIH1cblxuICAgIHJldHVybiBmblxuICB9XG59XG5cbmNsYXNzIEltcG9ydGVkUHJvdmlkZXIgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJUHJvdmlkZXIge1xuICBwdWJsaWMgcmVhZG9ubHkgc2VydmljZVRva2VuOiBzdHJpbmdcbiAgcHVibGljIHJlYWRvbmx5IGhhbmRsZXI6IElGdW5jdGlvblxuICBwdWJsaWMgcmVhZG9ubHkgc2VjcmV0PzogSVNlY3JldFxuICBwdWJsaWMgcmVhZG9ubHkgZW5naW5lOiBzdHJpbmdcbiAgcHVibGljIHJlYWRvbmx5IGNsdXN0ZXI/OiBJRGF0YWJhc2VDbHVzdGVyIHwgSURhdGFiYXNlSW5zdGFuY2UgfCBkc3FsLkNmbkNsdXN0ZXJcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBhdHRyczogUHJvdmlkZXJBdHRyaWJ1dGVzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuXG4gICAgLy8gVmFsaWRhdGUgdGhhdCBlaXRoZXIgZnVuY3Rpb25Bcm4gb3IgZnVuY3Rpb25OYW1lIGlzIHByb3ZpZGVkXG4gICAgaWYgKCFhdHRycy5mdW5jdGlvbkFybiAmJiAhYXR0cnMuZnVuY3Rpb25OYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFaXRoZXIgZnVuY3Rpb25Bcm4gb3IgZnVuY3Rpb25OYW1lIG11c3QgYmUgcHJvdmlkZWRcIilcbiAgICB9XG4gICAgaWYgKGF0dHJzLmZ1bmN0aW9uQXJuICYmIGF0dHJzLmZ1bmN0aW9uTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUHJvdmlkZSBlaXRoZXIgZnVuY3Rpb25Bcm4gb3IgZnVuY3Rpb25OYW1lLCBub3QgYm90aFwiKVxuICAgIH1cblxuICAgIC8vIEltcG9ydCB0aGUgZXhpc3RpbmcgTGFtYmRhIGZ1bmN0aW9uXG4gICAgdGhpcy5oYW5kbGVyID0gYXR0cnMuZnVuY3Rpb25Bcm5cbiAgICAgID8gRnVuY3Rpb24uZnJvbUZ1bmN0aW9uQXJuKHRoaXMsIFwiSGFuZGxlclwiLCBhdHRycy5mdW5jdGlvbkFybilcbiAgICAgIDogRnVuY3Rpb24uZnJvbUZ1bmN0aW9uTmFtZSh0aGlzLCBcIkhhbmRsZXJcIiwgYXR0cnMuZnVuY3Rpb25OYW1lISlcblxuICAgIC8vIERlcml2ZSBzZXJ2aWNlVG9rZW4gYnkgd3JhcHBpbmcgaW4gY3VzdG9tIHJlc291cmNlIHByb3ZpZGVyXG4gICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgY3VzdG9tUmVzb3VyY2VzLlByb3ZpZGVyKHRoaXMsIFwiUHJvdmlkZXJcIiwge1xuICAgICAgb25FdmVudEhhbmRsZXI6IHRoaXMuaGFuZGxlcixcbiAgICB9KVxuICAgIHRoaXMuc2VydmljZVRva2VuID0gcHJvdmlkZXIuc2VydmljZVRva2VuXG5cbiAgICB0aGlzLmVuZ2luZSA9IGF0dHJzLmVuZ2luZVxuICAgIHRoaXMuc2VjcmV0ID0gdW5kZWZpbmVkIC8vIEltcG9ydGVkIHByb3ZpZGVycyBnZXQgc2VjcmV0IGZyb20gZW52aXJvbm1lbnRcbiAgICB0aGlzLmNsdXN0ZXIgPSBhdHRycy5jbHVzdGVyIC8vIE9wdGlvbmFsIGNsdXN0ZXIgZm9yIHJvbGUgY3JlYXRpb25cbiAgfVxufVxuXG5mdW5jdGlvbiBzbHVnaWZ5KHg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB4LnJlcGxhY2UoL1teYS16QS1aMC05XS9nLCBcIlwiKVxufVxuIl19
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { CustomResource } from "aws-cdk-lib";
|
|
2
2
|
import { Construct } from "constructs";
|
|
3
3
|
import { IDatabase } from "./database";
|
|
4
|
-
import {
|
|
4
|
+
import { IProvider } from "./provider";
|
|
5
5
|
export interface RoleProps {
|
|
6
6
|
/**
|
|
7
7
|
* Provider.
|
|
8
8
|
*/
|
|
9
|
-
readonly provider:
|
|
9
|
+
readonly provider: IProvider;
|
|
10
10
|
/**
|
|
11
11
|
* SQL.
|
|
12
12
|
*/
|
|
@@ -13,7 +13,7 @@ class Role extends aws_cdk_lib_1.CustomResource {
|
|
|
13
13
|
properties: {
|
|
14
14
|
Resource: enum_1.RdsSqlResource.ROLE,
|
|
15
15
|
ResourceId: props.roleName,
|
|
16
|
-
SecretArn: props.provider.secret.secretArn,
|
|
16
|
+
...(props.provider.secret ? { SecretArn: props.provider.secret.secretArn } : {}),
|
|
17
17
|
PasswordArn: props.passwordArn,
|
|
18
18
|
DatabaseName: props.database ? props.database.databaseName : props.databaseName,
|
|
19
19
|
EnableIamAuth: props.enableIamAuth,
|
|
@@ -25,4 +25,4 @@ class Role extends aws_cdk_lib_1.CustomResource {
|
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
27
|
exports.Role = Role;
|
|
28
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZS5jdXN0b20tcmVzb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcm9sZS5jdXN0b20tcmVzb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQTRDO0FBRzVDLGlDQUF1QztBQStDdkMsTUFBYSxJQUFLLFNBQVEsNEJBQWM7SUFDdEMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFnQjtRQUN4RCxJQUFJLEtBQUssQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3pDLE1BQU0seUNBQXlDLENBQUE7UUFDakQsQ0FBQztRQUNELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2YsWUFBWSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBWTtZQUN6QyxVQUFVLEVBQUU7Z0JBQ1YsUUFBUSxFQUFFLHFCQUFjLENBQUMsSUFBSTtnQkFDN0IsVUFBVSxFQUFFLEtBQUssQ0FBQyxRQUFRO2dCQUMxQixHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hGLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztnQkFDOUIsWUFBWSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsWUFBWTtnQkFDL0UsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhO2FBQ25DO1NBQ0YsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ3ZDLElBQUksS0FBSyxDQUFDLFFBQVE7WUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDN0QsQ0FBQztDQUNGO0FBbkJELG9CQW1CQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEN1c3RvbVJlc291cmNlIH0gZnJvbSBcImF3cy1jZGstbGliXCJcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCJcbmltcG9ydCB7IElEYXRhYmFzZSB9IGZyb20gXCIuL2RhdGFiYXNlXCJcbmltcG9ydCB7IFJkc1NxbFJlc291cmNlIH0gZnJvbSBcIi4vZW51bVwiXG5pbXBvcnQgeyBJUHJvdmlkZXIgfSBmcm9tIFwiLi9wcm92aWRlclwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgUm9sZVByb3BzIHtcbiAgLyoqXG4gICAqIFByb3ZpZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvdmlkZXI6IElQcm92aWRlclxuXG4gIC8qKlxuICAgKiBTUUwuXG4gICAqL1xuICByZWFkb25seSByb2xlTmFtZTogc3RyaW5nXG5cbiAgLyoqXG4gICAqIEEgbmV3IHNlY3JldCBpcyBjcmVhdGVkIGZvciB0aGlzIHVzZXIuXG4gICAqXG4gICAqIE9wdGlvbmFsbHkgZW5jcnlwdCBpdCB3aXRoIHRoZSBnaXZlbiBrZXkuXG4gICAqL1xuICByZWFkb25seSBwYXNzd29yZEFybjogc3RyaW5nXG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGRhdGFiYXNlIHRoaXMgdXNlciBpcyBleHBlY3RlZCB0byB1c2UuXG4gICAqXG4gICAqIFNwZWNpZnkgbm9uZSBvZiBgZGF0YWJhc2VgIG9yIGBkYXRhYmFzZU5hbWVgIG9yIG9ubHkgb25lIG9mIHRoZW0uXG4gICAqXG4gICAqIEBkZWZhdWx0IG5vIGNvbm5lY3Rpb24gdG8gYW55IGRhdGFiYXNlIGlzIGdyYW50ZWRcbiAgICovXG4gIHJlYWRvbmx5IGRhdGFiYXNlPzogSURhdGFiYXNlXG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGRhdGFiYXNlIG5hbWUgdGhpcyB1c2VyIGlzIGV4cGVjdGVkIHRvIHVzZS5cbiAgICpcbiAgICogU3BlY2lmeSBub25lIG9mIGBkYXRhYmFzZWAgb3IgYGRhdGFiYXNlTmFtZWAgb3Igb25seSBvbmUgb2YgdGhlbS5cbiAgICpcbiAgICogQGRlZmF1bHQgbm8gY29ubmVjdGlvbiB0byBhbnkgZGF0YWJhc2UgaXMgZ3JhbnRlZFxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YWJhc2VOYW1lPzogc3RyaW5nXG5cbiAgLyoqXG4gICAqIEVuYWJsZSBJQU0gYXV0aGVudGljYXRpb24gZm9yIHRoaXMgcm9sZS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2UgLSB1c2UgcGFzc3dvcmQgYXV0aGVudGljYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZUlhbUF1dGg/OiBib29sZWFuXG59XG5cbmV4cG9ydCBjbGFzcyBSb2xlIGV4dGVuZHMgQ3VzdG9tUmVzb3VyY2Uge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUm9sZVByb3BzKSB7XG4gICAgaWYgKHByb3BzLmRhdGFiYXNlICYmIHByb3BzLmRhdGFiYXNlTmFtZSkge1xuICAgICAgdGhyb3cgXCJTcGVjaWZ5IGVpdGhlciBkYXRhYmFzZSBvciBkYXRhYmFzZU5hbWVcIlxuICAgIH1cbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHNlcnZpY2VUb2tlbjogcHJvcHMucHJvdmlkZXIuc2VydmljZVRva2VuLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBSZXNvdXJjZTogUmRzU3FsUmVzb3VyY2UuUk9MRSxcbiAgICAgICAgUmVzb3VyY2VJZDogcHJvcHMucm9sZU5hbWUsXG4gICAgICAgIC4uLihwcm9wcy5wcm92aWRlci5zZWNyZXQgPyB7IFNlY3JldEFybjogcHJvcHMucHJvdmlkZXIuc2VjcmV0LnNlY3JldEFybiB9IDoge30pLFxuICAgICAgICBQYXNzd29yZEFybjogcHJvcHMucGFzc3dvcmRBcm4sXG4gICAgICAgIERhdGFiYXNlTmFtZTogcHJvcHMuZGF0YWJhc2UgPyBwcm9wcy5kYXRhYmFzZS5kYXRhYmFzZU5hbWUgOiBwcm9wcy5kYXRhYmFzZU5hbWUsXG4gICAgICAgIEVuYWJsZUlhbUF1dGg6IHByb3BzLmVuYWJsZUlhbUF1dGgsXG4gICAgICB9LFxuICAgIH0pXG4gICAgdGhpcy5ub2RlLmFkZERlcGVuZGVuY3kocHJvcHMucHJvdmlkZXIpXG4gICAgaWYgKHByb3BzLmRhdGFiYXNlKSB0aGlzLm5vZGUuYWRkRGVwZW5kZW5jeShwcm9wcy5kYXRhYmFzZSlcbiAgfVxufVxuIl19
|
package/lib/role.d.ts
CHANGED
|
@@ -2,12 +2,12 @@ import * as kms from "aws-cdk-lib/aws-kms";
|
|
|
2
2
|
import { ISecret } from "aws-cdk-lib/aws-secretsmanager";
|
|
3
3
|
import { Construct } from "constructs";
|
|
4
4
|
import { IDatabase } from "./database";
|
|
5
|
-
import {
|
|
5
|
+
import { IProvider } from "./provider";
|
|
6
6
|
export interface RoleProps {
|
|
7
7
|
/**
|
|
8
8
|
* Provider.
|
|
9
9
|
*/
|
|
10
|
-
readonly provider:
|
|
10
|
+
readonly provider: IProvider;
|
|
11
11
|
/**
|
|
12
12
|
* SQL.
|
|
13
13
|
*/
|
|
@@ -65,6 +65,9 @@ export interface RoleProps {
|
|
|
65
65
|
* configured for AWS IAM database authentication. The secret
|
|
66
66
|
* will not contain a password field.
|
|
67
67
|
*
|
|
68
|
+
* Note: For DSQL clusters, this property is ignored as DSQL always
|
|
69
|
+
* uses IAM authentication.
|
|
70
|
+
*
|
|
68
71
|
* @default false - use password authentication
|
|
69
72
|
*/
|
|
70
73
|
readonly enableIamAuth?: boolean;
|
|
@@ -76,7 +79,8 @@ export declare class Role extends Construct {
|
|
|
76
79
|
readonly roleName: string;
|
|
77
80
|
/**
|
|
78
81
|
* The generated secret.
|
|
82
|
+
* Only available for non-DSQL clusters as DSQL uses IAM authentication.
|
|
79
83
|
*/
|
|
80
|
-
readonly secret
|
|
84
|
+
readonly secret?: ISecret;
|
|
81
85
|
constructor(scope: Construct, id: string, props: RoleProps);
|
|
82
86
|
}
|