You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ac...@apache.org on 2017/11/29 13:23:35 UTC

[camel] branch master updated: CAMEL-12049 - Camel-AWS: Add update function operation to AWS lambda component

This is an automated email from the ASF dual-hosted git repository.

acosentino pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/master by this push:
     new 2f32a05  CAMEL-12049 - Camel-AWS: Add update function operation to AWS lambda component
2f32a05 is described below

commit 2f32a05705a6995de5f1e9276c4ba26a22632bd2
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Wed Nov 29 14:20:09 2017 +0100

    CAMEL-12049 - Camel-AWS: Add update function operation to AWS lambda component
---
 .../component/aws/lambda/LambdaOperations.java     |  3 +-
 .../camel/component/aws/lambda/LambdaProducer.java | 68 ++++++++++++++++++++++
 .../aws/lambda/AmazonLambdaClientMock.java         | 13 ++++-
 .../component/aws/lambda/LambdaOperationsTest.java |  4 +-
 .../component/aws/lambda/LambdaProducerTest.java   | 31 ++++++++++
 5 files changed, 116 insertions(+), 3 deletions(-)

diff --git a/components/camel-aws/src/main/java/org/apache/camel/component/aws/lambda/LambdaOperations.java b/components/camel-aws/src/main/java/org/apache/camel/component/aws/lambda/LambdaOperations.java
index 0feccb7..1d24bfe 100644
--- a/components/camel-aws/src/main/java/org/apache/camel/component/aws/lambda/LambdaOperations.java
+++ b/components/camel-aws/src/main/java/org/apache/camel/component/aws/lambda/LambdaOperations.java
@@ -22,5 +22,6 @@ public enum LambdaOperations {
     getFunction,
     createFunction,
     deleteFunction,
-    invokeFunction
+    invokeFunction,
+    updateFunction
 }
diff --git a/components/camel-aws/src/main/java/org/apache/camel/component/aws/lambda/LambdaProducer.java b/components/camel-aws/src/main/java/org/apache/camel/component/aws/lambda/LambdaProducer.java
index 226c08f..9a5e6fb 100644
--- a/components/camel-aws/src/main/java/org/apache/camel/component/aws/lambda/LambdaProducer.java
+++ b/components/camel-aws/src/main/java/org/apache/camel/component/aws/lambda/LambdaProducer.java
@@ -38,6 +38,8 @@ import com.amazonaws.services.lambda.model.InvokeRequest;
 import com.amazonaws.services.lambda.model.InvokeResult;
 import com.amazonaws.services.lambda.model.ListFunctionsResult;
 import com.amazonaws.services.lambda.model.TracingConfig;
+import com.amazonaws.services.lambda.model.UpdateFunctionCodeRequest;
+import com.amazonaws.services.lambda.model.UpdateFunctionCodeResult;
 import com.amazonaws.services.lambda.model.VpcConfig;
 import com.amazonaws.util.IOUtils;
 import org.apache.camel.Endpoint;
@@ -81,6 +83,9 @@ public class LambdaProducer extends DefaultProducer {
         case listFunctions:
             listFunctions(getEndpoint().getAwsLambdaClient(), exchange);
             break;
+        case updateFunction:
+            updateFunction(getEndpoint().getAwsLambdaClient(), exchange);
+            break;
         default:
             throw new IllegalArgumentException("Unsupported operation");
         }
@@ -272,6 +277,69 @@ public class LambdaProducer extends DefaultProducer {
         message.setBody(result);
     }
 
