datadog-ecs-cdk
Advanced tools
Comparing version 1.1.1 to 1.2.0
@@ -1,54 +0,2 @@ | ||
import { Construct } from 'constructs'; | ||
import * as ecs from 'aws-cdk-lib/aws-ecs'; | ||
import type * as secretsmanager from 'aws-cdk-lib/aws-secretsmanager'; | ||
export interface EcsDatadogDaemonServiceProps { | ||
readonly ecsCluster: ecs.Cluster; | ||
readonly datadogApiKeySecret: secretsmanager.ISecret; | ||
readonly datadogSite?: string; | ||
readonly logsDisabled?: boolean; | ||
} | ||
export declare class EcsDatadogDaemonService extends Construct { | ||
constructor(scope: Construct, id: string, props: EcsDatadogDaemonServiceProps); | ||
} | ||
export interface AddDatadogToFargateTaskProps { | ||
datadogApiKeySecret: ecs.Secret; | ||
datadogSite?: string; | ||
agent?: { | ||
enabled?: boolean; | ||
image?: ecs.ContainerImage; | ||
imageTag?: string; | ||
memoryLimitMiB?: number; | ||
cpu?: number; | ||
logToCloudWatch?: boolean; | ||
apm?: { | ||
enabled?: boolean; | ||
port?: number; | ||
applicationEnvVars?: { | ||
doNotSet?: boolean; | ||
apmHostEnvVarName?: string; | ||
apmPortEnvVarName?: string; | ||
apmTraceEnabledEnvVarName?: string; | ||
}; | ||
}; | ||
statsd?: { | ||
enabled?: boolean; | ||
port?: number; | ||
applicationEnvVars?: { | ||
doNotSet?: boolean; | ||
statsdHostEnvVarName?: string; | ||
statsdPortEnvVarName?: string; | ||
}; | ||
}; | ||
}; | ||
fireLensLogging?: { | ||
enabled?: boolean; | ||
service?: string; | ||
source?: string; | ||
tags?: Record<string, string>; | ||
memoryLimitMiB?: number; | ||
cpu?: number; | ||
image?: ecs.ContainerImage; | ||
imageTag?: string; | ||
}; | ||
} | ||
export declare const addDatadogToFargateTask: (task: ecs.TaskDefinition, props: AddDatadogToFargateTaskProps) => void; | ||
export * from './ec2'; | ||
export * from './fargate'; |
251
index.js
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.addDatadogToFargateTask = exports.EcsDatadogDaemonService = void 0; | ||
const constructs_1 = require("constructs"); | ||
const cdk = require("aws-cdk-lib"); | ||
const ecs = require("aws-cdk-lib/aws-ecs"); | ||
class EcsDatadogDaemonService extends constructs_1.Construct { | ||
constructor(scope, id, props) { | ||
var _a; | ||
super(scope, id); | ||
// To match as documented at | ||
// https://docs.datadoghq.com/containers/amazon_ecs/?tab=awscli#setup | ||
// and | ||
// https://docs.datadoghq.com/containers/amazon_ecs/logs/?tab=linux | ||
const taskDefinition = new ecs.Ec2TaskDefinition(this, 'TaskDefinition', { | ||
family: 'datadog-agent-task', | ||
}); | ||
const container = taskDefinition.addContainer('datadog-agent', { | ||
image: ecs.ContainerImage.fromRegistry('public.ecr.aws/datadog/agent:latest'), | ||
cpu: 100, | ||
memoryLimitMiB: 512, | ||
essential: true, | ||
environment: { | ||
DD_SITE: (_a = props.datadogSite) !== null && _a !== void 0 ? _a : 'datadoghq.com', | ||
...(props.logsDisabled | ||
? {} | ||
: { | ||
DD_LOGS_ENABLED: 'true', | ||
DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL: 'true', | ||
}), | ||
}, | ||
secrets: { | ||
DD_API_KEY: ecs.Secret.fromSecretsManager(props.datadogApiKeySecret), | ||
}, | ||
healthCheck: { | ||
command: ['CMD-SHELL', 'agent health'], | ||
retries: 3, | ||
timeout: cdk.Duration.seconds(5), | ||
interval: cdk.Duration.seconds(10), | ||
startPeriod: cdk.Duration.seconds(15), | ||
}, | ||
logging: ecs.LogDrivers.awsLogs({ | ||
streamPrefix: 'datadog-agent', | ||
}), | ||
}); | ||
container.addMountPoints({ | ||
containerPath: '/var/run/docker.sock', | ||
sourceVolume: 'docker_sock', | ||
readOnly: true, | ||
}, { | ||
containerPath: '/host/sys/fs/cgroup', | ||
sourceVolume: 'cgroup', | ||
readOnly: true, | ||
}, { | ||
containerPath: '/host/proc', | ||
sourceVolume: 'proc', | ||
readOnly: true, | ||
}); | ||
if (!props.logsDisabled) { | ||
container.addMountPoints({ | ||
containerPath: '/opt/datadog-agent/run', | ||
sourceVolume: 'pointdir', | ||
readOnly: false, | ||
}, { | ||
containerPath: '/var/lib/docker/containers', | ||
sourceVolume: 'containers_root', | ||
readOnly: true, | ||
}); | ||
} | ||
taskDefinition.addVolume({ | ||
name: 'docker_sock', | ||
host: { | ||
sourcePath: '/var/run/docker.sock', | ||
}, | ||
}); | ||
taskDefinition.addVolume({ | ||
name: 'proc', | ||
host: { | ||
sourcePath: '/proc/', | ||
}, | ||
}); | ||
taskDefinition.addVolume({ | ||
name: 'cgroup', | ||
host: { | ||
sourcePath: '/sys/fs/cgroup/', | ||
}, | ||
}); | ||
if (!props.logsDisabled) { | ||
taskDefinition.addVolume({ | ||
name: 'pointdir', | ||
host: { | ||
sourcePath: '/opt/datadog-agent/run', | ||
}, | ||
}); | ||
taskDefinition.addVolume({ | ||
name: 'containers_root', | ||
host: { | ||
sourcePath: '/var/lib/docker/containers', | ||
}, | ||
}); | ||
} | ||
new ecs.Ec2Service(this, 'Service', { | ||
cluster: props.ecsCluster, | ||
taskDefinition, | ||
daemon: true, | ||
}); | ||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | ||
if (k2 === undefined) k2 = k; | ||
var desc = Object.getOwnPropertyDescriptor(m, k); | ||
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { | ||
desc = { enumerable: true, get: function() { return m[k]; } }; | ||
} | ||
} | ||
exports.EcsDatadogDaemonService = EcsDatadogDaemonService; | ||
const formatTags = (tags) => { | ||
const formattedTags = []; | ||
for (const [key, value] of Object.entries(tags)) { | ||
formattedTags.push(`${key}:${value}`); | ||
} | ||
return formattedTags.join(','); | ||
Object.defineProperty(o, k2, desc); | ||
}) : (function(o, m, k, k2) { | ||
if (k2 === undefined) k2 = k; | ||
o[k2] = m[k]; | ||
})); | ||
var __exportStar = (this && this.__exportStar) || function(m, exports) { | ||
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); | ||
}; | ||
const addDatadogToFargateTask = (task, props) => { | ||
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45; | ||
const containerNames = []; | ||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment | ||
// @ts-ignore | ||
const containers = task.containers; | ||
for (const container of containers) { | ||
containerNames.push(container.containerName); | ||
} | ||
if ((_a = props.agent) === null || _a === void 0 ? void 0 : _a.enabled) { | ||
task.addContainer('datadog-agent', { | ||
image: (_c = (_b = props.agent) === null || _b === void 0 ? void 0 : _b.image) !== null && _c !== void 0 ? _c : ecs.ContainerImage.fromRegistry(`public.ecr.aws/datadog/agent:${(_e = (_d = props.agent) === null || _d === void 0 ? void 0 : _d.imageTag) !== null && _e !== void 0 ? _e : 'latest'}`), | ||
memoryLimitMiB: (_g = (_f = props.agent) === null || _f === void 0 ? void 0 : _f.memoryLimitMiB) !== null && _g !== void 0 ? _g : 256, | ||
...(((_h = props.agent) === null || _h === void 0 ? void 0 : _h.cpu) | ||
? { | ||
cpu: (_j = props.fireLensLogging) === null || _j === void 0 ? void 0 : _j.cpu, | ||
} | ||
: {}), | ||
...(((_k = props.agent) === null || _k === void 0 ? void 0 : _k.logToCloudWatch) | ||
? { | ||
logging: ecs.LogDrivers.awsLogs({ | ||
streamPrefix: 'datadog-agent', | ||
}), | ||
} | ||
: {}), | ||
environment: { | ||
ECS_FARGATE: 'true', | ||
DD_SITE: (_l = props.datadogSite) !== null && _l !== void 0 ? _l : 'datadoghq.com', | ||
...(((_o = (_m = props.agent) === null || _m === void 0 ? void 0 : _m.apm) === null || _o === void 0 ? void 0 : _o.enabled) | ||
? { | ||
DD_APM_ENABLED: 'true', | ||
DD_APM_RECEIVER_PORT: String((_r = (_q = (_p = props.agent) === null || _p === void 0 ? void 0 : _p.apm) === null || _q === void 0 ? void 0 : _q.port) !== null && _r !== void 0 ? _r : '8126'), | ||
} | ||
: { | ||
DD_APM_ENABLED: 'false', | ||
}), | ||
...(((_t = (_s = props.agent) === null || _s === void 0 ? void 0 : _s.statsd) === null || _t === void 0 ? void 0 : _t.enabled) | ||
? { | ||
DD_USE_DOGSTATSD: 'true', | ||
DD_DOGSTATSD_PORT: String((_w = (_v = (_u = props.agent) === null || _u === void 0 ? void 0 : _u.statsd) === null || _v === void 0 ? void 0 : _v.port) !== null && _w !== void 0 ? _w : '8125'), | ||
} | ||
: { | ||
DD_USE_DOGSTATSD: 'false', | ||
}), | ||
}, | ||
secrets: { | ||
DD_API_KEY: props.datadogApiKeySecret, | ||
}, | ||
}); | ||
if (((_y = (_x = props.agent) === null || _x === void 0 ? void 0 : _x.apm) === null || _y === void 0 ? void 0 : _y.enabled) && ((_1 = (_0 = (_z = props.agent) === null || _z === void 0 ? void 0 : _z.apm) === null || _0 === void 0 ? void 0 : _0.applicationEnvVars) === null || _1 === void 0 ? void 0 : _1.doNotSet) !== true) { | ||
for (const containerName of containerNames) { | ||
const container = task.findContainer(containerName); | ||
if (container) { | ||
container.addEnvironment((_4 = (_3 = (_2 = props.agent) === null || _2 === void 0 ? void 0 : _2.apm.applicationEnvVars) === null || _3 === void 0 ? void 0 : _3.apmTraceEnabledEnvVarName) !== null && _4 !== void 0 ? _4 : 'DD_TRACE_ENABLED', 'true'); | ||
container.addEnvironment((_7 = (_6 = (_5 = props.agent) === null || _5 === void 0 ? void 0 : _5.apm.applicationEnvVars) === null || _6 === void 0 ? void 0 : _6.apmHostEnvVarName) !== null && _7 !== void 0 ? _7 : 'DD_AGENT_HOST', 'localhost'); | ||
container.addEnvironment((_10 = (_9 = (_8 = props.agent) === null || _8 === void 0 ? void 0 : _8.apm.applicationEnvVars) === null || _9 === void 0 ? void 0 : _9.apmPortEnvVarName) !== null && _10 !== void 0 ? _10 : 'DD_TRACE_AGENT_PORT', String((_13 = (_12 = (_11 = props.agent) === null || _11 === void 0 ? void 0 : _11.apm) === null || _12 === void 0 ? void 0 : _12.port) !== null && _13 !== void 0 ? _13 : '8126')); | ||
} | ||
} | ||
} | ||
if (((_15 = (_14 = props.agent) === null || _14 === void 0 ? void 0 : _14.statsd) === null || _15 === void 0 ? void 0 : _15.enabled) && ((_18 = (_17 = (_16 = props.agent) === null || _16 === void 0 ? void 0 : _16.statsd) === null || _17 === void 0 ? void 0 : _17.applicationEnvVars) === null || _18 === void 0 ? void 0 : _18.doNotSet) !== true) { | ||
for (const containerName of containerNames) { | ||
const container = task.findContainer(containerName); | ||
if (container) { | ||
container.addEnvironment((_22 = (_21 = (_20 = (_19 = props.agent) === null || _19 === void 0 ? void 0 : _19.statsd) === null || _20 === void 0 ? void 0 : _20.applicationEnvVars) === null || _21 === void 0 ? void 0 : _21.statsdHostEnvVarName) !== null && _22 !== void 0 ? _22 : 'STATSD_HOST', 'localhost'); | ||
container.addEnvironment((_26 = (_25 = (_24 = (_23 = props.agent) === null || _23 === void 0 ? void 0 : _23.statsd) === null || _24 === void 0 ? void 0 : _24.applicationEnvVars) === null || _25 === void 0 ? void 0 : _25.statsdPortEnvVarName) !== null && _26 !== void 0 ? _26 : 'STATSD_PORT', String((_29 = (_28 = (_27 = props.agent) === null || _27 === void 0 ? void 0 : _27.statsd) === null || _28 === void 0 ? void 0 : _28.port) !== null && _29 !== void 0 ? _29 : '8125')); | ||
} | ||
} | ||
} | ||
} | ||
if ((_30 = props.fireLensLogging) === null || _30 === void 0 ? void 0 : _30.enabled) { | ||
task.addFirelensLogRouter('log_router', { | ||
image: (_32 = (_31 = props.fireLensLogging) === null || _31 === void 0 ? void 0 : _31.image) !== null && _32 !== void 0 ? _32 : ecs.ContainerImage.fromRegistry(`public.ecr.aws/datadog/aws-for-fluent-bit:${(_34 = (_33 = props.fireLensLogging) === null || _33 === void 0 ? void 0 : _33.imageTag) !== null && _34 !== void 0 ? _34 : 'latest'}`), | ||
memoryLimitMiB: (_36 = (_35 = props.fireLensLogging) === null || _35 === void 0 ? void 0 : _35.memoryLimitMiB) !== null && _36 !== void 0 ? _36 : 256, | ||
...(((_37 = props.fireLensLogging) === null || _37 === void 0 ? void 0 : _37.cpu) | ||
? { | ||
cpu: (_38 = props.fireLensLogging) === null || _38 === void 0 ? void 0 : _38.cpu, | ||
} | ||
: {}), | ||
firelensConfig: { | ||
type: ecs.FirelensLogRouterType.FLUENTBIT, | ||
options: { | ||
enableECSLogMetadata: true, | ||
}, | ||
}, | ||
}); | ||
const firelensLogDriver = ecs.LogDrivers.firelens({ | ||
options: { | ||
Name: 'datadog', | ||
Host: `http-intake.logs.${(_39 = props.datadogSite) !== null && _39 !== void 0 ? _39 : 'datadoghq.com'}`, | ||
TLS: 'on', | ||
provider: 'ecs', | ||
dd_message_key: 'log', | ||
...(((_40 = props.fireLensLogging) === null || _40 === void 0 ? void 0 : _40.service) | ||
? { | ||
dd_service: (_41 = props.fireLensLogging) === null || _41 === void 0 ? void 0 : _41.service, | ||
} | ||
: {}), | ||
...(((_42 = props.fireLensLogging) === null || _42 === void 0 ? void 0 : _42.source) | ||
? { | ||
dd_source: (_43 = props.fireLensLogging) === null || _43 === void 0 ? void 0 : _43.source, | ||
} | ||
: {}), | ||
...(((_44 = props.fireLensLogging) === null || _44 === void 0 ? void 0 : _44.tags) | ||
? { | ||
dd_tags: formatTags((_45 = props.fireLensLogging) === null || _45 === void 0 ? void 0 : _45.tags), | ||
} | ||
: {}), | ||
}, | ||
secretOptions: { | ||
apikey: props.datadogApiKeySecret, | ||
}, | ||
}); | ||
for (const containerName of containerNames) { | ||
const container = task.findContainer(containerName); | ||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment | ||
// @ts-ignore | ||
container.logDriverConfig = firelensLogDriver.bind(container, container); | ||
} | ||
} | ||
}; | ||
exports.addDatadogToFargateTask = addDatadogToFargateTask; | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQ0FBdUM7QUFFdkMsbUNBQW1DO0FBQ25DLDJDQUEyQztBQVUzQyxNQUFhLHVCQUF3QixTQUFRLHNCQUFTO0lBQ2xELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBbUM7O1FBQ3pFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsNEJBQTRCO1FBQzVCLHFFQUFxRTtRQUNyRSxNQUFNO1FBQ04sbUVBQW1FO1FBQ25FLE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtZQUNyRSxNQUFNLEVBQUUsb0JBQW9CO1NBQy9CLENBQUMsQ0FBQztRQUVILE1BQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFO1lBQzNELEtBQUssRUFBRSxHQUFHLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxxQ0FBcUMsQ0FBQztZQUM3RSxHQUFHLEVBQUUsR0FBRztZQUNSLGNBQWMsRUFBRSxHQUFHO1lBQ25CLFNBQVMsRUFBRSxJQUFJO1lBQ2YsV0FBVyxFQUFFO2dCQUNULE9BQU8sRUFBRSxNQUFBLEtBQUssQ0FBQyxXQUFXLG1DQUFJLGVBQWU7Z0JBQzdDLEdBQUcsQ0FBQyxLQUFLLENBQUMsWUFBWTtvQkFDbEIsQ0FBQyxDQUFDLEVBQUU7b0JBQ0osQ0FBQyxDQUFDO3dCQUNJLGVBQWUsRUFBRSxNQUFNO3dCQUN2QixvQ0FBb0MsRUFBRSxNQUFNO3FCQUMvQyxDQUFDO2FBQ1g7WUFDRCxPQUFPLEVBQUU7Z0JBQ0wsVUFBVSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDO2FBQ3ZFO1lBQ0QsV0FBVyxFQUFFO2dCQUNULE9BQU8sRUFBRSxDQUFDLFdBQVcs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QUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzdFLENBQUM7SUFDTCxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBNUhXLFFBQUEsdUJBQXVCLDJCQTRIbEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGVjcyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNzJztcbmltcG9ydCB0eXBlICogYXMgc2VjcmV0c21hbmFnZXIgZnJvbSAnYXdzLWNkay1saWIvYXdzLXNlY3JldHNtYW5hZ2VyJztcblxuZXhwb3J0IGludGVyZmFjZSBFY3NEYXRhZG9nRGFlbW9uU2VydmljZVByb3BzIHtcbiAgICByZWFkb25seSBlY3NDbHVzdGVyOiBlY3MuQ2x1c3RlcjtcbiAgICByZWFkb25seSBkYXRhZG9nQXBpS2V5U2VjcmV0OiBzZWNyZXRzbWFuYWdlci5JU2VjcmV0O1xuICAgIHJlYWRvbmx5IGRhdGFkb2dTaXRlPzogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGxvZ3NEaXNhYmxlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBFY3NEYXRhZG9nRGFlbW9uU2VydmljZSBleHRlbmRzIENvbnN0cnVjdCB7XG4gICAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEVjc0RhdGFkb2dEYWVtb25TZXJ2aWNlUHJvcHMpIHtcbiAgICAgICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgICAgICAvLyBUbyBtYXRjaCBhcyBkb2N1bWVudGVkIGF0XG4gICAgICAgIC8vIGh0dHBzOi8vZG9jcy5kYXRhZG9naHEuY29tL2NvbnRhaW5lcnMvYW1hem9uX2Vjcy8/dGFiPWF3c2NsaSNzZXR1cFxuICAgICAgICAvLyBhbmRcbiAgICAgICAgLy8gaHR0cHM6Ly9kb2NzLmRhdGFkb2docS5jb20vY29udGFpbmVycy9hbWF6b25fZWNzL2xvZ3MvP3RhYj1saW51eFxuICAgICAgICBjb25zdCB0YXNrRGVmaW5pdGlvbiA9IG5ldyBlY3MuRWMyVGFza0RlZmluaXRpb24odGhpcywgJ1Rhc2tEZWZpbml0aW9uJywge1xuICAgICAgICAgICAgZmFtaWx5OiAnZGF0YWRvZy1hZ2VudC10YXNrJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGFza0RlZmluaXRpb24uYWRkQ29udGFpbmVyKCdkYXRhZG9nLWFnZW50Jywge1xuICAgICAgICAgICAgaW1hZ2U6IGVjcy5Db250YWluZXJJbWFnZS5mcm9tUmVnaXN0cnkoJ3B1YmxpYy5lY3IuYXdzL2RhdGFkb2cvYWdlbnQ6bGF0ZXN0JyksXG4gICAgICAgICAgICBjcHU6IDEwMCxcbiAgICAgICAgICAgIG1lbW9yeUxpbWl0TWlCOiA1MTIsXG4gICAgICAgICAgICBlc3NlbnRpYWw6IHRydWUsXG4gICAgICAgICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAgICAgICAgIEREX1NJVEU6IHByb3BzLmRhdGFkb2dTaXRlID8/ICdkYXRhZG9naHEuY29tJyxcbiAgICAgICAgICAgICAgICAuLi4ocHJvcHMubG9nc0Rpc2FibGVkXG4gICAgICAgICAgICAgICAgICAgID8ge31cbiAgICAgICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEREX0xPR1NfRU5BQkxFRDogJ3RydWUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBERF9MT0dTX0NPTkZJR19DT05UQUlORVJfQ09MTEVDVF9BTEw6ICd0cnVlJyxcbiAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZWNyZXRzOiB7XG4gICAgICAgICAgICAgICAgRERfQVBJX0tFWTogZWNzLlNlY3JldC5mcm9tU2VjcmV0c01hbmFnZXIocHJvcHMuZGF0YWRvZ0FwaUtleVNlY3JldCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaGVhbHRoQ2hlY2s6IHtcbiAgICAgICAgICAgICAgICBjb21tYW5kOiBbJ0NNRC1TSEVMTCcsICdhZ2VudCBoZWFsdGgnXSxcbiAgICAgICAgICAgICAgICByZXRyaWVzOiAzLFxuICAgICAgICAgICAgICAgIHRpbWVvdXQ6IGNkay5EdXJhdGlvbi5zZWNvbmRzKDUpLFxuICAgICAgICAgICAgICAgIGludGVydmFsOiBjZGsuRHVyYXRpb24uc2Vjb25kcygxMCksXG4gICAgICAgICAgICAgICAgc3RhcnRQZXJpb2Q6IGNkay5EdXJhdGlvbi5zZWNvbmRzKDE1KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsb2dnaW5nOiBlY3MuTG9nRHJpdmVycy5hd3NMb2dzKHtcbiAgICAgICAgICAgICAgICBzdHJlYW1QcmVmaXg6ICdkYXRhZG9nLWFnZW50JyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb250YWluZXIuYWRkTW91bnRQb2ludHMoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyUGF0aDogJy92YXIvcnVuL2RvY2tlci5zb2NrJyxcbiAgICAgICAgICAgICAgICBzb3VyY2VWb2x1bWU6ICdkb2NrZXJfc29jaycsXG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lclBhdGg6ICcvaG9zdC9zeXMvZnMvY2dyb3VwJyxcbiAgICAgICAgICAgICAgICBzb3VyY2VWb2x1bWU6ICdjZ3JvdXAnLFxuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250YWluZXJQYXRoOiAnL2hvc3QvcHJvYycsXG4gICAgICAgICAgICAgICAgc291cmNlVm9sdW1lOiAncHJvYycsXG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICghcHJvcHMubG9nc0Rpc2FibGVkKSB7XG4gICAgICAgICAgICBjb250YWluZXIuYWRkTW91bnRQb2ludHMoXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJQYXRoOiAnL29wdC9kYXRhZG9nLWFnZW50L3J1bicsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZVZvbHVtZTogJ3BvaW50ZGlyJyxcbiAgICAgICAgICAgICAgICAgICAgcmVhZE9ubHk6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJQYXRoOiAnL3Zhci9saWIvZG9ja2VyL2NvbnRhaW5lcnMnLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VWb2x1bWU6ICdjb250YWluZXJzX3Jvb3QnLFxuICAgICAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRhc2tEZWZpbml0aW9uLmFkZFZvbHVtZSh7XG4gICAgICAgICAgICBuYW1lOiAnZG9ja2VyX3NvY2snLFxuICAgICAgICAgICAgaG9zdDoge1xuICAgICAgICAgICAgICAgIHNvdXJjZVBhdGg6ICcvdmFyL3J1bi9kb2NrZXIuc29jaycsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICB0YXNrRGVmaW5pdGlvbi5hZGRWb2x1bWUoe1xuICAgICAgICAgICAgbmFtZTogJ3Byb2MnLFxuICAgICAgICAgICAgaG9zdDoge1xuICAgICAgICAgICAgICAgIHNvdXJjZVBhdGg6ICcvcHJvYy8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGFza0RlZmluaXRpb24uYWRkVm9sdW1lKHtcbiAgICAgICAgICAgIG5hbWU6ICdjZ3JvdXAnLFxuICAgICAgICAgICAgaG9zdDoge1xuICAgICAgICAgICAgICAgIHNvdXJjZVBhdGg6ICcvc3lzL2ZzL2Nncm91cC8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCFwcm9wcy5sb2dzRGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHRhc2tEZWZpbml0aW9uLmFkZFZvbHVtZSh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ3BvaW50ZGlyJyxcbiAgICAgICAgICAgICAgICBob3N0OiB7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZVBhdGg6ICcvb3B0L2RhdGFkb2ctYWdlbnQvcnVuJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRhc2tEZWZpbml0aW9uLmFkZFZvbHVtZSh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ2NvbnRhaW5lcnNfcm9vdCcsXG4gICAgICAgICAgICAgICAgaG9zdDoge1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2VQYXRoOiAnL3Zhci9saWIvZG9ja2VyL2NvbnRhaW5lcnMnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5ldyBlY3MuRWMyU2VydmljZSh0aGlzLCAnU2VydmljZScsIHtcbiAgICAgICAgICAgIGNsdXN0ZXI6IHByb3BzLmVjc0NsdXN0ZXIsXG4gICAgICAgICAgICB0YXNrRGVmaW5pdGlvbixcbiAgICAgICAgICAgIGRhZW1vbjogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFkZERhdGFkb2dUb0ZhcmdhdGVUYXNrUHJvcHMge1xuICAgIC8vIE5vdGU6IGl0IGlzIGltcG9ydGFudCB0aGF0IHRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkgdGhpcyBzZWNyZXRcbiAgICAvLyBkb2Vzbid0IGhhdmUgYSBuZXdsaW5lIGF0IHRoZSBlbmQuIE90aGVyd2lzZSwgdGhlIGZpcmVsZW5zXG4gICAgLy8gbG9nZ2luZyBjb25maWd1cmF0aW9uIHdpbGwgZmFpbCB0byBzZW5kIGxvZ3MgdG8gRGF0YWRvZy4gVGhpc1xuICAgIC8vIGlzIGFuIGVhc3kgbWlzdGFrZSB0byBpbnRyb2R1Y2Ugd2hlbiB0aGUgc291cmNlIGZvciB0aGUgc2VjcmV0XG4gICAgLy8gaXMgYSBzZWNyZXRzbWFuYWdlciBTZWNyZXQgY29udGFpbmluZyBhIHNpbmdsZSB2YWx1ZSwgcmF0aGVyXG4gICAgLy8gdGhhbiBrZXktdmFsdWUgcGFpcnMuXG4gICAgZGF0YWRvZ0FwaUtleVNlY3JldDogZWNzLlNlY3JldDtcbiAgICAvLyBEZWZhdWx0cyB0byBkYXRhZG9naHEuY29tXG4gICAgZGF0YWRvZ1NpdGU/OiBzdHJpbmc7XG4gICAgYWdlbnQ/OiB7XG4gICAgICAgIC8vIERlZmF1bHRzIHRvIGZhbHNlXG4gICAgICAgIGVuYWJsZWQ/OiBib29sZWFuO1xuICAgICAgICAvLyBEZWZhdWx0cyB0byBwdWJsaWMuZWNyLmF3cy9kYXRhZG9nL2FnZW50OmxhdGVzdFxuICAgICAgICBpbWFnZT86IGVjcy5Db250YWluZXJJbWFnZTtcbiAgICAgICAgLy8gRGVmYXVsdHMgdG8gbGF0ZXN0XG4gICAgICAgIGltYWdlVGFnPzogc3RyaW5nO1xuICAgICAgICAvLyBEZWZhdWx0cyB0byAyNTZcbiAgICAgICAgbWVtb3J5TGltaXRNaUI/OiBudW1iZXI7XG4gICAgICAgIC8vIERlZmF1bHRzIHRvIHVuc2V0XG4gICAgICAgIGNwdT86IG51bWJlcjtcbiAgICAgICAgLy8gRGVmYXVsdHMgdG8gZmFsc2VcbiAgICAgICAgbG9nVG9DbG91ZFdhdGNoPzogYm9vbGVhbjtcbiAgICAgICAgYXBtPzoge1xuICAgICAgICAgICAgLy8gRGVmYXVsdHMgdG8gZmFsc2VcbiAgICAgICAgICAgIGVuYWJsZWQ/OiBib29sZWFuO1xuICAgICAgICAgICAgLy8gRGVmYXVsdHMgdG8gODEyNlxuICAgICAgICAgICAgcG9ydD86IG51bWJlcjtcbiAgICAgICAgICAgIGFwcGxpY2F0aW9uRW52VmFycz86IHtcbiAgICAgICAgICAgICAgICAvLyBEZWZhdWx0cyB0byBmYWxzZVxuICAgICAgICAgICAgICAgIGRvTm90U2V0PzogYm9vbGVhbjtcbiAgICAgICAgICAgICAgICAvLyBEZWZhdWx0cyB0byBERF9BR0VOVF9IT1NUXG4gICAgICAgICAgICAgICAgYXBtSG9zdEVudlZhck5hbWU/OiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgLy8gRGVmYXVsdHMgdG8gRERfVFJBQ0VfQUdFTlRfUE9SVFxuICAgICAgICAgICAgICAgIGFwbVBvcnRFbnZWYXJOYW1lPzogc3RyaW5nO1xuICAgICAgICAgICAgICAgIC8vIERlZmF1bHRzIHRvIEREX1RSQUNFX0VOQUJMRURcbiAgICAgICAgICAgICAgICBhcG1UcmFjZUVuYWJsZWRFbnZWYXJOYW1lPzogc3RyaW5nO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgICAgc3RhdHNkPzoge1xuICAgICAgICAgICAgLy8gRGVmYXVsdHMgdG8gZmFsc2VcbiAgICAgICAgICAgIGVuYWJsZWQ/OiBib29sZWFuO1xuICAgICAgICAgICAgLy8gRGVmYXVsdHMgdG8gODEyNVxuICAgICAgICAgICAgcG9ydD86IG51bWJlcjtcbiAgICAgICAgICAgIGFwcGxpY2F0aW9uRW52VmFycz86IHtcbiAgICAgICAgICAgICAgICAvLyBEZWZhdWx0cyB0byBmYWxzZVxuICAgICAgICAgICAgICAgIGRvTm90U2V0PzogYm9vbGVhbjtcbiAgICAgICAgICAgICAgICAvLyBEZWZhdWx0cyB0byBTVEFUU0RfSE9TVFxuICAgICAgICAgICAgICAgIHN0YXRzZEhvc3RFbnZWYXJOYW1lPzogc3RyaW5nO1xuICAgICAgICAgICAgICAgIC8vIERlZmF1bHRzIHRvIFNUQVRTRF9QT1JUXG4gICAgICAgICAgICAgICAgc3RhdHNkUG9ydEVudlZhck5hbWU/OiBzdHJpbmc7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgIH07XG4gICAgZmlyZUxlbnNMb2dnaW5nPzoge1xuICAgICAgICAvLyBEZWZhdWx0cyB0byBmYWxzZVxuICAgICAgICBlbmFibGVkPzogYm9vbGVhbjtcbiAgICAgICAgLy8gRGVmYXVsdHMgdG8gdW5zZXRcbiAgICAgICAgc2VydmljZT86IHN0cmluZztcbiAgICAgICAgLy8gRGVmYXVsdHMgdG8gdW5zZXRcbiAgICAgICAgc291cmNlPzogc3RyaW5nO1xuICAgICAgICAvLyBEZWZhdWx0cyB0byB1bnNldFxuICAgICAgICB0YWdzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAgICAgLy8gRGVmYXVsdHMgdG8gMjU2XG4gICAgICAgIG1lbW9yeUxpbWl0TWlCPzogbnVtYmVyO1xuICAgICAgICAvLyBEZWZhdWx0cyB0byB1bnNldFxuICAgICAgICBjcHU/OiBudW1iZXI7XG4gICAgICAgIC8vIERlZmF1bHRzIHRvIHB1YmxpYy5lY3IuYXdzL2RhdGFkb2cvYXdzLWZvci1mbHVlbnQtYml0OmxhdGVzdFxuICAgICAgICBpbWFnZT86IGVjcy5Db250YWluZXJJbWFnZTtcbiAgICAgICAgLy8gRGVmYXVsdHMgdG8gbGF0ZXN0XG4gICAgICAgIGltYWdlVGFnPzogc3RyaW5nO1xuICAgIH07XG59XG5cbmNvbnN0IGZvcm1hdFRhZ3MgPSAodGFnczogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgZm9ybWF0dGVkVGFncyA9IFtdO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRhZ3MpKSB7XG4gICAgICAgIGZvcm1hdHRlZFRhZ3MucHVzaChgJHtrZXl9OiR7dmFsdWV9YCk7XG4gICAgfVxuICAgIHJldHVybiBmb3JtYXR0ZWRUYWdzLmpvaW4oJywnKTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGREYXRhZG9nVG9GYXJnYXRlVGFzayA9ICh0YXNrOiBlY3MuVGFza0RlZmluaXRpb24sIHByb3BzOiBBZGREYXRhZG9nVG9GYXJnYXRlVGFza1Byb3BzKSA9PiB7XG4gICAgY29uc3QgY29udGFpbmVyTmFtZXMgPSBbXTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IGNvbnRhaW5lcnMgPSB0YXNrLmNvbnRhaW5lcnM7XG4gICAgZm9yIChjb25zdCBjb250YWluZXIgb2YgY29udGFpbmVycykge1xuICAgICAgICBjb250YWluZXJOYW1lcy5wdXNoKGNvbnRhaW5lci5jb250YWluZXJOYW1lKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuYWdlbnQ/LmVuYWJsZWQpIHtcbiAgICAgICAgdGFzay5hZGRDb250YWluZXIoJ2RhdGFkb2ctYWdlbnQnLCB7XG4gICAgICAgICAgICBpbWFnZTogcHJvcHMuYWdlbnQ/LmltYWdlID8/IGVjcy5Db250YWluZXJJbWFnZS5mcm9tUmVnaXN0cnkoYHB1YmxpYy5lY3IuYXdzL2RhdGFkb2cvYWdlbnQ6JHtwcm9wcy5hZ2VudD8uaW1hZ2VUYWcgPz8gJ2xhdGVzdCd9YCksXG4gICAgICAgICAgICBtZW1vcnlMaW1pdE1pQjogcHJvcHMuYWdlbnQ/Lm1lbW9yeUxpbWl0TWlCID8/IDI1NixcbiAgICAgICAgICAgIC4uLihwcm9wcy5hZ2VudD8uY3B1XG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgY3B1OiBwcm9wcy5maXJlTGVuc0xvZ2dpbmc/LmNwdSxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgIC4uLihwcm9wcy5hZ2VudD8ubG9nVG9DbG91ZFdhdGNoXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgbG9nZ2luZzogZWNzLkxvZ0RyaXZlcnMuYXdzTG9ncyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVByZWZpeDogJ2RhdGFkb2ctYWdlbnQnLFxuICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICAgICAgICBFQ1NfRkFSR0FURTogJ3RydWUnLFxuICAgICAgICAgICAgICAgIEREX1NJVEU6IHByb3BzLmRhdGFkb2dTaXRlID8/ICdkYXRhZG9naHEuY29tJyxcbiAgICAgICAgICAgICAgICAuLi4ocHJvcHMuYWdlbnQ/LmFwbT8uZW5hYmxlZFxuICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgRERfQVBNX0VOQUJMRUQ6ICd0cnVlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgRERfQVBNX1JFQ0VJVkVSX1BPUlQ6IFN0cmluZyhwcm9wcy5hZ2VudD8uYXBtPy5wb3J0ID8/ICc4MTI2JyksXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgRERfQVBNX0VOQUJMRUQ6ICdmYWxzZScsXG4gICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgLi4uKHByb3BzLmFnZW50Py5zdGF0c2Q/LmVuYWJsZWRcbiAgICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEREX1VTRV9ET0dTVEFUU0Q6ICd0cnVlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgRERfRE9HU1RBVFNEX1BPUlQ6IFN0cmluZyhwcm9wcy5hZ2VudD8uc3RhdHNkPy5wb3J0ID8/ICc4MTI1JyksXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgRERfVVNFX0RPR1NUQVRTRDogJ2ZhbHNlJyxcbiAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZWNyZXRzOiB7XG4gICAgICAgICAgICAgICAgRERfQVBJX0tFWTogcHJvcHMuZGF0YWRvZ0FwaUtleVNlY3JldCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChwcm9wcy5hZ2VudD8uYXBtPy5lbmFibGVkICYmIHByb3BzLmFnZW50Py5hcG0/LmFwcGxpY2F0aW9uRW52VmFycz8uZG9Ob3RTZXQgIT09IHRydWUpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29udGFpbmVyTmFtZSBvZiBjb250YWluZXJOYW1lcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRhc2suZmluZENvbnRhaW5lcihjb250YWluZXJOYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hZGRFbnZpcm9ubWVudChwcm9wcy5hZ2VudD8uYXBtLmFwcGxpY2F0aW9uRW52VmFycz8uYXBtVHJhY2VFbmFibGVkRW52VmFyTmFtZSA/PyAnRERfVFJBQ0VfRU5BQkxFRCcsICd0cnVlJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hZGRFbnZpcm9ubWVudChwcm9wcy5hZ2VudD8uYXBtLmFwcGxpY2F0aW9uRW52VmFycz8uYXBtSG9zdEVudlZhck5hbWUgPz8gJ0REX0FHRU5UX0hPU1QnLCAnbG9jYWxob3N0Jyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hZGRFbnZpcm9ubWVudChwcm9wcy5hZ2VudD8uYXBtLmFwcGxpY2F0aW9uRW52VmFycz8uYXBtUG9ydEVudlZhck5hbWUgPz8gJ0REX1RSQUNFX0FHRU5UX1BPUlQnLCBTdHJpbmcocHJvcHMuYWdlbnQ/LmFwbT8ucG9ydCA/PyAnODEyNicpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcHMuYWdlbnQ/LnN0YXRzZD8uZW5hYmxlZCAmJiBwcm9wcy5hZ2VudD8uc3RhdHNkPy5hcHBsaWNhdGlvbkVudlZhcnM/LmRvTm90U2V0ICE9PSB0cnVlKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbnRhaW5lck5hbWUgb2YgY29udGFpbmVyTmFtZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSB0YXNrLmZpbmRDb250YWluZXIoY29udGFpbmVyTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuYWRkRW52aXJvbm1lbnQocHJvcHMuYWdlbnQ/LnN0YXRzZD8uYXBwbGljYXRpb25FbnZWYXJzPy5zdGF0c2RIb3N0RW52VmFyTmFtZSA/PyAnU1RBVFNEX0hPU1QnLCAnbG9jYWxob3N0Jyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hZGRFbnZpcm9ubWVudChwcm9wcy5hZ2VudD8uc3RhdHNkPy5hcHBsaWNhdGlvbkVudlZhcnM/LnN0YXRzZFBvcnRFbnZWYXJOYW1lID8/ICdTVEFUU0RfUE9SVCcsIFN0cmluZyhwcm9wcy5hZ2VudD8uc3RhdHNkPy5wb3J0ID8/ICc4MTI1JykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwcm9wcy5maXJlTGVuc0xvZ2dpbmc/LmVuYWJsZWQpIHtcbiAgICAgICAgdGFzay5hZGRGaXJlbGVuc0xvZ1JvdXRlcignbG9nX3JvdXRlcicsIHtcbiAgICAgICAgICAgIGltYWdlOiBwcm9wcy5maXJlTGVuc0xvZ2dpbmc/LmltYWdlID8/IGVjcy5Db250YWluZXJJbWFnZS5mcm9tUmVnaXN0cnkoYHB1YmxpYy5lY3IuYXdzL2RhdGFkb2cvYXdzLWZvci1mbHVlbnQtYml0OiR7cHJvcHMuZmlyZUxlbnNMb2dnaW5nPy5pbWFnZVRhZyA/PyAnbGF0ZXN0J31gKSxcbiAgICAgICAgICAgIG1lbW9yeUxpbWl0TWlCOiBwcm9wcy5maXJlTGVuc0xvZ2dpbmc/Lm1lbW9yeUxpbWl0TWlCID8/IDI1NixcbiAgICAgICAgICAgIC4uLihwcm9wcy5maXJlTGVuc0xvZ2dpbmc/LmNwdVxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgIGNwdTogcHJvcHMuZmlyZUxlbnNMb2dnaW5nPy5jcHUsXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICBmaXJlbGVuc0NvbmZpZzoge1xuICAgICAgICAgICAgICAgIHR5cGU6IGVjcy5GaXJlbGVuc0xvZ1JvdXRlclR5cGUuRkxVRU5UQklULFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgZW5hYmxlRUNTTG9nTWV0YWRhdGE6IHRydWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGZpcmVsZW5zTG9nRHJpdmVyID0gZWNzLkxvZ0RyaXZlcnMuZmlyZWxlbnMoe1xuICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICAgIE5hbWU6ICdkYXRhZG9nJyxcbiAgICAgICAgICAgICAgICBIb3N0OiBgaHR0cC1pbnRha2UubG9ncy4ke3Byb3BzLmRhdGFkb2dTaXRlID8/ICdkYXRhZG9naHEuY29tJ31gLFxuICAgICAgICAgICAgICAgIFRMUzogJ29uJyxcbiAgICAgICAgICAgICAgICBwcm92aWRlcjogJ2VjcycsXG4gICAgICAgICAgICAgICAgZGRfbWVzc2FnZV9rZXk6ICdsb2cnLFxuICAgICAgICAgICAgICAgIC4uLihwcm9wcy5maXJlTGVuc0xvZ2dpbmc/LnNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRkX3NlcnZpY2U6IHByb3BzLmZpcmVMZW5zTG9nZ2luZz8uc2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgIC4uLihwcm9wcy5maXJlTGVuc0xvZ2dpbmc/LnNvdXJjZVxuICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGRfc291cmNlOiBwcm9wcy5maXJlTGVuc0xvZ2dpbmc/LnNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgIC4uLihwcm9wcy5maXJlTGVuc0xvZ2dpbmc/LnRhZ3NcbiAgICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRkX3RhZ3M6IGZvcm1hdFRhZ3MocHJvcHMuZmlyZUxlbnNMb2dnaW5nPy50YWdzKSxcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNlY3JldE9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICBhcGlrZXk6IHByb3BzLmRhdGFkb2dBcGlLZXlTZWNyZXQsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGNvbnRhaW5lck5hbWUgb2YgY29udGFpbmVyTmFtZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRhc2suZmluZENvbnRhaW5lcihjb250YWluZXJOYW1lKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnRhaW5lci5sb2dEcml2ZXJDb25maWcgPSBmaXJlbGVuc0xvZ0RyaXZlci5iaW5kKGNvbnRhaW5lciwgY29udGFpbmVyKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG4iXX0= | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
__exportStar(require("./ec2"), exports); | ||
__exportStar(require("./fargate"), exports); | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsd0NBQXNCO0FBQ3RCLDRDQUEwQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vZWMyJztcbmV4cG9ydCAqIGZyb20gJy4vZmFyZ2F0ZSc7XG4iXX0= |
{ | ||
"name": "datadog-ecs-cdk", | ||
"version": "1.1.1", | ||
"version": "1.2.0", | ||
"description": "", | ||
@@ -28,6 +28,6 @@ "license": "MIT", | ||
"version": "auto-changelog --hide-credit -p && git add CHANGELOG.md", | ||
"_lint": "eslint 'index.ts' 'test/**/*.ts' jest.config.js", | ||
"_lint": "eslint '*.ts' 'test/**/*.ts' jest.config.js", | ||
"lint": "npm run -- _lint --fix", | ||
"lint-check": "npm run -- _lint --max-warnings 0", | ||
"docs": "typedoc index.ts --includeVersion" | ||
"docs": "typedoc ec2.ts fargate.ts --includeVersion" | ||
}, | ||
@@ -34,0 +34,0 @@ "peerDependencies": { |
# datadog-ecs-cdk | ||
Docs: https://isotoma.github.io/datadog-ecs-cdk/ | ||
NPM: https://www.npmjs.com/package/datadog-ecs-cdk | ||
Source: https://github.com/isotoma/datadog-ecs-cdk | ||
## EC2 example | ||
```typescript | ||
import { EcsDatadogDaemonService } from 'datadog-ecs-cdk'; | ||
// ... | ||
new EcsDatadogDaemonService(this, 'EcsDatadog', { | ||
ecsCluster: myCluster, | ||
datadogApiKeySecret: mySecret, | ||
}); | ||
``` | ||
## Fargate example | ||
```typescript | ||
import { addDatadogToFargateTask } from 'datadog-ecs-cdk'; | ||
// ... | ||
const myTaskDef = ... | ||
addDatadogToFargateTask(myTaskDef, { | ||
datadogApiKeySecret: ecs.Secret.fromSecretsManager(mySecret), | ||
agent: { | ||
enabled: true, | ||
statsd: { | ||
enabled: true, | ||
}, | ||
}, | ||
fireLensLogging: { | ||
enabled: true, | ||
service: 'myservice', | ||
source: 'myservice', | ||
}, | ||
}); | ||
``` |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
60639
8
574
45
1