@fjall/components-infrastructure 0.75.3 → 0.77.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/dist/lib/app.d.ts +125 -20
- package/dist/lib/app.js +171 -56
- package/dist/lib/aspects/resourceInventory.d.ts +41 -0
- package/dist/lib/aspects/resourceInventory.js +56 -0
- package/dist/lib/config/audit.d.ts +18 -0
- package/dist/lib/config/audit.js +22 -0
- package/dist/lib/config/aws/backupGlobalSettings.d.ts +1 -1
- package/dist/lib/config/aws/backupGlobalSettings.js +1 -1
- package/dist/lib/config/aws/cloudTrail.d.ts +1 -1
- package/dist/lib/config/aws/cloudTrail.js +2 -2
- package/dist/lib/config/aws/disasterRecovery.js +1 -1
- package/dist/lib/config/aws/ecrDefaultImage.d.ts +1 -1
- package/dist/lib/config/aws/ecrDefaultImage.js +4 -4
- package/dist/lib/config/aws/identityCenter.d.ts +3 -3
- package/dist/lib/config/aws/identityCenter.js +1 -1
- package/dist/lib/config/aws/identityCenterGroupMembership.d.ts +2 -2
- package/dist/lib/config/aws/identityCenterGroupMembership.js +1 -1
- package/dist/lib/config/aws/ipam.js +2 -4
- package/dist/lib/config/aws/organisation.d.ts +3 -3
- package/dist/lib/config/aws/organisation.js +1 -1
- package/dist/lib/config/aws/organisationsAccess.d.ts +1 -1
- package/dist/lib/config/aws/organisationsAccess.js +1 -1
- package/dist/lib/config/monitoring.d.ts +18 -0
- package/dist/lib/config/monitoring.js +22 -0
- package/dist/lib/patterns/aws/auditRole.d.ts +44 -0
- package/dist/lib/patterns/aws/auditRole.js +58 -0
- package/dist/lib/patterns/aws/buildkite.d.ts +3 -3
- package/dist/lib/patterns/aws/buildkite.js +1 -1
- package/dist/lib/patterns/aws/compute.d.ts +17 -11
- package/dist/lib/patterns/aws/compute.js +7 -7
- package/dist/lib/patterns/aws/database.d.ts +185 -24
- package/dist/lib/patterns/aws/database.js +280 -42
- package/dist/lib/patterns/aws/ec2.d.ts +43 -0
- package/dist/lib/patterns/aws/ec2.js +123 -0
- package/dist/lib/patterns/aws/fivetranProxy.d.ts +5 -5
- package/dist/lib/patterns/aws/fivetranProxy.js +1 -1
- package/dist/lib/patterns/aws/hostedZone.d.ts +2 -2
- package/dist/lib/patterns/aws/hostedZone.js +1 -1
- package/dist/lib/patterns/aws/index.d.ts +1 -0
- package/dist/lib/patterns/aws/index.js +2 -1
- package/dist/lib/patterns/aws/managedAccount.d.ts +2 -2
- package/dist/lib/patterns/aws/managedAccount.js +1 -1
- package/dist/lib/patterns/aws/managedIdentityCenter.js +1 -1
- package/dist/lib/patterns/aws/managedOrganisation.d.ts +3 -3
- package/dist/lib/patterns/aws/managedOrganisation.js +1 -1
- package/dist/lib/patterns/aws/managedPlatform.d.ts +2 -2
- package/dist/lib/patterns/aws/managedPlatform.js +2 -4
- package/dist/lib/patterns/aws/network.d.ts +75 -0
- package/dist/lib/patterns/aws/network.js +99 -0
- package/dist/lib/patterns/aws/storage.d.ts +4 -55
- package/dist/lib/patterns/aws/storage.js +3 -103
- package/dist/lib/resources/aws/audit/auditRole.d.ts +32 -0
- package/dist/lib/resources/aws/audit/auditRole.js +46 -0
- package/dist/lib/resources/aws/backup/backupPlan.d.ts +2 -2
- package/dist/lib/resources/aws/backup/backupPlan.js +1 -1
- package/dist/lib/resources/aws/backup/backupVault.d.ts +2 -2
- package/dist/lib/resources/aws/backup/backupVault.js +1 -1
- package/dist/lib/resources/aws/base/awsStack.js +1 -4
- package/dist/lib/resources/aws/compute/ec2.d.ts +4 -3
- package/dist/lib/resources/aws/compute/ec2.js +5 -3
- package/dist/lib/resources/aws/compute/ecs.d.ts +9 -9
- package/dist/lib/resources/aws/compute/ecs.js +68 -20
- package/dist/lib/resources/aws/compute/ecsFreeTier.d.ts +6 -7
- package/dist/lib/resources/aws/compute/ecsFreeTier.js +17 -10
- package/dist/lib/resources/aws/compute/ecsSpot.d.ts +6 -7
- package/dist/lib/resources/aws/compute/ecsSpot.js +19 -14
- package/dist/lib/resources/aws/compute/lambda.d.ts +15 -10
- package/dist/lib/resources/aws/compute/lambda.js +27 -19
- package/dist/lib/resources/aws/database/database.d.ts +2 -2
- package/dist/lib/resources/aws/database/database.js +1 -1
- package/dist/lib/resources/aws/database/databaseInstance.d.ts +2 -2
- package/dist/lib/resources/aws/database/databaseInstance.js +2 -2
- package/dist/lib/resources/aws/database/index.d.ts +0 -1
- package/dist/lib/resources/aws/database/index.js +1 -2
- package/dist/lib/resources/aws/database/rdsAurora.d.ts +24 -6
- package/dist/lib/resources/aws/database/rdsAurora.js +212 -85
- package/dist/lib/resources/aws/database/rdsAuroraGlobal.d.ts +41 -6
- package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +38 -8
- package/dist/lib/resources/aws/database/rdsInstance.d.ts +19 -10
- package/dist/lib/resources/aws/database/rdsInstance.js +220 -73
- package/dist/lib/resources/aws/iam/identityCenter/assignment.d.ts +1 -1
- package/dist/lib/resources/aws/iam/identityCenter/assignment.js +1 -1
- package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.d.ts +1 -1
- package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.js +1 -1
- package/dist/lib/resources/aws/iam/identityCenter/group.d.ts +1 -1
- package/dist/lib/resources/aws/iam/identityCenter/group.js +1 -1
- package/dist/lib/resources/aws/iam/identityCenter/permissionSet.d.ts +2 -2
- package/dist/lib/resources/aws/iam/identityCenter/permissionSet.js +1 -1
- package/dist/lib/resources/aws/iam/instanceProfile.d.ts +1 -1
- package/dist/lib/resources/aws/iam/instanceProfile.js +1 -1
- package/dist/lib/resources/aws/iam/managedPolicy.d.ts +1 -1
- package/dist/lib/resources/aws/iam/managedPolicy.js +1 -1
- package/dist/lib/resources/aws/iam/policy.d.ts +1 -1
- package/dist/lib/resources/aws/iam/policy.js +1 -1
- package/dist/lib/resources/aws/iam/role.d.ts +1 -1
- package/dist/lib/resources/aws/iam/role.js +1 -1
- package/dist/lib/resources/aws/iam/securityGroup.d.ts +1 -1
- package/dist/lib/resources/aws/iam/securityGroup.js +1 -1
- package/dist/lib/resources/aws/index.d.ts +1 -0
- package/dist/lib/resources/aws/index.js +2 -1
- package/dist/lib/resources/aws/logging/logGroup.d.ts +2 -2
- package/dist/lib/resources/aws/logging/logGroup.js +1 -1
- package/dist/lib/resources/aws/monitoring/index.d.ts +1 -0
- package/dist/lib/resources/aws/monitoring/index.js +18 -0
- package/dist/lib/resources/aws/monitoring/monitoringRole.d.ts +28 -0
- package/dist/lib/resources/aws/monitoring/monitoringRole.js +69 -0
- package/dist/lib/resources/aws/networking/index.d.ts +0 -1
- package/dist/lib/resources/aws/networking/index.js +1 -2
- package/dist/lib/resources/aws/networking/ipam.d.ts +1 -1
- package/dist/lib/resources/aws/networking/ipam.js +1 -1
- package/dist/lib/resources/aws/networking/ipamPool.d.ts +1 -1
- package/dist/lib/resources/aws/networking/ipamPool.js +1 -2
- package/dist/lib/resources/aws/networking/vpc.d.ts +42 -23
- package/dist/lib/resources/aws/networking/vpc.js +185 -36
- package/dist/lib/resources/aws/secrets/alias.d.ts +1 -1
- package/dist/lib/resources/aws/secrets/alias.js +1 -1
- package/dist/lib/resources/aws/secrets/parameter.d.ts +1 -1
- package/dist/lib/resources/aws/secrets/parameter.js +1 -1
- package/dist/lib/resources/aws/secrets/secret.d.ts +8 -4
- package/dist/lib/resources/aws/secrets/secret.js +19 -2
- package/dist/lib/resources/aws/storage/ecr.d.ts +4 -4
- package/dist/lib/resources/aws/storage/ecr.js +1 -1
- package/dist/lib/resources/aws/storage/s3.d.ts +2 -2
- package/dist/lib/resources/aws/storage/s3.js +1 -1
- package/dist/lib/resources/aws/utilities/awsCustomResource.d.ts +1 -1
- package/dist/lib/resources/aws/utilities/awsCustomResource.js +1 -1
- package/dist/lib/resources/aws/utilities/cfnOutput.d.ts +1 -1
- package/dist/lib/resources/aws/utilities/cfnOutput.js +1 -1
- package/dist/lib/resources/aws/utilities/codeBuild.d.ts +1 -1
- package/dist/lib/resources/aws/utilities/codeBuild.js +1 -1
- package/dist/lib/resources/aws/utilities/customResource.d.ts +9 -7
- package/dist/lib/resources/aws/utilities/customResource.js +35 -11
- package/dist/lib/resources/aws/utilities/customResourceProvider.d.ts +2 -2
- package/dist/lib/resources/aws/utilities/customResourceProvider.js +1 -1
- package/dist/lib/resources/aws/utilities/resourceShare.d.ts +2 -2
- package/dist/lib/resources/aws/utilities/resourceShare.js +1 -1
- package/dist/lib/utils/getAsync.d.ts +1 -1
- package/dist/lib/utils/getAsync.js +1 -1
- package/dist/lib/utils/getCidr.d.ts +8 -0
- package/dist/lib/utils/getCidr.js +40 -0
- package/dist/lib/utils/getConfig.d.ts +2 -2
- package/dist/lib/utils/getConfig.js +3 -3
- package/dist/lib/utils/index.d.ts +1 -0
- package/dist/lib/utils/index.js +2 -1
- package/dist/lib/utils/resourceNaming.d.ts +41 -0
- package/dist/lib/utils/resourceNaming.js +77 -0
- package/dist/lib/utils/standardTagsAspect.d.ts +2 -2
- package/dist/lib/utils/standardTagsAspect.js +6 -5
- package/dist/lib/utils/tagResource.d.ts +1 -1
- package/dist/lib/utils/tagResource.js +1 -1
- package/package.json +3 -3
- package/dist/lib/__tests__/patterns/__snapshots__/compute.test.js.snap +0 -433
- package/dist/lib/__tests__/patterns/compute.test.d.ts +0 -1
- package/dist/lib/__tests__/patterns/compute.test.js +0 -137
- package/dist/lib/__tests__/simple.test.d.ts +0 -0
- package/dist/lib/__tests__/simple.test.js +0 -12
- package/dist/lib/resources/aws/organisations/account.d.ts +0 -37
- package/dist/lib/resources/aws/organisations/account.js +0 -220
- package/dist/lib/resources/aws/organisations/delegatedAdministrator.d.ts +0 -14
- package/dist/lib/resources/aws/organisations/delegatedAdministrator.js +0 -61
- package/dist/lib/resources/aws/organisations/index.d.ts +0 -8
- package/dist/lib/resources/aws/organisations/index.js +0 -22
- package/dist/lib/resources/aws/organisations/interfaces.d.ts +0 -105
- package/dist/lib/resources/aws/organisations/interfaces.js +0 -3
- package/dist/lib/resources/aws/organisations/organisation.d.ts +0 -47
- package/dist/lib/resources/aws/organisations/organisation.js +0 -263
- package/dist/lib/resources/aws/organisations/organisationalUnit.d.ts +0 -28
- package/dist/lib/resources/aws/organisations/organisationalUnit.js +0 -170
- package/dist/lib/resources/aws/organisations/policy.d.ts +0 -17
- package/dist/lib/resources/aws/organisations/policy.js +0 -93
- package/dist/lib/resources/aws/organisations/trustedServiceAccess.d.ts +0 -13
- package/dist/lib/resources/aws/organisations/trustedServiceAccess.js +0 -58
- package/dist/lib/resources/aws/organisations/types.d.ts +0 -165
- package/dist/lib/resources/aws/organisations/types.js +0 -36
- package/dist/lib/utils/directTagging.d.ts +0 -31
- package/dist/lib/utils/directTagging.js +0 -86
- package/dist/lib/utils/fjallConstruct.d.ts +0 -8
- package/dist/lib/utils/fjallConstruct.js +0 -18
- package/dist/lib/utils/fjallStackSynthesizer.d.ts +0 -9
- package/dist/lib/utils/fjallStackSynthesizer.js +0 -22
- package/dist/lib/utils/tagContext.d.ts +0 -28
- package/dist/lib/utils/tagContext.js +0 -53
- package/dist/lib/utils/tagSynthesizer.d.ts +0 -13
- package/dist/lib/utils/tagSynthesizer.js +0 -55
|
@@ -8,124 +8,230 @@ const aws_secretsmanager_1 = require("aws-cdk-lib/aws-secretsmanager");
|
|
|
8
8
|
const constructs_1 = require("constructs");
|
|
9
9
|
const iam_1 = require("../iam");
|
|
10
10
|
const secrets_1 = require("../secrets");
|
|
11
|
+
const resourceNaming_1 = require("../../../utils/resourceNaming");
|
|
12
|
+
const database_1 = require("../../../patterns/aws/database");
|
|
11
13
|
class RdsAurora extends constructs_1.Construct {
|
|
12
14
|
constructor(scope, id, props) {
|
|
13
15
|
super(scope, id);
|
|
14
|
-
this.port = props.port
|
|
15
|
-
//
|
|
16
|
-
this.
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
16
|
+
this.port = props.port ?? 35255;
|
|
17
|
+
// PostgreSQL fallback for direct usage - ensure engine and engineConfig match
|
|
18
|
+
this.engineConfig = props.engineConfig ?? {
|
|
19
|
+
defaultUsername: "postgres",
|
|
20
|
+
sslParameters: { "rds.force_ssl": "1" },
|
|
21
|
+
rotationAppName: "SecretsManagerRDSPostgreSQLRotationMultiUser"
|
|
22
|
+
};
|
|
23
|
+
const piEnabled = props.performanceInsights !== false;
|
|
24
|
+
const piConfig = piEnabled && typeof props.performanceInsights === "object"
|
|
25
|
+
? props.performanceInsights
|
|
26
|
+
: undefined;
|
|
27
|
+
const username = props.credentials?.username ?? this.engineConfig.defaultUsername;
|
|
28
|
+
// Global secondary clusters import replicated secret instead of creating new
|
|
29
|
+
if (props.isGlobalSecondary) {
|
|
30
|
+
this.databaseCredentials = new secrets_1.Secret(this, `${props.databaseName}Credentials`, {
|
|
31
|
+
secretName: `${props.databaseName}Credentials`,
|
|
32
|
+
importExisting: true
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
this.databaseCredentials = new secrets_1.Secret(this, `${props.databaseName}Credentials`, {
|
|
37
|
+
secretName: `${props.databaseName}Credentials`,
|
|
38
|
+
generateSecretString: {
|
|
39
|
+
secretStringTemplate: JSON.stringify({ username }),
|
|
40
|
+
excludePunctuation: true,
|
|
41
|
+
includeSpace: false,
|
|
42
|
+
generateStringKey: "password"
|
|
43
|
+
},
|
|
44
|
+
replicaRegions: props.secretReplicaRegions
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
const storageEncryptionKey = (0, database_1.isCMKRequested)(props.encryption?.storageKey)
|
|
48
|
+
? new secrets_1.CustomerManagedKey(this, `${props.databaseName}ClusterEncryptionKey`, { aliasName: `cmk/rds/${props.databaseName}/encryptionKey` }).key
|
|
49
|
+
: (0, database_1.isAwsManagedKey)(props.encryption?.storageKey) ||
|
|
50
|
+
props.encryption?.storageKey === undefined
|
|
51
|
+
? undefined // AWS Managed (default)
|
|
52
|
+
: props.encryption?.storageKey; // Use provided IKey
|
|
53
|
+
const performanceInsightsKey = piEnabled && (0, database_1.isCMKRequested)(piConfig?.encryptionKey)
|
|
54
|
+
? new secrets_1.CustomerManagedKey(this, `${props.databaseName}PerformanceInsightsKey`, { aliasName: `cmk/rds/${props.databaseName}/InsightsKey` }).key
|
|
55
|
+
: undefined;
|
|
56
|
+
const clusterSecurityGroup = new iam_1.SecurityGroup(this, `${id}SecurityGroup`, {
|
|
57
|
+
vpc: props.vpc,
|
|
58
|
+
description: `Security group for Aurora cluster ${props.databaseName}`
|
|
33
59
|
});
|
|
34
|
-
|
|
35
|
-
|
|
60
|
+
clusterSecurityGroup.addIngressRule(clusterSecurityGroup, aws_ec2_1.Port.tcp(this.port));
|
|
61
|
+
this.connections = new aws_ec2_1.Connections({
|
|
62
|
+
securityGroups: [clusterSecurityGroup],
|
|
63
|
+
defaultPort: aws_ec2_1.Port.tcp(this.port)
|
|
36
64
|
});
|
|
37
|
-
const
|
|
38
|
-
|
|
65
|
+
const writerConfig = props.writer ?? {};
|
|
66
|
+
const writerPI = writerConfig.enablePerformanceInsights ?? piEnabled;
|
|
67
|
+
const writerSuffix = writerConfig.identifierSuffix ?? "primary-writer";
|
|
68
|
+
const performanceInsightsRetention = this.getPerformanceInsightRetention(piConfig?.retentionPeriod ?? 7);
|
|
69
|
+
const databaseName = props.databaseName || id;
|
|
70
|
+
const writer = aws_rds_1.ClusterInstance.serverlessV2(`${databaseName}Writer`, {
|
|
71
|
+
enablePerformanceInsights: writerPI,
|
|
72
|
+
performanceInsightEncryptionKey: writerPI
|
|
73
|
+
? performanceInsightsKey
|
|
74
|
+
: undefined,
|
|
75
|
+
performanceInsightRetention: writerPI
|
|
76
|
+
? performanceInsightsRetention
|
|
77
|
+
: undefined,
|
|
78
|
+
instanceIdentifier: resourceNaming_1.ResourceNaming.writerInstanceId(databaseName, writerSuffix),
|
|
79
|
+
caCertificate: aws_rds_1.CaCertificate.RDS_CA_RSA4096_G1,
|
|
80
|
+
...(writerConfig.availabilityZone && {
|
|
81
|
+
availabilityZone: writerConfig.availabilityZone
|
|
82
|
+
})
|
|
39
83
|
});
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
84
|
+
const readers = this.buildReaders(props, piEnabled, performanceInsightsKey, performanceInsightsRetention);
|
|
85
|
+
const engine = props.engine ||
|
|
86
|
+
aws_rds_1.DatabaseClusterEngine.auroraPostgres({
|
|
87
|
+
version: aws_rds_1.AuroraPostgresEngineVersion.of("16.6", "16")
|
|
88
|
+
});
|
|
89
|
+
const parameterGroup = new aws_rds_1.ParameterGroup(this, `${props.databaseName}ParameterGroup`, {
|
|
90
|
+
engine,
|
|
91
|
+
description: `Parameter group for ${props.databaseName} with security defaults`,
|
|
92
|
+
parameters: this.engineConfig.sslParameters
|
|
43
93
|
});
|
|
44
|
-
|
|
45
|
-
clusterSecurityGroup.addIngressRule(clusterSecurityGroup, aws_ec2_1.Port.tcp(5432));
|
|
46
|
-
this.connections = clusterSecurityGroup.connections;
|
|
47
|
-
// Database Cluster
|
|
48
|
-
const databaseCluster = new aws_rds_1.DatabaseCluster(this, `${id}Database`, {
|
|
94
|
+
const dbClusterProps = {
|
|
49
95
|
vpc: props.vpc,
|
|
50
|
-
vpcSubnets: {
|
|
51
|
-
subnetType: aws_ec2_1.SubnetType.PRIVATE_WITH_EGRESS
|
|
52
|
-
},
|
|
96
|
+
vpcSubnets: { subnetType: aws_ec2_1.SubnetType.PRIVATE_WITH_EGRESS },
|
|
53
97
|
securityGroups: [clusterSecurityGroup],
|
|
54
|
-
engine
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
version: aws_rds_1.AuroraPostgresEngineVersion.VER_15_6
|
|
58
|
-
}),
|
|
59
|
-
backup: props.backup || {
|
|
60
|
-
retention: aws_cdk_lib_1.Duration.days(14)
|
|
61
|
-
},
|
|
98
|
+
engine,
|
|
99
|
+
parameterGroup,
|
|
100
|
+
backup: { retention: aws_cdk_lib_1.Duration.days(props.backupRetention ?? 14) },
|
|
62
101
|
storageEncrypted: true,
|
|
63
|
-
storageEncryptionKey
|
|
102
|
+
...(storageEncryptionKey && { storageEncryptionKey }),
|
|
64
103
|
clusterIdentifier: props.clusterIdentifier?.toLowerCase() ||
|
|
65
|
-
|
|
66
|
-
credentials: aws_rds_1.Credentials.fromSecret(this.databaseCredentials.secret),
|
|
67
|
-
defaultDatabaseName: props.databaseName || `${id.replace("Rds", "")}`,
|
|
104
|
+
resourceNaming_1.ResourceNaming.clusterId(props.databaseName || id),
|
|
68
105
|
monitoringInterval: props.monitoringInterval || aws_cdk_lib_1.Duration.minutes(1),
|
|
69
106
|
preferredMaintenanceWindow: props.preferredMaintenanceWindow || "Sat:12:30-Sat:20:30",
|
|
70
|
-
port:
|
|
107
|
+
port: this.port,
|
|
71
108
|
removalPolicy: aws_cdk_lib_1.RemovalPolicy.SNAPSHOT,
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
109
|
+
deletionProtection: true,
|
|
110
|
+
iamAuthentication: true,
|
|
111
|
+
writer,
|
|
112
|
+
readers
|
|
113
|
+
};
|
|
114
|
+
if (!props.isGlobalSecondary) {
|
|
115
|
+
dbClusterProps.credentials = aws_rds_1.Credentials.fromSecret(this.databaseCredentials.secret);
|
|
116
|
+
dbClusterProps.defaultDatabaseName =
|
|
117
|
+
props.databaseName || `${id.replace("Rds", "")}`;
|
|
118
|
+
}
|
|
119
|
+
if (props.snapshotIdentifier) {
|
|
120
|
+
// Create from snapshot
|
|
121
|
+
const snapshotProps = {
|
|
122
|
+
...dbClusterProps,
|
|
123
|
+
snapshotIdentifier: props.snapshotIdentifier
|
|
124
|
+
};
|
|
125
|
+
// For snapshots, override credentials if not a global secondary
|
|
126
|
+
if (!props.isGlobalSecondary) {
|
|
127
|
+
snapshotProps.credentials = aws_rds_1.SnapshotCredentials.fromSecret(this.databaseCredentials.secret);
|
|
128
|
+
}
|
|
129
|
+
this.databaseCluster = new aws_rds_1.DatabaseClusterFromSnapshot(this, `${id}Database`, snapshotProps);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
// Create new cluster
|
|
133
|
+
this.databaseCluster = new aws_rds_1.DatabaseCluster(this, `${id}Database`, dbClusterProps);
|
|
134
|
+
}
|
|
135
|
+
this.cfnCluster = this.databaseCluster.node.defaultChild;
|
|
136
|
+
// Global secondary clusters can't specify these properties
|
|
137
|
+
if (props.isGlobalSecondary && this.cfnCluster) {
|
|
138
|
+
this.cfnCluster.masterUsername = undefined;
|
|
139
|
+
this.cfnCluster.masterUserPassword = undefined;
|
|
140
|
+
this.cfnCluster.databaseName = undefined;
|
|
141
|
+
}
|
|
142
|
+
const proxyEnabled = props.proxy !== undefined && props.proxy !== false;
|
|
143
|
+
if (proxyEnabled) {
|
|
144
|
+
this.addProxy(props, clusterSecurityGroup);
|
|
145
|
+
}
|
|
146
|
+
// Secret rotation enabled by default (opt-out with secretRotation: false)
|
|
147
|
+
if (!props.isGlobalSecondary) {
|
|
148
|
+
const secretRotationDisabled = props.credentials?.secretRotation === false;
|
|
149
|
+
if (!secretRotationDisabled) {
|
|
150
|
+
this.addSecretRotation(props);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
buildReaders(props, defaultPIEnabled, piKey, piRetention) {
|
|
155
|
+
if (props.readers === false) {
|
|
156
|
+
return [];
|
|
157
|
+
}
|
|
158
|
+
let readerConfigs;
|
|
159
|
+
if (props.readers?.instances) {
|
|
160
|
+
readerConfigs = props.readers.instances;
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
const count = props.readers?.count ?? 1;
|
|
164
|
+
readerConfigs = Array.from({ length: count }, (_, i) => ({
|
|
165
|
+
scaleWithWriter: i === 0
|
|
166
|
+
}));
|
|
167
|
+
}
|
|
168
|
+
const defaultPI = props.readers && "defaultEnablePerformanceInsights" in props.readers
|
|
169
|
+
? (props.readers.defaultEnablePerformanceInsights ?? defaultPIEnabled)
|
|
170
|
+
: defaultPIEnabled;
|
|
171
|
+
return readerConfigs.map((config, index) => {
|
|
172
|
+
const enablePI = config.enablePerformanceInsights ?? defaultPI;
|
|
173
|
+
const identifier = config.identifierSuffix ?? `reader-${index + 1}`;
|
|
174
|
+
return aws_rds_1.ClusterInstance.serverlessV2(`${props.databaseName}Reader${index + 1}`, {
|
|
175
|
+
scaleWithWriter: config.scaleWithWriter ?? index === 0,
|
|
176
|
+
enablePerformanceInsights: enablePI,
|
|
177
|
+
performanceInsightEncryptionKey: enablePI ? piKey : undefined,
|
|
178
|
+
performanceInsightRetention: enablePI ? piRetention : undefined,
|
|
179
|
+
instanceIdentifier: resourceNaming_1.ResourceNaming.readerInstanceId(props.databaseName, index + 1, config.identifierSuffix),
|
|
180
|
+
caCertificate: aws_rds_1.CaCertificate.RDS_CA_RSA4096_G1,
|
|
181
|
+
...(config.availabilityZone && {
|
|
182
|
+
availabilityZone: config.availabilityZone
|
|
94
183
|
})
|
|
95
|
-
|
|
184
|
+
});
|
|
96
185
|
});
|
|
97
|
-
|
|
98
|
-
|
|
186
|
+
}
|
|
187
|
+
addProxy(props, securityGroup) {
|
|
188
|
+
const proxyConfig = props.proxy;
|
|
189
|
+
const vpcSubnets = proxyConfig.vpcSubnets ?? {
|
|
190
|
+
subnetType: aws_ec2_1.SubnetType.PRIVATE_WITH_EGRESS
|
|
191
|
+
};
|
|
99
192
|
this.databaseProxy = new aws_rds_1.DatabaseProxy(this, `${props.databaseName}DatabaseProxy`, {
|
|
100
|
-
|
|
193
|
+
dbProxyName: resourceNaming_1.ResourceNaming.proxyName(props.databaseName),
|
|
194
|
+
proxyTarget: aws_rds_1.ProxyTarget.fromCluster(this.databaseCluster),
|
|
101
195
|
secrets: [this.databaseCredentials.secret],
|
|
102
|
-
securityGroups: [
|
|
196
|
+
securityGroups: [securityGroup],
|
|
103
197
|
vpc: props.vpc,
|
|
104
|
-
vpcSubnets
|
|
105
|
-
|
|
106
|
-
|
|
198
|
+
vpcSubnets,
|
|
199
|
+
requireTLS: proxyConfig.requireTLS ?? true,
|
|
200
|
+
borrowTimeout: proxyConfig.connectionBorrowTimeout
|
|
201
|
+
? aws_cdk_lib_1.Duration.seconds(proxyConfig.connectionBorrowTimeout)
|
|
202
|
+
: aws_cdk_lib_1.Duration.seconds(120),
|
|
203
|
+
maxConnectionsPercent: proxyConfig.maxConnections,
|
|
204
|
+
maxIdleConnectionsPercent: proxyConfig.maxIdleConnections
|
|
107
205
|
});
|
|
108
206
|
new aws_cdk_lib_1.CfnOutput(this, `${props.databaseName}ProxyEndpointOutput`, {
|
|
109
207
|
key: `${props.databaseName}ProxyEndpoint`,
|
|
110
208
|
exportName: `${props.databaseName}ProxyEndpoint`,
|
|
111
209
|
value: this.databaseProxy.endpoint
|
|
112
210
|
});
|
|
113
|
-
|
|
211
|
+
}
|
|
212
|
+
addSecretRotation(props) {
|
|
213
|
+
const rotationConfig = props.credentials?.secretRotation;
|
|
214
|
+
const rotationPeriod = (typeof rotationConfig === "object" &&
|
|
215
|
+
rotationConfig?.automaticallyAfter) ||
|
|
216
|
+
aws_cdk_lib_1.Duration.days(30);
|
|
114
217
|
const masterSecret = new secrets_1.Secret(this, `${props.databaseName}MasterSecret`, {
|
|
115
218
|
secretName: `${props.databaseName}MasterSecret`
|
|
116
219
|
});
|
|
117
220
|
new aws_secretsmanager_1.SecretRotation(this, `${props.databaseName}SecretRotation`, {
|
|
118
|
-
application: new aws_secretsmanager_1.SecretRotationApplication(
|
|
119
|
-
isMultiUser: true
|
|
120
|
-
}),
|
|
221
|
+
application: new aws_secretsmanager_1.SecretRotationApplication(this.engineConfig.rotationAppName, "1.1.367", { isMultiUser: true }),
|
|
121
222
|
secret: this.databaseCredentials.secret,
|
|
122
223
|
masterSecret: masterSecret.secret,
|
|
123
|
-
target: databaseCluster,
|
|
124
|
-
vpc: databaseCluster.vpc
|
|
224
|
+
target: this.databaseCluster,
|
|
225
|
+
vpc: this.databaseCluster.vpc,
|
|
226
|
+
automaticallyAfter: rotationPeriod
|
|
125
227
|
});
|
|
126
228
|
}
|
|
127
229
|
getHostEndpoint() {
|
|
128
|
-
|
|
230
|
+
// Return proxy endpoint if available, otherwise cluster endpoint
|
|
231
|
+
if (this.databaseProxy) {
|
|
232
|
+
return this.databaseProxy.endpoint;
|
|
233
|
+
}
|
|
234
|
+
return this.databaseCluster.clusterEndpoint.hostname;
|
|
129
235
|
}
|
|
130
236
|
getHostPort() {
|
|
131
237
|
return String(this.port);
|
|
@@ -136,6 +242,27 @@ class RdsAurora extends constructs_1.Construct {
|
|
|
136
242
|
getCfnCluster() {
|
|
137
243
|
return this.cfnCluster;
|
|
138
244
|
}
|
|
245
|
+
getDatabaseCluster() {
|
|
246
|
+
return this.databaseCluster;
|
|
247
|
+
}
|
|
248
|
+
getPerformanceInsightRetention(days) {
|
|
249
|
+
switch (days) {
|
|
250
|
+
case 7:
|
|
251
|
+
return aws_rds_1.PerformanceInsightRetention.DEFAULT;
|
|
252
|
+
case 31:
|
|
253
|
+
return aws_rds_1.PerformanceInsightRetention.MONTHS_1;
|
|
254
|
+
case 93:
|
|
255
|
+
return aws_rds_1.PerformanceInsightRetention.MONTHS_3;
|
|
256
|
+
case 186:
|
|
257
|
+
return aws_rds_1.PerformanceInsightRetention.MONTHS_6;
|
|
258
|
+
case 372:
|
|
259
|
+
return aws_rds_1.PerformanceInsightRetention.MONTHS_12;
|
|
260
|
+
case 731:
|
|
261
|
+
return aws_rds_1.PerformanceInsightRetention.LONG_TERM;
|
|
262
|
+
default:
|
|
263
|
+
return aws_rds_1.PerformanceInsightRetention.MONTHS_1;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
139
266
|
}
|
|
140
267
|
exports.RdsAurora = RdsAurora;
|
|
141
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmRzQXVyb3JhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3MvZGF0YWJhc2UvcmRzQXVyb3JhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUFpRTtBQUNqRSxpREFNNkI7QUFDN0IsaURBWTZCO0FBQzdCLHVFQUd3QztBQUN4QywyQ0FBdUM7QUFDdkMsZ0NBQXVDO0FBQ3ZDLHdDQUF3RDtBQWdCeEQsTUFBYSxTQUFVLFNBQVEsc0JBQVM7SUFVdEMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFlO1FBQ3ZELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQztRQUUvQix1QkFBdUI7UUFDdkIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksZ0JBQU0sQ0FDbkMsSUFBSSxFQUNKLEdBQUcsS0FBSyxDQUFDLFlBQVksYUFBYSxFQUNsQztZQUNFLFVBQVUsRUFBRSxHQUFHLEtBQUssQ0FBQyxZQUFZLGFBQWE7WUFDOUMsb0JBQW9CLEVBQUU7Z0JBQ3BCLG9CQUFvQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQ25DLFFBQVEsRUFBRSxVQUFVO2lCQUNyQixDQUFDO2dCQUNGLGtCQUFrQixFQUFFLElBQUk7Z0JBQ3hCLFlBQVksRUFBRSxLQUFLO2dCQUNuQixpQkFBaUIsRUFBRSxVQUFVO2FBQzlCO1NBQ0YsQ0FDRixDQUFDO1FBRUYsd0JBQXdCO1FBQ3hCLE1BQU0sYUFBYSxHQUFHLElBQUksNEJBQWtCLENBQzFDLElBQUksRUFDSixHQUFHLEtBQUssQ0FBQyxZQUFZLHNCQUFzQixFQUMzQztZQUNFLFNBQVMsRUFBRSxXQUFXLEtBQUssQ0FBQyxZQUFZLGdCQUFnQjtTQUN6RCxDQUNGLENBQUM7UUFFRixNQUFNLHdCQUF3QixHQUFHLElBQUksNEJB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UUFDWCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztDQUNGO0FBN0xELDhCQTZMQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENmbk91dHB1dCwgRHVyYXRpb24sIFJlbW92YWxQb2xpY3kgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7XG4gIENvbm5lY3Rpb25zLFxuICBJQ29ubmVjdGFibGUsXG4gIElWcGMsXG4gIFBvcnQsXG4gIFN1Ym5ldFR5cGVcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7XG4gIEF1cm9yYVBvc3RncmVzRW5naW5lVmVyc2lvbixcbiAgQmFja3VwUHJvcHMsXG4gIENhQ2VydGlmaWNhdGUsXG4gIENsdXN0ZXJJbnN0YW5jZSxcbiAgQ3JlZGVudGlhbHMsXG4gIERhdGFiYXNlQ2x1c3RlcixcbiAgRGF0YWJhc2VDbHVzdGVyRW5naW5lLFxuICBDZm5EQkNsdXN0ZXIsXG4gIERhdGFiYXNlUHJveHksXG4gIElDbHVzdGVyRW5naW5lLFxuICBQcm94eVRhcmdldFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJkc1wiO1xuaW1wb3J0IHtcbiAgU2VjcmV0Um90YXRpb24sXG4gIFNlY3JldFJvdGF0aW9uQXBwbGljYXRpb25cbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlclwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IFNlY3VyaXR5R3JvdXAgfSBmcm9tIFwiLi4vaWFtXCI7XG5pbXBvcnQgeyBDdXN0b21lck1hbmFnZWRLZXksIFNlY3JldCB9IGZyb20gXCIuLi9zZWNyZXRzXCI7XG5pbXBvcnQgeyBLZXlWYWx1ZSB9IGZyb20gXCIuLi8uLi8uLi90eXBlc1wiO1xuXG5pbnRlcmZhY2UgUmRzUHJvcHMge1xuICB2cGM6IElWcGM7XG4gIGRhdGFiYXNlTmFtZT86IHN0cmluZztcbiAgZW5naW5lPzogSUNsdXN0ZXJFbmdpbmU7XG4gIGJhY2t1cD86IEJhY2t1cFByb3BzO1xuICBjbHVzdGVySWRlbnRpZmllcj86IHN0cmluZztcbiAgbW9uaXRvcmluZ0ludGVydmFsPzogRHVyYXRpb247XG4gIHByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93Pzogc3RyaW5nO1xuICBwb3J0PzogbnVtYmVyO1xuICB3cml0ZXI/OiBDbHVzdGVySW5zdGFuY2U7XG4gIHJlYWRlcnM/OiBDbHVzdGVySW5zdGFuY2VbXTtcbn1cblxuZXhwb3J0IGNsYXNzIFJkc0F1cm9yYSBleHRlbmRzIENvbnN0cnVjdCBpbXBsZW1lbnRzIElDb25uZWN0YWJsZSB7XG4gIHB1YmxpYyBjb25uZWN0aW9uczogQ29ubmVjdGlvbnM7XG5cbiAgcHJpdmF0ZSBwb3J0OiBudW1iZXI7XG5cbiAgcHJpdmF0ZSBkYXRhYmFzZVByb3h5OiBEYXRhYmFzZVByb3h5O1xuICBwcml2YXRlIGRhdGFiYXNlQ3JlZGVudGlhbHM6IFNlY3JldDtcbiAgLy8gRXhwb3NlIHRoZSB1bmRlcmx5aW5nIEwxIERCQ2x1c3RlciBzbyBvdGhlciBjb25zdHJ1Y3RzIGNhbiByZWZlcmVuY2UgaXRcbiAgcHJpdmF0ZSBjZm5DbHVzdGVyPzogQ2ZuREJDbHVzdGVyO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBSZHNQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLnBvcnQgPSBwcm9wcy5wb3J0IHx8IDU0MzI7XG5cbiAgICAvLyBEYXRhYmFzZSBDcmVkZW50aWFsc1xuICAgIHRoaXMuZGF0YWJhc2VDcmVkZW50aWFscyA9IG5ldyBTZWNyZXQoXG4gICAgICB0aGlzLFxuICAgICAgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfUNyZWRlbnRpYWxzYCxcbiAgICAgIHtcbiAgICAgICAgc2VjcmV0TmFtZTogYCR7cHJvcHMuZGF0YWJhc2VOYW1lfUNyZWRlbnRpYWxzYCxcbiAgICAgICAgZ2VuZXJhdGVTZWNyZXRTdHJpbmc6IHtcbiAgICAgICAgICBzZWNyZXRTdHJpbmdUZW1wbGF0ZTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgdXNlcm5hbWU6IFwicG9zdGdyZXNcIlxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGV4Y2x1ZGVQdW5jdHVhdGlvbjogdHJ1ZSxcbiAgICAgICAgICBpbmNsdWRlU3BhY2U6IGZhbHNlLFxuICAgICAgICAgIGdlbmVyYXRlU3RyaW5nS2V5OiBcInBhc3N3b3JkXCJcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBDdXN0b21lciBNYW5hZ2VkIEtleXNcbiAgICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gbmV3IEN1c3RvbWVyTWFuYWdlZEtleShcbiAgICAgIHRoaXMsXG4gICAgICBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9Q2x1c3RlckVuY3J5cHRpb25LZXlgLFxuICAgICAge1xuICAgICAgICBhbGlhc05hbWU6IGBjbWsvcmRzLyR7cHJvcHMuZGF0YWJhc2VOYW1lfS9lbmNyeXB0aW9uS2V5YFxuICAgICAgfVxuICAgICk7XG5cbiAgICBjb25zdCBwcmltYXJ5UmVhZGVySW5zaWdodHNLZXkgPSBuZXcgQ3VzdG9tZXJNYW5hZ2VkS2V5KFxuICAgICAgdGhpcyxcbiAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1QcmltYXJ5UmVhZGVySW5zaWdodHNLZXlgLFxuICAgICAge1xuICAgICAgICBhbGlhc05hbWU6IGBjbWsvcmRzLyR7cHJvcHMuZGF0YWJhc2VOYW1lfS9QcmltYXJ5UmVhZGVySW5zaWdodHNLZXlgXG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IHNlY29uZGFyeVJlYWRlckluc2lnaHRzS2V5ID0gbmV3IEN1c3RvbWVyTWFuYWdlZEtleShcbiAgICAgIHRoaXMsXG4gICAgICBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9U2Vjb25kYXJ5UmVhZGVySW5zaWdodHNLZXlgLFxuICAgICAge1xuICAgICAgICBhbGlhc05hbWU6IGBjbWsvcmRzLyR7cHJvcHMuZGF0YWJhc2VOYW1lfS9TZWNvbmRhcnlSZWFkZXJJbnNpZ2h0c0tleWBcbiAgICAgIH1cbiAgICApO1xuXG4gICAgY29uc3QgcHJpbWFyeVdyaXRlclBlcmZvcm1hbmNlSW5zaWdodHNLZXkgPSBuZXcgQ3VzdG9tZXJNYW5hZ2VkS2V5KFxuICAgICAgdGhpcyxcbiAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1QcmltYXJ5V3JpdGVyUGVyZm9ybWFuY2VJbnNpZ2h0c0tleWAsXG4gICAgICB7XG4gICAgICAgIGFsaWFzTmFtZTogYGNtay9yZHMvJHtwcm9wcy5kYXRhYmFzZU5hbWV9L1ByaW1hcnlXcml0ZXJJbnNpZ2h0c0tleWBcbiAgICAgIH1cbiAgICApO1xuXG4gICAgY29uc3QgY2x1c3RlclNlY3VyaXR5R3JvdXAgPSBuZXcgU2VjdXJpdHlHcm91cCh0aGlzLCBgJHtpZH1TZWN1cml0eUdyb3VwYCwge1xuICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICBkZXNjcmlwdGlvbjogYFNlY3VyaXR5IGdyb3VwIHRoYXQgYWxsb3dzIGluYm91bmQgYWNjZXNzIHRvIHRoZSBwb3N0Z3JlcyBjbHVzdGVyIGZvciAke3Byb3BzLmRhdGFiYXNlTmFtZX1gXG4gICAgfSk7XG5cbiAgICAvL1RPRE86IFJlbW92ZSB0aGlzIGxpbmUsIHRoYXQgYWxsb3dzIHRoZSBwcm94eSB0byBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZS4gUmVwbGFjZSB3aXRoIHNlcGVyYXRlZCBzZWN1cml0eSBncm91cHNcbiAgICBjbHVzdGVyU2VjdXJpdHlHcm91cC5hZGRJbmdyZXNzUnVsZShjbHVzdGVyU2VjdXJpdHlHcm91cCwgUG9ydC50Y3AoNTQzMikpO1xuXG4gICAgdGhpcy5jb25uZWN0aW9ucyA9IGNsdXN0ZXJTZWN1cml0eUdyb3VwLmNvbm5lY3Rpb25zO1xuXG4gICAgLy8gRGF0YWJhc2UgQ2x1c3RlclxuICAgIGNvbnN0IGRhdGFiYXNlQ2x1c3RlciA9IG5ldyBEYXRhYmFzZUNsdXN0ZXIodGhpcywgYCR7aWR9RGF0YWJhc2VgLCB7XG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIHZwY1N1Ym5ldHM6IHtcbiAgICAgICAgc3VibmV0VHlwZTogU3VibmV0VHlwZS5QUklWQVRFX1dJVEhfRUdSRVNTXG4gICAgICB9LFxuICAgICAgc2VjdXJpdHlHcm91cHM6IFtjbHVzdGVyU2VjdXJpdHlHcm91cF0sXG4gICAgICBlbmdpbmU6XG4gICAgICAgIHByb3BzLmVuZ2luZSB8fFxuICAgICAgICBEYXRhYmFzZUNsdXN0ZXJFbmdpbmUuYXVyb3JhUG9zdGdyZXMoe1xuICAgICAgICAgIC8vVE9ETzogRG8gd2UgdXBkYXRlIHRoZXNlIHdoZW4gd2UgcmVsZWFzZSBhIG5ldyB2ZXJzaW9uPyBPciB0cnkgdG8ga2VlcCB0aGVtIGNvbnN0YW50bHkgdXBkYXRlZD9cbiAgICAgICAgICB2ZXJzaW9uOiBBdXJvcmFQb3N0Z3Jlc0VuZ2luZVZlcnNpb24uVkVSXzE1XzZcbiAgICAgICAgfSksXG4gICAgICBiYWNrdXA6IHByb3BzLmJhY2t1cCB8fCB7XG4gICAgICAgIHJldGVudGlvbjogRHVyYXRpb24uZGF5cygxNClcbiAgICAgIH0sXG4gICAgICBzdG9yYWdlRW5jcnlwdGVkOiB0cnVlLFxuICAgICAgc3RvcmFnZUVuY3J5cHRpb25LZXk6IGVuY3J5cHRpb25LZXkua2V5LFxuICAgICAgY2x1c3RlcklkZW50aWZpZXI6XG4gICAgICAgIHByb3BzLmNsdXN0ZXJJZGVudGlmaWVyPy50b0xvd2VyQ2FzZSgpIHx8XG4gICAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZT8udG9Mb3dlckNhc2UoKX0tY2x1c3RlcmAsXG4gICAgICBjcmVkZW50aWFsczogQ3JlZGVudGlhbHMuZnJvbVNlY3JldCh0aGlzLmRhdGFiYXNlQ3JlZGVudGlhbHMuc2VjcmV0KSxcbiAgICAgIGRlZmF1bHREYXRhYmFzZU5hbWU6IHByb3BzLmRhdGFiYXNlTmFtZSB8fCBgJHtpZC5yZXBsYWNlKFwiUmRzXCIsIFwiXCIpfWAsXG4gICAgICBtb25pdG9yaW5nSW50ZXJ2YWw6IHByb3BzLm1vbml0b3JpbmdJbnRlcnZhbCB8fCBEdXJhdGlvbi5taW51dGVzKDEpLFxuICAgICAgcHJlZmVycmVkTWFpbnRlbmFuY2VXaW5kb3c6XG4gICAgICAgIHByb3BzLnByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93IHx8IFwiU2F0OjEyOjMwLVNhdDoyMDozMFwiLFxuICAgICAgcG9ydDogcHJvcHMucG9ydCB8fCA1NDMyLFxuICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5TTkFQU0hPVCxcbiAgICAgIHdyaXRlcjpcbiAgICAgICAgcHJvcHMud3JpdGVyIHx8XG4gICAgICAgIENsdXN0ZXJJbnN0YW5jZS5zZXJ2ZXJsZXNzVjIoYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVdyaXRlcmAsIHtcbiAgICAgICAgICBlbmFibGVQZXJmb3JtYW5jZUluc2lnaHRzOiB0cnVlLFxuICAgICAgICAgIHBlcmZvcm1hbmNlSW5zaWdodEVuY3J5cHRpb25LZXk6XG4gICAgICAgICAgICBwcmltYXJ5V3JpdGVyUGVyZm9ybWFuY2VJbnNpZ2h0c0tleS5rZXksXG4gICAgICAgICAgaW5zdGFuY2VJZGVudGlmaWVyOiBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9LXByaW1hcnktd3JpdGVyYCxcbiAgICAgICAgICAvL1RPRE86IERvIHdlIHVwZGF0ZSB0aGVzZSB3aGVuIHdlIHJlbGVhc2UgYSBuZXcgdmVyc2lvbj8gT3IgdHJ5IHRvIGtlZXAgdGhlbSBjb25zdGFudGx5IHVwZGF0ZWQ/XG4gICAgICAgICAgY2FDZXJ0aWZpY2F0ZTogQ2FDZXJ0aWZpY2F0ZS5SRFNfQ0FfUlNBNDA5Nl9HMVxuICAgICAgICB9KSxcbiAgICAgIHJlYWRlcnM6IHByb3BzLnJlYWRlcnMgfHwgW1xuICAgICAgICBDbHVzdGVySW5zdGFuY2Uuc2VydmVybGVzc1YyKGAke3Byb3BzLmRhdGFiYXNlTmFtZX1QcmltYXJ5UmVhZGVyYCwge1xuICAgICAgICAgIHNjYWxlV2l0aFdyaXRlcjogdHJ1ZSxcbiAgICAgICAgICBlbmFibGVQZXJmb3JtYW5jZUluc2lnaHRzOiB0cnVlLFxuICAgICAgICAgIHBlcmZvcm1hbmNlSW5zaWdodEVuY3J5cHRpb25LZXk6IHByaW1hcnlSZWFkZXJJbnNpZ2h0c0tleS5rZXksXG4gICAgICAgICAgaW5zdGFuY2VJZGVudGlmaWVyOiBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9LXByaW1hcnktcmVhZGVyYCxcbiAgICAgICAgICBjYUNlcnRpZmljYXRlOiBDYUNlcnRpZmljYXRlLlJEU19DQV9SU0E0MDk2X0cxXG4gICAgICAgIH0pLFxuICAgICAgICBDbHVzdGVySW5zdGFuY2Uuc2VydmVybGVzc1YyKGAke3Byb3BzLmRhdGFiYXNlTmFtZX1TZWNvbmRhcnlSZWFkZXJgLCB7XG4gICAgICAgICAgc2NhbGVXaXRoV3JpdGVyOiBmYWxzZSxcbiAgICAgICAgICBlbmFibGVQZXJmb3JtYW5jZUluc2lnaHRzOiB0cnVlLFxuICAgICAgICAgIHBlcmZvcm1hbmNlSW5zaWdodEVuY3J5cHRpb25LZXk6IHNlY29uZGFyeVJlYWRlckluc2lnaHRzS2V5LmtleSxcbiAgICAgICAgICBpbnN0YW5jZUlkZW50aWZpZXI6IGAke3Byb3BzLmRhdGFiYXNlTmFtZX0tc2Vjb25kYXJ5LXJlYWRlcmAsXG4gICAgICAgICAgY2FDZXJ0aWZpY2F0ZTogQ2FDZXJ0aWZpY2F0ZS5SRFNfQ0FfUlNBNDA5Nl9HMVxuICAgICAgICB9KVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgLy8gQ2FwdHVyZSB0aGUgTDEgREJDbHVzdGVyIChDZm4pIGZvciBleHRlcm5hbCByZWZlcmVuY2VcbiAgICB0aGlzLmNmbkNsdXN0ZXIgPSBkYXRhYmFzZUNsdXN0ZXIubm9kZS5kZWZhdWx0Q2hpbGQgYXMgQ2ZuREJDbHVzdGVyO1xuXG4gICAgdGhpcy5kYXRhYmFzZVByb3h5ID0gbmV3IERhdGFiYXNlUHJveHkoXG4gICAgICB0aGlzLFxuICAgICAgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfURhdGFiYXNlUHJveHlgLFxuICAgICAge1xuICAgICAgICBwcm94eVRhcmdldDogUHJveHlUYXJnZXQuZnJvbUNsdXN0ZXIoZGF0YWJhc2VDbHVzdGVyKSxcbiAgICAgICAgc2VjcmV0czogW3RoaXMuZGF0YWJhc2VDcmVkZW50aWFscy5zZWNyZXRdLFxuICAgICAgICBzZWN1cml0eUdyb3VwczogW2NsdXN0ZXJTZWN1cml0eUdyb3VwXSxcbiAgICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICAgIHZwY1N1Ym5ldHM6IHtcbiAgICAgICAgICBzdWJuZXRUeXBlOiBTdWJuZXRUeXBlLlBVQkxJQ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcblxuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVByb3h5RW5kcG9pbnRPdXRwdXRgLCB7XG4gICAgICBrZXk6IGAke3Byb3BzLmRhdGFiYXNlTmFtZX1Qcm94eUVuZHBvaW50YCxcbiAgICAgIGV4cG9ydE5hbWU6IGAke3Byb3BzLmRhdGFiYXNlTmFtZX1Qcm94eUVuZHBvaW50YCxcbiAgICAgIHZhbHVlOiB0aGlzLmRhdGFiYXNlUHJveHkuZW5kcG9pbnRcbiAgICB9KTtcblxuICAgIC8vIFJvdGF0ZSB0aGUgU2VjcmV0IGV2ZXJ5IDMwIGRheXNcbiAgICBjb25zdCBtYXN0ZXJTZWNyZXQgPSBuZXcgU2VjcmV0KHRoaXMsIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1NYXN0ZXJTZWNyZXRgLCB7XG4gICAgICBzZWNyZXROYW1lOiBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9TWFzdGVyU2VjcmV0YFxuICAgIH0pO1xuXG4gICAgbmV3IFNlY3JldFJvdGF0aW9uKHRoaXMsIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1TZWNyZXRSb3RhdGlvbmAsIHtcbiAgICAgIGFwcGxpY2F0aW9uOiBuZXcgU2VjcmV0Um90YXRpb25BcHBsaWNhdGlvbihcbiAgICAgICAgXCJTZWNyZXRzTWFuYWdlclJEU1Bvc3RncmVTUUxSb3RhdGlvbk11bHRpVXNlclwiLFxuICAgICAgICBcIjEuMS4zNjdcIixcbiAgICAgICAge1xuICAgICAgICAgIGlzTXVsdGlVc2VyOiB0cnVlXG4gICAgICAgIH1cbiAgICAgICksXG4gICAgICBzZWNyZXQ6IHRoaXMuZGF0YWJhc2VDcmVkZW50aWFscy5zZWNyZXQsXG4gICAgICBtYXN0ZXJTZWNyZXQ6IG1hc3RlclNlY3JldC5zZWNyZXQsXG4gICAgICB0YXJnZXQ6IGRhdGFiYXNlQ2x1c3RlcixcbiAgICAgIHZwYzogZGF0YWJhc2VDbHVzdGVyLnZwY1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0SG9zdEVuZHBvaW50KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YWJhc2VQcm94eS5lbmRwb2ludDtcbiAgfVxuXG4gIGdldEhvc3RQb3J0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFN0cmluZyh0aGlzLnBvcnQpO1xuICB9XG5cbiAgZ2V0Q3JlZGVudGlhbHMoKTogU2VjcmV0IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhYmFzZUNyZWRlbnRpYWxzO1xuICB9XG5cbiAgZ2V0Q2ZuQ2x1c3RlcigpOiBDZm5EQkNsdXN0ZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmNmbkNsdXN0ZXI7XG4gIH1cbn1cbiJdfQ==
|
|
268
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmRzQXVyb3JhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3MvZGF0YWJhc2UvcmRzQXVyb3JhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUFpRTtBQUNqRSxpREFNNkI7QUFDN0IsaURBZ0I2QjtBQUM3Qix1RUFHd0M7QUFDeEMsMkNBQXVDO0FBQ3ZDLGdDQUF1QztBQUN2Qyx3Q0FBd0Q7QUFDeEQsa0VBQStEO0FBQy9ELDZEQVd3QztBQXlCeEMsTUFBYSxTQUFVLFNBQVEsc0JBQVM7SUFVdEMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFlO1FBQ3ZELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQztRQUVoQyw4RUFBOEU7UUFDOUUsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxJQUFJO1lBQ3hDLGVBQWUsRUFBRSxVQUFVO1lBQzNCLGFBQWEsRUFBRSxFQUFFLGVBQWUsRUFBRSxHQUFHLEVBQUU7WUFDdkMsZUFBZSxFQUFFLDhDQUE4QztTQUNoRSxDQUFDO1FBRUYsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixLQUFLLEtBQUssQ0FBQztRQUN0RCxNQUFNLFFBQVEsR0FDWixTQUFTLElBQUksT0FBTyxLQUFLLENBQUMsbUJBQW1CLEtBQUssUUFBUTtZQUN4RCxDQUFDLENBQUMsS0FBSyxDQUFDLG1CQUFtQjtZQUMzQixDQUFDLENBQUMsU0FBUyxDQUFDO1FBRWhCLE1BQU0sUUFBUSxHQUNaLEtBQUssQ0FBQyxXQUFXLEVBQUUsUUFBUSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDO1FBRW5FLDZFQUE2RTtRQUM3RSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FB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bUJBQW1CLENBQUM7SUFDbEMsQ0FBQztJQUVELGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUVPLDhCQUE4QixDQUNwQyxJQUFhO1FBRWIsUUFBUSxJQUFJLEVBQUUsQ0FBQztZQUNiLEtBQUssQ0FBQztnQkFDSixPQUFPLHFDQUEyQixDQUFDLE9BQU8sQ0FBQztZQUM3QyxLQUFLLEVBQUU7Z0JBQ0wsT0FBTyxxQ0FBMkIsQ0FBQyxRQUFRLENBQUM7WUFDOUMsS0FBSyxFQUFFO2dCQUNMLE9BQU8scUNBQTJCLENBQUMsUUFBUSxDQUFDO1lBQzlDLEtBQUssR0FBRztnQkFDTixPQUFPLHFDQUEyQixDQUFDLFFBQVEsQ0FBQztZQUM5QyxLQUFLLEdBQUc7Z0JBQ04sT0FBTyxxQ0FBMkIsQ0FBQyxTQUFTLENBQUM7WUFDL0MsS0FBSyxHQUFHO2dCQUNOLE9BQU8scUNBQTJCLENBQUMsU0FBUyxDQUFDO1lBQy9DO2dCQUNFLE9BQU8scUNBQTJCLENBQUMsUUFBUSxDQUFDO1FBQ2hELENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUF4WEQsOEJBd1hDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2ZuT3V0cHV0LCBEdXJhdGlvbiwgUmVtb3ZhbFBvbGljeSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHtcbiAgQ29ubmVjdGlvbnMsXG4gIHR5cGUgSUNvbm5lY3RhYmxlLFxuICB0eXBlIElWcGMsXG4gIFBvcnQsXG4gIFN1Ym5ldFR5cGVcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7XG4gIEF1cm9yYVBvc3RncmVzRW5naW5lVmVyc2lvbixcbiAgQ2FDZXJ0aWZpY2F0ZSxcbiAgQ2x1c3Rlckluc3RhbmNlLFxuICBDcmVkZW50aWFscyxcbiAgRGF0YWJhc2VDbHVzdGVyLFxuICBEYXRhYmFzZUNsdXN0ZXJGcm9tU25hcHNob3QsXG4gIERhdGFiYXNlQ2x1c3RlckVuZ2luZSxcbiAgdHlwZSBDZm5EQkNsdXN0ZXIsXG4gIERhdGFiYXNlUHJveHksXG4gIHR5cGUgSUNsdXN0ZXJFbmdpbmUsXG4gIHR5cGUgSUNsdXN0ZXJJbnN0YW5jZSxcbiAgUGFyYW1ldGVyR3JvdXAsXG4gIFBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvbixcbiAgUHJveHlUYXJnZXQsXG4gIFNuYXBzaG90Q3JlZGVudGlhbHNcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yZHNcIjtcbmltcG9ydCB7XG4gIFNlY3JldFJvdGF0aW9uLFxuICBTZWNyZXRSb3RhdGlvbkFwcGxpY2F0aW9uXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXJcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBTZWN1cml0eUdyb3VwIH0gZnJvbSBcIi4uL2lhbVwiO1xuaW1wb3J0IHsgQ3VzdG9tZXJNYW5hZ2VkS2V5LCBTZWNyZXQgfSBmcm9tIFwiLi4vc2VjcmV0c1wiO1xuaW1wb3J0IHsgUmVzb3VyY2VOYW1pbmcgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvcmVzb3VyY2VOYW1pbmdcIjtcbmltcG9ydCB7XG4gIHR5cGUgRW5naW5lQ29uZmlnLFxuICB0eXBlIFByb3h5Q29uZmlnLFxuICB0eXBlIENyZWRlbnRpYWxzQ29uZmlnLFxuICB0eXBlIEF1cm9yYUVuY3J5cHRpb25Db25maWcsXG4gIHR5cGUgQXVyb3JhV3JpdGVyQ29uZmlnLFxuICB0eXBlIEF1cm9yYVJlYWRlcnNDb25maWcsXG4gIHR5cGUgQXVyb3JhUmVhZGVyQ29uZmlnLFxuICB0eXBlIFBlcmZvcm1hbmNlSW5zaWdodHNDb25maWcsXG4gIGlzQXdzTWFuYWdlZEtleSxcbiAgaXNDTUtSZXF1ZXN0ZWRcbn0gZnJvbSBcIi4uLy4uLy4uL3BhdHRlcm5zL2F3cy9kYXRhYmFzZVwiO1xuXG5pbnRlcmZhY2UgUmRzUHJvcHMge1xuICB2cGM6IElWcGM7XG4gIGRhdGFiYXNlTmFtZT86IHN0cmluZztcbiAgZW5naW5lPzogSUNsdXN0ZXJFbmdpbmU7XG4gIGVuZ2luZUNvbmZpZz86IEVuZ2luZUNvbmZpZztcbiAgY2x1c3RlcklkZW50aWZpZXI/OiBzdHJpbmc7XG4gIHdyaXRlcj86IEF1cm9yYVdyaXRlckNvbmZpZztcbiAgcmVhZGVycz86IEF1cm9yYVJlYWRlcnNDb25maWcgfCBmYWxzZTtcbiAgcHJveHk/OiBQcm94eUNvbmZpZyB8IGZhbHNlO1xuICBjcmVkZW50aWFscz86IENyZWRlbnRpYWxzQ29uZmlnO1xuICBlbmNyeXB0aW9uPzogQXVyb3JhRW5jcnlwdGlvbkNvbmZpZztcbiAgYmFja3VwUmV0ZW50aW9uPzogbnVtYmVyO1xuICBtb25pdG9yaW5nSW50ZXJ2YWw/OiBEdXJhdGlvbjtcbiAgcHJlZmVycmVkTWFpbnRlbmFuY2VXaW5kb3c/OiBzdHJpbmc7XG4gIHBvcnQ/OiBudW1iZXI7XG4gIHBlcmZvcm1hbmNlSW5zaWdodHM/OiBQZXJmb3JtYW5jZUluc2lnaHRzQ29uZmlnIHwgZmFsc2U7XG4gIC8qKiBTa2lwcyBzZWNyZXQgcm90YXRpb24gZm9yIHNlY29uZGFyeSBjbHVzdGVycyBpbiBnbG9iYWwgZGF0YWJhc2UgKi9cbiAgaXNHbG9iYWxTZWNvbmRhcnk/OiBib29sZWFuO1xuICBzZWNyZXRSZXBsaWNhUmVnaW9ucz86IHN0cmluZ1tdO1xuICAvKiogQVJOIG9yIGlkZW50aWZpZXIgb2YgREIgY2x1c3RlciBzbmFwc2hvdCB0byByZXN0b3JlIGZyb20gKi9cbiAgc25hcHNob3RJZGVudGlmaWVyPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgUmRzQXVyb3JhIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSUNvbm5lY3RhYmxlIHtcbiAgcHVibGljIGNvbm5lY3Rpb25zOiBDb25uZWN0aW9ucztcblxuICBwcml2YXRlIHBvcnQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBlbmdpbmVDb25maWc6IEVuZ2luZUNvbmZpZztcbiAgcHJpdmF0ZSBkYXRhYmFzZUNsdXN0ZXI6IERhdGFiYXNlQ2x1c3RlcjtcbiAgcHJpdmF0ZSBkYXRhYmFzZVByb3h5PzogRGF0YWJhc2VQcm94eTtcbiAgcHJpdmF0ZSBkYXRhYmFzZUNyZWRlbnRpYWxzOiBTZWNyZXQ7XG4gIHByaXZhdGUgY2ZuQ2x1c3Rlcj86IENmbkRCQ2x1c3RlcjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUmRzUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5wb3J0ID0gcHJvcHMucG9ydCA/PyAzNTI1NTtcblxuICAgIC8vIFBvc3RncmVTUUwgZmFsbGJhY2sgZm9yIGRpcmVjdCB1c2FnZSAtIGVuc3VyZSBlbmdpbmUgYW5kIGVuZ2luZUNvbmZpZyBtYXRjaFxuICAgIHRoaXMuZW5naW5lQ29uZmlnID0gcHJvcHMuZW5naW5lQ29uZmlnID8/IHtcbiAgICAgIGRlZmF1bHRVc2VybmFtZTogXCJwb3N0Z3Jlc1wiLFxuICAgICAgc3NsUGFyYW1ldGVyczogeyBcInJkcy5mb3JjZV9zc2xcIjogXCIxXCIgfSxcbiAgICAgIHJvdGF0aW9uQXBwTmFtZTogXCJTZWNyZXRzTWFuYWdlclJEU1Bvc3RncmVTUUxSb3RhdGlvbk11bHRpVXNlclwiXG4gICAgfTtcblxuICAgIGNvbnN0IHBpRW5hYmxlZCA9IHByb3BzLnBlcmZvcm1hbmNlSW5zaWdodHMgIT09IGZhbHNlO1xuICAgIGNvbnN0IHBpQ29uZmlnID1cbiAgICAgIHBpRW5hYmxlZCAmJiB0eXBlb2YgcHJvcHMucGVyZm9ybWFuY2VJbnNpZ2h0cyA9PT0gXCJvYmplY3RcIlxuICAgICAgICA/IHByb3BzLnBlcmZvcm1hbmNlSW5zaWdodHNcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCB1c2VybmFtZSA9XG4gICAgICBwcm9wcy5jcmVkZW50aWFscz8udXNlcm5hbWUgPz8gdGhpcy5lbmdpbmVDb25maWcuZGVmYXVsdFVzZXJuYW1lO1xuXG4gICAgLy8gR2xvYmFsIHNlY29uZGFyeSBjbHVzdGVycyBpbXBvcnQgcmVwbGljYXRlZCBzZWNyZXQgaW5zdGVhZCBvZiBjcmVhdGluZyBuZXdcbiAgICBpZiAocHJvcHMuaXNHbG9iYWxTZWNvbmRhcnkpIHtcbiAgICAgIHRoaXMuZGF0YWJhc2VDcmVkZW50aWFscyA9IG5ldyBTZWNyZXQoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1DcmVkZW50aWFsc2AsXG4gICAgICAgIHtcbiAgICAgICAgICBzZWNyZXROYW1lOiBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9Q3JlZGVudGlhbHNgLFxuICAgICAgICAgIGltcG9ydEV4aXN0aW5nOiB0cnVlXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGF0YWJhc2VDcmVkZW50aWFscyA9IG5ldyBTZWNyZXQoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1DcmVkZW50aWFsc2AsXG4gICAgICAgIHtcbiAgICAgICAgICBzZWNyZXROYW1lOiBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9Q3JlZGVudGlhbHNgLFxuICAgICAgICAgIGdlbmVyYXRlU2VjcmV0U3RyaW5nOiB7XG4gICAgICAgICAgICBzZWNyZXRTdHJpbmdUZW1wbGF0ZTogSlNPTi5zdHJpbmdpZnkoeyB1c2VybmFtZSB9KSxcbiAgICAgICAgICAgIGV4Y2x1ZGVQdW5jdHVhdGlvbjogdHJ1ZSxcbiAgICAgICAgICAgIGluY2x1ZGVTcGFjZTogZmFsc2UsXG4gICAgICAgICAgICBnZW5lcmF0ZVN0cmluZ0tleTogXCJwYXNzd29yZFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXBsaWNhUmVnaW9uczogcHJvcHMuc2VjcmV0UmVwbGljYVJlZ2lvbnNcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdG9yYWdlRW5jcnlwdGlvbktleSA9IGlzQ01LUmVxdWVzdGVkKHByb3BzLmVuY3J5cHRpb24/LnN0b3JhZ2VLZXkpXG4gICAgICA/IG5ldyBDdXN0b21lck1hbmFnZWRLZXkoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9Q2x1c3RlckVuY3J5cHRpb25LZXlgLFxuICAgICAgICAgIHsgYWxpYXNOYW1lOiBgY21rL3Jkcy8ke3Byb3BzLmRhdGFiYXNlTmFtZX0vZW5jcnlwdGlvbktleWAgfVxuICAgICAgICApLmtleVxuICAgICAgOiBpc0F3c01hbmFnZWRLZXkocHJvcHMuZW5jcnlwdGlvbj8uc3RvcmFnZUtleSkgfHxcbiAgICAgICAgICBwcm9wcy5lbmNyeXB0aW9uPy5zdG9yYWdlS2V5ID09PSB1bmRlZmluZWRcbiAgICAgICAgPyB1bmRlZmluZWQgLy8gQVdTIE1hbmFnZWQgKGRlZmF1bHQpXG4gICAgICAgIDogcHJvcHMuZW5jcnlwdGlvbj8uc3RvcmFnZUtleTsgLy8gVXNlIHByb3ZpZGVkIElLZXlcblxuICAgIGNvbnN0IHBlcmZvcm1hbmNlSW5zaWdodHNLZXkgPVxuICAgICAgcGlFbmFibGVkICYmIGlzQ01LUmVxdWVzdGVkKHBpQ29uZmlnPy5lbmNyeXB0aW9uS2V5KVxuICAgICAgICA/IG5ldyBDdXN0b21lck1hbmFnZWRLZXkoXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVBlcmZvcm1hbmNlSW5zaWdodHNLZXlgLFxuICAgICAgICAgICAgeyBhbGlhc05hbWU6IGBjbWsvcmRzLyR7cHJvcHMuZGF0YWJhc2VOYW1lfS9JbnNpZ2h0c0tleWAgfVxuICAgICAgICAgICkua2V5XG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgY2x1c3RlclNlY3VyaXR5R3JvdXAgPSBuZXcgU2VjdXJpdHlHcm91cCh0aGlzLCBgJHtpZH1TZWN1cml0eUdyb3VwYCwge1xuICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICBkZXNjcmlwdGlvbjogYFNlY3VyaXR5IGdyb3VwIGZvciBBdXJvcmEgY2x1c3RlciAke3Byb3BzLmRhdGFiYXNlTmFtZX1gXG4gICAgfSk7XG5cbiAgICBjbHVzdGVyU2VjdXJpdHlHcm91cC5hZGRJbmdyZXNzUnVsZShcbiAgICAgIGNsdXN0ZXJTZWN1cml0eUdyb3VwLFxuICAgICAgUG9ydC50Y3AodGhpcy5wb3J0KVxuICAgICk7XG5cbiAgICB0aGlzLmNvbm5lY3Rpb25zID0gbmV3IENvbm5lY3Rpb25zKHtcbiAgICAgIHNlY3VyaXR5R3JvdXBzOiBbY2x1c3RlclNlY3VyaXR5R3JvdXBdLFxuICAgICAgZGVmYXVsdFBvcnQ6IFBvcnQudGNwKHRoaXMucG9ydClcbiAgICB9KTtcblxuICAgIGNvbnN0IHdyaXRlckNvbmZpZyA9IHByb3BzLndyaXRlciA/PyB7fTtcbiAgICBjb25zdCB3cml0ZXJQSSA9IHdyaXRlckNvbmZpZy5lbmFibGVQZXJmb3JtYW5jZUluc2lnaHRzID8/IHBpRW5hYmxlZDtcbiAgICBjb25zdCB3cml0ZXJTdWZmaXggPSB3cml0ZXJDb25maWcuaWRlbnRpZmllclN1ZmZpeCA/PyBcInByaW1hcnktd3JpdGVyXCI7XG4gICAgY29uc3QgcGVyZm9ybWFuY2VJbnNpZ2h0c1JldGVudGlvbiA9IHRoaXMuZ2V0UGVyZm9ybWFuY2VJbnNpZ2h0UmV0ZW50aW9uKFxuICAgICAgcGlDb25maWc/LnJldGVudGlvblBlcmlvZCA/PyA3XG4gICAgKTtcbiAgICBjb25zdCBkYXRhYmFzZU5hbWUgPSBwcm9wcy5kYXRhYmFzZU5hbWUgfHwgaWQ7XG5cbiAgICBjb25zdCB3cml0ZXIgPSBDbHVzdGVySW5zdGFuY2Uuc2VydmVybGVzc1YyKGAke2RhdGFiYXNlTmFtZX1Xcml0ZXJgLCB7XG4gICAgICBlbmFibGVQZXJmb3JtYW5jZUluc2lnaHRzOiB3cml0ZXJQSSxcbiAgICAgIHBlcmZvcm1hbmNlSW5zaWdodEVuY3J5cHRpb25LZXk6IHdyaXRlclBJXG4gICAgICAgID8gcGVyZm9ybWFuY2VJbnNpZ2h0c0tleVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIHBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvbjogd3JpdGVyUElcbiAgICAgICAgPyBwZXJmb3JtYW5jZUluc2lnaHRzUmV0ZW50aW9uXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgaW5zdGFuY2VJZGVudGlmaWVyOiBSZXNvdXJjZU5hbWluZy53cml0ZXJJbnN0YW5jZUlkKFxuICAgICAgICBkYXRhYmFzZU5hbWUsXG4gICAgICAgIHdyaXRlclN1ZmZpeFxuICAgICAgKSxcbiAgICAgIGNhQ2VydGlmaWNhdGU6IENhQ2VydGlmaWNhdGUuUkRTX0NBX1JTQTQwOTZfRzEsXG4gICAgICAuLi4od3JpdGVyQ29uZmlnLmF2YWlsYWJpbGl0eVpvbmUgJiYge1xuICAgICAgICBhdmFpbGFiaWxpdHlab25lOiB3cml0ZXJDb25maWcuYXZhaWxhYmlsaXR5Wm9uZVxuICAgICAgfSlcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlYWRlcnMgPSB0aGlzLmJ1aWxkUmVhZGVycyhcbiAgICAgIHByb3BzLFxuICAgICAgcGlFbmFibGVkLFxuICAgICAgcGVyZm9ybWFuY2VJbnNpZ2h0c0tleSxcbiAgICAgIHBlcmZvcm1hbmNlSW5zaWdodHNSZXRlbnRpb25cbiAgICApO1xuXG4gICAgY29uc3QgZW5naW5lID1cbiAgICAgIHByb3BzLmVuZ2luZSB8fFxuICAgICAgRGF0YWJhc2VDbHVzdGVyRW5naW5lLmF1cm9yYVBvc3RncmVzKHtcbiAgICAgICAgdmVyc2lvbjogQXVyb3JhUG9zdGdyZXNFbmdpbmVWZXJzaW9uLm9mKFwiMTYuNlwiLCBcIjE2XCIpXG4gICAgICB9KTtcblxuICAgIGNvbnN0IHBhcmFtZXRlckdyb3VwID0gbmV3IFBhcmFtZXRlckdyb3VwKFxuICAgICAgdGhpcyxcbiAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1QYXJhbWV0ZXJHcm91cGAsXG4gICAgICB7XG4gICAgICAgIGVuZ2luZSxcbiAgICAgICAgZGVzY3JpcHRpb246IGBQYXJhbWV0ZXIgZ3JvdXAgZm9yICR7cHJvcHMuZGF0YWJhc2VOYW1lfSB3aXRoIHNlY3VyaXR5IGRlZmF1bHRzYCxcbiAgICAgICAgcGFyYW1ldGVyczogdGhpcy5lbmdpbmVDb25maWcuc3NsUGFyYW1ldGVyc1xuICAgICAgfVxuICAgICk7XG5cbiAgICBjb25zdCBkYkNsdXN0ZXJQcm9wczogYW55ID0ge1xuICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICB2cGNTdWJuZXRzOiB7IHN1Ym5ldFR5cGU6IFN1Ym5ldFR5cGUuUFJJVkFURV9XSVRIX0VHUkVTUyB9LFxuICAgICAgc2VjdXJpdHlHcm91cHM6IFtjbHVzdGVyU2VjdXJpdHlHcm91cF0sXG4gICAgICBlbmdpbmUsXG4gICAgICBwYXJhbWV0ZXJHcm91cCxcbiAgICAgIGJhY2t1cDogeyByZXRlbnRpb246IER1cmF0aW9uLmRheXMocHJvcHMuYmFja3VwUmV0ZW50aW9uID8/IDE0KSB9LFxuICAgICAgc3RvcmFnZUVuY3J5cHRlZDogdHJ1ZSxcbiAgICAgIC4uLihzdG9yYWdlRW5jcnlwdGlvbktleSAmJiB7IHN0b3JhZ2VFbmNyeXB0aW9uS2V5IH0pLFxuICAgICAgY2x1c3RlcklkZW50aWZpZXI6XG4gICAgICAgIHByb3BzLmNsdXN0ZXJJZGVudGlmaWVyPy50b0xvd2VyQ2FzZSgpIHx8XG4gICAgICAgIFJlc291cmNlTmFtaW5nLmNsdXN0ZXJJZChwcm9wcy5kYXRhYmFzZU5hbWUgfHwgaWQpLFxuICAgICAgbW9uaXRvcmluZ0ludGVydmFsOiBwcm9wcy5tb25pdG9yaW5nSW50ZXJ2YWwgfHwgRHVyYXRpb24ubWludXRlcygxKSxcbiAgICAgIHByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93OlxuICAgICAgICBwcm9wcy5wcmVmZXJyZWRNYWludGVuYW5jZVdpbmRvdyB8fCBcIlNhdDoxMjozMC1TYXQ6MjA6MzBcIixcbiAgICAgIHBvcnQ6IHRoaXMucG9ydCxcbiAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuU05BUFNIT1QsXG4gICAgICBkZWxldGlvblByb3RlY3Rpb246IHRydWUsXG4gICAgICBpYW1BdXRoZW50aWNhdGlvbjogdHJ1ZSxcbiAgICAgIHdyaXRlcixcbiAgICAgIHJlYWRlcnNcbiAgICB9O1xuXG4gICAgaWYgKCFwcm9wcy5pc0dsb2JhbFNlY29uZGFyeSkge1xuICAgICAgZGJDbHVzdGVyUHJvcHMuY3JlZGVudGlhbHMgPSBDcmVkZW50aWFscy5mcm9tU2VjcmV0KFxuICAgICAgICB0aGlzLmRhdGFiYXNlQ3JlZGVudGlhbHMuc2VjcmV0XG4gICAgICApO1xuICAgICAgZGJDbHVzdGVyUHJvcHMuZGVmYXVsdERhdGFiYXNlTmFtZSA9XG4gICAgICAgIHByb3BzLmRhdGFiYXNlTmFtZSB8fCBgJHtpZC5yZXBsYWNlKFwiUmRzXCIsIFwiXCIpfWA7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLnNuYXBzaG90SWRlbnRpZmllcikge1xuICAgICAgLy8gQ3JlYXRlIGZyb20gc25hcHNob3RcbiAgICAgIGNvbnN0IHNuYXBzaG90UHJvcHMgPSB7XG4gICAgICAgIC4uLmRiQ2x1c3RlclByb3BzLFxuICAgICAgICBzbmFwc2hvdElkZW50aWZpZXI6IHByb3BzLnNuYXBzaG90SWRlbnRpZmllclxuICAgICAgfTtcblxuICAgICAgLy8gRm9yIHNuYXBzaG90cywgb3ZlcnJpZGUgY3JlZGVudGlhbHMgaWYgbm90IGEgZ2xvYmFsIHNlY29uZGFyeVxuICAgICAgaWYgKCFwcm9wcy5pc0dsb2JhbFNlY29uZGFyeSkge1xuICAgICAgICBzbmFwc2hvdFByb3BzLmNyZWRlbnRpYWxzID0gU25hcHNob3RDcmVkZW50aWFscy5mcm9tU2VjcmV0KFxuICAgICAgICAgIHRoaXMuZGF0YWJhc2VDcmVkZW50aWFscy5zZWNyZXRcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5kYXRhYmFzZUNsdXN0ZXIgPSBuZXcgRGF0YWJhc2VDbHVzdGVyRnJvbVNuYXBzaG90KFxuICAgICAgICB0aGlzLFxuICAgICAgICBgJHtpZH1EYXRhYmFzZWAsXG4gICAgICAgIHNuYXBzaG90UHJvcHNcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENyZWF0ZSBuZXcgY2x1c3RlclxuICAgICAgdGhpcy5kYXRhYmFzZUNsdXN0ZXIgPSBuZXcgRGF0YWJhc2VDbHVzdGVyKFxuICAgICAgICB0aGlzLFxuICAgICAgICBgJHtpZH1EYXRhYmFzZWAsXG4gICAgICAgIGRiQ2x1c3RlclByb3BzXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuY2ZuQ2x1c3RlciA9IHRoaXMuZGF0YWJhc2VDbHVzdGVyLm5vZGUuZGVmYXVsdENoaWxkIGFzIENmbkRCQ2x1c3RlcjtcblxuICAgIC8vIEdsb2JhbCBzZWNvbmRhcnkgY2x1c3RlcnMgY2FuJ3Qgc3BlY2lmeSB0aGVzZSBwcm9wZXJ0aWVzXG4gICAgaWYgKHByb3BzLmlzR2xvYmFsU2Vjb25kYXJ5ICYmIHRoaXMuY2ZuQ2x1c3Rlcikge1xuICAgICAgdGhpcy5jZm5DbHVzdGVyLm1hc3RlclVzZXJuYW1lID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5jZm5DbHVzdGVyLm1hc3RlclVzZXJQYXNzd29yZCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuY2ZuQ2x1c3Rlci5kYXRhYmFzZU5hbWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgcHJveHlFbmFibGVkID0gcHJvcHMucHJveHkgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5wcm94eSAhPT0gZmFsc2U7XG4gICAgaWYgKHByb3h5RW5hYmxlZCkge1xuICAgICAgdGhpcy5hZGRQcm94eShwcm9wcywgY2x1c3RlclNlY3VyaXR5R3JvdXApO1xuICAgIH1cblxuICAgIC8vIFNlY3JldCByb3RhdGlvbiBlbmFibGVkIGJ5IGRlZmF1bHQgKG9wdC1vdXQgd2l0aCBzZWNyZXRSb3RhdGlvbjogZmFsc2UpXG4gICAgaWYgKCFwcm9wcy5pc0dsb2JhbFNlY29uZGFyeSkge1xuICAgICAgY29uc3Qgc2VjcmV0Um90YXRpb25EaXNhYmxlZCA9XG4gICAgICAgIHByb3BzLmNyZWRlbnRpYWxzPy5zZWNyZXRSb3RhdGlvbiA9PT0gZmFsc2U7XG4gICAgICBpZiAoIXNlY3JldFJvdGF0aW9uRGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5hZGRTZWNyZXRSb3RhdGlvbihwcm9wcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFJlYWRlcnMoXG4gICAgcHJvcHM6IFJkc1Byb3BzLFxuICAgIGRlZmF1bHRQSUVuYWJsZWQ6IGJvb2xlYW4sXG4gICAgcGlLZXk/OiBhbnksXG4gICAgcGlSZXRlbnRpb24/OiBQZXJmb3JtYW5jZUluc2lnaHRSZXRlbnRpb25cbiAgKTogSUNsdXN0ZXJJbnN0YW5jZVtdIHtcbiAgICBpZiAocHJvcHMucmVhZGVycyA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBsZXQgcmVhZGVyQ29uZmlnczogQXVyb3JhUmVhZGVyQ29uZmlnW107XG4gICAgaWYgKHByb3BzLnJlYWRlcnM/Lmluc3RhbmNlcykge1xuICAgICAgcmVhZGVyQ29uZmlncyA9IHByb3BzLnJlYWRlcnMuaW5zdGFuY2VzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjb3VudCA9IHByb3BzLnJlYWRlcnM/LmNvdW50ID8/IDE7XG4gICAgICByZWFkZXJDb25maWdzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogY291bnQgfSwgKF8sIGkpID0+ICh7XG4gICAgICAgIHNjYWxlV2l0aFdyaXRlcjogaSA9PT0gMFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRQSSA9XG4gICAgICBwcm9wcy5yZWFkZXJzICYmIFwiZGVmYXVsdEVuYWJsZVBlcmZvcm1hbmNlSW5zaWdodHNcIiBpbiBwcm9wcy5yZWFkZXJzXG4gICAgICAgID8gKHByb3BzLnJlYWRlcnMuZGVmYXVsdEVuYWJsZVBlcmZvcm1hbmNlSW5zaWdodHMgPz8gZGVmYXVsdFBJRW5hYmxlZClcbiAgICAgICAgOiBkZWZhdWx0UElFbmFibGVkO1xuXG4gICAgcmV0dXJuIHJlYWRlckNvbmZpZ3MubWFwKChjb25maWcsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBlbmFibGVQSSA9IGNvbmZpZy5lbmFibGVQZXJmb3JtYW5jZUluc2lnaHRzID8/IGRlZmF1bHRQSTtcbiAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBjb25maWcuaWRlbnRpZmllclN1ZmZpeCA/PyBgcmVhZGVyLSR7aW5kZXggKyAxfWA7XG5cbiAgICAgIHJldHVybiBDbHVzdGVySW5zdGFuY2Uuc2VydmVybGVzc1YyKFxuICAgICAgICBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9UmVhZGVyJHtpbmRleCArIDF9YCxcbiAgICAgICAge1xuICAgICAgICAgIHNjYWxlV2l0aFdyaXRlcjogY29uZmlnLnNjYWxlV2l0aFdyaXRlciA/PyBpbmRleCA9PT0gMCxcbiAgICAgICAgICBlbmFibGVQZXJmb3JtYW5jZUluc2lnaHRzOiBlbmFibGVQSSxcbiAgICAgICAgICBwZXJmb3JtYW5jZUluc2lnaHRFbmNyeXB0aW9uS2V5OiBlbmFibGVQSSA/IHBpS2V5IDogdW5kZWZpbmVkLFxuICAgICAgICAgIHBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvbjogZW5hYmxlUEkgPyBwaVJldGVudGlvbiA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBpbnN0YW5jZUlkZW50aWZpZXI6IFJlc291cmNlTmFtaW5nLnJlYWRlckluc3RhbmNlSWQoXG4gICAgICAgICAgICBwcm9wcy5kYXRhYmFzZU5hbWUhLFxuICAgICAgICAgICAgaW5kZXggKyAxLFxuICAgICAgICAgICAgY29uZmlnLmlkZW50aWZpZXJTdWZmaXhcbiAgICAgICAgICApLFxuICAgICAgICAgIGNhQ2VydGlmaWNhdGU6IENhQ2VydGlmaWNhdGUuUkRTX0NBX1JTQTQwOTZfRzEsXG4gICAgICAgICAgLi4uKGNvbmZpZy5hdmFpbGFiaWxpdHlab25lICYmIHtcbiAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmU6IGNvbmZpZy5hdmFpbGFiaWxpdHlab25lXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUHJveHkocHJvcHM6IFJkc1Byb3BzLCBzZWN1cml0eUdyb3VwOiBTZWN1cml0eUdyb3VwKTogdm9pZCB7XG4gICAgY29uc3QgcHJveHlDb25maWcgPSBwcm9wcy5wcm94eSBhcyBQcm94eUNvbmZpZztcbiAgICBjb25zdCB2cGNTdWJuZXRzID0gcHJveHlDb25maWcudnBjU3VibmV0cyA/PyB7XG4gICAgICBzdWJuZXRUeXBlOiBTdWJuZXRUeXBlLlBSSVZBVEVfV0lUSF9FR1JFU1NcbiAgICB9O1xuXG4gICAgdGhpcy5kYXRhYmFzZVByb3h5ID0gbmV3IERhdGFiYXNlUHJveHkoXG4gICAgICB0aGlzLFxuICAgICAgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfURhdGFiYXNlUHJveHlgLFxuICAgICAge1xuICAgICAgICBkYlByb3h5TmFtZTogUmVzb3VyY2VOYW1pbmcucHJveHlOYW1lKHByb3BzLmRhdGFiYXNlTmFtZSEpLFxuICAgICAgICBwcm94eVRhcmdldDogUHJveHlUYXJnZXQuZnJvbUNsdXN0ZXIodGhpcy5kYXRhYmFzZUNsdXN0ZXIpLFxuICAgICAgICBzZWNyZXRzOiBbdGhpcy5kYXRhYmFzZUNyZWRlbnRpYWxzLnNlY3JldF0sXG4gICAgICAgIHNlY3VyaXR5R3JvdXBzOiBbc2VjdXJpdHlHcm91cF0sXG4gICAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgICB2cGNTdWJuZXRzLFxuICAgICAgICByZXF1aXJlVExTOiBwcm94eUNvbmZpZy5yZXF1aXJlVExTID8/IHRydWUsXG4gICAgICAgIGJvcnJvd1RpbWVvdXQ6IHByb3h5Q29uZmlnLmNvbm5lY3Rpb25Cb3Jyb3dUaW1lb3V0XG4gICAgICAgICAgPyBEdXJhdGlvbi5zZWNvbmRzKHByb3h5Q29uZmlnLmNvbm5lY3Rpb25Cb3Jyb3dUaW1lb3V0KVxuICAgICAgICAgIDogRHVyYXRpb24uc2Vjb25kcygxMjApLFxuICAgICAgICBtYXhDb25uZWN0aW9uc1BlcmNlbnQ6IHByb3h5Q29uZmlnLm1heENvbm5lY3Rpb25zLFxuICAgICAgICBtYXhJZGxlQ29ubmVjdGlvbnNQZXJjZW50OiBwcm94eUNvbmZpZy5tYXhJZGxlQ29ubmVjdGlvbnNcbiAgICAgIH1cbiAgICApO1xuXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9UHJveHlFbmRwb2ludE91dHB1dGAsIHtcbiAgICAgIGtleTogYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVByb3h5RW5kcG9pbnRgLFxuICAgICAgZXhwb3J0TmFtZTogYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVByb3h5RW5kcG9pbnRgLFxuICAgICAgdmFsdWU6IHRoaXMuZGF0YWJhc2VQcm94eS5lbmRwb2ludFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRTZWNyZXRSb3RhdGlvbihwcm9wczogUmRzUHJvcHMpOiB2b2lkIHtcbiAgICBjb25zdCByb3RhdGlvbkNvbmZpZyA9IHByb3BzLmNyZWRlbnRpYWxzPy5zZWNyZXRSb3RhdGlvbjtcbiAgICBjb25zdCByb3RhdGlvblBlcmlvZCA9XG4gICAgICAodHlwZW9mIHJvdGF0aW9uQ29uZmlnID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgIHJvdGF0aW9uQ29uZmlnPy5hdXRvbWF0aWNhbGx5QWZ0ZXIpIHx8XG4gICAgICBEdXJhdGlvbi5kYXlzKDMwKTtcblxuICAgIGNvbnN0IG1hc3RlclNlY3JldCA9IG5ldyBTZWNyZXQodGhpcywgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfU1hc3RlclNlY3JldGAsIHtcbiAgICAgIHNlY3JldE5hbWU6IGAke3Byb3BzLmRhdGFiYXNlTmFtZX1NYXN0ZXJTZWNyZXRgXG4gICAgfSk7XG5cbiAgICBuZXcgU2VjcmV0Um90YXRpb24odGhpcywgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVNlY3JldFJvdGF0aW9uYCwge1xuICAgICAgYXBwbGljYXRpb246IG5ldyBTZWNyZXRSb3RhdGlvbkFwcGxpY2F0aW9uKFxuICAgICAgICB0aGlzLmVuZ2luZUNvbmZpZy5yb3RhdGlvbkFwcE5hbWUsXG4gICAgICAgIFwiMS4xLjM2N1wiLFxuICAgICAgICB7IGlzTXVsdGlVc2VyOiB0cnVlIH1cbiAgICAgICksXG4gICAgICBzZWNyZXQ6IHRoaXMuZGF0YWJhc2VDcmVkZW50aWFscy5zZWNyZXQsXG4gICAgICBtYXN0ZXJTZWNyZXQ6IG1hc3RlclNlY3JldC5zZWNyZXQsXG4gICAgICB0YXJnZXQ6IHRoaXMuZGF0YWJhc2VDbHVzdGVyLFxuICAgICAgdnBjOiB0aGlzLmRhdGFiYXNlQ2x1c3Rlci52cGMsXG4gICAgICBhdXRvbWF0aWNhbGx5QWZ0ZXI6IHJvdGF0aW9uUGVyaW9kXG4gICAgfSk7XG4gIH1cblxuICBnZXRIb3N0RW5kcG9pbnQoKTogc3RyaW5nIHtcbiAgICAvLyBSZXR1cm4gcHJveHkgZW5kcG9pbnQgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgY2x1c3RlciBlbmRwb2ludFxuICAgIGlmICh0aGlzLmRhdGFiYXNlUHJveHkpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlUHJveHkuZW5kcG9pbnQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRhdGFiYXNlQ2x1c3Rlci5jbHVzdGVyRW5kcG9pbnQuaG9zdG5hbWU7XG4gIH1cblxuICBnZXRIb3N0UG9ydCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTdHJpbmcodGhpcy5wb3J0KTtcbiAgfVxuXG4gIGdldENyZWRlbnRpYWxzKCk6IFNlY3JldCB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YWJhc2VDcmVkZW50aWFscztcbiAgfVxuXG4gIGdldENmbkNsdXN0ZXIoKTogQ2ZuREJDbHVzdGVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jZm5DbHVzdGVyO1xuICB9XG5cbiAgZ2V0RGF0YWJhc2VDbHVzdGVyKCk6IERhdGFiYXNlQ2x1c3RlciB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YWJhc2VDbHVzdGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQZXJmb3JtYW5jZUluc2lnaHRSZXRlbnRpb24oXG4gICAgZGF5cz86IG51bWJlclxuICApOiBQZXJmb3JtYW5jZUluc2lnaHRSZXRlbnRpb24ge1xuICAgIHN3aXRjaCAoZGF5cykge1xuICAgICAgY2FzZSA3OlxuICAgICAgICByZXR1cm4gUGVyZm9ybWFuY2VJbnNpZ2h0UmV0ZW50aW9uLkRFRkFVTFQ7XG4gICAgICBjYXNlIDMxOlxuICAgICAgICByZXR1cm4gUGVyZm9ybWFuY2VJbnNpZ2h0UmV0ZW50aW9uLk1PTlRIU18xO1xuICAgICAgY2FzZSA5MzpcbiAgICAgICAgcmV0dXJuIFBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvbi5NT05USFNfMztcbiAgICAgIGNhc2UgMTg2OlxuICAgICAgICByZXR1cm4gUGVyZm9ybWFuY2VJbnNpZ2h0UmV0ZW50aW9uLk1PTlRIU182O1xuICAgICAgY2FzZSAzNzI6XG4gICAgICAgIHJldHVybiBQZXJmb3JtYW5jZUluc2lnaHRSZXRlbnRpb24uTU9OVEhTXzEyO1xuICAgICAgY2FzZSA3MzE6XG4gICAgICAgIHJldHVybiBQZXJmb3JtYW5jZUluc2lnaHRSZXRlbnRpb24uTE9OR19URVJNO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvbi5NT05USFNfMTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,16 +1,51 @@
|
|
|
1
|
+
import { type Duration } from "aws-cdk-lib";
|
|
1
2
|
import { Construct } from "constructs";
|
|
2
|
-
import { IVpc, Connections, IConnectable } from "aws-cdk-lib/aws-ec2";
|
|
3
|
-
import { IClusterEngine } from "aws-cdk-lib/aws-rds";
|
|
4
|
-
import { Secret } from "../secrets";
|
|
3
|
+
import { type IVpc, type Connections, type IConnectable } from "aws-cdk-lib/aws-ec2";
|
|
4
|
+
import { type IClusterEngine } from "aws-cdk-lib/aws-rds";
|
|
5
|
+
import { type Secret } from "../secrets";
|
|
6
|
+
import { type EngineConfig, type ProxyConfig, type CredentialsConfig, type AuroraEncryptionConfig, type AuroraWriterConfig, type AuroraReadersConfig, type PerformanceInsightsConfig } from "../../../patterns/aws/database";
|
|
5
7
|
interface RdsAuroraGlobalProps {
|
|
6
8
|
vpc: IVpc;
|
|
7
9
|
databaseName: string;
|
|
8
|
-
/**
|
|
10
|
+
/** Primary region where the initial cluster & global cluster resource are created */
|
|
9
11
|
primaryRegion: string;
|
|
10
|
-
/**
|
|
12
|
+
/** Secondary regions where Aurora clusters will be deployed (for secret replication) */
|
|
13
|
+
secondaryRegions?: string[];
|
|
14
|
+
/** Optional deterministic id for the global cluster (should be shared across stacks/regions) */
|
|
11
15
|
globalClusterIdentifier?: string;
|
|
12
|
-
/**
|
|
16
|
+
/** Optional engine to forward to the underlying cluster */
|
|
13
17
|
engine?: IClusterEngine;
|
|
18
|
+
/** Engine-specific configuration (username, SSL params, rotation app) */
|
|
19
|
+
engineConfig?: EngineConfig;
|
|
20
|
+
/** Enable write forwarding on secondary clusters to forward writes to primary region */
|
|
21
|
+
enableGlobalWriteForwarding?: boolean;
|
|
22
|
+
/** Writer instance configuration */
|
|
23
|
+
writer?: AuroraWriterConfig;
|
|
24
|
+
/**
|
|
25
|
+
* Reader instances configuration.
|
|
26
|
+
* - `{ count: N }` - Simple: N readers with defaults
|
|
27
|
+
* - `{ instances: [...] }` - Advanced: per-reader config
|
|
28
|
+
* - `false` - Explicitly disable readers (writer-only cluster)
|
|
29
|
+
* - Omit - Default: 1 reader
|
|
30
|
+
*/
|
|
31
|
+
readers?: AuroraReadersConfig | false;
|
|
32
|
+
/** RDS Proxy configuration. Omit = no proxy, {} = defaults, false = disabled */
|
|
33
|
+
proxy?: ProxyConfig | false;
|
|
34
|
+
/** Credentials configuration including username and secret rotation */
|
|
35
|
+
credentials?: CredentialsConfig;
|
|
36
|
+
/** Encryption configuration */
|
|
37
|
+
encryption?: AuroraEncryptionConfig;
|
|
38
|
+
/** Backup retention in days. Default: 14 */
|
|
39
|
+
backupRetention?: number;
|
|
40
|
+
/** CloudWatch monitoring interval. Default: 1 minute */
|
|
41
|
+
monitoringInterval?: Duration;
|
|
42
|
+
/** Preferred maintenance window. Default: "Sat:12:30-Sat:20:30" */
|
|
43
|
+
preferredMaintenanceWindow?: string;
|
|
44
|
+
/** Database port. Default: 35255 (FJALL on phone keypad) */
|
|
45
|
+
port?: number;
|
|
46
|
+
performanceInsights?: PerformanceInsightsConfig | false;
|
|
47
|
+
/** ARN or identifier of DB cluster snapshot to restore from */
|
|
48
|
+
snapshotIdentifier?: string;
|
|
14
49
|
}
|
|
15
50
|
export declare class RdsAuroraGlobal extends Construct implements IConnectable {
|
|
16
51
|
connections: Connections;
|