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
commit dfffb9ec648e95830757d1b227e1ccdd0122fae0 Author: Raffaele Marcello <marcelloraffa...@gmail.com> AuthorDate: Mon Mar 8 10:24:21 2021 +0100 CAMEL-15963 Create a Google Cloud Functions component --- .../functions/GoogleCloudFunctionsProducer.java | 65 +++++----- .../unit/GoogleCloudFunctionsComponentTest.java | 132 +++++++++++++++++---- 2 files changed, 142 insertions(+), 55 deletions(-) diff --git a/components/camel-google-functions/src/main/java/org/apache/camel/component/google/functions/GoogleCloudFunctionsProducer.java b/components/camel-google-functions/src/main/java/org/apache/camel/component/google/functions/GoogleCloudFunctionsProducer.java index 581d6f6..d5328ce 100644 --- a/components/camel-google-functions/src/main/java/org/apache/camel/component/google/functions/GoogleCloudFunctionsProducer.java +++ b/components/camel-google-functions/src/main/java/org/apache/camel/component/google/functions/GoogleCloudFunctionsProducer.java @@ -20,6 +20,7 @@ import java.util.List; import com.google.api.client.util.Lists; import com.google.api.gax.rpc.ApiException; +import com.google.cloud.functions.v1.CallFunctionRequest; import com.google.cloud.functions.v1.CallFunctionResponse; import com.google.cloud.functions.v1.CloudFunction; import com.google.cloud.functions.v1.CloudFunctionName; @@ -50,18 +51,18 @@ public class GoogleCloudFunctionsProducer extends DefaultProducer { @Override public void process(final Exchange exchange) throws Exception { switch (determineOperation(exchange)) { - case listFunctions: - listFunctions(endpoint.getClient(), exchange); - break; - case getFunction: - getFunction(endpoint.getClient(), exchange); - break; - case callFunction: - callFunction(endpoint.getClient(), exchange); - break; + case listFunctions: + listFunctions(endpoint.getClient(), exchange); + break; + case getFunction: + getFunction(endpoint.getClient(), exchange); + break; + case callFunction: + callFunction(endpoint.getClient(), exchange); + break; - default: - throw new IllegalArgumentException("Unsupported operation"); + default: + throw new IllegalArgumentException("Unsupported operation"); } } @@ -69,20 +70,22 @@ public class GoogleCloudFunctionsProducer extends DefaultProducer { if (getConfiguration().isPojoRequest()) { Object payload = exchange.getIn().getMandatoryBody(); if (payload instanceof ListFunctionsRequest) { - ListFunctionsPagedResponse result; + ListFunctionsPagedResponse pagedListResponse; try { - result = client.listFunctions((ListFunctionsRequest) payload); + pagedListResponse = client.listFunctions((ListFunctionsRequest) payload); + List<CloudFunction> result = Lists.newArrayList(pagedListResponse.iterateAll()); + Message message = getMessageForResponse(exchange); + message.setBody(result); } catch (ApiException ae) { LOG.trace("listFunctions command returned the error code {}", ae.getStatusCode()); throw ae; } - Message message = getMessageForResponse(exchange); - message.setBody(result); } } else { ListFunctionsRequest request = ListFunctionsRequest.newBuilder() - .setParent(LocationName.of(getConfiguration().getProject(), getConfiguration().getLocation()).toString()) - .setPageSize(883849137) //TODO check it + .setParent(LocationName.of(getConfiguration().getProject(), getConfiguration().getLocation()) + .toString()) + .setPageSize(883849137) // TODO check it .setPageToken("pageToken873572522").build(); ListFunctionsPagedResponse pagedListResponse = client.listFunctions(request); List<CloudFunction> result = Lists.newArrayList(pagedListResponse.iterateAll()); @@ -106,8 +109,8 @@ public class GoogleCloudFunctionsProducer extends DefaultProducer { message.setBody(result); } } else { - CloudFunctionName cfName = CloudFunctionName.of(getConfiguration().getProject(), getConfiguration().getLocation(), - getConfiguration().getFunctionName()); + CloudFunctionName cfName = CloudFunctionName.of(getConfiguration().getProject(), + getConfiguration().getLocation(), getConfiguration().getFunctionName()); CloudFunction result = client.getFunction(cfName); Message message = getMessageForResponse(exchange); message.setBody(result); @@ -115,24 +118,27 @@ public class GoogleCloudFunctionsProducer extends DefaultProducer { } private void callFunction(CloudFunctionsServiceClient client, Exchange exchange) throws InvalidPayloadException { - String data = exchange.getIn().getBody(String.class); if (getConfiguration().isPojoRequest()) { Object payload = exchange.getIn().getMandatoryBody(); - if (payload instanceof CloudFunctionName) { + if (payload instanceof CallFunctionRequest) { CallFunctionResponse result; try { - result = client.callFunction((CloudFunctionName) payload, data); + result = client.callFunction( (CallFunctionRequest) payload ); + Message message = getMessageForResponse(exchange); + message.setBody(result); } catch (ApiException ae) { LOG.trace("callFunction command returned the error code {}", ae.getStatusCode()); throw ae; - } - Message message = getMessageForResponse(exchange); - message.setBody(result); + } } } else { - CloudFunctionName cfName = CloudFunctionName.of(getConfiguration().getProject(), getConfiguration().getLocation(), - getConfiguration().getFunctionName()); - CallFunctionResponse result = client.callFunction(cfName, data); + String data = exchange.getIn().getBody(String.class); + CloudFunctionName cfName = CloudFunctionName.of(getConfiguration().getProject(), getConfiguration().getLocation(), getConfiguration().getFunctionName()); + CallFunctionRequest request = CallFunctionRequest.newBuilder() + .setName(cfName.toString()) + .setData(data) + .build(); + CallFunctionResponse result = client.callFunction(request); Message message = getMessageForResponse(exchange); message.setBody(result); } @@ -142,8 +148,7 @@ public class GoogleCloudFunctionsProducer extends DefaultProducer { GoogleCloudFunctionsOperations operation = exchange.getIn().getHeader(GoogleCloudFunctionsConstants.OPERATION, GoogleCloudFunctionsOperations.class); if (operation == null) { - operation = getConfiguration().getOperation() == null - ? GoogleCloudFunctionsOperations.callFunction + operation = getConfiguration().getOperation() == null ? GoogleCloudFunctionsOperations.callFunction : getConfiguration().getOperation(); } return operation; diff --git a/components/camel-google-functions/src/test/java/org/apache/camel/component/google/functions/unit/GoogleCloudFunctionsComponentTest.java b/components/camel-google-functions/src/test/java/org/apache/camel/component/google/functions/unit/GoogleCloudFunctionsComponentTest.java index 75af885..898684b 100644 --- a/components/camel-google-functions/src/test/java/org/apache/camel/component/google/functions/unit/GoogleCloudFunctionsComponentTest.java +++ b/components/camel-google-functions/src/test/java/org/apache/camel/component/google/functions/unit/GoogleCloudFunctionsComponentTest.java @@ -16,6 +16,10 @@ */ package org.apache.camel.component.google.functions.unit; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -28,10 +32,13 @@ import com.google.cloud.functions.v1.CloudFunction; import com.google.cloud.functions.v1.CloudFunctionName; import com.google.cloud.functions.v1.CloudFunctionStatus; import com.google.cloud.functions.v1.GetFunctionRequest; +import com.google.cloud.functions.v1.ListFunctionsRequest; import com.google.cloud.functions.v1.ListFunctionsResponse; +import com.google.cloud.functions.v1.LocationName; import com.google.protobuf.AbstractMessage; import com.google.protobuf.Duration; import com.google.protobuf.Timestamp; + import org.apache.camel.EndpointInject; import org.apache.camel.Exchange; import org.apache.camel.ExchangePattern; @@ -41,10 +48,6 @@ import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertTrue; - public class GoogleCloudFunctionsComponentTest extends GoogleCloudFunctionsBaseTest { private static final Logger log = LoggerFactory.getLogger(GoogleCloudFunctionsComponentTest.class); @@ -60,26 +63,26 @@ public class GoogleCloudFunctionsComponentTest extends GoogleCloudFunctionsBaseT protected RouteBuilder createRouteBuilder() throws Exception { return new RouteBuilder() { public void configure() { - from("direct:listFunctions") - // .to("google-functions://myCamelFunction?client=#client&operation=listFunctions") - .to("google-functions://" + functionName + "?project=" + project + "&location=" + location - + "&operation=listFunctions") - .to("mock:result"); - from("direct:getFunction") - .to("google-functions://" + functionName + "?project=" + project + "&location=" + location - + "&operation=getFunction") - .to("mock:result"); - from("direct:callFunction") - .to("google-functions://" + functionName + "?project=" + project + "&location=" + location - + "&operation=callFunction") - .to("mock:result"); + //simple routes + from("direct:listFunctions").to("google-functions://" + functionName + "?project=" + project + + "&location=" + location + "&operation=listFunctions").to("mock:result"); + from("direct:getFunction").to("google-functions://" + functionName + "?project=" + project + + "&location=" + location + "&operation=getFunction").to("mock:result"); + from("direct:callFunction").to("google-functions://" + functionName + "?project=" + project + + "&location=" + location + "&operation=callFunction").to("mock:result"); + //pojo routes + from("direct:listFunctionsPojo").to("google-functions://" + functionName + "?project=" + project + + "&location=" + location + "&operation=listFunctions&pojoRequest=true").to("mock:result"); + from("direct:getFunctionPojo").to("google-functions://" + functionName + "?project=" + project + + "&location=" + location + "&operation=getFunction&pojoRequest=true").to("mock:result"); + from("direct:callFunctionPojo").to("google-functions://" + functionName + "?project=" + project + + "&location=" + location + "&operation=callFunction&pojoRequest=true").to("mock:result"); } }; } @Test public void listFunctionsTest() throws Exception { - log.info("list function"); CloudFunction cf1 = CloudFunction.newBuilder().build(); CloudFunction cf2 = CloudFunction.newBuilder().build(); List<CloudFunction> cfList = Arrays.asList(cf1, cf2); @@ -100,6 +103,32 @@ public class GoogleCloudFunctionsComponentTest extends GoogleCloudFunctionsBaseT } @Test + public void listFunctionsPojoTest() throws Exception { + CloudFunction cf1 = CloudFunction.newBuilder().build(); + CloudFunction cf2 = CloudFunction.newBuilder().build(); + List<CloudFunction> cfList = Arrays.asList(cf1, cf2); + ListFunctionsResponse expectedResponse = ListFunctionsResponse.newBuilder().setNextPageToken("") + .addAllFunctions(cfList).build(); + mockCloudFunctionsService.addResponse(expectedResponse); + + ListFunctionsRequest pojoRequest = ListFunctionsRequest.newBuilder() + .setParent(LocationName.of(project, location).toString()).setPageSize(883849137) + .setPageToken("pageToken873572522").build(); + + Exchange exchange = template.send("direct:listFunctionsPojo", ExchangePattern.InOut, exc -> { + exc.getIn().setBody(pojoRequest); + }); + List<CloudFunction> result = exchange.getMessage().getBody(List.class); + assertNotNull(result); + assertEquals(cfList.size(), result.size()); + + for (int i = 0; i < result.size(); i++) { + assertEquals(expectedResponse.getFunctionsList().get(i), result.get(i)); + } + + } + + @Test public void getFunctionTest() throws Exception { CloudFunction expectedResponse = CloudFunction.newBuilder() .setName(CloudFunctionName.of(project, location, functionName).toString()) @@ -129,11 +158,39 @@ public class GoogleCloudFunctionsComponentTest extends GoogleCloudFunctionsBaseT } @Test + public void getFunctionPojoTest() throws Exception { + CloudFunctionName cfName = CloudFunctionName.of(project, location, functionName); + CloudFunction expectedResponse = CloudFunction.newBuilder() + .setName( cfName.toString()) + .setDescription("description-1724546052").setStatus(CloudFunctionStatus.forNumber(0)) + .setEntryPoint("entryPoint-1979329474").setRuntime("runtime1550962648") + .setTimeout(Duration.newBuilder().build()).setAvailableMemoryMb(1964533661) + .setServiceAccountEmail("serviceAccountEmail1825953988").setUpdateTime(Timestamp.newBuilder().build()) + .setVersionId(-670497310).putAllLabels(new HashMap<String, String>()) + .putAllEnvironmentVariables(new HashMap<String, String>()).setNetwork("network1843485230") + .setMaxInstances(-330682013).setVpcConnector("vpcConnector2101559652").setBuildId("buildId230943785") + .build(); + mockCloudFunctionsService.addResponse(expectedResponse); + + Exchange exchange = template.send("direct:getFunctionPojo", ExchangePattern.InOut, exc -> { + exc.getIn().setBody(cfName); + }); + CloudFunction actualResponse = exchange.getMessage().getBody(CloudFunction.class); + assertEquals(expectedResponse, actualResponse); + + List<AbstractMessage> actualRequests = mockCloudFunctionsService.getRequests(); + assertEquals(1, actualRequests.size()); + GetFunctionRequest actualRequest = ((GetFunctionRequest) actualRequests.get(0)); + + assertEquals(cfName.toString(), actualRequest.getName()); + assertTrue(channelProvider.isHeaderSent(ApiClientHeaderProvider.getDefaultApiClientHeaderKey(), + GaxGrpcProperties.getDefaultApiClientHeaderPattern())); + } + + @Test public void callFunctionTest() throws Exception { CallFunctionResponse expectedResponse = CallFunctionResponse.newBuilder() - .setExecutionId("executionId-454906285") - .setResult("result-934426595") - .setError("error96784904") + .setExecutionId("executionId-454906285").setResult("result-934426595").setError("error96784904") .build(); mockCloudFunctionsService.addResponse(expectedResponse); @@ -152,10 +209,35 @@ public class GoogleCloudFunctionsComponentTest extends GoogleCloudFunctionsBaseT assertEquals(name.toString(), actualRequest.getName()); assertEquals(data, actualRequest.getData()); - assertTrue( - channelProvider.isHeaderSent( - ApiClientHeaderProvider.getDefaultApiClientHeaderKey(), - GaxGrpcProperties.getDefaultApiClientHeaderPattern())); + assertTrue(channelProvider.isHeaderSent(ApiClientHeaderProvider.getDefaultApiClientHeaderKey(), + GaxGrpcProperties.getDefaultApiClientHeaderPattern())); + } + + @Test + public void callFunctionPojoTest() throws Exception { + CallFunctionResponse expectedResponse = CallFunctionResponse.newBuilder() + .setExecutionId("executionId-454906285").setResult("result-934426595").setError("error96784904") + .build(); + mockCloudFunctionsService.addResponse(expectedResponse); + + CloudFunctionName cfName = CloudFunctionName.of(project, location, functionName); + String data = "data3076010"; + CallFunctionRequest request = CallFunctionRequest.newBuilder().setName(cfName.toString()).setData(data).build(); + + Exchange exchange = template.send("direct:callFunctionPojo", ExchangePattern.InOut, exc -> { + exc.getIn().setBody(request); + }); + CallFunctionResponse actualResponse = exchange.getMessage().getBody(CallFunctionResponse.class); + assertEquals(expectedResponse, actualResponse); + + List<AbstractMessage> actualRequests = mockCloudFunctionsService.getRequests(); + assertEquals(1, actualRequests.size()); + CallFunctionRequest actualRequest = ((CallFunctionRequest) actualRequests.get(0)); + + assertEquals(cfName.toString(), actualRequest.getName()); + assertEquals(data, actualRequest.getData()); + assertTrue(channelProvider.isHeaderSent(ApiClientHeaderProvider.getDefaultApiClientHeaderKey(), + GaxGrpcProperties.getDefaultApiClientHeaderPattern())); } }