= Google Cloud Functions Component
:doctitle: Google Cloud Functions
:shortname: google-functions
:artifactid: camel-google-functions
:description: Manage and invoke Google Cloud Functions
:since: 3.9
:supportlevel: Stable
:component-header: Only producer is supported
//Manually maintained attributes
:group: Google
:camel-spring-boot-name: google-functions

*Since Camel {since}*

*{component-header}*

The Google Functions component provides access to https://cloud.google.com/functions/[Google Cloud Functions] via
the https://github.com/googleapis/java-functions[Google Cloud Functions Client for Java].

Maven users will need to add the following dependency to their pom.xml
for this component:

[source,xml]
------------------------------------------------------
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-google-functions</artifactId>
    <!-- use the same version as your Camel core version -->
    <version>x.x.x</version>
</dependency>

------------------------------------------------------

[[GoogleFunctions-AuthenticationConfiguration]]

== Authentication Configuration

Google Functions component authentication is targeted for use with the GCP Service Accounts.
For more information please refer to https://github.com/googleapis/google-cloud-java#authentication[Google Cloud Authentication].

When you have the **service account key** you can provide authentication credentials to your application code.
Google security credentials can be set through the component endpoint:

[source,java]
--------------------------------------------------------
String endpoint = "google-functions://myCamelFunction?serviceAccountKey=/home/user/Downloads/my-key.json";
--------------------------------------------------------

Or by setting the environment variable `GOOGLE_APPLICATION_CREDENTIALS` :

--------------------------------------------------------
export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/my-key.json"
--------------------------------------------------------


== URI Format

--------------------------------------------------------
google-functions://functionName[?options]
--------------------------------------------------------

You can append query options to the URI in the following format,
`?options=value&option2=value&...`

For example in order to call the function `myCamelFunction` from the project `myProject` and location `us-central1`, use the following snippet:

[source,java]
--------------------------------------------------------------------------------
from("google-functions://myCamelFunction?project=myProject&location=us-central1&operation=callFunction&serviceAccountKey=/home/user/Downloads/my-key.json")
  .to("direct:test");
--------------------------------------------------------------------------------



// component-configure options: START

// component-configure options: END

// component options: START
include::partial$component-configure-options.adoc[]
include::partial$component-endpoint-options.adoc[]
// component options: END

// endpoint options: START

// endpoint options: END


== Usage

=== Message headers evaluated by the Google Functions Producer

[width="100%",cols="10%,10%,80%",options="header",]
|=======================================================================
|Header |Type |Description
|`GoogleCloudFunctionsOperation` |`String` |The operation to perform. Permitted values are listFunctions, getFunction, callFunction, generateDownloadUrl, generateUploadUrl, createFunction, updateFunction, deleteFunction
|`GoogleCloudFunctionsEntryPoint` |`String` |The name of the function (as defined in source code) that will be executed. Used for createFunction operation.
|`GoogleCloudFunctionsRuntime` |`String` |The runtime in which to run the function. Possible values are `nodejs10`, `nodejs12`, `nodejs14`, `python37`, `python38`, `python39`, `go111`, `go113`, `java11`, `dotnet3`, `ruby26`, `nodejs6`, `nodejs8`. Used for createFunction operation.
|`GoogleCloudFunctionsSourceArchiveUrl` |`String` |The Google Cloud Storage URL, starting with `gs://`, pointing to the zip archive which contains the function. Used for createFunction operation.

|=======================================================================

=== Message headers set by the Google Functions Producer

[width="100%",cols="10%,10%,80%",options="header",]
|=======================================================================
|Header |Type |Description
|`GoogleCloudFunctionsResponseObject` |`Object` |The response object resulting from the Google Functions Client invocation
|=======================================================================

=== Google Functions Producer operations

Google Functions component provides the following operation on the producer side:

- listFunctions
- getFunction
- callFunction
- generateDownloadUrl
- generateUploadUrl
- createFunction
- updateFunction
- deleteFunction

If you don't specify an operation by default the producer will use the `callFunction` operation.

=== Advanced component configuration

If you need to have more control over the `client` instance configuration, you can create your own instance and refer to it in your Camel google-functions component configuration:

