@rio-cloud/cdk-v2-constructs 1.0.1-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.gitattributes +15 -0
- package/.jsii +7832 -0
- package/.versionrc.json +14 -0
- package/API.md +8136 -0
- package/CHANGELOG.md +5 -0
- package/LICENSE +202 -0
- package/README.md +56 -0
- package/lib/datadog/datadogLogIndexMonitoring.d.ts +49 -0
- package/lib/datadog/datadogLogIndexMonitoring.js +116 -0
- package/lib/datadog/datadogMonitor.d.ts +13 -0
- package/lib/datadog/datadogMonitor.js +19 -0
- package/lib/datadog/index.d.ts +1 -0
- package/lib/datadog/index.js +19 -0
- package/lib/fargate/datadog.d.ts +18 -0
- package/lib/fargate/datadog.js +225 -0
- package/lib/fargate/rio-fargate-service.d.ts +276 -0
- package/lib/fargate/rio-fargate-service.js +147 -0
- package/lib/fargate/spring.d.ts +6 -0
- package/lib/fargate/spring.js +39 -0
- package/lib/index.d.ts +21 -0
- package/lib/index.js +34 -0
- package/lib/kafka/index.d.ts +2 -0
- package/lib/kafka/index.js +15 -0
- package/lib/kafka/kafka-event-spec.d.ts +43 -0
- package/lib/kafka/kafka-event-spec.js +106 -0
- package/lib/kafka/kafka-topic.d.ts +102 -0
- package/lib/kafka/kafka-topic.js +70 -0
- package/lib/pipeline/rio-backup-secrets-restore-stage.d.ts +40 -0
- package/lib/pipeline/rio-backup-secrets-restore-stage.js +104 -0
- package/lib/pipeline/rio-bitbucket-source-action.d.ts +25 -0
- package/lib/pipeline/rio-bitbucket-source-action.js +36 -0
- package/lib/rio-claidometer.d.ts +21 -0
- package/lib/rio-claidometer.js +39 -0
- package/lib/rio-landing-zone.d.ts +16 -0
- package/lib/rio-landing-zone.js +57 -0
- package/lib/rio-load-balancer.d.ts +26 -0
- package/lib/rio-load-balancer.js +42 -0
- package/lib/toggle.d.ts +21 -0
- package/lib/toggle.js +44 -0
- package/lib/watchful/alb.d.ts +47 -0
- package/lib/watchful/alb.js +52 -0
- package/lib/watchful/aspect.d.ts +16 -0
- package/lib/watchful/aspect.js +55 -0
- package/lib/watchful/cloudfront.d.ts +50 -0
- package/lib/watchful/cloudfront.js +65 -0
- package/lib/watchful/datadog-log-alarm.d.ts +37 -0
- package/lib/watchful/datadog-log-alarm.js +88 -0
- package/lib/watchful/datadog-metric-alarm.d.ts +32 -0
- package/lib/watchful/datadog-metric-alarm.js +158 -0
- package/lib/watchful/docdb.d.ts +62 -0
- package/lib/watchful/docdb.js +102 -0
- package/lib/watchful/dynamodb.d.ts +69 -0
- package/lib/watchful/dynamodb.js +87 -0
- package/lib/watchful/ecs.d.ts +50 -0
- package/lib/watchful/ecs.js +69 -0
- package/lib/watchful/lambda.d.ts +59 -0
- package/lib/watchful/lambda.js +65 -0
- package/lib/watchful/metric-alarm.d.ts +34 -0
- package/lib/watchful/metric-alarm.js +3 -0
- package/lib/watchful/rds.d.ts +47 -0
- package/lib/watchful/rds.js +47 -0
- package/lib/watchful/targetgroup.d.ts +47 -0
- package/lib/watchful/targetgroup.js +54 -0
- package/lib/watchful/upperToLower.d.ts +7 -0
- package/lib/watchful/upperToLower.js +35 -0
- package/lib/watchful/watchful.d.ts +119 -0
- package/lib/watchful/watchful.js +182 -0
- package/node_modules/argparse/CHANGELOG.md +216 -0
- package/node_modules/argparse/LICENSE +254 -0
- package/node_modules/argparse/README.md +84 -0
- package/node_modules/argparse/argparse.js +3707 -0
- package/node_modules/argparse/lib/sub.js +67 -0
- package/node_modules/argparse/lib/textwrap.js +440 -0
- package/node_modules/argparse/package.json +31 -0
- package/node_modules/js-yaml/CHANGELOG.md +616 -0
- package/node_modules/js-yaml/LICENSE +21 -0
- package/node_modules/js-yaml/README.md +246 -0
- package/node_modules/js-yaml/bin/js-yaml.js +126 -0
- package/node_modules/js-yaml/dist/js-yaml.js +3874 -0
- package/node_modules/js-yaml/dist/js-yaml.min.js +2 -0
- package/node_modules/js-yaml/dist/js-yaml.mjs +3851 -0
- package/node_modules/js-yaml/index.js +47 -0
- package/node_modules/js-yaml/lib/common.js +59 -0
- package/node_modules/js-yaml/lib/dumper.js +965 -0
- package/node_modules/js-yaml/lib/exception.js +55 -0
- package/node_modules/js-yaml/lib/loader.js +1727 -0
- package/node_modules/js-yaml/lib/schema/core.js +11 -0
- package/node_modules/js-yaml/lib/schema/default.js +22 -0
- package/node_modules/js-yaml/lib/schema/failsafe.js +17 -0
- package/node_modules/js-yaml/lib/schema/json.js +19 -0
- package/node_modules/js-yaml/lib/schema.js +121 -0
- package/node_modules/js-yaml/lib/snippet.js +101 -0
- package/node_modules/js-yaml/lib/type/binary.js +125 -0
- package/node_modules/js-yaml/lib/type/bool.js +35 -0
- package/node_modules/js-yaml/lib/type/float.js +97 -0
- package/node_modules/js-yaml/lib/type/int.js +156 -0
- package/node_modules/js-yaml/lib/type/map.js +8 -0
- package/node_modules/js-yaml/lib/type/merge.js +12 -0
- package/node_modules/js-yaml/lib/type/null.js +35 -0
- package/node_modules/js-yaml/lib/type/omap.js +44 -0
- package/node_modules/js-yaml/lib/type/pairs.js +53 -0
- package/node_modules/js-yaml/lib/type/seq.js +8 -0
- package/node_modules/js-yaml/lib/type/set.js +29 -0
- package/node_modules/js-yaml/lib/type/str.js +8 -0
- package/node_modules/js-yaml/lib/type/timestamp.js +88 -0
- package/node_modules/js-yaml/lib/type.js +66 -0
- package/node_modules/js-yaml/package.json +66 -0
- package/package.json +126 -0
- package/release-commit-check.js +6 -0
- package/version.json +3 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.RioFargateService = exports.DataDogLoggingMode = exports.Framework = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
7
|
+
const ecs = require("aws-cdk-lib/aws-ecs");
|
|
8
|
+
const elbv2 = require("aws-cdk-lib/aws-elasticloadbalancingv2");
|
|
9
|
+
const ssm = require("aws-cdk-lib/aws-ssm");
|
|
10
|
+
const constructs_1 = require("constructs");
|
|
11
|
+
const datadog_1 = require("./datadog");
|
|
12
|
+
const spring_1 = require("./spring");
|
|
13
|
+
var Framework;
|
|
14
|
+
(function (Framework) {
|
|
15
|
+
/**
|
|
16
|
+
* Spring Framework, Spring Boot, and Spring Cloud AWS.
|
|
17
|
+
*/
|
|
18
|
+
Framework[Framework["SPRING"] = 0] = "SPRING";
|
|
19
|
+
})(Framework = exports.Framework || (exports.Framework = {}));
|
|
20
|
+
var DataDogLoggingMode;
|
|
21
|
+
(function (DataDogLoggingMode) {
|
|
22
|
+
/**
|
|
23
|
+
* Forward logs directly to Datadog using AWS FireLens as log router,
|
|
24
|
+
* see https://docs.datadoghq.com/integrations/ecs_fargate/?tab=fluentbitandfirelens#log-collection.
|
|
25
|
+
*/
|
|
26
|
+
DataDogLoggingMode[DataDogLoggingMode["AWS_FIRE_LENS"] = 0] = "AWS_FIRE_LENS";
|
|
27
|
+
/**
|
|
28
|
+
* Store logs in AWS Cloudwatch and use the Datadog log forwarder lambda to forward the logs to Datadog,
|
|
29
|
+
* see https://docs.datadoghq.com/integrations/ecs_fargate/?tab=logdriver#log-collection.
|
|
30
|
+
*/
|
|
31
|
+
DataDogLoggingMode[DataDogLoggingMode["FORWARDER_LAMBDA"] = 1] = "FORWARDER_LAMBDA";
|
|
32
|
+
/**
|
|
33
|
+
* Only log to AWS Cloudwatch without forwarding the logs to Datadog.
|
|
34
|
+
*/
|
|
35
|
+
DataDogLoggingMode[DataDogLoggingMode["NONE"] = 2] = "NONE";
|
|
36
|
+
})(DataDogLoggingMode = exports.DataDogLoggingMode || (exports.DataDogLoggingMode = {}));
|
|
37
|
+
class RioFargateService extends constructs_1.Construct {
|
|
38
|
+
constructor(scope, id, props) {
|
|
39
|
+
var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
|
|
40
|
+
super(scope, id);
|
|
41
|
+
this.DEFAULT_APM_GET_ENDPOINTS_TO_IGNORE = [];
|
|
42
|
+
this.DEFAULT_DATADOG_SIDECAR_CPU = 64;
|
|
43
|
+
this.DEFAULT_DATADOG_SIDECAR_MEMORY_LIMIT_MIB = 128;
|
|
44
|
+
this.DEFAULT_DATADOG_SIDECAR_ESSENTIAL = true;
|
|
45
|
+
this.DEFAULT_LOGGING_MODE_FOR_SERVICE = DataDogLoggingMode.FORWARDER_LAMBDA;
|
|
46
|
+
this.DEFAULT_LOGGING_MODE_FOR_DATADOG_SIDECAR = DataDogLoggingMode.NONE;
|
|
47
|
+
this.DEFAULT_DEREGISTRATION_DELAY = aws_cdk_lib_1.Duration.seconds(5);
|
|
48
|
+
this.DEFAULT_SLOW_START = undefined;
|
|
49
|
+
this.DEFAULT_DATADOG_SIDECAR_TAG = 'latest';
|
|
50
|
+
this.LOG_ROUTER_CPU = 64;
|
|
51
|
+
this.LOG_ROUTER_MEMORY_LIMIT_MIB = 64;
|
|
52
|
+
const { loadBalancerOptions, vpc, fargateOptions, datadogOptions, serviceName, containerDefinitionOption, stage, version, frameworks, } = props;
|
|
53
|
+
const cluster = new ecs.Cluster(this, 'Cluster', {
|
|
54
|
+
vpc: vpc,
|
|
55
|
+
});
|
|
56
|
+
this.taskDefinition = new ecs.FargateTaskDefinition(this, 'TaskDefinition', {
|
|
57
|
+
cpu: fargateOptions.cpu,
|
|
58
|
+
memoryLimitMiB: fargateOptions.memoryLimitMiB,
|
|
59
|
+
});
|
|
60
|
+
const accountName = ssm.StringParameter.fromStringParameterName(this, 'AccountName', '/config/account/name').stringValue;
|
|
61
|
+
const teamName = ssm.StringParameter.fromStringParameterName(this, 'TeamName', '/config/team/name').stringValue;
|
|
62
|
+
const datadogSite = ssm.StringParameter.fromStringParameterName(this, 'DatadogSite', '/rio/config/datadog-integration/site').stringValue;
|
|
63
|
+
const datadogApiKeyParameter = ssm.StringParameter.fromStringParameterName(this, 'DatadogApiKey', '/rio/config/datadog-integration/api-key');
|
|
64
|
+
const datadogSidecarCpu = (_b = datadogOptions === null || datadogOptions === void 0 ? void 0 : datadogOptions.cpu) !== null && _b !== void 0 ? _b : this.DEFAULT_DATADOG_SIDECAR_CPU;
|
|
65
|
+
const datadogSidecarMemoryMiB = (_c = datadogOptions === null || datadogOptions === void 0 ? void 0 : datadogOptions.memoryLimitMiB) !== null && _c !== void 0 ? _c : this.DEFAULT_DATADOG_SIDECAR_MEMORY_LIMIT_MIB;
|
|
66
|
+
const datadogSidecarEssential = (_d = datadogOptions === null || datadogOptions === void 0 ? void 0 : datadogOptions.datadogSidecarEssential) !== null && _d !== void 0 ? _d : this.DEFAULT_DATADOG_SIDECAR_ESSENTIAL;
|
|
67
|
+
const loggingModeForService = (_e = datadogOptions === null || datadogOptions === void 0 ? void 0 : datadogOptions.loggingModeForService) !== null && _e !== void 0 ? _e : this.DEFAULT_LOGGING_MODE_FOR_SERVICE;
|
|
68
|
+
const loggingModeForDatadogAgent = (_f = datadogOptions === null || datadogOptions === void 0 ? void 0 : datadogOptions.loggingModeForDatadogAgent) !== null && _f !== void 0 ? _f : this.DEFAULT_LOGGING_MODE_FOR_DATADOG_SIDECAR;
|
|
69
|
+
const fireLensLogRouterRequired = loggingModeForService === DataDogLoggingMode.AWS_FIRE_LENS ||
|
|
70
|
+
loggingModeForDatadogAgent === DataDogLoggingMode.AWS_FIRE_LENS;
|
|
71
|
+
let serviceContainerCpuUnits;
|
|
72
|
+
let serviceContainerMemoryLimitMiB;
|
|
73
|
+
if (fireLensLogRouterRequired) {
|
|
74
|
+
serviceContainerCpuUnits = fargateOptions.cpu - datadogSidecarCpu - this.LOG_ROUTER_CPU;
|
|
75
|
+
serviceContainerMemoryLimitMiB = fargateOptions.memoryLimitMiB - datadogSidecarMemoryMiB - this.LOG_ROUTER_MEMORY_LIMIT_MIB;
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
serviceContainerCpuUnits = fargateOptions.cpu - datadogSidecarCpu;
|
|
79
|
+
serviceContainerMemoryLimitMiB = fargateOptions.memoryLimitMiB - datadogSidecarMemoryMiB;
|
|
80
|
+
}
|
|
81
|
+
this.serviceContainerDefinition = this.taskDefinition.addContainer(serviceName, {
|
|
82
|
+
image: containerDefinitionOption.image,
|
|
83
|
+
cpu: serviceContainerCpuUnits,
|
|
84
|
+
memoryLimitMiB: serviceContainerMemoryLimitMiB,
|
|
85
|
+
environment: {
|
|
86
|
+
...datadog_1.DataDog.getFargateContainerEnvironmentVariables(this, stage, serviceName, version, accountName, teamName),
|
|
87
|
+
...containerDefinitionOption.environment,
|
|
88
|
+
},
|
|
89
|
+
dockerLabels: {
|
|
90
|
+
...datadog_1.DataDog.getFargateDockerLabels(stage, serviceName, version),
|
|
91
|
+
},
|
|
92
|
+
healthCheck: containerDefinitionOption.healthCheck,
|
|
93
|
+
logging: datadog_1.DataDog.setupLogging(scope, accountName, teamName, stage, serviceName, version, datadogApiKeyParameter, loggingModeForService, datadogSite, 'service'),
|
|
94
|
+
secrets: containerDefinitionOption.secrets,
|
|
95
|
+
});
|
|
96
|
+
if (frameworks === null || frameworks === void 0 ? void 0 : frameworks.includes(Framework.SPRING)) {
|
|
97
|
+
spring_1.Spring.allowParameterStoreAccessForSpringCloudAws(this, serviceName, this.taskDefinition.taskRole);
|
|
98
|
+
spring_1.Spring.allowSecretsManagerAccessForSpringCloudAws(this, serviceName, this.taskDefinition.taskRole);
|
|
99
|
+
}
|
|
100
|
+
if (fireLensLogRouterRequired) {
|
|
101
|
+
this.logRouterContainerDefinition = datadog_1.DataDog.addFireLensLogRouter(this.taskDefinition, this.LOG_ROUTER_CPU, this.LOG_ROUTER_MEMORY_LIMIT_MIB);
|
|
102
|
+
}
|
|
103
|
+
this.datadogSideCarContainerDefinition = datadog_1.DataDog.addDatadogSidecar(scope, this.taskDefinition, accountName, teamName, stage, serviceName, version, datadogApiKeyParameter, datadogSite, loggingModeForDatadogAgent, (_g = datadogOptions === null || datadogOptions === void 0 ? void 0 : datadogOptions.apmGetEndpointsToIgnore) !== null && _g !== void 0 ? _g : this.DEFAULT_APM_GET_ENDPOINTS_TO_IGNORE, datadogSidecarCpu, datadogSidecarMemoryMiB, datadogSidecarEssential, (_j = (_h = props.datadogOptions) === null || _h === void 0 ? void 0 : _h.datadogSidecarTag) !== null && _j !== void 0 ? _j : this.DEFAULT_DATADOG_SIDECAR_TAG);
|
|
104
|
+
datadog_1.DataDog.ensureLoggingAndMonitoringAreReadyBeforeServiceStarts(this);
|
|
105
|
+
const loadBalancerOptionsForFargateService = loadBalancerOptions
|
|
106
|
+
? { healthCheckGracePeriod: loadBalancerOptions.healthCheckGracePeriod }
|
|
107
|
+
: {};
|
|
108
|
+
this.service = new ecs.FargateService(this, 'Service', {
|
|
109
|
+
cluster,
|
|
110
|
+
taskDefinition: this.taskDefinition,
|
|
111
|
+
circuitBreaker: { rollback: true },
|
|
112
|
+
maxHealthyPercent: 200,
|
|
113
|
+
minHealthyPercent: 100,
|
|
114
|
+
desiredCount: fargateOptions === null || fargateOptions === void 0 ? void 0 : fargateOptions.desiredCount,
|
|
115
|
+
...loadBalancerOptionsForFargateService,
|
|
116
|
+
});
|
|
117
|
+
this.connections = this.service.connections;
|
|
118
|
+
if (loadBalancerOptions != null) {
|
|
119
|
+
const containerPort = 443;
|
|
120
|
+
this.serviceContainerDefinition.addPortMappings({
|
|
121
|
+
containerPort: containerPort,
|
|
122
|
+
protocol: ecs.Protocol.TCP,
|
|
123
|
+
});
|
|
124
|
+
this.targetGroup = new elbv2.ApplicationTargetGroup(this, 'TargetGroup', {
|
|
125
|
+
vpc: vpc,
|
|
126
|
+
port: containerPort,
|
|
127
|
+
protocol: elbv2.ApplicationProtocol.HTTPS,
|
|
128
|
+
targetType: elbv2.TargetType.IP,
|
|
129
|
+
targets: [this.service],
|
|
130
|
+
healthCheck: loadBalancerOptions.healthCheck,
|
|
131
|
+
slowStart: (_l = (_k = props.loadBalancerOptions) === null || _k === void 0 ? void 0 : _k.slowStart) !== null && _l !== void 0 ? _l : this.DEFAULT_SLOW_START,
|
|
132
|
+
deregistrationDelay: (_o = (_m = props.loadBalancerOptions) === null || _m === void 0 ? void 0 : _m.deregistrationDelay) !== null && _o !== void 0 ? _o : this.DEFAULT_DEREGISTRATION_DELAY,
|
|
133
|
+
});
|
|
134
|
+
loadBalancerOptions.listenerRules.forEach(({ priority, conditions }) => {
|
|
135
|
+
loadBalancerOptions.listener.addTargetGroups(`Priority${priority}ListenerRule`, {
|
|
136
|
+
targetGroups: [this.targetGroup],
|
|
137
|
+
priority: priority,
|
|
138
|
+
conditions: conditions,
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
exports.RioFargateService = RioFargateService;
|
|
145
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
146
|
+
RioFargateService[_a] = { fqn: "@rio-cloud/cdk-v2-constructs.RioFargateService", version: "0.0.0" };
|
|
147
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmlvLWZhcmdhdGUtc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9mYXJnYXRlL3Jpby1mYXJnYXRlLXNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSw2Q0FBdUM7QUFFdkMsMkNBQTJDO0FBQzNDLGdFQUFnRTtBQUNoRSwyQ0FBMkM7QUFDM0MsMkNBQXVDO0FBQ3ZDLHVDQUFvQztBQUNwQyxxQ0FBa0M7QUFzRGxDLElBQVksU0FLWDtBQUxELFdBQVksU0FBUztJQUNuQjs7T0FFRztJQUNILDZDQUFNLENBQUE7QUFDUixDQUFDLEVBTFcsU0FBUyxHQUFULGlCQUFTLEtBQVQsaUJBQVMsUUFLcEI7QUE2TUQsSUFBWSxrQkFpQlg7QUFqQkQsV0FBWSxrQkFBa0I7SUFDNUI7OztPQUdHO0lBQ0gsNkVBQWEsQ0FBQTtJQUViOzs7T0FHRztJQUNILG1GQUFnQixDQUFBO0lBRWhCOztPQUVHO0lBQ0gsMkRBQUksQ0FBQTtBQUNOLENBQUMsRUFqQlcsa0JBQWtCLEdBQWxCLDBCQUFrQixLQUFsQiwwQkFBa0IsUUFpQjdCO0FBRUQsTUFBYSxpQkFBa0IsU0FBUSxzQkFBUztJQXdCOUMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE2Qjs7UUFDckUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQXZCRix3Q0FBbUMsR0FBYSxFQUFFLENBQUM7UUFDbkQsZ0NBQTJCLEdBQUcsRUFBRSxDQUFDO1FBQ2pDLDZDQUF3QyxHQUFHLEdBQUcsQ0FBQztRQUMvQyxzQ0FBaUMsR0FBRyxJQUFJLENBQUM7UUFDekMscUNBQWdDLEdBQUcsa0JBQWtCLENBQUMsZ0JBQWdCLENBQUM7UUFDdkUsNkNBQXdDLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDO1FBQ25FLGlDQUE0QixHQUFHLHNCQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25ELHVCQUFrQixHQUFHLFNBQVMs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bGliJztcbmltcG9ydCAqIGFzIGVjMiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCAqIGFzIGVjcyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNzJztcbmltcG9ydCAqIGFzIGVsYnYyIGZyb20gJ2F3cy1jZGstbGliL2F3cy1lbGFzdGljbG9hZGJhbGFuY2luZ3YyJztcbmltcG9ydCAqIGFzIHNzbSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc3NtJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgRGF0YURvZyB9IGZyb20gJy4vZGF0YWRvZyc7XG5pbXBvcnQgeyBTcHJpbmcgfSBmcm9tICcuL3NwcmluZyc7XG5cbi8qKlxuICogRmFyZ2F0ZSBUYXNrIERlZmluaXRpb24gUHJvcGVydGllcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSaW9GYXJnYXRlU2VydmljZVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBzdGFnZSBvZiB0aGUgc2VydmljZSwgZS5nLiAncHJvZCcuXG4gICAqL1xuICByZWFkb25seSBzdGFnZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgTmFtZSBvZiB0aGUgc2VydmljZS5cbiAgICovXG4gIHJlYWRvbmx5IHNlcnZpY2VOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBzZXJ2aWNlLCBlLmcuIHRoZSBnaXQgaGFzaCBvZiB0aGUgY29ycmVzcG9uZGluZyBjb21taXQuXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmcmFtZXdvcmtzIGluIHVzZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gZnJhbWV3b3Jrcy5cbiAgICovXG4gIHJlYWRvbmx5IGZyYW1ld29ya3M/OiBGcmFtZXdvcmtbXTtcblxuICAvKipcbiAgICogVGhlIFZQQyBvZiB0aGUgc2VydmljZS5cbiAgICovXG4gIHJlYWRvbmx5IHZwYzogZWMyLklWcGM7XG5cbiAgLyoqXG4gICAqIENvbnRhaW5lciBkZWZpbml0aW9uIG9wdGlvbnMgbGlrZSBpbWFnZSwgY3B1LCBtZW1vcnkuXG4gICAqL1xuICByZWFkb25seSBjb250YWluZXJEZWZpbml0aW9uT3B0aW9uOiBDb250YWluZXJEZWZpbml0aW9uT3B0aW9ucztcblxuICAvKipcbiAgICogRmFyZ2F0ZSBUYXNrIERlZmluaXRpb24gUHJvcGVydGllcy5cbiAgICovXG4gIHJlYWRvbmx5IGZhcmdhdGVPcHRpb25zOiBGYXJnYXRlVGFza0RlZmluaXRpb25Qcm9wcztcblxuICAvKipcbiAgICogTG9hZGJhbGFuY2VyIG9wdGlvbnMuXG4gICAqL1xuICByZWFkb25seSBsb2FkQmFsYW5jZXJPcHRpb25zPzogTG9hZEJhbGFuY2VyT3B0aW9ucztcblxuICAvKipcbiAgICogRGF0YWRvZyBpbnRlZ3JhdGlvbiBwcm9wZXJ0aWVzXG4gICAqL1xuICByZWFkb25seSBkYXRhZG9nT3B0aW9ucz86IERhdGFkb2dJbnRlZ3JhdGlvblByb3BzO1xufVxuXG5leHBvcnQgZW51bSBGcmFtZXdvcmsge1xuICAvKipcbiAgICogU3ByaW5nIEZyYW1ld29yaywgU3ByaW5nIEJvb3QsIGFuZCBTcHJpbmcgQ2xvdWQgQVdTLlxuICAgKi9cbiAgU1BSSU5HLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRhaW5lckRlZmluaXRpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBpbWFnZSB1c2VkIHRvIHN0YXJ0IGEgY29udGFpbmVyLlxuICAgKlxuICAgKiBUaGlzIHN0cmluZyBpcyBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIERvY2tlciBkYWVtb24uXG4gICAqIEltYWdlcyBpbiB0aGUgRG9ja2VyIEh1YiByZWdpc3RyeSBhcmUgYXZhaWxhYmxlIGJ5IGRlZmF1bHQuXG4gICAqIE90aGVyIHJlcG9zaXRvcmllcyBhcmUgc3BlY2lmaWVkIHdpdGggZWl0aGVyIHJlcG9zaXRvcnktdXJsL2ltYWdlOnRhZyBvciByZXBvc2l0b3J5LXVybC9pbWFnZUBkaWdlc3QuXG4gICAqL1xuICByZWFkb25seSBpbWFnZTogZWNzLkNvbnRhaW5lckltYWdlO1xuXG4gIC8qKlxuICAgKiBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHBhc3MgdG8gdGhlIGNvbnRhaW5lci5cbiAgICpcbiAgICogRW52aXJvbm1lbnQgdmFyaWFibGVzIHNldCBieSBkZWZhdWx0IGFyZSBvdmVyd3JpdHRlbiBpZiBwYXNzZWQuXG4gICAqXG4gICAqIFRoZSBkZWZhdWx0IGVudmlyb25tZW50IHZhcmlhYmxlcyBzZXQgYXJlXG4gICAqXG4gICAqIEREX0VOVjogU2V0IHNhbWUgYXMgcHJvcCBzdGFnZVxuICAgKlxuICAgKiBERF9TRVJWSUNFOiBTZXQgc2FtZSBhcyBwcm9wIHNlcnZpY2VOYW1lXG4gICAqXG4gICAqIEREX1ZFUlNJT046IFNldCBzYW1lIGFzIHByb3AgdmVyc2lvblxuICAgKlxuICAgKiBERF9MT0dTX0lOSkVDVElPTjogdHJ1ZVxuICAgKlxuICAgKiBERF9TRVJWSUNFX01BUFBJTkc6IGRhdGFiYXNlOmZhcmdhdGUtd2ViLWFwcC1hdXJvcmEsamF2YS1hd3Mtc2RrOmZhcmdhdGUtd2ViLWFwcC1hd3Mtc2RrLGthZmthOmZhcmdhdGUtd2ViLWFwcC1rYWZrYSxteXNxbDpmYXJnYXRlLXdlYi1hcHAtYXVyb3JhXG4gICAqXG4gICAqIEREX1RBR1M6IGVudjpwcm9kLHNlcnZpY2U6ZmFyZ2F0ZS13ZWItYXBwLHZlcnNpb246bm90YWcsYWNjb3VudF9pZDoke2FjY291bnRJRH0sYWNjb3VudF9uYW1lOiR7YWNjb3VudE5hbWV9LHJlZ2lvbjoke0FXU1JlZ2lvbn0sdGVhbToke3RlYW1OYW1lIGZyb20gc3NtIHBhcmFtIC9jb25maWcvdGVhbS9uYW1lfVxuICAgKlxuICAgKiBERF9UUkFDRV9TQU1QTEVfUkFURTogMS4wXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgZW52aXJvbm1lbnQ/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBUaGUgc2VjcmV0IGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBwYXNzIHRvIHRoZSBjb250YWluZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gc2VjcmV0IGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAgICovXG4gIHJlYWRvbmx5IHNlY3JldHM/OiB7IFtrZXk6IHN0cmluZ106IGVjcy5TZWNyZXQgfTtcblxuICAvKipcbiAgICogVGhlIGhlYWx0aCBjaGVjayBjb21tYW5kIGFuZCBhc3NvY2lhdGVkIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBmb3IgdGhlIGNvbnRhaW5lci5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBIZWFsdGggY2hlY2sgY29uZmlndXJhdGlvbiBmcm9tIGNvbnRhaW5lci5cbiAgICovXG4gIHJlYWRvbmx5IGhlYWx0aENoZWNrPzogZWNzLkhlYWx0aENoZWNrO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZhcmdhdGVUYXNrRGVmaW5pdGlvblByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgY3B1IHVuaXRzIHVzZWQgYnkgdGhlIHRhc2suIEZvciB0YXNrcyB1c2luZyB0aGUgRmFyZ2F0ZSBsYXVuY2ggdHlwZSxcbiAgICogdGhpcyBmaWVsZCBpcyByZXF1aXJlZCBhbmQgeW91IG11c3QgdXNlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyxcbiAgICogd2hpY2ggZGV0ZXJtaW5lcyB5b3VyIHJhbmdlIG9mIHZhbGlkIHZhbHVlcyBmb3IgdGhlIG1lbW9yeSBwYXJhbWV0ZXI6XG4gICAqXG4gICAqIDI1NiAoLjI1IHZDUFUpIC0gQXZhaWxhYmxlIG1lbW9yeSB2YWx1ZXM6IDUxMiAoMC41IEdCKSwgMTAyNCAoMSBHQiksIDIwNDggKDIgR0IpXG4gICAqXG4gICAqIDUxMiAoLjUgdkNQVSkgLSBBdmFpbGFibGUgbWVtb3J5IHZhbHVlczogMTAyNCAoMSBHQiksIDIwNDggKDIgR0IpLCAzMDcyICgzIEdCKSwgNDA5NiAoNCBHQilcbiAgICpcbiAgICogMTAyNCAoMSB2Q1BVKSAtIEF2YWlsYWJsZSBtZW1vcnkgdmFsdWVzOiAyMDQ4ICgyIEdCKSwgMzA3MiAoMyBHQiksIDQwOTYgKDQgR0IpLCA1MTIwICg1IEdCKSwgNjE0NCAoNiBHQiksIDcxNjggKDcgR0IpLCA4MTkyICg4IEdCKVxuICAgKlxuICAgKiAyMDQ4ICgyIHZDUFUpIC0gQXZhaWxhYmxlIG1lbW9yeSB2YWx1ZXM6IEJldHdlZW4gNDA5NiAoNCBHQikgYW5kIDE2Mzg0ICgxNiBHQikgaW4gaW5jcmVtZW50cyBvZiAxMDI0ICgxIEdCKVxuICAgKlxuICAgKiA0MDk2ICg0IHZDUFUpIC0gQXZhaWxhYmxlIG1lbW9yeSB2YWx1ZXM6IEJldHdlZW4gODE5MiAoOCBHQikgYW5kIDMwNzIwICgzMCBHQikgaW4gaW5jcmVtZW50cyBvZiAxMDI0ICgxIEdCKVxuICAgKlxuICAgKiBAZGVmYXVsdCA1MTJcbiAgICovXG4gIHJlYWRvbmx5IGNwdTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgYW1vdW50IChpbiBNaUIpIG9mIG1lbW9yeSB1c2VkIGJ5IHRoZSB0YXNrLiBGb3IgdGFza3MgdXNpbmcgdGhlIEZhcmdhdGUgbGF1bmNoIHR5cGUsXG4gICAqIHRoaXMgZmllbGQgaXMgcmVxdWlyZWQgYW5kIHlvdSBtdXN0IHVzZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMsIHdoaWNoIGRldGVybWluZXMgeW91ciByYW5nZSBvZiB2YWxpZCB2YWx1ZXMgZm9yIHRoZSBjcHUgcGFyYW1ldGVyOlxuICAgKlxuICAgKiA1MTIgKDAuNSBHQiksIDEwMjQgKDEgR0IpLCAyMDQ4ICgyIEdCKSAtIEF2YWlsYWJsZSBjcHUgdmFsdWVzOiAyNTYgKC4yNSB2Q1BVKVxuICAgKlxuICAgKiAxMDI0ICgxIEdCKSwgMjA0OCAoMiBHQiksIDMwNzIgKDMgR0IpLCA0MDk2ICg0IEdCKSAtIEF2YWlsYWJsZSBjcHUgdmFsdWVzOiA1MTIgKC41IHZDUFUpXG4gICAqXG4gICAqIDIwNDggKDIgR0IpLCAzMDcyICgzIEdCKSwgNDA5NiAoNCBHQiksIDUxMjAgKDUgR0IpLCA2MTQ0ICg2IEdCKSwgNzE2OCAoNyBHQiksIDgxOTIgKDggR0IpIC0gQXZhaWxhYmxlIGNwdSB2YWx1ZXM6IDEwMjQgKDEgdkNQVSlcbiAgICpcbiAgICogQmV0d2VlbiA0MDk2ICg0IEdCKSBhbmQgMTYzODQgKDE2IEdCKSBpbiBpbmNyZW1lbnRzIG9mIDEwMjQgKDEgR0IpIC0gQXZhaWxhYmxlIGNwdSB2YWx1ZXM6IDIwNDggKDIgdkNQVSlcbiAgICpcbiAgICogQmV0d2VlbiA4MTkyICg4IEdCKSBhbmQgMzA3MjAgKDMwIEdCKSBpbiBpbmNyZW1lbnRzIG9mIDEwMjQgKDEgR0IpIC0gQXZhaWxhYmxlIGNwdSB2YWx1ZXM6IDQwOTYgKDQgdkNQVSlcbiAgICpcbiAgICogQGRlZmF1bHQgMTAyNFxuICAgKi9cbiAgcmVhZG9ubHkgbWVtb3J5TGltaXRNaUI6IG51bWJlcjtcblxuICAvKipcbiAgICogRGVzaXJlZCBjb3VudCBvZiBydW5uaW5nIHRhc2tzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gV2hlbiBjcmVhdGluZyB0aGUgc2VydmljZSwgZGVmYXVsdCBpcyAxOyB3aGVuIHVwZGF0aW5nIHRoZSBzZXJ2aWNlLCBkZWZhdWx0IHVzZXNcbiAgICogdGhlIGN1cnJlbnQgdGFzayBudW1iZXIuXG4gICAqL1xuICByZWFkb25seSBkZXNpcmVkQ291bnQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdGVuZXJSdWxlIHtcbiAgcmVhZG9ubHkgcHJpb3JpdHk6IG51bWJlcjtcblxuICByZWFkb25seSBjb25kaXRpb25zOiBlbGJ2Mi5MaXN0ZW5lckNvbmRpdGlvbltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvYWRCYWxhbmNlck9wdGlvbnMge1xuICAvKipcbiAgICogTGlzdGVuZXIgZm9yIGFuIEFwcGxpY2F0aW9uIExvYWQgQmFsYW5jZXJcbiAgICovXG4gIHJlYWRvbmx5IGxpc3RlbmVyOiBlbGJ2Mi5JQXBwbGljYXRpb25MaXN0ZW5lcjtcblxuICAvKipcbiAgICogT25lIG9yIG1vcmUgcGF0aCBwYXR0ZXJucyB0byBjb21wYXJlIGFnYWluc3QgdGhlIHJlcXVlc3QgVVJMLlxuICAgKiBUaGUgbWF4aW11bSBzaXplIG9mIGVhY2ggc3RyaW5nIGlzIDEyOCBjaGFyYWN0ZXJzLlxuICAgKiBUaGUgY29tcGFyaXNvbiBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICogVGhlIGZvbGxvd2luZyB3aWxkY2FyZCBjaGFyYWN0ZXJzIGFyZSBzdXBwb3J0ZWQ6ICogKG1hdGNoZXMgMCBvciBtb3JlIGNoYXJhY3RlcnMpIGFuZCA/IChtYXRjaGVzIGV4YWN0bHkgMSBjaGFyYWN0ZXIpLlxuICAgKlxuICAgKiBVcGRhdGUgcmVxdWlyZXM6IE5vIGludGVycnVwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgbGlzdGVuZXJSdWxlczogTGlzdGVuZXJSdWxlW107XG5cbiAgLyoqXG4gICAqICBIZWFsdGggY2hlY2sgb3B0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IGhlYWx0aENoZWNrOiBlbGJ2Mi5IZWFsdGhDaGVjaztcblxuICAvKipcbiAgICogIEhlYWx0aCBjaGVjayBncmFjZSBwZXJpb2QuXG4gICAqL1xuICByZWFkb25seSBoZWFsdGhDaGVja0dyYWNlUGVyaW9kOiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogVGhlIHRpbWUgcGVyaW9kIGR1cmluZyB3aGljaCB0aGUgbG9hZCBiYWxhbmNlciBzZW5kcyBhIG5ld2x5IHJlZ2lzdGVyZWQgdGFyZ2V0IGEgbGluZWFybHkgaW5jcmVhc2luZyBzaGFyZSBvZiB0aGUgdHJhZmZpYyB0byB0aGUgdGFyZ2V0IGdyb3VwLlxuXG4gICAqVGhlIHJhbmdlIGlzIDMwLTkwMCBzZWNvbmRzICgxNSBtaW51dGVzKS5cblxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWRcbiAgKi9cbiAgcmVhZG9ubHkgc2xvd1N0YXJ0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBhbW91bnQgb2YgdGltZSBmb3IgRWxhc3RpYyBMb2FkIEJhbGFuY2luZyB0byB3YWl0IGJlZm9yZSBkZXJlZ2lzdGVyaW5nIGEgdGFyZ2V0LlxuXG4gICAqIFRoZSByYW5nZSBpcyAwLTM2MDAgc2Vjb25kcy5cblxuICAgKiBAZGVmYXVsdCA1XG4gICovXG4gIHJlYWRvbmx5IGRlcmVnaXN0cmF0aW9uRGVsYXk/OiBEdXJhdGlvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXRhZG9nSW50ZWdyYXRpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgbWluaW11bSBudW1iZXIgb2YgQ1BVIHVuaXRzIHRvIHJlc2VydmUgZm9yIHRoZSBjb250YWluZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gNjRcbiAgICovXG4gIHJlYWRvbmx5IGNwdT86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGFtb3VudCAoaW4gTWlCKSBvZiBtZW1vcnkgdG8gcHJlc2VudCB0byB0aGUgY29udGFpbmVyLlxuICAgKlxuICAgKiBJZiB5b3VyIGNvbnRhaW5lciBhdHRlbXB0cyB0byBleGNlZWQgdGhlIGFsbG9jYXRlZCBtZW1vcnksIHRoZSBjb250YWluZXJcbiAgICogaXMgdGVybWluYXRlZC5cbiAgICpcbiAgICogQXQgbGVhc3Qgb25lIG9mIG1lbW9yeUxpbWl0TWlCIGFuZCBtZW1vcnlSZXNlcnZhdGlvbk1pQiBpcyByZXF1aXJlZCBmb3Igbm9uLUZhcmdhdGUgc2VydmljZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gMTI4XG4gICAqL1xuICByZWFkb25seSBtZW1vcnlMaW1pdE1pQj86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGxvZ2dpbmcgbW9kZSBmb3IgdGhlIHNlcnZpY2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gVXNpbmcgdGhlIERhdGFkb2cgbG9nIGZvcndhcmRlciBsYW1iZGEgcHJvdmlkZWQgYnkgdGhlIGRhdGFkb2ctaW50ZWdyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBsb2dnaW5nTW9kZUZvclNlcnZpY2U/OiBEYXRhRG9nTG9nZ2luZ01vZGU7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2dnaW5nIG1vZGUgZm9yIHRoZSBEYXRhZG9nIGFnZW50IHNpZGVjYXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gbG9ncyBpbiBEYXRhZG9nLCBDbG91ZHdhdGNoIG9ubHkuXG4gICAqL1xuICByZWFkb25seSBsb2dnaW5nTW9kZUZvckRhdGFkb2dBZ2VudD86IERhdGFEb2dMb2dnaW5nTW9kZTtcblxuICAvKipcbiAgICogR0VUIGVuZHBvaW50cyB0byBpZ25vcmUgaW4gRGF0YWRvZydzIEFQTSBvdmVydmlldy4gVGhpcyBpcyB1c2VmdWwgdG8gZmlsdGVyIG91dCBhbGwgaGVhbHRoIGNoZWNrIGNhbGxzLlxuXG4gICAgKiBAZGVmYXVsdCAtIE5vIGVuZHBvaW50cyBhcmUgaWdub3JlZC5cbiAgICAqL1xuICByZWFkb25seSBhcG1HZXRFbmRwb2ludHNUb0lnbm9yZT86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBDb25maWd1cmUgaWYgdGhlIERhdGFkb2cgYWdlbnQgc2lkZWNhciBpcyBtYXJrZWQgYXMgZXNzZW50aWFsLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRydWUuXG4gICAqL1xuICByZWFkb25seSBkYXRhZG9nU2lkZWNhckVzc2VudGlhbD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZXMgdGhlIGRvY2tlciBpbWFnZSB0YWcgZm9yIGRhdGFkb2cgc2lkZWNhclxuICAgKiBAZGVmYXVsdCAtICdsYXRlc3QnXG4gICAqL1xuICByZWFkb25seSBkYXRhZG9nU2lkZWNhclRhZz86IHN0cmluZztcbn1cblxuZXhwb3J0IGVudW0gRGF0YURvZ0xvZ2dpbmdNb2RlIHtcbiAgLyoqXG4gICAqIEZvcndhcmQgbG9ncyBkaXJlY3RseSB0byBEYXRhZG9nIHVzaW5nIEFXUyBGaXJlTGVucyBhcyBsb2cgcm91dGVyLFxuICAgKiBzZWUgaHR0cHM6Ly9kb2NzLmRhdGFkb2docS5jb20vaW50ZWdyYXRpb25zL2Vjc19mYXJnYXRlLz90YWI9Zmx1ZW50Yml0YW5kZmlyZWxlbnMjbG9nLWNvbGxlY3Rpb24uXG4gICAqL1xuICBBV1NfRklSRV9MRU5TLFxuXG4gIC8qKlxuICAgKiBTdG9yZSBsb2dzIGluIEFXUyBDbG91ZHdhdGNoIGFuZCB1c2UgdGhlIERhdGFkb2cgbG9nIGZvcndhcmRlciBsYW1iZGEgdG8gZm9yd2FyZCB0aGUgbG9ncyB0byBEYXRhZG9nLFxuICAgKiBzZWUgaHR0cHM6Ly9kb2NzLmRhdGFkb2docS5jb20vaW50ZWdyYXRpb25zL2Vjc19mYXJnYXRlLz90YWI9bG9nZHJpdmVyI2xvZy1jb2xsZWN0aW9uLlxuICAgKi9cbiAgRk9SV0FSREVSX0xBTUJEQSxcblxuICAvKipcbiAgICogT25seSBsb2cgdG8gQVdTIENsb3Vkd2F0Y2ggd2l0aG91dCBmb3J3YXJkaW5nIHRoZSBsb2dzIHRvIERhdGFkb2cuXG4gICAqL1xuICBOT05FLFxufVxuXG5leHBvcnQgY2xhc3MgUmlvRmFyZ2F0ZVNlcnZpY2UgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBlYzIuSUNvbm5lY3RhYmxlIHtcblxuICBwcml2YXRlIHJlYWRvbmx5IERFRkFVTFRfQVBNX0dFVF9FTkRQT0lOVFNfVE9fSUdOT1JFOiBzdHJpbmdbXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IERFRkFVTFRfREFUQURPR19TSURFQ0FSX0NQVSA9IDY0O1xuICBwcml2YXRlIHJlYWRvbmx5IERFRkFVTFRfREFUQURPR19TSURFQ0FSX01FTU9SWV9MSU1JVF9NSUIgPSAxMjg7XG4gIHByaXZhdGUgcmVhZG9ubHkgREVGQVVMVF9EQVRBRE9HX1NJREVDQVJfRVNTRU5USUFMID0gdHJ1ZTtcbiAgcHJpdmF0ZSByZWFkb25seSBERUZBVUxUX0xPR0dJTkdfTU9ERV9GT1JfU0VSVklDRSA9IERhdGFEb2dMb2dnaW5nTW9kZS5GT1JXQVJERVJfTEFNQkRBO1xuICBwcml2YXRlIHJlYWRvbmx5IERFRkFVTFRfTE9HR0lOR19NT0RFX0ZPUl9EQVRBRE9HX1NJREVDQVIgPSBEYXRhRG9nTG9nZ2luZ01vZGUuTk9ORTtcbiAgcHJpdmF0ZSByZWFkb25seSBERUZBVUxUX0RFUkVHSVNUUkFUSU9OX0RFTEFZID0gRHVyYXRpb24uc2Vjb25kcyg1KTtcbiAgcHJpdmF0ZSByZWFkb25seSBERUZBVUxUX1NMT1dfU1RBUlQgPSB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgREVGQVVMVF9EQVRBRE9HX1NJREVDQVJfVEFHID0gJ2xhdGVzdCc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBMT0dfUk9VVEVSX0NQVSA9IDY0O1xuICBwcml2YXRlIHJlYWRvbmx5IExPR19ST1VURVJfTUVNT1JZX0xJTUlUX01JQiA9IDY0O1xuXG4gIHJlYWRvbmx5IHNlcnZpY2VDb250YWluZXJEZWZpbml0aW9uOiBlY3MuQ29udGFpbmVyRGVmaW5pdGlvbjtcbiAgcmVhZG9ubHkgZGF0YWRvZ1NpZGVDYXJDb250YWluZXJEZWZpbml0aW9uOiBlY3MuQ29udGFpbmVyRGVmaW5pdGlvbjtcbiAgcmVhZG9ubHkgbG9nUm91dGVyQ29udGFpbmVyRGVmaW5pdGlvbj86IGVjcy5Db250YWluZXJEZWZpbml0aW9uO1xuICByZWFkb25seSB0YXNrRGVmaW5pdGlvbjogZWNzLkZhcmdhdGVUYXNrRGVmaW5pdGlvbjtcblxuICByZWFkb25seSBjb25uZWN0aW9uczogZWMyLkNvbm5lY3Rpb25zO1xuICByZWFkb25seSBzZXJ2aWNlOiBlY3MuRmFyZ2F0ZVNlcnZpY2U7XG4gIHJlYWRvbmx5IHRhcmdldEdyb3VwOiBlbGJ2Mi5BcHBsaWNhdGlvblRhcmdldEdyb3VwfHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUmlvRmFyZ2F0ZVNlcnZpY2VQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCB7XG4gICAgICBsb2FkQmFsYW5jZXJPcHRpb25zLFxuICAgICAgdnBjLFxuICAgICAgZmFyZ2F0ZU9wdGlvbnMsXG4gICAgICBkYXRhZG9nT3B0aW9ucyxcbiAgICAgIHNlcnZpY2VOYW1lLFxuICAgICAgY29udGFpbmVyRGVmaW5pdGlvbk9wdGlvbixcbiAgICAgIHN0YWdlLFxuICAgICAgdmVyc2lvbixcbiAgICAgIGZyYW1ld29ya3MsXG4gICAgfSA9IHByb3BzO1xuXG4gICAgY29uc3QgY2x1c3RlciA9IG5ldyBlY3MuQ2x1c3Rlcih0aGlzLCAnQ2x1c3RlcicsIHtcbiAgICAgIHZwYzogdnBjLFxuICAgIH0pO1xuICAgIHRoaXMudGFza0RlZmluaXRpb24gPSBuZXcgZWNzLkZhcmdhdGVUYXNrRGVmaW5pdGlvbih0aGlzLCAnVGFza0RlZmluaXRpb24nLCB7XG4gICAgICBjcHU6IGZhcmdhdGVPcHRpb25zLmNwdSxcbiAgICAgIG1lbW9yeUxpbWl0TWlCOiBmYXJnYXRlT3B0aW9ucy5tZW1vcnlMaW1pdE1pQixcbiAgICB9KTtcbiAgICBjb25zdCBhY2NvdW50TmFtZSA9IHNzbS5TdHJpbmdQYXJhbWV0ZXIuZnJvbVN0cmluZ1BhcmFtZXRlck5hbWUodGhpcywgJ0FjY291bnROYW1lJywgJy9jb25maWcvYWNjb3VudC9uYW1lJykuc3RyaW5nVmFsdWU7XG4gICAgY29uc3QgdGVhbU5hbWUgPSBzc20uU3RyaW5nUGFyYW1ldGVyLmZyb21TdHJpbmdQYXJhbWV0ZXJOYW1lKHRoaXMsICdUZWFtTmFtZScsICcvY29uZmlnL3RlYW0vbmFtZScpLnN0cmluZ1ZhbHVlO1xuXG4gICAgY29uc3QgZGF0YWRvZ1NpdGUgPSBzc20uU3RyaW5nUGFyYW1ldGVyLmZyb21TdHJpbmdQYXJhbWV0ZXJOYW1lKHRoaXMsICdEYXRhZG9nU2l0ZScsICcvcmlvL2NvbmZpZy9kYXRhZG9nLWludGVncmF0aW9uL3NpdGUnKS5zdHJpbmdWYWx1ZTtcbiAgICBjb25zdCBkYXRhZG9nQXBpS2V5UGFyYW1ldGVyID0gc3NtLlN0cmluZ1BhcmFtZXRlci5mcm9tU3RyaW5nUGFyYW1ldGVyTmFtZSh0aGlzLCAnRGF0YWRvZ0FwaUtleScsICcvcmlvL2NvbmZpZy9kYXRhZG9nLWludGVncmF0aW9uL2FwaS1rZXknKTtcblxuICAgIGNvbnN0IGRhdGFkb2dTaWRlY2FyQ3B1ID0gZGF0YWRvZ09wdGlvbnM/LmNwdSA/PyB0aGlzLkRFRkFVTFRfREFUQURPR19TSURFQ0FSX0NQVTtcbiAgICBjb25zdCBkYXRhZG9nU2lkZWNhck1lbW9yeU1pQiA9IGRhdGFkb2dPcHRpb25zPy5tZW1vcnlMaW1pdE1pQiA/PyB0aGlzLkRFRkFVTFRfREFUQURPR19TSURFQ0FSX01FTU9SWV9MSU1JVF9NSUI7XG4gICAgY29uc3QgZGF0YWRvZ1NpZGVjYXJFc3NlbnRpYWwgPSBkYXRhZG9nT3B0aW9ucz8uZGF0YWRvZ1NpZGVjYXJFc3NlbnRpYWwgPz8gdGhpcy5ERUZBVUxUX0RBVEFET0dfU0lERUNBUl9FU1NFTlRJQUw7XG5cbiAgICBjb25zdCBsb2dnaW5nTW9kZUZvclNlcnZpY2UgPSBkYXRhZG9nT3B0aW9ucz8ubG9nZ2luZ01vZGVGb3JTZXJ2aWNlID8/IHRoaXMuREVGQVVMVF9MT0dHSU5HX01PREVfRk9SX1NFUlZJQ0U7XG4gICAgY29uc3QgbG9nZ2luZ01vZGVGb3JEYXRhZG9nQWdlbnQgPSBkYXRhZG9nT3B0aW9ucz8ubG9nZ2luZ01vZGVGb3JEYXRhZG9nQWdlbnQgPz8gdGhpcy5ERUZBVUxUX0xPR0dJTkdfTU9ERV9GT1JfREFUQURPR19TSURFQ0FSO1xuICAgIGNvbnN0IGZpcmVMZW5zTG9nUm91dGVyUmVxdWlyZWQgPVxuICAgICAgbG9nZ2luZ01vZGVGb3JTZXJ2aWNlID09PSBEYXRhRG9nTG9nZ2luZ01vZGUuQVdTX0ZJUkVfTEVOUyB8fFxuICAgICAgbG9nZ2luZ01vZGVGb3JEYXRhZG9nQWdlbnQgPT09IERhdGFEb2dMb2dnaW5nTW9kZS5BV1NfRklSRV9MRU5TO1xuXG4gICAgbGV0IHNlcnZpY2VDb250YWluZXJDcHVVbml0cztcbiAgICBsZXQgc2VydmljZUNvbnRhaW5lck1lbW9yeUxpbWl0TWlCO1xuXG4gICAgaWYgKGZpcmVMZW5zTG9nUm91dGVyUmVxdWlyZWQpIHtcbiAgICAgIHNlcnZpY2VDb250YWluZXJDcHVVbml0cyA9IGZhcmdhdGVPcHRpb25zLmNwdSAtIGRhdGFkb2dTaWRlY2FyQ3B1IC0gdGhpcy5MT0dfUk9VVEVSX0NQVTtcbiAgICAgIHNlcnZpY2VDb250YWluZXJNZW1vcnlMaW1pdE1pQiA9IGZhcmdhdGVPcHRpb25zLm1lbW9yeUxpbWl0TWlCIC0gZGF0YWRvZ1NpZGVjYXJNZW1vcnlNaUIgLSB0aGlzLkxPR19ST1VURVJfTUVNT1JZX0xJTUlUX01JQjtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VydmljZUNvbnRhaW5lckNwdVVuaXRzID0gZmFyZ2F0ZU9wdGlvbnMuY3B1IC0gZGF0YWRvZ1NpZGVjYXJDcHU7XG4gICAgICBzZXJ2aWNlQ29udGFpbmVyTWVtb3J5TGltaXRNaUIgPSBmYXJnYXRlT3B0aW9ucy5tZW1vcnlMaW1pdE1pQiAtIGRhdGFkb2dTaWRlY2FyTWVtb3J5TWlCO1xuICAgIH1cbiAgICB0aGlzLnNlcnZpY2VDb250YWluZXJEZWZpbml0aW9uID0gdGhpcy50YXNrRGVmaW5pdGlvbi5hZGRDb250YWluZXIoc2VydmljZU5hbWUsIHtcbiAgICAgIGltYWdlOiBjb250YWluZXJEZWZpbml0aW9uT3B0aW9uLmltYWdlLFxuICAgICAgY3B1OiBzZXJ2aWNlQ29udGFpbmVyQ3B1VW5pdHMsXG4gICAgICBtZW1vcnlMaW1pdE1pQjogc2VydmljZUNvbnRhaW5lck1lbW9yeUxpbWl0TWlCLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgLi4uRGF0YURvZy5nZXRGYXJnYXRlQ29udGFpbmVyRW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBzdGFnZSxcbiAgICAgICAgICBzZXJ2aWNlTmFtZSxcbiAgICAgICAgICB2ZXJzaW9uLFxuICAgICAgICAgIGFjY291bnROYW1lLFxuICAgICAgICAgIHRlYW1OYW1lLFxuICAgICAgICApLFxuICAgICAgICAuLi5jb250YWluZXJEZWZpbml0aW9uT3B0aW9uLmVudmlyb25tZW50LFxuICAgICAgfSxcbiAgICAgIGRvY2tlckxhYmVsczoge1xuICAgICAgICAuLi5EYXRhRG9nLmdldEZhcmdhdGVEb2NrZXJMYWJlbHMoc3RhZ2UsIHNlcnZpY2VOYW1lLCB2ZXJzaW9uKSxcbiAgICAgIH0sXG4gICAgICBoZWFsdGhDaGVjazogY29udGFpbmVyRGVmaW5pdGlvbk9wdGlvbi5oZWFsdGhDaGVjayxcbiAgICAgIGxvZ2dpbmc6IERhdGFEb2cuc2V0dXBMb2dnaW5nKFxuICAgICAgICBzY29wZSxcbiAgICAgICAgYWNjb3VudE5hbWUsXG4gICAgICAgIHRlYW1OYW1lLFxuICAgICAgICBzdGFnZSxcbiAgICAgICAgc2VydmljZU5hbWUsXG4gICAgICAgIHZlcnNpb24sXG4gICAgICAgIGRhdGFkb2dBcGlLZXlQYXJhbWV0ZXIsXG4gICAgICAgIGxvZ2dpbmdNb2RlRm9yU2VydmljZSxcbiAgICAgICAgZGF0YWRvZ1NpdGUsXG4gICAgICAgICdzZXJ2aWNlJyxcbiAgICAgICksXG4gICAgICBzZWNyZXRzOiBjb250YWluZXJEZWZpbml0aW9uT3B0aW9uLnNlY3JldHMsXG4gICAgfSk7XG5cbiAgICBpZiAoZnJhbWV3b3Jrcz8uaW5jbHVkZXMoRnJhbWV3b3JrLlNQUklORykpIHtcbiAgICAgIFNwcmluZy5hbGxvd1BhcmFtZXRlclN0b3JlQWNjZXNzRm9yU3ByaW5nQ2xvdWRBd3ModGhpcywgc2VydmljZU5hbWUsIHRoaXMudGFza0RlZmluaXRpb24udGFza1JvbGUpO1xuICAgICAgU3ByaW5nLmFsbG93U2VjcmV0c01hbmFnZXJBY2Nlc3NGb3JTcHJpbmdDbG91ZEF3cyh0aGlzLCBzZXJ2aWNlTmFtZSwgdGhpcy50YXNrRGVmaW5pdGlvbi50YXNrUm9sZSk7XG4gICAgfVxuXG4gICAgaWYgKGZpcmVMZW5zTG9nUm91dGVyUmVxdWlyZWQpIHtcbiAgICAgIHRoaXMubG9nUm91dGVyQ29udGFpbmVyRGVmaW5pdGlvbiA9IERhdGFEb2cuYWRkRmlyZUxlbnNMb2dSb3V0ZXIodGhpcy50YXNrRGVmaW5pdGlvbiwgdGhpcy5MT0dfUk9VVEVSX0NQVSwgdGhpcy5MT0dfUk9VVEVSX01FTU9SWV9MSU1JVF9NSUIpO1xuICAgIH1cbiAgICB0aGlzLmRhdGFkb2dTaWRlQ2FyQ29udGFpbmVyRGVmaW5pdGlvbiA9IERhdGFEb2cuYWRkRGF0YWRvZ1NpZGVjYXIoXG4gICAgICBzY29wZSxcbiAgICAgIHRoaXMudGFza0RlZmluaXRpb24sXG4gICAgICBhY2NvdW50TmFtZSxcbiAgICAgIHRlYW1OYW1lLFxuICAgICAgc3RhZ2UsXG4gICAgICBzZXJ2aWNlTmFtZSxcbiAgICAgIHZlcnNpb24sXG4gICAgICBkYXRhZG9nQXBpS2V5UGFyYW1ldGVyLFxuICAgICAgZGF0YWRvZ1NpdGUsXG4gICAgICBsb2dnaW5nTW9kZUZvckRhdGFkb2dBZ2VudCxcbiAgICAgIGRhdGFkb2dPcHRpb25zPy5hcG1HZXRFbmRwb2ludHNUb0lnbm9yZSA/PyB0aGlzLkRFRkFVTFRfQVBNX0dFVF9FTkRQT0lOVFNfVE9fSUdOT1JFLFxuICAgICAgZGF0YWRvZ1NpZGVjYXJDcHUsXG4gICAgICBkYXRhZG9nU2lkZWNhck1lbW9yeU1pQixcbiAgICAgIGRhdGFkb2dTaWRlY2FyRXNzZW50aWFsLFxuICAgICAgcHJvcHMuZGF0YWRvZ09wdGlvbnM/LmRhdGFkb2dTaWRlY2FyVGFnID8/IHRoaXMuREVGQVVMVF9EQVRBRE9HX1NJREVDQVJfVEFHLCAvLyBUaGVzZSBhcmUgcG9zaXRpb25hbCBwYXJhbWV0ZXJzXG4gICAgKTtcblxuICAgIERhdGFEb2cuZW5zdXJlTG9nZ2luZ0FuZE1vbml0b3JpbmdBcmVSZWFkeUJlZm9yZVNlcnZpY2VTdGFydHModGhpcyk7XG5cbiAgICBjb25zdCBsb2FkQmFsYW5jZXJPcHRpb25zRm9yRmFyZ2F0ZVNlcnZpY2UgPSBsb2FkQmFsYW5jZXJPcHRpb25zXG4gICAgICA/IHsgaGVhbHRoQ2hlY2tHcmFjZVBlcmlvZDogbG9hZEJhbGFuY2VyT3B0aW9ucy5oZWFsdGhDaGVja0dyYWNlUGVyaW9kIH1cbiAgICAgIDoge307XG5cbiAgICB0aGlzLnNlcnZpY2UgPSBuZXcgZWNzLkZhcmdhdGVTZXJ2aWNlKHRoaXMsICdTZXJ2aWNlJywge1xuICAgICAgY2x1c3RlcixcbiAgICAgIHRhc2tEZWZpbml0aW9uOiB0aGlzLnRhc2tEZWZpbml0aW9uLFxuICAgICAgY2lyY3VpdEJyZWFrZXI6IHsgcm9sbGJhY2s6IHRydWUgfSxcbiAgICAgIG1heEhlYWx0aHlQZXJjZW50OiAyMDAsXG4gICAgICBtaW5IZWFsdGh5UGVyY2VudDogMTAwLFxuICAgICAgZGVzaXJlZENvdW50OiBmYXJnYXRlT3B0aW9ucz8uZGVzaXJlZENvdW50LFxuICAgICAgLi4ubG9hZEJhbGFuY2VyT3B0aW9uc0ZvckZhcmdhdGVTZXJ2aWNlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5jb25uZWN0aW9ucyA9IHRoaXMuc2VydmljZS5jb25uZWN0aW9ucztcblxuICAgIGlmIChsb2FkQmFsYW5jZXJPcHRpb25zICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lclBvcnQgPSA0NDM7XG4gICAgICB0aGlzLnNlcnZpY2VDb250YWluZXJEZWZpbml0aW9uLmFkZFBvcnRNYXBwaW5ncyh7XG4gICAgICAgIGNvbnRhaW5lclBvcnQ6IGNvbnRhaW5lclBvcnQsXG4gICAgICAgIHByb3RvY29sOiBlY3MuUHJvdG9jb2wuVENQLFxuICAgICAgfSk7XG4gICAgICB0aGlzLnRhcmdldEdyb3VwID0gbmV3IGVsYnYyLkFwcGxpY2F0aW9uVGFyZ2V0R3JvdXAodGhpcywgJ1RhcmdldEdyb3VwJywge1xuICAgICAgICB2cGM6IHZwYyxcbiAgICAgICAgcG9ydDogY29udGFpbmVyUG9ydCxcbiAgICAgICAgcHJvdG9jb2w6IGVsYnYyLkFwcGxpY2F0aW9uUHJvdG9jb2wuSFRUUFMsXG4gICAgICAgIHRhcmdldFR5cGU6IGVsYnYyLlRhcmdldFR5cGUuSVAsXG4gICAgICAgIHRhcmdldHM6IFt0aGlzLnNlcnZpY2VdLFxuICAgICAgICBoZWFsdGhDaGVjazogbG9hZEJhbGFuY2VyT3B0aW9ucy5oZWFsdGhDaGVjayxcbiAgICAgICAgc2xvd1N0YXJ0OiBwcm9wcy5sb2FkQmFsYW5jZXJPcHRpb25zPy5zbG93U3RhcnQgPz8gdGhpcy5ERUZBVUxUX1NMT1dfU1RBUlQsXG4gICAgICAgIGRlcmVnaXN0cmF0aW9uRGVsYXk6IHByb3BzLmxvYWRCYWxhbmNlck9wdGlvbnM/LmRlcmVnaXN0cmF0aW9uRGVsYXkgPz8gdGhpcy5ERUZBVUxUX0RFUkVHSVNUUkFUSU9OX0RFTEFZLFxuICAgICAgfSk7XG5cbiAgICAgIGxvYWRCYWxhbmNlck9wdGlvbnMubGlzdGVuZXJSdWxlcy5mb3JFYWNoKCh7IHByaW9yaXR5LCBjb25kaXRpb25zIH0pID0+IHtcbiAgICAgICAgbG9hZEJhbGFuY2VyT3B0aW9ucy5saXN0ZW5lci5hZGRUYXJnZXRHcm91cHMoYFByaW9yaXR5JHtwcmlvcml0eX1MaXN0ZW5lclJ1bGVgLCB7XG4gICAgICAgICAgdGFyZ2V0R3JvdXBzOiBbdGhpcy50YXJnZXRHcm91cCBhcyBlbGJ2Mi5BcHBsaWNhdGlvblRhcmdldEdyb3VwXSxcbiAgICAgICAgICBwcmlvcml0eTogcHJpb3JpdHksXG4gICAgICAgICAgY29uZGl0aW9uczogY29uZGl0aW9ucyxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import * as iam from 'aws-cdk-lib/aws-iam';
|
|
2
|
+
import { Construct } from 'constructs';
|
|
3
|
+
export declare class Spring {
|
|
4
|
+
static allowParameterStoreAccessForSpringCloudAws(scope: Construct, serviceName: string, role: iam.IRole): void;
|
|
5
|
+
static allowSecretsManagerAccessForSpringCloudAws(scope: Construct, serviceName: string, role: iam.IRole): void;
|
|
6
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Spring = void 0;
|
|
4
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
5
|
+
const iam = require("aws-cdk-lib/aws-iam");
|
|
6
|
+
class Spring {
|
|
7
|
+
// see https://cloud.spring.io/spring-cloud-static/spring-cloud-aws/2.1.0.RELEASE/single/spring-cloud-aws.html#_integrating_your_spring_cloud_application_with_the_aws_parameter_store
|
|
8
|
+
static allowParameterStoreAccessForSpringCloudAws(scope, serviceName, role) {
|
|
9
|
+
const { account: accountId, region } = aws_cdk_lib_1.Stack.of(scope);
|
|
10
|
+
role.addToPrincipalPolicy(new iam.PolicyStatement({
|
|
11
|
+
effect: iam.Effect.ALLOW,
|
|
12
|
+
actions: [
|
|
13
|
+
'ssm:DescribeParameters',
|
|
14
|
+
'ssm:GetParameter',
|
|
15
|
+
'ssm:GetParameterHistory',
|
|
16
|
+
'ssm:GetParameters',
|
|
17
|
+
'ssm:GetParametersByPath',
|
|
18
|
+
],
|
|
19
|
+
resources: [
|
|
20
|
+
`arn:aws:ssm:${region}:${accountId}:parameter/config/${serviceName}*`,
|
|
21
|
+
`arn:aws:ssm:${region}:${accountId}:parameter/config/application*`,
|
|
22
|
+
],
|
|
23
|
+
}));
|
|
24
|
+
}
|
|
25
|
+
// see https://cloud.spring.io/spring-cloud-static/spring-cloud-aws/2.1.0.RELEASE/single/spring-cloud-aws.html#_integrating_your_spring_cloud_application_with_the_aws_secrets_manager
|
|
26
|
+
static allowSecretsManagerAccessForSpringCloudAws(scope, serviceName, role) {
|
|
27
|
+
const { account: accountId, region } = aws_cdk_lib_1.Stack.of(scope);
|
|
28
|
+
role.addToPrincipalPolicy(new iam.PolicyStatement({
|
|
29
|
+
effect: iam.Effect.ALLOW,
|
|
30
|
+
actions: ['secretsmanager:DescribeSecret', 'secretsmanager:GetSecretValue'],
|
|
31
|
+
resources: [
|
|
32
|
+
`arn:aws:ssm:${region}:${accountId}:secret:/secret/${serviceName}*`,
|
|
33
|
+
`arn:aws:ssm:${region}:${accountId}:secret:/secret/application*`,
|
|
34
|
+
],
|
|
35
|
+
}));
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
exports.Spring = Spring;
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ByaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ZhcmdhdGUvc3ByaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUFvQztBQUNwQywyQ0FBMkM7QUFHM0MsTUFBYSxNQUFNO0lBQ2pCLHNMQUFzTDtJQUMvSyxNQUFNLENBQUMsMENBQTBDLENBQUMsS0FBZ0IsRUFBRSxXQUFtQixFQUFFLElBQWU7UUFDN0csTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEdBQUcsbUJBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLG9CQUFvQixDQUN2QixJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUM7WUFDdEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSztZQUN4QixPQUFPLEVBQUU7Z0JBQ1Asd0JBQXdCO2dCQUN4QixrQkFBa0I7Z0JBQ2xCLHlCQUF5QjtnQkFDekIsbUJBQW1CO2dCQUNuQix5QkFBeUI7YUFDMUI7WUFDRCxTQUFTLEVBQUU7Z0JBQ1QsZUFBZSxNQUFNLElBQUksU0FBUyxxQkFBcUIsV0FBVyxHQUFHO2dCQUNyRSxlQUFlLE1BQU0sSUFBSSxTQUFTLGdDQUFnQzthQUNuRTtTQUNGLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVELHNMQUFzTDtJQUMvSyxNQUFNLENBQUMsMENBQTBDLENBQUMsS0FBZ0IsRUFBRSxXQUFtQixFQUFFLElBQWU7UUFDN0csTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEdBQUcsbUJBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLG9CQUFvQixDQUN2QixJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUM7WUFDdEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSztZQUN4QixPQUFPLEVBQUUsQ0FBQywrQkFBK0IsRUFBRSwrQkFBK0IsQ0FBQztZQUMzRSxTQUFTLEVBQUU7Z0JBQ1QsZUFBZSxNQUFNLElBQUksU0FBUyxtQkFBbUIsV0FBVyxHQUFHO2dCQUNuRSxlQUFlLE1BQU0sSUFBSSxTQUFTLDhCQUE4QjthQUNqRTtTQUNGLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztDQUVGO0FBckNELHdCQXFDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbmV4cG9ydCBjbGFzcyBTcHJpbmcge1xuICAvLyBzZWUgaHR0cHM6Ly9jbG91ZC5zcHJpbmcuaW8vc3ByaW5nLWNsb3VkLXN0YXRpYy9zcHJpbmctY2xvdWQtYXdzLzIuMS4wLlJFTEVBU0Uvc2luZ2xlL3NwcmluZy1jbG91ZC1hd3MuaHRtbCNfaW50ZWdyYXRpbmdfeW91cl9zcHJpbmdfY2xvdWRfYXBwbGljYXRpb25fd2l0aF90aGVfYXdzX3BhcmFtZXRlcl9zdG9yZVxuICBwdWJsaWMgc3RhdGljIGFsbG93UGFyYW1ldGVyU3RvcmVBY2Nlc3NGb3JTcHJpbmdDbG91ZEF3cyhzY29wZTogQ29uc3RydWN0LCBzZXJ2aWNlTmFtZTogc3RyaW5nLCByb2xlOiBpYW0uSVJvbGUpIHtcbiAgICBjb25zdCB7IGFjY291bnQ6IGFjY291bnRJZCwgcmVnaW9uIH0gPSBTdGFjay5vZihzY29wZSk7XG4gICAgcm9sZS5hZGRUb1ByaW5jaXBhbFBvbGljeShcbiAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgJ3NzbTpEZXNjcmliZVBhcmFtZXRlcnMnLFxuICAgICAgICAgICdzc206R2V0UGFyYW1ldGVyJyxcbiAgICAgICAgICAnc3NtOkdldFBhcmFtZXRlckhpc3RvcnknLFxuICAgICAgICAgICdzc206R2V0UGFyYW1ldGVycycsXG4gICAgICAgICAgJ3NzbTpHZXRQYXJhbWV0ZXJzQnlQYXRoJyxcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgYGFybjphd3M6c3NtOiR7cmVnaW9ufToke2FjY291bnRJZH06cGFyYW1ldGVyL2NvbmZpZy8ke3NlcnZpY2VOYW1lfSpgLFxuICAgICAgICAgIGBhcm46YXdzOnNzbToke3JlZ2lvbn06JHthY2NvdW50SWR9OnBhcmFtZXRlci9jb25maWcvYXBwbGljYXRpb24qYCxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICAvLyBzZWUgaHR0cHM6Ly9jbG91ZC5zcHJpbmcuaW8vc3ByaW5nLWNsb3VkLXN0YXRpYy9zcHJpbmctY2xvdWQtYXdzLzIuMS4wLlJFTEVBU0Uvc2luZ2xlL3NwcmluZy1jbG91ZC1hd3MuaHRtbCNfaW50ZWdyYXRpbmdfeW91cl9zcHJpbmdfY2xvdWRfYXBwbGljYXRpb25fd2l0aF90aGVfYXdzX3NlY3JldHNfbWFuYWdlclxuICBwdWJsaWMgc3RhdGljIGFsbG93U2VjcmV0c01hbmFnZXJBY2Nlc3NGb3JTcHJpbmdDbG91ZEF3cyhzY29wZTogQ29uc3RydWN0LCBzZXJ2aWNlTmFtZTogc3RyaW5nLCByb2xlOiBpYW0uSVJvbGUpIHtcbiAgICBjb25zdCB7IGFjY291bnQ6IGFjY291bnRJZCwgcmVnaW9uIH0gPSBTdGFjay5vZihzY29wZSk7XG4gICAgcm9sZS5hZGRUb1ByaW5jaXBhbFBvbGljeShcbiAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbJ3NlY3JldHNtYW5hZ2VyOkRlc2NyaWJlU2VjcmV0JywgJ3NlY3JldHNtYW5hZ2VyOkdldFNlY3JldFZhbHVlJ10sXG4gICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgIGBhcm46YXdzOnNzbToke3JlZ2lvbn06JHthY2NvdW50SWR9OnNlY3JldDovc2VjcmV0LyR7c2VydmljZU5hbWV9KmAsXG4gICAgICAgICAgYGFybjphd3M6c3NtOiR7cmVnaW9ufToke2FjY291bnRJZH06c2VjcmV0Oi9zZWNyZXQvYXBwbGljYXRpb24qYCxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxufVxuXG4iXX0=
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export * from './watchful/alb';
|
|
2
|
+
export * from './watchful/aspect';
|
|
3
|
+
export * from './watchful/ecs';
|
|
4
|
+
export * from './watchful/docdb';
|
|
5
|
+
export * from './watchful/dynamodb';
|
|
6
|
+
export * from './watchful/lambda';
|
|
7
|
+
export * from './watchful/targetgroup';
|
|
8
|
+
export * from './watchful/datadog-metric-alarm';
|
|
9
|
+
export * from './watchful/datadog-log-alarm';
|
|
10
|
+
export * from './watchful/watchful';
|
|
11
|
+
export * from './watchful/metric-alarm';
|
|
12
|
+
export * from './watchful/rds';
|
|
13
|
+
export * from './watchful/cloudfront';
|
|
14
|
+
export * from './rio-landing-zone';
|
|
15
|
+
export * from './rio-load-balancer';
|
|
16
|
+
export * from './rio-claidometer';
|
|
17
|
+
export * from './fargate/rio-fargate-service';
|
|
18
|
+
export * from './pipeline/rio-bitbucket-source-action';
|
|
19
|
+
export * from './pipeline/rio-backup-secrets-restore-stage';
|
|
20
|
+
export * from './kafka';
|
|
21
|
+
export * from './datadog';
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
10
|
+
for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
|
|
11
|
+
};
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
__exportStar(require("./watchful/alb"), exports);
|
|
14
|
+
__exportStar(require("./watchful/aspect"), exports);
|
|
15
|
+
__exportStar(require("./watchful/ecs"), exports);
|
|
16
|
+
__exportStar(require("./watchful/docdb"), exports);
|
|
17
|
+
__exportStar(require("./watchful/dynamodb"), exports);
|
|
18
|
+
__exportStar(require("./watchful/lambda"), exports);
|
|
19
|
+
__exportStar(require("./watchful/targetgroup"), exports);
|
|
20
|
+
__exportStar(require("./watchful/datadog-metric-alarm"), exports);
|
|
21
|
+
__exportStar(require("./watchful/datadog-log-alarm"), exports);
|
|
22
|
+
__exportStar(require("./watchful/watchful"), exports);
|
|
23
|
+
__exportStar(require("./watchful/metric-alarm"), exports);
|
|
24
|
+
__exportStar(require("./watchful/rds"), exports);
|
|
25
|
+
__exportStar(require("./watchful/cloudfront"), exports);
|
|
26
|
+
__exportStar(require("./rio-landing-zone"), exports);
|
|
27
|
+
__exportStar(require("./rio-load-balancer"), exports);
|
|
28
|
+
__exportStar(require("./rio-claidometer"), exports);
|
|
29
|
+
__exportStar(require("./fargate/rio-fargate-service"), exports);
|
|
30
|
+
__exportStar(require("./pipeline/rio-bitbucket-source-action"), exports);
|
|
31
|
+
__exportStar(require("./pipeline/rio-backup-secrets-restore-stage"), exports);
|
|
32
|
+
__exportStar(require("./kafka"), exports);
|
|
33
|
+
__exportStar(require("./datadog"), exports);
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsaURBQStCO0FBQy9CLG9EQUFrQztBQUNsQyxpREFBK0I7QUFDL0IsbURBQWlDO0FBQ2pDLHNEQUFvQztBQUNwQyxvREFBa0M7QUFDbEMseURBQXVDO0FBQ3ZDLGtFQUFnRDtBQUNoRCwrREFBNkM7QUFDN0Msc0RBQW9DO0FBQ3BDLDBEQUF3QztBQUN4QyxpREFBK0I7QUFDL0Isd0RBQXNDO0FBRXRDLHFEQUFtQztBQUNuQyxzREFBb0M7QUFDcEMsb0RBQWtDO0FBRWxDLGdFQUE4QztBQUU5Qyx5RUFBdUQ7QUFDdkQsOEVBQTREO0FBRTVELDBDQUF3QjtBQUV4Qiw0Q0FBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3dhdGNoZnVsL2FsYic7XG5leHBvcnQgKiBmcm9tICcuL3dhdGNoZnVsL2FzcGVjdCc7XG5leHBvcnQgKiBmcm9tICcuL3dhdGNoZnVsL2Vjcyc7XG5leHBvcnQgKiBmcm9tICcuL3dhdGNoZnVsL2RvY2RiJztcbmV4cG9ydCAqIGZyb20gJy4vd2F0Y2hmdWwvZHluYW1vZGInO1xuZXhwb3J0ICogZnJvbSAnLi93YXRjaGZ1bC9sYW1iZGEnO1xuZXhwb3J0ICogZnJvbSAnLi93YXRjaGZ1bC90YXJnZXRncm91cCc7XG5leHBvcnQgKiBmcm9tICcuL3dhdGNoZnVsL2RhdGFkb2ctbWV0cmljLWFsYXJtJztcbmV4cG9ydCAqIGZyb20gJy4vd2F0Y2hmdWwvZGF0YWRvZy1sb2ctYWxhcm0nO1xuZXhwb3J0ICogZnJvbSAnLi93YXRjaGZ1bC93YXRjaGZ1bCc7XG5leHBvcnQgKiBmcm9tICcuL3dhdGNoZnVsL21ldHJpYy1hbGFybSc7XG5leHBvcnQgKiBmcm9tICcuL3dhdGNoZnVsL3Jkcyc7XG5leHBvcnQgKiBmcm9tICcuL3dhdGNoZnVsL2Nsb3VkZnJvbnQnO1xuXG5leHBvcnQgKiBmcm9tICcuL3Jpby1sYW5kaW5nLXpvbmUnO1xuZXhwb3J0ICogZnJvbSAnLi9yaW8tbG9hZC1iYWxhbmNlcic7XG5leHBvcnQgKiBmcm9tICcuL3Jpby1jbGFpZG9tZXRlcic7XG5cbmV4cG9ydCAqIGZyb20gJy4vZmFyZ2F0ZS9yaW8tZmFyZ2F0ZS1zZXJ2aWNlJztcblxuZXhwb3J0ICogZnJvbSAnLi9waXBlbGluZS9yaW8tYml0YnVja2V0LXNvdXJjZS1hY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9waXBlbGluZS9yaW8tYmFja3VwLXNlY3JldHMtcmVzdG9yZS1zdGFnZSc7XG5cbmV4cG9ydCAqIGZyb20gJy4va2Fma2EnO1xuXG5leHBvcnQgKiBmcm9tICcuL2RhdGFkb2cnO1xuIl19
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
10
|
+
for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
|
|
11
|
+
};
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
__exportStar(require("./kafka-topic"), exports);
|
|
14
|
+
__exportStar(require("./kafka-event-spec"), exports);
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMva2Fma2EvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsZ0RBQThCO0FBQzlCLHFEQUFtQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4va2Fma2EtdG9waWMnO1xuZXhwb3J0ICogZnJvbSAnLi9rYWZrYS1ldmVudC1zcGVjJztcbiJdfQ==
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Construct } from 'constructs';
|
|
2
|
+
export interface KafkaEventSpecProps {
|
|
3
|
+
readonly source: KafkaEventSpecSource;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Construct to provide an event specification for a Kafka topic and upload it to the central event store.
|
|
7
|
+
*/
|
|
8
|
+
export declare class KafkaEventSpec extends Construct {
|
|
9
|
+
constructor(scope: Construct, id: string, props: KafkaEventSpecProps);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Wrapper class for the event spec itself to support providing it via file or inline string.
|
|
13
|
+
*
|
|
14
|
+
* @see https://collaboration.msi.audi.com/stash/projects/RSEVTBU/repos/topic-creation-example for
|
|
15
|
+
* further information about the yaml spec.
|
|
16
|
+
*/
|
|
17
|
+
export declare class KafkaEventSpecSource {
|
|
18
|
+
private spec;
|
|
19
|
+
/**
|
|
20
|
+
* Helper method to create a KafkaEventSpecSource by loading spec from a (UTF-8 encoded) yaml file.
|
|
21
|
+
*
|
|
22
|
+
* @param filename the filename of the event specification file. Must either be an absolute path or a path relative to CDK's working directory.
|
|
23
|
+
* @returns a KafkaEventSpecSource
|
|
24
|
+
*/
|
|
25
|
+
static fromYamlFile(filename: string): KafkaEventSpecSource;
|
|
26
|
+
/**
|
|
27
|
+
* Helper method to create a KafkaEventSpecSource from an inline yaml string.
|
|
28
|
+
*
|
|
29
|
+
* @param spec as yaml formatted string
|
|
30
|
+
* @returns a KafkaEventSpecSource
|
|
31
|
+
*/
|
|
32
|
+
static fromYamlString(spec: string): KafkaEventSpecSource;
|
|
33
|
+
private static parseYamlSpec;
|
|
34
|
+
private static isKafkaEventSpecification;
|
|
35
|
+
private static determineEventNameFromSpecification;
|
|
36
|
+
private static removeYamlFileEnding;
|
|
37
|
+
readonly eventName: string;
|
|
38
|
+
private constructor();
|
|
39
|
+
/**
|
|
40
|
+
* @returns the message base64 encoded spec as expected by the event store
|
|
41
|
+
*/
|
|
42
|
+
toSnsMessage(): string;
|
|
43
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a, _b;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.KafkaEventSpecSource = exports.KafkaEventSpec = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
const fs = require("fs");
|
|
7
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
8
|
+
const kms = require("aws-cdk-lib/aws-kms");
|
|
9
|
+
const cr = require("aws-cdk-lib/custom-resources");
|
|
10
|
+
const constructs_1 = require("constructs");
|
|
11
|
+
const yaml = require("js-yaml");
|
|
12
|
+
/**
|
|
13
|
+
* Construct to provide an event specification for a Kafka topic and upload it to the central event store.
|
|
14
|
+
*/
|
|
15
|
+
class KafkaEventSpec extends constructs_1.Construct {
|
|
16
|
+
constructor(scope, id, props) {
|
|
17
|
+
super(scope, id);
|
|
18
|
+
const action = {
|
|
19
|
+
service: 'SNS',
|
|
20
|
+
action: 'publish',
|
|
21
|
+
parameters: {
|
|
22
|
+
TopicArn: 'arn:aws:sns:eu-west-1:186993757734:event-specification-upload',
|
|
23
|
+
Message: props.source.toSnsMessage(),
|
|
24
|
+
MessageAttributes: {
|
|
25
|
+
accountId: {
|
|
26
|
+
DataType: 'String',
|
|
27
|
+
StringValue: aws_cdk_lib_1.Stack.of(this).account,
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
physicalResourceId: cr.PhysicalResourceId.of(`arn:aws:s3:::event-specification-store-186993757734/${props.source.eventName}.yaml`),
|
|
32
|
+
};
|
|
33
|
+
const eventSpecCustomResource = new cr.AwsCustomResource(this, 'KafkaEventSpec', {
|
|
34
|
+
onCreate: action,
|
|
35
|
+
onUpdate: action,
|
|
36
|
+
policy: cr.AwsCustomResourcePolicy.fromSdkCalls({ resources: cr.AwsCustomResourcePolicy.ANY_RESOURCE }),
|
|
37
|
+
});
|
|
38
|
+
const kmsKey = kms.Key.fromKeyArn(this, 'eventSpecSnsTopicKey', 'arn:aws:kms:eu-west-1:186993757734:key/1f72dd59-f32d-4d52-9b2b-447df88b3fa3');
|
|
39
|
+
kmsKey.grantEncryptDecrypt(eventSpecCustomResource);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
exports.KafkaEventSpec = KafkaEventSpec;
|
|
43
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
44
|
+
KafkaEventSpec[_a] = { fqn: "@rio-cloud/cdk-v2-constructs.KafkaEventSpec", version: "0.0.0" };
|
|
45
|
+
/**
|
|
46
|
+
* Wrapper class for the event spec itself to support providing it via file or inline string.
|
|
47
|
+
*
|
|
48
|
+
* @see https://collaboration.msi.audi.com/stash/projects/RSEVTBU/repos/topic-creation-example for
|
|
49
|
+
* further information about the yaml spec.
|
|
50
|
+
*/
|
|
51
|
+
class KafkaEventSpecSource {
|
|
52
|
+
constructor(spec) {
|
|
53
|
+
this.spec = spec;
|
|
54
|
+
this.eventName = KafkaEventSpecSource.determineEventNameFromSpecification(spec);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Helper method to create a KafkaEventSpecSource by loading spec from a (UTF-8 encoded) yaml file.
|
|
58
|
+
*
|
|
59
|
+
* @param filename the filename of the event specification file. Must either be an absolute path or a path relative to CDK's working directory.
|
|
60
|
+
* @returns a KafkaEventSpecSource
|
|
61
|
+
*/
|
|
62
|
+
static fromYamlFile(filename) {
|
|
63
|
+
return this.fromYamlString(fs.readFileSync(filename, 'utf8'));
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Helper method to create a KafkaEventSpecSource from an inline yaml string.
|
|
67
|
+
*
|
|
68
|
+
* @param spec as yaml formatted string
|
|
69
|
+
* @returns a KafkaEventSpecSource
|
|
70
|
+
*/
|
|
71
|
+
static fromYamlString(spec) {
|
|
72
|
+
const parsedSpec = this.parseYamlSpec(spec);
|
|
73
|
+
return new KafkaEventSpecSource(parsedSpec);
|
|
74
|
+
}
|
|
75
|
+
static parseYamlSpec(spec) {
|
|
76
|
+
const parsedYamlSpec = yaml.load(spec);
|
|
77
|
+
if (!this.isKafkaEventSpecification(parsedYamlSpec)) {
|
|
78
|
+
throw Error('Expecting event spec to be describe an object with the property [info.x-event].');
|
|
79
|
+
}
|
|
80
|
+
return parsedYamlSpec;
|
|
81
|
+
}
|
|
82
|
+
static isKafkaEventSpecification(parsedYamlSpec) {
|
|
83
|
+
var _c;
|
|
84
|
+
return typeof parsedYamlSpec === 'object' && ((_c = parsedYamlSpec === null || parsedYamlSpec === void 0 ? void 0 : parsedYamlSpec.info) === null || _c === void 0 ? void 0 : _c['x-event']);
|
|
85
|
+
}
|
|
86
|
+
static determineEventNameFromSpecification(spec) {
|
|
87
|
+
const eventNames = Object.keys(spec.info['x-event']);
|
|
88
|
+
if (eventNames.length === 0) {
|
|
89
|
+
throw Error('Expecting at least one event at [info.x-event].');
|
|
90
|
+
}
|
|
91
|
+
return this.removeYamlFileEnding(eventNames[0]);
|
|
92
|
+
}
|
|
93
|
+
static removeYamlFileEnding(filename) {
|
|
94
|
+
return filename.replace(/\.ya?ml$/, '');
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* @returns the message base64 encoded spec as expected by the event store
|
|
98
|
+
*/
|
|
99
|
+
toSnsMessage() {
|
|
100
|
+
return Buffer.from(yaml.dump(this.spec)).toString('base64');
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
exports.KafkaEventSpecSource = KafkaEventSpecSource;
|
|
104
|
+
_b = JSII_RTTI_SYMBOL_1;
|
|
105
|
+
KafkaEventSpecSource[_b] = { fqn: "@rio-cloud/cdk-v2-constructs.KafkaEventSpecSource", version: "0.0.0" };
|
|
106
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2Fma2EtZXZlbnQtc3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9rYWZrYS9rYWZrYS1ldmVudC1zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEseUJBQXlCO0FBQ3pCLDZDQUFvQztBQUNwQywyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELDJDQUF1QztBQUN2QyxnQ0FBZ0M7QUFNaEM7O0dBRUc7QUFDSCxNQUFhLGNBQWUsU0FBUSxzQkFBUztJQUMzQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTBCO1FBQ2xFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsTUFBTSxNQUFNLEdBQWtCO1lBQzVCLE9BQU8sRUFBRSxLQUFLO1lBQ2QsTUFBTSxFQUFFLFNBQVM7WUFDakIsVUFBVSxFQUFFO2dCQUNWLFFBQVEsRUFBRSwrREFBK0Q7Z0JBQ3pFLE9BQU8sRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRTtnQkFDcEMsaUJBQWlCLEVBQUU7b0JBQ2pCLFNBQVMsRUFBRTt3QkFDVCxRQUFRLEVBQUUsUUFBUTt3QkFDbEIsV0FBVyxFQUFFLG1CQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU87cUJBQ3BDO2lCQUNGO2FBQ0Y7WUFDRCxrQkFBa0IsRUFBRSxFQUFFLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLHVEQUF1RCxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsT0FBTyxDQUFDO1NBQ25JLENBQUM7UUFFRixNQUFNLHVCQUF1QixHQUFHLElBQUksRUFBRSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtZQUMvRSxRQUFRLEVBQUUsTUFBTTtZQUNoQixRQUFRLEVBQUUsTUFBTTtZQUNoQixNQUFNLEVBQUUsRUFBRSxDQUFDLHVCQUF1QixDQUFDLFlBQVksQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsdUJBQXVCLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDeEcsQ0FBQyxDQUFDO1FBRUgsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLHNCQUFzQixFQUFFLDZFQUE2RSxDQUFDLENBQUM7UUFDL0ksTUFBTSxDQUFDLG1CQUFtQixDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFDdEQsQ0FBQzs7QUE1Qkgsd0NBNkJDOzs7QUFFRDs7Ozs7R0FLRztBQUNILE1BQWEsb0JBQW9CO0lBZ0QvQixZQUE0QixJQUE2QjtRQUE3QixTQUFJLEdBQUosSUFBSSxDQUF5QjtRQUN2RCxJQUFJLENBQUMsU0FBUyxHQUFHLG9CQUFvQixDQUFDLG1DQUFtQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xGLENBQUM7SUFqREQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQWdCO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBWTtRQUNoQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDLE9BQU8sSUFBSSxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRU8sTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFZO1FBQ3ZDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFRLENBQUM7UUFDOUMsSUFBSSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxjQUFjLENBQUMsRUFBRTtZQUNuRCxNQUFNLEtBQUssQ0FBQyxpRkFBaUYsQ0FBQyxDQUFDO1NBQ2hHO1FBQ0QsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQztJQUVPLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxjQUFtQjs7UUFDMUQsT0FBTyxPQUFPLGNBQWMsS0FBSyxRQUFRLFdBQUksY0FBYyxhQUFkLGNBQWMsdUJBQWQsY0FBYyxDQUFFLElBQUksMENBQUcsU0FBUyxFQUFDLENBQUM7SUFDakYsQ0FBQztJQUVPLE1BQU0sQ0FBQyxtQ0FBbUMsQ0FBQyxJQUE2QjtRQUM5RSxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUNyRCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzNCLE1BQU0sS0FBSyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7U0FDaEU7UUFDRCxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRU8sTUFBTSxDQUFDLG9CQUFvQixDQUFDLFFBQWdCO1FBQ2xELE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQVFEOztPQUVHO0lBQ0gsWUFBWTtRQUNWLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM5RCxDQUFDOztBQXpESCxvREEwREMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgeyBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGttcyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mta21zJztcbmltcG9ydCAqIGFzIGNyIGZyb20gJ2F3cy1jZGstbGliL2N1c3RvbS1yZXNvdXJjZXMnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEthZmthRXZlbnRTcGVjUHJvcHMge1xuICByZWFkb25seSBzb3VyY2U6IEthZmthRXZlbnRTcGVjU291cmNlO1xufVxuXG4vKipcbiAqIENvbnN0cnVjdCB0byBwcm92aWRlIGFuIGV2ZW50IHNwZWNpZmljYXRpb24gZm9yIGEgS2Fma2EgdG9waWMgYW5kIHVwbG9hZCBpdCB0byB0aGUgY2VudHJhbCBldmVudCBzdG9yZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEthZmthRXZlbnRTcGVjIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEthZmthRXZlbnRTcGVjUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3QgYWN0aW9uOiBjci5Bd3NTZGtDYWxsID0ge1xuICAgICAgc2VydmljZTogJ1NOUycsXG4gICAgICBhY3Rpb246ICdwdWJsaXNoJyxcbiAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgVG9waWNBcm46ICdhcm46YXdzOnNuczpldS13ZXN0LTE6MTg2OTkzNzU3NzM0OmV2ZW50LXNwZWNpZmljYXRpb24tdXBsb2FkJyxcbiAgICAgICAgTWVzc2FnZTogcHJvcHMuc291cmNlLnRvU25zTWVzc2FnZSgpLFxuICAgICAgICBNZXNzYWdlQXR0cmlidXRlczoge1xuICAgICAgICAgIGFjY291bnRJZDoge1xuICAgICAgICAgICAgRGF0YVR5cGU6ICdTdHJpbmcnLFxuICAgICAgICAgICAgU3RyaW5nVmFsdWU6IFN0YWNrLm9mKHRoaXMpLmFjY291bnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBwaHlzaWNhbFJlc291cmNlSWQ6IGNyLlBoeXNpY2FsUmVzb3VyY2VJZC5vZihgYXJuOmF3czpzMzo6OmV2ZW50LXNwZWNpZmljYXRpb24tc3RvcmUtMTg2OTkzNzU3NzM0LyR7cHJvcHMuc291cmNlLmV2ZW50TmFtZX0ueWFtbGApLFxuICAgIH07XG5cbiAgICBjb25zdCBldmVudFNwZWNDdXN0b21SZXNvdXJjZSA9IG5ldyBjci5Bd3NDdXN0b21SZXNvdXJjZSh0aGlzLCAnS2Fma2FFdmVudFNwZWMnLCB7XG4gICAgICBvbkNyZWF0ZTogYWN0aW9uLFxuICAgICAgb25VcGRhdGU6IGFjdGlvbixcbiAgICAgIHBvbGljeTogY3IuQXdzQ3VzdG9tUmVzb3VyY2VQb2xpY3kuZnJvbVNka0NhbGxzKHsgcmVzb3VyY2VzOiBjci5Bd3NDdXN0b21SZXNvdXJjZVBvbGljeS5BTllfUkVTT1VSQ0UgfSksXG4gICAgfSk7XG5cbiAgICBjb25zdCBrbXNLZXkgPSBrbXMuS2V5LmZyb21LZXlBcm4odGhpcywgJ2V2ZW50U3BlY1Nuc1RvcGljS2V5JywgJ2Fybjphd3M6a21zOmV1LXdlc3QtMToxODY5OTM3NTc3MzQ6a2V5LzFmNzJkZDU5LWYzMmQtNGQ1Mi05YjJiLTQ0N2RmODhiM2ZhMycpO1xuICAgIGttc0tleS5ncmFudEVuY3J5cHREZWNyeXB0KGV2ZW50U3BlY0N1c3RvbVJlc291cmNlKTtcbiAgfVxufVxuXG4vKipcbiAqIFdyYXBwZXIgY2xhc3MgZm9yIHRoZSBldmVudCBzcGVjIGl0c2VsZiB0byBzdXBwb3J0IHByb3ZpZGluZyBpdCB2aWEgZmlsZSBvciBpbmxpbmUgc3RyaW5nLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9jb2xsYWJvcmF0aW9uLm1zaS5hdWRpLmNvbS9zdGFzaC9wcm9qZWN0cy9SU0VWVEJVL3JlcG9zL3RvcGljLWNyZWF0aW9uLWV4YW1wbGUgZm9yXG4gKiBmdXJ0aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSB5YW1sIHNwZWMuXG4gKi9cbmV4cG9ydCBjbGFzcyBLYWZrYUV2ZW50U3BlY1NvdXJjZSB7XG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIHRvIGNyZWF0ZSBhIEthZmthRXZlbnRTcGVjU291cmNlIGJ5IGxvYWRpbmcgc3BlYyBmcm9tIGEgKFVURi04IGVuY29kZWQpIHlhbWwgZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIGZpbGVuYW1lIHRoZSBmaWxlbmFtZSBvZiB0aGUgZXZlbnQgc3BlY2lmaWNhdGlvbiBmaWxlLiBNdXN0IGVpdGhlciBiZSBhbiBhYnNvbHV0ZSBwYXRoIG9yIGEgcGF0aCByZWxhdGl2ZSB0byBDREsncyB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICogQHJldHVybnMgYSBLYWZrYUV2ZW50U3BlY1NvdXJjZVxuICAgKi9cbiAgc3RhdGljIGZyb21ZYW1sRmlsZShmaWxlbmFtZTogc3RyaW5nKTogS2Fma2FFdmVudFNwZWNTb3VyY2Uge1xuICAgIHJldHVybiB0aGlzLmZyb21ZYW1sU3RyaW5nKGZzLnJlYWRGaWxlU3luYyhmaWxlbmFtZSwgJ3V0ZjgnKSk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB0byBjcmVhdGUgYSBLYWZrYUV2ZW50U3BlY1NvdXJjZSBmcm9tIGFuIGlubGluZSB5YW1sIHN0cmluZy5cbiAgICpcbiAgICogQHBhcmFtIHNwZWMgYXMgeWFtbCBmb3JtYXR0ZWQgc3RyaW5nXG4gICAqIEByZXR1cm5zIGEgS2Fma2FFdmVudFNwZWNTb3VyY2VcbiAgICovXG4gIHN0YXRpYyBmcm9tWWFtbFN0cmluZyhzcGVjOiBzdHJpbmcpOiBLYWZrYUV2ZW50U3BlY1NvdXJjZSB7XG4gICAgY29uc3QgcGFyc2VkU3BlYyA9IHRoaXMucGFyc2VZYW1sU3BlYyhzcGVjKTtcbiAgICByZXR1cm4gbmV3IEthZmthRXZlbnRTcGVjU291cmNlKHBhcnNlZFNwZWMpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VZYW1sU3BlYyhzcGVjOiBzdHJpbmcpOiBLYWZrYUV2ZW50U3BlY2lmaWNhdGlvbiB7XG4gICAgY29uc3QgcGFyc2VkWWFtbFNwZWMgPSB5YW1sLmxvYWQoc3BlYykgYXMgYW55O1xuICAgIGlmICghdGhpcy5pc0thZmthRXZlbnRTcGVjaWZpY2F0aW9uKHBhcnNlZFlhbWxTcGVjKSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0V4cGVjdGluZyBldmVudCBzcGVjIHRvIGJlIGRlc2NyaWJlIGFuIG9iamVjdCB3aXRoIHRoZSBwcm9wZXJ0eSBbaW5mby54LWV2ZW50XS4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlZFlhbWxTcGVjO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgaXNLYWZrYUV2ZW50U3BlY2lmaWNhdGlvbihwYXJzZWRZYW1sU3BlYzogYW55KTogcGFyc2VkWWFtbFNwZWMgaXMgS2Fma2FFdmVudFNwZWNpZmljYXRpb24ge1xuICAgIHJldHVybiB0eXBlb2YgcGFyc2VkWWFtbFNwZWMgPT09ICdvYmplY3QnICYmIHBhcnNlZFlhbWxTcGVjPy5pbmZvPy5bJ3gtZXZlbnQnXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGRldGVybWluZUV2ZW50TmFtZUZyb21TcGVjaWZpY2F0aW9uKHNwZWM6IEthZmthRXZlbnRTcGVjaWZpY2F0aW9uKTogc3RyaW5nIHtcbiAgICBjb25zdCBldmVudE5hbWVzID0gT2JqZWN0LmtleXMoc3BlYy5pbmZvWyd4LWV2ZW50J10pO1xuICAgIGlmIChldmVudE5hbWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0V4cGVjdGluZyBhdCBsZWFzdCBvbmUgZXZlbnQgYXQgW2luZm8ueC1ldmVudF0uJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlbW92ZVlhbWxGaWxlRW5kaW5nKGV2ZW50TmFtZXNbMF0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVtb3ZlWWFtbEZpbGVFbmRpbmcoZmlsZW5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZpbGVuYW1lLnJlcGxhY2UoL1xcLnlhP21sJC8sICcnKTtcbiAgfVxuXG4gIHJlYWRvbmx5IGV2ZW50TmFtZTogc3RyaW5nO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJpdmF0ZSBzcGVjOiBLYWZrYUV2ZW50U3BlY2lmaWNhdGlvbikge1xuICAgIHRoaXMuZXZlbnROYW1lID0gS2Fma2FFdmVudFNwZWNTb3VyY2UuZGV0ZXJtaW5lRXZlbnROYW1lRnJvbVNwZWNpZmljYXRpb24oc3BlYyk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgdGhlIG1lc3NhZ2UgYmFzZTY0IGVuY29kZWQgc3BlYyBhcyBleHBlY3RlZCBieSB0aGUgZXZlbnQgc3RvcmVcbiAgICovXG4gIHRvU25zTWVzc2FnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbSh5YW1sLmR1bXAodGhpcy5zcGVjKSkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICB9XG59XG5cbi8vIFRoaXMgdHlwZSBpcyBub3QgZXhoYXVzdGl2ZSBidXQgb25seSByZWZsZWN0cyB0aGUgbWluaW11bSBwcm9wZXJ0aWVzIHJlcXVpcmVkIHRvIHZhbGlkYXRlIHRoZSBldmVudCBzcGVjaWZpY2F0aW9uXG5pbnRlcmZhY2UgS2Fma2FFdmVudFNwZWNpZmljYXRpb24ge1xuICBpbmZvOiB7XG4gICAgJ3gtZXZlbnQnOiB7IFtldmVudE5hbWU6IHN0cmluZ106IGFueSB9W107XG4gIH07XG59XG4iXX0=
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { Duration } from 'aws-cdk-lib';
|
|
2
|
+
import { Construct } from 'constructs';
|
|
3
|
+
import { KafkaEventSpecSource } from './kafka-event-spec';
|
|
4
|
+
/**
|
|
5
|
+
* Wrapper for all meta data of a topic.
|
|
6
|
+
*/
|
|
7
|
+
export interface KafkaTopicMetaData {
|
|
8
|
+
/**
|
|
9
|
+
* The event specs of the events on that topic
|
|
10
|
+
*/
|
|
11
|
+
readonly events: KafkaEventSpecSource[];
|
|
12
|
+
/**
|
|
13
|
+
* Describes the intent of the topic. This might be information about the events on that topic
|
|
14
|
+
* or additional information about the producer and the context of the events.
|
|
15
|
+
*/
|
|
16
|
+
readonly description: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Read and write permissions for the topic.
|
|
20
|
+
*
|
|
21
|
+
* strings are matched against the CNAME of the certificate of the Kafka clients.
|
|
22
|
+
*/
|
|
23
|
+
export interface KafkaAclStatement {
|
|
24
|
+
/**
|
|
25
|
+
* List of clients that should get write permissions
|
|
26
|
+
*/
|
|
27
|
+
readonly write: string[];
|
|
28
|
+
/**
|
|
29
|
+
* List of clients that should get read permissions
|
|
30
|
+
*/
|
|
31
|
+
readonly read: string[];
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Wrapper for all log compaction related properties.
|
|
35
|
+
*/
|
|
36
|
+
export interface LogCompactionProperties {
|
|
37
|
+
/**
|
|
38
|
+
* The amount of time to retain delete tombstone markers for log compacted topics;
|
|
39
|
+
* The soft limit is 10 days but can be increased upon requests.
|
|
40
|
+
* @default 1 day
|
|
41
|
+
*/
|
|
42
|
+
readonly deleteRetention?: Duration;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* The current service limits can be found in the topic limits configuration of the topic manager.
|
|
46
|
+
*
|
|
47
|
+
* @see https://collaboration.msi.audi.com/stash/projects/RSEVTBU/repos/topic-manager/browse/config/topic-service-limits.yaml
|
|
48
|
+
*/
|
|
49
|
+
export interface KafkaTopicProps {
|
|
50
|
+
/**
|
|
51
|
+
* The unique name of the topic; has to match pattern [A-Za-z0-9.-]+
|
|
52
|
+
*/
|
|
53
|
+
readonly name: string;
|
|
54
|
+
/**
|
|
55
|
+
* Defines degree of parallelism of the topic; should be increased for
|
|
56
|
+
* large expected loads (e.g., 25 for rio.asset-iot-events).
|
|
57
|
+
* The soft limit is 10 partitions but can be increased upon requests.
|
|
58
|
+
*/
|
|
59
|
+
readonly numberOfPartitions: number;
|
|
60
|
+
/**
|
|
61
|
+
* Defines degree of replication of messages; has to be between 1 and the number of brokers (currently 3).
|
|
62
|
+
* @default 3
|
|
63
|
+
*/
|
|
64
|
+
readonly replicationFactor?: number;
|
|
65
|
+
/**
|
|
66
|
+
* Time how long messages are retained on Kafka cluster;
|
|
67
|
+
*
|
|
68
|
+
* We recommend 30 days for general events and 7 days for sensor events and other high-load cases.
|
|
69
|
+
* The soft limit is 3 to 30 days but can be increased upon requests.
|
|
70
|
+
* @default 7 days
|
|
71
|
+
*/
|
|
72
|
+
readonly retention?: Duration;
|
|
73
|
+
/**
|
|
74
|
+
* If set to 'false, the topic's data will be deleted on Kafka 10 days after stack deletion.
|
|
75
|
+
* If set to 'true', it will be deleted immediately after stack deletion.
|
|
76
|
+
* @default false
|
|
77
|
+
*/
|
|
78
|
+
readonly instantDeletionEnabled?: boolean;
|
|
79
|
+
/**
|
|
80
|
+
* The metadata of the topic.
|
|
81
|
+
*/
|
|
82
|
+
readonly metadata: KafkaTopicMetaData;
|
|
83
|
+
/**
|
|
84
|
+
* The permissions to access to the topic's data.
|
|
85
|
+
*/
|
|
86
|
+
readonly acl: KafkaAclStatement;
|
|
87
|
+
/**
|
|
88
|
+
* Specify whether the topic is log compacted or not.
|
|
89
|
+
*/
|
|
90
|
+
readonly isLogCompacted: boolean;
|
|
91
|
+
/**
|
|
92
|
+
* Must only be provided if 'isLogCompacted' is 'true'.
|
|
93
|
+
* @default undefined
|
|
94
|
+
*/
|
|
95
|
+
readonly logCompactionProperties?: LogCompactionProperties;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Construct to create a kafka topic.
|
|
99
|
+
*/
|
|
100
|
+
export declare class KafkaTopic extends Construct {
|
|
101
|
+
constructor(scope: Construct, id: string, props: KafkaTopicProps);
|
|
102
|
+
}
|