@fjall/components-infrastructure 0.89.5 → 0.89.6
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/LICENSE +50 -21
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -18
- package/dist/lib/app.d.ts +12 -12
- package/dist/lib/app.js +61 -56
- package/dist/lib/aspects/index.d.ts +1 -1
- package/dist/lib/aspects/index.js +1 -6
- package/dist/lib/aspects/resourceInventory.js +6 -13
- package/dist/lib/config/audit.js +1 -5
- package/dist/lib/config/aws/accessAnalyser.d.ts +11 -0
- package/dist/lib/config/aws/accessAnalyser.js +17 -0
- package/dist/lib/config/aws/accountAuditRole.js +11 -15
- package/dist/lib/config/aws/accountMonitoringRole.js +25 -29
- package/dist/lib/config/aws/alarmTopic.d.ts +8 -0
- package/dist/lib/config/aws/alarmTopic.js +19 -0
- package/dist/lib/config/aws/cloudTrail.js +4 -9
- package/dist/lib/config/aws/configRecorder.d.ts +16 -0
- package/dist/lib/config/aws/configRecorder.js +51 -0
- package/dist/lib/config/aws/configRulePreset.d.ts +13 -0
- package/dist/lib/config/aws/configRulePreset.js +62 -0
- package/dist/lib/config/aws/disasterRecovery.d.ts +1 -1
- package/dist/lib/config/aws/disasterRecovery.js +56 -73
- package/dist/lib/config/aws/ebsDefaultEncryption.d.ts +8 -0
- package/dist/lib/config/aws/ebsDefaultEncryption.js +41 -0
- package/dist/lib/config/aws/ecrDefaultImage.js +25 -30
- package/dist/lib/config/aws/eventBus.js +8 -11
- package/dist/lib/config/aws/guardDutyDetector.d.ts +16 -0
- package/dist/lib/config/aws/guardDutyDetector.js +26 -0
- package/dist/lib/config/aws/identityCenter.d.ts +1 -1
- package/dist/lib/config/aws/identityCenter.js +23 -25
- package/dist/lib/config/aws/identityCenterGroupMembership.js +18 -22
- package/dist/lib/config/aws/index.d.ts +19 -8
- package/dist/lib/config/aws/index.js +19 -25
- package/dist/lib/config/aws/inspectorEnablement.d.ts +9 -0
- package/dist/lib/config/aws/inspectorEnablement.js +51 -0
- package/dist/lib/config/aws/ipam.js +9 -13
- package/dist/lib/config/aws/oidcConnector.js +8 -12
- package/dist/lib/config/aws/platform.js +1 -5
- package/dist/lib/config/aws/s3BlockPublicAccess.d.ts +9 -0
- package/dist/lib/config/aws/s3BlockPublicAccess.js +55 -0
- package/dist/lib/config/aws/scpPreset.d.ts +21 -0
- package/dist/lib/config/aws/scpPreset.js +311 -0
- package/dist/lib/config/aws/securityBaseline.d.ts +15 -0
- package/dist/lib/config/aws/securityBaseline.js +27 -0
- package/dist/lib/config/aws/securityHubHub.d.ts +15 -0
- package/dist/lib/config/aws/securityHubHub.js +28 -0
- package/dist/lib/config/aws/securityServicesAdmin.d.ts +20 -0
- package/dist/lib/config/aws/securityServicesAdmin.js +115 -0
- package/dist/lib/config/index.d.ts +2 -2
- package/dist/lib/config/index.js +2 -21
- package/dist/lib/index.d.ts +4 -4
- package/dist/lib/index.js +5 -26
- package/dist/lib/patterns/aws/account.d.ts +17 -1
- package/dist/lib/patterns/aws/account.js +60 -33
- package/dist/lib/patterns/aws/apexDomainPattern.d.ts +26 -0
- package/dist/lib/patterns/aws/apexDomainPattern.js +91 -0
- package/dist/lib/patterns/aws/auditRole.js +13 -16
- package/dist/lib/patterns/aws/buildkite.d.ts +1 -1
- package/dist/lib/patterns/aws/buildkite.js +70 -75
- package/dist/lib/patterns/aws/cdn.d.ts +5 -5
- package/dist/lib/patterns/aws/cdn.js +22 -28
- package/dist/lib/patterns/aws/compute.d.ts +1 -1
- package/dist/lib/patterns/aws/compute.js +31 -44
- package/dist/lib/patterns/aws/computeEc2.d.ts +1 -1
- package/dist/lib/patterns/aws/computeEc2.js +11 -14
- package/dist/lib/patterns/aws/computeEcs.d.ts +18 -2
- package/dist/lib/patterns/aws/computeEcs.js +41 -31
- package/dist/lib/patterns/aws/computeLambda.d.ts +2 -2
- package/dist/lib/patterns/aws/computeLambda.js +24 -31
- package/dist/lib/patterns/aws/database.d.ts +16 -7
- package/dist/lib/patterns/aws/database.js +81 -73
- package/dist/lib/patterns/aws/delegatedDomainPattern.d.ts +17 -0
- package/dist/lib/patterns/aws/delegatedDomainPattern.js +54 -0
- package/dist/lib/patterns/aws/dnsRecordComposer.d.ts +25 -0
- package/dist/lib/patterns/aws/dnsRecordComposer.js +225 -0
- package/dist/lib/patterns/aws/domain.d.ts +32 -0
- package/dist/lib/patterns/aws/domain.js +115 -0
- package/dist/lib/patterns/aws/domainDelegation.d.ts +3 -3
- package/dist/lib/patterns/aws/domainDelegation.js +28 -37
- package/dist/lib/patterns/aws/domainFactory.d.ts +20 -5
- package/dist/lib/patterns/aws/domainFactory.js +48 -10
- package/dist/lib/patterns/aws/domainValidation.d.ts +11 -0
- package/dist/lib/patterns/aws/domainValidation.js +145 -0
- package/dist/lib/patterns/aws/externalRecordsPattern.d.ts +18 -0
- package/dist/lib/patterns/aws/externalRecordsPattern.js +141 -0
- package/dist/lib/patterns/aws/fivetranProxy.d.ts +1 -1
- package/dist/lib/patterns/aws/fivetranProxy.js +6 -11
- package/dist/lib/patterns/aws/index.d.ts +21 -19
- package/dist/lib/patterns/aws/index.js +25 -36
- package/dist/lib/patterns/aws/interfaces/cdn.js +1 -5
- package/dist/lib/patterns/aws/interfaces/compute.js +4 -11
- package/dist/lib/patterns/aws/interfaces/connector.js +1 -15
- package/dist/lib/patterns/aws/interfaces/database.d.ts +1 -1
- package/dist/lib/patterns/aws/interfaces/database.js +6 -15
- package/dist/lib/patterns/aws/interfaces/domain.d.ts +80 -2
- package/dist/lib/patterns/aws/interfaces/domain.js +1 -6
- package/dist/lib/patterns/aws/interfaces/index.js +8 -41
- package/dist/lib/patterns/aws/interfaces/messaging.js +4 -11
- package/dist/lib/patterns/aws/interfaces/organisation.d.ts +1 -1
- package/dist/lib/patterns/aws/interfaces/organisation.js +4 -11
- package/dist/lib/patterns/aws/interfaces/pattern.js +2 -7
- package/dist/lib/patterns/aws/interfaces/storage.js +1 -5
- package/dist/lib/patterns/aws/managedIdentityCenter.js +7 -12
- package/dist/lib/patterns/aws/messaging.d.ts +7 -7
- package/dist/lib/patterns/aws/messaging.js +22 -33
- package/dist/lib/patterns/aws/network.d.ts +2 -2
- package/dist/lib/patterns/aws/network.js +9 -14
- package/dist/lib/patterns/aws/organisation.d.ts +6 -2
- package/dist/lib/patterns/aws/organisation.js +34 -35
- package/dist/lib/patterns/aws/organisationFactory.d.ts +3 -3
- package/dist/lib/patterns/aws/organisationFactory.js +7 -12
- package/dist/lib/patterns/aws/pattern.js +6 -12
- package/dist/lib/patterns/aws/payload.js +73 -63
- package/dist/lib/patterns/aws/platform.d.ts +6 -3
- package/dist/lib/patterns/aws/platform.js +15 -15
- package/dist/lib/patterns/aws/storage.d.ts +6 -4
- package/dist/lib/patterns/aws/storage.js +35 -40
- package/dist/lib/patterns/aws/subdomainHostedZone.js +11 -16
- package/dist/lib/patterns/aws/targets/fjallTargets.d.ts +37 -0
- package/dist/lib/patterns/aws/targets/fjallTargets.js +66 -0
- package/dist/lib/patterns/aws/targets/index.d.ts +2 -0
- package/dist/lib/patterns/aws/targets/index.js +2 -0
- package/dist/lib/patterns/aws/targets/targetResolution.d.ts +76 -0
- package/dist/lib/patterns/aws/targets/targetResolution.js +119 -0
- package/dist/lib/patterns/index.d.ts +1 -0
- package/dist/lib/patterns/index.js +1 -0
- package/dist/lib/resources/aws/analytics/clickhouse.d.ts +15 -0
- package/dist/lib/resources/aws/analytics/clickhouse.js +292 -0
- package/dist/lib/resources/aws/analytics/clickhouseConstants.d.ts +73 -0
- package/dist/lib/resources/aws/analytics/clickhouseConstants.js +87 -0
- package/dist/lib/resources/aws/analytics/clickhouseSecurityGroup.d.ts +13 -0
- package/dist/lib/resources/aws/analytics/clickhouseSecurityGroup.js +28 -0
- package/dist/lib/resources/aws/analytics/clickhouseTypes.d.ts +47 -0
- package/dist/lib/resources/aws/analytics/clickhouseTypes.js +1 -0
- package/dist/lib/resources/aws/analytics/clickhouseUserData.d.ts +5 -0
- package/dist/lib/resources/aws/analytics/clickhouseUserData.js +248 -0
- package/dist/lib/resources/aws/analytics/index.d.ts +2 -0
- package/dist/lib/resources/aws/analytics/index.js +1 -0
- package/dist/lib/resources/aws/audit/auditRole.js +10 -15
- package/dist/lib/resources/aws/audit/index.d.ts +1 -1
- package/dist/lib/resources/aws/audit/index.js +1 -6
- package/dist/lib/resources/aws/backup/backupPlan.d.ts +1 -1
- package/dist/lib/resources/aws/backup/backupPlan.js +14 -16
- package/dist/lib/resources/aws/backup/backupVault.d.ts +1 -1
- package/dist/lib/resources/aws/backup/backupVault.js +13 -15
- package/dist/lib/resources/aws/backup/index.d.ts +2 -2
- package/dist/lib/resources/aws/backup/index.js +2 -19
- package/dist/lib/resources/aws/base/awsStack.js +17 -19
- package/dist/lib/resources/aws/base/index.d.ts +1 -1
- package/dist/lib/resources/aws/base/index.js +1 -18
- package/dist/lib/resources/aws/cdn/cloudFront.js +40 -42
- package/dist/lib/resources/aws/cdn/index.d.ts +1 -1
- package/dist/lib/resources/aws/cdn/index.js +1 -18
- package/dist/lib/resources/aws/compute/ec2.js +39 -39
- package/dist/lib/resources/aws/compute/ecs.d.ts +18 -396
- package/dist/lib/resources/aws/compute/ecs.js +105 -976
- package/dist/lib/resources/aws/compute/ecsCapacityProviderAspect.d.ts +22 -0
- package/dist/lib/resources/aws/compute/ecsCapacityProviderAspect.js +35 -0
- package/dist/lib/resources/aws/compute/ecsConstants.d.ts +20 -0
- package/dist/lib/resources/aws/compute/ecsConstants.js +49 -0
- package/dist/lib/resources/aws/compute/ecsContext.d.ts +12 -0
- package/dist/lib/resources/aws/compute/ecsContext.js +1 -0
- package/dist/lib/resources/aws/compute/ecsImages.d.ts +4 -0
- package/dist/lib/resources/aws/compute/ecsImages.js +35 -0
- package/dist/lib/resources/aws/compute/ecsNetworking.d.ts +28 -0
- package/dist/lib/resources/aws/compute/ecsNetworking.js +290 -0
- package/dist/lib/resources/aws/compute/ecsRoles.d.ts +15 -0
- package/dist/lib/resources/aws/compute/ecsRoles.js +110 -0
- package/dist/lib/resources/aws/compute/ecsServiceFactory.d.ts +33 -0
- package/dist/lib/resources/aws/compute/ecsServiceFactory.js +183 -0
- package/dist/lib/resources/aws/compute/ecsTaskDefinition.d.ts +30 -0
- package/dist/lib/resources/aws/compute/ecsTaskDefinition.js +168 -0
- package/dist/lib/resources/aws/compute/ecsTypes.d.ts +337 -0
- package/dist/lib/resources/aws/compute/ecsTypes.js +10 -0
- package/dist/lib/resources/aws/compute/ecsValidation.d.ts +18 -0
- package/dist/lib/resources/aws/compute/ecsValidation.js +72 -0
- package/dist/lib/resources/aws/compute/index.d.ts +3 -3
- package/dist/lib/resources/aws/compute/index.js +3 -20
- package/dist/lib/resources/aws/compute/lambda.d.ts +10 -2
- package/dist/lib/resources/aws/compute/lambda.js +81 -71
- package/dist/lib/resources/aws/database/dynamodb.js +24 -27
- package/dist/lib/resources/aws/database/index.d.ts +7 -7
- package/dist/lib/resources/aws/database/index.js +14 -33
- package/dist/lib/resources/aws/database/rdsAurora.d.ts +10 -2
- package/dist/lib/resources/aws/database/rdsAurora.js +76 -61
- package/dist/lib/resources/aws/database/rdsAuroraGlobal.d.ts +2 -2
- package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +24 -21
- package/dist/lib/resources/aws/database/rdsDefaults.js +3 -7
- package/dist/lib/resources/aws/database/rdsHelpers.d.ts +2 -2
- package/dist/lib/resources/aws/database/rdsHelpers.js +21 -29
- package/dist/lib/resources/aws/database/rdsInstance.d.ts +11 -3
- package/dist/lib/resources/aws/database/rdsInstance.js +101 -83
- package/dist/lib/resources/aws/database/rdsProxyOutput.js +5 -9
- package/dist/lib/resources/aws/iam/delegationRole.d.ts +18 -0
- package/dist/lib/resources/aws/iam/delegationRole.js +60 -0
- package/dist/lib/resources/aws/iam/identityCenter/assignment.js +4 -9
- package/dist/lib/resources/aws/iam/identityCenter/group.js +5 -9
- package/dist/lib/resources/aws/iam/identityCenter/index.d.ts +3 -3
- package/dist/lib/resources/aws/iam/identityCenter/index.js +3 -20
- package/dist/lib/resources/aws/iam/identityCenter/permissionSet.d.ts +1 -1
- package/dist/lib/resources/aws/iam/identityCenter/permissionSet.js +5 -9
- package/dist/lib/resources/aws/iam/index.d.ts +5 -4
- package/dist/lib/resources/aws/iam/index.js +5 -21
- package/dist/lib/resources/aws/iam/instanceProfile.js +2 -7
- package/dist/lib/resources/aws/iam/managedPolicy.js +2 -7
- package/dist/lib/resources/aws/iam/policy.js +2 -7
- package/dist/lib/resources/aws/iam/role.js +2 -7
- package/dist/lib/resources/aws/index.d.ts +7 -7
- package/dist/lib/resources/aws/index.js +7 -24
- package/dist/lib/resources/aws/logging/cloudTrail.d.ts +1 -1
- package/dist/lib/resources/aws/logging/cloudTrail.js +18 -22
- package/dist/lib/resources/aws/logging/index.d.ts +2 -2
- package/dist/lib/resources/aws/logging/index.js +2 -19
- package/dist/lib/resources/aws/logging/logGroup.js +4 -10
- package/dist/lib/resources/aws/messaging/eventbridge.js +11 -14
- package/dist/lib/resources/aws/messaging/index.d.ts +4 -4
- package/dist/lib/resources/aws/messaging/index.js +4 -21
- package/dist/lib/resources/aws/messaging/sns.js +11 -14
- package/dist/lib/resources/aws/messaging/sqs.js +32 -34
- package/dist/lib/resources/aws/messaging/utils.d.ts +1 -1
- package/dist/lib/resources/aws/messaging/utils.js +1 -6
- package/dist/lib/resources/aws/monitoring/alarmDefaults.d.ts +36 -0
- package/dist/lib/resources/aws/monitoring/alarmDefaults.js +34 -0
- package/dist/lib/resources/aws/monitoring/ecsAlarms.d.ts +21 -0
- package/dist/lib/resources/aws/monitoring/ecsAlarms.js +88 -0
- package/dist/lib/resources/aws/monitoring/index.d.ts +4 -0
- package/dist/lib/resources/aws/monitoring/index.js +4 -5
- package/dist/lib/resources/aws/monitoring/lambdaAlarms.d.ts +18 -0
- package/dist/lib/resources/aws/monitoring/lambdaAlarms.js +44 -0
- package/dist/lib/resources/aws/monitoring/rdsAlarms.d.ts +20 -0
- package/dist/lib/resources/aws/monitoring/rdsAlarms.js +52 -0
- package/dist/lib/resources/aws/networking/crossAccountDelegationRecord.d.ts +17 -0
- package/dist/lib/resources/aws/networking/crossAccountDelegationRecord.js +26 -0
- package/dist/lib/resources/aws/networking/dnsRecord/aRecord.d.ts +12 -0
- package/dist/lib/resources/aws/networking/dnsRecord/aRecord.js +21 -0
- package/dist/lib/resources/aws/networking/dnsRecord/aaaaRecord.d.ts +12 -0
- package/dist/lib/resources/aws/networking/dnsRecord/aaaaRecord.js +22 -0
- package/dist/lib/resources/aws/networking/dnsRecord/aliasRecord.d.ts +12 -0
- package/dist/lib/resources/aws/networking/dnsRecord/aliasRecord.js +23 -0
- package/dist/lib/resources/aws/networking/dnsRecord/caaRecord.d.ts +17 -0
- package/dist/lib/resources/aws/networking/dnsRecord/caaRecord.js +21 -0
- package/dist/lib/resources/aws/networking/dnsRecord/cnameRecord.d.ts +12 -0
- package/dist/lib/resources/aws/networking/dnsRecord/cnameRecord.js +22 -0
- package/dist/lib/resources/aws/networking/dnsRecord/dnsRecordBase.d.ts +17 -0
- package/dist/lib/resources/aws/networking/dnsRecord/dnsRecordBase.js +17 -0
- package/dist/lib/resources/aws/networking/dnsRecord/index.d.ts +10 -0
- package/dist/lib/resources/aws/networking/dnsRecord/index.js +10 -0
- package/dist/lib/resources/aws/networking/dnsRecord/mxRecord.d.ts +16 -0
- package/dist/lib/resources/aws/networking/dnsRecord/mxRecord.js +21 -0
- package/dist/lib/resources/aws/networking/dnsRecord/nsRecord.d.ts +12 -0
- package/dist/lib/resources/aws/networking/dnsRecord/nsRecord.js +21 -0
- package/dist/lib/resources/aws/networking/dnsRecord/srvRecord.d.ts +18 -0
- package/dist/lib/resources/aws/networking/dnsRecord/srvRecord.js +21 -0
- package/dist/lib/resources/aws/networking/dnsRecord/txtRecord.d.ts +12 -0
- package/dist/lib/resources/aws/networking/dnsRecord/txtRecord.js +21 -0
- package/dist/lib/resources/aws/networking/domain.d.ts +1 -1
- package/dist/lib/resources/aws/networking/domain.js +32 -34
- package/dist/lib/resources/aws/networking/domainCertificate.d.ts +8 -3
- package/dist/lib/resources/aws/networking/domainCertificate.js +22 -16
- package/dist/lib/resources/aws/networking/hostedZone.d.ts +23 -19
- package/dist/lib/resources/aws/networking/hostedZone.js +70 -134
- package/dist/lib/resources/aws/networking/index.d.ts +8 -7
- package/dist/lib/resources/aws/networking/index.js +8 -24
- package/dist/lib/resources/aws/networking/ipam.js +2 -7
- package/dist/lib/resources/aws/networking/ipamPool.d.ts +1 -1
- package/dist/lib/resources/aws/networking/ipamPool.js +45 -55
- package/dist/lib/resources/aws/networking/securityGroup.js +2 -7
- package/dist/lib/resources/aws/networking/vpc.d.ts +1 -1
- package/dist/lib/resources/aws/networking/vpc.js +17 -21
- package/dist/lib/resources/aws/organisation/costAllocationTagActivator.d.ts +1 -1
- package/dist/lib/resources/aws/organisation/costAllocationTagActivator.js +11 -15
- package/dist/lib/resources/aws/organisation/index.d.ts +5 -5
- package/dist/lib/resources/aws/organisation/index.js +4 -12
- package/dist/lib/resources/aws/organisation/organisation.js +5 -7
- package/dist/lib/resources/aws/organisation/organisationAccount.js +7 -10
- package/dist/lib/resources/aws/organisation/organisationPolicy.js +5 -9
- package/dist/lib/resources/aws/organisation/organisationalUnit.js +1 -3
- package/dist/lib/resources/aws/secrets/alias.js +2 -7
- package/dist/lib/resources/aws/secrets/index.d.ts +4 -4
- package/dist/lib/resources/aws/secrets/index.js +4 -21
- package/dist/lib/resources/aws/secrets/kms.js +15 -18
- package/dist/lib/resources/aws/secrets/parameter.d.ts +3 -3
- package/dist/lib/resources/aws/secrets/parameter.js +19 -22
- package/dist/lib/resources/aws/secrets/secret.d.ts +2 -2
- package/dist/lib/resources/aws/secrets/secret.js +12 -14
- package/dist/lib/resources/aws/storage/ecr.d.ts +2 -2
- package/dist/lib/resources/aws/storage/ecr.js +7 -13
- package/dist/lib/resources/aws/storage/index.d.ts +2 -2
- package/dist/lib/resources/aws/storage/index.js +2 -19
- package/dist/lib/resources/aws/storage/s3.d.ts +1 -1
- package/dist/lib/resources/aws/storage/s3.js +24 -12
- package/dist/lib/resources/aws/utilities/awsCustomResource.js +3 -7
- package/dist/lib/resources/aws/utilities/codeBuild.js +7 -12
- package/dist/lib/resources/aws/utilities/customResource.js +14 -17
- package/dist/lib/resources/aws/utilities/customResourceProvider.js +2 -7
- package/dist/lib/resources/aws/utilities/index.d.ts +5 -5
- package/dist/lib/resources/aws/utilities/index.js +5 -22
- package/dist/lib/resources/aws/utilities/resourceShare.js +2 -7
- package/dist/lib/resources/index.d.ts +1 -1
- package/dist/lib/resources/index.js +1 -18
- package/dist/lib/types.js +1 -3
- package/dist/lib/utils/accountsUtils.d.ts +5 -0
- package/dist/lib/utils/accountsUtils.js +18 -0
- package/dist/lib/utils/addSuffixToEmail.js +1 -5
- package/dist/lib/utils/backupTierMapping.js +2 -6
- package/dist/lib/utils/capitaliseString.js +1 -10
- package/dist/lib/utils/connections.js +9 -13
- package/dist/lib/utils/connector.js +10 -23
- package/dist/lib/utils/constructMap.d.ts +33 -0
- package/dist/lib/utils/constructMap.js +154 -0
- package/dist/lib/utils/databaseTypes.js +4 -10
- package/dist/lib/utils/dnsRecords.d.ts +1 -1
- package/dist/lib/utils/dnsRecords.js +23 -27
- package/dist/lib/utils/domainTypes.d.ts +0 -1
- package/dist/lib/utils/domainTypes.js +2 -10
- package/dist/lib/utils/env.js +14 -26
- package/dist/lib/utils/getAccountId.js +3 -7
- package/dist/lib/utils/getAsync.js +7 -10
- package/dist/lib/utils/getConfig.d.ts +0 -2
- package/dist/lib/utils/getConfig.js +29 -47
- package/dist/lib/utils/getStackOutput.js +4 -8
- package/dist/lib/utils/index.d.ts +12 -12
- package/dist/lib/utils/index.js +12 -29
- package/dist/lib/utils/manifestWriter.d.ts +14 -3
- package/dist/lib/utils/manifestWriter.js +60 -43
- package/dist/lib/utils/orgConfigParser.d.ts +14 -0
- package/dist/lib/utils/orgConfigParser.js +49 -0
- package/dist/lib/utils/removalPolicy.js +5 -9
- package/dist/lib/utils/resourceNaming.js +11 -16
- package/dist/lib/utils/standardTagsAspect.js +9 -16
- package/dist/lib/utils/stripAndCamelCase.js +1 -5
- package/dist/lib/utils/validationLogger.js +12 -18
- package/dist/lib/utils/vpcUtils.js +5 -10
- package/package.json +25 -8
- package/dist/lib/config/aws/accountId.d.ts +0 -6
- package/dist/lib/config/aws/accountId.js +0 -32
- package/dist/lib/config/aws/backupGlobalSettings.d.ts +0 -29
- package/dist/lib/config/aws/backupGlobalSettings.js +0 -49
- package/dist/lib/config/aws/costAllocationTags.d.ts +0 -12
- package/dist/lib/config/aws/costAllocationTags.js +0 -47
- package/dist/lib/config/aws/ipamDelegateAdmin.d.ts +0 -8
- package/dist/lib/config/aws/ipamDelegateAdmin.js +0 -57
- package/dist/lib/config/aws/ipamPoolId.d.ts +0 -16
- package/dist/lib/config/aws/ipamPoolId.js +0 -42
- package/dist/lib/config/aws/organisation.d.ts +0 -30
- package/dist/lib/config/aws/organisation.js +0 -92
- package/dist/lib/config/aws/organisationId.d.ts +0 -7
- package/dist/lib/config/aws/organisationId.js +0 -45
- package/dist/lib/config/aws/organisationsAccess.d.ts +0 -10
- package/dist/lib/config/aws/organisationsAccess.js +0 -49
- package/dist/lib/config/aws/ramSharing.d.ts +0 -4
- package/dist/lib/config/aws/ramSharing.js +0 -34
- package/dist/lib/config/monitoring.d.ts +0 -18
- package/dist/lib/config/monitoring.js +0 -22
- package/dist/lib/patterns/aws/connections.d.ts +0 -46
- package/dist/lib/patterns/aws/connections.js +0 -159
- package/dist/lib/patterns/aws/hostedZone.d.ts +0 -28
- package/dist/lib/patterns/aws/hostedZone.js +0 -150
- package/dist/lib/patterns/aws/managedAccount.d.ts +0 -9
- package/dist/lib/patterns/aws/managedAccount.js +0 -55
- package/dist/lib/patterns/aws/managedOrganisation.d.ts +0 -36
- package/dist/lib/patterns/aws/managedOrganisation.js +0 -97
- package/dist/lib/patterns/aws/managedPlatform.d.ts +0 -12
- package/dist/lib/patterns/aws/managedPlatform.js +0 -29
- package/dist/lib/resources/aws/database/database.d.ts +0 -14
- package/dist/lib/resources/aws/database/database.js +0 -28
- package/dist/lib/resources/aws/database/databaseInstance.d.ts +0 -15
- package/dist/lib/resources/aws/database/databaseInstance.js +0 -30
- package/dist/lib/resources/aws/database/migrationLambda.d.ts +0 -80
- package/dist/lib/resources/aws/database/migrationLambda.js +0 -119
- package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.d.ts +0 -13
- package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.js +0 -51
- package/dist/lib/resources/aws/iam/securityGroup.d.ts +0 -5
- package/dist/lib/resources/aws/iam/securityGroup.js +0 -14
- package/dist/lib/resources/aws/monitoring/monitoringRole.d.ts +0 -29
- package/dist/lib/resources/aws/monitoring/monitoringRole.js +0 -120
- package/dist/lib/utils/capitalizeString.d.ts +0 -12
- package/dist/lib/utils/capitalizeString.js +0 -30
|
@@ -2,8 +2,10 @@ import { Duration } from "aws-cdk-lib";
|
|
|
2
2
|
import { Connections, type IConnectable, type IVpc } from "aws-cdk-lib/aws-ec2";
|
|
3
3
|
import { DatabaseCluster, type CfnDBCluster, type IClusterEngine } from "aws-cdk-lib/aws-rds";
|
|
4
4
|
import { Construct } from "constructs";
|
|
5
|
-
import { Secret } from "../secrets";
|
|
6
|
-
import
|
|
5
|
+
import { Secret } from "../secrets/index.js";
|
|
6
|
+
import type { ITopic } from "aws-cdk-lib/aws-sns";
|
|
7
|
+
import { type RdsAlarmThresholds } from "../monitoring/index.js";
|
|
8
|
+
import { type EngineConfig, type ProxyConfig, type CredentialsConfig, type AuroraEncryptionConfig, type AuroraWriterConfig, type AuroraReadersConfig, type DatabaseInsightsConfig } from "../../../utils/databaseTypes.js";
|
|
7
9
|
interface RdsProps {
|
|
8
10
|
vpc: IVpc;
|
|
9
11
|
databaseName?: string;
|
|
@@ -43,6 +45,12 @@ interface RdsProps {
|
|
|
43
45
|
* Format: CIDR notation (e.g., "203.0.113.0/32" for single IP)
|
|
44
46
|
*/
|
|
45
47
|
allowedIpCidr?: string;
|
|
48
|
+
/** SNS topic for alarm notifications. Required for alarm creation. */
|
|
49
|
+
alertsTopic?: ITopic;
|
|
50
|
+
/** Alarm thresholds. false to disable, undefined for defaults, object to override. */
|
|
51
|
+
alarms?: RdsAlarmThresholds | false;
|
|
52
|
+
/** Application ID for alarm tagging. */
|
|
53
|
+
applicationId?: string;
|
|
46
54
|
}
|
|
47
55
|
export declare class RdsAurora extends Construct implements IConnectable {
|
|
48
56
|
connections: Connections;
|
|
@@ -1,39 +1,45 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
1
|
+
import { Duration, RemovalPolicy } from "aws-cdk-lib";
|
|
2
|
+
import { Connections, Peer, Port, SubnetType } from "aws-cdk-lib/aws-ec2";
|
|
3
|
+
import { AuroraPostgresEngineVersion, CaCertificate, ClusterInstance, Credentials, DatabaseCluster, DatabaseClusterFromSnapshot, DatabaseClusterEngine, DatabaseProxy, ParameterGroup, ProxyTarget, SnapshotCredentials } from "aws-cdk-lib/aws-rds";
|
|
4
|
+
import { Construct } from "constructs";
|
|
5
|
+
import { SecurityGroup } from "../networking/securityGroup.js";
|
|
6
|
+
import { Secret } from "../secrets/index.js";
|
|
7
|
+
import { ResourceNaming } from "../../../utils/resourceNaming.js";
|
|
8
|
+
import { addProxyCfnOutput } from "./rdsProxyOutput.js";
|
|
9
|
+
import { getDatabaseInsightsRetention } from "./index.js";
|
|
10
|
+
import { RDS_DEFAULTS } from "./rdsDefaults.js";
|
|
11
|
+
import { createRdsAlarms } from "../monitoring/index.js";
|
|
12
|
+
import { DEFAULT_POSTGRES_ENGINE_CONFIG, resolveDatabaseInsights, resolveStorageEncryptionKey, resolvePerformanceInsightsKey, addMultiUserSecretRotation } from "./rdsHelpers.js";
|
|
13
|
+
export class RdsAurora extends Construct {
|
|
14
|
+
connections;
|
|
15
|
+
constructId;
|
|
16
|
+
port;
|
|
17
|
+
engineConfig;
|
|
18
|
+
databaseCluster;
|
|
19
|
+
databaseProxy;
|
|
20
|
+
databaseCredentials;
|
|
21
|
+
cfnCluster;
|
|
16
22
|
constructor(scope, id, props) {
|
|
17
23
|
super(scope, id);
|
|
18
24
|
this.constructId = id;
|
|
19
|
-
this.port = props.port ??
|
|
25
|
+
this.port = props.port ?? RDS_DEFAULTS.DEFAULT_PORT;
|
|
20
26
|
// PostgreSQL fallback for direct usage - ensure engine and engineConfig match
|
|
21
|
-
this.engineConfig = props.engineConfig ??
|
|
22
|
-
const { piEnabled, piConfig } =
|
|
27
|
+
this.engineConfig = props.engineConfig ?? DEFAULT_POSTGRES_ENGINE_CONFIG;
|
|
28
|
+
const { piEnabled, piConfig } = resolveDatabaseInsights(props.databaseInsights);
|
|
23
29
|
// Username priority: snapshotUsername > credentials.username > engine default
|
|
24
30
|
const username = props.snapshotIdentifier && props.snapshotUsername
|
|
25
31
|
? props.snapshotUsername
|
|
26
32
|
: (props.credentials?.username ?? this.engineConfig.defaultUsername);
|
|
27
33
|
// Global secondary clusters import replicated secret instead of creating new
|
|
28
34
|
if (props.isGlobalSecondary) {
|
|
29
|
-
this.databaseCredentials = new
|
|
30
|
-
secretName:
|
|
35
|
+
this.databaseCredentials = new Secret(this, `${props.databaseName}Credentials`, {
|
|
36
|
+
secretName: ResourceNaming.credentialsSecretName(id),
|
|
31
37
|
importExisting: true
|
|
32
38
|
});
|
|
33
39
|
}
|
|
34
40
|
else {
|
|
35
|
-
this.databaseCredentials = new
|
|
36
|
-
secretName:
|
|
41
|
+
this.databaseCredentials = new Secret(this, `${props.databaseName}Credentials`, {
|
|
42
|
+
secretName: ResourceNaming.credentialsSecretName(id),
|
|
37
43
|
generateSecretString: {
|
|
38
44
|
secretStringTemplate: JSON.stringify({ username }),
|
|
39
45
|
excludePunctuation: true,
|
|
@@ -43,32 +49,32 @@ class RdsAurora extends constructs_1.Construct {
|
|
|
43
49
|
replicaRegions: props.secretReplicaRegions
|
|
44
50
|
});
|
|
45
51
|
}
|
|
46
|
-
const storageEncryptionKey =
|
|
47
|
-
const performanceInsightsKey =
|
|
48
|
-
const clusterSecurityGroup = new
|
|
52
|
+
const storageEncryptionKey = resolveStorageEncryptionKey(this, props.databaseName, props.encryption?.storageKey);
|
|
53
|
+
const performanceInsightsKey = resolvePerformanceInsightsKey(this, props.databaseName, piEnabled, piConfig?.encryptionKey);
|
|
54
|
+
const clusterSecurityGroup = new SecurityGroup(this, `${id}SecurityGroup`, {
|
|
49
55
|
vpc: props.vpc,
|
|
50
56
|
description: `Security group for Aurora cluster ${props.databaseName}`
|
|
51
57
|
});
|
|
52
|
-
clusterSecurityGroup.addIngressRule(clusterSecurityGroup,
|
|
58
|
+
clusterSecurityGroup.addIngressRule(clusterSecurityGroup, Port.tcp(this.port));
|
|
53
59
|
// Allow VPC-wide access when enabled (avoids cross-stack cyclic dependencies)
|
|
54
60
|
if (props.allowVpcAccess) {
|
|
55
|
-
clusterSecurityGroup.addIngressRule(
|
|
61
|
+
clusterSecurityGroup.addIngressRule(Peer.ipv4(props.vpc.vpcCidrBlock), Port.tcp(this.port), "Allow access from VPC CIDR");
|
|
56
62
|
}
|
|
57
63
|
// Allow external access when publicly accessible with allowed IP
|
|
58
64
|
if (props.publiclyAccessible && props.allowedIpCidr) {
|
|
59
|
-
clusterSecurityGroup.addIngressRule(
|
|
65
|
+
clusterSecurityGroup.addIngressRule(Peer.ipv4(props.allowedIpCidr), Port.tcp(this.port), "Allow external access from allowed IP");
|
|
60
66
|
}
|
|
61
|
-
this.connections = new
|
|
67
|
+
this.connections = new Connections({
|
|
62
68
|
securityGroups: [clusterSecurityGroup],
|
|
63
|
-
defaultPort:
|
|
69
|
+
defaultPort: Port.tcp(this.port)
|
|
64
70
|
});
|
|
65
71
|
const writerConfig = props.writer ?? {};
|
|
66
72
|
const writerPI = writerConfig.enableDatabaseInsights ?? piEnabled;
|
|
67
73
|
const writerSuffix = writerConfig.identifierSuffix;
|
|
68
74
|
const diMode = piConfig?.mode ?? "standard";
|
|
69
|
-
const performanceInsightsRetention =
|
|
75
|
+
const performanceInsightsRetention = getDatabaseInsightsRetention(diMode);
|
|
70
76
|
const databaseName = props.databaseName || id;
|
|
71
|
-
const writer =
|
|
77
|
+
const writer = ClusterInstance.serverlessV2(`${databaseName}Writer`, {
|
|
72
78
|
enablePerformanceInsights: writerPI,
|
|
73
79
|
performanceInsightEncryptionKey: writerPI
|
|
74
80
|
? performanceInsightsKey
|
|
@@ -76,8 +82,8 @@ class RdsAurora extends constructs_1.Construct {
|
|
|
76
82
|
performanceInsightRetention: writerPI
|
|
77
83
|
? performanceInsightsRetention
|
|
78
84
|
: undefined,
|
|
79
|
-
instanceIdentifier:
|
|
80
|
-
caCertificate:
|
|
85
|
+
instanceIdentifier: ResourceNaming.writerInstanceId(id, writerSuffix),
|
|
86
|
+
caCertificate: CaCertificate.RDS_CA_RSA4096_G1,
|
|
81
87
|
publiclyAccessible: props.publiclyAccessible,
|
|
82
88
|
...(writerConfig.availabilityZone && {
|
|
83
89
|
availabilityZone: writerConfig.availabilityZone
|
|
@@ -85,18 +91,18 @@ class RdsAurora extends constructs_1.Construct {
|
|
|
85
91
|
});
|
|
86
92
|
const readers = this.buildReaders(props, piEnabled, performanceInsightsKey, performanceInsightsRetention);
|
|
87
93
|
const engine = props.engine ||
|
|
88
|
-
|
|
89
|
-
version:
|
|
94
|
+
DatabaseClusterEngine.auroraPostgres({
|
|
95
|
+
version: AuroraPostgresEngineVersion.of("16.6", "16")
|
|
90
96
|
});
|
|
91
|
-
const parameterGroup = new
|
|
97
|
+
const parameterGroup = new ParameterGroup(this, `${props.databaseName}ParameterGroup`, {
|
|
92
98
|
engine,
|
|
93
99
|
description: `Parameter group for ${props.databaseName} with security defaults`,
|
|
94
100
|
parameters: this.engineConfig.sslParameters
|
|
95
101
|
});
|
|
96
102
|
// Use public subnets when publicly accessible, otherwise private
|
|
97
103
|
const vpcSubnets = props.publiclyAccessible
|
|
98
|
-
? { subnetType:
|
|
99
|
-
: { subnetType:
|
|
104
|
+
? { subnetType: SubnetType.PUBLIC }
|
|
105
|
+
: { subnetType: SubnetType.PRIVATE_WITH_EGRESS };
|
|
100
106
|
// Common props shared across all cluster creation paths
|
|
101
107
|
const baseClusterProps = {
|
|
102
108
|
vpc: props.vpc,
|
|
@@ -104,15 +110,15 @@ class RdsAurora extends constructs_1.Construct {
|
|
|
104
110
|
securityGroups: [clusterSecurityGroup],
|
|
105
111
|
engine,
|
|
106
112
|
parameterGroup,
|
|
107
|
-
backup: { retention:
|
|
113
|
+
backup: { retention: Duration.days(props.backupRetention ?? 14) },
|
|
108
114
|
storageEncrypted: true,
|
|
109
115
|
...(storageEncryptionKey && { storageEncryptionKey }),
|
|
110
|
-
clusterIdentifier: props.clusterIdentifier?.toLowerCase() ||
|
|
111
|
-
monitoringInterval: props.monitoringInterval ||
|
|
116
|
+
clusterIdentifier: props.clusterIdentifier?.toLowerCase() || ResourceNaming.clusterId(id),
|
|
117
|
+
monitoringInterval: props.monitoringInterval || RDS_DEFAULTS.MONITORING_INTERVAL,
|
|
112
118
|
preferredMaintenanceWindow: props.preferredMaintenanceWindow ||
|
|
113
|
-
|
|
119
|
+
RDS_DEFAULTS.PREFERRED_MAINTENANCE_WINDOW,
|
|
114
120
|
port: this.port,
|
|
115
|
-
removalPolicy:
|
|
121
|
+
removalPolicy: RemovalPolicy.SNAPSHOT,
|
|
116
122
|
deletionProtection: props.deletionProtection ?? true,
|
|
117
123
|
iamAuthentication: true,
|
|
118
124
|
writer,
|
|
@@ -122,7 +128,7 @@ class RdsAurora extends constructs_1.Construct {
|
|
|
122
128
|
const primaryClusterProps = props.isGlobalSecondary
|
|
123
129
|
? {}
|
|
124
130
|
: {
|
|
125
|
-
credentials:
|
|
131
|
+
credentials: Credentials.fromSecret(this.databaseCredentials.secret),
|
|
126
132
|
defaultDatabaseName: (props.databaseName || id.replace("Rds", "")).replace(/[^a-zA-Z0-9_]/g, "")
|
|
127
133
|
};
|
|
128
134
|
if (props.snapshotIdentifier) {
|
|
@@ -130,9 +136,9 @@ class RdsAurora extends constructs_1.Construct {
|
|
|
130
136
|
const snapshotCredentials = props.isGlobalSecondary
|
|
131
137
|
? {}
|
|
132
138
|
: {
|
|
133
|
-
credentials:
|
|
139
|
+
credentials: SnapshotCredentials.fromSecret(this.databaseCredentials.secret)
|
|
134
140
|
};
|
|
135
|
-
this.databaseCluster = new
|
|
141
|
+
this.databaseCluster = new DatabaseClusterFromSnapshot(this, `${id}Database`,
|
|
136
142
|
// Type assertion: CDK's SnapshotCredentials.username is string | undefined
|
|
137
143
|
// but DatabaseClusterFromSnapshotProps expects string. Works at runtime.
|
|
138
144
|
{
|
|
@@ -143,7 +149,7 @@ class RdsAurora extends constructs_1.Construct {
|
|
|
143
149
|
}
|
|
144
150
|
else {
|
|
145
151
|
// Create new cluster
|
|
146
|
-
this.databaseCluster = new
|
|
152
|
+
this.databaseCluster = new DatabaseCluster(this, `${id}Database`,
|
|
147
153
|
// Type assertion: spread types don't preserve required property narrowing
|
|
148
154
|
{ ...baseClusterProps, ...primaryClusterProps });
|
|
149
155
|
}
|
|
@@ -165,6 +171,17 @@ class RdsAurora extends constructs_1.Construct {
|
|
|
165
171
|
this.addSecretRotation(props);
|
|
166
172
|
}
|
|
167
173
|
}
|
|
174
|
+
if (props.alertsTopic && props.alarms !== false) {
|
|
175
|
+
createRdsAlarms({
|
|
176
|
+
scope: this,
|
|
177
|
+
databaseName: this.constructId,
|
|
178
|
+
database: this.databaseCluster,
|
|
179
|
+
config: typeof props.alarms === "object" ? props.alarms : {},
|
|
180
|
+
alarmTopic: props.alertsTopic,
|
|
181
|
+
applicationId: props.applicationId,
|
|
182
|
+
freeStorageMetricName: "FreeLocalStorage"
|
|
183
|
+
});
|
|
184
|
+
}
|
|
168
185
|
}
|
|
169
186
|
buildReaders(props, defaultPIEnabled, piKey, piRetention) {
|
|
170
187
|
if (props.readers === false) {
|
|
@@ -185,13 +202,13 @@ class RdsAurora extends constructs_1.Construct {
|
|
|
185
202
|
: defaultPIEnabled;
|
|
186
203
|
return readerConfigs.map((config, index) => {
|
|
187
204
|
const enablePI = config.enableDatabaseInsights ?? defaultPI;
|
|
188
|
-
return
|
|
205
|
+
return ClusterInstance.serverlessV2(`${props.databaseName}Reader${index + 1}`, {
|
|
189
206
|
scaleWithWriter: config.scaleWithWriter ?? index === 0,
|
|
190
207
|
enablePerformanceInsights: enablePI,
|
|
191
208
|
performanceInsightEncryptionKey: enablePI ? piKey : undefined,
|
|
192
209
|
performanceInsightRetention: enablePI ? piRetention : undefined,
|
|
193
|
-
instanceIdentifier:
|
|
194
|
-
caCertificate:
|
|
210
|
+
instanceIdentifier: ResourceNaming.readerInstanceId(this.constructId, index + 1, config.identifierSuffix),
|
|
211
|
+
caCertificate: CaCertificate.RDS_CA_RSA4096_G1,
|
|
195
212
|
publiclyAccessible: props.publiclyAccessible,
|
|
196
213
|
...(config.availabilityZone && {
|
|
197
214
|
availabilityZone: config.availabilityZone
|
|
@@ -204,26 +221,26 @@ class RdsAurora extends constructs_1.Construct {
|
|
|
204
221
|
return;
|
|
205
222
|
const proxyConfig = props.proxy;
|
|
206
223
|
const vpcSubnets = proxyConfig.vpcSubnets ?? {
|
|
207
|
-
subnetType:
|
|
224
|
+
subnetType: SubnetType.PRIVATE_WITH_EGRESS
|
|
208
225
|
};
|
|
209
|
-
this.databaseProxy = new
|
|
210
|
-
dbProxyName:
|
|
211
|
-
proxyTarget:
|
|
226
|
+
this.databaseProxy = new DatabaseProxy(this, `${props.databaseName}DatabaseProxy`, {
|
|
227
|
+
dbProxyName: ResourceNaming.proxyName(this.constructId),
|
|
228
|
+
proxyTarget: ProxyTarget.fromCluster(this.databaseCluster),
|
|
212
229
|
secrets: [this.databaseCredentials.secret],
|
|
213
230
|
securityGroups: [securityGroup],
|
|
214
231
|
vpc: props.vpc,
|
|
215
232
|
vpcSubnets,
|
|
216
233
|
requireTLS: proxyConfig.requireTLS ?? true,
|
|
217
234
|
borrowTimeout: proxyConfig.connectionBorrowTimeout
|
|
218
|
-
?
|
|
219
|
-
:
|
|
235
|
+
? Duration.seconds(proxyConfig.connectionBorrowTimeout)
|
|
236
|
+
: Duration.seconds(120),
|
|
220
237
|
maxConnectionsPercent: proxyConfig.maxConnections,
|
|
221
238
|
maxIdleConnectionsPercent: proxyConfig.maxIdleConnections
|
|
222
239
|
});
|
|
223
|
-
|
|
240
|
+
addProxyCfnOutput(this, this.constructId, props.databaseName, this.databaseProxy);
|
|
224
241
|
}
|
|
225
242
|
addSecretRotation(props) {
|
|
226
|
-
|
|
243
|
+
addMultiUserSecretRotation({
|
|
227
244
|
scope: this,
|
|
228
245
|
databaseName: props.databaseName,
|
|
229
246
|
constructId: this.constructId,
|
|
@@ -254,5 +271,3 @@ class RdsAurora extends constructs_1.Construct {
|
|
|
254
271
|
return this.databaseCluster;
|
|
255
272
|
}
|
|
256
273
|
}
|
|
257
|
-
exports.RdsAurora = RdsAurora;
|
|
258
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmRzQXVyb3JhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3MvZGF0YWJhc2UvcmRzQXVyb3JhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUFzRDtBQUV0RCxpREFRNkI7QUFDN0IsaURBa0I2QjtBQUM3QiwyQ0FBdUM7QUFDdkMscUVBQStEO0FBQy9ELHdDQUFvQztBQUNwQyxrRUFBK0Q7QUFDL0QscURBQXFEO0FBQ3JELHlCQUFrRDtBQUNsRCwrQ0FBNkM7QUFDN0MsNkNBTXNCO0FBcUR0QixNQUFhLFNBQVUsU0FBUSxzQkFBUztJQVd0QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQWU7UUFDdkQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLElBQUksMEJBQVksQ0FBQyxZQUFZLENBQUM7UUFFcEQsOEVBQThFO1FBQzlFLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksSUFBSSwyQ0FBOEIsQ0FBQztRQUV6RSxNQUFNLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUEsb0NBQXVCLEVBQ3JELEtBQUssQ0FBQyxnQkFBZ0IsQ0FDdkIsQ0FBQztRQUVGLDhFQUE4RTtRQUM5RSxNQUFNLFFBQVEsR0FDWixLQUFLLENBQUMsa0JBQWtCLElBQUksS0FBSyxDQUFDLGdCQUFnQjtZQUNoRCxDQUFDLENBQUMsS0FBSyxDQUFDLGdCQUFnQjtZQUN4QixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLFFBQVEsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRXpFLDZFQUE2RTtRQUM3RSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lB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SUFDOUIsQ0FBQztDQUNGO0FBOVdELDhCQThXQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IER1cmF0aW9uLCBSZW1vdmFsUG9saWN5IH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyB0eXBlIElLZXkgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWttc1wiO1xuaW1wb3J0IHtcbiAgQ29ubmVjdGlvbnMsXG4gIHR5cGUgSUNvbm5lY3RhYmxlLFxuICB0eXBlIElTZWN1cml0eUdyb3VwLFxuICB0eXBlIElWcGMsXG4gIFBlZXIsXG4gIFBvcnQsXG4gIFN1Ym5ldFR5cGVcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7XG4gIEF1cm9yYVBvc3RncmVzRW5naW5lVmVyc2lvbixcbiAgQ2FDZXJ0aWZpY2F0ZSxcbiAgQ2x1c3Rlckluc3RhbmNlLFxuICBDcmVkZW50aWFscyxcbiAgRGF0YWJhc2VDbHVzdGVyLFxuICB0eXBlIERhdGFiYXNlQ2x1c3RlclByb3BzLFxuICBEYXRhYmFzZUNsdXN0ZXJGcm9tU25hcHNob3QsXG4gIHR5cGUgRGF0YWJhc2VDbHVzdGVyRnJvbVNuYXBzaG90UHJvcHMsXG4gIERhdGFiYXNlQ2x1c3RlckVuZ2luZSxcbiAgdHlwZSBDZm5EQkNsdXN0ZXIsXG4gIERhdGFiYXNlUHJveHksXG4gIHR5cGUgSUNsdXN0ZXJFbmdpbmUsXG4gIHR5cGUgSUNsdXN0ZXJJbnN0YW5jZSxcbiAgUGFyYW1ldGVyR3JvdXAsXG4gIHR5cGUgUGVyZm9ybWFuY2VJbnNpZ2h0UmV0ZW50aW9uLFxuICBQcm94eVRhcmdldCxcbiAgU25hcHNob3RDcmVkZW50aWFsc1xufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJkc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IFNlY3VyaXR5R3JvdXAgfSBmcm9tIFwiLi4vbmV0d29ya2luZy9zZWN1cml0eUdyb3VwLmpzXCI7XG5pbXBvcnQgeyBTZWNyZXQgfSBmcm9tIFwiLi4vc2VjcmV0c1wiO1xuaW1wb3J0IHsgUmVzb3VyY2VOYW1pbmcgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvcmVzb3VyY2VOYW1pbmdcIjtcbmltcG9ydCB7IGFkZFByb3h5Q2ZuT3V0cHV0IH0gZnJvbSBcIi4vcmRzUHJveHlPdXRwdXRcIjtcbmltcG9ydCB7IGdldERhdGFiYXNlSW5zaWdodHNSZXRlbnRpb24gfSBmcm9tIFwiLi9cIjtcbmltcG9ydCB7IFJEU19ERUZBVUxUUyB9IGZyb20gXCIuL3Jkc0RlZmF1bHRzXCI7XG5pbXBvcnQge1xuICBERUZBVUxUX1BPU1RHUkVTX0VOR0lORV9DT05GSUcsXG4gIHJlc29sdmVEYXRhYmFzZUluc2lnaHRzLFxuICByZXNvbHZlU3RvcmFnZUVuY3J5cHRpb25LZXksXG4gIHJlc29sdmVQZXJmb3JtYW5jZUluc2lnaHRzS2V5LFxuICBhZGRNdWx0aVVzZXJTZWNyZXRSb3RhdGlvblxufSBmcm9tIFwiLi9yZHNIZWxwZXJzXCI7XG5pbXBvcnQge1xuICB0eXBlIEVuZ2luZUNvbmZpZyxcbiAgdHlwZSBQcm94eUNvbmZpZyxcbiAgdHlwZSBDcmVkZW50aWFsc0NvbmZpZyxcbiAgdHlwZSBBdXJvcmFFbmNyeXB0aW9uQ29uZmlnLFxuICB0eXBlIEF1cm9yYVdyaXRlckNvbmZpZyxcbiAgdHlwZSBBdXJvcmFSZWFkZXJzQ29uZmlnLFxuICB0eXBlIEF1cm9yYVJlYWRlckNvbmZpZyxcbiAgdHlwZSBEYXRhYmFzZUluc2lnaHRzQ29uZmlnXG59IGZyb20gXCIuLi8uLi8uLi91dGlscy9kYXRhYmFzZVR5cGVzXCI7XG5cbmludGVyZmFjZSBSZHNQcm9wcyB7XG4gIHZwYzogSVZwYztcbiAgZGF0YWJhc2VOYW1lPzogc3RyaW5nO1xuICBlbmdpbmU/OiBJQ2x1c3RlckVuZ2luZTtcbiAgZW5naW5lQ29uZmlnPzogRW5naW5lQ29uZmlnO1xuICBjbHVzdGVySWRlbnRpZmllcj86IHN0cmluZztcbiAgd3JpdGVyPzogQXVyb3JhV3JpdGVyQ29uZmlnO1xuICByZWFkZXJzPzogQXVyb3JhUmVhZGVyc0NvbmZpZyB8IGZhbHNlO1xuICBwcm94eT86IFByb3h5Q29uZmlnIHwgZmFsc2U7XG4gIGNyZWRlbnRpYWxzPzogQ3JlZGVudGlhbHNDb25maWc7XG4gIGVuY3J5cHRpb24/OiBBdXJvcmFFbmNyeXB0aW9uQ29uZmlnO1xuICBiYWNrdXBSZXRlbnRpb24/OiBudW1iZXI7XG4gIG1vbml0b3JpbmdJbnRlcnZhbD86IER1cmF0aW9uO1xuICBwcmVmZXJyZWRNYWludGVuYW5jZVdpbmRvdz86IHN0cmluZztcbiAgcG9ydD86IG51bWJlcjtcbiAgZGF0YWJhc2VJbnNpZ2h0cz86IERhdGFiYXNlSW5zaWdodHNDb25maWcgfCBmYWxzZTtcbiAgLyoqIFNraXBzIHNlY3JldCByb3RhdGlvbiBmb3Igc2Vjb25kYXJ5IGNsdXN0ZXJzIGluIGdsb2JhbCBkYXRhYmFzZSAqL1xuICBpc0dsb2JhbFNlY29uZGFyeT86IGJvb2xlYW47XG4gIHNlY3JldFJlcGxpY2FSZWdpb25zPzogc3RyaW5nW107XG4gIGRlbGV0aW9uUHJvdGVjdGlvbj86IGJvb2xlYW47XG4gIC8qKiBBUk4gb3IgaWRlbnRpZmllciBvZiBEQiBjbHVzdGVyIHNuYXBzaG90IHRvIHJlc3RvcmUgZnJvbSAqL1xuICBzbmFwc2hvdElkZW50aWZpZXI/OiBzdHJpbmc7XG4gIC8qKiBVc2VybmFtZSBmcm9tIHRoZSBzbmFwc2hvdCAocmVxdWlyZWQgd2hlbiByZXN0b3JpbmcgZnJvbSBzbmFwc2hvdCB0byByZXNldCBwYXNzd29yZCkgKi9cbiAgc25hcHNob3RVc2VybmFtZT86IHN0cmluZztcbiAgLyoqIEFsbG93IGFjY2VzcyBmcm9tIFZQQyBDSURSIChhdm9pZHMgY3Jvc3Mtc3RhY2sgY3ljbGljIGRlcGVuZGVuY2llcyB3aXRoIExhbWJkYSkgKi9cbiAgYWxsb3dWcGNBY2Nlc3M/OiBib29sZWFuO1xuICAvKipcbiAgICogTWFrZSBkYXRhYmFzZSBwdWJsaWNseSBhY2Nlc3NpYmxlIGZyb20gdGhlIGludGVybmV0LlxuICAgKiBXQVJOSU5HOiBUaGlzIGlzIGEgc2VjdXJpdHkgcmlzayBhbmQgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgZGV2ZWxvcG1lbnRcbiAgICogb3Igd2hlbiBidWlsZGluZyBQYXlsb2FkIGFwcHMgbG9jYWxseSB0aGF0IG5lZWQgZGF0YWJhc2UgYWNjZXNzLlxuICAgKiBXaGVuIGVuYWJsZWQsIHRoZSBkYXRhYmFzZSBpcyBwbGFjZWQgaW4gcHVibGljIHN1Ym5ldHMuXG4gICAqL1xuICBwdWJsaWNseUFjY2Vzc2libGU/OiBib29sZWFuO1xuICAvKipcbiAgICogSVAgYWRkcmVzcyB0byBhbGxvdyBhY2Nlc3MgZnJvbSB3aGVuIHB1YmxpY2x5QWNjZXNzaWJsZSBpcyB0cnVlLlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkLCBhY2Nlc3MgaXMgcmVzdHJpY3RlZCB0byBWUEMgb25seSBldmVuIHdoZW4gcHVibGljLlxuICAgKiBGb3JtYXQ6IENJRFIgbm90YXRpb24gKGUuZy4sIFwiMjAzLjAuMTEzLjAvMzJcIiBmb3Igc2luZ2xlIElQKVxuICAgKi9cbiAgYWxsb3dlZElwQ2lkcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFJkc0F1cm9yYSBleHRlbmRzIENvbnN0cnVjdCBpbXBsZW1lbnRzIElDb25uZWN0YWJsZSB7XG4gIHB1YmxpYyBjb25uZWN0aW9uczogQ29ubmVjdGlvbnM7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjb25zdHJ1Y3RJZDogc3RyaW5nO1xuICBwcml2YXRlIHBvcnQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBlbmdpbmVDb25maWc6IEVuZ2luZUNvbmZpZztcbiAgcHJpdmF0ZSBkYXRhYmFzZUNsdXN0ZXI6IERhdGFiYXNlQ2x1c3RlcjtcbiAgcHJpdmF0ZSBkYXRhYmFzZVByb3h5PzogRGF0YWJhc2VQcm94eTtcbiAgcHJpdmF0ZSBkYXRhYmFzZUNyZWRlbnRpYWxzOiBTZWNyZXQ7XG4gIHByaXZhdGUgY2ZuQ2x1c3Rlcj86IENmbkRCQ2x1c3RlcjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUmRzUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5jb25zdHJ1Y3RJZCA9IGlkO1xuICAgIHRoaXMucG9ydCA9IHByb3BzLnBvcnQgPz8gUkRTX0RFRkFVTFRTLkRFRkFVTFRfUE9SVDtcblxuICAgIC8vIFBvc3RncmVTUUwgZmFsbGJhY2sgZm9yIGRpcmVjdCB1c2FnZSAtIGVuc3VyZSBlbmdpbmUgYW5kIGVuZ2luZUNvbmZpZyBtYXRjaFxuICAgIHRoaXMuZW5naW5lQ29uZmlnID0gcHJvcHMuZW5naW5lQ29uZmlnID8/IERFRkFVTFRfUE9TVEdSRVNfRU5HSU5FX0NPTkZJRztcblxuICAgIGNvbnN0IHsgcGlFbmFibGVkLCBwaUNvbmZpZyB9ID0gcmVzb2x2ZURhdGFiYXNlSW5zaWdodHMoXG4gICAgICBwcm9wcy5kYXRhYmFzZUluc2lnaHRzXG4gICAgKTtcblxuICAgIC8vIFVzZXJuYW1lIHByaW9yaXR5OiBzbmFwc2hvdFVzZXJuYW1lID4gY3JlZGVudGlhbHMudXNlcm5hbWUgPiBlbmdpbmUgZGVmYXVsdFxuICAgIGNvbnN0IHVzZXJuYW1lID1cbiAgICAgIHByb3BzLnNuYXBzaG90SWRlbnRpZmllciAmJiBwcm9wcy5zbmFwc2hvdFVzZXJuYW1lXG4gICAgICAgID8gcHJvcHMuc25hcHNob3RVc2VybmFtZVxuICAgICAgICA6IChwcm9wcy5jcmVkZW50aWFscz8udXNlcm5hbWUgPz8gdGhpcy5lbmdpbmVDb25maWcuZGVmYXVsdFVzZXJuYW1lKTtcblxuICAgIC8vIEdsb2JhbCBzZWNvbmRhcnkgY2x1c3RlcnMgaW1wb3J0IHJlcGxpY2F0ZWQgc2VjcmV0IGluc3RlYWQgb2YgY3JlYXRpbmcgbmV3XG4gICAgaWYgKHByb3BzLmlzR2xvYmFsU2Vjb25kYXJ5KSB7XG4gICAgICB0aGlzLmRhdGFiYXNlQ3JlZGVudGlhbHMgPSBuZXcgU2VjcmV0KFxuICAgICAgICB0aGlzLFxuICAgICAgICBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9Q3JlZGVudGlhbHNgLFxuICAgICAgICB7XG4gICAgICAgICAgc2VjcmV0TmFtZTogUmVzb3VyY2VOYW1pbmcuY3JlZGVudGlhbHNTZWNyZXROYW1lKGlkKSxcbiAgICAgICAgICBpbXBvcnRFeGlzdGluZzogdHJ1ZVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRhdGFiYXNlQ3JlZGVudGlhbHMgPSBuZXcgU2VjcmV0KFxuICAgICAgICB0aGlzLFxuICAgICAgICBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9Q3JlZGVudGlhbHNgLFxuICAgICAgICB7XG4gICAgICAgICAgc2VjcmV0TmFtZTogUmVzb3VyY2VOYW1pbmcuY3JlZGVudGlhbHNTZWNyZXROYW1lKGlkKSxcbiAgICAgICAgICBnZW5lcmF0ZVNlY3JldFN0cmluZzoge1xuICAgICAgICAgICAgc2VjcmV0U3RyaW5nVGVtcGxhdGU6IEpTT04uc3RyaW5naWZ5KHsgdXNlcm5hbWUgfSksXG4gICAgICAgICAgICBleGNsdWRlUHVuY3R1YXRpb246IHRydWUsXG4gICAgICAgICAgICBpbmNsdWRlU3BhY2U6IGZhbHNlLFxuICAgICAgICAgICAgZ2VuZXJhdGVTdHJpbmdLZXk6IFwicGFzc3dvcmRcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVwbGljYVJlZ2lvbnM6IHByb3BzLnNlY3JldFJlcGxpY2FSZWdpb25zXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RvcmFnZUVuY3J5cHRpb25LZXkgPSByZXNvbHZlU3RvcmFnZUVuY3J5cHRpb25LZXkoXG4gICAgICB0aGlzLFxuICAgICAgcHJvcHMuZGF0YWJhc2VOYW1lLFxuICAgICAgcHJvcHMuZW5jcnlwdGlvbj8uc3RvcmFnZUtleVxuICAgICk7XG5cbiAgICBjb25zdCBwZXJmb3JtYW5jZUluc2lnaHRzS2V5ID0gcmVzb2x2ZVBlcmZvcm1hbmNlSW5zaWdodHNLZXkoXG4gICAgICB0aGlzLFxuICAgICAgcHJvcHMuZGF0YWJhc2VOYW1lLFxuICAgICAgcGlFbmFibGVkLFxuICAgICAgcGlDb25maWc/LmVuY3J5cHRpb25LZXlcbiAgICApO1xuXG4gICAgY29uc3QgY2x1c3RlclNlY3VyaXR5R3JvdXAgPSBuZXcgU2VjdXJpdHlHcm91cCh0aGlzLCBgJHtpZH1TZWN1cml0eUdyb3VwYCwge1xuICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICBkZXNjcmlwdGlvbjogYFNlY3VyaXR5IGdyb3VwIGZvciBBdXJvcmEgY2x1c3RlciAke3Byb3BzLmRhdGFiYXNlTmFtZX1gXG4gICAgfSk7XG5cbiAgICBjbHVzdGVyU2VjdXJpdHlHcm91cC5hZGRJbmdyZXNzUnVsZShcbiAgICAgIGNsdXN0ZXJTZWN1cml0eUdyb3VwLFxuICAgICAgUG9ydC50Y3AodGhpcy5wb3J0KVxuICAgICk7XG5cbiAgICAvLyBBbGxvdyBWUEMtd2lkZSBhY2Nlc3Mgd2hlbiBlbmFibGVkIChhdm9pZHMgY3Jvc3Mtc3RhY2sgY3ljbGljIGRlcGVuZGVuY2llcylcbiAgICBpZiAocHJvcHMuYWxsb3dWcGNBY2Nlc3MpIHtcbiAgICAgIGNsdXN0ZXJTZWN1cml0eUdyb3VwLmFkZEluZ3Jlc3NSdWxlKFxuICAgICAgICBQZWVyLmlwdjQocHJvcHMudnBjLnZwY0NpZHJCbG9jayksXG4gICAgICAgIFBvcnQudGNwKHRoaXMucG9ydCksXG4gICAgICAgIFwiQWxsb3cgYWNjZXNzIGZyb20gVlBDIENJRFJcIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBBbGxvdyBleHRlcm5hbCBhY2Nlc3Mgd2hlbiBwdWJsaWNseSBhY2Nlc3NpYmxlIHdpdGggYWxsb3dlZCBJUFxuICAgIGlmIChwcm9wcy5wdWJsaWNseUFjY2Vzc2libGUgJiYgcHJvcHMuYWxsb3dlZElwQ2lkcikge1xuICAgICAgY2x1c3RlclNlY3VyaXR5R3JvdXAuYWRkSW5ncmVzc1J1bGUoXG4gICAgICAgIFBlZXIuaXB2NChwcm9wcy5hbGxvd2VkSXBDaWRyKSxcbiAgICAgICAgUG9ydC50Y3AodGhpcy5wb3J0KSxcbiAgICAgICAgXCJBbGxvdyBleHRlcm5hbCBhY2Nlc3MgZnJvbSBhbGxvd2VkIElQXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5jb25uZWN0aW9ucyA9IG5ldyBDb25uZWN0aW9ucyh7XG4gICAgICBzZWN1cml0eUdyb3VwczogW2NsdXN0ZXJTZWN1cml0eUdyb3VwXSxcbiAgICAgIGRlZmF1bHRQb3J0OiBQb3J0LnRjcCh0aGlzLnBvcnQpXG4gICAgfSk7XG5cbiAgICBjb25zdCB3cml0ZXJDb25maWcgPSBwcm9wcy53cml0ZXIgPz8ge307XG4gICAgY29uc3Qgd3JpdGVyUEkgPSB3cml0ZXJDb25maWcuZW5hYmxlRGF0YWJhc2VJbnNpZ2h0cyA/PyBwaUVuYWJsZWQ7XG4gICAgY29uc3Qgd3JpdGVyU3VmZml4ID0gd3JpdGVyQ29uZmlnLmlkZW50aWZpZXJTdWZmaXg7XG4gICAgY29uc3QgZGlNb2RlID0gcGlDb25maWc/Lm1vZGUgPz8gXCJzdGFuZGFyZFwiO1xuICAgIGNvbnN0IHBlcmZvcm1hbmNlSW5zaWdodHNSZXRlbnRpb24gPSBnZXREYXRhYmFzZUluc2lnaHRzUmV0ZW50aW9uKGRpTW9kZSk7XG4gICAgY29uc3QgZGF0YWJhc2VOYW1lID0gcHJvcHMuZGF0YWJhc2VOYW1lIHx8IGlkO1xuXG4gICAgY29uc3Qgd3JpdGVyID0gQ2x1c3Rlckluc3RhbmNlLnNlcnZlcmxlc3NWMihgJHtkYXRhYmFzZU5hbWV9V3JpdGVyYCwge1xuICAgICAgZW5hYmxlUGVyZm9ybWFuY2VJbnNpZ2h0czogd3JpdGVyUEksXG4gICAgICBwZXJmb3JtYW5jZUluc2lnaHRFbmNyeXB0aW9uS2V5OiB3cml0ZXJQSVxuICAgICAgICA/IHBlcmZvcm1hbmNlSW5zaWdodHNLZXlcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBwZXJmb3JtYW5jZUluc2lnaHRSZXRlbnRpb246IHdyaXRlclBJXG4gICAgICAgID8gcGVyZm9ybWFuY2VJbnNpZ2h0c1JldGVudGlvblxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGluc3RhbmNlSWRlbnRpZmllcjogUmVzb3VyY2VOYW1pbmcud3JpdGVySW5zdGFuY2VJZChpZCwgd3JpdGVyU3VmZml4KSxcbiAgICAgIGNhQ2VydGlmaWNhdGU6IENhQ2VydGlmaWNhdGUuUkRTX0NBX1JTQTQwOTZfRzEsXG4gICAgICBwdWJsaWNseUFjY2Vzc2libGU6IHByb3BzLnB1YmxpY2x5QWNjZXNzaWJsZSxcbiAgICAgIC4uLih3cml0ZXJDb25maWcuYXZhaWxhYmlsaXR5Wm9uZSAmJiB7XG4gICAgICAgIGF2YWlsYWJpbGl0eVpvbmU6IHdyaXRlckNvbmZpZy5hdmFpbGFiaWxpdHlab25lXG4gICAgICB9KVxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVhZGVycyA9IHRoaXMuYnVpbGRSZWFkZXJzKFxuICAgICAgcHJvcHMsXG4gICAgICBwaUVuYWJsZWQsXG4gICAgICBwZXJmb3JtYW5jZUluc2lnaHRzS2V5LFxuICAgICAgcGVyZm9ybWFuY2VJbnNpZ2h0c1JldGVudGlvblxuICAgICk7XG5cbiAgICBjb25zdCBlbmdpbmUgPVxuICAgICAgcHJvcHMuZW5naW5lIHx8XG4gICAgICBEYXRhYmFzZUNsdXN0ZXJFbmdpbmUuYXVyb3JhUG9zdGdyZXMoe1xuICAgICAgICB2ZXJzaW9uOiBBdXJvcmFQb3N0Z3Jlc0VuZ2luZVZlcnNpb24ub2YoXCIxNi42XCIsIFwiMTZcIilcbiAgICAgIH0pO1xuXG4gICAgY29uc3QgcGFyYW1ldGVyR3JvdXAgPSBuZXcgUGFyYW1ldGVyR3JvdXAoXG4gICAgICB0aGlzLFxuICAgICAgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVBhcmFtZXRlckdyb3VwYCxcbiAgICAgIHtcbiAgICAgICAgZW5naW5lLFxuICAgICAgICBkZXNjcmlwdGlvbjogYFBhcmFtZXRlciBncm91cCBmb3IgJHtwcm9wcy5kYXRhYmFzZU5hbWV9IHdpdGggc2VjdXJpdHkgZGVmYXVsdHNgLFxuICAgICAgICBwYXJhbWV0ZXJzOiB0aGlzLmVuZ2luZUNvbmZpZy5zc2xQYXJhbWV0ZXJzXG4gICAgICB9XG4gICAgKTtcblxuICAgIC8vIFVzZSBwdWJsaWMgc3VibmV0cyB3aGVuIHB1YmxpY2x5IGFjY2Vzc2libGUsIG90aGVyd2lzZSBwcml2YXRlXG4gICAgY29uc3QgdnBjU3VibmV0cyA9IHByb3BzLnB1YmxpY2x5QWNjZXNzaWJsZVxuICAgICAgPyB7IHN1Ym5ldFR5cGU6IFN1Ym5ldFR5cGUuUFVCTElDIH1cbiAgICAgIDogeyBzdWJuZXRUeXBlOiBTdWJuZXRUeXBlLlBSSVZBVEVfV0lUSF9FR1JFU1MgfTtcblxuICAgIC8vIENvbW1vbiBwcm9wcyBzaGFyZWQgYWNyb3NzIGFsbCBjbHVzdGVyIGNyZWF0aW9uIHBhdGhzXG4gICAgY29uc3QgYmFzZUNsdXN0ZXJQcm9wcyA9IHtcbiAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgdnBjU3VibmV0cyxcbiAgICAgIHNlY3VyaXR5R3JvdXBzOiBbY2x1c3RlclNlY3VyaXR5R3JvdXBdIGFzIElTZWN1cml0eUdyb3VwW10sXG4gICAgICBlbmdpbmUsXG4gICAgICBwYXJhbWV0ZXJHcm91cCxcbiAgICAgIGJhY2t1cDogeyByZXRlbnRpb246IER1cmF0aW9uLmRheXMocHJvcHMuYmFja3VwUmV0ZW50aW9uID8/IDE0KSB9LFxuICAgICAgc3RvcmFnZUVuY3J5cHRlZDogdHJ1ZSxcbiAgICAgIC4uLihzdG9yYWdlRW5jcnlwdGlvbktleSAmJiB7IHN0b3JhZ2VFbmNyeXB0aW9uS2V5IH0pLFxuICAgICAgY2x1c3RlcklkZW50aWZpZXI6XG4gICAgICAgIHByb3BzLmNsdXN0ZXJJZGVudGlmaWVyPy50b0xvd2VyQ2FzZSgpIHx8IFJlc291cmNlTmFtaW5nLmNsdXN0ZXJJZChpZCksXG4gICAgICBtb25pdG9yaW5nSW50ZXJ2YWw6XG4gICAgICAgIHByb3BzLm1vbml0b3JpbmdJbnRlcnZhbCB8fCBSRFNfREVGQVVMVFMuTU9OSVRPUklOR19JTlRFUlZBTCxcbiAgICAgIHByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93OlxuICAgICAgICBwcm9wcy5wcmVmZXJyZWRNYWludGVuYW5jZVdpbmRvdyB8fFxuICAgICAgICBSRFNfREVGQVVMVFMuUFJFRkVSUkVEX01BSU5URU5BTkNFX1dJTkRPVyxcbiAgICAgIHBvcnQ6IHRoaXMucG9ydCxcbiAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuU05BUFNIT1QsXG4gICAgICBkZWxldGlvblByb3RlY3Rpb246IHByb3BzLmRlbGV0aW9uUHJvdGVjdGlvbiA/PyB0cnVlLFxuICAgICAgaWFtQXV0aGVudGljYXRpb246IHRydWUsXG4gICAgICB3cml0ZXIsXG4gICAgICByZWFkZXJzXG4gICAgfTtcblxuICAgIC8vIENyZWRlbnRpYWxzIGFuZCBkYXRhYmFzZSBuYW1lIGZvciBub24tZ2xvYmFsLXNlY29uZGFyeSBjbHVzdGVyc1xuICAgIGNvbnN0IHByaW1hcnlDbHVzdGVyUHJvcHMgPSBwcm9wcy5pc0dsb2JhbFNlY29uZGFyeVxuICAgICAgPyB7fVxuICAgICAgOiB7XG4gICAgICAgICAgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxzLmZyb21TZWNyZXQodGhpcy5kYXRhYmFzZUNyZWRlbnRpYWxzLnNlY3JldCksXG4gICAgICAgICAgZGVmYXVsdERhdGFiYXNlTmFtZTogKFxuICAgICAgICAgICAgcHJvcHMuZGF0YWJhc2VOYW1lIHx8IGlkLnJlcGxhY2UoXCJSZHNcIiwgXCJcIilcbiAgICAgICAgICApLnJlcGxhY2UoL1teYS16QS1aMC05X10vZywgXCJcIilcbiAgICAgICAgfTtcblxuICAgIGlmIChwcm9wcy5zbmFwc2hvdElkZW50aWZpZXIpIHtcbiAgICAgIC8vIENyZWF0ZSBmcm9tIHNuYXBzaG90IC0gY3JlZGVudGlhbHMgbmVlZCBTbmFwc2hvdENyZWRlbnRpYWxzIHR5cGVcbiAgICAgIGNvbnN0IHNuYXBzaG90Q3JlZGVudGlhbHMgPSBwcm9wcy5pc0dsb2JhbFNlY29uZGFyeVxuICAgICAgICA/IHt9XG4gICAgICAgIDoge1xuICAgICAgICAgICAgY3JlZGVudGlhbHM6IFNuYXBzaG90Q3JlZGVudGlhbHMuZnJvbVNlY3JldChcbiAgICAgICAgICAgICAgdGhpcy5kYXRhYmFzZUNyZWRlbnRpYWxzLnNlY3JldFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH07XG5cbiAgICAgIHRoaXMuZGF0YWJhc2VDbHVzdGVyID0gbmV3IERhdGFiYXNlQ2x1c3RlckZyb21TbmFwc2hvdChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYCR7aWR9RGF0YWJhc2VgLFxuICAgICAgICAvLyBUeXBlIGFzc2VydGlvbjogQ0RLJ3MgU25hcHNob3RDcmVkZW50aWFscy51c2VybmFtZSBpcyBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICAgICAgLy8gYnV0IERhdGFiYXNlQ2x1c3RlckZyb21TbmFwc2hvdFByb3BzIGV4cGVjdHMgc3RyaW5nLiBXb3JrcyBhdCBydW50aW1lLlxuICAgICAgICB7XG4gICAgICAgICAgLi4uYmFzZUNsdXN0ZXJQcm9wcyxcbiAgICAgICAgICAuLi5zbmFwc2hvdENyZWRlbnRpYWxzLFxuICAgICAgICAgIHNuYXBzaG90SWRlbnRpZmllcjogcHJvcHMuc25hcHNob3RJZGVudGlmaWVyXG4gICAgICAgIH0gYXMgRGF0YWJhc2VDbHVzdGVyRnJvbVNuYXBzaG90UHJvcHNcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENyZWF0ZSBuZXcgY2x1c3RlclxuICAgICAgdGhpcy5kYXRhYmFzZUNsdXN0ZXIgPSBuZXcgRGF0YWJhc2VDbHVzdGVyKFxuICAgICAgICB0aGlzLFxuICAgICAgICBgJHtpZH1EYXRhYmFzZWAsXG4gICAgICAgIC8vIFR5cGUgYXNzZXJ0aW9uOiBzcHJlYWQgdHlwZXMgZG9uJ3QgcHJlc2VydmUgcmVxdWlyZWQgcHJvcGVydHkgbmFycm93aW5nXG4gICAgICAgIHsgLi4uYmFzZUNsdXN0ZXJQcm9wcywgLi4ucHJpbWFyeUNsdXN0ZXJQcm9wcyB9IGFzIERhdGFiYXNlQ2x1c3RlclByb3BzXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuY2ZuQ2x1c3RlciA9IHRoaXMuZGF0YWJhc2VDbHVzdGVyLm5vZGUuZGVmYXVsdENoaWxkIGFzXG4gICAgICB8IENmbkRCQ2x1c3RlclxuICAgICAgfCB1bmRlZmluZWQ7XG5cbiAgICAvLyBHbG9iYWwgc2Vjb25kYXJ5IGNsdXN0ZXJzIGNhbid0IHNwZWNpZnkgdGhlc2UgcHJvcGVydGllc1xuICAgIGlmIChwcm9wcy5pc0dsb2JhbFNlY29uZGFyeSAmJiB0aGlzLmNmbkNsdXN0ZXIpIHtcbiAgICAgIHRoaXMuY2ZuQ2x1c3Rlci5tYXN0ZXJVc2VybmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuY2ZuQ2x1c3Rlci5tYXN0ZXJVc2VyUGFzc3dvcmQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmNmbkNsdXN0ZXIuZGF0YWJhc2VOYW1lID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IHByb3h5RW5hYmxlZCA9IHByb3BzLnByb3h5ICE9PSB1bmRlZmluZWQgJiYgcHJvcHMucHJveHkgIT09IGZhbHNlO1xuICAgIGlmIChwcm94eUVuYWJsZWQpIHtcbiAgICAgIHRoaXMuYWRkUHJveHkocHJvcHMsIGNsdXN0ZXJTZWN1cml0eUdyb3VwKTtcbiAgICB9XG5cbiAgICAvLyBTZWNyZXQgcm90YXRpb24gZW5hYmxlZCBieSBkZWZhdWx0IChvcHQtb3V0IHdpdGggc2VjcmV0Um90YXRpb246IGZhbHNlKVxuICAgIGlmICghcHJvcHMuaXNHbG9iYWxTZWNvbmRhcnkpIHtcbiAgICAgIGNvbnN0IHNlY3JldFJvdGF0aW9uRGlzYWJsZWQgPVxuICAgICAgICBwcm9wcy5jcmVkZW50aWFscz8uc2VjcmV0Um90YXRpb24gPT09IGZhbHNlO1xuICAgICAgaWYgKCFzZWNyZXRSb3RhdGlvbkRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuYWRkU2VjcmV0Um90YXRpb24ocHJvcHMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRSZWFkZXJzKFxuICAgIHByb3BzOiBSZHNQcm9wcyxcbiAgICBkZWZhdWx0UElFbmFibGVkOiBib29sZWFuLFxuICAgIHBpS2V5PzogSUtleSxcbiAgICBwaVJldGVudGlvbj86IFBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvblxuICApOiBJQ2x1c3Rlckluc3RhbmNlW10ge1xuICAgIGlmIChwcm9wcy5yZWFkZXJzID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGxldCByZWFkZXJDb25maWdzOiBBdXJvcmFSZWFkZXJDb25maWdbXTtcbiAgICBpZiAocHJvcHMucmVhZGVycz8uaW5zdGFuY2VzKSB7XG4gICAgICByZWFkZXJDb25maWdzID0gcHJvcHMucmVhZGVycy5pbnN0YW5jZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvdW50ID0gcHJvcHMucmVhZGVycz8uY291bnQgPz8gMTtcbiAgICAgIHJlYWRlckNvbmZpZ3MgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudCB9LCAoXywgaSkgPT4gKHtcbiAgICAgICAgc2NhbGVXaXRoV3JpdGVyOiBpID09PSAwXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdFBJID1cbiAgICAgIHByb3BzLnJlYWRlcnMgJiYgXCJkZWZhdWx0RW5hYmxlRGF0YWJhc2VJbnNpZ2h0c1wiIGluIHByb3BzLnJlYWRlcnNcbiAgICAgICAgPyAocHJvcHMucmVhZGVycy5kZWZhdWx0RW5hYmxlRGF0YWJhc2VJbnNpZ2h0cyA/PyBkZWZhdWx0UElFbmFibGVkKVxuICAgICAgICA6IGRlZmF1bHRQSUVuYWJsZWQ7XG5cbiAgICByZXR1cm4gcmVhZGVyQ29uZmlncy5tYXAoKGNvbmZpZywgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGVuYWJsZVBJID0gY29uZmlnLmVuYWJsZURhdGFiYXNlSW5zaWdodHMgPz8gZGVmYXVsdFBJO1xuXG4gICAgICByZXR1cm4gQ2x1c3Rlckluc3RhbmNlLnNlcnZlcmxlc3NWMihcbiAgICAgICAgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVJlYWRlciR7aW5kZXggKyAxfWAsXG4gICAgICAgIHtcbiAgICAgICAgICBzY2FsZVdpdGhXcml0ZXI6IGNvbmZpZy5zY2FsZVdpdGhXcml0ZXIgPz8gaW5kZXggPT09IDAsXG4gICAgICAgICAgZW5hYmxlUGVyZm9ybWFuY2VJbnNpZ2h0czogZW5hYmxlUEksXG4gICAgICAgICAgcGVyZm9ybWFuY2VJbnNpZ2h0RW5jcnlwdGlvbktleTogZW5hYmxlUEkgPyBwaUtleSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBwZXJmb3JtYW5jZUluc2lnaHRSZXRlbnRpb246IGVuYWJsZVBJID8gcGlSZXRlbnRpb24gOiB1bmRlZmluZWQsXG4gICAgICAgICAgaW5zdGFuY2VJZGVudGlmaWVyOiBSZXNvdXJjZU5hbWluZy5yZWFkZXJJbnN0YW5jZUlkKFxuICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3RJZCxcbiAgICAgICAgICAgIGluZGV4ICsgMSxcbiAgICAgICAgICAgIGNvbmZpZy5pZGVudGlmaWVyU3VmZml4XG4gICAgICAgICAgKSxcbiAgICAgICAgICBjYUNlcnRpZmljYXRlOiBDYUNlcnRpZmljYXRlLlJEU19DQV9SU0E0MDk2X0cxLFxuICAgICAgICAgIHB1YmxpY2x5QWNjZXNzaWJsZTogcHJvcHMucHVibGljbHlBY2Nlc3NpYmxlLFxuICAgICAgICAgIC4uLihjb25maWcuYXZhaWxhYmlsaXR5Wm9uZSAmJiB7XG4gICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lOiBjb25maWcuYXZhaWxhYmlsaXR5Wm9uZVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFkZFByb3h5KHByb3BzOiBSZHNQcm9wcywgc2VjdXJpdHlHcm91cDogU2VjdXJpdHlHcm91cCk6IHZvaWQge1xuICAgIGlmICghcHJvcHMucHJveHkpIHJldHVybjtcbiAgICBjb25zdCBwcm94eUNvbmZpZyA9IHByb3BzLnByb3h5O1xuICAgIGNvbnN0IHZwY1N1Ym5ldHMgPSBwcm94eUNvbmZpZy52cGNTdWJuZXRzID8/IHtcbiAgICAgIHN1Ym5ldFR5cGU6IFN1Ym5ldFR5cGUuUFJJVkFURV9XSVRIX0VHUkVTU1xuICAgIH07XG5cbiAgICB0aGlzLmRhdGFiYXNlUHJveHkgPSBuZXcgRGF0YWJhc2VQcm94eShcbiAgICAgIHRoaXMsXG4gICAgICBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9RGF0YWJhc2VQcm94eWAsXG4gICAgICB7XG4gICAgICAgIGRiUHJveHlOYW1lOiBSZXNvdXJjZU5hbWluZy5wcm94eU5hbWUodGhpcy5jb25zdHJ1Y3RJZCksXG4gICAgICAgIHByb3h5VGFyZ2V0OiBQcm94eVRhcmdldC5mcm9tQ2x1c3Rlcih0aGlzLmRhdGFiYXNlQ2x1c3RlciksXG4gICAgICAgIHNlY3JldHM6IFt0aGlzLmRhdGFiYXNlQ3JlZGVudGlhbHMuc2VjcmV0XSxcbiAgICAgICAgc2VjdXJpdHlHcm91cHM6IFtzZWN1cml0eUdyb3VwXSxcbiAgICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICAgIHZwY1N1Ym5ldHMsXG4gICAgICAgIHJlcXVpcmVUTFM6IHByb3h5Q29uZmlnLnJlcXVpcmVUTFMgPz8gdHJ1ZSxcbiAgICAgICAgYm9ycm93VGltZW91dDogcHJveHlDb25maWcuY29ubmVjdGlvbkJvcnJvd1RpbWVvdXRcbiAgICAgICAgICA/IER1cmF0aW9uLnNlY29uZHMocHJveHlDb25maWcuY29ubmVjdGlvbkJvcnJvd1RpbWVvdXQpXG4gICAgICAgICAgOiBEdXJhdGlvbi5zZWNvbmRzKDEyMCksXG4gICAgICAgIG1heENvbm5lY3Rpb25zUGVyY2VudDogcHJveHlDb25maWcubWF4Q29ubmVjdGlvbnMsXG4gICAgICAgIG1heElkbGVDb25uZWN0aW9uc1BlcmNlbnQ6IHByb3h5Q29uZmlnLm1heElkbGVDb25uZWN0aW9uc1xuICAgICAgfVxuICAgICk7XG5cbiAgICBhZGRQcm94eUNmbk91dHB1dChcbiAgICAgIHRoaXMsXG4gICAgICB0aGlzLmNvbnN0cnVjdElkLFxuICAgICAgcHJvcHMuZGF0YWJhc2VOYW1lLFxuICAgICAgdGhpcy5kYXRhYmFzZVByb3h5XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkU2VjcmV0Um90YXRpb24ocHJvcHM6IFJkc1Byb3BzKTogdm9pZCB7XG4gICAgYWRkTXVsdGlVc2VyU2VjcmV0Um90YXRpb24oe1xuICAgICAgc2NvcGU6IHRoaXMsXG4gICAgICBkYXRhYmFzZU5hbWU6IHByb3BzLmRhdGFiYXNlTmFtZSxcbiAgICAgIGNvbnN0cnVjdElkOiB0aGlzLmNvbnN0cnVjdElkLFxuICAgICAgZW5naW5lQ29uZmlnOiB0aGlzLmVuZ2luZUNvbmZpZyxcbiAgICAgIGNyZWRlbnRpYWxzQ29uZmlnOiBwcm9wcy5jcmVkZW50aWFscyxcbiAgICAgIGRhdGFiYXNlU2VjcmV0OiB0aGlzLmRhdGFiYXNlQ3JlZGVudGlhbHMuc2VjcmV0LFxuICAgICAgdGFyZ2V0OiB0aGlzLmRhdGFiYXNlQ2x1c3RlcixcbiAgICAgIHZwYzogdGhpcy5kYXRhYmFzZUNsdXN0ZXIudnBjXG4gICAgfSk7XG4gIH1cblxuICBnZXRIb3N0RW5kcG9pbnQoKTogc3RyaW5nIHtcbiAgICAvLyBSZXR1cm4gcHJveHkgZW5kcG9pbnQgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgY2x1c3RlciBlbmRwb2ludFxuICAgIGlmICh0aGlzLmRhdGFiYXNlUHJveHkpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlUHJveHkuZW5kcG9pbnQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRhdGFiYXNlQ2x1c3Rlci5jbHVzdGVyRW5kcG9pbnQuaG9zdG5hbWU7XG4gIH1cblxuICBnZXRIb3N0UG9ydCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTdHJpbmcodGhpcy5wb3J0KTtcbiAgfVxuXG4gIGdldENyZWRlbnRpYWxzKCk6IFNlY3JldCB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YWJhc2VDcmVkZW50aWFscztcbiAgfVxuXG4gIGdldENmbkNsdXN0ZXIoKTogQ2ZuREJDbHVzdGVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jZm5DbHVzdGVyO1xuICB9XG5cbiAgZ2V0RGF0YWJhc2VDbHVzdGVyKCk6IERhdGFiYXNlQ2x1c3RlciB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YWJhc2VDbHVzdGVyO1xuICB9XG59XG4iXX0=
|
|
@@ -2,8 +2,8 @@ import { type Duration } from "aws-cdk-lib";
|
|
|
2
2
|
import { Construct } from "constructs";
|
|
3
3
|
import { type IVpc, type Connections, type IConnectable } from "aws-cdk-lib/aws-ec2";
|
|
4
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 DatabaseInsightsConfig } from "../../../utils/databaseTypes";
|
|
5
|
+
import { type Secret } from "../secrets/index.js";
|
|
6
|
+
import { type EngineConfig, type ProxyConfig, type CredentialsConfig, type AuroraEncryptionConfig, type AuroraWriterConfig, type AuroraReadersConfig, type DatabaseInsightsConfig } from "../../../utils/databaseTypes.js";
|
|
7
7
|
interface RdsAuroraGlobalProps {
|
|
8
8
|
vpc: IVpc;
|
|
9
9
|
databaseName: string;
|
|
@@ -1,21 +1,26 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
import { CfnOutput, Stack } from "aws-cdk-lib";
|
|
2
|
+
import { CfnGlobalCluster } from "aws-cdk-lib/aws-rds";
|
|
3
|
+
import { Construct } from "constructs";
|
|
4
|
+
import { RdsAurora } from "./rdsAurora.js";
|
|
5
|
+
import { ResourceNaming } from "../../../utils/resourceNaming.js";
|
|
6
|
+
import { toPascalCase } from "../../../utils/capitaliseString.js";
|
|
7
|
+
export class RdsAuroraGlobal extends Construct {
|
|
8
|
+
connections;
|
|
9
|
+
constructId;
|
|
10
|
+
globalCluster;
|
|
11
|
+
primaryCluster;
|
|
12
|
+
regionalCluster;
|
|
13
|
+
props;
|
|
14
|
+
currentRegion;
|
|
15
|
+
globalId;
|
|
11
16
|
constructor(scope, id, props) {
|
|
12
17
|
super(scope, id);
|
|
13
18
|
this.constructId = id;
|
|
14
19
|
this.props = props;
|
|
15
|
-
this.currentRegion =
|
|
20
|
+
this.currentRegion = Stack.of(this).region;
|
|
16
21
|
this.globalId =
|
|
17
22
|
props.globalClusterIdentifier?.toLowerCase() ||
|
|
18
|
-
|
|
23
|
+
ResourceNaming.globalClusterId(id);
|
|
19
24
|
// create clusters / global cluster depending on region
|
|
20
25
|
this.connections = this.addAuroraCluster();
|
|
21
26
|
this.addGlobalCluster();
|
|
@@ -25,7 +30,7 @@ class RdsAuroraGlobal extends constructs_1.Construct {
|
|
|
25
30
|
return this.globalId;
|
|
26
31
|
}
|
|
27
32
|
getPrimaryClusterIdentifier() {
|
|
28
|
-
return
|
|
33
|
+
return ResourceNaming.primaryClusterId(this.constructId);
|
|
29
34
|
}
|
|
30
35
|
getGlobalClusterEngineString() {
|
|
31
36
|
// Default to aurora-postgresql if no engine specified (matches existing behaviour)
|
|
@@ -81,7 +86,7 @@ class RdsAuroraGlobal extends constructs_1.Construct {
|
|
|
81
86
|
sourceIdentifier = primaryL1.ref;
|
|
82
87
|
}
|
|
83
88
|
}
|
|
84
|
-
this.globalCluster = new
|
|
89
|
+
this.globalCluster = new CfnGlobalCluster(this, `${this.props.databaseName}GlobalCluster`, {
|
|
85
90
|
globalClusterIdentifier: this.globalId,
|
|
86
91
|
sourceDbClusterIdentifier: sourceIdentifier
|
|
87
92
|
});
|
|
@@ -124,7 +129,7 @@ class RdsAuroraGlobal extends constructs_1.Construct {
|
|
|
124
129
|
};
|
|
125
130
|
if (this.props.primaryRegion === this.currentRegion) {
|
|
126
131
|
// primary
|
|
127
|
-
this.primaryCluster = new
|
|
132
|
+
this.primaryCluster = new RdsAurora(this, `${this.props.databaseName}Primary`, {
|
|
128
133
|
vpc: this.props.vpc,
|
|
129
134
|
databaseName: this.props.databaseName,
|
|
130
135
|
clusterIdentifier: this.getPrimaryClusterIdentifier(),
|
|
@@ -139,10 +144,10 @@ class RdsAuroraGlobal extends constructs_1.Construct {
|
|
|
139
144
|
// secondary region
|
|
140
145
|
// Pass databaseName for resource naming, but flag as global secondary
|
|
141
146
|
// This prevents setting credentials and defaultDatabaseName which are inherited from primary
|
|
142
|
-
this.regionalCluster = new
|
|
147
|
+
this.regionalCluster = new RdsAurora(this, `${this.props.databaseName}Regional`, {
|
|
143
148
|
vpc: this.props.vpc,
|
|
144
149
|
databaseName: this.props.databaseName,
|
|
145
|
-
clusterIdentifier:
|
|
150
|
+
clusterIdentifier: ResourceNaming.secondaryClusterId(this.constructId, this.currentRegion),
|
|
146
151
|
isGlobalSecondary: true,
|
|
147
152
|
// Secondary doesn't create credentials (uses replicated secret)
|
|
148
153
|
...commonConfig
|
|
@@ -160,8 +165,8 @@ class RdsAuroraGlobal extends constructs_1.Construct {
|
|
|
160
165
|
return this.regionalCluster.connections;
|
|
161
166
|
}
|
|
162
167
|
addOutputs() {
|
|
163
|
-
const outputName =
|
|
164
|
-
new
|
|
168
|
+
const outputName = toPascalCase(this.props.databaseName);
|
|
169
|
+
new CfnOutput(this, `${outputName}GlobalClusterIdentifierOutput`, {
|
|
165
170
|
value: this.globalId,
|
|
166
171
|
exportName: `${outputName}GlobalClusterIdentifier`
|
|
167
172
|
});
|
|
@@ -188,5 +193,3 @@ class RdsAuroraGlobal extends constructs_1.Construct {
|
|
|
188
193
|
throw new Error("No Aurora cluster available to return port from");
|
|
189
194
|
}
|
|
190
195
|
}
|
|
191
|
-
exports.RdsAuroraGlobal = RdsAuroraGlobal;
|
|
192
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmRzQXVyb3JhR2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3MvZGF0YWJhc2UvcmRzQXVyb3JhR2xvYmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUFnRjtBQUNoRixpREFBMEU7QUFDMUUsMkNBQXVDO0FBT3ZDLDJDQUF3QztBQVd4QyxrRUFBK0Q7QUFDL0Qsc0VBQStEO0FBdUQvRCxNQUFhLGVBQWdCLFNBQVEsc0JBQVM7SUFXNUMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUEyQjtRQUNuRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxhQUFhLEdBQUcsbUJBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQzNDLElBQUksQ0FBQyxRQUFRO1lBQ1gsS0FBSyxDQUFDLHVCQUF1QixFQUFFLFdBQVcsRUFBRTtnQkFDNUMsK0JBQWMsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFckMsdURBQXVEO1FBQ3ZELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDM0MsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRCwwQkFBMEI7UUFDeEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCwyQkFBMkI7UUFDekIsT0FBTywrQkFBYyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRU8sNEJBQTRCO1FBQ2xDLG1GQUFtRjtRQUNuRixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNO1lBQUUsT0FBTyxtQkFBbUIsQ0FBQztRQUVuRCx1RUFBdUU7UUFDdkUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFFakMsd0VBQXdFO1FBQ3hFLHdGQUF3RjtRQUN4RixnRkFBZ0Y7UUFDaEYsbUZBQW1GO1FBQ25GLE1BQU0sWUFBWSxHQUFHLE1BQTRDLENBQUM7UUFDbEUsSUFBSSxVQUFVLEdBQ1osWUFBWSxDQUFDLFVBQVUsSUFBSSxZQUFZLENBQUMsTUFBTSxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUM7UUFFdEUsdUVBQXVFO1FBQ3ZFLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDL0IsVUFBVSxHQUFHLE1BQU0sQ0FBQztRQUN0QixDQUFDO1FBRUQsZ0RBQWdEO1FBQ2hELElBQUksQ0FBQyxVQUFVLElBQUksT0FBTyxZQUFZLENBQUMsUUFBUSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQy9ELElBQUksQ0FBQztnQkFDSCxVQUFVLEdBQUcsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3ZDLENBQUM7WUFBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO2dCQUNaLHFFQUFxRTtnQkFDckUsVUFBVSxHQUFHLFNBQVMsQ0FBQztZQUN6QixDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksT0FBTyxVQUFVLEtBQUssUUFBUTtZQUFFLE9BQU8sbUJBQW1CLENBQUM7UUFFL0QseUdBQXlHO1FBQ3pHLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRS9ELHNGQUFzRjtRQUN0RixJQUFJLFVBQVUsS0FBSyxRQUFRO1lBQUUsT0FBTyxtQkFBbUIsQ0FBQztRQUV4RCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRUQseURBQXlEO0lBQ2pELGdCQUFnQjtRQUN0QixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxLQUFLLElBQUksQ0FBQyxhQUFhO1lBQUUsT0FBTztRQUU1RCxnRkFBZ0Y7UUFDaEYsNEVBQTRFO1FBQzVFLDZEQUE2RDtRQUM3RCxJQUFJLGdCQUFnQixHQUNsQixJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztRQUNyQyxJQUFJLFNBQW1DLENBQUM7UUFFeEMsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEIsZ0ZBQWdGO1lBQ2hGLG9GQUFvRjtZQUNwRixTQUFTO2dCQUNQLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYTtvQkFDakMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN0QyxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNkLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUM7WUFDbkMsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksMEJBQWdCLENBQ3ZDLElBQUksRUFDSixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxlQUFlLEVBQ3pDO1lBQ0UsdUJBQXVCLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdEMseUJBQXlCLEVBQUUsZ0JBQWdCO1NBQzVDLENBQ0YsQ0FBQztRQUVGLGlGQUFpRjtRQUNqRixJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2Qsd0ZBQXdGO1lBQ3hGLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzNDLGdGQUFnRjtZQUNoRixrRkFBa0Y7WUFDbEYsNEVBQTRFO1lBQzVFLG9FQUFvRTtZQUNwRSx1RUFBdUU7WUFDdkUsa0VBQWtFO1lBQ2xFLG9FQUFvRTtZQUNwRSw0REFBNEQ7WUFDNUQsMkRBQTJEO1FBQzdELENBQUM7SUFDSCxDQUFDO0lBRUQsaUVBQWlFO0lBQ3pELGdCQUFnQjtRQUN0QixxRUFBcUU7UUFDckUsTUFBTSxZQUFZLEdBQUc7WUFDbkIsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTTtZQUN6QixZQUFZLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZO1lBQ3JDLHlCQUF5QjtZQUN6QixNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNO1lBQ3pCLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU87WUFDM0Isd0JBQXdCO1lBQ3hCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUs7WUFDdkIsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVTtZQUNqQyw0QkFBNEI7WUFDNUIsZUFBZSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZTtZQUMzQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQjtZQUNqRCwwQkFBMEIsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLDBCQUEwQjtZQUNqRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJO1lBQ3JCLGdCQUFnQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCO1lBQzdDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCO1lBQ2pELGtCQUFrQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCO1lBQ2pELGdCQUFnQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCO1NBQzlDLENBQUM7UUFFRixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxLQUFLLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNwRCxVQUFVO1lBQ1YsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLHFCQUFTLENBQ2pDLElBQUksRUFDSixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxTQUFTLEVBQ25DO2dCQUNFLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUc7Z0JBQ25CLFlBQVksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVk7Z0JBQ3JDLGlCQUFpQixFQUFFLElBQUksQ0FBQywyQkFBMkIsRUFBRTtnQkFDckQsaURBQWlEO2dCQUNqRCxvQkFBb0IsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQjtnQkFDakQscUNBQXFDO2dCQUNyQyxXQUFXLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXO2dCQUNuQyxHQUFHLFlBQVk7YUFDaEIsQ0FDRixDQUFDO1lBQ0YsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQztRQUN6QyxDQUFDO1FBRUQsbUJBQW1CO1FBQ25CLHNFQUFzRTtRQUN0RSw2RkFBNkY7UUFDN0YsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLHFCQUFTLENBQ2xDLElBQUksRUFDSixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxVQUFVLEVBQ3BDO1lBQ0UsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRztZQUNuQixZQUFZLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZO1lBQ3JDLGlCQUFpQixFQUFFLCtCQUFjLENBQUMsa0JBQWtCLENBQ2xELElBQUksQ0FBQyxXQUFXLEVBQ2hCLElBQUksQ0FBQyxhQUFhLENBQ25CO1lBQ0QsaUJBQWlCLEVBQUUsSUFBSTtZQUN2QixnRUFBZ0U7WUFDaEUsR0FBRyxZQUFZO1NBQ2hCLENBQ0YsQ0FBQztRQUVGLHFGQUFxRjtRQUNyRixNQUFNLFVBQVUsR0FDZCxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWE7WUFDbEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN2QyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2YsVUFBVSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7WUFFbkQsdUNBQXVDO1lBQ3ZDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQywyQkFBMkIsRUFBRSxDQUFDO2dCQUMzQyxVQUFVLENBQUMsMkJBQTJCLEdBQUcsSUFBSSxDQUFDO1lBQ2hELENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQztJQUMxQyxDQUFDO0lBRU8sVUFBVTtRQUNoQixNQUFNLFVBQVUsR0FBRyxJQUFBLCtCQUFZLEVBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN6RCxJQUFJLHVCQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsVUFBVSwrQkFBK0IsRUFBRTtZQUNoRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDcEIsVUFBVSxFQUFFLEdBQUcsVUFBVSx5QkFBeUI7U0FDbkQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLElBQUksQ0FBQyxjQUFjO1lBQUUsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3JFLElBQUksSUFBSSxDQUFDLGVBQWU7WUFBRSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkUsTUFBTSxJQUFJLEtBQUssQ0FBQyx3REFBd0QsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxJQUFJLENBQUMsY0FBYztZQUFFLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN0RSxJQUFJLElBQUksQ0FBQyxlQUFlO1lBQUUsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hFLE1BQU0sSUFBSSxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLGNBQWM7WUFBRSxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbEUsSUFBSSxJQUFJLENBQUMsZUFBZTtZQUFFLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNwRSxNQUFNLElBQUksS0FBSyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7SUFDckUsQ0FBQztDQUNGO0FBaE9ELDBDQWdPQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENmbk91dHB1dCwgdHlwZSBEdXJhdGlvbiwgdHlwZSBJUmVzb2x2YWJsZSwgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IENmbkdsb2JhbENsdXN0ZXIsIHR5cGUgQ2ZuREJDbHVzdGVyIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yZHNcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQge1xuICB0eXBlIElWcGMsXG4gIHR5cGUgQ29ubmVjdGlvbnMsXG4gIHR5cGUgSUNvbm5lY3RhYmxlXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCI7XG5pbXBvcnQgeyB0eXBlIElDbHVzdGVyRW5naW5lIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yZHNcIjtcbmltcG9ydCB7IFJkc0F1cm9yYSB9IGZyb20gXCIuL3Jkc0F1cm9yYVwiO1xuaW1wb3J0IHsgdHlwZSBTZWNyZXQgfSBmcm9tIFwiLi4vc2VjcmV0c1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBFbmdpbmVDb25maWcsXG4gIHR5cGUgUHJveHlDb25maWcsXG4gIHR5cGUgQ3JlZGVudGlhbHNDb25maWcsXG4gIHR5cGUgQXVyb3JhRW5jcnlwdGlvbkNvbmZpZyxcbiAgdHlwZSBBdXJvcmFXcml0ZXJDb25maWcsXG4gIHR5cGUgQXVyb3JhUmVhZGVyc0NvbmZpZyxcbiAgdHlwZSBEYXRhYmFzZUluc2lnaHRzQ29uZmlnXG59IGZyb20gXCIuLi8uLi8uLi91dGlscy9kYXRhYmFzZVR5cGVzXCI7XG5pbXBvcnQgeyBSZXNvdXJjZU5hbWluZyB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9yZXNvdXJjZU5hbWluZ1wiO1xuaW1wb3J0IHsgdG9QYXNjYWxDYXNlIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2NhcGl0YWxpc2VTdHJpbmdcIjtcblxuaW50ZXJmYWNlIFJkc0F1cm9yYUdsb2JhbFByb3BzIHtcbiAgdnBjOiBJVnBjO1xuICBkYXRhYmFzZU5hbWU6IHN0cmluZztcbiAgLyoqIFByaW1hcnkgcmVnaW9uIHdoZXJlIHRoZSBpbml0aWFsIGNsdXN0ZXIgJiBnbG9iYWwgY2x1c3RlciByZXNvdXJjZSBhcmUgY3JlYXRlZCAqL1xuICBwcmltYXJ5UmVnaW9uOiBzdHJpbmc7XG4gIC8qKiBTZWNvbmRhcnkgcmVnaW9ucyB3aGVyZSBBdXJvcmEgY2x1c3RlcnMgd2lsbCBiZSBkZXBsb3llZCAoZm9yIHNlY3JldCByZXBsaWNhdGlvbikgKi9cbiAgc2Vjb25kYXJ5UmVnaW9ucz86IHN0cmluZ1tdO1xuICAvKiogT3B0aW9uYWwgZGV0ZXJtaW5pc3RpYyBpZCBmb3IgdGhlIGdsb2JhbCBjbHVzdGVyIChzaG91bGQgYmUgc2hhcmVkIGFjcm9zcyBzdGFja3MvcmVnaW9ucykgKi9cbiAgZ2xvYmFsQ2x1c3RlcklkZW50aWZpZXI/OiBzdHJpbmc7XG4gIC8qKiBPcHRpb25hbCBlbmdpbmUgdG8gZm9yd2FyZCB0byB0aGUgdW5kZXJseWluZyBjbHVzdGVyICovXG4gIGVuZ2luZT86IElDbHVzdGVyRW5naW5lO1xuICAvKiogRW5naW5lLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gKHVzZXJuYW1lLCBTU0wgcGFyYW1zLCByb3RhdGlvbiBhcHApICovXG4gIGVuZ2luZUNvbmZpZz86IEVuZ2luZUNvbmZpZztcbiAgLyoqIEVuYWJsZSB3cml0ZSBmb3J3YXJkaW5nIG9uIHNlY29uZGFyeSBjbHVzdGVycyB0byBmb3J3YXJkIHdyaXRlcyB0byBwcmltYXJ5IHJlZ2lvbiAqL1xuICBlbmFibGVHbG9iYWxXcml0ZUZvcndhcmRpbmc/OiBib29sZWFuO1xuXG4gIC8vIEluc3RhbmNlIGNvbmZpZ3VyYXRpb24gKGFwcGxpZWQgdG8gYWxsIHJlZ2lvbmFsIGNsdXN0ZXJzKVxuICAvKiogV3JpdGVyIGluc3RhbmNlIGNvbmZpZ3VyYXRpb24gKi9cbiAgd3JpdGVyPzogQXVyb3JhV3JpdGVyQ29uZmlnO1xuICAvKipcbiAgICogUmVhZGVyIGluc3RhbmNlcyBjb25maWd1cmF0aW9uLlxuICAgKiAtIGB7IGNvdW50OiBOIH1gIC0gU2ltcGxlOiBOIHJlYWRlcnMgd2l0aCBkZWZhdWx0c1xuICAgKiAtIGB7IGluc3RhbmNlczogWy4uLl0gfWAgLSBBZHZhbmNlZDogcGVyLXJlYWRlciBjb25maWdcbiAgICogLSBgZmFsc2VgIC0gRXhwbGljaXRseSBkaXNhYmxlIHJlYWRlcnMgKHdyaXRlci1vbmx5IGNsdXN0ZXIpXG4gICAqIC0gT21pdCAtIERlZmF1bHQ6IDEgcmVhZGVyXG4gICAqL1xuICByZWFkZXJzPzogQXVyb3JhUmVhZGVyc0NvbmZpZyB8IGZhbHNlO1xuXG4gIC8vIE5lc3RlZCBjb25maWd1cmF0aW9ucyAocHJlc2VuY2UtYmFzZWQpXG4gIC8qKiBSRFMgUHJveHkgY29uZmlndXJhdGlvbi4gT21pdCA9IG5vIHByb3h5LCB7fSA9IGRlZmF1bHRzLCBmYWxzZSA9IGRpc2FibGVkICovXG4gIHByb3h5PzogUHJveHlDb25maWcgfCBmYWxzZTtcbiAgLyoqIENyZWRlbnRpYWxzIGNvbmZpZ3VyYXRpb24gaW5jbHVkaW5nIHVzZXJuYW1lIGFuZCBzZWNyZXQgcm90YXRpb24gKi9cbiAgY3JlZGVudGlhbHM/OiBDcmVkZW50aWFsc0NvbmZpZztcbiAgLyoqIEVuY3J5cHRpb24gY29uZmlndXJhdGlvbiAqL1xuICBlbmNyeXB0aW9uPzogQXVyb3JhRW5jcnlwdGlvbkNvbmZpZztcblxuICAvLyBPcGVyYXRpb25hbCBjb25maWd1cmF0aW9uXG4gIC8qKiBCYWNrdXAgcmV0ZW50aW9uIGluIGRheXMuIERlZmF1bHQ6IDE0ICovXG4gIGJhY2t1cFJldGVudGlvbj86IG51bWJlcjtcbiAgLyoqIENsb3VkV2F0Y2ggbW9uaXRvcmluZyBpbnRlcnZhbC4gRGVmYXVsdDogMSBtaW51dGUgKi9cbiAgbW9uaXRvcmluZ0ludGVydmFsPzogRHVyYXRpb247XG4gIC8qKiBQcmVmZXJyZWQgbWFpbnRlbmFuY2Ugd2luZG93LiBEZWZhdWx0OiBcIlNhdDoxMjozMC1TYXQ6MjA6MzBcIiAqL1xuICBwcmVmZXJyZWRNYWludGVuYW5jZVdpbmRvdz86IHN0cmluZztcbiAgLyoqIERhdGFiYXNlIHBvcnQuIERlZmF1bHQ6IFJEU19ERUZBVUxUUy5ERUZBVUxUX1BPUlQgKi9cbiAgcG9ydD86IG51bWJlcjtcbiAgZGF0YWJhc2VJbnNpZ2h0cz86IERhdGFiYXNlSW5zaWdodHNDb25maWcgfCBmYWxzZTtcbiAgZGVsZXRpb25Qcm90ZWN0aW9uPzogYm9vbGVhbjtcbiAgLyoqIEFSTiBvciBpZGVudGlmaWVyIG9mIERCIGNsdXN0ZXIgc25hcHNob3QgdG8gcmVzdG9yZSBmcm9tICovXG4gIHNuYXBzaG90SWRlbnRpZmllcj86IHN0cmluZztcbiAgLyoqIFVzZXJuYW1lIGZyb20gdGhlIHNuYXBzaG90IChyZXF1aXJlZCB3aGVuIHJlc3RvcmluZyBmcm9tIHNuYXBzaG90IHRvIHJlc2V0IHBhc3N3b3JkKSAqL1xuICBzbmFwc2hvdFVzZXJuYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgUmRzQXVyb3JhR2xvYmFsIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSUNvbm5lY3RhYmxlIHtcbiAgcHVibGljIGNvbm5lY3Rpb25zOiBDb25uZWN0aW9ucztcblxuICBwcml2YXRlIHJlYWRvbmx5IGNvbnN0cnVjdElkOiBzdHJpbmc7XG4gIHByaXZhdGUgZ2xvYmFsQ2x1c3Rlcj86IENmbkdsb2JhbENsdXN0ZXI7XG4gIHByaXZhdGUgcHJpbWFyeUNsdXN0ZXI/OiBSZHNBdXJvcmE7XG4gIHByaXZhdGUgcmVnaW9uYWxDbHVzdGVyPzogUmRzQXVyb3JhO1xuICBwcml2YXRlIHByb3BzOiBSZHNBdXJvcmFHbG9iYWxQcm9wcztcbiAgcHJpdmF0ZSBjdXJyZW50UmVnaW9uOiBzdHJpbmc7XG4gIHByaXZhdGUgZ2xvYmFsSWQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUmRzQXVyb3JhR2xvYmFsUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5jb25zdHJ1Y3RJZCA9IGlkO1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgICB0aGlzLmN1cnJlbnRSZWdpb24gPSBTdGFjay5vZih0aGlzKS5yZWdpb247XG4gICAgdGhpcy5nbG9iYWxJZCA9XG4gICAgICBwcm9wcy5nbG9iYWxDbHVzdGVySWRlbnRpZmllcj8udG9Mb3dlckNhc2UoKSB8fFxuICAgICAgUmVzb3VyY2VOYW1pbmcuZ2xvYmFsQ2x1c3RlcklkKGlkKTtcblxuICAgIC8vIGNyZWF0ZSBjbHVzdGVycyAvIGdsb2JhbCBjbHVzdGVyIGRlcGVuZGluZyBvbiByZWdpb25cbiAgICB0aGlzLmNvbm5lY3Rpb25zID0gdGhpcy5hZGRBdXJvcmFDbHVzdGVyKCk7XG4gICAgdGhpcy5hZGRHbG9iYWxDbHVzdGVyKCk7XG4gICAgdGhpcy5hZGRPdXRwdXRzKCk7XG4gIH1cblxuICBnZXRHbG9iYWxDbHVzdGVySWRlbnRpZmllcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdsb2JhbElkO1xuICB9XG5cbiAgZ2V0UHJpbWFyeUNsdXN0ZXJJZGVudGlmaWVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFJlc291cmNlTmFtaW5nLnByaW1hcnlDbHVzdGVySWQodGhpcy5jb25zdHJ1Y3RJZCk7XG4gIH1cblxuICBwcml2YXRlIGdldEdsb2JhbENsdXN0ZXJFbmdpbmVTdHJpbmcoKTogc3RyaW5nIHtcbiAgICAvLyBEZWZhdWx0IHRvIGF1cm9yYS1wb3N0Z3Jlc3FsIGlmIG5vIGVuZ2luZSBzcGVjaWZpZWQgKG1hdGNoZXMgZXhpc3RpbmcgYmVoYXZpb3VyKVxuICAgIGlmICghdGhpcy5wcm9wcy5lbmdpbmUpIHJldHVybiBcImF1cm9yYS1wb3N0Z3Jlc3FsXCI7XG5cbiAgICAvLyBIYW5kbGUgZGlmZmVyZW50IGVuZ2luZSBmb3JtYXRzIHNhZmVseSB1c2luZyB1bmtub3duIGFuZCB0eXBlIGd1YXJkc1xuICAgIGNvbnN0IGVuZ2luZSA9IHRoaXMucHJvcHMuZW5naW5lO1xuXG4gICAgLy8gQ0RLJ3MgSUNsdXN0ZXJFbmdpbmUgaW50ZXJmYWNlIGRvZXMgbm90IGV4cG9zZSBlbmdpbmVUeXBlL2VuZ2luZS9uYW1lXG4gICAgLy8gcHJvcGVydGllcyBkaXJlY3RseSwgYnV0IHRoZSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbnMgKGUuZy4gQXVyb3JhTXlzcWxFbmdpbmVWZXJzaW9uKVxuICAgIC8vIGRvIGhhdmUgdGhlbSBhdCBydW50aW1lLiBDYXN0IHRocm91Z2ggdW5rbm93biB0byBwcm9iZSB0aGVzZSBpbnRlcm5hbCBmaWVsZHMuXG4gICAgLy8gQ0RLIGVuZ2luZSBpbnRlcm5hbHMg4oCUIG1heSBicmVhayBvbiBDREsgdXBncmFkZXMuIFNlZSByZHNBdXJvcmFHbG9iYWwgdW5pdCB0ZXN0LlxuICAgIGNvbnN0IGVuZ2luZVJlY29yZCA9IGVuZ2luZSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGxldCBlbmdpbmVUeXBlOiB1bmtub3duID1cbiAgICAgIGVuZ2luZVJlY29yZC5lbmdpbmVUeXBlID8/IGVuZ2luZVJlY29yZC5lbmdpbmUgPz8gZW5naW5lUmVjb3JkLm5hbWU7XG5cbiAgICAvLyBJZiB0aGUgZW5naW5lIHdhcyBwcm92aWRlZCBhcyBhIHJhdyBzdHJpbmcgKHVubGlrZWx5IGJ1dCBzdXBwb3J0IGl0KVxuICAgIGlmICh0eXBlb2YgZW5naW5lID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBlbmdpbmVUeXBlID0gZW5naW5lO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIHRvIHRvU3RyaW5nKCkgZm9yIFRva2VuLWxpa2Ugb2JqZWN0c1xuICAgIGlmICghZW5naW5lVHlwZSAmJiB0eXBlb2YgZW5naW5lUmVjb3JkLnRvU3RyaW5nID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGVuZ2luZVR5cGUgPSBlbmdpbmVSZWNvcmQudG9TdHJpbmcoKTtcbiAgICAgIH0gY2F0Y2ggKF9lKSB7XG4gICAgICAgIC8vIHRvU3RyaW5nKCkgbWF5IHRocm93IG9uIENESyBUb2tlbiBvYmplY3RzIOKAlCBmYWxsIGJhY2sgdG8gdW5kZWZpbmVkXG4gICAgICAgIGVuZ2luZVR5cGUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBlbmdpbmVUeXBlICE9PSBcInN0cmluZ1wiKSByZXR1cm4gXCJhdXJvcmEtcG9zdGdyZXNxbFwiO1xuXG4gICAgLy8gTm9ybWFsaXNlIGNvbW1vbiBmb3JtczogQVVST1JBX1BPU1RHUkVTUUwgLT4gYXVyb3JhLXBvc3RncmVzcWwsIGF1cm9yYV9wb3N0Z3Jlc3FsIC0+IGF1cm9yYS1wb3N0Z3Jlc3FsXG4gICAgY29uc3Qgbm9ybWFsaXNlZCA9IGVuZ2luZVR5cGUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9fL2csIFwiLVwiKTtcblxuICAgIC8vIElmIHRoZSBub3JtYWxpc2VkIHZhbHVlIGlzIGp1c3QgJ2F1cm9yYScsIHByZWZlciB0aGUgbW9yZSBzcGVjaWZpYyBwb3N0Z3JlcyBkZWZhdWx0XG4gICAgaWYgKG5vcm1hbGlzZWQgPT09IFwiYXVyb3JhXCIpIHJldHVybiBcImF1cm9yYS1wb3N0Z3Jlc3FsXCI7XG5cbiAgICByZXR1cm4gbm9ybWFsaXNlZDtcbiAgfVxuXG4gIC8vIGNyZWF0ZSB0aGUgQ2ZuR2xvYmFsQ2x1c3RlciBvbmx5IGluIHRoZSBwcmltYXJ5IHJlZ2lvblxuICBwcml2YXRlIGFkZEdsb2JhbENsdXN0ZXIoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMucHJpbWFyeVJlZ2lvbiAhPT0gdGhpcy5jdXJyZW50UmVnaW9uKSByZXR1cm47XG5cbiAgICAvLyBjcmVhdGUgdGhlIGdsb2JhbCBjbHVzdGVyIHJlc291cmNlIHJlZmVyZW5jaW5nIHRoZSBwcmltYXJ5IGNsdXN0ZXIgaWRlbnRpZmllclxuICAgIC8vIFByZWZlciByZWZlcmVuY2luZyB0aGUgTDEgREJDbHVzdGVyIFJlZiBzbyBDbG91ZEZvcm1hdGlvbiB3aWxsIGNyZWF0ZSB0aGVcbiAgICAvLyBEQkNsdXN0ZXIgZmlyc3QgYW5kIHdlIGF2b2lkIGlkZW50aWZpZXItY2FzaW5nIG1pc21hdGNoZXMuXG4gICAgbGV0IHNvdXJjZUlkZW50aWZpZXI6IHN0cmluZyB8IElSZXNvbHZhYmxlID1cbiAgICAgIHRoaXMuZ2V0UHJpbWFyeUNsdXN0ZXJJZGVudGlmaWVyKCk7XG4gICAgbGV0IHByaW1hcnlMMTogQ2ZuREJDbHVzdGVyIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKHRoaXMucHJpbWFyeUNsdXN0ZXIpIHtcbiAgICAgIC8vIFVzZSB0aGUgaGVscGVyIG9uIFJkc0F1cm9yYSB0byBnZXQgdGhlIHVuZGVybHlpbmcgTDEgREJDbHVzdGVyIChtb3JlIHJlbGlhYmxlXG4gICAgICAvLyB0aGFuIHJlbHlpbmcgb24gbm9kZS5kZWZhdWx0Q2hpbGQgd2hpY2ggY2FuIHZhcnkgZGVwZW5kaW5nIG9uIGNvbnN0cnVjdCBvcmRlcmluZylcbiAgICAgIHByaW1hcnlMMSA9XG4gICAgICAgIHRoaXMucHJpbWFyeUNsdXN0ZXIuZ2V0Q2ZuQ2x1c3RlciAmJlxuICAgICAgICB0aGlzLnByaW1hcnlDbHVzdGVyLmdldENmbkNsdXN0ZXIoKTtcbiAgICAgIGlmIChwcmltYXJ5TDEpIHtcbiAgICAgICAgc291cmNlSWRlbnRpZmllciA9IHByaW1hcnlMMS5yZWY7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5nbG9iYWxDbHVzdGVyID0gbmV3IENmbkdsb2JhbENsdXN0ZXIoXG4gICAgICB0aGlzLFxuICAgICAgYCR7dGhpcy5wcm9wcy5kYXRhYmFzZU5hbWV9R2xvYmFsQ2x1c3RlcmAsXG4gICAgICB7XG4gICAgICAgIGdsb2JhbENsdXN0ZXJJZGVudGlmaWVyOiB0aGlzLmdsb2JhbElkLFxuICAgICAgICBzb3VyY2VEYkNsdXN0ZXJJZGVudGlmaWVyOiBzb3VyY2VJZGVudGlmaWVyXG4gICAgICB9XG4gICAgKTtcblxuICAgIC8vIGVuc3VyZSB0aGUgdW5kZXJseWluZyBwcmltYXJ5IERCQ2x1c3RlciBMMSBoYXMgdGhlIGdsb2JhbENsdXN0ZXJJZGVudGlmaWVyIHNldFxuICAgIGlmIChwcmltYXJ5TDEpIHtcbiAgICAgIC8vIE1ha2UgdGhlIENGTiBkZXBlbmRlbmN5IGV4cGxpY2l0IHNvIHRoZSBEQkNsdXN0ZXIgaXMgY3JlYXRlZCBiZWZvcmUgdGhlIEdsb2JhbENsdXN0ZXJcbiAgICAgIHRoaXMuZ2xvYmFsQ2x1c3Rlci5hZGREZXBlbmRzT24ocHJpbWFyeUwxKTtcbiAgICAgIC8vIElNUE9SVEFOVDogZG8gTk9UIHNldCB0aGUgcHJpbWFyeSBEQkNsdXN0ZXIncyBgZ2xvYmFsQ2x1c3RlcklkZW50aWZpZXJgIGhlcmUuXG4gICAgICAvLyBJZiB3ZSBzZXQgdGhlIHByaW1hcnkgREJDbHVzdGVyIHRvIHJlZmVyZW5jZSB0aGUgZ2xvYmFsIGNsdXN0ZXIsIENsb3VkRm9ybWF0aW9uXG4gICAgICAvLyB3aWxsIGF0dGVtcHQgdG8gdmFsaWRhdGUgdGhhdCB0aGUgZ2xvYmFsIGNsdXN0ZXIgZXhpc3RzIHdoZW4gY3JlYXRpbmcgdGhlXG4gICAgICAvLyBEQkNsdXN0ZXIg4oCUIGJ1dCB0aGUgZ2xvYmFsIGNsdXN0ZXIgaXMgY3JlYXRlZCBhZnRlcndhcmQgKHdlIGFkZCBhXG4gICAgICAvLyBkZXBlbmRzT24pLCB3aGljaCBjYXVzZXMgYSBcIkdsb2JhbCBjbHVzdGVyIC4uLiBub3QgZm91bmRcIiBlcnJvci4gVGhlXG4gICAgICAvLyBjb3JyZWN0IG9yZGVyIGlzIHRvIGNyZWF0ZSB0aGUgREJDbHVzdGVyIGZpcnN0LCB0aGVuIGNyZWF0ZSB0aGVcbiAgICAgIC8vIENmbkdsb2JhbENsdXN0ZXIgd2l0aCBgc291cmNlRGJDbHVzdGVySWRlbnRpZmllcmAgcG9pbnRpbmcgYXQgdGhlXG4gICAgICAvLyBwcmltYXJ5IGNsdXN0ZXIncyBSZWYuIExlYXZpbmcgdGhlIHByaW1hcnkgTDEgd2l0aG91dCB0aGVcbiAgICAgIC8vIGBnbG9iYWxDbHVzdGVySWRlbnRpZmllcmAgYXZvaWRzIHRoZSBjaXJjdWxhciByZWZlcmVuY2UuXG4gICAgfVxuICB9XG5cbiAgLy8gY3JlYXRlIGFuIEF1cm9yYSBjbHVzdGVyIGluIHRoaXMgcmVnaW9uIChwcmltYXJ5IG9yIHNlY29uZGFyeSlcbiAgcHJpdmF0ZSBhZGRBdXJvcmFDbHVzdGVyKCk6IENvbm5lY3Rpb25zIHtcbiAgICAvLyBDb21tb24gY29uZmlndXJhdGlvbiBzaGFyZWQgYmV0d2VlbiBwcmltYXJ5IGFuZCBzZWNvbmRhcnkgY2x1c3RlcnNcbiAgICBjb25zdCBjb21tb25Db25maWcgPSB7XG4gICAgICBlbmdpbmU6IHRoaXMucHJvcHMuZW5naW5lLFxuICAgICAgZW5naW5lQ29uZmlnOiB0aGlzLnByb3BzLmVuZ2luZUNvbmZpZyxcbiAgICAgIC8vIEluc3RhbmNlIGNvbmZpZ3VyYXRpb25cbiAgICAgIHdyaXRlcjogdGhpcy5wcm9wcy53cml0ZXIsXG4gICAgICByZWFkZXJzOiB0aGlzLnByb3BzLnJlYWRlcnMsXG4gICAgICAvLyBOZXN0ZWQgY29uZmlndXJhdGlvbnNcbiAgICAgIHByb3h5OiB0aGlzLnByb3BzLnByb3h5LFxuICAgICAgZW5jcnlwdGlvbjogdGhpcy5wcm9wcy5lbmNyeXB0aW9uLFxuICAgICAgLy8gT3BlcmF0aW9uYWwgY29uZmlndXJhdGlvblxuICAgICAgYmFja3VwUmV0ZW50aW9uOiB0aGlzLnByb3BzLmJhY2t1cFJldGVudGlvbixcbiAgICAgIG1vbml0b3JpbmdJbnRlcnZhbDogdGhpcy5wcm9wcy5tb25pdG9yaW5nSW50ZXJ2YWwsXG4gICAgICBwcmVmZXJyZWRNYWludGVuYW5jZVdpbmRvdzogdGhpcy5wcm9wcy5wcmVmZXJyZWRNYWludGVuYW5jZVdpbmRvdyxcbiAgICAgIHBvcnQ6IHRoaXMucHJvcHMucG9ydCxcbiAgICAgIGRhdGFiYXNlSW5zaWdodHM6IHRoaXMucHJvcHMuZGF0YWJhc2VJbnNpZ2h0cyxcbiAgICAgIGRlbGV0aW9uUHJvdGVjdGlvbjogdGhpcy5wcm9wcy5kZWxldGlvblByb3RlY3Rpb24sXG4gICAgICBzbmFwc2hvdElkZW50aWZpZXI6IHRoaXMucHJvcHMuc25hcHNob3RJZGVudGlmaWVyLFxuICAgICAgc25hcHNob3RVc2VybmFtZTogdGhpcy5wcm9wcy5zbmFwc2hvdFVzZXJuYW1lXG4gICAgfTtcblxuICAgIGlmICh0aGlzLnByb3BzLnByaW1hcnlSZWdpb24gPT09IHRoaXMuY3VycmVudFJlZ2lvbikge1xuICAgICAgLy8gcHJpbWFyeVxuICAgICAgdGhpcy5wcmltYXJ5Q2x1c3RlciA9IG5ldyBSZHNBdXJvcmEoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGAke3RoaXMucHJvcHMuZGF0YWJhc2VOYW1lfVByaW1hcnlgLFxuICAgICAgICB7XG4gICAgICAgICAgdnBjOiB0aGlzLnByb3BzLnZwYyxcbiAgICAgICAgICBkYXRhYmFzZU5hbWU6IHRoaXMucHJvcHMuZGF0YWJhc2VOYW1lLFxuICAgICAgICAgIGNsdXN0ZXJJZGVudGlmaWVyOiB0aGlzLmdldFByaW1hcnlDbHVzdGVySWRlbnRpZmllcigpLFxuICAgICAgICAgIC8vIEVuYWJsZSBzZWNyZXQgcmVwbGljYXRpb24gdG8gc2Vjb25kYXJ5IHJlZ2lvbnNcbiAgICAgICAgICBzZWNyZXRSZXBsaWNhUmVnaW9uczogdGhpcy5wcm9wcy5zZWNvbmRhcnlSZWdpb25zLFxuICAgICAgICAgIC8vIFByaW1hcnkgcmVnaW9uIGNyZWF0ZXMgY3JlZGVudGlhbHNcbiAgICAgICAgICBjcmVkZW50aWFsczogdGhpcy5wcm9wcy5jcmVkZW50aWFscyxcbiAgICAgICAgICAuLi5jb21tb25Db25maWdcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHJldHVybiB0aGlzLnByaW1hcnlDbHVzdGVyLmNvbm5lY3Rpb25zO1xuICAgIH1cblxuICAgIC8vIHNlY29uZGFyeSByZWdpb25cbiAgICAvLyBQYXNzIGRhdGFiYXNlTmFtZSBmb3IgcmVzb3VyY2UgbmFtaW5nLCBidXQgZmxhZyBhcyBnbG9iYWwgc2Vjb25kYXJ5XG4gICAgLy8gVGhpcyBwcmV2ZW50cyBzZXR0aW5nIGNyZWRlbnRpYWxzIGFuZCBkZWZhdWx0RGF0YWJhc2VOYW1lIHdoaWNoIGFyZSBpbmhlcml0ZWQgZnJvbSBwcmltYXJ5XG4gICAgdGhpcy5yZWdpb25hbENsdXN0ZXIgPSBuZXcgUmRzQXVyb3JhKFxuICAgICAgdGhpcyxcbiAgICAgIGAke3RoaXMucHJvcHMuZGF0YWJhc2VOYW1lfVJlZ2lvbmFsYCxcbiAgICAgIHtcbiAgICAgICAgdnBjOiB0aGlzLnByb3BzLnZwYyxcbiAgICAgICAgZGF0YWJhc2VOYW1lOiB0aGlzLnByb3BzLmRhdGFiYXNlTmFtZSxcbiAgICAgICAgY2x1c3RlcklkZW50aWZpZXI6IFJlc291cmNlTmFtaW5nLnNlY29uZGFyeUNsdXN0ZXJJZChcbiAgICAgICAgICB0aGlzLmNvbnN0cnVjdElkLFxuICAgICAgICAgIHRoaXMuY3VycmVudFJlZ2lvblxuICAgICAgICApLFxuICAgICAgICBpc0dsb2JhbFNlY29uZGFyeTogdHJ1ZSxcbiAgICAgICAgLy8gU2Vjb25kYXJ5IGRvZXNuJ3QgY3JlYXRlIGNyZWRlbnRpYWxzICh1c2VzIHJlcGxpY2F0ZWQgc2VjcmV0KVxuICAgICAgICAuLi5jb21tb25Db25maWdcbiAgICAgIH1cbiAgICApO1xuXG4gICAgLy8gc2V0IHRoZSBMMSBEQkNsdXN0ZXIgcHJvcGVydHkgc28gQ2xvdWRGb3JtYXRpb24gd2lsbCBqb2luIGl0IHRvIHRoZSBnbG9iYWwgY2x1c3RlclxuICAgIGNvbnN0IHJlZ2lvbmFsTDEgPVxuICAgICAgdGhpcy5yZWdpb25hbENsdXN0ZXIuZ2V0Q2ZuQ2x1c3RlciAmJlxuICAgICAgdGhpcy5yZWdpb25hbENsdXN0ZXIuZ2V0Q2ZuQ2x1c3RlcigpO1xuICAgIGlmIChyZWdpb25hbEwxKSB7XG4gICAgICByZWdpb25hbEwxLmdsb2JhbENsdXN0ZXJJZGVudGlmaWVyID0gdGhpcy5nbG9iYWxJZDtcblxuICAgICAgLy8gRW5hYmxlIHdyaXRlIGZvcndhcmRpbmcgaWYgcmVxdWVzdGVkXG4gICAgICBpZiAodGhpcy5wcm9wcy5lbmFibGVHbG9iYWxXcml0ZUZvcndhcmRpbmcpIHtcbiAgICAgICAgcmVnaW9uYWxMMS5lbmFibGVHbG9iYWxXcml0ZUZvcndhcmRpbmcgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZWdpb25hbENsdXN0ZXIuY29ubmVjdGlvbnM7XG4gIH1cblxuICBwcml2YXRlIGFkZE91dHB1dHMoKSB7XG4gICAgY29uc3Qgb3V0cHV0TmFtZSA9IHRvUGFzY2FsQ2FzZSh0aGlzLnByb3BzLmRhdGFiYXNlTmFtZSk7XG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtvdXRwdXROYW1lfUdsb2JhbENsdXN0ZXJJZGVudGlmaWVyT3V0cHV0YCwge1xuICAgICAgdmFsdWU6IHRoaXMuZ2xvYmFsSWQsXG4gICAgICBleHBvcnROYW1lOiBgJHtvdXRwdXROYW1lfUdsb2JhbENsdXN0ZXJJZGVudGlmaWVyYFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q3JlZGVudGlhbHMoKTogU2VjcmV0IHtcbiAgICBpZiAodGhpcy5wcmltYXJ5Q2x1c3RlcikgcmV0dXJuIHRoaXMucHJpbWFyeUNsdXN0ZXIuZ2V0Q3JlZGVudGlhbHMoKTtcbiAgICBpZiAodGhpcy5yZWdpb25hbENsdXN0ZXIpIHJldHVybiB0aGlzLnJlZ2lvbmFsQ2x1c3Rlci5nZXRDcmVkZW50aWFscygpO1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vIEF1cm9yYSBjbHVzdGVyIGF2YWlsYWJsZSB0byByZXR1cm4gY3JlZGVudGlhbHMgZnJvbVwiKTtcbiAgfVxuXG4gIGdldEhvc3RFbmRwb2ludCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnByaW1hcnlDbHVzdGVyKSByZXR1cm4gdGhpcy5wcmltYXJ5Q2x1c3Rlci5nZXRIb3N0RW5kcG9pbnQoKTtcbiAgICBpZiAodGhpcy5yZWdpb25hbENsdXN0ZXIpIHJldHVybiB0aGlzLnJlZ2lvbmFsQ2x1c3Rlci5nZXRIb3N0RW5kcG9pbnQoKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBBdXJvcmEgY2x1c3RlciBhdmFpbGFibGUgdG8gcmV0dXJuIGVuZHBvaW50IGZyb21cIik7XG4gIH1cblxuICBnZXRIb3N0UG9ydCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnByaW1hcnlDbHVzdGVyKSByZXR1cm4gdGhpcy5wcmltYXJ5Q2x1c3Rlci5nZXRIb3N0UG9ydCgpO1xuICAgIGlmICh0aGlzLnJlZ2lvbmFsQ2x1c3RlcikgcmV0dXJuIHRoaXMucmVnaW9uYWxDbHVzdGVyLmdldEhvc3RQb3J0KCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gQXVyb3JhIGNsdXN0ZXIgYXZhaWxhYmxlIHRvIHJldHVybiBwb3J0IGZyb21cIik7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,15 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
Object.
|
|
3
|
-
exports.RDS_DEFAULTS = void 0;
|
|
4
|
-
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
5
|
-
exports.RDS_DEFAULTS = Object.freeze({
|
|
1
|
+
import { Duration } from "aws-cdk-lib";
|
|
2
|
+
export const RDS_DEFAULTS = Object.freeze({
|
|
6
3
|
/** Default database port: FJALL on phone keypad */
|
|
7
4
|
DEFAULT_PORT: 35255,
|
|
8
5
|
/** Saturday window in UTC — minimises weekday impact for scheduled maintenance */
|
|
9
6
|
PREFERRED_MAINTENANCE_WINDOW: "Sat:12:30-Sat:20:30",
|
|
10
7
|
/** 1 minute — balances monitoring granularity against CloudWatch costs */
|
|
11
|
-
MONITORING_INTERVAL:
|
|
8
|
+
MONITORING_INTERVAL: Duration.minutes(1),
|
|
12
9
|
/** SecretsManager rotation application version for multi-user rotation */
|
|
13
10
|
ROTATION_APP_VERSION: "1.1.367"
|
|
14
11
|
});
|
|
15
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmRzRGVmYXVsdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9kYXRhYmFzZS9yZHNEZWZhdWx0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBdUM7QUFFMUIsUUFBQSxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUN4QyxtREFBbUQ7SUFDbkQsWUFBWSxFQUFFLEtBQUs7SUFDbkIsa0ZBQWtGO0lBQ2xGLDRCQUE0QixFQUFFLHFCQUFxQjtJQUNuRCwwRUFBMEU7SUFDMUUsbUJBQW1CLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLDBFQUEwRTtJQUMxRSxvQkFBb0IsRUFBRSxTQUFTO0NBQ3ZCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IER1cmF0aW9uIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5cbmV4cG9ydCBjb25zdCBSRFNfREVGQVVMVFMgPSBPYmplY3QuZnJlZXplKHtcbiAgLyoqIERlZmF1bHQgZGF0YWJhc2UgcG9ydDogRkpBTEwgb24gcGhvbmUga2V5cGFkICovXG4gIERFRkFVTFRfUE9SVDogMzUyNTUsXG4gIC8qKiBTYXR1cmRheSB3aW5kb3cgaW4gVVRDIOKAlCBtaW5pbWlzZXMgd2Vla2RheSBpbXBhY3QgZm9yIHNjaGVkdWxlZCBtYWludGVuYW5jZSAqL1xuICBQUkVGRVJSRURfTUFJTlRFTkFOQ0VfV0lORE9XOiBcIlNhdDoxMjozMC1TYXQ6MjA6MzBcIixcbiAgLyoqIDEgbWludXRlIOKAlCBiYWxhbmNlcyBtb25pdG9yaW5nIGdyYW51bGFyaXR5IGFnYWluc3QgQ2xvdWRXYXRjaCBjb3N0cyAqL1xuICBNT05JVE9SSU5HX0lOVEVSVkFMOiBEdXJhdGlvbi5taW51dGVzKDEpLFxuICAvKiogU2VjcmV0c01hbmFnZXIgcm90YXRpb24gYXBwbGljYXRpb24gdmVyc2lvbiBmb3IgbXVsdGktdXNlciByb3RhdGlvbiAqL1xuICBST1RBVElPTl9BUFBfVkVSU0lPTjogXCIxLjEuMzY3XCJcbn0gYXMgY29uc3QpO1xuIl19
|
|
@@ -2,8 +2,8 @@ import { type IKey } from "aws-cdk-lib/aws-kms";
|
|
|
2
2
|
import { type IVpc, type IConnectable } from "aws-cdk-lib/aws-ec2";
|
|
3
3
|
import { type ISecret } from "aws-cdk-lib/aws-secretsmanager";
|
|
4
4
|
import type { Construct } from "constructs";
|
|
5
|
-
import { Secret } from "../secrets";
|
|
6
|
-
import { type DatabaseInsightsConfig, type EngineConfig, type EncryptionKeySpec, type CredentialsConfig } from "../../../utils/databaseTypes";
|
|
5
|
+
import { Secret } from "../secrets/index.js";
|
|
6
|
+
import { type DatabaseInsightsConfig, type EngineConfig, type EncryptionKeySpec, type CredentialsConfig } from "../../../utils/databaseTypes.js";
|
|
7
7
|
/** Default PostgreSQL engine configuration used by both Aurora and Instance constructs. */
|
|
8
8
|
export declare const DEFAULT_POSTGRES_ENGINE_CONFIG: EngineConfig;
|
|
9
9
|
/**
|