[source,java]
--------------------------------------------------------------------------------
from("google-functions://myCamelFunction?client=#myClient")
    .to("mock:result");
--------------------------------------------------------------------------------

=== Google Functions Producer Operation examples

- ListFunctions: This operation invoke the Google Functions client and get the list of cloud Functions

[source,java]
--------------------------------------------------------------------------------
//list functions
from("direct:start")
    .to("google-functions://myCamelFunction?serviceAccountKey=/home/user/Downloads/my-key.json&project=myProject&location=us-central1&operation=listFunctions")
    .log("body:${body}")
--------------------------------------------------------------------------------

This operation will get the list of cloud functions for the project `myProject` and location `us-central1`.

- GetFunction: this operation get the Cloud Functions object

[source,java]
--------------------------------------------------------------------------------
//get function
from("direct:start")
    .to("google-functions://myCamelFunction?serviceAccountKey=/home/user/Downloads/my-key.json&project=myProject&location=us-central1&operation=getFunction")
    .log("body:${body}")
    .to("mock:result");
--------------------------------------------------------------------------------

This operation will get the `CloudFunction` object for the project `myProject`, location `us-central1` and functionName `myCamelFunction`.

- CallFunction: this operation call the function using an HTTP request

[source,java]
--------------------------------------------------------------------------------
//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");
--------------------------------------------------------------------------------

- GenerateDownloadUrl: this operation generate the signed URL for downloading deployed function source code.

[source,java]
--------------------------------------------------------------------------------
//generate download url
from("direct:start").to("google-functions://myCamelFunction?serviceAccountKey=/home/user/Downloads/my-key.json&project=myProject&location=us-central1&operation=generateDownloadUrl")
.log("body:${body}")
.to("mock:result");
--------------------------------------------------------------------------------

- GenerateUploadUrl: this operation generate a signed URL for uploading a function source code.

[source,java]
--------------------------------------------------------------------------------
from("direct:start").to("google-functions://myCamelFunction?serviceAccountKey=/home/user/Downloads/my-key.json&project=myProject&location=us-central1&operation=generateUploadUrl")
    .log("body:${body}")
    .to("mock:result");
--------------------------------------------------------------------------------

- createFunction: this operation creates a new function.

[source,java]
--------------------------------------------------------------------------------

from("direct:start")
    .process(exchange -> {
      exchange.getIn().setHeader(GoogleCloudFunctionsConstants.ENTRY_POINT, "com.example.Example");
      exchange.getIn().setHeader(GoogleCloudFunctionsConstants.RUNTIME, "java11");
      exchange.getIn().setHeader(GoogleCloudFunctionsConstants.SOURCE_ARCHIVE_URL, "gs://myBucket/source.zip");
    }).to("google-functions://myCamelFunction?serviceAccountKey=/home/user/Downloads/my-key.json&project=myProject&location=us-central1&operation=createFunction")
    .log("body:${body}")
    .to("mock:result");
--------------------------------------------------------------------------------

- updateFunction: this operation updates existing function.

[source,java]
--------------------------------------------------------------------------------
from("direct:start")
.process(exchange -> {
  UpdateFunctionRequest request = UpdateFunctionRequest.newBuilder()
    .setFunction(CloudFunction.newBuilder().build())
    .setUpdateMask(FieldMask.newBuilder().build()).build();
  exchange.getIn().setBody(request);
}).to("google-functions://myCamelFunction?serviceAccountKey=/home/user/Downloads/my-key.json&project=myProject&location=us-central1&operation=updateFunction&pojoRequest=true")
.log("body:${body}")
.to("mock:result");
--------------------------------------------------------------------------------

- deleteFunction: this operation Deletes a function with the given name from the specified project.

[source,java]
--------------------------------------------------------------------------------
from("direct:start")
.to("google-functions://myCamelFunction?serviceAccountKey=/home/user/Downloads/my-key.json&project=myProject&location=us-central1&operation=deleteFunction")
.log("body:${body}")
.to("mock:result");
--------------------------------------------------------------------------------


include::spring-boot:partial$starter.adoc[]
