Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[SLES-1529] Java doesn't have an arm layer, also clean up some code #246

Merged
merged 1 commit into from
Jan 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 15 additions & 22 deletions v2/src/layer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,48 +55,36 @@ export function applyLayers(
let extensionLayerArn;
if (lambdaRuntimeType === RuntimeType.PYTHON) {
if (pythonLayerVersion === undefined) {
const errorMessage = getMissingLayerVersionErrorMsg(lam.node.id, "Python", "python");
log.error(errorMessage);
errors.push(errorMessage);
return;
return handleLayerError(errors, lam.node.id, "Python", "python");
}
lambdaLayerArn = getLambdaLayerArn(region, pythonLayerVersion, runtime, isARM, false, accountId);
lambdaLayerArn = getLambdaLayerArn(region, pythonLayerVersion, runtime, isARM, accountId);
log.debug(`Using Python Lambda layer: ${lambdaLayerArn}`);
addLayer(lambdaLayerArn, false, scope, lam, runtime);
}

if (lambdaRuntimeType === RuntimeType.NODE) {
if (nodeLayerVersion === undefined) {
const errorMessage = getMissingLayerVersionErrorMsg(lam.node.id, "Node.js", "node");
log.error(errorMessage);
errors.push(errorMessage);
return;
return handleLayerError(errors, lam.node.id, "Node.js", "node");

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Using a method for error handling is a great idea, unfortunately this looks like the function is returning something, which never does.
It would be great to think about enforcing some typescript rule to avoid these cases

}
lambdaLayerArn = getLambdaLayerArn(region, nodeLayerVersion, runtime, isARM, true, accountId);
lambdaLayerArn = getLambdaLayerArn(region, nodeLayerVersion, runtime, false, accountId); // Node has no ARM layer
log.debug(`Using Node Lambda layer: ${lambdaLayerArn}`);
addLayer(lambdaLayerArn, false, scope, lam, runtime);
}

if (lambdaRuntimeType === RuntimeType.JAVA) {
if (javaLayerVersion === undefined) {
const errorMessage = getMissingLayerVersionErrorMsg(lam.node.id, "Java", "java");
log.error(errorMessage);
errors.push(errorMessage);
return;
return handleLayerError(errors, lam.node.id, "Java", "java");
}
lambdaLayerArn = getLambdaLayerArn(region, javaLayerVersion, runtime, isARM, false, accountId);
lambdaLayerArn = getLambdaLayerArn(region, javaLayerVersion, runtime, false, accountId); //Java has no ARM layer
log.debug(`Using dd-trace-java layer: ${lambdaLayerArn}`);
addLayer(lambdaLayerArn, false, scope, lam, runtime);
}

if (lambdaRuntimeType === RuntimeType.DOTNET) {
if (dotnetLayerVersion === undefined) {
const errorMessage = getMissingLayerVersionErrorMsg(lam.node.id, ".NET", "dotnet");
log.error(errorMessage);
errors.push(errorMessage);
return;
return handleLayerError(errors, lam.node.id, ".NET", "dotnet");
}
lambdaLayerArn = getLambdaLayerArn(region, dotnetLayerVersion, runtime, isARM, false, accountId);
lambdaLayerArn = getLambdaLayerArn(region, dotnetLayerVersion, runtime, isARM, accountId);
log.debug(`Using dd-trace-dotnet layer: ${lambdaLayerArn}`);
addLayer(lambdaLayerArn, false, scope, lam, runtime);
}
Expand All @@ -110,6 +98,12 @@ export function applyLayers(
return errors;
}

function handleLayerError(errors: string[], nodeID: string, formalRuntime: string, paramRuntime: string) {
const errorMessage = getMissingLayerVersionErrorMsg(nodeID, formalRuntime, paramRuntime);
log.error(errorMessage);
errors.push(errorMessage);
}

function addLayer(
layerArn: string,
isExtensionLayer: boolean,
Expand All @@ -135,11 +129,10 @@ export function getLambdaLayerArn(
version: number,
runtime: string,
isArm: boolean,
isNode: boolean,
accountId?: string,
) {
const baseLayerName = runtimeToLayerName[runtime];
const layerName = isArm && !isNode ? `${baseLayerName}-ARM` : baseLayerName;
const layerName = isArm ? `${baseLayerName}-ARM` : baseLayerName;
const partition = getAWSPartitionFromRegion(region);
// TODO: edge case where gov cloud is the region, but they are using a token so we can't resolve it.
const isGovCloud = govCloudRegions.includes(region);
Expand Down
63 changes: 63 additions & 0 deletions v2/test/layer.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import {
} from "../src/index";
const NODE_LAYER_VERSION = 91;
const PYTHON_LAYER_VERSION = 73;
const JAVA_LAYER_VERSION = 11;
const EXTENSION_LAYER_VERSION = 5;

describe("applyLayers", () => {
Expand Down Expand Up @@ -508,6 +509,68 @@ describe("isGovCloud", () => {
],
});
});

it("adds the ARM suffix to Extension layer but not Node", () => {
const app = new App();
const stack = new Stack(app, "stack", {
env: {
region: "sa-east-1",
},
});
const hello = new lambda.Function(stack, "HelloHandler", {
runtime: lambda.Runtime.NODEJS_20_X,
code: lambda.Code.fromAsset("test/lambda"),
handler: "example-lambda.handler",
architecture: Architecture.ARM_64,
});
const datadogCdk = new Datadog(stack, "Datadog", {
nodeLayerVersion: NODE_LAYER_VERSION,
extensionLayerVersion: EXTENSION_LAYER_VERSION,
apiKmsKey: "1234",
addLayers: true,
enableDatadogTracing: false,
flushMetricsToLogs: true,
site: "datadoghq.com",
});
datadogCdk.addLambdaFunctions([hello]);
Template.fromStack(stack).hasResourceProperties("AWS::Lambda::Function", {
Layers: [
`arn:aws:lambda:${stack.region}:${DD_ACCOUNT_ID}:layer:Datadog-Node20-x:${NODE_LAYER_VERSION}`,
`arn:aws:lambda:${stack.region}:${DD_ACCOUNT_ID}:layer:Datadog-Extension-ARM:${EXTENSION_LAYER_VERSION}`,
],
});
});

it("adds the ARM suffix to Extension layer but not Java", () => {
const app = new App();
const stack = new Stack(app, "stack", {
env: {
region: "sa-east-1",
},
});
const hello = new lambda.Function(stack, "HelloHandler", {
runtime: lambda.Runtime.JAVA_21,
code: lambda.Code.fromAsset("test/lambda"),
handler: "example-lambda.handler",
architecture: Architecture.ARM_64,
});
const datadogCdk = new Datadog(stack, "Datadog", {
javaLayerVersion: JAVA_LAYER_VERSION,
extensionLayerVersion: EXTENSION_LAYER_VERSION,
apiKmsKey: "1234",
addLayers: true,
enableDatadogTracing: false,
flushMetricsToLogs: true,
site: "datadoghq.com",
});
datadogCdk.addLambdaFunctions([hello]);
Template.fromStack(stack).hasResourceProperties("AWS::Lambda::Function", {
Layers: [
`arn:aws:lambda:${stack.region}:${DD_ACCOUNT_ID}:layer:dd-trace-java:${JAVA_LAYER_VERSION}`,
`arn:aws:lambda:${stack.region}:${DD_ACCOUNT_ID}:layer:Datadog-Extension-ARM:${EXTENSION_LAYER_VERSION}`,
],
});
});
});

describe("generateLambdaLayerId", () => {
Expand Down
Loading