diff --git a/components/camel-aws/camel-aws2-lambda/src/main/java/org/apache/camel/component/aws2/lambda/Lambda2Producer.java b/components/camel-aws/camel-aws2-lambda/src/main/java/org/apache/camel/component/aws2/lambda/Lambda2Producer.java index aae4031cca2bd..9c5283c13e92c 100644 --- a/components/camel-aws/camel-aws2-lambda/src/main/java/org/apache/camel/component/aws2/lambda/Lambda2Producer.java +++ b/components/camel-aws/camel-aws2-lambda/src/main/java/org/apache/camel/component/aws2/lambda/Lambda2Producer.java @@ -469,10 +469,37 @@ private void updateFunction(LambdaClient lambdaClient, Exchange exchange) throws if (ObjectHelper.isEmpty(exchange.getIn().getBody()) && ObjectHelper.isEmpty(exchange.getIn().getHeader(Lambda2Constants.S3_BUCKET)) - && ObjectHelper.isEmpty(exchange.getIn().getHeader(Lambda2Constants.S3_KEY))) { + && ObjectHelper.isEmpty(exchange.getIn().getHeader(Lambda2Constants.S3_KEY)) + && ObjectHelper.isEmpty(exchange.getIn().getHeader(Lambda2Constants.ZIP_FILE))) { throw new IllegalArgumentException("At least S3 bucket/S3 key or zip file must be specified"); } + if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(Lambda2Constants.S3_BUCKET))) { + String s3Bucket = exchange.getIn().getHeader(Lambda2Constants.S3_BUCKET, String.class); + builder.s3Bucket(s3Bucket); + } + + if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(Lambda2Constants.S3_KEY))) { + String s3Key = exchange.getIn().getHeader(Lambda2Constants.S3_KEY, String.class); + builder.s3Key(s3Key); + } + + if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(Lambda2Constants.S3_OBJECT_VERSION))) { + String s3ObjectVersion = exchange.getIn().getHeader(Lambda2Constants.S3_OBJECT_VERSION, String.class); + builder.s3ObjectVersion(s3ObjectVersion); + } + + if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(Lambda2Constants.ZIP_FILE))) { + String zipFile = exchange.getIn().getHeader(Lambda2Constants.ZIP_FILE, String.class); + File fileLocalPath = new File(zipFile); + try (FileInputStream inputStream = new FileInputStream(fileLocalPath)) { + builder.zipFile(SdkBytes.fromInputStream(inputStream)); + } + } + if (ObjectHelper.isNotEmpty(exchange.getIn().getBody())) { + builder.zipFile(SdkBytes.fromByteBuffer(exchange.getIn().getBody(ByteBuffer.class))); + } + if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(Lambda2Constants.PUBLISH))) { Boolean publish = exchange.getIn().getHeader(Lambda2Constants.PUBLISH, Boolean.class); builder.publish(publish); @@ -531,7 +558,7 @@ private void deleteEventSourceMapping(LambdaClient lambdaClient, Exchange exchan if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(Lambda2Constants.EVENT_SOURCE_UUID))) { builder.uuid(exchange.getIn().getHeader(Lambda2Constants.EVENT_SOURCE_UUID, String.class)); } else { - throw new IllegalArgumentException("Event Source Arn must be specified"); + throw new IllegalArgumentException("Event Source UUID must be specified"); } request = builder.build(); } diff --git a/components/camel-aws/camel-aws2-lambda/src/test/java/org/apache/camel/component/aws2/lambda/AmazonLambdaClientMock.java b/components/camel-aws/camel-aws2-lambda/src/test/java/org/apache/camel/component/aws2/lambda/AmazonLambdaClientMock.java index 4e345a2a78646..dc5a217a3eede 100644 --- a/components/camel-aws/camel-aws2-lambda/src/test/java/org/apache/camel/component/aws2/lambda/AmazonLambdaClientMock.java +++ b/components/camel-aws/camel-aws2-lambda/src/test/java/org/apache/camel/component/aws2/lambda/AmazonLambdaClientMock.java @@ -101,6 +101,8 @@ public class AmazonLambdaClientMock implements LambdaClient { + public UpdateFunctionCodeRequest updateFunctionCodeRequest; + public AmazonLambdaClientMock() { } @@ -319,6 +321,7 @@ public UntagResourceResponse untagResource(UntagResourceRequest untagResourceReq @Override public UpdateFunctionCodeResponse updateFunctionCode(UpdateFunctionCodeRequest updateFunctionCodeRequest) { + this.updateFunctionCodeRequest = updateFunctionCodeRequest; UpdateFunctionCodeResponse.Builder result = UpdateFunctionCodeResponse.builder(); result.functionName(updateFunctionCodeRequest.functionName()); diff --git a/components/camel-aws/camel-aws2-lambda/src/test/java/org/apache/camel/component/aws2/lambda/LambdaProducerTest.java b/components/camel-aws/camel-aws2-lambda/src/test/java/org/apache/camel/component/aws2/lambda/LambdaProducerTest.java index b76baa592d88b..cea3bcca2672e 100644 --- a/components/camel-aws/camel-aws2-lambda/src/test/java/org/apache/camel/component/aws2/lambda/LambdaProducerTest.java +++ b/components/camel-aws/camel-aws2-lambda/src/test/java/org/apache/camel/component/aws2/lambda/LambdaProducerTest.java @@ -102,6 +102,29 @@ public void process(Exchange exchange) throws Exception { assertNotNull(result.codeSha256()); } + @Test + public void lambdaUpdateFunctionTest() throws Exception { + + Exchange exchange = template.send("direct:updateFunction", ExchangePattern.InOut, new Processor() { + @Override + public void process(Exchange exchange) throws Exception { + ClassLoader classLoader = getClass().getClassLoader(); + File file = new File( + classLoader.getResource("org/apache/camel/component/aws2/lambda/function/node/GetHelloWithName.zip") + .getFile()); + FileInputStream inputStream = new FileInputStream(file); + exchange.getIn().setBody(inputStream); + } + }); + + assertNotNull(exchange.getMessage().getBody()); + // the fix: the code source (the zip taken from the body) must actually reach the request, + // otherwise AWS rejects UpdateFunctionCode with "Please provide a source for function code." + assertNotNull(clientMock.updateFunctionCodeRequest); + assertEquals("GetHelloWithName", clientMock.updateFunctionCodeRequest.functionName()); + assertNotNull(clientMock.updateFunctionCodeRequest.zipFile()); + } + @Test public void lambdaDeleteFunctionTest() {