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 2021/03/19 06:39:51 UTC

[camel] 16/22: CAMEL-15963 Create a Google Cloud Functions 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

commit a35f38ff74cdb5b72eb0b4ea5ef0a3ff27c9e305
Author: Raffaele Marcello <ma...@gmail.com>
AuthorDate: Tue Mar 16 12:49:48 2021 +0100

    CAMEL-15963 Create a Google Cloud Functions component
---
 .../catalog/docs/google-functions-component.adoc   |   3 +
 .../camel-google/camel-google-functions/pom.xml    |   5 +-
 .../GoogleCloudFunctionsClientFactory.java         |  56 ++++++
 .../functions/GoogleCloudFunctionsComponent.java   |   1 -
 .../functions/GoogleCloudFunctionsEndpoint.java    |  26 +--
 .../functions/GoogleCloudFunctionsProducer.java    | 202 +++++++--------------
 .../ROOT/pages/google-functions-component.adoc     |   3 +
 parent/pom.xml                                     |   2 +
 8 files changed, 132 insertions(+), 166 deletions(-)

diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/google-functions-component.adoc b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/google-functions-component.adoc
index cad2ef2..7e230c6 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/google-functions-component.adoc
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/google-functions-component.adoc
@@ -205,6 +205,9 @@ This operation will get the `CloudFunction` object for the project `myProject`,
 --------------------------------------------------------------------------------
 //call function
 from("direct:start")
+.process(exchange -> {
+  exchange.getIn().setBody("just a message");
+})
 .to("google-functions://myCamelFunction?serviceAccountKey=/home/user/Downloads/my-key.json&project=myProject&location=us-central1&operation=callFunction")
 .log("body:${body}")
 .to("mock:result");
diff --git a/components/camel-google/camel-google-functions/pom.xml b/components/camel-google/camel-google-functions/pom.xml
index fd865b2..b8402d5 100644
--- a/components/camel-google/camel-google-functions/pom.xml
+++ b/components/camel-google/camel-google-functions/pom.xml
@@ -34,7 +34,6 @@
 
   <properties>
     <firstVersion>3.9.0</firstVersion>
-    <google-cloud-functions-version>1.0.8</google-cloud-functions-version>
   </properties>
 
   <dependencyManagement>
@@ -48,7 +47,7 @@
       <dependency>
         <groupId>com.google.cloud</groupId>
         <artifactId>google-cloud-functions-bom</artifactId>
-        <version>${google-cloud-functions-version}</version>
+        <version>${google-cloud-functions-bom-version}</version>
         <type>pom</type>
         <scope>import</scope>
       </dependency>
@@ -79,7 +78,7 @@
       <groupId>com.google.api</groupId>
       <artifactId>gax-grpc</artifactId>
       <classifier>testlib</classifier>
-      <version>1.62.0</version>
+      <version>${google-cloud-functions-gax-grpc-version}</version>
       <scope>test</scope>
     </dependency>
 
