= 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
:tabs-sync-option:
: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, to call the function `myCamelFunction` from the project `myProject` and location `us-central1`, use the following snippet:

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



// 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

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

=== 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("direct:start")
    .to("google-functions://myCamelFunction?client=#myClient");
--------------------------------------------------------------------------------

=== Google Functions Producer Operation examples

- `ListFunctions`: This operation invokes the Google Functions client and gets 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 gets 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 calls 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 generates 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 generates 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[]