+    private void updateFunction(AWSLambda lambdaClient, Exchange exchange) throws Exception {
+        UpdateFunctionCodeResult result;
+
+        try {
+            UpdateFunctionCodeRequest request = new UpdateFunctionCodeRequest()
+                .withFunctionName(getConfiguration().getFunction());
+
+            FunctionCode functionCode = new FunctionCode();
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(LambdaConstants.S3_BUCKET))) {
+                String s3Bucket = exchange.getIn().getHeader(LambdaConstants.S3_BUCKET, String.class);
+                functionCode.withS3Bucket(s3Bucket);
+            }
+
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(LambdaConstants.S3_KEY))) {
+                String s3Key = exchange.getIn().getHeader(LambdaConstants.S3_KEY, String.class);
+                functionCode.withS3Key(s3Key);
+            }
+
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(LambdaConstants.S3_OBJECT_VERSION))) {
+                String s3ObjectVersion = exchange.getIn().getHeader(LambdaConstants.S3_OBJECT_VERSION, String.class);
+                functionCode.withS3ObjectVersion(s3ObjectVersion);
+            }
+
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(LambdaConstants.ZIP_FILE))) {
+                String zipFile = exchange.getIn().getHeader(LambdaConstants.ZIP_FILE, String.class);
+                File fileLocalPath = new File(zipFile);
+                FileInputStream inputStream = new FileInputStream(fileLocalPath);
+                functionCode.withZipFile(ByteBuffer.wrap(IOUtils.toByteArray(inputStream)));
+            }
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getBody())) {
+                functionCode.withZipFile(exchange.getIn().getBody(ByteBuffer.class));
+            }
+
+            if (ObjectHelper.isEmpty(exchange.getIn().getBody()) && (ObjectHelper.isEmpty(exchange.getIn().getHeader(LambdaConstants.S3_BUCKET)) && ObjectHelper.isEmpty(exchange.getIn().getHeader(LambdaConstants.S3_KEY)))) {
+                throw new IllegalArgumentException("At least S3 bucket/S3 key or zip file must be specified");
+            }
+
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(LambdaConstants.PUBLISH))) {
+                Boolean publish = exchange.getIn().getHeader(LambdaConstants.PUBLISH, Boolean.class);
+                request.withPublish(publish);
+            }
+
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(LambdaConstants.SDK_CLIENT_EXECUTION_TIMEOUT))) {
+                Integer timeout = exchange.getIn().getHeader(LambdaConstants.SDK_CLIENT_EXECUTION_TIMEOUT, Integer.class);
+                request.withSdkClientExecutionTimeout(timeout);
+            }
+
+            if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(LambdaConstants.SDK_REQUEST_TIMEOUT))) {
+                Integer timeout = exchange.getIn().getHeader(LambdaConstants.SDK_REQUEST_TIMEOUT, Integer.class);
+                request.withSdkRequestTimeout(timeout);
+            }
+            
+            result = lambdaClient.updateFunctionCode(request);
+
+        } catch (AmazonServiceException ase) {
+            LOG.trace("updateFunction command returned the error code {}", ase.getErrorCode());
+            throw ase;
+        }
+
+        Message message = getMessageForResponse(exchange);
+        message.setBody(result);
+    }
+    
     private LambdaOperations determineOperation(Exchange exchange) {
         LambdaOperations operation = exchange.getIn().getHeader(LambdaConstants.OPERATION, LambdaOperations.class);
         if (operation == null) {
diff --git a/components/camel-aws/src/test/java/org/apache/camel/component/aws/lambda/AmazonLambdaClientMock.java b/components/camel-aws/src/test/java/org/apache/camel/component/aws/lambda/AmazonLambdaClientMock.java
index 6b07bda..d9ec9c6 100644
--- a/components/camel-aws/src/test/java/org/apache/camel/component/aws/lambda/AmazonLambdaClientMock.java
+++ b/components/camel-aws/src/test/java/org/apache/camel/component/aws/lambda/AmazonLambdaClientMock.java
@@ -309,7 +309,18 @@ public class AmazonLambdaClientMock extends AWSLambdaClient {
 
     @Override
     public UpdateFunctionCodeResult updateFunctionCode(UpdateFunctionCodeRequest updateFunctionCodeRequest) {
-        throw new UnsupportedOperationException();
+        UpdateFunctionCodeResult result = new UpdateFunctionCodeResult();
+
+        result.setFunctionName(updateFunctionCodeRequest.getFunctionName());
+        result.setFunctionArn("arn:aws:lambda:eu-central-1:643534317684:function:" + updateFunctionCodeRequest.getFunctionName());
+        result.setCodeSize(340L);
+        result.setCodeSha256("PKt5ygvZ6G8vWJASlWIypsBmKzAdmRrvTO");
+        result.setMemorySize(128);
+        result.setTimeout(3);
+        result.setLastModified(DateTime.now().toString());
+        result.setVersion("$LATEST");
+        result.setTracingConfig(new TracingConfigResponse().withMode(TracingMode.PassThrough));
+        return result;
     }
 
     @Override
diff --git a/components/camel-aws/src/test/java/org/apache/camel/component/aws/lambda/LambdaOperationsTest.java b/components/camel-aws/src/test/java/org/apache/camel/component/aws/lambda/LambdaOperationsTest.java
index 0d156e7..7929b9b 100644
--- a/components/camel-aws/src/test/java/org/apache/camel/component/aws/lambda/LambdaOperationsTest.java
+++ b/components/camel-aws/src/test/java/org/apache/camel/component/aws/lambda/LambdaOperationsTest.java
@@ -26,7 +26,7 @@ public class LambdaOperationsTest {
 
     @Test
     public void supportedOperationCount() {
-        assertEquals(5, LambdaOperations.values().length);
+        assertEquals(6, LambdaOperations.values().length);
     }
 
     @Test
@@ -36,6 +36,7 @@ public class LambdaOperationsTest {
         assertEquals(LambdaOperations.listFunctions, LambdaOperations.valueOf("listFunctions"));
         assertEquals(LambdaOperations.invokeFunction, LambdaOperations.valueOf("invokeFunction"));
         assertEquals(LambdaOperations.deleteFunction, LambdaOperations.valueOf("deleteFunction"));
+        assertEquals(LambdaOperations.updateFunction, LambdaOperations.valueOf("updateFunction"));
     }
 
     @Test
@@ -45,5 +46,6 @@ public class LambdaOperationsTest {
         assertEquals(LambdaOperations.listFunctions.toString(), "listFunctions");
         assertEquals(LambdaOperations.invokeFunction.toString(), "invokeFunction");
         assertEquals(LambdaOperations.deleteFunction.toString(), "deleteFunction");
+        assertEquals(LambdaOperations.updateFunction.toString(), "updateFunction");
     }
 }
diff --git a/components/camel-aws/src/test/java/org/apache/camel/component/aws/lambda/LambdaProducerTest.java b/components/camel-aws/src/test/java/org/apache/camel/component/aws/lambda/LambdaProducerTest.java
index f774ceb..131767f 100644
--- a/components/camel-aws/src/test/java/org/apache/camel/component/aws/lambda/LambdaProducerTest.java
+++ b/components/camel-aws/src/test/java/org/apache/camel/component/aws/lambda/LambdaProducerTest.java
@@ -22,6 +22,7 @@ import com.amazonaws.services.lambda.model.CreateFunctionResult;
 import com.amazonaws.services.lambda.model.DeleteFunctionResult;
 import com.amazonaws.services.lambda.model.GetFunctionResult;
 import com.amazonaws.services.lambda.model.ListFunctionsResult;
+import com.amazonaws.services.lambda.model.UpdateFunctionCodeResult;
 import com.amazonaws.util.IOUtils;
 import org.apache.camel.EndpointInject;
 import org.apache.camel.Exchange;
@@ -64,6 +65,32 @@ public class LambdaProducerTest extends CamelTestSupport {
         assertNotNull(result.getFunctionArn());
         assertNotNull(result.getCodeSha256());
     }
+    
+    @Test
+    public void lambdaUpdateFunctionTest() throws Exception {
+
+        Exchange exchange = template.send("direct:updateFunction", ExchangePattern.InOut, new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(LambdaConstants.RUNTIME, "nodejs6.10");
+                exchange.getIn().setHeader(LambdaConstants.HANDLER, "GetHelloWithName.handler");
+                exchange.getIn().setHeader(LambdaConstants.DESCRIPTION, "Hello with node.js on Lambda");
+                exchange.getIn().setHeader(LambdaConstants.ROLE, "arn:aws:iam::643534317684:role/lambda-execution-role");
+
+                ClassLoader classLoader = getClass().getClassLoader();
+                File file = new File(classLoader.getResource("org/apache/camel/component/aws/lambda/function/node/GetHelloWithName.zip").getFile());
+                FileInputStream inputStream = new FileInputStream(file);
+                exchange.getIn().setBody(IOUtils.toByteArray(inputStream));
+            }
+        });
+
+        assertMockEndpointsSatisfied();
+
+        UpdateFunctionCodeResult result = (UpdateFunctionCodeResult) exchange.getIn().getBody();
+        assertEquals(result.getFunctionName(), "GetHelloWithName");
+        assertNotNull(result.getFunctionArn());
+        assertNotNull(result.getCodeSha256());
+    }
 
     @Test
     public void lambdaDeleteFunctionTest() throws Exception {
@@ -163,6 +190,10 @@ public class LambdaProducerTest extends CamelTestSupport {
                 from("direct:deleteFunction")
                     .to("aws-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient&operation=deleteFunction")
                     .to("mock:result");
+                
+                from("direct:updateFunction")
+                    .to("aws-lambda://GetHelloWithName?awsLambdaClient=#awsLambdaClient&operation=updateFunction")
+                    .to("mock:result");
 
             }
         };

-- 
To stop receiving notification emails like this one, please contact
['"commits@camel.apache.org" <co...@camel.apache.org>'].