diff --git a/components/camel-google/camel-google-functions/src/main/java/org/apache/camel/component/google/functions/GoogleCloudFunctionsClientFactory.java b/components/camel-google/camel-google-functions/src/main/java/org/apache/camel/component/google/functions/GoogleCloudFunctionsClientFactory.java
new file mode 100644
index 0000000..354c543
--- /dev/null
+++ b/components/camel-google/camel-google-functions/src/main/java/org/apache/camel/component/google/functions/GoogleCloudFunctionsClientFactory.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.google.functions;
+
+import java.io.FileInputStream;
+
+import com.google.api.gax.core.FixedCredentialsProvider;
+import com.google.auth.Credentials;
+import com.google.auth.oauth2.ServiceAccountCredentials;
+import com.google.cloud.functions.v1.CloudFunctionsServiceClient;
+import com.google.cloud.functions.v1.CloudFunctionsServiceSettings;
+import com.google.common.base.Strings;
+import org.apache.camel.CamelContext;
+
+public final class GoogleCloudFunctionsClientFactory {
+    /**
+     * Prevent instantiation.
+     */
+    private GoogleCloudFunctionsClientFactory() {
+    }
+
+    public static CloudFunctionsServiceClient create(
+            CamelContext context,
+            GoogleCloudFunctionsConfiguration configuration)
+            throws Exception {
+        CloudFunctionsServiceClient cloudFunctionsClient = null;
+        if (!Strings.isNullOrEmpty(configuration.getServiceAccountKey())) {
+            Credentials myCredentials = ServiceAccountCredentials
+                    .fromStream(new FileInputStream(configuration.getServiceAccountKey()));
+            CloudFunctionsServiceSettings settings = CloudFunctionsServiceSettings.newBuilder()
+                    .setCredentialsProvider(FixedCredentialsProvider.create(myCredentials)).build();
+            cloudFunctionsClient = CloudFunctionsServiceClient.create(settings);
+        } else {
+            // it needs to define the environment variable GOOGLE_APPLICATION_CREDENTIALS
+            // with the service account file
+            // more info at https://cloud.google.com/docs/authentication/production
+            CloudFunctionsServiceSettings settings = CloudFunctionsServiceSettings.newBuilder().build();
+            cloudFunctionsClient = CloudFunctionsServiceClient.create(settings);
+        }
+        return cloudFunctionsClient;
+    }
+}
diff --git a/components/camel-google/camel-google-functions/src/main/java/org/apache/camel/component/google/functions/GoogleCloudFunctionsComponent.java b/components/camel-google/camel-google-functions/src/main/java/org/apache/camel/component/google/functions/GoogleCloudFunctionsComponent.java
index 5dcdedc..abafbd6 100644
--- a/components/camel-google/camel-google-functions/src/main/java/org/apache/camel/component/google/functions/GoogleCloudFunctionsComponent.java
+++ b/components/camel-google/camel-google-functions/src/main/java/org/apache/camel/component/google/functions/GoogleCloudFunctionsComponent.java
@@ -31,7 +31,6 @@ public class GoogleCloudFunctionsComponent extends DefaultComponent {
     private GoogleCloudFunctionsConfiguration configuration = new GoogleCloudFunctionsConfiguration();
 
     public GoogleCloudFunctionsComponent() {
-        super(null);
     }
 
     public GoogleCloudFunctionsComponent(CamelContext context) {
diff --git a/components/camel-google/camel-google-functions/src/main/java/org/apache/camel/component/google/functions/GoogleCloudFunctionsEndpoint.java b/components/camel-google/camel-google-functions/src/main/java/org/apache/camel/component/google/functions/GoogleCloudFunctionsEndpoint.java
index d3016bd..895aa0d 100644
--- a/components/camel-google/camel-google-functions/src/main/java/org/apache/camel/component/google/functions/GoogleCloudFunctionsEndpoint.java
+++ b/components/camel-google/camel-google-functions/src/main/java/org/apache/camel/component/google/functions/GoogleCloudFunctionsEndpoint.java
@@ -16,14 +16,7 @@
  */
 package org.apache.camel.component.google.functions;
 
-import java.io.FileInputStream;
-
-import com.google.api.client.util.Strings;
-import com.google.api.gax.core.FixedCredentialsProvider;
-import com.google.auth.Credentials;
-import com.google.auth.oauth2.ServiceAccountCredentials;
 import com.google.cloud.functions.v1.CloudFunctionsServiceClient;
-import com.google.cloud.functions.v1.CloudFunctionsServiceSettings;
 import org.apache.camel.Category;
 import org.apache.camel.Consumer;
 import org.apache.camel.Processor;
@@ -81,28 +74,15 @@ public class GoogleCloudFunctionsEndpoint extends DefaultEndpoint {
         if (configuration.getClient() != null) {
             cloudFunctionsClient = configuration.getClient();
         } else {
-            if (!Strings.isNullOrEmpty(configuration.getServiceAccountKey())) {
-                Credentials myCredentials = ServiceAccountCredentials
-                        .fromStream(new FileInputStream(configuration.getServiceAccountKey()));
-                CloudFunctionsServiceSettings settings = CloudFunctionsServiceSettings.newBuilder()
-                        .setCredentialsProvider(FixedCredentialsProvider.create(myCredentials)).build();
-                cloudFunctionsClient = CloudFunctionsServiceClient.create(settings);
-            } else {
-                //it needs to define the  environment variable GOOGLE_APPLICATION_CREDENTIALS with the service account file
-                //more info at https://cloud.google.com/docs/authentication/production
-                CloudFunctionsServiceSettings settings = CloudFunctionsServiceSettings.newBuilder().build();
-                cloudFunctionsClient = CloudFunctionsServiceClient.create(settings);
-            }
+            cloudFunctionsClient = GoogleCloudFunctionsClientFactory.create(this.getCamelContext(), configuration);
         }
     }
 
     @Override
     protected void doStop() throws Exception {
         super.doStop();
-        if (configuration.getClient() == null) {
-            if (cloudFunctionsClient != null) {
-                cloudFunctionsClient.close();
-            }
+        if (configuration.getClient() == null && cloudFunctionsClient != null) {
+            cloudFunctionsClient.close();
         }
     }
 
diff --git a/components/camel-google/camel-google-functions/src/main/java/org/apache/camel/component/google/functions/GoogleCloudFunctionsProducer.java b/components/camel-google/camel-google-functions/src/main/java/org/apache/camel/component/google/functions/GoogleCloudFunctionsProducer.java
index 2cd854c..35ac521 100644
--- a/components/camel-google/camel-google-functions/src/main/java/org/apache/camel/component/google/functions/GoogleCloudFunctionsProducer.java
+++ b/components/camel-google/camel-google-functions/src/main/java/org/apache/camel/component/google/functions/GoogleCloudFunctionsProducer.java
@@ -20,7 +20,6 @@ import java.util.List;
 import java.util.concurrent.ExecutionException;
 
 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;
@@ -92,220 +91,145 @@ public class GoogleCloudFunctionsProducer extends DefaultProducer {
     }
 
     private void listFunctions(CloudFunctionsServiceClient client, Exchange exchange) throws InvalidPayloadException {
+        List<CloudFunction> response = null;
         if (getConfiguration().isPojoRequest()) {
-            Object payload = exchange.getIn().getMandatoryBody();
-            if (payload instanceof ListFunctionsRequest) {
-                ListFunctionsPagedResponse pagedListResponse;
-                try {
-                    pagedListResponse = client.listFunctions((ListFunctionsRequest) payload);
-                    List<CloudFunction> response = Lists.newArrayList(pagedListResponse.iterateAll());
-                    Message message = getMessageForResponse(exchange);
-                    message.setBody(response);
-                } catch (ApiException ae) {
-                    LOG.trace("listFunctions command returned the error code {}", ae.getStatusCode());
-                    throw ae;
-                }
-            }
+            ListFunctionsRequest request = exchange.getIn().getMandatoryBody(ListFunctionsRequest.class);
+            ListFunctionsPagedResponse pagedListResponse = client.listFunctions(request);
+            response = Lists.newArrayList(pagedListResponse.iterateAll());
         } else {
-            ListFunctionsRequest request = ListFunctionsRequest.newBuilder()
-                    .setParent(LocationName.of(getConfiguration().getProject(), getConfiguration().getLocation())
-                            .toString())
-                    .setPageSize(883849137) // TODO check it
-                    .setPageToken("pageToken873572522").build();
+            ListFunctionsRequest request = ListFunctionsRequest
+                    .newBuilder().setParent(LocationName
+                            .of(getConfiguration().getProject(), getConfiguration().getLocation()).toString())
+                    .setPageSize(Integer.MAX_VALUE).build();
             ListFunctionsPagedResponse pagedListResponse = client.listFunctions(request);
-            List<CloudFunction> response = Lists.newArrayList(pagedListResponse.iterateAll());
-            Message message = getMessageForResponse(exchange);
-            message.setBody(response);
+            response = Lists.newArrayList(pagedListResponse.iterateAll());
         }
+        Message message = getMessageForResponse(exchange);
+        message.setBody(response);
     }
 
     private void getFunction(CloudFunctionsServiceClient client, Exchange exchange) throws InvalidPayloadException {
+        CloudFunction response = null;
         if (getConfiguration().isPojoRequest()) {
-            Object payload = exchange.getIn().getMandatoryBody();
-            if (payload instanceof CloudFunctionName) {
-                CloudFunction response;
-                try {
-                    response = client.getFunction((CloudFunctionName) payload);
-                } catch (ApiException ae) {
-                    LOG.trace("getFunction command returned the error code {}", ae.getStatusCode());
-                    throw ae;
-                }
-                Message message = getMessageForResponse(exchange);
-                message.setBody(response);
-            }
+            CloudFunctionName request = exchange.getIn().getMandatoryBody(CloudFunctionName.class);
+            response = client.getFunction(request);
         } else {
             CloudFunctionName cfName = CloudFunctionName.of(getConfiguration().getProject(),
                     getConfiguration().getLocation(), getConfiguration().getFunctionName());
-            CloudFunction response = client.getFunction(cfName);
-            Message message = getMessageForResponse(exchange);
-            message.setBody(response);
+            response = client.getFunction(cfName);
         }
+        Message message = getMessageForResponse(exchange);
+        message.setBody(response);
     }
 
     private void callFunction(CloudFunctionsServiceClient client, Exchange exchange) throws InvalidPayloadException {
+        CallFunctionResponse response = null;
         if (getConfiguration().isPojoRequest()) {
-            Object payload = exchange.getIn().getMandatoryBody();
-            if (payload instanceof CallFunctionRequest) {
-                CallFunctionResponse response;
-                try {
-                    response = client.callFunction((CallFunctionRequest) payload);
-                    Message message = getMessageForResponse(exchange);
-                    message.setHeader(GoogleCloudFunctionsConstants.RESPONSE_OBJECT, response);
-                    message.setBody(response.getResult());
-                } catch (ApiException ae) {
-                    LOG.trace("callFunction command returned the error code {}", ae.getStatusCode());
-                    throw ae;
-                }
-            }
+            CallFunctionRequest request = exchange.getIn().getMandatoryBody(CallFunctionRequest.class);
+            response = client.callFunction(request);
         } else {
             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 response = client.callFunction(request);
-            Message message = getMessageForResponse(exchange);
-            message.setHeader(GoogleCloudFunctionsConstants.RESPONSE_OBJECT, response);
-            message.setBody(response.getResult());
+            response = client.callFunction(request);
         }
+        Message message = getMessageForResponse(exchange);
+        message.setHeader(GoogleCloudFunctionsConstants.RESPONSE_OBJECT, response);
+        message.setBody(response.getResult());
     }
 
     private void generateDownloadUrl(CloudFunctionsServiceClient client, Exchange exchange)
             throws InvalidPayloadException {
+        GenerateDownloadUrlResponse response = null;
         if (getConfiguration().isPojoRequest()) {
-            Object payload = exchange.getIn().getMandatoryBody();
-            if (payload instanceof GenerateDownloadUrlRequest) {
-                try {
-                    GenerateDownloadUrlResponse response = client
-                            .generateDownloadUrl((GenerateDownloadUrlRequest) payload);
-                    Message message = getMessageForResponse(exchange);
-                    message.setHeader(GoogleCloudFunctionsConstants.RESPONSE_OBJECT, response);
-                    message.setBody(response.getDownloadUrl());
-                } catch (ApiException ae) {
-                    LOG.trace("generateDownloadUrl command returned the error code {}", ae.getStatusCode());
-                    throw ae;
-                }
-            }
+            GenerateDownloadUrlRequest request = exchange.getIn().getMandatoryBody(GenerateDownloadUrlRequest.class);
+            response = client.generateDownloadUrl(request);
         } else {
             CloudFunctionName cfName = CloudFunctionName.of(getConfiguration().getProject(),
                     getConfiguration().getLocation(), getConfiguration().getFunctionName());
             GenerateDownloadUrlRequest request = GenerateDownloadUrlRequest.newBuilder().setName(cfName.toString())
                     .build();
-            GenerateDownloadUrlResponse response = client.generateDownloadUrl(request);
-            Message message = getMessageForResponse(exchange);
-            message.setHeader(GoogleCloudFunctionsConstants.RESPONSE_OBJECT, response);
-            message.setBody(response.getDownloadUrl());
+            response = client.generateDownloadUrl(request);
         }
+        Message message = getMessageForResponse(exchange);
+        message.setHeader(GoogleCloudFunctionsConstants.RESPONSE_OBJECT, response);
+        message.setBody(response.getDownloadUrl());
     }
 
     private void generateUploadUrl(CloudFunctionsServiceClient client, Exchange exchange)
             throws InvalidPayloadException {
+        GenerateUploadUrlResponse response = null;
         if (getConfiguration().isPojoRequest()) {
-            Object payload = exchange.getIn().getMandatoryBody();
-            if (payload instanceof GenerateUploadUrlRequest) {
-                try {
-                    GenerateUploadUrlResponse response = client.generateUploadUrl((GenerateUploadUrlRequest) payload);
-                    Message message = getMessageForResponse(exchange);
-                    message.setHeader(GoogleCloudFunctionsConstants.RESPONSE_OBJECT, response);
-                    message.setBody(response.getUploadUrl());
-                } catch (ApiException ae) {
-                    LOG.trace("generateUploadUrl command returned the error code {}", ae.getStatusCode());
-                    throw ae;
-                }
-            }
+            GenerateUploadUrlRequest request = exchange.getIn().getMandatoryBody(GenerateUploadUrlRequest.class);
+            response = client.generateUploadUrl(request);
         } else {
             LocationName locationName = LocationName.of(getConfiguration().getProject(),
                     getConfiguration().getLocation());
             GenerateUploadUrlRequest request = GenerateUploadUrlRequest.newBuilder().setParent(locationName.toString())
                     .build();
-            GenerateUploadUrlResponse response = client.generateUploadUrl(request);
-            Message message = getMessageForResponse(exchange);
-            message.setHeader(GoogleCloudFunctionsConstants.RESPONSE_OBJECT, response);
-            message.setBody(response.getUploadUrl());
+            response = client.generateUploadUrl(request);
         }
+        Message message = getMessageForResponse(exchange);
+        message.setHeader(GoogleCloudFunctionsConstants.RESPONSE_OBJECT, response);
+        message.setBody(response.getUploadUrl());
     }
 
     private void createFunction(CloudFunctionsServiceClient client, Exchange exchange)
             throws InvalidPayloadException, InterruptedException, ExecutionException {
+        CloudFunction response = null;
         if (getConfiguration().isPojoRequest()) {
-            Object payload = exchange.getIn().getMandatoryBody();
-            if (payload instanceof CreateFunctionRequest) {
-                try {
-                    CloudFunction response = client.createFunctionAsync((CreateFunctionRequest) payload).get();
-                    Message message = getMessageForResponse(exchange);
-                    message.setBody(response);
-                } catch (ApiException ae) {
-                    LOG.trace("createFunction command returned the error code {}", ae.getStatusCode());
-                    throw ae;
-                }
-            }
+            CreateFunctionRequest request = exchange.getIn().getMandatoryBody(CreateFunctionRequest.class);
+            response = client.createFunctionAsync(request).get();
         } else {
             final String project = getConfiguration().getProject();
             final String location = getConfiguration().getLocation();
             final String functionName = getConfiguration().getFunctionName();
-            final String entryPoint = exchange.getIn().getHeader(GoogleCloudFunctionsConstants.ENTRY_POINT, String.class);
+            final String entryPoint = exchange.getIn().getHeader(GoogleCloudFunctionsConstants.ENTRY_POINT,
+                    String.class);
             final String runtime = exchange.getIn().getHeader(GoogleCloudFunctionsConstants.RUNTIME, String.class);
-            final String sourceArchiveUrl
-                    = exchange.getIn().getHeader(GoogleCloudFunctionsConstants.SOURCE_ARCHIVE_URL, String.class);
-
+            final String sourceArchiveUrl = exchange.getIn().getHeader(GoogleCloudFunctionsConstants.SOURCE_ARCHIVE_URL,
+                    String.class);
             CloudFunction function = CloudFunction.newBuilder()
-                    .setName(CloudFunctionName.of(project, location, functionName).toString())
-                    .setEntryPoint(entryPoint)
-                    .setRuntime(runtime)
-                    .setHttpsTrigger(HttpsTrigger.getDefaultInstance())
-                    .setSourceArchiveUrl(sourceArchiveUrl)
-                    .build();
+                    .setName(CloudFunctionName.of(project, location, functionName).toString()).setEntryPoint(entryPoint)
+                    .setRuntime(runtime).setHttpsTrigger(HttpsTrigger.getDefaultInstance())
+                    .setSourceArchiveUrl(sourceArchiveUrl).build();
             CreateFunctionRequest request = CreateFunctionRequest.newBuilder()
-                    .setLocation(LocationName.of(project, location).toString())
-                    .setFunction(function).build();
-
-            CloudFunction response = client.createFunctionAsync(request).get();
-            Message message = getMessageForResponse(exchange);
-            message.setBody(response);
+                    .setLocation(LocationName.of(project, location).toString()).setFunction(function).build();
+            response = client.createFunctionAsync(request).get();
         }
+        Message message = getMessageForResponse(exchange);
+        message.setBody(response);
     }
 
     private void updateFunction(CloudFunctionsServiceClient client, Exchange exchange)
             throws InvalidPayloadException, InterruptedException, ExecutionException {
+        CloudFunction response = null;
         if (getConfiguration().isPojoRequest()) {
-            Object payload = exchange.getIn().getMandatoryBody();
-            if (payload instanceof UpdateFunctionRequest) {
-                try {
-                    CloudFunction response = client.updateFunctionAsync((UpdateFunctionRequest) payload).get();
-                    Message message = getMessageForResponse(exchange);
-                    message.setBody(response);
-                } catch (ApiException ae) {
-                    LOG.trace("updateFunction command returned the error code {}", ae.getStatusCode());
-                    throw ae;
-                }
-            }
+            UpdateFunctionRequest request = exchange.getIn().getMandatoryBody(UpdateFunctionRequest.class);
+            response = client.updateFunctionAsync(request).get();
         } else {
             throw new IllegalArgumentException("updateFunction is supported only in pojo mode");
         }
+        Message message = getMessageForResponse(exchange);
+        message.setBody(response);
     }
 
     private void deleteFunction(CloudFunctionsServiceClient client, Exchange exchange)
             throws InvalidPayloadException, InterruptedException, ExecutionException {
+        Empty response = null;
         if (getConfiguration().isPojoRequest()) {
-            Object payload = exchange.getIn().getMandatoryBody();
-            if (payload instanceof DeleteFunctionRequest) {
-                try {
-                    Empty response = client.deleteFunctionAsync((DeleteFunctionRequest) payload).get();
-                    Message message = getMessageForResponse(exchange);
-                    message.setBody(response);
-                } catch (ApiException ae) {
-                    LOG.trace("deleteFunction command returned the error code {}", ae.getStatusCode());
-                    throw ae;
-                }
-            }
+            DeleteFunctionRequest request = exchange.getIn().getMandatoryBody(DeleteFunctionRequest.class);
+            response = client.deleteFunctionAsync(request).get();
         } else {
             CloudFunctionName cfName = CloudFunctionName.of(getConfiguration().getProject(),
                     getConfiguration().getLocation(), getConfiguration().getFunctionName());
             DeleteFunctionRequest request = DeleteFunctionRequest.newBuilder().setName(cfName.toString()).build();
-            Empty response = client.deleteFunctionAsync(request).get();
-            Message message = getMessageForResponse(exchange);
-            message.setBody(response);
+            response = client.deleteFunctionAsync(request).get();
         }
+        Message message = getMessageForResponse(exchange);
+        message.setBody(response);
     }
 
     private GoogleCloudFunctionsOperations determineOperation(Exchange exchange) {
diff --git a/docs/components/modules/ROOT/pages/google-functions-component.adoc b/docs/components/modules/ROOT/pages/google-functions-component.adoc
index 709d2c5..3c9fd5e 100644
--- a/docs/components/modules/ROOT/pages/google-functions-component.adoc
+++ b/docs/components/modules/ROOT/pages/google-functions-component.adoc
@@ -207,6 +207,9 @@ This operation will get the `CloudFunction` object for the project `myProject`,
 --------------------------------------------------------------------------------
 //call function
 from("direct:start")
+.process(exchange -> {
+  exchange.getIn().setBody("just a message");
+})
 .to("google-functions://myCamelFunction?serviceAccountKey=/home/user/Downloads/my-key.json&project=myProject&location=us-central1&operation=callFunction")
 .log("body:${body}")
 .to("mock:result");
diff --git a/parent/pom.xml b/parent/pom.xml
index b70a795..54d40c0 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -214,6 +214,8 @@
         <google-api-services-sheets-version>v4-rev551-1.22.0</google-api-services-sheets-version>
         <google-api-services-mail-version>v1-rev81-1.22.0</google-api-services-mail-version>
         <google-cloud-bom-version>16.3.0</google-cloud-bom-version>
+		<google-cloud-functions-bom-version>1.0.8</google-cloud-functions-bom-version>
+		<google-cloud-functions-gax-grpc-version>1.62.0</google-cloud-functions-gax-grpc-version>
         <google-cloud-guava-version>30.0-jre</google-cloud-guava-version>
         <google-mail-guava-version>17.0</google-mail-guava-version>
         <graaljs-version>21.0.0.2</graaljs-version>